Name: series-workflow55khq Phase: Succeeded StartedAt: 2026-07-14 00:09:04 +0000 UTC FinishedAt: 2026-07-14 05:18:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[0] Phase: Succeeded StartedAt: 2026-07-14 00:09:04 +0000 UTC FinishedAt: 2026-07-14 00:44:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[0].run-triage Phase: Succeeded StartedAt: 2026-07-14 00:09:04 +0000 UTC FinishedAt: 2026-07-14 00:44:24 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SWAP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SWAP" ], "series_id": "cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "swap_alloc_entry", "swap_queue_add", "swap_queue_del", "swap_queue_get_device", "swap_device_enable", "swap_device_disable", "swap_device_inuse_add", "swap_device_inuse_sub", "add_to_avail_list", "del_from_avail_list", "swap_queue_mask", "swap_queue_unmask", "cluster_alloc_swap_entry" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAwOjQzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzd2FwX2FsbG9jX2VudHJ5JiMzNDssCiAgICAmIzM0O3N3YXBfcXVldWVfYWRkJiMzNDssCiAgICAmIzM0O3N3YXBfcXVldWVfZGVsJiMzNDssCiAgICAmIzM0O3N3YXBfcXVldWVfZ2V0X2RldmljZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9lbmFibGUmIzM0OywKICAgICYjMzQ7c3dhcF9kZXZpY2VfZGlzYWJsZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9pbnVzZV9hZGQmIzM0OywKICAgICYjMzQ7c3dhcF9kZXZpY2VfaW51c2Vfc3ViJiMzNDssCiAgICAmIzM0O2FkZF90b19hdmFpbF9saXN0JiMzNDssCiAgICAmIzM0O2RlbF9mcm9tX2F2YWlsX2xpc3QmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9tYXNrJiMzNDssCiAgICAmIzM0O3N3YXBfcXVldWVfdW5tYXNrJiMzNDssCiAgICAmIzM0O2NsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXBsYWNlcyB0aGUgcGxpc3QtYmFzZWQgc3dhcCBkZXZpY2UgcXVldWUgd2l0aCBhIGN1c3RvbSByb3VuZC1yb2JpbiBxdWV1ZSwgaW50cm9kdWNpbmcgbmV3IGNvcmUgbG9naWMgZm9yIHN3YXAgYWxsb2NhdGlvbiBhbmQgZGV2aWNlIG1hbmFnZW1lbnQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMDA6NDM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5ZjM0OTM2NWUwZWIxZmUyMTI4YTg0ODRiYjRjYTY1MWYxZGJkMmEyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBKdWwgMTQgMDA6NDM6NDQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGlzdC5oIGIvaW5jbHVkZS9saW51eC9wbGlzdC5oXG5pbmRleCAxNmNmNDM1NWI1YzEzMS4uNzNkMzU5YzFhMDUzNmEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BsaXN0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvcGxpc3QuaFxuQEAgLTEzMiw4ICYjNDM7MTMyLDYgQEAgc3RhdGljIGlubGluZSB2b2lkIHBsaXN0X25vZGVfaW5pdChzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgaW50IHByaW8pXG4gZXh0ZXJuIHZvaWQgcGxpc3RfYWRkKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XG4gZXh0ZXJuIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XG4gXG4tZXh0ZXJuIHZvaWQgcGxpc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpO1xuLVxuIC8qKlxuICAqIHBsaXN0X2Zvcl9lYWNoIC0gaXRlcmF0ZSBvdmVyIHRoZSBwbGlzdFxuICAqIEBwb3M6XHR0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlclxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcbmluZGV4IDY5NmVkMDE3MDljMmJhLi4wNDc2NzU0MDk3MmI4MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTE5NCw2ICYjNDM7MTk0LDIyIEBAIHN0cnVjdCBzd2FwX2V4dGVudCB7XG4gXHQoKG9mZnNldG9mKHVuaW9uIHN3YXBfaGVhZGVyLCBtYWdpYy5tYWdpYykgLSBcXFxuIFx0ICBvZmZzZXRvZih1bmlvbiBzd2FwX2hlYWRlciwgaW5mby5iYWRwYWdlcykpIC8gc2l6ZW9mKGludCkpXG4gXG4mIzQzOy8qXG4mIzQzOyAqIFN3YXAgZGV2aWNlIGZsYWdzLCBleGNlcHQgdGhlIG9uZXMgZG9jdW1lbnRlZCBiZWxvdywgYWxsIGFyZSBpbW11dGFibGVcbiYjNDM7ICogYWZ0ZXIgZXhwb3NlZCBieSBzd2FwX2RldmljZV9lbmFibGUsIGFuZCB1bnRpbCB0aGUgZGV2aWNlIGlzIGZyZWVkIGFnYWluXG4mIzQzOyAqIChTV1BfVVNFRCB1bnNldCkuIFRoZSBleGNlcHRpb25zIGFyZSBhbGwgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbTpcbiYjNDM7ICogLSBTV1BfVVNFRDogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIHRoZSBkZXZpY2UgaXMgaW51c2UuIE9uY2VcbiYjNDM7ICogICBzZXQsIHdvbiYjMzk7dCBiZSBjbGVhcmVkIHVubGVzcyBhbGwgcmVmZXJlbmNlIHRvIHRoaXMgZGV2aWNlIGlzIGZyZWVkIGFuZFxuJiM0MzsgKiAgIHN3YXBvZmYgZmluaXNoZWQuXG4mIzQzOyAqIC0gU1dQX1dSSVRFT0s6IFByb3RlY3RlZCBieSBib3RoIHN3YXBvbl9yd3NlbSBhbmQgc3dhcF9hdmFpbF9sb2NrLCBjbGVhcmluZ1xuJiM0MzsgKiAgIHRoaXMgZmxhZyBhbHNvIHdhaXRzIGZvciBhbGwgY3VycmVudCBjbHVzdGVyIGxvY2sgdXNlcnMgdG8gZXhpdCBzb1xuJiM0MzsgKiAgIGNoZWNraW5nIHRoaXMgZmxhZyB3aGlsZSBob2xkaW5nIGFueSBvZiB0aGVzZSBsb2NrcyBlbnN1cmVzIHRoZSBkZXZpY2VcbiYjNDM7ICogICBpcyBzYWZlIHRvIHVzZSBhdCB0aGUgbW9tZW50LiBOb3RlOiBjbGVhcmluZyB0aGlzIGZsYWcgZG9lc24mIzM5O3QgYWZmZWN0XG4mIzQzOyAqICAgcGVuZGluZyBJTyBvciBhc3luYyByZXF1ZXN0cywgaXQgb25seSBwcmV2ZW50cyBmdXJ0aGVyIGVudHJ5IGFsbG9jYXRpb25cbiYjNDM7ICogICBvciBuZXcgYXN5bmMgcmVxdWVzdCAoZS5nLiBkaXNjYXJkKSBmcm9tIGluaXRpYXRpbmcuXG4mIzQzOyAqIC0gU1dQX0hJQkVSTkFUSU9OOiBQcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtLiBJbmRpY2F0ZXMgaWYgdGhlIGRldmljZVxuJiM0MzsgKiAgIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uXG4mIzQzOyAqL1xuIGVudW0ge1xuIFx0U1dQX1VTRURcdD0gKDEgXHUwMDNjXHUwMDNjIDApLFx0LyogaXMgc2xvdCBpbiBzd2FwX2luZm9bXSB1c2VkPyAqL1xuIFx0U1dQX1dSSVRFT0tcdD0gKDEgXHUwMDNjXHUwMDNjIDEpLFx0Lyogb2sgdG8gd3JpdGUgdG8gdGhpcyBzd2FwP1x0Ki9cbkBAIC0yMzAsMTAgJiM0MzsyNDYsMTcgQEAgZW51bSB7XG4gI2VuZGlmXG4gXG4gLypcbi0gKiBXZSBrZWVwIHVzaW5nIHNhbWUgY2x1c3RlciBmb3Igcm90YXRpb25hbCBkZXZpY2Ugc28gSU8gd2lsbCBiZSBzZXF1ZW50aWFsLlxuLSAqIFRoZSBwdXJwb3NlIGlzIHRvIG9wdGltaXplIFNXQVAgdGhyb3VnaHB1dCBvbiB0aGVzZSBkZXZpY2UuXG4mIzQzOyAqIFdlIGFzc2lnbiBhIGNsdXN0ZXIgdG8gZWFjaCBDUFUsIHNvIGVhY2ggQ1BVIGNhbiBhbGxvY2F0ZSBzd2FwIGVudHJ5IGZyb21cbiYjNDM7ICogaXRzIG93biBjbHVzdGVyIGFuZCBzd2Fwb3V0IHNlcXVlbnRpYWxseS4gVGhlIHB1cnBvc2UgaXMgdG8gb3B0aW1pemUgc3dhcG91dFxuJiM0MzsgKiB0aHJvdWdocHV0LlxuICAqL1xuJiM0MztzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIge1xuJiM0MztcdGxvY2FsX2xvY2tfdCBsb2NrOyAvKiBQcm90ZWN0IHRoZSBwZXJjcHVfY2x1c3RlciBhYm92ZSAqL1xuJiM0MztcdHVuc2lnbmVkIGludCBuZXh0W1NXQVBfTlJfT1JERVJTXTsgLyogTGlrZWx5IG5leHQgYWxsb2NhdGlvbiBvZmZzZXQgKi9cbiYjNDM7fTtcbiYjNDM7XG4gc3RydWN0IHN3YXBfc2VxdWVudGlhbF9jbHVzdGVyIHtcbiYjNDM7XHRzcGlubG9ja190IGxvY2s7IC8qIFNlcmlhbGl6ZSB1c2FnZSBvZiBnbG9iYWwgY2x1c3RlciAqL1xuIFx0dW5zaWduZWQgaW50IG5leHRbU1dBUF9OUl9PUkRFUlNdOyAvKiBMaWtlbHkgbmV4dCBhbGxvY2F0aW9uIG9mZnNldCAqL1xuIH07XG4gXG5AQCAtMjQ0LDcgJiM0MzsyNjcsNiBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7XG4gXHRzdHJ1Y3QgcGVyY3B1X3JlZiB1c2VycztcdC8qIGluZGljYXRlIGFuZCBrZWVwIHN3YXAgZGV2aWNlIHZhbGlkLiAqL1xuIFx0dW5zaWduZWQgbG9uZ1x0ZmxhZ3M7XHRcdC8qIFNXUF9VU0VEIGV0Yzogc2VlIGFib3ZlICovXG4gXHRzaWduZWQgc2hvcnRcdHByaW87XHRcdC8qIHN3YXAgcHJpb3JpdHkgb2YgdGhpcyB0eXBlICovXG4tXHRzdHJ1Y3QgcGxpc3Rfbm9kZSBsaXN0O1x0XHQvKiBlbnRyeSBpbiBzd2FwX2FjdGl2ZV9oZWFkICovXG4gXHRzaWduZWQgY2hhclx0dHlwZTtcdFx0Lyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqL1xuIFx0dW5zaWduZWQgaW50XHRtYXg7XHRcdC8qIHNpemUgb2YgdGhpcyBzd2FwIGRldmljZSAqL1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87IC8qIGNsdXN0ZXIgaW5mby4gT25seSBmb3IgU1NEICovXG5AQCAtMjU2LDI2ICYjNDM7Mjc4LDIwIEBAIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHtcbiBcdFx0XHRcdFx0LyogbGlzdCBvZiBjbHVzdGVyIHRoYXQgYXJlIGZyYWdtZW50ZWQgb3IgY29udGVudGVkICovXG4gXHR1bnNpZ25lZCBpbnQgcGFnZXM7XHRcdC8qIHRvdGFsIG9mIHVzYWJsZSBwYWdlcyBvZiBzd2FwICovXG4gXHRhdG9taWNfbG9uZ190IGludXNlX3BhZ2VzO1x0LyogbnVtYmVyIG9mIHRob3NlIGN1cnJlbnRseSBpbiB1c2UgKi9cbiYjNDM7XHRzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXJcdF9fcGVyY3B1ICpwZXJjcHVfY2x1c3RlcjsgLyogcGVyIGNwdSYjMzk7cyBzd2FwIGxvY2F0aW9uICovXG4gXHRzdHJ1Y3Qgc3dhcF9zZXF1ZW50aWFsX2NsdXN0ZXIgKmdsb2JhbF9jbHVzdGVyOyAvKiBVc2Ugb25lIGdsb2JhbCBjbHVzdGVyIGZvciByb3RhdGluZyBkZXZpY2UgKi9cbi1cdHNwaW5sb2NrX3QgZ2xvYmFsX2NsdXN0ZXJfbG9jaztcdC8qIFNlcmlhbGl6ZSB1c2FnZSBvZiBnbG9iYWwgY2x1c3RlciAqL1xuIFx0c3RydWN0IHJiX3Jvb3Qgc3dhcF9leHRlbnRfcm9vdDsvKiByb290IG9mIHRoZSBzd2FwIGV4dGVudCByYnRyZWUgKi9cbiBcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XHQvKiBzd2FwIGRldmljZSBvciBiZGV2IG9mIHN3YXAgZmlsZSAqL1xuIFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZTtcdFx0Lyogc2VsZG9tIHJlZmVyZW5jZWQgKi9cbiBcdHN0cnVjdCBjb21wbGV0aW9uIGNvbXA7XHRcdC8qIHNlbGRvbSByZWZlcmVuY2VkICovXG4gXHRzcGlubG9ja190IGxvY2s7XHRcdC8qXG4tXHRcdFx0XHRcdCAqIHByb3RlY3QgbWFwIHNjYW4gcmVsYXRlZCBmaWVsZHMgbGlrZVxuLVx0XHRcdFx0XHQgKiBpbnVzZV9wYWdlcyBhbmQgYWxsIGNsdXN0ZXIgbGlzdHMuXG4tXHRcdFx0XHRcdCAqIE90aGVyIGZpZWxkcyBhcmUgb25seSBjaGFuZ2VkXG4tXHRcdFx0XHRcdCAqIGF0IHN3YXBvbi9zd2Fwb2ZmLCBzbyBhcmUgcHJvdGVjdGVkXG4tXHRcdFx0XHRcdCAqIGJ5IHN3YXBfbG9jay4gY2hhbmdpbmcgZmxhZ3MgbmVlZFxuLVx0XHRcdFx0XHQgKiBob2xkIHRoaXMgbG9jayBhbmQgc3dhcF9sb2NrLiBJZlxuLVx0XHRcdFx0XHQgKiBib3RoIGxvY2tzIG5lZWQgaG9sZCwgaG9sZCBzd2FwX2xvY2tcbi1cdFx0XHRcdFx0ICogZmlyc3QuXG4mIzQzO1x0XHRcdFx0XHQgKiBQcm90ZWN0IGNsdXN0ZXIgbGlzdHMuIE90aGVyIGZpZWxkc1xuJiM0MztcdFx0XHRcdFx0ICogYXJlIG9ubHkgY2hhbmdlZCBhdCBzd2Fwb24vc3dhcG9mZixcbiYjNDM7XHRcdFx0XHRcdCAqIHNvIGFyZSBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtLlxuIFx0XHRcdFx0XHQgKi9cbiBcdHN0cnVjdCB3b3JrX3N0cnVjdCBkaXNjYXJkX3dvcms7IC8qIGRpc2NhcmQgd29ya2VyICovXG4gXHRzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVjbGFpbV93b3JrOyAvKiByZWNsYWltIHdvcmtlciAqL1xuIFx0c3RydWN0IGxpc3RfaGVhZCBkaXNjYXJkX2NsdXN0ZXJzOyAvKiBkaXNjYXJkIGNsdXN0ZXJzIGxpc3QgKi9cbi1cdHN0cnVjdCBwbGlzdF9ub2RlIGF2YWlsX2xpc3Q7ICAgLyogZW50cnkgaW4gc3dhcF9hdmFpbF9oZWFkICovXG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IHBhZ2Vfc3dhcF9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmRpZmYgLS1naXQgYS9saWIvcGxpc3QuYyBiL2xpYi9wbGlzdC5jXG5pbmRleCBhNWJlZjM4YWRkNDMxZC4uYjA1YWU3ZmZlYTg3ZTggMTAwNjQ0XG4tLS0gYS9saWIvcGxpc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbGliL3BsaXN0LmNcbkBAIC0xNDIsNTggJiM0MzsxNDIsNiBAQCB2b2lkIHBsaXN0X2RlbChzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpXG4gXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xuIH1cbiBcbi0vKipcbi0gKiBwbGlzdF9yZXF1ZXVlIC0gUmVxdWV1ZSBAbm9kZSBhdCBlbmQgb2Ygc2FtZS1wcmlvIGVudHJpZXMuXG4tICpcbi0gKiBUaGlzIGlzIGVzc2VudGlhbGx5IGFuIG9wdGltaXplZCBwbGlzdF9kZWwoKSBmb2xsb3dlZCBieVxuLSAqIHBsaXN0X2FkZCgpLiAgSXQgbW92ZXMgYW4gZW50cnkgYWxyZWFkeSBpbiB0aGUgcGxpc3QgdG9cbi0gKiBhZnRlciBhbnkgb3RoZXIgc2FtZS1wcmlvcml0eSBlbnRyaWVzLlxuLSAqXG4tICogQG5vZGU6XHRcdTAwMjZzdHJ1Y3QgcGxpc3Rfbm9kZSBwb2ludGVyIC0gZW50cnkgdG8gYmUgbW92ZWRcbi0gKiBAaGVhZDpcdFx1MDAyNnN0cnVjdCBwbGlzdF9oZWFkIHBvaW50ZXIgLSBsaXN0IGhlYWRcbi0gKi9cbi12b2lkIHBsaXN0X3JlcXVldWUoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKVxuLXtcbi1cdHN0cnVjdCBwbGlzdF9ub2RlICppdGVyO1xuLVx0c3RydWN0IGxpc3RfaGVhZCAqbm9kZV9uZXh0ID0gXHUwMDI2aGVhZC1cdTAwM2Vub2RlX2xpc3Q7XG4tXG4tXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xuLVx0QlVHX09OKHBsaXN0X2hlYWRfZW1wdHkoaGVhZCkpO1xuLVx0QlVHX09OKHBsaXN0X25vZGVfZW1wdHkobm9kZSkpO1xuLVxuLVx0aWYgKG5vZGUgPT0gcGxpc3RfbGFzdChoZWFkKSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0aXRlciA9IHBsaXN0X25leHQobm9kZSk7XG4tXG4tXHRpZiAobm9kZS1cdTAwM2VwcmlvICE9IGl0ZXItXHUwMDNlcHJpbylcbi1cdFx0cmV0dXJuO1xuLVxuLVx0cGxpc3RfZGVsKG5vZGUsIGhlYWQpO1xuLVxuLVx0Lypcbi1cdCAqIEFmdGVyIHBsaXN0X2RlbCgpLCBpdGVyIGlzIHRoZSByZXBsYWNlbWVudCBvZiB0aGUgbm9kZS4gIElmIHRoZSBub2RlXG4tXHQgKiB3YXMgb24gcHJpb19saXN0LCB0YWtlIHNob3J0Y3V0IHRvIGZpbmQgbm9kZV9uZXh0IGluc3RlYWQgb2YgbG9vcGluZy5cbi1cdCAqL1xuLVx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNml0ZXItXHUwMDNlcHJpb19saXN0KSkge1xuLVx0XHRpdGVyID0gbGlzdF9lbnRyeShpdGVyLVx1MDAzZXByaW9fbGlzdC5uZXh0LCBzdHJ1Y3QgcGxpc3Rfbm9kZSxcbi1cdFx0XHRcdCAgcHJpb19saXN0KTtcbi1cdFx0bm9kZV9uZXh0ID0gXHUwMDI2aXRlci1cdTAwM2Vub2RlX2xpc3Q7XG4tXHRcdGdvdG8gcXVldWU7XG4tXHR9XG4tXG4tXHRwbGlzdF9mb3JfZWFjaF9jb250aW51ZShpdGVyLCBoZWFkKSB7XG4tXHRcdGlmIChub2RlLVx1MDAzZXByaW8gIT0gaXRlci1cdTAwM2VwcmlvKSB7XG4tXHRcdFx0bm9kZV9uZXh0ID0gXHUwMDI2aXRlci1cdTAwM2Vub2RlX2xpc3Q7XG4tXHRcdFx0YnJlYWs7XG4tXHRcdH1cbi1cdH1cbi1xdWV1ZTpcbi1cdGxpc3RfYWRkX3RhaWwoXHUwMDI2bm9kZS1cdTAwM2Vub2RlX2xpc3QsIG5vZGVfbmV4dCk7XG4tXG4tXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xuLX1cbi1cbiAjaWZkZWYgQ09ORklHX0RFQlVHX1BMSVNUXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL2Nsb2NrLmhcdTAwM2VcbkBAIC0yMzEsMTQgJiM0MzsxNzksNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgcGxpc3RfdGVzdF9jaGVjayhpbnQgbnJfZXhwZWN0KVxuIFx0QlVHX09OKHByaW9fcG9zLVx1MDAzZXByaW9fbGlzdC5uZXh0ICE9IFx1MDAyNmZpcnN0LVx1MDAzZXByaW9fbGlzdCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9faW5pdCBwbGlzdF90ZXN0X3JlcXVldWUoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUpXG4te1xuLVx0cGxpc3RfcmVxdWV1ZShub2RlLCBcdTAwMjZ0ZXN0X2hlYWQpO1xuLVxuLVx0aWYgKG5vZGUgIT0gcGxpc3RfbGFzdChcdTAwMjZ0ZXN0X2hlYWQpKVxuLVx0XHRCVUdfT04obm9kZS1cdTAwM2VwcmlvID09IHBsaXN0X25leHQobm9kZSktXHUwMDNlcHJpbyk7XG4tfVxuLVxuIHN0YXRpYyBpbnQgIF9faW5pdCBwbGlzdF90ZXN0KHZvaWQpXG4ge1xuIFx0aW50IG5yX2V4cGVjdCA9IDAsIGksIGxvb3A7XG5AQCAtMjYyLDEwICYjNDM7MjAyLDYgQEAgc3RhdGljIGludCAgX19pbml0IHBsaXN0X3Rlc3Qodm9pZClcbiBcdFx0XHRucl9leHBlY3QtLTtcbiBcdFx0fVxuIFx0XHRwbGlzdF90ZXN0X2NoZWNrKG5yX2V4cGVjdCk7XG4tXHRcdGlmICghcGxpc3Rfbm9kZV9lbXB0eSh0ZXN0X25vZGUgJiM0MzsgaSkpIHtcbi1cdFx0XHRwbGlzdF90ZXN0X3JlcXVldWUodGVzdF9ub2RlICYjNDM7IGkpO1xuLVx0XHRcdHBsaXN0X3Rlc3RfY2hlY2sobnJfZXhwZWN0KTtcbi1cdFx0fVxuIFx0fVxuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRSh0ZXN0X25vZGUpOyBpJiM0MzsmIzQzOykge1xuZGlmZiAtLWdpdCBhL21tL3N3YXAuaCBiL21tL3N3YXAuaFxuaW5kZXggYjUxYWQzMDcxYTczMDguLjA4YTc4MmYzZDVhY2QyIDEwMDY0NFxuLS0tIGEvbW0vc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwLmhcbkBAIC05MSwxNiAmIzQzOzkxLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHN3cF9jbHVzdGVyX29mZnNldChzd3BfZW50cnlfdCBlbnRyeSlcbiAgKi9cbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpfX3N3YXBfdHlwZV90b19pbmZvKGludCB0eXBlKVxuIHtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbi1cbi1cdHNpID0gUkVBRF9PTkNFKHN3YXBfaW5mb1t0eXBlXSk7IC8qIHJjdV9kZXJlZmVyZW5jZSgpICovXG4tXHRWTV9XQVJOX09OX09OQ0UocGVyY3B1X3JlZl9pc196ZXJvKFx1MDAyNnNpLVx1MDAzZXVzZXJzKSk7IC8qIHJhY2Ugd2l0aCBzd2Fwb2ZmICovXG4tXHRyZXR1cm4gc2k7XG4mIzQzO1x0cmV0dXJuIFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqL1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpfX3N3YXBfZW50cnlfdG9faW5mbyhzd3BfZW50cnlfdCBlbnRyeSlcbiB7XG4tXHRyZXR1cm4gX19zd2FwX3R5cGVfdG9faW5mbyhzd3BfdHlwZShlbnRyeSkpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiYjNDM7XG4mIzQzO1x0c2kgPSBfX3N3YXBfdHlwZV90b19pbmZvKHN3cF90eXBlKGVudHJ5KSk7IC8qIHJjdV9kZXJlZmVyZW5jZSgpICovXG4mIzQzO1x0Vk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybyhcdTAwMjZzaS1cdTAwM2V1c2VycykpOyAvKiByYWNlIHdpdGggc3dhcG9mZiAqL1xuJiM0MztcdHJldHVybiBzaTtcbiB9XG4gXG4gc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKl9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihcbmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuY1xuaW5kZXggNzc1YzM4NTQ5MGE1ZmEuLmY5Mzg2MzMwOWE1YTUwIDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuY1xuQEAgLTQxLDcgJiM0Mzs0MSw2IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGxldGlvbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3VzcGVuZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvenN3YXAuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BsaXN0LmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2Nhc20vdGxiZmx1c2guaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2xlYWZvcHMuaFx1MDAzZVxuQEAgLTQ5LDMxICYjNDM7NDgsMzggQEBcbiAjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7c3dhcC5oXCYjMzQ7XG4gXG4tc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4tXHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2ludXNlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4mIzQzO1x0XHRcdFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7XG4gc3RhdGljIGJvb2wgZm9saW9fc3dhcGNhY2hlX2ZyZWVhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHN0YXRpYyB2b2lkIG1vdmVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG4gXHRcdFx0IGVudW0gc3dhcF9jbHVzdGVyX2ZsYWdzIG5ld19mbGFncyk7XG4mIzQzO3N0YXRpYyBib29sIGdldF9zd2FwX2RldmljZV9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSk7XG4gXG4gLypcbi0gKiBQcm90ZWN0cyB0aGUgc3dhcF9pbmZvIGFycmF5LCBhbmQgdGhlIFNXUF9VU0VEIGZsYWcuIHN3YXBfaW5mbyBjb250YWluc1xuLSAqIGxhemlseSBhbGxvY2F0ZWQgXHUwMDI2IGZyZWVkIHN3YXAgZGV2aWNlIGluZm8gc3RydXRzLCBhbmQgU1dQX1VTRUQgaW5kaWNhdGVzXG4tICogd2hpY2ggZGV2aWNlIGlzIHVzZWQsIH5TV1BfVVNFRCBkZXZpY2VzIGFuZCBjYW4gYmUgcmV1c2VkLlxuLSAqXG4tICogQWxzbyBwcm90ZWN0cyBzd2FwX2FjdGl2ZV9oZWFkIHRvdGFsX3N3YXBfcGFnZXMsIGFuZCB0aGUgU1dQX1dSSVRFT0sgZmxhZy5cbiYjNDM7ICogU2VyaWFsaXplcyBzd2Fwb24vc3dhcG9mZiAod3JpdGVycykgYW5kIHByb3RlY3RzIHRoZSBzd2FwX2luZm9cbiYjNDM7ICogYXJyYXksIG5yX3N3YXBmaWxlcywgdG90YWxfc3dhcF9wYWdlcywgYW5kIHBhcnQgb2Ygc3dhcCBkZXZpY2VcbiYjNDM7ICogaW5mbyBjb250ZW50IChzZWUgY29tbWVudCBvZiBzd2FwX2luZm9fc3RydWN0KS4gIFJlYWRlcnNcbiYjNDM7ICogKGFsbG9jYXRpb24sIC9wcm9jL3N3YXBzLCBldGMuKSB0YWtlIHBlcmNwdV9kb3duX3JlYWQoKSB3aGljaFxuJiM0MzsgKiBpcyBjaGVhcCBhcyB0aGUgaG90IHBhdGguXG4mIzQzOyAqL1xuJiM0MztERUZJTkVfU1RBVElDX1BFUkNQVV9SV1NFTShzd2Fwb25fcndzZW0pO1xuJiM0MzsvKlxuJiM0MzsgKiBzd2FwX2luZm8gY29udGFpbnMgbGF6aWx5IGFsbG9jYXRlZCBzd2FwIGRldmljZSBpbmZvIHN0cnVjdHMsIGFuZFxuJiM0MzsgKiBTV1BfVVNFRCBpbmRpY2F0ZXMgd2hpY2ggZGV2aWNlIGlzIHVzZWQsIH5TV1BfVVNFRCBkZXZpY2VzIGNhbiBiZVxuJiM0MzsgKiByZXVzZWQuIFByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0sIGJ1dCByZWFkaW5nIGNvdWxkIGJlIGxvY2tsZXNzLlxuICAqL1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9sb2NrKTtcbiYjNDM7c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfaW5mb1tNQVhfU1dBUEZJTEVTXTtcbiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlcztcbi1hdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XG4mIzQzO2xvbmcgdG90YWxfc3dhcF9wYWdlcztcbiYjNDM7XG4gLypcbiAgKiBTb21lIG1vZHVsZXMgdXNlIHN3YXBwYWJsZSBvYmplY3RzIGFuZCBtYXkgdHJ5IHRvIHN3YXAgdGhlbSBvdXQgdW5kZXJcbiAgKiBtZW1vcnkgcHJlc3N1cmUgKHZpYSB0aGUgc2hyaW5rZXIpLiBCZWZvcmUgZG9pbmcgc28sIHRoZXkgbWF5IHdpc2ggdG9cbiAgKiBjaGVjayB0byBzZWUgaWYgYW55IHN3YXAgc3BhY2UgaXMgYXZhaWxhYmxlLlxuICAqL1xuJiM0MzthdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XG4gRVhQT1JUX1NZTUJPTF9HUEwobnJfc3dhcF9wYWdlcyk7XG4tLyogcHJvdGVjdGVkIHdpdGggc3dhcF9sb2NrLiByZWFkaW5nIGluIHZtX3N3YXBfZnVsbCgpIGRvZXNuJiMzOTt0IG5lZWQgbG9jayAqL1xuLWxvbmcgdG90YWxfc3dhcF9wYWdlcztcbiAjZGVmaW5lIERFRl9TV0FQX1BSSU8gIC0xXG4gdW5zaWduZWQgbG9uZyBzd2FwZmlsZV9tYXhpbXVtX3NpemU7XG4gI2lmZGVmIENPTkZJR19NSUdSQVRJT05cbkBAIC04Myw1MiAmIzQzOzg5LDQyIEBAIGJvb2wgc3dhcF9taWdyYXRpb25fYWRfc3VwcG9ydGVkO1xuIHN0YXRpYyBjb25zdCBjaGFyIEJhZF9maWxlW10gPSBcJiMzNDtCYWQgc3dhcCBmaWxlIGVudHJ5IFwmIzM0OztcbiBzdGF0aWMgY29uc3QgY2hhciBCYWRfb2Zmc2V0W10gPSBcJiMzNDtCYWQgc3dhcCBvZmZzZXQgZW50cnkgXCYjMzQ7O1xuIFxuLS8qXG4tICogYWxsIGFjdGl2ZSBzd2FwX2luZm9fc3RydWN0c1xuLSAqIHByb3RlY3RlZCB3aXRoIHN3YXBfbG9jaywgYW5kIG9yZGVyZWQgYnkgcHJpb3JpdHkuXG4tICovXG4tc3RhdGljIFBMSVNUX0hFQUQoc3dhcF9hY3RpdmVfaGVhZCk7XG4mIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKl9fc3dhcF9pdGVyKGludCAqaSwgdW5zaWduZWQgbG9uZyBmbGFnKVxuJiM0Mzt7XG4mIzQzO1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdHdoaWxlICgqaSBcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XG4mIzQzO1x0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBfX3N3YXBfdHlwZV90b19pbmZvKCppKTtcbiYjNDM7XG4mIzQzO1x0XHRWTV9XQVJOX09OKCFzaSk7XG4mIzQzO1x0XHQoKmkpJiM0MzsmIzQzOztcbiYjNDM7XHRcdGlmIChmbGFnIFx1MDAyNlx1MDAyNiAhKChzaS1cdTAwM2VmbGFncyBcdTAwMjYgZmxhZykgPT0gZmxhZykpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0cmV0dXJuIHNpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBfX2Zvcl9lYWNoX3N3YXAoc2ksIGZsYWcpXHRcdFx0XFxcbiYjNDM7XHRmb3IgKGludCBfX2kgPSAwOyAoKHNpKSA9IF9fc3dhcF9pdGVyKFx1MDAyNl9faSwgZmxhZykpOylcbiBcbiAvKlxuLSAqIGFsbCBhdmFpbGFibGUgKGFjdGl2ZSwgbm90IGZ1bGwpIHN3YXBfaW5mb19zdHJ1Y3RzXG4tICogcHJvdGVjdGVkIHdpdGggc3dhcF9hdmFpbF9sb2NrLCBvcmRlcmVkIGJ5IHByaW9yaXR5LlxuLSAqIFRoaXMgaXMgdXNlZCBieSBmb2xpb19hbGxvY19zd2FwKCkgaW5zdGVhZCBvZiBzd2FwX2FjdGl2ZV9oZWFkXG4tICogYmVjYXVzZSBzd2FwX2FjdGl2ZV9oZWFkIGluY2x1ZGVzIGFsbCBzd2FwX2luZm9fc3RydWN0cyxcbi0gKiBidXQgZm9saW9fYWxsb2Nfc3dhcCgpIGRvZXNuJiMzOTt0IG5lZWQgdG8gbG9vayBhdCBmdWxsIG9uZXMuXG4tICogVGhpcyB1c2VzIGl0cyBvd24gbG9jayBpbnN0ZWFkIG9mIHN3YXBfbG9jayBiZWNhdXNlIHdoZW4gYVxuLSAqIHN3YXBfaW5mb19zdHJ1Y3QgY2hhbmdlcyBiZXR3ZWVuIG5vdC1mdWxsL2Z1bGwsIGl0IG5lZWRzIHRvXG4tICogYWRkL3JlbW92ZSBpdHNlbGYgdG8vZnJvbSB0aGlzIGxpc3QsIGJ1dCB0aGUgc3dhcF9pbmZvX3N0cnVjdC1cdTAwM2Vsb2NrXG4tICogaXMgaGVsZCBhbmQgdGhlIGxvY2tpbmcgb3JkZXIgcmVxdWlyZXMgc3dhcF9sb2NrIHRvIGJlIHRha2VuXG4tICogYmVmb3JlIGFueSBzd2FwX2luZm9fc3RydWN0LVx1MDAzZWxvY2suXG4mIzQzOyAqIGZvcl9lYWNoX3N3YXAgLSBpdGVyYXRlIHRocm91Z2ggYWxsIGFsbG9jYXRlZCBhbmQgaW51c2Ugc3dhcCBkZXZpY2VzXG4mIzQzOyAqIEBzaTogdGhlIGl0ZXJhdG9yXG4mIzQzOyAqXG4mIzQzOyAqIENvbnRleHQ6IFRoZSBjYWxsZXIgbXVzdCBob2xkIHN3YXBvbl9yd3NlbS4gVGhlIGxvY2sgbWF5IGJlIGRyb3BwZWQgZHVyaW5nXG4mIzQzOyAqIHRoZSBsb29wIGJvZHkgYnV0IG11c3QgYmUgcmUtYWNxdWlyZWQgYmVmb3JlIHRoZSBuZXh0IGl0ZXJhdGlvbi5cbiAgKi9cbi1zdGF0aWMgUExJU1RfSEVBRChzd2FwX2F2YWlsX2hlYWQpO1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9hdmFpbF9sb2NrKTtcbi1cbi1zdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9pbmZvW01BWF9TV0FQRklMRVNdO1xuJiM0MzsjZGVmaW5lIGZvcl9lYWNoX3N3YXAoc2kpIF9fZm9yX2VhY2hfc3dhcChzaSwgU1dQX1VTRUQpXG4mIzQzOyNkZWZpbmUgZm9yX2VhY2hfYXZhaWxfc3dhcChzaSkgX19mb3JfZWFjaF9zd2FwKHNpLCBTV1BfVVNFRCB8IFNXUF9XUklURU9LKVxuIFxuIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc3dhcF90YWJsZV9jYWNoZXA7XG4gXG4tLyogUHJvdGVjdHMgc2ktXHUwMDNlc3dhcF9maWxlIGZvciAvcHJvYy9zd2FwcyB1c2FnZSAqL1xuLXN0YXRpYyBERUZJTkVfTVVURVgoc3dhcG9uX211dGV4KTtcbi1cbiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocHJvY19wb2xsX3dhaXQpO1xuIC8qIEFjdGl2aXR5IGNvdW50ZXIgdG8gaW5kaWNhdGUgdGhhdCBhIHN3YXBvbiBvciBzd2Fwb2ZmIGhhcyBvY2N1cnJlZCAqL1xuIHN0YXRpYyBhdG9taWNfdCBwcm9jX3BvbGxfZXZlbnQgPSBBVE9NSUNfSU5JVCgwKTtcbiBcbiBhdG9taWNfdCBucl9yb3RhdGVfc3dhcCA9IEFUT01JQ19JTklUKDApO1xuIFxuLXN0cnVjdCBwZXJjcHVfc3dhcF9jbHVzdGVyIHtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaVtTV0FQX05SX09SREVSU107XG4tXHR1bnNpZ25lZCBsb25nIG9mZnNldFtTV0FQX05SX09SREVSU107XG4tXHRsb2NhbF9sb2NrX3QgbG9jaztcbi19O1xuLVxuLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyY3B1X3N3YXBfY2x1c3RlciwgcGVyY3B1X3N3YXBfY2x1c3RlcikgPSB7XG4tXHQuc2kgPSB7IE5VTEwgfSxcbi1cdC5vZmZzZXQgPSB7IFNXQVBfRU5UUllfSU5WQUxJRCB9LFxuLVx0LmxvY2sgPSBJTklUX0xPQ0FMX0xPQ0soKSxcbi19O1xuLVxuIC8qIE1heSByZXR1cm4gTlVMTCBvbiBpbnZhbGlkIHR5cGUsIGNhbGxlciBtdXN0IGNoZWNrIGZvciBOVUxMIHJldHVybiAqL1xuIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF90eXBlX3RvX2luZm8oaW50IHR5cGUpXG4ge1xuQEAgLTE0MywxOCAmIzQzOzEzOSwzNTAgQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2VudHJ5X3RvX2luZm8oc3dwX2VudHJ5X3QgZW50cnkpXG4gXHRyZXR1cm4gc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIEFsbCBhdmFpbGFibGUgc3dhcF9pbmZvX3N0cnVjdHMgYXJlIGdyb3VwZWQgYnkgcHJpb3JpdHkgcmluZ3MsIHRoZSByaW5nc1xuJiM0MzsgKiBhcmUgb3JkZXJlZCBpbiBhIHF1ZXVlIGJ5IHByaW9yaXR5IChsb3dlciBwcmlvIHZhbHVlID0gaGlnaGVyIHByaW9yaXR5KS5cbiYjNDM7ICogVGhlIGFsbG9jYXRvciBpdGVyYXRlcyBhbmQgcm90YXRlcyBkZXZpY2VzIHdpdGhpbiBlYWNoIHByaW9yaXR5IHJpbmcuXG4mIzQzOyAqIFdoZW4gYWxsIGRldmljZXMgaW4gYSByaW5nIGFyZSBpdGVyYXRlZCwgaXQgZ29lcyB0byB0aGUgbmV4dCBsb3dlclxuJiM0MzsgKiBwcmlvcml0eSByaW5nLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IHN3YXBfcHJpb19yaW5nIHtcbiYjNDM7XHRpbnQgcHJpbztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2l6ZTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZGV2W10gX19jb3VudGVkX2J5KHNpemUpO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHJpbmcgaXMgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbSBzbyB1cGRhdGluZyBpdCBpcyBjb3N0bHkuIFRvIG1ha2VcbiYjNDM7ICogdGhlIGFsbG9jYXRvciBhbmQgb3RoZXIgdXNlcnMgc2tpcCBmdWxsIGRldmljZXMgZmFzdGVyLCB0aGUgbG93ZXN0IGJpdCBvZlxuJiM0MzsgKiBhIGRldmljZSBwb2ludGVyIGlzIHVzZWQgdG8gbWFyayBpdCBkaXNhYmxlZCAodGVtcG9yYXJpbHkgdW5hdmFpbGFibGUpLlxuJiM0MzsgKiBUaGlzIHJlbGllcyBvbiBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCBiZWluZyBzdWZmaWNpZW50bHlcbiYjNDM7ICogYWxpZ25lZCAoZ3VhcmFudGVlZCBieSBrbWFsbG9jKS5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZUXHQwXG4mIzQzOyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVFx0XHRCSVQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZUKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2VyaWFsaXplcyBxdWV1ZSBjb250ZW50IG11dGF0aW9ucyBhbmQga2VlcHMgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVFxuJiM0MzsgKiBjb25zaXN0ZW50IHdpdGggdGhlIG1hc2tlZCBzdGF0ZSBvZiBlYWNoIGRldmljZSBwb2ludGVyLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFN3YXAgcXVldWUgaXMgcHJvdGVjdGVkIGJ5IGJvdGggc3dhcF9xdWV1ZV91cGRhdGVfbG9jayBhbmQgc3dhcG9uX3J3c2VtLlxuJiM0MzsgKiBPbmx5IHN3YXBvbi9zd2Fwb2ZmIHdpbGwgdGFrZSB0aGUgd3JpdGUgbG9jaywgYW5kIG1vZGlmeSB0aGUgcXVldWUgbGVuZ3RoXG4mIzQzOyAqIG9yIGFueSByaW5nJiMzOTtzIGxlbmd0aC4gc3dhcF9xdWV1ZV91cGRhdGVfbG9jayBwcm90ZWN0cyB0aGUgY29udGVudCBzb1xuJiM0MzsgKiBkZXZpY2VzIGNhbiBiZSBtYXNrZWQgZWFzaWx5IHdpdGhvdXQgdGFraW5nIHRoZSB3cml0ZWxvY2ssIHdoaWNoIGlzIGhlYXZ5LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqKnN3YXBfcXVldWU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgc3dhcF9xdWV1ZV9sZW47XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFYWNoIENQVSBoYXMgaXRzIHJlYWQgaXRlcmF0b3IsIHNvIHRoZSBxdWV1ZSBpdHNlbGYgd2lsbCByZW1haW4gcmVhZFxuJiM0MzsgKiBvbmx5IGFuZCB0aGUgQ1BVIHNpZGUgcmVhZGVyIHJvdGF0ZXMgYnkgaXRlcmF0aW5nIHRoZSBkZXZpY2VzXG4mIzQzOyAqIHBlcmlvZGljYWxseSB1c2luZyB0aGUgY291bnRlci5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgU1dBUF9ST1VORF9ST0JJTl9RVU9UQSBTV0FQRklMRV9DTFVTVEVSXG4mIzQzO3N0cnVjdCBzd2FwX3JpbmdfaXRlcmF0b3Ige1xuJiM0MztcdGludCBvZmZzZXQ7XG4mIzQzO1x0bG9uZyBycl9jb3VudGVyO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIHtcbiYjNDM7XHRsb2NhbF9sb2NrX3QgbG9jaztcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9yaW5nX2l0ZXJhdG9yIHJpW107XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgX19wZXJjcHUgc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyICpzd2FwX3F1ZXVlX3JlYWRlcnM7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc3dhcF9kZXZpY2VfbWFza2VkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZylzaSBcdTAwMjYgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICopKCh1bnNpZ25lZCBsb25nKXNpIFx1MDAyNiB+U1dBUF9ERVZJQ0VfTUFTS0VEX0JJVCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhpbnQgbnJfcmluZ3MsIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqcmVhZGVycztcbiYjNDM7XG4mIzQzO1x0aWYgKCFucl9yaW5ncylcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRyZWFkZXJzID0gX19hbGxvY19wZXJjcHVfZ2ZwKHN0cnVjdF9zaXplKHJlYWRlcnMsIHJpLCBucl9yaW5ncyksXG4mIzQzO1x0XHRcdFx0ICAgICBfX2FsaWdub2ZfXygqcmVhZGVycyksIGdmcCk7XG4mIzQzO1x0cmV0dXJuIHJlYWRlcnM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfaW5zdGFsbF9yZWFkZXJzKHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqcmVhZGVycylcbiYjNDM7e1xuJiM0MztcdGludCByaW5nX2lkeCwgY3B1O1xuJiM0MztcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcbiYjNDM7XG4mIzQzO1x0ZnJlZV9wZXJjcHUoc3dhcF9xdWV1ZV9yZWFkZXJzKTtcbiYjNDM7XHRzd2FwX3F1ZXVlX3JlYWRlcnMgPSByZWFkZXJzO1xuJiM0MztcdGlmICghcmVhZGVycylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0LyogRGlzdHJpYnV0ZSBlYWNoIENQVSYjMzk7cyBzd2FwIElPIGZhaXJseSBhY3Jvc3MgZGV2aWNlcy4gKi9cbiYjNDM7XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4mIzQzO1x0XHRsb2NhbF9sb2NrX2luaXQoXHUwMDI2cGVyX2NwdV9wdHIocmVhZGVycywgY3B1KS1cdTAwM2Vsb2NrKTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKHJpbmdfaWR4ID0gMDsgcmluZ19pZHggXHUwMDNjIHN3YXBfcXVldWVfbGVuOyByaW5nX2lkeCYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0cmluZyA9IHN3YXBfcXVldWVbcmluZ19pZHhdO1xuJiM0MztcdFx0XHRwZXJfY3B1X3B0cihyZWFkZXJzLCBjcHUpLVx1MDAzZXJpW3JpbmdfaWR4XS5vZmZzZXQgPVxuJiM0MztcdFx0XHRcdCAgICBjcHUgJSByaW5nLVx1MDAzZXNpemU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfcXVldWVfZ2V0X2RldmljZShsb25nIG5yX2FsbG9jLCBpbnQgbnJfaXRlcilcbiYjNDM7e1xuJiM0MztcdGJvb2wgcm90YXRlID0gZmFsc2U7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuJiM0MztcdHN0cnVjdCBzd2FwX3JpbmdfaXRlcmF0b3IgKnJpO1xuJiM0MztcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgcXVldWVfaWR4O1xuJiM0MztcbiYjNDM7XHRpZiAoIXN3YXBfcXVldWVfbGVuKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4mIzQzO1xuJiM0MztcdHF1ZXVlX2lkeCA9IDA7XG4mIzQzO1x0d2hpbGUgKG5yX2l0ZXIgXHUwMDNlPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF0tXHUwMDNlc2l6ZSkge1xuJiM0MztcdFx0bnJfaXRlciAtPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF0tXHUwMDNlc2l6ZTtcbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7cXVldWVfaWR4IFx1MDAzZT0gc3dhcF9xdWV1ZV9sZW4pXG4mIzQzO1x0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmluZyA9IHN3YXBfcXVldWVbcXVldWVfaWR4XTtcbiYjNDM7XHRsb2NhbF9sb2NrKFx1MDAyNnN3YXBfcXVldWVfcmVhZGVycy1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRyaSA9IHRoaXNfY3B1X3B0cihcdTAwMjZzd2FwX3F1ZXVlX3JlYWRlcnMtXHUwMDNlcmlbcXVldWVfaWR4XSk7XG4mIzQzO1x0LyogUm90YXRlIHdoaWxlIGl0ZXJhdGluZyB0aGUgcmluZywganVzdCBub3Qgb24gdGhlIGZpcnN0IHRyeSAqL1xuJiM0MztcdGlmIChucl9pdGVyKVxuJiM0MztcdFx0cm90YXRlID0gdHJ1ZTtcbiYjNDM7XHRlbHNlIGlmIChyaS1cdTAwM2Vycl9jb3VudGVyIFx1MDAzYyBucl9hbGxvYylcbiYjNDM7XHRcdHJvdGF0ZSA9IHRydWU7XG4mIzQzO1x0ZWxzZSBpZiAocmktXHUwMDNlb2Zmc2V0IFx1MDAzZT0gcmluZy1cdTAwM2VzaXplKVxuJiM0MztcdFx0cm90YXRlID0gdHJ1ZTtcbiYjNDM7XHRpZiAocm90YXRlKSB7XG4mIzQzO1x0XHRyaS1cdTAwM2VvZmZzZXQmIzQzOyYjNDM7O1xuJiM0MztcdFx0cmktXHUwMDNlb2Zmc2V0ICU9IHJpbmctXHUwMDNlc2l6ZTtcbiYjNDM7XHRcdHJpLVx1MDAzZXJyX2NvdW50ZXIgPSBTV0FQX1JPVU5EX1JPQklOX1FVT1RBO1xuJiM0MztcdH1cbiYjNDM7XHRyaS1cdTAwM2Vycl9jb3VudGVyIC09IG5yX2FsbG9jO1xuJiM0MztcdHNpID0gUkVBRF9PTkNFKHJpbmctXHUwMDNlZGV2W3JpLVx1MDAzZW9mZnNldF0pO1xuJiM0MztcdGxvY2FsX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3JlYWRlcnMtXHUwMDNlbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmIChzd2FwX2RldmljZV9tYXNrZWQoc2kpKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVCVVNZKTtcbiYjNDM7XG4mIzQzO1x0c2kgPSBzd2FwX2RldmljZV91bm1hc2tfcHRyKHNpKTtcbiYjNDM7XHRyZXR1cm4gc2k7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHN3YXBfcXVldWVfZmluZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4mIzQzO1x0XHRcdCAgICB1bnNpZ25lZCBpbnQgKnJpbmdfaWR4LCB1bnNpZ25lZCBpbnQgKmRldl9pZHgpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaSwgajtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0KGxvY2tkZXBfaXNfaGVsZChcdTAwMjZzd2Fwb25fcndzZW0pIHx8XG4mIzQzO1x0XHQgICAgICAgbG9ja2RlcF9pc19oZWxkKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc3dhcF9xdWV1ZV9sZW47IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRyaW5nID0gc3dhcF9xdWV1ZVtpXTtcbiYjNDM7XHRcdGlmIChyaW5nLVx1MDAzZXByaW8gIT0gc2ktXHUwMDNlcHJpbylcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyByaW5nLVx1MDAzZXNpemU7IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmIChzd2FwX2RldmljZV91bm1hc2tfcHRyKFJFQURfT05DRShyaW5nLVx1MDAzZWRldltqXSkpICE9IHNpKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHQqcmluZ19pZHggPSBpO1xuJiM0MztcdFx0XHQqZGV2X2lkeCA9IGo7XG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfbWFzayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgcmluZ19pZHgsIGRldl9pZHg7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4mIzQzO1x0aWYgKHN3YXBfcXVldWVfZmluZChzaSwgXHUwMDI2cmluZ19pZHgsIFx1MDAyNmRldl9pZHgpKVxuJiM0MztcdFx0X19zZXRfYml0KFNXQVBfREVWSUNFX01BU0tFRF9TSElGVCxcbiYjNDM7XHRcdFx0ICAodW5zaWduZWQgbG9uZyAqKVx1MDAyNnN3YXBfcXVldWVbcmluZ19pZHhdLVx1MDAzZWRldltkZXZfaWR4XSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfdW5tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCByaW5nX2lkeCwgZGV2X2lkeDtcbiYjNDM7XG4mIzQzO1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiYjNDM7XHRpZiAoc3dhcF9xdWV1ZV9maW5kKHNpLCBcdTAwMjZyaW5nX2lkeCwgXHUwMDI2ZGV2X2lkeCkpXG4mIzQzO1x0XHRfX2NsZWFyX2JpdChTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQsXG4mIzQzO1x0XHRcdCAgICAodW5zaWduZWQgbG9uZyAqKVx1MDAyNnN3YXBfcXVldWVbcmluZ19pZHhdLVx1MDAzZWRldltkZXZfaWR4XSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN3YXBfcHJpb19yaW5nICoqbmV3X3F1ZXVlID0gTlVMTCwgKipvbGRfcXVldWUgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqbmV3X3JlYWRlcnMgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZywgKm5ld19yaW5nID0gTlVMTCwgKm9sZF9yaW5nID0gTlVMTDtcbiYjNDM7XHRpbnQgcHJpbyA9IHNpLVx1MDAzZXByaW87XG4mIzQzO1x0aW50IGksIHBvcywgZXJyID0gLUVOT01FTTtcbiYjNDM7XHRnZnBfdCBnZnA7XG4mIzQzO1xuJiM0MztcdC8qIFN3YXAgbm90IHVzYWJsZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyBzd2FwLCBqdXN0IHJlY2xhaW0gY2FjaGUuICovXG4mIzQzO1x0Z2ZwID0gR0ZQX05PSU8gfCBfX0dGUF9ISUdIO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGRfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChwb3MgPSAwOyBwb3MgXHUwMDNjIHN3YXBfcXVldWVfbGVuOyBwb3MmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoc3dhcF9xdWV1ZVtwb3NdLVx1MDAzZXByaW8gPT0gcHJpbylcbiYjNDM7XHRcdFx0Z290byBhZGRfdG9fcmluZztcbiYjNDM7XHRcdGlmIChzd2FwX3F1ZXVlW3Bvc10tXHUwMDNlcHJpbyBcdTAwM2MgcHJpbylcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBObyByaW5nIGF0IHRoaXMgcHJpb3JpdHk6IGluc2VydCBhIG5ldyBvbmUgYXQgcG9zLiAqL1xuJiM0MztcdG5ld19yZWFkZXJzID0gc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKHN3YXBfcXVldWVfbGVuICYjNDM7IDEsIGdmcCk7XG4mIzQzO1x0aWYgKCFuZXdfcmVhZGVycylcbiYjNDM7XHRcdGdvdG8gZmFpbGVkO1xuJiM0MztcdG5ld19xdWV1ZSA9IGttYWxsb2NfYXJyYXkoc3dhcF9xdWV1ZV9sZW4gJiM0MzsgMSwgc2l6ZW9mKCpzd2FwX3F1ZXVlKSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIW5ld19xdWV1ZSlcbiYjNDM7XHRcdGdvdG8gZmFpbGVkO1xuJiM0MztcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShuZXdfcmluZywgZGV2LCAxKSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIW5ld19yaW5nKVxuJiM0MztcdFx0Z290byBmYWlsZWQ7XG4mIzQzO1x0aWYgKCFnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpXG4mIzQzO1x0XHRnb3RvIGZhaWxlZDtcbiYjNDM7XG4mIzQzO1x0bmV3X3JpbmctXHUwMDNlcHJpbyA9IHByaW87XG4mIzQzO1x0bmV3X3JpbmctXHUwMDNlc2l6ZSA9IDE7XG4mIzQzO1x0bmV3X3JpbmctXHUwMDNlZGV2WzBdID0gc2k7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcG9zOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdG5ld19xdWV1ZVtpXSA9IHN3YXBfcXVldWVbaV07XG4mIzQzO1x0bmV3X3F1ZXVlW3Bvc10gPSBuZXdfcmluZztcbiYjNDM7XHRmb3IgKGkgPSBwb3M7IGkgXHUwMDNjIHN3YXBfcXVldWVfbGVuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdG5ld19xdWV1ZVtpICYjNDM7IDFdID0gc3dhcF9xdWV1ZVtpXTtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcdG9sZF9xdWV1ZSA9IHN3YXBfcXVldWU7XG4mIzQzO1x0c3dhcF9xdWV1ZSA9IG5ld19xdWV1ZTtcbiYjNDM7XHRzd2FwX3F1ZXVlX2xlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4mIzQzO1x0a2ZyZWUob2xkX3F1ZXVlKTtcbiYjNDM7XG4mIzQzO1x0c3dhcF9xdWV1ZV9pbnN0YWxsX3JlYWRlcnMobmV3X3JlYWRlcnMpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7YWRkX3RvX3Jpbmc6XG4mIzQzO1x0cmluZyA9IHN3YXBfcXVldWVbcG9zXTtcbiYjNDM7XHRuZXdfcmluZyA9IGttYWxsb2Moc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLVx1MDAzZXNpemUgJiM0MzsgMSksIGdmcCk7XG4mIzQzO1x0aWYgKCFuZXdfcmluZylcbiYjNDM7XHRcdGdvdG8gZmFpbGVkO1xuJiM0MztcdGlmICghZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxuJiM0MztcdFx0Z290byBmYWlsZWQ7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcdG1lbWNweShuZXdfcmluZywgcmluZywgc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLVx1MDAzZXNpemUpKTtcbiYjNDM7XHRuZXdfcmluZy1cdTAwM2VzaXplJiM0MzsmIzQzOztcbiYjNDM7XHRuZXdfcmluZy1cdTAwM2VkZXZbbmV3X3JpbmctXHUwMDNlc2l6ZSAtIDFdID0gc2k7XG4mIzQzO1x0b2xkX3JpbmcgPSBzd2FwX3F1ZXVlW3Bvc107XG4mIzQzO1x0c3dhcF9xdWV1ZVtwb3NdID0gbmV3X3Jpbmc7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4mIzQzO1x0a2ZyZWUob2xkX3JpbmcpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7ZmFpbGVkOlxuJiM0MztcdGZyZWVfcGVyY3B1KG5ld19yZWFkZXJzKTtcbiYjNDM7XHRrZnJlZShuZXdfcXVldWUpO1xuJiM0MztcdGtmcmVlKG5ld19yaW5nKTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2RlbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRnZnBfdCBnZnA7XG4mIzQzO1x0dW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4O1xuJiM0MztcdHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqbmV3X3JlYWRlcnMgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZywgKm5ld19yaW5nID0gTlVMTCwgKm9sZF9yaW5nID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipuZXdfcXVldWUgPSBOVUxMLCAqKm9sZF9xdWV1ZSA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGRfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRpZiAoIXN3YXBfcXVldWVfZmluZChzaSwgXHUwMDI2cmluZ19pZHgsIFx1MDAyNmRldl9pZHgpKSB7XG4mIzQzO1x0XHRXQVJOX09OKDEpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUbyBzaHJpbmsgbWVtb3J5IHVzYWdlLCBwcmUtYWxsb2NhdGUgbmV3IHNtYWxsZXIgZGF0YSBiZWZvcmVcbiYjNDM7XHQgKiBsb2NraW5nLiBGYWlsdXJlIGlzIGZpbmUsIHN3YXBvZmYgd2lsbCByZWxlYXNlIHRoZW0gYW55d2F5LlxuJiM0MztcdCAqL1xuJiM0MztcdGdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDtcbiYjNDM7XHRyaW5nID0gc3dhcF9xdWV1ZVtyaW5nX2lkeF07XG4mIzQzO1x0aWYgKHJpbmctXHUwMDNlc2l6ZSBcdTAwM2UgMSlcbiYjNDM7XHRcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXHUwMDNlc2l6ZSAtIDEpLCBnZnApO1xuJiM0MztcdGlmIChyaW5nLVx1MDAzZXNpemUgPT0gMSBcdTAwMjZcdTAwMjYgc3dhcF9xdWV1ZV9sZW4gXHUwMDNlIDEpIHtcbiYjNDM7XHRcdG5ld19yZWFkZXJzID0gc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKFxuJiM0MztcdFx0XHRcdFx0c3dhcF9xdWV1ZV9sZW4gLSAxLCBnZnApO1xuJiM0MztcdFx0bmV3X3F1ZXVlID0ga21hbGxvYyhzaXplb2YoKnN3YXBfcXVldWUpICpcbiYjNDM7XHRcdFx0XHQgICAgKHN3YXBfcXVldWVfbGVuIC0gMSksIGdmcCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4mIzQzO1x0aWYgKHJpbmctXHUwMDNlc2l6ZSBcdTAwM2UgMSkge1xuJiM0MztcdFx0LyogU2hpZnQgdHJhaWxpbmcgZGV2aWNlcyBsZWZ0IHRvIGZpbGwgdGhlIGdhcC4gKi9cbiYjNDM7XHRcdHdoaWxlICgmIzQzOyYjNDM7ZGV2X2lkeCBcdTAwM2MgcmluZy1cdTAwM2VzaXplKVxuJiM0MztcdFx0XHRyaW5nLVx1MDAzZWRldltkZXZfaWR4IC0gMV0gPVxuJiM0MztcdFx0XHRcdHJpbmctXHUwMDNlZGV2W2Rldl9pZHhdO1xuJiM0MztcdFx0cmluZy1cdTAwM2VzaXplLS07XG4mIzQzO1x0XHRpZiAobmV3X3JpbmcpIHtcbiYjNDM7XHRcdFx0bWVtY3B5KG5ld19yaW5nLCByaW5nLFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLVx1MDAzZXNpemUpKTtcbiYjNDM7XHRcdFx0b2xkX3JpbmcgPSByaW5nO1xuJiM0MztcdFx0XHRzd2FwX3F1ZXVlW3JpbmdfaWR4XSA9IG5ld19yaW5nO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHQvKiBMYXN0IGRldmljZSBpbiB0aGlzIHJpbmc6IHJlbW92ZSB0aGUgcmluZy4gKi9cbiYjNDM7XHRcdG9sZF9yaW5nID0gcmluZztcbiYjNDM7XHRcdHN3YXBfcXVldWVfbGVuLS07XG4mIzQzO1x0XHR3aGlsZSAoJiM0MzsmIzQzO3JpbmdfaWR4IFx1MDAzYz0gc3dhcF9xdWV1ZV9sZW4pXG4mIzQzO1x0XHRcdHN3YXBfcXVldWVbcmluZ19pZHggLSAxXSA9XG4mIzQzO1x0XHRcdFx0c3dhcF9xdWV1ZVtyaW5nX2lkeF07XG4mIzQzO1x0XHRpZiAobmV3X3F1ZXVlKSB7XG4mIzQzO1x0XHRcdG1lbWNweShuZXdfcXVldWUsIHN3YXBfcXVldWUsXG4mIzQzO1x0XHRcdCAgICAgICBzaXplb2YoKnN3YXBfcXVldWUpICogc3dhcF9xdWV1ZV9sZW4pO1xuJiM0MztcdFx0XHRvbGRfcXVldWUgPSBzd2FwX3F1ZXVlO1xuJiM0MztcdFx0XHRzd2FwX3F1ZXVlID0gbmV3X3F1ZXVlO1xuJiM0MztcdFx0fSBlbHNlIGlmICghc3dhcF9xdWV1ZV9sZW4pIHtcbiYjNDM7XHRcdFx0b2xkX3F1ZXVlID0gc3dhcF9xdWV1ZTtcbiYjNDM7XHRcdFx0c3dhcF9xdWV1ZSA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAobmV3X3JlYWRlcnMgfHwgIXN3YXBfcXVldWVfbGVuKVxuJiM0MztcdFx0XHRzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhuZXdfcmVhZGVycyk7XG4mIzQzO1x0fVxuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRrZnJlZShvbGRfcmluZyk7XG4mIzQzO1x0a2ZyZWUob2xkX3F1ZXVlKTtcbiYjNDM7XHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qXG4gICogVXNlIHRoZSBzZWNvbmQgaGlnaGVzdCBiaXQgb2YgaW51c2VfcGFnZXMgY291bnRlciBhcyB0aGUgaW5kaWNhdG9yXG4tICogaWYgb25lIHN3YXAgZGV2aWNlIGlzIG9uIHRoZSBhdmFpbGFibGUgcGxpc3QsIHNvIHRoZSBhdG9taWMgY2FuXG4mIzQzOyAqIGlmIG9uZSBzd2FwIGRldmljZSBpcyB1bmF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiwgc28gdGhlIGF0b21pYyBjYW5cbiAgKiBzdGlsbCBiZSB1cGRhdGVkIGFyaXRobWV0aWNhbGx5IHdoaWxlIGhhdmluZyBzcGVjaWFsIGRhdGEgZW1iZWRkZWQuXG4gICpcbiAgKiBpbnVzZV9wYWdlcyBjb3VudGVyIGlzIHRoZSBvbmx5IHRoaW5nIGluZGljYXRpbmcgaWYgYSBkZXZpY2Ugc2hvdWxkXG4tICogYmUgb24gYXZhaWxfbGlzdHMgb3Igbm90IChleGNlcHQgc3dhcG9uIC8gc3dhcG9mZikuIEJ5IGVtYmVkZGluZyB0aGVcbi0gKiBvZmYtbGlzdCBiaXQgaW4gdGhlIGF0b21pYyBjb3VudGVyLCB1cGRhdGVzIG5vIGxvbmdlciBuZWVkIGFueSBsb2NrXG4tICogdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxuJiM0MzsgKiBiZSBpbiB0aGUgYXZhaWxhYmxlIHF1ZXVlIG9yIG5vdCAoZXhjZXB0IHN3YXBvbiAvIHN3YXBvZmYpLiBCeVxuJiM0MzsgKiBlbWJlZGRpbmcgdGhlIG9mZi1saXN0IGJpdCBpbiB0aGUgYXRvbWljIGNvdW50ZXIsIHVwZGF0ZXMgbm8gbG9uZ2VyXG4mIzQzOyAqIG5lZWQgYW55IGxvY2sgdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxuICAqXG4tICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3Qgb24gdGhlIHBsaXN0IGFuZCBub3Rcbi0gKiB1c2FibGUsIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGUgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdC5cbiYjNDM7ICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3QgaW4gdGhlIGF2YWlsYWJsZSBxdWV1ZVxuJiM0MzsgKiBhbmQgbm90IHVzYWJsZSwgd2lsbCBiZSBjbGVhcmVkIGlmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIHF1ZXVlLlxuICAqL1xuICNkZWZpbmUgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCAoMVVMIFx1MDAzY1x1MDAzYyAoQklUU19QRVJfVFlQRShhdG9taWNfdCkgLSAyKSlcbiAjZGVmaW5lIFNXQVBfVVNBR0VfQ09VTlRFUl9NQVNLICh+U1dBUF9VU0FHRV9PRkZMSVNUX0JJVClcbkBAIC0xNjMsNiAmIzQzOzQ5MSwyNiBAQCBzdGF0aWMgbG9uZyBzd2FwX3VzYWdlX2luX3BhZ2VzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdHJldHVybiBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKSBcdTAwMjYgU1dBUF9VU0FHRV9DT1VOVEVSX01BU0s7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBTZXJpYWxpemUgdGhlIGFsbG9jYXRpb24gb24gc2luZ2xlIENQVSBvciBnbG9iYWxseSB0byBhdm9pZFxuJiM0MzsgKiBmcmFnbWVudGF0aW9uIGFuZCBtYWtlIHRoZSB3b3JrZmxvdyBlYXNpZXIgdG8gZm9sbG93LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgc3dhcF9hbGxvY19sb2NrX2RldmljZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuJiM0MztcdFx0bG9jYWxfbG9jayhcdTAwMjZzaS1cdTAwM2VwZXJjcHVfY2x1c3Rlci1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRzcGluX2xvY2soXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbG9jayk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfYWxsb2NfdW5sb2NrX2RldmljZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuJiM0MztcdFx0bG9jYWxfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyLVx1MDAzZWxvY2spO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZWxvY2spO1xuJiM0Mzt9XG4mIzQzO1xuIC8qIFJlY2xhaW0gdGhlIHN3YXAgZW50cnkgYW55d2F5IGlmIHBvc3NpYmxlICovXG4gI2RlZmluZSBUVFJTX0FOWVdBWVx0XHQweDFcbiAvKlxuQEAgLTUzMyw5ICYjNDM7ODgxLDEwIEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHQgKiBPbmx5IGNsdXN0ZXIgaXNvbGF0aW9uIGZyb20gdGhlIGFsbG9jYXRvciBkb2VzIHRhYmxlIGFsbG9jYXRpb24uXG4gXHQgKiBTd2FwIGFsbG9jYXRvciB1c2VzIHBlcmNwdSBjbHVzdGVycyBhbmQgaG9sZHMgdGhlIGxvY2FsIGxvY2suXG4gXHQgKi9cbi1cdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2dGhpc19jcHVfcHRyKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIpLVx1MDAzZWxvY2spO1xuLVx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbi1cdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuJiM0MztcdFx0bG9ja2RlcF9hc3NlcnRfaGVsZCh0aGlzX2NwdV9wdHIoXHUwMDI2c2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbG9jaykpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbG9jayk7XG4gXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuIFxuIFx0aWYgKCFzd2FwX2NsdXN0ZXJfYWxsb2NfdGFibGUoY2ksIF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHxcbkBAIC01NDgsOSAmIzQzOzg5Nyw3IEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHQgKiB0aGUgcG90ZW50aWFsIHJlY3Vyc2l2ZSBhbGxvY2F0aW9uIGlzIGxpbWl0ZWQuXG4gXHQgKi9cbiBcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuLVx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXJfbG9jayk7XG4tXHRsb2NhbF91bmxvY2soXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcbiYjNDM7XHRzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc2kpO1xuIFxuIFx0cmV0ID0gc3dhcF9jbHVzdGVyX2FsbG9jX3RhYmxlKGNpLCBfX0dGUF9ISUdIIHwgX19HRlBfTk9NRU1BTExPQyB8XG4gXHRcdFx0XHRcdCAgIEdGUF9LRVJORUwpO1xuQEAgLTU2Myw5ICYjNDM7OTEwLDcgQEAgc3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdCAqIGNvdWxkIGhhcHBlbiB3aXRoIGlnbm9yaW5nIHRoZSBwZXJjcHUgY2x1c3RlciBpcyBmcmFnbWVudGF0aW9uLFxuIFx0ICogd2hpY2ggaXMgYWNjZXB0YWJsZSBzaW5jZSB0aGlzIGZhbGxiYWNrIGFuZCByYWNlIGlzIHJhcmUuXG4gXHQgKi9cbi1cdGxvY2FsX2xvY2soXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbiYjNDM7XHRzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHNpKTtcbiBcdHNwaW5fbG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiBcbiBcdGlmIChyZXQpIHtcbkBAIC02NzEsNyAmIzQzOzEwMTYsNyBAQCBzdGF0aWMgYm9vbCBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdFx0Y2kgPSBsaXN0X2ZpcnN0X2VudHJ5KFx1MDAyNnNpLVx1MDAzZWRpc2NhcmRfY2x1c3RlcnMsIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbywgbGlzdCk7XG4gXHRcdC8qXG4gXHRcdCAqIERlbGV0ZSB0aGUgY2x1c3RlciBmcm9tIGxpc3QgdG8gcHJlcGFyZSBmb3IgZGlzY2FyZCwgYnV0IGtlZXBcbi1cdFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHBlcmNwdV9zd2FwX2NsdXN0ZXIgY291bGQgYmVcbiYjNDM7XHRcdCAqIHRoZSBDTFVTVEVSX0ZMQUdfRElTQ0FSRCBmbGFnLCB0aGVyZSBjb3VsZCBiZSBwZXJjcHVfY2x1c3RlclxuIFx0XHQgKiBwb2ludGluZyB0byBpdCwgb3IgcmFuIGludG8gYnkgcmVsb2NhdGVfY2x1c3Rlci5cbiBcdFx0ICovXG4gXHRcdGxpc3RfZGVsKFx1MDAyNmNpLVx1MDAzZWxpc3QpO1xuQEAgLTk1NSw3ICYjNDM7MTMwMCw3IEBAIHN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aWYgKGNsdXN0ZXJfaXNfZW1wdHkoY2kpKVxuIFx0XHRjaS1cdTAwM2VvcmRlciA9IG9yZGVyO1xuIFx0Y2ktXHUwMDNlY291bnQgJiM0Mzs9IG5yX3BhZ2VzO1xuLVx0c3dhcF9yYW5nZV9hbGxvYyhzaSwgbnJfcGFnZXMpO1xuJiM0MztcdHN3YXBfZGV2aWNlX2ludXNlX2FkZChzaSwgbnJfcGFnZXMpO1xuIFxuIFx0cmV0dXJuIHRydWU7XG4gfVxuQEAgLTEwMDMsMTIgJiM0MzsxMzQ4LDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWxsb2Nfc3dhcF9zY2FuX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIG91dDpcbiBcdHJlbG9jYXRlX2NsdXN0ZXIoc2ksIGNpKTtcbiBcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkge1xuLVx0XHR0aGlzX2NwdV93cml0ZShwZXJjcHVfc3dhcF9jbHVzdGVyLm9mZnNldFtvcmRlcl0sIG5leHQpO1xuLVx0XHR0aGlzX2NwdV93cml0ZShwZXJjcHVfc3dhcF9jbHVzdGVyLnNpW29yZGVyXSwgc2kpO1xuLVx0fSBlbHNlIHtcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuJiM0MztcdFx0dGhpc19jcHVfd3JpdGUoc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbmV4dFtvcmRlcl0sIG5leHQpO1xuJiM0MztcdGVsc2VcbiBcdFx0c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbmV4dFtvcmRlcl0gPSBuZXh0O1xuLVx0fVxuIFx0cmV0dXJuIGZvdW5kO1xuIH1cbiBcbkBAIC0xMTAzLDEzICYjNDM7MTQ0NiwxNCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiAhKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfQkxLREVWKSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4tXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKSB7XG4tXHRcdC8qIFNlcmlhbGl6ZSBIREQgU1dBUCBhbGxvY2F0aW9uIGZvciBlYWNoIGRldmljZS4gKi9cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuJiM0MztyZXN0YXJ0OlxuJiM0MztcdHN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc2kpO1xuJiM0MztcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpXG4mIzQzO1x0XHRvZmZzZXQgPSBfX3RoaXNfY3B1X3JlYWQoc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbmV4dFtvcmRlcl0pO1xuJiM0MztcdGVsc2VcbiBcdFx0b2Zmc2V0ID0gc2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbmV4dFtvcmRlcl07XG4tXHRcdGlmIChvZmZzZXQgPT0gU1dBUF9FTlRSWV9JTlZBTElEKVxuLVx0XHRcdGdvdG8gbmV3X2NsdXN0ZXI7XG4gXG4mIzQzO1x0aWYgKG9mZnNldCAhPSBTV0FQX0VOVFJZX0lOVkFMSUQpIHtcbiBcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfbG9jayhzaSwgb2Zmc2V0KTtcbiBcdFx0LyogQ2x1c3RlciBjb3VsZCBoYXZlIGJlZW4gdXNlZCBieSBhbm90aGVyIG9yZGVyICovXG4gXHRcdGlmIChjbHVzdGVyX2lzX3VzYWJsZShjaSwgb3JkZXIpKSB7XG5AQCAtMTEyMyw3ICYjNDM7MTQ2Nyw2IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdFx0Z290byBkb25lO1xuIFx0fVxuIFxuLW5ld19jbHVzdGVyOlxuIFx0LypcbiBcdCAqIElmIHRoZSBkZXZpY2UgbmVlZCBkaXNjYXJkLCBwcmVmZXIgbmV3IGNsdXN0ZXIgb3ZlciBub25mdWxsXG4gXHQgKiB0byBzcHJlYWQgb3V0IHRoZSB3cml0ZXMuXG5AQCAtMTEzMiw2ICYjNDM7MTQ3NSwxMiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0XHRmb3VuZCA9IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHNpLCBcdTAwMjZzaS1cdTAwM2VmcmVlX2NsdXN0ZXJzLCBmb2xpbywgZmFsc2UpO1xuIFx0XHRpZiAoZm91bmQpXG4gXHRcdFx0Z290byBkb25lO1xuJiM0MztcbiYjNDM7XHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZzaS1cdTAwM2VkaXNjYXJkX2NsdXN0ZXJzKSkge1xuJiM0MztcdFx0XHRzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc2kpO1xuJiM0MztcdFx0XHRzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTtcbiYjNDM7XHRcdFx0Z290byByZXN0YXJ0O1xuJiM0MztcdFx0fVxuIFx0fVxuIFxuIFx0aWYgKG9yZGVyIFx1MDAzYyBQTURfT1JERVIpIHtcbkBAIC0xMTgwLDggJiM0MzsxNTI5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHRnb3RvIGRvbmU7XG4gXHR9XG4gZG9uZTpcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuJiM0MztcdHN3YXBfYWxsb2NfdW5sb2NrX2RldmljZShzaSk7XG4gXG4gXHRyZXR1cm4gZm91bmQ7XG4gfVxuQEAgLTExOTEsNTQgJiM0MzsxNTM5LDQ0IEBAIHN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBwYWdlcztcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiBcbi1cdGlmIChzd2Fwb2ZmKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZvcmNlZnVsbHkgcmVtb3ZlIGl0LiBDbGVhciB0aGUgU1dQX1dSSVRFT0sgZmxhZ3MgZm9yXG4tXHRcdCAqIHN3YXBvZmYgaGVyZSBzbyBpdCYjMzk7cyBzeW5jaHJvbml6ZWQgYnkgYm90aCBzaS1cdTAwM2Vsb2NrIGFuZFxuLVx0XHQgKiBzd2FwX2F2YWlsX2xvY2ssIHRvIGVuc3VyZSB0aGUgcmVzdWx0IGNhbiBiZSBzZWVuIGJ5XG4tXHRcdCAqIGFkZF90b19hdmFpbF9saXN0LlxuLVx0XHQgKi9cbi1cdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbi1cdFx0c2ktXHUwMDNlZmxhZ3MgXHUwMDI2PSB+U1dQX1dSSVRFT0s7XG4tXHRcdGF0b21pY19sb25nX29yKFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbi1cdH0gZWxzZSB7XG4tXHRcdC8qXG4tXHRcdCAqIElmIG5vdCBjYWxsZWQgYnkgc3dhcG9mZiwgdGFrZSBpdCBvZmYtbGlzdCBvbmx5IGlmIGl0JiMzOTtzXG4tXHRcdCAqIGZ1bGwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgbm90IHNldCAoc3RyaWN0bHlcbi1cdFx0ICogc2ktXHUwMDNlaW51c2VfcGFnZXMgPT0gcGFnZXMpLCBhbnkgY29uY3VycmVudCBzbG90IGZyZWVpbmcsXG4tXHRcdCAqIG9yIGRldmljZSBhbHJlYWR5IHJlbW92ZWQgZnJvbSBwbGlzdCBieSBzb21lb25lIGVsc2Vcbi1cdFx0ICogd2lsbCBtYWtlIHRoaXMgcmV0dXJuIGZhbHNlLlxuLVx0XHQgKi9cbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZvcmNlIHJlbW92ZSBpdCBvbmx5IGZvciBzd2Fwb2ZmLiBFbHNlLCB0YWtlIGl0IG9mZi1saXN0IG9ubHkgaWZcbiYjNDM7XHQgKiBpdCYjMzk7cyBmdWxsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQgKHN0cmljdGx5XG4mIzQzO1x0ICogc2ktXHUwMDNlaW51c2VfcGFnZXMgPT0gcGFnZXMpLCBzbyBjb25jdXJyZW50IHNsb3QgZnJlZWluZywgb3JcbiYjNDM7XHQgKiBjb25jdXJyZW50IGxpc3QgcmVtb3ZhbCB3aWxsIG1ha2UgdGhlIGNtcHhjaGcgZmFpbCBhbmQgc2tpcFxuJiM0MztcdCAqIHRoZSByZW1vdmFsLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghc3dhcG9mZikge1xuIFx0XHRwYWdlcyA9IHNpLVx1MDAzZXBhZ2VzO1xuIFx0XHRpZiAoIWF0b21pY19sb25nX3RyeV9jbXB4Y2hnKFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzLCBcdTAwMjZwYWdlcyxcbiBcdFx0XHRcdFx0ICAgICBwYWdlcyB8IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxuIFx0XHRcdGdvdG8gc2tpcDtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0YXRvbWljX2xvbmdfb3IoU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgXHUwMDI2c2ktXHUwMDNlaW51c2VfcGFnZXMpO1xuIFx0fVxuIFxuLVx0cGxpc3RfZGVsKFx1MDAyNnNpLVx1MDAzZWF2YWlsX2xpc3QsIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XG4tXG4mIzQzO1x0c3dhcF9xdWV1ZV9tYXNrKHNpKTtcbiBza2lwOlxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiB9XG4gXG4gLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHRoaXMgaGVscGVyLiAqL1xuLXN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pXG4mIzQzO3N0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiB7XG4gXHRsb25nIHZhbDtcbiBcdHVuc2lnbmVkIGxvbmcgcGFnZXM7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4gXG4tXHQvKiBDb3JyZXNwb25kaW5nIHRvIFNXUF9XUklURU9LIGNsZWFyaW5nIGluIGRlbF9mcm9tX2F2YWlsX2xpc3QgKi9cbi1cdGlmIChzd2Fwb24pIHtcbi1cdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbi1cdFx0c2ktXHUwMDNlZmxhZ3MgfD0gU1dQX1dSSVRFT0s7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoIShSRUFEX09OQ0Uoc2ktXHUwMDNlZmxhZ3MpIFx1MDAyNiBTV1BfV1JJVEVPSykpXG4tXHRcdFx0Z290byBza2lwO1xuLVx0fVxuJiM0MztcdC8qXG4mIzQzO1x0ICogTWFyayB0aGUgZGV2aWNlIGFzIGF2YWlsIGlmIFNXUF9XUklURU9LIGlzIHNldC4gU3dhcG9mZiBjbGVhcnNcbiYjNDM7XHQgKiBTV1BfV1JJVEVPSyBmaXJzdCwgc28gY2hlY2sgdGhhdCBmaXJzdCBzbyB0aGUgZGV2aWNlIHdvbiYjMzk7dCBiZVxuJiM0MztcdCAqIHJlLWFkZGVkIGFmdGVyIHN3YXBvZmYgc3RhcnRlZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spKVxuJiM0MztcdFx0Z290byBza2lwO1xuIFxuIFx0aWYgKCEoYXRvbWljX2xvbmdfcmVhZChcdTAwMjZzaS1cdTAwM2VpbnVzZV9wYWdlcykgXHUwMDI2IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxuIFx0XHRnb3RvIHNraXA7XG5AQCAtMTI0Niw5ICYjNDM7MTU4NCwxMCBAQCBzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxuIFx0dmFsID0gYXRvbWljX2xvbmdfZmV0Y2hfYW5kX3JlbGF4ZWQoflNXQVBfVVNBR0VfT0ZGTElTVF9CSVQsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbiBcbiBcdC8qXG4tXHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBkZXZpY2UgaXMgb24gdGhlIHBsaXN0LCBvbmx5IG9uZSB1cGRhdGVyIHdpbGxcbi1cdCAqIHNlZSAoaW51c2VfcGFnZXMgPT0gc2ktXHUwMDNlcGFnZXMpIGFuZCB3aWxsIGNhbGwgZGVsX2Zyb21fYXZhaWxfbGlzdC4gSWZcbi1cdCAqIHRoYXQgdXBkYXRlciBoYXBwZW4gdG8gYmUgaGVyZSwganVzdCBza2lwIGFkZGluZy5cbiYjNDM7XHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBtYXJrZWQgYXMgYXZhaWxhYmxlLCBvbmUgcmVhZGVyIHdpbGwgc2VlXG4mIzQzO1x0ICogKGludXNlX3BhZ2VzID09IHNpLVx1MDAzZXBhZ2VzKSBhbmQgc2hvdWxkIG1hcmsgaXQgYXMgdW5hdmFpbGFibGUgYW5kXG4mIzQzO1x0ICogc2V0IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQuIElmIHRoYXQgdXBkYXRlciBoYXBwZW5zIHRvIGJlIGhlcmUsIGp1c3RcbiYjNDM7XHQgKiBza2lwIHRoZSByZXN0LlxuIFx0ICovXG4gXHRwYWdlcyA9IHNpLVx1MDAzZXBhZ2VzO1xuIFx0aWYgKHZhbCA9PSBwYWdlcykge1xuQEAgLTEyNTgsNjAgJiM0MzsxNTk3LDQyIEBAIHN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pXG4gXHRcdFx0Z290byBza2lwO1xuIFx0fVxuIFxuLVx0cGxpc3RfYWRkKFx1MDAyNnNpLVx1MDAzZWF2YWlsX2xpc3QsIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XG4tXG4mIzQzO1x0c3dhcF9xdWV1ZV91bm1hc2soc2kpO1xuIHNraXA6XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuIH1cbiBcbiAvKlxuLSAqIHN3YXBfdXNhZ2VfYWRkIC8gc3dhcF91c2FnZV9zdWIgb2YgZWFjaCBzbG90IGFyZSBzZXJpYWxpemVkIGJ5IGNpLVx1MDAzZWxvY2tcbi0gKiB3aXRoaW4gZWFjaCBjbHVzdGVyLCBzbyB0aGUgdG90YWwgY29udHJpYnV0aW9uIHRvIHRoZSBnbG9iYWwgY291bnRlciBzaG91bGRcbi0gKiBhbHdheXMgYmUgcG9zaXRpdmUgYW5kIGNhbm5vdCBleGNlZWQgdGhlIHRvdGFsIG51bWJlciBvZiB1c2FibGUgc2xvdHMuXG4mIzQzOyAqIHN3YXBfZGV2aWNlX2ludXNlX2FkZCAvIHN3YXBfZGV2aWNlX2ludXNlX3N1YiBhcmUgY2FsbGVkIHdpdGhpbiBjbHVzdGVyXG4mIzQzOyAqIHVwZGF0ZSBjcml0aWNhbCBzZWN0aW9ucyBhbmQgc2VyaWFsaXplZCBieSBjaS1cdTAwM2Vsb2NrIHdpdGhpbiBlYWNoIGNsdXN0ZXIsXG4mIzQzOyAqIHNvIHRoZSB0b3RhbCBjb250cmlidXRpb24gdG8gdGhlIGdsb2JhbCBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmVcbiYjNDM7ICogYW5kIGNhbm5vdCBleGNlZWQgdGhlIHRvdGFsIG51bWJlciBvZiB1c2FibGUgc2xvdHMuXG4gICovXG4tc3RhdGljIGJvb2wgc3dhcF91c2FnZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBpbnQgbnJfZW50cmllcylcbiYjNDM7c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiYjNDM7XHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuIHtcbi1cdGxvbmcgdmFsID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbiYjNDM7XHRsb25nIGludXNlX3BhZ2VzO1xuIFxuIFx0LypcbiBcdCAqIElmIGRldmljZSBpcyBmdWxsLCBhbmQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBpcyBub3Qgc2V0LFxuLVx0ICogcmVtb3ZlIGl0IGZyb20gdGhlIHBsaXN0LlxuLVx0ICovXG4tXHRpZiAodW5saWtlbHkodmFsID09IHNpLVx1MDAzZXBhZ2VzKSkge1xuLVx0XHRkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBzd2FwX3VzYWdlX3N1YihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuLXtcbi1cdGxvbmcgdmFsID0gYXRvbWljX2xvbmdfc3ViX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbi1cbi1cdC8qXG4tXHQgKiBJZiBkZXZpY2UgaXMgbm90IGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIHNldCxcbi1cdCAqIGFkZCBpdCB0byB0aGUgcGxpc3QuXG4mIzQzO1x0ICogbWFyayBpdCB1bmF2YWlsYWJsZS5cbiBcdCAqL1xuLVx0aWYgKHVubGlrZWx5KHZhbCBcdTAwMjYgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCkpXG4tXHRcdGFkZF90b19hdmFpbF9saXN0KHNpLCBmYWxzZSk7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuLVx0XHRcdCAgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4te1xuLVx0aWYgKHN3YXBfdXNhZ2VfYWRkKHNpLCBucl9lbnRyaWVzKSkge1xuJiM0MztcdGludXNlX3BhZ2VzID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbiYjNDM7XHRpZiAodW5saWtlbHkoaW51c2VfcGFnZXMgPT0gc2ktXHUwMDNlcGFnZXMpKSB7XG4gXHRcdGlmICh2bV9zd2FwX2Z1bGwoKSlcbiBcdFx0XHRzY2hlZHVsZV93b3JrKFx1MDAyNnNpLVx1MDAzZXJlY2xhaW1fd29yayk7XG4mIzQzO1x0XHRkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7XG4gXHR9XG4mIzQzO1xuIFx0YXRvbWljX2xvbmdfc3ViKG5yX2VudHJpZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcbi1cdFx0XHQgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2ludXNlX3N1YihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBlbmQgPSBvZmZzZXQgJiM0MzsgbnJfZW50cmllcyAtIDE7XG4gXHR2b2lkICgqc3dhcF9zbG90X2ZyZWVfbm90aWZ5KShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpO1xuJiM0MztcdGxvbmcgaW51c2VfcGFnZXM7XG4gXHR1bnNpZ25lZCBpbnQgaTtcbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX2VudHJpZXM7IGkmIzQzOyYjNDM7KVxuQEAgLTEzMzUsNyAmIzQzOzE2NTYsMTQgQEAgc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9mcmVlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXG4gXHQgKi9cbiBcdHNtcF93bWIoKTtcbiBcdGF0b21pY19sb25nX2FkZChucl9lbnRyaWVzLCBcdTAwMjZucl9zd2FwX3BhZ2VzKTtcbi1cdHN3YXBfdXNhZ2Vfc3ViKHNpLCBucl9lbnRyaWVzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZiBkZXZpY2UgaXMgbm90IGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIHNldCxcbiYjNDM7XHQgKiBhZGQgaXQgYmFjayB0byB0aGUgYXZhaWxhYmxlIHF1ZXVlLlxuJiM0MztcdCAqL1xuJiM0MztcdGludXNlX3BhZ2VzID0gYXRvbWljX2xvbmdfc3ViX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbiYjNDM7XHRpZiAodW5saWtlbHkoaW51c2VfcGFnZXMgXHUwMDI2IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxuJiM0MztcdFx0YWRkX3RvX2F2YWlsX2xpc3Qoc2kpO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5AQCAtMTM0NSwxMTMgJiM0MzsxNjczLDQ5IEBAIHN0YXRpYyBib29sIGdldF9zd2FwX2RldmljZV9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdC8qXG4gXHQgKiBHdWFyYW50ZWUgdGhlIHNpLVx1MDAzZXVzZXJzIGFyZSBjaGVja2VkIGJlZm9yZSBhY2Nlc3Npbmcgb3RoZXJcbiBcdCAqIGZpZWxkcyBvZiBzd2FwX2luZm9fc3RydWN0LCBhbmQgc2ktXHUwMDNlZmxhZ3MgKFNXUF9XUklURU9LKSBpc1xuLVx0ICogdXAgdG8gZGF0ZWQuXG4mIzQzO1x0ICogdXAgdG8gZGF0ZS5cbiBcdCAqXG4tXHQgKiBQYWlyZWQgd2l0aCB0aGUgc3Bpbl91bmxvY2soKSBhZnRlciBzZXR1cF9zd2FwX2luZm8oKSBpblxuLVx0ICogZW5hYmxlX3N3YXBfaW5mbygpLCBhbmQgc21wX3dtYigpIGluIHN3YXBvZmYuXG4mIzQzO1x0ICogUGFpcmVkIHdpdGggcGVyY3B1X3VwX3dyaXRlKCkgaW4gc3dhcF9kZXZpY2VfZW5hYmxlKCksIGFuZFxuJiM0MztcdCAqIHNtcF93bWIoKSBhZnRlciBjbGVhcmluZyBTV1BfV1JJVEVPSyBpbiBzd2Fwb2ZmLlxuIFx0ICovXG4gXHRzbXBfcm1iKCk7XG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4tLypcbi0gKiBGYXN0IHBhdGggdHJ5IHRvIGdldCBzd2FwIGVudHJpZXMgd2l0aCBzcGVjaWZpZWQgb3JkZXIgZnJvbSBjdXJyZW50XG4tICogQ1BVJiMzOTtzIHN3YXAgZW50cnkgcG9vbCAoYSBjbHVzdGVyKS5cbi0gKi9cbi1zdGF0aWMgYm9vbCBzd2FwX2FsbG9jX2Zhc3Qoc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7c3RhdGljIGludCBzd2FwX2FsbG9jX2VudHJ5KHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0dW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuLVx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbiYjNDM7XHRsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuLVx0dW5zaWduZWQgaW50IG9mZnNldDtcbi1cbi1cdC8qXG4tXHQgKiBPbmNlIGFsbG9jYXRlZCwgc3dhcF9pbmZvX3N0cnVjdCB3aWxsIG5ldmVyIGJlIGNvbXBsZXRlbHkgZnJlZWQsXG4tXHQgKiBzbyBjaGVja2luZyBpdCYjMzk7cyBsaXZlbmVzcyBieSBnZXRfc3dhcF9kZXZpY2VfaW5mbyBpcyBlbm91Z2guXG4tXHQgKi9cbi1cdHNpID0gdGhpc19jcHVfcmVhZChwZXJjcHVfc3dhcF9jbHVzdGVyLnNpW29yZGVyXSk7XG4tXHRvZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0W29yZGVyXSk7XG4tXHRpZiAoIXNpIHx8ICFvZmZzZXQgfHwgIWdldF9zd2FwX2RldmljZV9pbmZvKHNpKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0Y2kgPSBzd2FwX2NsdXN0ZXJfbG9jayhzaSwgb2Zmc2V0KTtcbi1cdGlmIChjbHVzdGVyX2lzX3VzYWJsZShjaSwgb3JkZXIpKSB7XG4tXHRcdGlmIChjbHVzdGVyX2lzX2VtcHR5KGNpKSlcbi1cdFx0XHRvZmZzZXQgPSBjbHVzdGVyX29mZnNldChzaSwgY2kpO1xuLVx0XHRhbGxvY19zd2FwX3NjYW5fY2x1c3RlcihzaSwgY2ksIGZvbGlvLCBvZmZzZXQpO1xuLVx0fSBlbHNlIHtcbi1cdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9XG4mIzQzO1x0aW50IG5yX2l0ZXIsIHJldDtcbiYjNDM7XG4mIzQzO1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdGZvciAobnJfaXRlciA9IDA7OyBucl9pdGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0c2kgPSBzd2FwX3F1ZXVlX2dldF9kZXZpY2UobnJfcGFnZXMsIG5yX2l0ZXIpO1xuJiM0MztcdFx0aWYgKElTX0VSUihzaSkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gUFRSX0VSUihzaSk7XG4mIzQzO1x0XHRcdGlmIChyZXQgPT0gLUVCVVNZKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzaSwgZm9saW8pO1xuIFxuLVx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcbi1cdHJldHVybiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4tfVxuLVxuLS8qIFJvdGF0ZSB0aGUgZGV2aWNlIGFuZCBzd2l0Y2ggdG8gYSBuZXcgY2x1c3RlciAqL1xuLXN0YXRpYyB2b2lkIHN3YXBfYWxsb2Nfc2xvdyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLXtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgKm5leHQ7XG4tXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbi1zdGFydF9vdmVyOlxuLVx0cGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzaSwgbmV4dCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkLCBhdmFpbF9saXN0KSB7XG4tXHRcdC8qIFJvdGF0ZSB0aGUgZGV2aWNlIGFuZCBzd2l0Y2ggdG8gYSBuZXcgY2x1c3RlciAqL1xuLVx0XHRwbGlzdF9yZXF1ZXVlKFx1MDAyNnNpLVx1MDAzZWF2YWlsX2xpc3QsIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4tXHRcdGlmIChnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpIHtcbi1cdFx0XHRjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIGZvbGlvKTtcbi1cdFx0XHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4tXHRcdFx0XHRyZXR1cm47XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuLVx0XHRcdFx0cmV0dXJuO1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xuJiM0MztcdFx0XHRyZXQgPSAwO1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0fVxuIFxuLVx0XHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbiBcdFx0Lypcbi1cdFx0ICogaWYgd2UgZ290IGhlcmUsIGl0JiMzOTtzIGxpa2VseSB0aGF0IHNpIHdhcyBhbG1vc3QgZnVsbCBiZWZvcmUsXG4tXHRcdCAqIG11bHRpcGxlIGNhbGxlcnMgcHJvYmFibHkgYWxsIHRyaWVkIHRvIGdldCBhIHBhZ2UgZnJvbSB0aGVcbi1cdFx0ICogc2FtZSBzaSBhbmQgaXQgZmlsbGVkIHVwIGJlZm9yZSB3ZSBjb3VsZCBnZXQgb25lOyBvciwgdGhlIHNpXG4tXHRcdCAqIGZpbGxlZCB1cCBiZXR3ZWVuIHVzIGRyb3BwaW5nIHN3YXBfYXZhaWxfbG9jay5cbi1cdFx0ICogU2luY2Ugd2UgZHJvcHBlZCB0aGUgc3dhcF9hdmFpbF9sb2NrLCB0aGUgc3dhcF9hdmFpbF9saXN0XG4tXHRcdCAqIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQ7IHNvIGlmIG5leHQgaXMgc3RpbGwgaW4gdGhlXG4tXHRcdCAqIHN3YXBfYXZhaWxfaGVhZCBsaXN0IHRoZW4gdHJ5IGl0LCBvdGhlcndpc2Ugc3RhcnQgb3ZlciBpZiB3ZVxuLVx0XHQgKiBoYXZlIG5vdCBnb3R0ZW4gYW55IHNsb3RzLlxuJiM0MztcdFx0ICogRm9yIGxhcmdlIGFsbG9jYXRpb24sIHJldHVybiBlcnJvciBkaXJlY3RseSB0byBpbmZvcm0gdGhlXG4mIzQzO1x0XHQgKiBjYWxsZXIgdG8gc3BsaXQgaXQgaW5zdGVhZCBvZiBmYWxsYmFjayB0byBvdGhlciBkZXZpY2VzLlxuIFx0XHQgKi9cbi1cdFx0aWYgKHBsaXN0X25vZGVfZW1wdHkoXHUwMDI2bmV4dC1cdTAwM2VhdmFpbF9saXN0KSlcbi1cdFx0XHRnb3RvIHN0YXJ0X292ZXI7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuLX1cbi1cbi0vKlxuLSAqIERpc2NhcmQgcGVuZGluZyBjbHVzdGVycyBpbiBhIHN5bmNocm9uaXplZCB3YXkgd2hlbiB1bmRlciBoaWdoIHByZXNzdXJlLlxuLSAqIFJldHVybjogdHJ1ZSBpZiBhbnkgY2x1c3RlciBpcyBkaXNjYXJkZWQuXG4tICovXG4tc3RhdGljIGJvb2wgc3dhcF9zeW5jX2Rpc2NhcmQodm9pZClcbi17XG4tXHRib29sIHJldCA9IGZhbHNlO1xuLVx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCAqbmV4dDtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLXN0YXJ0X292ZXI6XG4tXHRwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNpLCBuZXh0LCBcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkLCBsaXN0KSB7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdGlmIChnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpIHtcbi1cdFx0XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9QQUdFX0RJU0NBUkQpXG4tXHRcdFx0XHRyZXQgPSBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTtcbi1cdFx0XHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4mIzQzO1x0XHRcdHJldCA9IC1FMkJJRztcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKHJldClcbi1cdFx0XHRyZXR1cm4gdHJ1ZTtcbi1cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdGlmIChwbGlzdF9ub2RlX2VtcHR5KFx1MDAyNm5leHQtXHUwMDNlbGlzdCkpXG4tXHRcdFx0Z290byBzdGFydF9vdmVyO1xuIFx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiBcbi1cdHJldHVybiBmYWxzZTtcbiYjNDM7XHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyBpbnQgc3dhcF9leHRlbmRfdGFibGVfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuQEAgLTE3MzUsNiAmIzQzOzE5OTksNyBAQCBpbnQgZm9saW9fYWxsb2Nfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiBcdHVuc2lnbmVkIGludCBvcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHVuc2lnbmVkIGludCBzaXplID0gMSBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0aW50IHJldDtcbiBcbiBcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pLCBmb2xpbyk7XG5AQCAtMTc1NywyMyAmIzQzOzIwMjIsMTQgQEAgaW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0fVxuIFx0fVxuIFxuLWFnYWluOlxuLVx0bG9jYWxfbG9jayhcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spO1xuLVx0aWYgKCFzd2FwX2FsbG9jX2Zhc3QoZm9saW8pKVxuLVx0XHRzd2FwX2FsbG9jX3Nsb3coZm9saW8pO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4tXG4tXHRpZiAoIW9yZGVyIFx1MDAyNlx1MDAyNiB1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkge1xuLVx0XHRpZiAoc3dhcF9zeW5jX2Rpc2NhcmQoKSlcbi1cdFx0XHRnb3RvIGFnYWluO1xuLVx0fVxuJiM0MztcdHJldCA9IHN3YXBfYWxsb2NfZW50cnkoZm9saW8pO1xuIFxuIFx0LyogTmVlZCB0byBjYWxsIHRoaXMgZXZlbiBpZiBhbGxvY2F0aW9uIGZhaWxlZCwgZm9yIE1FTUNHX1NXQVBfRkFJTC4gKi9cbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcChmb2xpbykpKVxuIFx0XHRzd2FwX2NhY2hlX2RlbF9mb2xpbyhmb2xpbyk7XG4gXG4gXHRpZiAodW5saWtlbHkoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdFx0cmV0dXJuIHJldCA/IHJldCA6IC1FTk9NRU07XG4gXG4gXHRyZXR1cm4gMDtcbiB9XG5AQCAtMTk0OCw3ICYjNDM7MjIwNCw3IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdGlmIChiYXRjaF9pZClcbiBcdFx0bWVtX2Nncm91cF91bmNoYXJnZV9zd2FwKGJhdGNoX2lkLCBjaV9vZmYgLSBiYXRjaF9vZmYpO1xuIFxuLVx0c3dhcF9yYW5nZV9mcmVlKHNpLCBjaV9oZWFkICYjNDM7IGNpX3N0YXJ0LCBucl9wYWdlcyk7XG4mIzQzO1x0c3dhcF9kZXZpY2VfaW51c2Vfc3ViKHNpLCBjaV9oZWFkICYjNDM7IGNpX3N0YXJ0LCBucl9wYWdlcyk7XG4gXHRzd2FwX2NsdXN0ZXJfYXNzZXJ0X2VtcHR5KGNpLCBjaV9zdGFydCwgbnJfcGFnZXMsIGZhbHNlKTtcbiBcbiBcdGlmICghY2ktXHUwMDNlY291bnQpXG5AQCAtMjE1MCwzMSAmIzQzOzI0MDYsMTQgQEAgdm9pZCBzd2FwX3B1dF9lbnRyaWVzX2RpcmVjdChzd3BfZW50cnlfdCBlbnRyeSwgaW50IG5yKVxuICAqL1xuIHN3cF9lbnRyeV90IHN3YXBfYWxsb2NfaGliZXJuYXRpb25fc2xvdChpbnQgdHlwZSlcbiB7XG4tXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcGNwX3NpLCAqc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcbi1cdHVuc2lnbmVkIGxvbmcgcGNwX29mZnNldCwgb2Zmc2V0ID0gU1dBUF9FTlRSWV9JTlZBTElEO1xuLVx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG9mZnNldCA9IFNXQVBfRU5UUllfSU5WQUxJRDtcbiBcdHN3cF9lbnRyeV90IGVudHJ5ID0gezB9O1xuIFxuIFx0aWYgKCFzaSlcbiBcdFx0Z290byBmYWlsO1xuIFxuLVx0Lypcbi1cdCAqIFRyeSB0aGUgbG9jYWwgY2x1c3RlciBmaXJzdCBpZiBpdCBtYXRjaGVzIHRoZSBkZXZpY2UuIElmXG4tXHQgKiBub3QsIHRyeSBncmFiIGEgbmV3IGNsdXN0ZXIgYW5kIG92ZXJyaWRlIGxvY2FsIGNsdXN0ZXIuXG4tXHQgKi9cbi1cdGxvY2FsX2xvY2soXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcbi1cdHBjcF9zaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVswXSk7XG4tXHRwY3Bfb2Zmc2V0ID0gdGhpc19jcHVfcmVhZChwZXJjcHVfc3dhcF9jbHVzdGVyLm9mZnNldFswXSk7XG4tXHRpZiAocGNwX3NpID09IHNpIFx1MDAyNlx1MDAyNiBwY3Bfb2Zmc2V0KSB7XG4tXHRcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIHBjcF9vZmZzZXQpO1xuLVx0XHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIDApKVxuLVx0XHRcdG9mZnNldCA9IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHNpLCBjaSwgTlVMTCwgcGNwX29mZnNldCk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdH1cbi1cdGlmICghb2Zmc2V0KVxuLVx0XHRvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4mIzQzO1x0b2Zmc2V0ID0gY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBOVUxMKTtcbiBcdGlmIChvZmZzZXQpXG4gXHRcdGVudHJ5ID0gc3dwX2VudHJ5KHNpLVx1MDAzZXR5cGUsIG9mZnNldCk7XG4gXG5AQCAtMjIwNSwyNiAmIzQzOzI0NDQsMTggQEAgdm9pZCBzd2FwX2ZyZWVfaGliZXJuYXRpb25fc2xvdChzd3BfZW50cnlfdCBlbnRyeSlcbiBcbiBzdGF0aWMgaW50IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4ge1xuLVx0aW50IHR5cGU7XG4tXG4tXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuIFxuIFx0aWYgKCFkZXZpY2UpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlJiM0MzsmIzQzOykge1xuLVx0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzID0gc3dhcF9pbmZvW3R5cGVdO1xuLVxuLVx0XHRpZiAoIShzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbi1cdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0aWYgKGRldmljZSA9PSBzaXMtXHUwMDNlYmRldi1cdTAwM2ViZF9kZXYpIHtcbi1cdFx0XHRzdHJ1Y3Qgc3dhcF9leHRlbnQgKnNlID0gZmlyc3Rfc2Uoc2lzKTtcbi1cbi1cdFx0XHRpZiAoc2UtXHUwMDNlc3RhcnRfYmxvY2sgPT0gb2Zmc2V0KVxuLVx0XHRcdFx0cmV0dXJuIHR5cGU7XG4mIzQzO1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xuJiM0MztcdFx0aWYgKGRldmljZSA9PSBzaS1cdTAwM2ViZGV2LVx1MDAzZWJkX2Rldikge1xuJiM0MztcdFx0XHRpZiAoZmlyc3Rfc2Uoc2kpLVx1MDAzZXN0YXJ0X2Jsb2NrID09IG9mZnNldClcbiYjNDM7XHRcdFx0XHRyZXR1cm4gc2ktXHUwMDNldHlwZTtcbiBcdFx0fVxuIFx0fVxuJiM0MztcbiBcdHJldHVybiAtRU5PREVWO1xuIH1cbiBcbkBAIC0yMjQ3LDIxICYjNDM7MjQ3OCwxOCBAQCBzdGF0aWMgaW50IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4gICovXG4gaW50IHBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4ge1xuLVx0aW50IHR5cGU7XG4mIzQzO1x0aW50IHJldDtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVxuLVx0dHlwZSA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpO1xuLVx0aWYgKHR5cGUgXHUwMDNjIDApIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0cmV0dXJuIHR5cGU7XG4tXHR9XG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRyZXQgPSBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldmljZSwgb2Zmc2V0KTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4gXG4tXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuJiM0MztcdHNpID0gc3dhcF90eXBlX3RvX2luZm8ocmV0KTtcbiBcdGlmIChXQVJOX09OX09OQ0UoIXNpKSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRyZXR1cm4gLUVOT0RFVjtcbiYjNDM7XHRcdHJldCA9IC1FTk9ERVY7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMjI3MCwxNCAmIzQzOzI0OTgsMTUgQEAgaW50IHBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4gXHQgKiB0aGUgc2FtZSBzZXNzaW9uLlxuIFx0ICovXG4gXHRpZiAoV0FSTl9PTl9PTkNFKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfSElCRVJOQVRJT04pKSB7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdHJldHVybiAtRUJVU1k7XG4mIzQzO1x0XHRyZXQgPSAtRUJVU1k7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9ISUJFUk5BVElPTjtcbiBcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRyZXR1cm4gdHlwZTtcbiYjNDM7b3V0OlxuJiM0MztcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdHJldHVybiByZXQ7XG4gfVxuIFxuIC8qKlxuQEAgLTIyOTQsMTQgJiM0MzsyNTIzLDExIEBAIHZvaWQgdW5waW5faGliZXJuYXRpb25fc3dhcF90eXBlKGludCB0eXBlKVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuLVx0aWYgKCFzaSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRyZXR1cm47XG4tXHR9XG4tXHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfSElCRVJOQVRJT047XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdGlmIChzaSlcbiYjNDM7XHRcdHNpLVx1MDAzZWZsYWdzIFx1MDAyNj0gflNXUF9ISUJFUk5BVElPTjtcbiYjNDM7XHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gXG4gLyoqXG5AQCAtMjMyNiwyOSAmIzQzOzI1NTIsMjYgQEAgaW50IGZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuIHtcbiBcdGludCB0eXBlO1xuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0dHlwZSA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFxuIFx0cmV0dXJuIHR5cGU7XG4gfVxuIFxuIGludCBmaW5kX2ZpcnN0X3N3YXAoZGV2X3QgKmRldmljZSlcbiB7XG4tXHRpbnQgdHlwZTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlJiM0MzsmIzQzOykge1xuLVx0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzID0gc3dhcF9pbmZvW3R5cGVdO1xuJiM0MztcdGludCByZXQgPSAtRU5PREVWO1xuJiM0MztcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcbi1cdFx0aWYgKCEoc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfV1JJVEVPSykpXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdCpkZXZpY2UgPSBzaXMtXHUwMDNlYmRldi1cdTAwM2ViZF9kZXY7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdHJldHVybiB0eXBlO1xuJiM0MztcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRmb3JfZWFjaF9hdmFpbF9zd2FwKHNpKSB7XG4mIzQzO1x0XHQqZGV2aWNlID0gc2ktXHUwMDNlYmRldi1cdTAwM2ViZF9kZXY7XG4mIzQzO1x0XHRyZXQgPSBzaS1cdTAwM2V0eXBlO1xuJiM0MztcdFx0YnJlYWs7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiAvKlxuQEAgLTIzNzYsNyAmIzQzOzI1OTksNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXG4ge1xuIFx0dW5zaWduZWQgaW50IG4gPSAwO1xuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0aWYgKCh1bnNpZ25lZCBpbnQpdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XG4gXHRcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07XG4gXG5AQCAtMjM4OCw3ICYjNDM7MjYxMSw3IEBAIHVuc2lnbmVkIGludCBjb3VudF9zd2FwX3BhZ2VzKGludCB0eXBlLCBpbnQgZnJlZSlcbiBcdFx0fVxuIFx0XHRzcGluX3VubG9jayhcdTAwMjZzaXMtXHUwMDNlbG9jayk7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV91cF9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRyZXR1cm4gbjtcbiB9XG4gI2VuZGlmIC8qIENPTkZJR19ISUJFUk5BVElPTiAqL1xuQEAgLTI3MDAsMTAgJiM0MzsyOTIzLDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9uZXh0X3RvX3VudXNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdHVuc2lnbmVkIGxvbmcgc3dwX3RiO1xuIFxuIFx0Lypcbi1cdCAqIE5vIG5lZWQgZm9yIHN3YXBfbG9jayBoZXJlOiB3ZSYjMzk7cmUganVzdCBsb29raW5nXG4mIzQzO1x0ICogTm8gbmVlZCBmb3Igc3dhcG9uX3J3c2VtIGhlcmU6IHdlJiMzOTtyZSBqdXN0IGxvb2tpbmdcbiBcdCAqIGZvciB3aGV0aGVyIGFuIGVudHJ5IGlzIGluIHVzZSwgbm90IG1vZGlmeWluZyBpdDsgZmFsc2VcbiBcdCAqIGhpdHMgYXJlIG9rYXksIGFuZCBzeXNfc3dhcG9mZigpIGhhcyBhbHJlYWR5IHByZXZlbnRlZCBuZXdcbi1cdCAqIGFsbG9jYXRpb25zIGZyb20gdGhpcyBhcmVhICh3aGlsZSBob2xkaW5nIHN3YXBfbG9jaykuXG4mIzQzO1x0ICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcG9uX3J3c2VtKS5cbiBcdCAqL1xuIFx0Zm9yIChpID0gcHJldiAmIzQzOyAxOyBpIFx1MDAzYyBzaS1cdTAwM2VtYXg7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdHN3cF90YiA9IHN3YXBfdGFibGVfZ2V0KF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgaSksXG5AQCAtMjgxNiw3ICYjNDM7MzAzOSw3IEBAIHN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKVxuIHN1Y2Nlc3M6XG4gXHQvKlxuIFx0ICogTWFrZSBzdXJlIHRoYXQgZnVydGhlciBjbGVhbnVwcyBhZnRlciB0cnlfdG9fdW51c2UoKSByZXR1cm5zIGhhcHBlblxuLVx0ICogYWZ0ZXIgc3dhcF9yYW5nZV9mcmVlKCkgcmVkdWNlcyBzaS1cdTAwM2VpbnVzZV9wYWdlcyB0byAwLlxuJiM0MztcdCAqIGFmdGVyIHN3YXBfZGV2aWNlX2ludXNlX3N1YigpIHJlZHVjZXMgc2ktXHUwMDNlaW51c2VfcGFnZXMgdG8gMC5cbiBcdCAqL1xuIFx0c21wX21iKCk7XG4gXHRyZXR1cm4gMDtcbkBAIC0yODI0LDE4ICYjNDM7MzA0NywyMCBAQCBzdGF0aWMgaW50IHRyeV90b191bnVzZSh1bnNpZ25lZCBpbnQgdHlwZSlcbiBcbiAvKlxuICAqIEFmdGVyIGEgc3VjY2Vzc2Z1bCB0cnlfdG9fdW51c2UsIGlmIG5vIHN3YXAgaXMgbm93IGluIHVzZSwgd2Uga25vd1xuLSAqIHdlIGNhbiBlbXB0eSB0aGUgbW1saXN0LiAgc3dhcF9sb2NrIG11c3QgYmUgaGVsZCBvbiBlbnRyeSBhbmQgZXhpdC5cbi0gKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBfbG9jaywgYW5kIGFuIG1tIG11c3QgYmVcbiYjNDM7ICogd2UgY2FuIGVtcHR5IHRoZSBtbWxpc3QuIHN3YXBvbl9yd3NlbSBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuXG4mIzQzOyAqIE5vdGUgdGhhdCBtbWxpc3RfbG9jayBuZXN0cyBpbnNpZGUgc3dhcG9uX3J3c2VtLCBhbmQgYW4gbW0gbXVzdCBiZVxuICAqIGFkZGVkIHRvIHRoZSBtbWxpc3QganVzdCBhZnRlciBwYWdlX2R1cGxpY2F0ZSAtIGJlZm9yZSB3b3VsZCBiZSByYWN5LlxuICAqL1xuIHN0YXRpYyB2b2lkIGRyYWluX21tbGlzdCh2b2lkKVxuIHtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbmV4dDtcbi1cdHVuc2lnbmVkIGludCB0eXBlO1xuIFxuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlJiM0MzsmIzQzOylcbi1cdFx0aWYgKHN3YXBfdXNhZ2VfaW5fcGFnZXMoc3dhcF9pbmZvW3R5cGVdKSlcbiYjNDM7XHRmb3JfZWFjaF9zd2FwKHNpKSB7XG4mIzQzO1x0XHRpZiAoc3dhcF91c2FnZV9pbl9wYWdlcyhzaSkpXG4gXHRcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRzcGluX2xvY2soXHUwMDI2bW1saXN0X2xvY2spO1xuIFx0bGlzdF9mb3JfZWFjaF9zYWZlKHAsIG5leHQsIFx1MDAyNmluaXRfbW0ubW1saXN0KVxuIFx0XHRsaXN0X2RlbF9pbml0KHApO1xuQEAgLTI5NjgsNTggJiM0MzszMTkzLDY1IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG4gXHRyZXR1cm4gZ2VuZXJpY19zd2FwZmlsZV9hY3RpdmF0ZShzaXMsIHN3YXBfZmlsZSwgc3Bhbik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9lbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbi17XG4tXHRhdG9taWNfbG9uZ19hZGQoc2ktXHUwMDNlcGFnZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuLVx0dG90YWxfc3dhcF9wYWdlcyAmIzQzOz0gc2ktXHUwMDNlcGFnZXM7XG4tXG4tXHRhc3NlcnRfc3Bpbl9sb2NrZWQoXHUwMDI2c3dhcF9sb2NrKTtcbi1cbi1cdHBsaXN0X2FkZChcdTAwMjZzaS1cdTAwM2VsaXN0LCBcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkKTtcbi1cbi1cdC8qIEFkZCBiYWNrIHRvIGF2YWlsYWJsZSBsaXN0ICovXG4tXHRhZGRfdG9fYXZhaWxfbGlzdChzaSwgdHJ1ZSk7XG4tfVxuLVxuIC8qXG4tICogQ2FsbGVkIGFmdGVyIHRoZSBzd2FwIGRldmljZSBpcyByZWFkeSwgcmVzdXJyZWN0IGl0cyBwZXJjcHUgcmVmLCBpdCYjMzk7cyBub3dcbi0gKiBzYWZlIHRvIHJlZmVyZW5jZSBpdC4gQWRkIGl0IHRvIHRoZSBsaXN0IHRvIGV4cG9zZSBpdCB0byB0aGUgYWxsb2NhdG9yLlxuJiM0MzsgKiBDYWxsZWQgYWZ0ZXIgdGhlIHN3YXAgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIHVzZWQuIE1hcmtpbmcgaXQgd3JpdGFibGUgYW5kXG4mIzQzOyAqIGV4cG9zaW5nIGl0IHRvIHRoZSBhbGxvY2F0b3IuIFJlc3VycmVjdCBpdHMgcGVyY3B1IHJlZiBpZiBpdCB3YXMgZGVhZCBiZWZvcmUuXG4gICovXG4tc3RhdGljIHZvaWQgZW5hYmxlX3N3YXBfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2VuYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4ge1xuLVx0cGVyY3B1X3JlZl9yZXN1cnJlY3QoXHUwMDI2c2ktXHUwMDNldXNlcnMpO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRzcGluX2xvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4tXHRfZW5hYmxlX3N3YXBfaW5mbyhzaSk7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tfVxuJiM0MztcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9XUklURU9LO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcdGF0b21pY19sb25nX2FkZChzaS1cdTAwM2VwYWdlcywgXHUwMDI2bnJfc3dhcF9wYWdlcyk7XG4mIzQzO1x0dG90YWxfc3dhcF9wYWdlcyAmIzQzOz0gc2ktXHUwMDNlcGFnZXM7XG4mIzQzO1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXG4tc3RhdGljIHZvaWQgcmVpbnNlcnRfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbi17XG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdHNwaW5fbG9jayhcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbi1cdF9lbmFibGVfc3dhcF9pbmZvKHNpKTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRhZGRfdG9fYXZhaWxfbGlzdChzaSk7XG4gfVxuIFxuLS8qXG4tICogQ2FsbGVkIGFmdGVyIGNsZWFyaW5nIFNXUF9XUklURU9LLCBlbnN1cmVzIGNsdXN0ZXJfYWxsb2NfcmFuZ2Vcbi0gKiBzZWUgdGhlIHVwZGF0ZWQgZmxhZ3MsIHNvIHRoZXJlIHdpbGwgYmUgbm8gbW9yZSBhbGxvY2F0aW9ucy5cbi0gKi9cbi1zdGF0aWMgdm9pZCB3YWl0X2Zvcl9hbGxvY2F0aW9uKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7c3RhdGljIGludCBzd2FwX2RldmljZV9kaXNhYmxlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiB7XG4gXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcbiBcdHVuc2lnbmVkIGxvbmcgZW5kID0gQUxJR04oc2ktXHUwMDNlbWF4LCBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4gXG4tXHRCVUdfT04oc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIFNXUF9XUklURU9LIGlzIG5vdCBzZXQ6IGFub3RoZXIgcHJvY2VzcyBhbHJlYWR5IGRpc2FibGluZyBpdC5cbiYjNDM7XHQgKiBJZiBTV1BfSElCRVJOQVRJT04gaXMgc2V0OiB0aGUgZGV2aWNlIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spIHx8XG4mIzQzO1x0ICAgIHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfSElCRVJOQVRJT04pIHtcbiYjNDM7XHRcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChzZWN1cml0eV92bV9lbm91Z2hfbWVtb3J5X21tKGN1cnJlbnQtXHUwMDNlbW0sIHNpLVx1MDAzZXBhZ2VzKSkge1xuJiM0MztcdFx0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHR9XG4mIzQzO1x0dm1fdW5hY2N0X21lbW9yeShzaS1cdTAwM2VwYWdlcyk7XG4mIzQzO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiYjNDM7XHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfV1JJVEVPSztcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiYjNDM7XHR0b3RhbF9zd2FwX3BhZ2VzIC09IHNpLVx1MDAzZXBhZ2VzO1xuJiM0MztcdGF0b21pY19sb25nX3N1YihzaS1cdTAwM2VwYWdlcywgXHUwMDI2bnJfc3dhcF9wYWdlcyk7XG4mIzQzO1x0ZGVsX2Zyb21fYXZhaWxfbGlzdChzaSwgdHJ1ZSk7XG4mIzQzO1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTd2FwIGFsbG9jYXRvciBkb2VzbiYjMzk7dCB0b3VjaCBzaSBsb2NrLCBzbyBsb29waW5nIHRocm91Z2ggYWxsXG4mIzQzO1x0ICogY2kgbG9ja3MgZW5zdXJlcyBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzIHNlZXMgdGhlXG4mIzQzO1x0ICogdXBkYXRlZCBmbGFncywgYW5kIG5vIG1vcmUgYWxsb2NhdGlvbnMgd2lsbCBvY2N1ci5cbiYjNDM7XHQgKi9cbiBcdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IFx1MDAzYyBlbmQ7IG9mZnNldCAmIzQzOz0gU1dBUEZJTEVfQ0xVU1RFUikge1xuIFx0XHRjaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpO1xuIFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbiBcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXG5AQCAtMzA0MywyOCAmIzQzOzMyNzUsNiBAQCBzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLFxuIFx0a3ZmcmVlKGNsdXN0ZXJfaW5mbyk7XG4gfVxuIFxuLS8qXG4tICogQ2FsbGVkIGFmdGVyIHN3YXAgZGV2aWNlJiMzOTtzIHJlZmVyZW5jZSBjb3VudCBpcyBkZWFkLCBzb1xuLSAqIG5laXRoZXIgc2NhbiBub3IgYWxsb2NhdGlvbiB3aWxsIHVzZSBpdC5cbi0gKi9cbi1zdGF0aWMgdm9pZCBmbHVzaF9wZXJjcHVfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbi17XG4tXHRpbnQgY3B1LCBpO1xuLVx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKipwY3Bfc2k7XG4tXG4tXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4tXHRcdHBjcF9zaSA9IHBlcl9jcHVfcHRyKHBlcmNwdV9zd2FwX2NsdXN0ZXIuc2ksIGNwdSk7XG4tXHRcdC8qXG4tXHRcdCAqIEludmFsaWRhdGUgdGhlIHBlcmNwdSBzd2FwIGNsdXN0ZXIgY2FjaGUsIHNpLVx1MDAzZXVzZXJzXG4tXHRcdCAqIGlzIGRlYWQsIHNvIG5vIG5ldyB1c2VyIHdpbGwgcG9pbnQgdG8gaXQsIGp1c3QgZmx1c2hcbi1cdFx0ICogYW55IGV4aXN0aW5nIHVzZXIuXG4tXHRcdCAqL1xuLVx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBTV0FQX05SX09SREVSUzsgaSYjNDM7JiM0MzspXG4tXHRcdFx0Y21weGNoZyhcdTAwMjZwY3Bfc2lbaV0sIHNpLCBOVUxMKTtcbi1cdH1cbi19XG4tXG4tXG4gU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwID0gTlVMTDtcbkBAIC0zMDg2LDQ0ICYjNDM7MzI5NiwyMiBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXHRcdHJldHVybiBQVFJfRVJSKHZpY3RpbSk7XG4gXG4gXHRtYXBwaW5nID0gdmljdGltLVx1MDAzZWZfbWFwcGluZztcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0cGxpc3RfZm9yX2VhY2hfZW50cnkocCwgXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCwgbGlzdCkge1xuLVx0XHRpZiAocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spIHtcbi1cdFx0XHRpZiAocC1cdTAwM2Vzd2FwX2ZpbGUtXHUwMDNlZl9tYXBwaW5nID09IG1hcHBpbmcpIHtcbi1cdFx0XHRcdGZvdW5kID0gMTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbiYjNDM7XHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChwKSB7XG4mIzQzO1x0XHRpZiAocC1cdTAwM2Vzd2FwX2ZpbGUtXHUwMDNlZl9tYXBwaW5nID09IG1hcHBpbmcpIHtcbiYjNDM7XHRcdFx0Zm91bmQgPSAxO1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0fVxuIFx0fVxuLVx0aWYgKCFmb3VuZCkge1xuLVx0XHRlcnIgPSAtRUlOVkFMO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuLVx0fVxuLVxuLVx0LyogUmVmdXNlIHN3YXBvZmYgd2hpbGUgdGhlIGRldmljZSBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uICovXG4tXHRpZiAocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX0hJQkVSTkFUSU9OKSB7XG4tXHRcdGVyciA9IC1FQlVTWTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0Z290byBvdXRfZHB1dDtcbi1cdH1cbiYjNDM7XHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdGZpbHBfY2xvc2UodmljdGltLCBOVUxMKTtcbiBcbi1cdGlmICghc2VjdXJpdHlfdm1fZW5vdWdoX21lbW9yeV9tbShjdXJyZW50LVx1MDAzZW1tLCBwLVx1MDAzZXBhZ2VzKSlcbi1cdFx0dm1fdW5hY2N0X21lbW9yeShwLVx1MDAzZXBhZ2VzKTtcbi1cdGVsc2Uge1xuLVx0XHRlcnIgPSAtRU5PTUVNO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuLVx0fVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnAtXHUwMDNlbG9jayk7XG4tXHRkZWxfZnJvbV9hdmFpbF9saXN0KHAsIHRydWUpO1xuLVx0cGxpc3RfZGVsKFx1MDAyNnAtXHUwMDNlbGlzdCwgXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCk7XG4tXHRhdG9taWNfbG9uZ19zdWIocC1cdTAwM2VwYWdlcywgXHUwMDI2bnJfc3dhcF9wYWdlcyk7XG4tXHR0b3RhbF9zd2FwX3BhZ2VzIC09IHAtXHUwMDNlcGFnZXM7XG4tXHRzcGluX3VubG9jayhcdTAwMjZwLVx1MDAzZWxvY2spO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRpZiAoIWZvdW5kKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHR3YWl0X2Zvcl9hbGxvY2F0aW9uKHApO1xuJiM0MztcdGVyciA9IHN3YXBfZGV2aWNlX2Rpc2FibGUocCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4gXG4gXHRzZXRfY3VycmVudF9vb21fb3JpZ2luKCk7XG4gXHRlcnIgPSB0cnlfdG9fdW51c2UocC1cdTAwM2V0eXBlKTtcbkBAIC0zMTMxLDEwICYjNDM7MzMxOSwxMyBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXG4gXHRpZiAoZXJyKSB7XG4gXHRcdC8qIHJlLWluc2VydCBzd2FwIHNwYWNlIGJhY2sgaW50byBzd2FwX2xpc3QgKi9cbi1cdFx0cmVpbnNlcnRfc3dhcF9pbmZvKHApO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuJiM0MztcdFx0c3dhcF9kZXZpY2VfZW5hYmxlKHApO1xuJiM0MztcdFx0cmV0dXJuIGVycjtcbiBcdH1cbiBcbiYjNDM7XHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdHN3YXBfcXVldWVfZGVsKHApO1xuJiM0MztcbiBcdC8qXG4gXHQgKiBXYWl0IGZvciBzd2FwIG9wZXJhdGlvbnMgcHJvdGVjdGVkIGJ5IGdldC9wdXRfc3dhcF9kZXZpY2UoKVxuIFx0ICogdG8gY29tcGxldGUuICBCZWNhdXNlIG9mIHN5bmNocm9uaXplX3JjdSgpIGhlcmUsIGFsbCBzd2FwXG5AQCAtMzE0OSwxNSAmIzQzOzMzNDAsMTIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFxuIFx0Zmx1c2hfd29yayhcdTAwMjZwLVx1MDAzZWRpc2NhcmRfd29yayk7XG4gXHRmbHVzaF93b3JrKFx1MDAyNnAtXHUwMDNlcmVjbGFpbV93b3JrKTtcbi1cdGZsdXNoX3BlcmNwdV9zd2FwX2NsdXN0ZXIocCk7XG4gXG4gXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhwLCBwLVx1MDAzZXN3YXBfZmlsZSk7XG4gXG4gXHRpZiAoIShwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4gXHRcdGF0b21pY19kZWMoXHUwMDI2bnJfcm90YXRlX3N3YXApO1xuIFxuLVx0bXV0ZXhfbG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4gXHRzcGluX2xvY2soXHUwMDI2cC1cdTAwM2Vsb2NrKTtcbiBcdGRyYWluX21tbGlzdCgpO1xuIFxuQEAgLTMxNjgsMTAgJiM0MzszMzU2LDExIEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcbiBcdHAtXHUwMDNlbWF4ID0gMDtcbiBcdHAtXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbiBcdHNwaW5fdW5sb2NrKFx1MDAyNnAtXHUwMDNlbG9jayk7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0YXJjaF9zd2FwX2ludmFsaWRhdGVfYXJlYShwLVx1MDAzZXR5cGUpO1xuIFx0enN3YXBfc3dhcG9mZihwLVx1MDAzZXR5cGUpO1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4mIzQzO1x0ZnJlZV9wZXJjcHUocC1cdTAwM2VwZXJjcHVfY2x1c3Rlcik7XG4mIzQzO1x0cC1cdTAwM2VwZXJjcHVfY2x1c3RlciA9IE5VTEw7XG4gXHRrZnJlZShwLVx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcbiBcdHAtXHUwMDNlZ2xvYmFsX2NsdXN0ZXIgPSBOVUxMO1xuIFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhjbHVzdGVyX2luZm8sIG1heHBhZ2VzKTtcbkBAIC0zMTg3LDE4ICYjNDM7MzM3NiwxOSBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzbyB0aGF0IHN3YXBvblxuIFx0ICogY2FuIHJldXNlIHRoaXMgc3dhcF9pbmZvIGluIGFsbG9jX3N3YXBfaW5mbygpIHNhZmVseS4gIEl0IGlzIG9rIHRvXG4gXHQgKiBub3QgaG9sZCBwLVx1MDAzZWxvY2sgYWZ0ZXIgd2UgY2xlYXJlZCBpdHMgU1dQX1dSSVRFT0suXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBUaGUgd3JpdGUgbG9jayBlbnN1cmVzIHRoZSBmbGFnIGNsZWFyIGlzIHZpc2libGUgdG8gbG9ja2xlc3NcbiYjNDM7XHQgKiByZWFkZXJzIG9mIHN3YXBfdHlwZV90b19pbmZvKCkgYmVmb3JlIGFsbG9jX3N3YXBfaW5mbygpIHJldXNlc1xuJiM0MztcdCAqIHRoaXMgc2xvdC5cbiBcdCAqL1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdHAtXHUwMDNlZmxhZ3MgPSAwO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcbi1cdGVyciA9IDA7XG4gXHRhdG9taWNfaW5jKFx1MDAyNnByb2NfcG9sbF9ldmVudCk7XG4gXHR3YWtlX3VwX2ludGVycnVwdGlibGUoXHUwMDI2cHJvY19wb2xsX3dhaXQpO1xuIFxuLW91dF9kcHV0OlxuLVx0ZmlscF9jbG9zZSh2aWN0aW0sIE5VTEwpO1xuLVx0cmV0dXJuIGVycjtcbiYjNDM7XHRyZXR1cm4gMDtcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19QUk9DX0ZTXG5AQCAtMzIxNiwyMCAmIzQzOzM0MDYsMTggQEAgc3RhdGljIF9fcG9sbF90IHN3YXBzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpXG4gXHRyZXR1cm4gRVBPTExJTiB8IEVQT0xMUkROT1JNO1xuIH1cbiBcbi0vKiBpdGVyYXRvciAqL1xuIHN0YXRpYyB2b2lkICpzd2FwX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgbG9mZl90ICpwb3MpXG4ge1xuIFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuLVx0aW50IHR5cGU7XG4gXHRsb2ZmX3QgbCA9ICpwb3M7XG4gXG4tXHRtdXRleF9sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFxuIFx0aWYgKCFsKVxuIFx0XHRyZXR1cm4gU0VRX1NUQVJUX1RPS0VOO1xuIFxuLVx0Zm9yICh0eXBlID0gMDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlJiM0MzsmIzQzOykge1xuLVx0XHRpZiAoIShzaS1cdTAwM2Vzd2FwX2ZpbGUpKVxuJiM0MztcdGZvcl9lYWNoX3N3YXAoc2kpIHtcbiYjNDM7XHRcdGlmICghc2ktXHUwMDNlc3dhcF9maWxlKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRpZiAoIS0tbClcbiBcdFx0XHRyZXR1cm4gc2k7XG5AQCAtMzI1MCw3ICYjNDM7MzQzOCw3IEBAIHN0YXRpYyB2b2lkICpzd2FwX25leHQoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcylcbiBcbiBcdCYjNDM7JiM0MzsoKnBvcyk7XG4gXHRmb3IgKDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlJiM0MzsmIzQzOykge1xuLVx0XHRpZiAoIShzaS1cdTAwM2Vzd2FwX2ZpbGUpKVxuJiM0MztcdFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9VU0VEKSB8fCAhKHNpLVx1MDAzZXN3YXBfZmlsZSkpXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdHJldHVybiBzaTtcbiBcdH1cbkBAIC0zMjYwLDcgJiM0MzszNDQ4LDcgQEAgc3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuIFxuIHN0YXRpYyB2b2lkIHN3YXBfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXG4ge1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4mIzQzO1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gXG4gc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuQEAgLTMzNTMsMTMgJiM0MzszNTQxLDEzIEBAIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqYWxsb2Nfc3dhcF9pbmZvKHZvaWQpXG4gXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuIFx0fVxuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdGZvciAodHlwZSA9IDA7IHR5cGUgXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHtcbiBcdFx0aWYgKCEoc3dhcF9pbmZvW3R5cGVdLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfVVNFRCkpXG4gXHRcdFx0YnJlYWs7XG4gXHR9XG4gXHRpZiAodHlwZSBcdTAwM2U9IE1BWF9TV0FQRklMRVMpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0XHRwZXJjcHVfcmVmX2V4aXQoXHUwMDI2cC1cdTAwM2V1c2Vycyk7XG4gXHRcdGt2ZnJlZShwKTtcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVQRVJNKTtcbkBAIC0zMzgxLDEwICYjNDM7MzU2OSw4IEBAIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqYWxsb2Nfc3dhcF9pbmZvKHZvaWQpXG4gXHRcdCAqL1xuIFx0fVxuIFx0cC1cdTAwM2Vzd2FwX2V4dGVudF9yb290ID0gUkJfUk9PVDtcbi1cdHBsaXN0X25vZGVfaW5pdChcdTAwMjZwLVx1MDAzZWxpc3QsIDApO1xuLVx0cGxpc3Rfbm9kZV9pbml0KFx1MDAyNnAtXHUwMDNlYXZhaWxfbGlzdCwgMCk7XG4gXHRwLVx1MDAzZWZsYWdzID0gU1dQX1VTRUQ7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0aWYgKGRlZmVyKSB7XG4gXHRcdHBlcmNwdV9yZWZfZXhpdChcdTAwMjZkZWZlci1cdTAwM2V1c2Vycyk7XG4gXHRcdGt2ZnJlZShkZWZlcik7XG5AQCAtMzQ1Myw5ICYjNDM7MzYzOSw4IEBAIF9fd2VhayB1bnNpZ25lZCBsb25nIGFyY2hfbWF4X3N3YXBmaWxlX3NpemUodm9pZClcbiBcdHJldHVybiBnZW5lcmljX21heF9zd2FwZmlsZV9zaXplKCk7XG4gfVxuIFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuLVx0XHRcdFx0XHR1bmlvbiBzd2FwX2hlYWRlciAqc3dhcF9oZWFkZXIsXG4tXHRcdFx0XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIodW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4ge1xuIFx0aW50IGk7XG4gXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzO1xuQEAgLTM1MjIsNyAmIzQzOzM3MDcsNyBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7XG4gXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbztcbi1cdGludCBlcnIgPSAtRU5PTUVNO1xuJiM0MztcdGludCBjcHUsIGVyciA9IC1FTk9NRU07XG4gXHR1bnNpZ25lZCBsb25nIGk7XG4gXG4gXHRjbHVzdGVyX2luZm8gPSBrdnphbGxvY19vYmpzKCpjbHVzdGVyX2luZm8sIG5yX2NsdXN0ZXJzKTtcbkBAIC0zNTMyLDEzICYjNDM7MzcxNywyNiBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jbHVzdGVyczsgaSYjNDM7JiM0MzspXG4gXHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNmNsdXN0ZXJfaW5mb1tpXS5sb2NrKTtcbiBcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpIHtcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSB7XG4mIzQzO1x0XHRzaS1cdTAwM2VwZXJjcHVfY2x1c3RlciA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIpO1xuJiM0MztcdFx0aWYgKCFzaS1cdTAwM2VwZXJjcHVfY2x1c3RlcilcbiYjNDM7XHRcdFx0Z290byBlcnI7XG4mIzQzO1xuJiM0MztcdFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuJiM0MztcdFx0XHRzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIgKmNsdXN0ZXI7XG4mIzQzO1xuJiM0MztcdFx0XHRjbHVzdGVyID0gcGVyX2NwdV9wdHIoc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXIsIGNwdSk7XG4mIzQzO1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFNXQVBfTlJfT1JERVJTOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0XHRjbHVzdGVyLVx1MDAzZW5leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XG4mIzQzO1x0XHRcdGxvY2FsX2xvY2tfaW5pdChcdTAwMjZjbHVzdGVyLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4gXHRcdHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyID0ga21hbGxvY19vYmooKnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcbiBcdFx0aWYgKCFzaS1cdTAwM2VnbG9iYWxfY2x1c3RlcilcbiBcdFx0XHRnb3RvIGVycjtcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU1dBUF9OUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuIFx0XHRcdHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZW5leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XG4tXHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuJiM0MztcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbG9jayk7XG4gXHR9XG4gXG4gXHQvKlxuQEAgLTM2MjEsNyAmIzQzOzM4MTksNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFx0LypcbiBcdCAqIEFsbG9jYXRlIG9yIHJldXNlIGV4aXN0aW5nICFTV1BfVVNFRCBzd2FwX2luZm8uIFRoZSByZXR1cm5lZFxuIFx0ICogc2kgd2lsbCBzdGF5IGluIGEgZHlpbmcgc3RhdHVzLCBzbyBub3RoaW5nIHdpbGwgYWNjZXNzIGl0cyBjb250ZW50XG4tXHQgKiB1bnRpbCBlbmFibGVfc3dhcF9pbmZvIHJlc3VycmVjdHMgaXRzIHBlcmNwdSByZWYgYW5kIGV4cG9zZSBpdC5cbiYjNDM7XHQgKiB1bnRpbCBzd2FwX2RldmljZV9lbmFibGUgcmVzdXJyZWN0cyBpdHMgcGVyY3B1IHJlZiBhbmQgZXhwb3NlIGl0LlxuIFx0ICovXG4gXHRzaSA9IGFsbG9jX3N3YXBfaW5mbygpO1xuIFx0aWYgKElTX0VSUihzaSkpXG5AQCAtMzY3OSw3ICYjNDM7Mzg3Nyw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHR9XG4gXHRzd2FwX2hlYWRlciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIDApO1xuIFxuLVx0bWF4cGFnZXMgPSByZWFkX3N3YXBfaGVhZGVyKHNpLCBzd2FwX2hlYWRlciwgaW5vZGUpO1xuJiM0MztcdG1heHBhZ2VzID0gcmVhZF9zd2FwX2hlYWRlcihzd2FwX2hlYWRlciwgaW5vZGUpO1xuIFx0aWYgKHVubGlrZWx5KCFtYXhwYWdlcykpIHtcbiBcdFx0ZXJyb3IgPSAtRUlOVkFMO1xuIFx0XHRnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTtcbkBAIC0zNzAwLDExICYjNDM7Mzg5OCw2IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXG4gXHRtYXhwYWdlcyA9IHNpLVx1MDAzZW1heDtcbiBcbi1cdC8qIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8gKi9cbi1cdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xuLVx0aWYgKGVycm9yKVxuLVx0XHRnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTtcbi1cbiBcdGlmIChzaS1cdTAwM2ViZGV2IFx1MDAyNlx1MDAyNiBiZGV2X3N0YWJsZV93cml0ZXMoc2ktXHUwMDNlYmRldikpXG4gXHRcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9TVEFCTEVfV1JJVEVTO1xuIFxuQEAgLTM3MTgsNiAmIzQzOzM5MTEsMTUgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0aW5jZWRfbnJfcm90YXRlX3N3YXAgPSB0cnVlO1xuIFx0fVxuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogU2V0IHVwIHRoZSBzd2FwIGNsdXN0ZXIgaW5mby4gVGhpcyBtdXN0IHJ1biBhZnRlciBTV1BfU09MSURTVEFURVxuJiM0MztcdCAqIGlzIGRldGVybWluZWQgYWJvdmUsIGFzIGl0IGRlY2lkZXMgd2hldGhlciB0byBhbGxvY2F0ZSB0aGUgcGVyLUNQVVxuJiM0MztcdCAqIGNsdXN0ZXIgKHNvbGlkIHN0YXRlKSBvciB0aGUgZ2xvYmFsIGNsdXN0ZXIgKHJvdGF0aW9uYWwpLlxuJiM0MztcdCAqL1xuJiM0MztcdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGdvdG8gYmFkX3N3YXBfdW5sb2NrX2lub2RlO1xuJiM0MztcbiBcdGlmICgoc3dhcF9mbGFncyBcdTAwMjYgU1dBUF9GTEFHX0RJU0NBUkQpIFx1MDAyNlx1MDAyNlxuIFx0ICAgIHNpLVx1MDAzZWJkZXYgXHUwMDI2XHUwMDI2IGJkZXZfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzaS1cdTAwM2ViZGV2KSkge1xuIFx0XHQvKlxuQEAgLTM3NjQsMjIgJiM0MzszOTY2LDIyIEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHRcdGdvdG8gZnJlZV9zd2FwX3pzd2FwO1xuIFx0fVxuIFxuLVx0bXV0ZXhfbG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuIFx0cHJpbyA9IERFRl9TV0FQX1BSSU87XG4gXHRpZiAoc3dhcF9mbGFncyBcdTAwMjYgU1dBUF9GTEFHX1BSRUZFUilcbiBcdFx0cHJpbyA9IHN3YXBfZmxhZ3MgXHUwMDI2IFNXQVBfRkxBR19QUklPX01BU0s7XG4gXG4tXHQvKlxuLVx0ICogVGhlIHBsaXN0IHByaW8gaXMgbmVnYXRlZCBiZWNhdXNlIHBsaXN0IG9yZGVyaW5nIGlzXG4tXHQgKiBsb3ctdG8taGlnaCwgd2hpbGUgc3dhcCBvcmRlcmluZyBpcyBoaWdoLXRvLWxvd1xuLVx0ICovXG4gXHRzaS1cdTAwM2VwcmlvID0gcHJpbztcbi1cdHNpLVx1MDAzZWxpc3QucHJpbyA9IC1zaS1cdTAwM2VwcmlvO1xuLVx0c2ktXHUwMDNlYXZhaWxfbGlzdC5wcmlvID0gLXNpLVx1MDAzZXByaW87XG4gXHRzaS1cdTAwM2Vzd2FwX2ZpbGUgPSBzd2FwX2ZpbGU7XG4gXG4gXHQvKiBTZXRzIFNXUF9XUklURU9LLCByZXN1cnJlY3QgdGhlIHBlcmNwdSByZWYsIGV4cG9zZSB0aGUgc3dhcCBkZXZpY2UgKi9cbi1cdGVuYWJsZV9zd2FwX2luZm8oc2kpO1xuJiM0MztcdHBlcmNwdV9yZWZfcmVzdXJyZWN0KFx1MDAyNnNpLVx1MDAzZXVzZXJzKTtcbiYjNDM7XHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdGVycm9yID0gc3dhcF9xdWV1ZV9hZGQoc2kpO1xuJiM0MztcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGdvdG8gZnJlZV9zd2FwX3pzd2FwO1xuJiM0MztcbiYjNDM7XHRzd2FwX2RldmljZV9lbmFibGUoc2kpO1xuIFxuIFx0cHJfaW5mbyhcJiMzNDtBZGRpbmcgJXVrIHN3YXAgb24gJXMuICBQcmlvcml0eTolZCBleHRlbnRzOiVkIGFjcm9zczolbGx1ayAlcyVzJXMlc1xcblwmIzM0OyxcbiBcdFx0SyhzaS1cdTAwM2VwYWdlcyksIG5hbWUtXHUwMDNlbmFtZSwgc2ktXHUwMDNlcHJpbywgbnJfZXh0ZW50cyxcbkBAIC0zNzg5LDcgJiM0MzszOTkxLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0KHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfQVJFQV9ESVNDQVJEKSA/IFwmIzM0O3NcJiMzNDsgOiBcJiMzNDtcJiMzNDssXG4gXHRcdChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1BBR0VfRElTQ0FSRCkgPyBcJiMzNDtjXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7KTtcbiBcbi1cdG11dGV4X3VubG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuIFx0YXRvbWljX2luYyhcdTAwMjZwcm9jX3BvbGxfZXZlbnQpO1xuIFx0d2FrZV91cF9pbnRlcnJ1cHRpYmxlKFx1MDAyNnByb2NfcG9sbF93YWl0KTtcbiBcbkBAIC0zODAwLDYgJiM0Mzs0MDAxLDggQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBiYWRfc3dhcF91bmxvY2tfaW5vZGU6XG4gXHRpbm9kZV91bmxvY2soaW5vZGUpO1xuIGJhZF9zd2FwOlxuJiM0MztcdGZyZWVfcGVyY3B1KHNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyKTtcbiYjNDM7XHRzaS1cdTAwM2VwZXJjcHVfY2x1c3RlciA9IE5VTEw7XG4gXHRrZnJlZShzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcik7XG4gXHRzaS1cdTAwM2VnbG9iYWxfY2x1c3RlciA9IE5VTEw7XG4gXHRpbm9kZSA9IE5VTEw7XG5AQCAtMzgxMCw5ICYjNDM7NDAxMyw5IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xuIFx0ICogYWxsb2Nfc3dhcF9pbmZvIGNhbiByZXVzZSB0aGlzIHNpIHNhZmVseS5cbiBcdCAqL1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdHNpLVx1MDAzZWZsYWdzID0gMDtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRpZiAoaW5jZWRfbnJfcm90YXRlX3N3YXApXG4gXHRcdGF0b21pY19kZWMoXHUwMDI2bnJfcm90YXRlX3N3YXApO1xuIFx0aWYgKHN3YXBfZmlsZSlcbkBAIC0zODI3LDE5ICYjNDM7NDAzMCwxNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFxuIHZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbClcbiB7XG4tXHR1bnNpZ25lZCBpbnQgdHlwZTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4gXHR1bnNpZ25lZCBsb25nIG5yX3RvX2JlX3VudXNlZCA9IDA7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdGZvciAodHlwZSA9IDA7IHR5cGUgXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHtcbi1cdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF9pbmZvW3R5cGVdO1xuLVxuLVx0XHRpZiAoKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfVVNFRCkgXHUwMDI2XHUwMDI2ICEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbiYjNDM7XHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0Zm9yX2VhY2hfc3dhcChzaSkge1xuJiM0MztcdFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbiBcdFx0XHRucl90b19iZV91bnVzZWQgJiM0Mzs9IHN3YXBfdXNhZ2VfaW5fcGFnZXMoc2kpO1xuIFx0fVxuIFx0dmFsLVx1MDAzZWZyZWVzd2FwID0gYXRvbWljX2xvbmdfcmVhZChcdTAwMjZucl9zd2FwX3BhZ2VzKSAmIzQzOyBucl90b19iZV91bnVzZWQ7XG4gXHR2YWwtXHUwMDNldG90YWxzd2FwID0gdG90YWxfc3dhcF9wYWdlcyAmIzQzOyBucl90b19iZV91bnVzZWQ7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV91cF9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gfVxuIFxuIC8qXG5AQCAtMzg3OSw3ICYjNDM7NDA4MCw3IEBAIGludCBzd2FwX2R1cF9lbnRyeV9kaXJlY3Qoc3dwX2VudHJ5X3QgZW50cnkpXG4gI2lmIGRlZmluZWQoQ09ORklHX01FTUNHKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfQkxLX0NHUk9VUClcbiBzdGF0aWMgYm9vbCBfX2hhc191c2FibGVfc3dhcCh2b2lkKVxuIHtcbi1cdHJldHVybiAhcGxpc3RfaGVhZF9lbXB0eShcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkKTtcbiYjNDM7XHRyZXR1cm4gUkVBRF9PTkNFKHRvdGFsX3N3YXBfcGFnZXMpIFx1MDAzZSAwO1xuIH1cbiBcbiB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKVxuQEAgLTM5MDIsMTQgJiM0Mzs0MTAzLDE0IEBAIHZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXG4gXHRpZiAoY3VycmVudC1cdTAwM2V0aHJvdHRsZV9kaXNrKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbi1cdHBsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpLCBcdTAwMjZzd2FwX2F2YWlsX2hlYWQsIGF2YWlsX2xpc3QpIHtcbiYjNDM7XHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xuIFx0XHRpZiAoc2ktXHUwMDNlYmRldikge1xuIFx0XHRcdGJsa2NnX3NjaGVkdWxlX3Rocm90dGxlKHNpLVx1MDAzZWJkZXYtXHUwMDNlYmRfZGlzaywgdHJ1ZSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbiBcdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4mIzQzO1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gI2VuZGlmXG4gXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMDA6NDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3N3YXBfYWxsb2NfZW50cnkmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9hZGQmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9kZWwmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9nZXRfZGV2aWNlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2VuYWJsZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9kaXNhYmxlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2ludXNlX2FkZCYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9pbnVzZV9zdWImIzM0OywKICAgICYjMzQ7YWRkX3RvX2F2YWlsX2xpc3QmIzM0OywKICAgICYjMzQ7ZGVsX2Zyb21fYXZhaWxfbGlzdCYjMzQ7LAogICAgJiMzNDtzd2FwX3F1ZXVlX21hc2smIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV91bm1hc2smIzM0OywKICAgICYjMzQ7Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWYzNDkzNjVlMGViMWZlMjEyOGE4NDg0YmI0Y2E2NTFmMWRiZDJhMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgSnVsIDE0IDAwOjQzOjQ0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGlzdC5oIGIvaW5jbHVkZS9saW51eC9wbGlzdC5oCmluZGV4IDE2Y2Y0MzU1YjVjMTMxLi43M2QzNTljMWEwNTM2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGlzdC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvcGxpc3QuaApAQCAtMTMyLDggJiM0MzsxMzIsNiBAQCBzdGF0aWMgaW5saW5lIHZvaWQgcGxpc3Rfbm9kZV9pbml0KHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBpbnQgcHJpbykKIGV4dGVybiB2b2lkIHBsaXN0X2FkZChzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpOwogZXh0ZXJuIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7CiAKLWV4dGVybiB2b2lkIHBsaXN0X3JlcXVldWUoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKTsKLQogLyoqCiAgKiBwbGlzdF9mb3JfZWFjaCAtIGl0ZXJhdGUgb3ZlciB0aGUgcGxpc3QKICAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDY5NmVkMDE3MDljMmJhLi4wNDc2NzU0MDk3MmI4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTE5NCw2ICYjNDM7MTk0LDIyIEBAIHN0cnVjdCBzd2FwX2V4dGVudCB7CiAJKChvZmZzZXRvZih1bmlvbiBzd2FwX2hlYWRlciwgbWFnaWMubWFnaWMpIC0gXAogCSAgb2Zmc2V0b2YodW5pb24gc3dhcF9oZWFkZXIsIGluZm8uYmFkcGFnZXMpKSAvIHNpemVvZihpbnQpKQogCiYjNDM7LyoKJiM0MzsgKiBTd2FwIGRldmljZSBmbGFncywgZXhjZXB0IHRoZSBvbmVzIGRvY3VtZW50ZWQgYmVsb3csIGFsbCBhcmUgaW1tdXRhYmxlCiYjNDM7ICogYWZ0ZXIgZXhwb3NlZCBieSBzd2FwX2RldmljZV9lbmFibGUsIGFuZCB1bnRpbCB0aGUgZGV2aWNlIGlzIGZyZWVkIGFnYWluCiYjNDM7ICogKFNXUF9VU0VEIHVuc2V0KS4gVGhlIGV4Y2VwdGlvbnMgYXJlIGFsbCBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtOgomIzQzOyAqIC0gU1dQX1VTRUQ6IFByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0uIEluZGljYXRlcyB0aGUgZGV2aWNlIGlzIGludXNlLiBPbmNlCiYjNDM7ICogICBzZXQsIHdvbiYjMzk7dCBiZSBjbGVhcmVkIHVubGVzcyBhbGwgcmVmZXJlbmNlIHRvIHRoaXMgZGV2aWNlIGlzIGZyZWVkIGFuZAomIzQzOyAqICAgc3dhcG9mZiBmaW5pc2hlZC4KJiM0MzsgKiAtIFNXUF9XUklURU9LOiBQcm90ZWN0ZWQgYnkgYm90aCBzd2Fwb25fcndzZW0gYW5kIHN3YXBfYXZhaWxfbG9jaywgY2xlYXJpbmcKJiM0MzsgKiAgIHRoaXMgZmxhZyBhbHNvIHdhaXRzIGZvciBhbGwgY3VycmVudCBjbHVzdGVyIGxvY2sgdXNlcnMgdG8gZXhpdCBzbwomIzQzOyAqICAgY2hlY2tpbmcgdGhpcyBmbGFnIHdoaWxlIGhvbGRpbmcgYW55IG9mIHRoZXNlIGxvY2tzIGVuc3VyZXMgdGhlIGRldmljZQomIzQzOyAqICAgaXMgc2FmZSB0byB1c2UgYXQgdGhlIG1vbWVudC4gTm90ZTogY2xlYXJpbmcgdGhpcyBmbGFnIGRvZXNuJiMzOTt0IGFmZmVjdAomIzQzOyAqICAgcGVuZGluZyBJTyBvciBhc3luYyByZXF1ZXN0cywgaXQgb25seSBwcmV2ZW50cyBmdXJ0aGVyIGVudHJ5IGFsbG9jYXRpb24KJiM0MzsgKiAgIG9yIG5ldyBhc3luYyByZXF1ZXN0IChlLmcuIGRpc2NhcmQpIGZyb20gaW5pdGlhdGluZy4KJiM0MzsgKiAtIFNXUF9ISUJFUk5BVElPTjogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIGlmIHRoZSBkZXZpY2UKJiM0MzsgKiAgIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uCiYjNDM7ICovCiBlbnVtIHsKIAlTV1BfVVNFRAk9ICgxICZsdDsmbHQ7IDApLAkvKiBpcyBzbG90IGluIHN3YXBfaW5mb1tdIHVzZWQ/ICovCiAJU1dQX1dSSVRFT0sJPSAoMSAmbHQ7Jmx0OyAxKSwJLyogb2sgdG8gd3JpdGUgdG8gdGhpcyBzd2FwPwkqLwpAQCAtMjMwLDEwICYjNDM7MjQ2LDE3IEBAIGVudW0gewogI2VuZGlmCiAKIC8qCi0gKiBXZSBrZWVwIHVzaW5nIHNhbWUgY2x1c3RlciBmb3Igcm90YXRpb25hbCBkZXZpY2Ugc28gSU8gd2lsbCBiZSBzZXF1ZW50aWFsLgotICogVGhlIHB1cnBvc2UgaXMgdG8gb3B0aW1pemUgU1dBUCB0aHJvdWdocHV0IG9uIHRoZXNlIGRldmljZS4KJiM0MzsgKiBXZSBhc3NpZ24gYSBjbHVzdGVyIHRvIGVhY2ggQ1BVLCBzbyBlYWNoIENQVSBjYW4gYWxsb2NhdGUgc3dhcCBlbnRyeSBmcm9tCiYjNDM7ICogaXRzIG93biBjbHVzdGVyIGFuZCBzd2Fwb3V0IHNlcXVlbnRpYWxseS4gVGhlIHB1cnBvc2UgaXMgdG8gb3B0aW1pemUgc3dhcG91dAomIzQzOyAqIHRocm91Z2hwdXQuCiAgKi8KJiM0MztzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIgewomIzQzOwlsb2NhbF9sb2NrX3QgbG9jazsgLyogUHJvdGVjdCB0aGUgcGVyY3B1X2NsdXN0ZXIgYWJvdmUgKi8KJiM0MzsJdW5zaWduZWQgaW50IG5leHRbU1dBUF9OUl9PUkRFUlNdOyAvKiBMaWtlbHkgbmV4dCBhbGxvY2F0aW9uIG9mZnNldCAqLwomIzQzO307CiYjNDM7CiBzdHJ1Y3Qgc3dhcF9zZXF1ZW50aWFsX2NsdXN0ZXIgewomIzQzOwlzcGlubG9ja190IGxvY2s7IC8qIFNlcmlhbGl6ZSB1c2FnZSBvZiBnbG9iYWwgY2x1c3RlciAqLwogCXVuc2lnbmVkIGludCBuZXh0W1NXQVBfTlJfT1JERVJTXTsgLyogTGlrZWx5IG5leHQgYWxsb2NhdGlvbiBvZmZzZXQgKi8KIH07CiAKQEAgLTI0NCw3ICYjNDM7MjY3LDYgQEAgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgewogCXN0cnVjdCBwZXJjcHVfcmVmIHVzZXJzOwkvKiBpbmRpY2F0ZSBhbmQga2VlcCBzd2FwIGRldmljZSB2YWxpZC4gKi8KIAl1bnNpZ25lZCBsb25nCWZsYWdzOwkJLyogU1dQX1VTRUQgZXRjOiBzZWUgYWJvdmUgKi8KIAlzaWduZWQgc2hvcnQJcHJpbzsJCS8qIHN3YXAgcHJpb3JpdHkgb2YgdGhpcyB0eXBlICovCi0Jc3RydWN0IHBsaXN0X25vZGUgbGlzdDsJCS8qIGVudHJ5IGluIHN3YXBfYWN0aXZlX2hlYWQgKi8KIAlzaWduZWQgY2hhcgl0eXBlOwkJLyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqLwogCXVuc2lnbmVkIGludAltYXg7CQkvKiBzaXplIG9mIHRoaXMgc3dhcCBkZXZpY2UgKi8KIAlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbzsgLyogY2x1c3RlciBpbmZvLiBPbmx5IGZvciBTU0QgKi8KQEAgLTI1NiwyNiAmIzQzOzI3OCwyMCBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7CiAJCQkJCS8qIGxpc3Qgb2YgY2x1c3RlciB0aGF0IGFyZSBmcmFnbWVudGVkIG9yIGNvbnRlbnRlZCAqLwogCXVuc2lnbmVkIGludCBwYWdlczsJCS8qIHRvdGFsIG9mIHVzYWJsZSBwYWdlcyBvZiBzd2FwICovCiAJYXRvbWljX2xvbmdfdCBpbnVzZV9wYWdlczsJLyogbnVtYmVyIG9mIHRob3NlIGN1cnJlbnRseSBpbiB1c2UgKi8KJiM0MzsJc3RydWN0IHBlcmNwdV9jbHVzdGVyCV9fcGVyY3B1ICpwZXJjcHVfY2x1c3RlcjsgLyogcGVyIGNwdSYjMzk7cyBzd2FwIGxvY2F0aW9uICovCiAJc3RydWN0IHN3YXBfc2VxdWVudGlhbF9jbHVzdGVyICpnbG9iYWxfY2x1c3RlcjsgLyogVXNlIG9uZSBnbG9iYWwgY2x1c3RlciBmb3Igcm90YXRpbmcgZGV2aWNlICovCi0Jc3BpbmxvY2tfdCBnbG9iYWxfY2x1c3Rlcl9sb2NrOwkvKiBTZXJpYWxpemUgdXNhZ2Ugb2YgZ2xvYmFsIGNsdXN0ZXIgKi8KIAlzdHJ1Y3QgcmJfcm9vdCBzd2FwX2V4dGVudF9yb290Oy8qIHJvb3Qgb2YgdGhlIHN3YXAgZXh0ZW50IHJidHJlZSAqLwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CS8qIHN3YXAgZGV2aWNlIG9yIGJkZXYgb2Ygc3dhcCBmaWxlICovCiAJc3RydWN0IGZpbGUgKnN3YXBfZmlsZTsJCS8qIHNlbGRvbSByZWZlcmVuY2VkICovCiAJc3RydWN0IGNvbXBsZXRpb24gY29tcDsJCS8qIHNlbGRvbSByZWZlcmVuY2VkICovCiAJc3BpbmxvY2tfdCBsb2NrOwkJLyoKLQkJCQkJICogcHJvdGVjdCBtYXAgc2NhbiByZWxhdGVkIGZpZWxkcyBsaWtlCi0JCQkJCSAqIGludXNlX3BhZ2VzIGFuZCBhbGwgY2x1c3RlciBsaXN0cy4KLQkJCQkJICogT3RoZXIgZmllbGRzIGFyZSBvbmx5IGNoYW5nZWQKLQkJCQkJICogYXQgc3dhcG9uL3N3YXBvZmYsIHNvIGFyZSBwcm90ZWN0ZWQKLQkJCQkJICogYnkgc3dhcF9sb2NrLiBjaGFuZ2luZyBmbGFncyBuZWVkCi0JCQkJCSAqIGhvbGQgdGhpcyBsb2NrIGFuZCBzd2FwX2xvY2suIElmCi0JCQkJCSAqIGJvdGggbG9ja3MgbmVlZCBob2xkLCBob2xkIHN3YXBfbG9jawotCQkJCQkgKiBmaXJzdC4KJiM0MzsJCQkJCSAqIFByb3RlY3QgY2x1c3RlciBsaXN0cy4gT3RoZXIgZmllbGRzCiYjNDM7CQkJCQkgKiBhcmUgb25seSBjaGFuZ2VkIGF0IHN3YXBvbi9zd2Fwb2ZmLAomIzQzOwkJCQkJICogc28gYXJlIHByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0uCiAJCQkJCSAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCBkaXNjYXJkX3dvcms7IC8qIGRpc2NhcmQgd29ya2VyICovCiAJc3RydWN0IHdvcmtfc3RydWN0IHJlY2xhaW1fd29yazsgLyogcmVjbGFpbSB3b3JrZXIgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGRpc2NhcmRfY2x1c3RlcnM7IC8qIGRpc2NhcmQgY2x1c3RlcnMgbGlzdCAqLwotCXN0cnVjdCBwbGlzdF9ub2RlIGF2YWlsX2xpc3Q7ICAgLyogZW50cnkgaW4gc3dhcF9hdmFpbF9oZWFkICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IHBhZ2Vfc3dhcF9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSkKZGlmZiAtLWdpdCBhL2xpYi9wbGlzdC5jIGIvbGliL3BsaXN0LmMKaW5kZXggYTViZWYzOGFkZDQzMWQuLmIwNWFlN2ZmZWE4N2U4IDEwMDY0NAotLS0gYS9saWIvcGxpc3QuYwomIzQzOyYjNDM7JiM0MzsgYi9saWIvcGxpc3QuYwpAQCAtMTQyLDU4ICYjNDM7MTQyLDYgQEAgdm9pZCBwbGlzdF9kZWwoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKQogCXBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7CiB9CiAKLS8qKgotICogcGxpc3RfcmVxdWV1ZSAtIFJlcXVldWUgQG5vZGUgYXQgZW5kIG9mIHNhbWUtcHJpbyBlbnRyaWVzLgotICoKLSAqIFRoaXMgaXMgZXNzZW50aWFsbHkgYW4gb3B0aW1pemVkIHBsaXN0X2RlbCgpIGZvbGxvd2VkIGJ5Ci0gKiBwbGlzdF9hZGQoKS4gIEl0IG1vdmVzIGFuIGVudHJ5IGFscmVhZHkgaW4gdGhlIHBsaXN0IHRvCi0gKiBhZnRlciBhbnkgb3RoZXIgc2FtZS1wcmlvcml0eSBlbnRyaWVzLgotICoKLSAqIEBub2RlOgkmYW1wO3N0cnVjdCBwbGlzdF9ub2RlIHBvaW50ZXIgLSBlbnRyeSB0byBiZSBtb3ZlZAotICogQGhlYWQ6CSZhbXA7c3RydWN0IHBsaXN0X2hlYWQgcG9pbnRlciAtIGxpc3QgaGVhZAotICovCi12b2lkIHBsaXN0X3JlcXVldWUoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKQotewotCXN0cnVjdCBwbGlzdF9ub2RlICppdGVyOwotCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGVfbmV4dCA9ICZhbXA7aGVhZC0mZ3Q7bm9kZV9saXN0OwotCi0JcGxpc3RfY2hlY2tfaGVhZChoZWFkKTsKLQlCVUdfT04ocGxpc3RfaGVhZF9lbXB0eShoZWFkKSk7Ci0JQlVHX09OKHBsaXN0X25vZGVfZW1wdHkobm9kZSkpOwotCi0JaWYgKG5vZGUgPT0gcGxpc3RfbGFzdChoZWFkKSkKLQkJcmV0dXJuOwotCi0JaXRlciA9IHBsaXN0X25leHQobm9kZSk7Ci0KLQlpZiAobm9kZS0mZ3Q7cHJpbyAhPSBpdGVyLSZndDtwcmlvKQotCQlyZXR1cm47Ci0KLQlwbGlzdF9kZWwobm9kZSwgaGVhZCk7Ci0KLQkvKgotCSAqIEFmdGVyIHBsaXN0X2RlbCgpLCBpdGVyIGlzIHRoZSByZXBsYWNlbWVudCBvZiB0aGUgbm9kZS4gIElmIHRoZSBub2RlCi0JICogd2FzIG9uIHByaW9fbGlzdCwgdGFrZSBzaG9ydGN1dCB0byBmaW5kIG5vZGVfbmV4dCBpbnN0ZWFkIG9mIGxvb3BpbmcuCi0JICovCi0JaWYgKCFsaXN0X2VtcHR5KCZhbXA7aXRlci0mZ3Q7cHJpb19saXN0KSkgewotCQlpdGVyID0gbGlzdF9lbnRyeShpdGVyLSZndDtwcmlvX2xpc3QubmV4dCwgc3RydWN0IHBsaXN0X25vZGUsCi0JCQkJICBwcmlvX2xpc3QpOwotCQlub2RlX25leHQgPSAmYW1wO2l0ZXItJmd0O25vZGVfbGlzdDsKLQkJZ290byBxdWV1ZTsKLQl9Ci0KLQlwbGlzdF9mb3JfZWFjaF9jb250aW51ZShpdGVyLCBoZWFkKSB7Ci0JCWlmIChub2RlLSZndDtwcmlvICE9IGl0ZXItJmd0O3ByaW8pIHsKLQkJCW5vZGVfbmV4dCA9ICZhbXA7aXRlci0mZ3Q7bm9kZV9saXN0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci1xdWV1ZToKLQlsaXN0X2FkZF90YWlsKCZhbXA7bm9kZS0mZ3Q7bm9kZV9saXN0LCBub2RlX25leHQpOwotCi0JcGxpc3RfY2hlY2tfaGVhZChoZWFkKTsKLX0KLQogI2lmZGVmIENPTkZJR19ERUJVR19QTElTVAogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc2NoZWQvY2xvY2suaCZndDsKQEAgLTIzMSwxNCAmIzQzOzE3OSw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBwbGlzdF90ZXN0X2NoZWNrKGludCBucl9leHBlY3QpCiAJQlVHX09OKHByaW9fcG9zLSZndDtwcmlvX2xpc3QubmV4dCAhPSAmYW1wO2ZpcnN0LSZndDtwcmlvX2xpc3QpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGxpc3RfdGVzdF9yZXF1ZXVlKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlKQotewotCXBsaXN0X3JlcXVldWUobm9kZSwgJmFtcDt0ZXN0X2hlYWQpOwotCi0JaWYgKG5vZGUgIT0gcGxpc3RfbGFzdCgmYW1wO3Rlc3RfaGVhZCkpCi0JCUJVR19PTihub2RlLSZndDtwcmlvID09IHBsaXN0X25leHQobm9kZSktJmd0O3ByaW8pOwotfQotCiBzdGF0aWMgaW50ICBfX2luaXQgcGxpc3RfdGVzdCh2b2lkKQogewogCWludCBucl9leHBlY3QgPSAwLCBpLCBsb29wOwpAQCAtMjYyLDEwICYjNDM7MjAyLDYgQEAgc3RhdGljIGludCAgX19pbml0IHBsaXN0X3Rlc3Qodm9pZCkKIAkJCW5yX2V4cGVjdC0tOwogCQl9CiAJCXBsaXN0X3Rlc3RfY2hlY2sobnJfZXhwZWN0KTsKLQkJaWYgKCFwbGlzdF9ub2RlX2VtcHR5KHRlc3Rfbm9kZSAmIzQzOyBpKSkgewotCQkJcGxpc3RfdGVzdF9yZXF1ZXVlKHRlc3Rfbm9kZSAmIzQzOyBpKTsKLQkJCXBsaXN0X3Rlc3RfY2hlY2sobnJfZXhwZWN0KTsKLQkJfQogCX0KIAogCWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKHRlc3Rfbm9kZSk7IGkmIzQzOyYjNDM7KSB7CmRpZmYgLS1naXQgYS9tbS9zd2FwLmggYi9tbS9zd2FwLmgKaW5kZXggYjUxYWQzMDcxYTczMDguLjA4YTc4MmYzZDVhY2QyIDEwMDY0NAotLS0gYS9tbS9zd2FwLmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcC5oCkBAIC05MSwxNiAmIzQzOzkxLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHN3cF9jbHVzdGVyX29mZnNldChzd3BfZW50cnlfdCBlbnRyeSkKICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqX19zd2FwX3R5cGVfdG9faW5mbyhpbnQgdHlwZSkKIHsKLQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7Ci0KLQlzaSA9IFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqLwotCVZNX1dBUk5fT05fT05DRShwZXJjcHVfcmVmX2lzX3plcm8oJmFtcDtzaS0mZ3Q7dXNlcnMpKTsgLyogcmFjZSB3aXRoIHN3YXBvZmYgKi8KLQlyZXR1cm4gc2k7CiYjNDM7CXJldHVybiBSRUFEX09OQ0Uoc3dhcF9pbmZvW3R5cGVdKTsgLyogcmN1X2RlcmVmZXJlbmNlKCkgKi8KIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqX19zd2FwX2VudHJ5X3RvX2luZm8oc3dwX2VudHJ5X3QgZW50cnkpCiB7Ci0JcmV0dXJuIF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwomIzQzOwomIzQzOwlzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTsgLyogcmN1X2RlcmVmZXJlbmNlKCkgKi8KJiM0MzsJVk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybygmYW1wO3NpLSZndDt1c2VycykpOyAvKiByYWNlIHdpdGggc3dhcG9mZiAqLwomIzQzOwlyZXR1cm4gc2k7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoCmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCA3NzVjMzg1NDkwYTVmYS4uZjkzODYzMzA5YTVhNTAgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuYwpAQCAtNDEsNyAmIzQzOzQxLDYgQEAKICNpbmNsdWRlICZsdDtsaW51eC9jb21wbGV0aW9uLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc3VzcGVuZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3pzd2FwLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGxpc3QuaCZndDsKIAogI2luY2x1ZGUgJmx0O2FzbS90bGJmbHVzaC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2xlYWZvcHMuaCZndDsKQEAgLTQ5LDMxICYjNDM7NDgsMzggQEAKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3N3YXAuaCYjMzQ7CiAKLXN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAotCQkJICAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7CiYjNDM7c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkJICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7CiBzdGF0aWMgYm9vbCBmb2xpb19zd2FwY2FjaGVfZnJlZWFibGUoc3RydWN0IGZvbGlvICpmb2xpbyk7CiBzdGF0aWMgdm9pZCBtb3ZlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQkJIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiAJCQkgZW51bSBzd2FwX2NsdXN0ZXJfZmxhZ3MgbmV3X2ZsYWdzKTsKJiM0MztzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpOwogCiAvKgotICogUHJvdGVjdHMgdGhlIHN3YXBfaW5mbyBhcnJheSwgYW5kIHRoZSBTV1BfVVNFRCBmbGFnLiBzd2FwX2luZm8gY29udGFpbnMKLSAqIGxhemlseSBhbGxvY2F0ZWQgJmFtcDsgZnJlZWQgc3dhcCBkZXZpY2UgaW5mbyBzdHJ1dHMsIGFuZCBTV1BfVVNFRCBpbmRpY2F0ZXMKLSAqIHdoaWNoIGRldmljZSBpcyB1c2VkLCB+U1dQX1VTRUQgZGV2aWNlcyBhbmQgY2FuIGJlIHJldXNlZC4KLSAqCi0gKiBBbHNvIHByb3RlY3RzIHN3YXBfYWN0aXZlX2hlYWQgdG90YWxfc3dhcF9wYWdlcywgYW5kIHRoZSBTV1BfV1JJVEVPSyBmbGFnLgomIzQzOyAqIFNlcmlhbGl6ZXMgc3dhcG9uL3N3YXBvZmYgKHdyaXRlcnMpIGFuZCBwcm90ZWN0cyB0aGUgc3dhcF9pbmZvCiYjNDM7ICogYXJyYXksIG5yX3N3YXBmaWxlcywgdG90YWxfc3dhcF9wYWdlcywgYW5kIHBhcnQgb2Ygc3dhcCBkZXZpY2UKJiM0MzsgKiBpbmZvIGNvbnRlbnQgKHNlZSBjb21tZW50IG9mIHN3YXBfaW5mb19zdHJ1Y3QpLiAgUmVhZGVycwomIzQzOyAqIChhbGxvY2F0aW9uLCAvcHJvYy9zd2FwcywgZXRjLikgdGFrZSBwZXJjcHVfZG93bl9yZWFkKCkgd2hpY2gKJiM0MzsgKiBpcyBjaGVhcCBhcyB0aGUgaG90IHBhdGguCiYjNDM7ICovCiYjNDM7REVGSU5FX1NUQVRJQ19QRVJDUFVfUldTRU0oc3dhcG9uX3J3c2VtKTsKJiM0MzsvKgomIzQzOyAqIHN3YXBfaW5mbyBjb250YWlucyBsYXppbHkgYWxsb2NhdGVkIHN3YXAgZGV2aWNlIGluZm8gc3RydWN0cywgYW5kCiYjNDM7ICogU1dQX1VTRUQgaW5kaWNhdGVzIHdoaWNoIGRldmljZSBpcyB1c2VkLCB+U1dQX1VTRUQgZGV2aWNlcyBjYW4gYmUKJiM0MzsgKiByZXVzZWQuIFByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0sIGJ1dCByZWFkaW5nIGNvdWxkIGJlIGxvY2tsZXNzLgogICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7CiYjNDM7c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfaW5mb1tNQVhfU1dBUEZJTEVTXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfc3dhcGZpbGVzOwotYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzOwomIzQzO2xvbmcgdG90YWxfc3dhcF9wYWdlczsKJiM0MzsKIC8qCiAgKiBTb21lIG1vZHVsZXMgdXNlIHN3YXBwYWJsZSBvYmplY3RzIGFuZCBtYXkgdHJ5IHRvIHN3YXAgdGhlbSBvdXQgdW5kZXIKICAqIG1lbW9yeSBwcmVzc3VyZSAodmlhIHRoZSBzaHJpbmtlcikuIEJlZm9yZSBkb2luZyBzbywgdGhleSBtYXkgd2lzaCB0bwogICogY2hlY2sgdG8gc2VlIGlmIGFueSBzd2FwIHNwYWNlIGlzIGF2YWlsYWJsZS4KICAqLwomIzQzO2F0b21pY19sb25nX3QgbnJfc3dhcF9wYWdlczsKIEVYUE9SVF9TWU1CT0xfR1BMKG5yX3N3YXBfcGFnZXMpOwotLyogcHJvdGVjdGVkIHdpdGggc3dhcF9sb2NrLiByZWFkaW5nIGluIHZtX3N3YXBfZnVsbCgpIGRvZXNuJiMzOTt0IG5lZWQgbG9jayAqLwotbG9uZyB0b3RhbF9zd2FwX3BhZ2VzOwogI2RlZmluZSBERUZfU1dBUF9QUklPICAtMQogdW5zaWduZWQgbG9uZyBzd2FwZmlsZV9tYXhpbXVtX3NpemU7CiAjaWZkZWYgQ09ORklHX01JR1JBVElPTgpAQCAtODMsNTIgJiM0Mzs4OSw0MiBAQCBib29sIHN3YXBfbWlncmF0aW9uX2FkX3N1cHBvcnRlZDsKIHN0YXRpYyBjb25zdCBjaGFyIEJhZF9maWxlW10gPSAmIzM0O0JhZCBzd2FwIGZpbGUgZW50cnkgJiMzNDs7CiBzdGF0aWMgY29uc3QgY2hhciBCYWRfb2Zmc2V0W10gPSAmIzM0O0JhZCBzd2FwIG9mZnNldCBlbnRyeSAmIzM0OzsKIAotLyoKLSAqIGFsbCBhY3RpdmUgc3dhcF9pbmZvX3N0cnVjdHMKLSAqIHByb3RlY3RlZCB3aXRoIHN3YXBfbG9jaywgYW5kIG9yZGVyZWQgYnkgcHJpb3JpdHkuCi0gKi8KLXN0YXRpYyBQTElTVF9IRUFEKHN3YXBfYWN0aXZlX2hlYWQpOwomIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKl9fc3dhcF9pdGVyKGludCAqaSwgdW5zaWduZWQgbG9uZyBmbGFnKQomIzQzO3sKJiM0MzsJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CXdoaWxlICgqaSAmbHQ7IG5yX3N3YXBmaWxlcykgewomIzQzOwkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gX19zd2FwX3R5cGVfdG9faW5mbygqaSk7CiYjNDM7CiYjNDM7CQlWTV9XQVJOX09OKCFzaSk7CiYjNDM7CQkoKmkpJiM0MzsmIzQzOzsKJiM0MzsJCWlmIChmbGFnICZhbXA7JmFtcDsgISgoc2ktJmd0O2ZsYWdzICZhbXA7IGZsYWcpID09IGZsYWcpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJcmV0dXJuIHNpOwomIzQzOwl9CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIF9fZm9yX2VhY2hfc3dhcChzaSwgZmxhZykJCQlcCiYjNDM7CWZvciAoaW50IF9faSA9IDA7ICgoc2kpID0gX19zd2FwX2l0ZXIoJmFtcDtfX2ksIGZsYWcpKTspCiAKIC8qCi0gKiBhbGwgYXZhaWxhYmxlIChhY3RpdmUsIG5vdCBmdWxsKSBzd2FwX2luZm9fc3RydWN0cwotICogcHJvdGVjdGVkIHdpdGggc3dhcF9hdmFpbF9sb2NrLCBvcmRlcmVkIGJ5IHByaW9yaXR5LgotICogVGhpcyBpcyB1c2VkIGJ5IGZvbGlvX2FsbG9jX3N3YXAoKSBpbnN0ZWFkIG9mIHN3YXBfYWN0aXZlX2hlYWQKLSAqIGJlY2F1c2Ugc3dhcF9hY3RpdmVfaGVhZCBpbmNsdWRlcyBhbGwgc3dhcF9pbmZvX3N0cnVjdHMsCi0gKiBidXQgZm9saW9fYWxsb2Nfc3dhcCgpIGRvZXNuJiMzOTt0IG5lZWQgdG8gbG9vayBhdCBmdWxsIG9uZXMuCi0gKiBUaGlzIHVzZXMgaXRzIG93biBsb2NrIGluc3RlYWQgb2Ygc3dhcF9sb2NrIGJlY2F1c2Ugd2hlbiBhCi0gKiBzd2FwX2luZm9fc3RydWN0IGNoYW5nZXMgYmV0d2VlbiBub3QtZnVsbC9mdWxsLCBpdCBuZWVkcyB0bwotICogYWRkL3JlbW92ZSBpdHNlbGYgdG8vZnJvbSB0aGlzIGxpc3QsIGJ1dCB0aGUgc3dhcF9pbmZvX3N0cnVjdC0mZ3Q7bG9jawotICogaXMgaGVsZCBhbmQgdGhlIGxvY2tpbmcgb3JkZXIgcmVxdWlyZXMgc3dhcF9sb2NrIHRvIGJlIHRha2VuCi0gKiBiZWZvcmUgYW55IHN3YXBfaW5mb19zdHJ1Y3QtJmd0O2xvY2suCiYjNDM7ICogZm9yX2VhY2hfc3dhcCAtIGl0ZXJhdGUgdGhyb3VnaCBhbGwgYWxsb2NhdGVkIGFuZCBpbnVzZSBzd2FwIGRldmljZXMKJiM0MzsgKiBAc2k6IHRoZSBpdGVyYXRvcgomIzQzOyAqCiYjNDM7ICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGhvbGQgc3dhcG9uX3J3c2VtLiBUaGUgbG9jayBtYXkgYmUgZHJvcHBlZCBkdXJpbmcKJiM0MzsgKiB0aGUgbG9vcCBib2R5IGJ1dCBtdXN0IGJlIHJlLWFjcXVpcmVkIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24uCiAgKi8KLXN0YXRpYyBQTElTVF9IRUFEKHN3YXBfYXZhaWxfaGVhZCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfYXZhaWxfbG9jayk7Ci0KLXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2luZm9bTUFYX1NXQVBGSUxFU107CiYjNDM7I2RlZmluZSBmb3JfZWFjaF9zd2FwKHNpKSBfX2Zvcl9lYWNoX3N3YXAoc2ksIFNXUF9VU0VEKQomIzQzOyNkZWZpbmUgZm9yX2VhY2hfYXZhaWxfc3dhcChzaSkgX19mb3JfZWFjaF9zd2FwKHNpLCBTV1BfVVNFRCB8IFNXUF9XUklURU9LKQogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnN3YXBfdGFibGVfY2FjaGVwOwogCi0vKiBQcm90ZWN0cyBzaS0mZ3Q7c3dhcF9maWxlIGZvciAvcHJvYy9zd2FwcyB1c2FnZSAqLwotc3RhdGljIERFRklORV9NVVRFWChzd2Fwb25fbXV0ZXgpOwotCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocHJvY19wb2xsX3dhaXQpOwogLyogQWN0aXZpdHkgY291bnRlciB0byBpbmRpY2F0ZSB0aGF0IGEgc3dhcG9uIG9yIHN3YXBvZmYgaGFzIG9jY3VycmVkICovCiBzdGF0aWMgYXRvbWljX3QgcHJvY19wb2xsX2V2ZW50ID0gQVRPTUlDX0lOSVQoMCk7CiAKIGF0b21pY190IG5yX3JvdGF0ZV9zd2FwID0gQVRPTUlDX0lOSVQoMCk7CiAKLXN0cnVjdCBwZXJjcHVfc3dhcF9jbHVzdGVyIHsKLQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lbU1dBUF9OUl9PUkRFUlNdOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0W1NXQVBfTlJfT1JERVJTXTsKLQlsb2NhbF9sb2NrX3QgbG9jazsKLX07Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyY3B1X3N3YXBfY2x1c3RlciwgcGVyY3B1X3N3YXBfY2x1c3RlcikgPSB7Ci0JLnNpID0geyBOVUxMIH0sCi0JLm9mZnNldCA9IHsgU1dBUF9FTlRSWV9JTlZBTElEIH0sCi0JLmxvY2sgPSBJTklUX0xPQ0FMX0xPQ0soKSwKLX07Ci0KIC8qIE1heSByZXR1cm4gTlVMTCBvbiBpbnZhbGlkIHR5cGUsIGNhbGxlciBtdXN0IGNoZWNrIGZvciBOVUxMIHJldHVybiAqLwogc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX3R5cGVfdG9faW5mbyhpbnQgdHlwZSkKIHsKQEAgLTE0MywxOCAmIzQzOzEzOSwzNTAgQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2VudHJ5X3RvX2luZm8oc3dwX2VudHJ5X3QgZW50cnkpCiAJcmV0dXJuIHN3YXBfdHlwZV90b19pbmZvKHN3cF90eXBlKGVudHJ5KSk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIEFsbCBhdmFpbGFibGUgc3dhcF9pbmZvX3N0cnVjdHMgYXJlIGdyb3VwZWQgYnkgcHJpb3JpdHkgcmluZ3MsIHRoZSByaW5ncwomIzQzOyAqIGFyZSBvcmRlcmVkIGluIGEgcXVldWUgYnkgcHJpb3JpdHkgKGxvd2VyIHByaW8gdmFsdWUgPSBoaWdoZXIgcHJpb3JpdHkpLgomIzQzOyAqIFRoZSBhbGxvY2F0b3IgaXRlcmF0ZXMgYW5kIHJvdGF0ZXMgZGV2aWNlcyB3aXRoaW4gZWFjaCBwcmlvcml0eSByaW5nLgomIzQzOyAqIFdoZW4gYWxsIGRldmljZXMgaW4gYSByaW5nIGFyZSBpdGVyYXRlZCwgaXQgZ29lcyB0byB0aGUgbmV4dCBsb3dlcgomIzQzOyAqIHByaW9yaXR5IHJpbmcuCiYjNDM7ICovCiYjNDM7c3RydWN0IHN3YXBfcHJpb19yaW5nIHsKJiM0MzsJaW50IHByaW87CiYjNDM7CXVuc2lnbmVkIGludCBzaXplOwomIzQzOwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZGV2W10gX19jb3VudGVkX2J5KHNpemUpOwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgcmluZyBpcyBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtIHNvIHVwZGF0aW5nIGl0IGlzIGNvc3RseS4gVG8gbWFrZQomIzQzOyAqIHRoZSBhbGxvY2F0b3IgYW5kIG90aGVyIHVzZXJzIHNraXAgZnVsbCBkZXZpY2VzIGZhc3RlciwgdGhlIGxvd2VzdCBiaXQgb2YKJiM0MzsgKiBhIGRldmljZSBwb2ludGVyIGlzIHVzZWQgdG8gbWFyayBpdCBkaXNhYmxlZCAodGVtcG9yYXJpbHkgdW5hdmFpbGFibGUpLgomIzQzOyAqIFRoaXMgcmVsaWVzIG9uIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IGJlaW5nIHN1ZmZpY2llbnRseQomIzQzOyAqIGFsaWduZWQgKGd1YXJhbnRlZWQgYnkga21hbGxvYykuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQJMAomIzQzOyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVAkJQklUKFNXQVBfREVWSUNFX01BU0tFRF9TSElGVCkKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFNlcmlhbGl6ZXMgcXVldWUgY29udGVudCBtdXRhdGlvbnMgYW5kIGtlZXBzIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQKJiM0MzsgKiBjb25zaXN0ZW50IHdpdGggdGhlIG1hc2tlZCBzdGF0ZSBvZiBlYWNoIGRldmljZSBwb2ludGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTd2FwIHF1ZXVlIGlzIHByb3RlY3RlZCBieSBib3RoIHN3YXBfcXVldWVfdXBkYXRlX2xvY2sgYW5kIHN3YXBvbl9yd3NlbS4KJiM0MzsgKiBPbmx5IHN3YXBvbi9zd2Fwb2ZmIHdpbGwgdGFrZSB0aGUgd3JpdGUgbG9jaywgYW5kIG1vZGlmeSB0aGUgcXVldWUgbGVuZ3RoCiYjNDM7ICogb3IgYW55IHJpbmcmIzM5O3MgbGVuZ3RoLiBzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrIHByb3RlY3RzIHRoZSBjb250ZW50IHNvCiYjNDM7ICogZGV2aWNlcyBjYW4gYmUgbWFza2VkIGVhc2lseSB3aXRob3V0IHRha2luZyB0aGUgd3JpdGVsb2NrLCB3aGljaCBpcyBoZWF2eS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgc3RydWN0IHN3YXBfcHJpb19yaW5nICoqc3dhcF9xdWV1ZTsKJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHN3YXBfcXVldWVfbGVuOwomIzQzOwomIzQzOy8qCiYjNDM7ICogRWFjaCBDUFUgaGFzIGl0cyByZWFkIGl0ZXJhdG9yLCBzbyB0aGUgcXVldWUgaXRzZWxmIHdpbGwgcmVtYWluIHJlYWQKJiM0MzsgKiBvbmx5IGFuZCB0aGUgQ1BVIHNpZGUgcmVhZGVyIHJvdGF0ZXMgYnkgaXRlcmF0aW5nIHRoZSBkZXZpY2VzCiYjNDM7ICogcGVyaW9kaWNhbGx5IHVzaW5nIHRoZSBjb3VudGVyLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgU1dBUF9ST1VORF9ST0JJTl9RVU9UQSBTV0FQRklMRV9DTFVTVEVSCiYjNDM7c3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciB7CiYjNDM7CWludCBvZmZzZXQ7CiYjNDM7CWxvbmcgcnJfY291bnRlcjsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciB7CiYjNDM7CWxvY2FsX2xvY2tfdCBsb2NrOwomIzQzOwlzdHJ1Y3Qgc3dhcF9yaW5nX2l0ZXJhdG9yIHJpW107CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgX19wZXJjcHUgc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyICpzd2FwX3F1ZXVlX3JlYWRlcnM7CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIHN3YXBfZGV2aWNlX21hc2tlZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpc2kgJmFtcDsgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICopKCh1bnNpZ25lZCBsb25nKXNpICZhbXA7IH5TV0FQX0RFVklDRV9NQVNLRURfQklUKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKGludCBucl9yaW5ncywgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpyZWFkZXJzOwomIzQzOwomIzQzOwlpZiAoIW5yX3JpbmdzKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CXJlYWRlcnMgPSBfX2FsbG9jX3BlcmNwdV9nZnAoc3RydWN0X3NpemUocmVhZGVycywgcmksIG5yX3JpbmdzKSwKJiM0MzsJCQkJICAgICBfX2FsaWdub2ZfXygqcmVhZGVycyksIGdmcCk7CiYjNDM7CXJldHVybiByZWFkZXJzOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnMpCiYjNDM7ewomIzQzOwlpbnQgcmluZ19pZHgsIGNwdTsKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nOwomIzQzOwomIzQzOwlmcmVlX3BlcmNwdShzd2FwX3F1ZXVlX3JlYWRlcnMpOwomIzQzOwlzd2FwX3F1ZXVlX3JlYWRlcnMgPSByZWFkZXJzOwomIzQzOwlpZiAoIXJlYWRlcnMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qIERpc3RyaWJ1dGUgZWFjaCBDUFUmIzM5O3Mgc3dhcCBJTyBmYWlybHkgYWNyb3NzIGRldmljZXMuICovCiYjNDM7CWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKJiM0MzsJCWxvY2FsX2xvY2tfaW5pdCgmYW1wO3Blcl9jcHVfcHRyKHJlYWRlcnMsIGNwdSktJmd0O2xvY2spOwomIzQzOwomIzQzOwkJZm9yIChyaW5nX2lkeCA9IDA7IHJpbmdfaWR4ICZsdDsgc3dhcF9xdWV1ZV9sZW47IHJpbmdfaWR4JiM0MzsmIzQzOykgewomIzQzOwkJCXJpbmcgPSBzd2FwX3F1ZXVlW3JpbmdfaWR4XTsKJiM0MzsJCQlwZXJfY3B1X3B0cihyZWFkZXJzLCBjcHUpLSZndDtyaVtyaW5nX2lkeF0ub2Zmc2V0ID0KJiM0MzsJCQkJICAgIGNwdSAlIHJpbmctJmd0O3NpemU7CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX3F1ZXVlX2dldF9kZXZpY2UobG9uZyBucl9hbGxvYywgaW50IG5yX2l0ZXIpCiYjNDM7ewomIzQzOwlib29sIHJvdGF0ZSA9IGZhbHNlOwomIzQzOwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7CiYjNDM7CXN0cnVjdCBzd2FwX3JpbmdfaXRlcmF0b3IgKnJpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7CiYjNDM7CXVuc2lnbmVkIGludCBxdWV1ZV9pZHg7CiYjNDM7CiYjNDM7CWlmICghc3dhcF9xdWV1ZV9sZW4pCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKJiM0MzsKJiM0MzsJcXVldWVfaWR4ID0gMDsKJiM0MzsJd2hpbGUgKG5yX2l0ZXIgJmd0Oz0gc3dhcF9xdWV1ZVtxdWV1ZV9pZHhdLSZndDtzaXplKSB7CiYjNDM7CQlucl9pdGVyIC09IHN3YXBfcXVldWVbcXVldWVfaWR4XS0mZ3Q7c2l6ZTsKJiM0MzsJCWlmICgmIzQzOyYjNDM7cXVldWVfaWR4ICZndDs9IHN3YXBfcXVldWVfbGVuKQomIzQzOwkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJpbmcgPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF07CiYjNDM7CWxvY2FsX2xvY2soJmFtcDtzd2FwX3F1ZXVlX3JlYWRlcnMtJmd0O2xvY2spOwomIzQzOwlyaSA9IHRoaXNfY3B1X3B0cigmYW1wO3N3YXBfcXVldWVfcmVhZGVycy0mZ3Q7cmlbcXVldWVfaWR4XSk7CiYjNDM7CS8qIFJvdGF0ZSB3aGlsZSBpdGVyYXRpbmcgdGhlIHJpbmcsIGp1c3Qgbm90IG9uIHRoZSBmaXJzdCB0cnkgKi8KJiM0MzsJaWYgKG5yX2l0ZXIpCiYjNDM7CQlyb3RhdGUgPSB0cnVlOwomIzQzOwllbHNlIGlmIChyaS0mZ3Q7cnJfY291bnRlciAmbHQ7IG5yX2FsbG9jKQomIzQzOwkJcm90YXRlID0gdHJ1ZTsKJiM0MzsJZWxzZSBpZiAocmktJmd0O29mZnNldCAmZ3Q7PSByaW5nLSZndDtzaXplKQomIzQzOwkJcm90YXRlID0gdHJ1ZTsKJiM0MzsJaWYgKHJvdGF0ZSkgewomIzQzOwkJcmktJmd0O29mZnNldCYjNDM7JiM0Mzs7CiYjNDM7CQlyaS0mZ3Q7b2Zmc2V0ICU9IHJpbmctJmd0O3NpemU7CiYjNDM7CQlyaS0mZ3Q7cnJfY291bnRlciA9IFNXQVBfUk9VTkRfUk9CSU5fUVVPVEE7CiYjNDM7CX0KJiM0MzsJcmktJmd0O3JyX2NvdW50ZXIgLT0gbnJfYWxsb2M7CiYjNDM7CXNpID0gUkVBRF9PTkNFKHJpbmctJmd0O2RldltyaS0mZ3Q7b2Zmc2V0XSk7CiYjNDM7CWxvY2FsX3VubG9jaygmYW1wO3N3YXBfcXVldWVfcmVhZGVycy0mZ3Q7bG9jayk7CiYjNDM7CiYjNDM7CWlmIChzd2FwX2RldmljZV9tYXNrZWQoc2kpKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKJiM0MzsKJiM0MzsJc2kgPSBzd2FwX2RldmljZV91bm1hc2tfcHRyKHNpKTsKJiM0MzsJcmV0dXJuIHNpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBzd2FwX3F1ZXVlX2ZpbmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgKnJpbmdfaWR4LCB1bnNpZ25lZCBpbnQgKmRldl9pZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgaSwgajsKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nOwomIzQzOwomIzQzOwlsb2NrZGVwX2Fzc2VydChsb2NrZGVwX2lzX2hlbGQoJmFtcDtzd2Fwb25fcndzZW0pIHx8CiYjNDM7CQkgICAgICAgbG9ja2RlcF9pc19oZWxkKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jaykpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgc3dhcF9xdWV1ZV9sZW47IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyaW5nID0gc3dhcF9xdWV1ZVtpXTsKJiM0MzsJCWlmIChyaW5nLSZndDtwcmlvICE9IHNpLSZndDtwcmlvKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJZm9yIChqID0gMDsgaiAmbHQ7IHJpbmctJmd0O3NpemU7IGomIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHN3YXBfZGV2aWNlX3VubWFza19wdHIoUkVBRF9PTkNFKHJpbmctJmd0O2RldltqXSkpICE9IHNpKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQkqcmluZ19pZHggPSBpOwomIzQzOwkJCSpkZXZfaWR4ID0gajsKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfbWFzayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgcmluZ19pZHgsIGRldl9pZHg7CiYjNDM7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKJiM0MzsJaWYgKHN3YXBfcXVldWVfZmluZChzaSwgJmFtcDtyaW5nX2lkeCwgJmFtcDtkZXZfaWR4KSkKJiM0MzsJCV9fc2V0X2JpdChTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQsCiYjNDM7CQkJICAodW5zaWduZWQgbG9uZyAqKSZhbXA7c3dhcF9xdWV1ZVtyaW5nX2lkeF0tJmd0O2RldltkZXZfaWR4XSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfdW5tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCByaW5nX2lkeCwgZGV2X2lkeDsKJiM0MzsKJiM0MzsJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwlpZiAoc3dhcF9xdWV1ZV9maW5kKHNpLCAmYW1wO3JpbmdfaWR4LCAmYW1wO2Rldl9pZHgpKQomIzQzOwkJX19jbGVhcl9iaXQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZULAomIzQzOwkJCSAgICAodW5zaWduZWQgbG9uZyAqKSZhbXA7c3dhcF9xdWV1ZVtyaW5nX2lkeF0tJmd0O2RldltkZXZfaWR4XSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQomIzQzO3sKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICoqbmV3X3F1ZXVlID0gTlVMTCwgKipvbGRfcXVldWUgPSBOVUxMOwomIzQzOwlzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKm5ld19yZWFkZXJzID0gTlVMTDsKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nLCAqbmV3X3JpbmcgPSBOVUxMLCAqb2xkX3JpbmcgPSBOVUxMOwomIzQzOwlpbnQgcHJpbyA9IHNpLSZndDtwcmlvOwomIzQzOwlpbnQgaSwgcG9zLCBlcnIgPSAtRU5PTUVNOwomIzQzOwlnZnBfdCBnZnA7CiYjNDM7CiYjNDM7CS8qIFN3YXAgbm90IHVzYWJsZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyBzd2FwLCBqdXN0IHJlY2xhaW0gY2FjaGUuICovCiYjNDM7CWdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDsKJiM0MzsJbG9ja2RlcF9hc3NlcnRfaGVsZF93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CiYjNDM7CWZvciAocG9zID0gMDsgcG9zICZsdDsgc3dhcF9xdWV1ZV9sZW47IHBvcyYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChzd2FwX3F1ZXVlW3Bvc10tJmd0O3ByaW8gPT0gcHJpbykKJiM0MzsJCQlnb3RvIGFkZF90b19yaW5nOwomIzQzOwkJaWYgKHN3YXBfcXVldWVbcG9zXS0mZ3Q7cHJpbyAmbHQ7IHByaW8pCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogTm8gcmluZyBhdCB0aGlzIHByaW9yaXR5OiBpbnNlcnQgYSBuZXcgb25lIGF0IHBvcy4gKi8KJiM0MzsJbmV3X3JlYWRlcnMgPSBzd2FwX3F1ZXVlX3ByZWFsbG9jX3JlYWRlcnMoc3dhcF9xdWV1ZV9sZW4gJiM0MzsgMSwgZ2ZwKTsKJiM0MzsJaWYgKCFuZXdfcmVhZGVycykKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwluZXdfcXVldWUgPSBrbWFsbG9jX2FycmF5KHN3YXBfcXVldWVfbGVuICYjNDM7IDEsIHNpemVvZigqc3dhcF9xdWV1ZSksIGdmcCk7CiYjNDM7CWlmICghbmV3X3F1ZXVlKQomIzQzOwkJZ290byBmYWlsZWQ7CiYjNDM7CW5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShuZXdfcmluZywgZGV2LCAxKSwgZ2ZwKTsKJiM0MzsJaWYgKCFuZXdfcmluZykKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwlpZiAoIWdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwomIzQzOwluZXdfcmluZy0mZ3Q7cHJpbyA9IHByaW87CiYjNDM7CW5ld19yaW5nLSZndDtzaXplID0gMTsKJiM0MzsJbmV3X3JpbmctJmd0O2RldlswXSA9IHNpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgcG9zOyBpJiM0MzsmIzQzOykKJiM0MzsJCW5ld19xdWV1ZVtpXSA9IHN3YXBfcXVldWVbaV07CiYjNDM7CW5ld19xdWV1ZVtwb3NdID0gbmV3X3Jpbmc7CiYjNDM7CWZvciAoaSA9IHBvczsgaSAmbHQ7IHN3YXBfcXVldWVfbGVuOyBpJiM0MzsmIzQzOykKJiM0MzsJCW5ld19xdWV1ZVtpICYjNDM7IDFdID0gc3dhcF9xdWV1ZVtpXTsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CW9sZF9xdWV1ZSA9IHN3YXBfcXVldWU7CiYjNDM7CXN3YXBfcXVldWUgPSBuZXdfcXVldWU7CiYjNDM7CXN3YXBfcXVldWVfbGVuJiM0MzsmIzQzOzsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKJiM0MzsJa2ZyZWUob2xkX3F1ZXVlKTsKJiM0MzsKJiM0MzsJc3dhcF9xdWV1ZV9pbnN0YWxsX3JlYWRlcnMobmV3X3JlYWRlcnMpOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MzthZGRfdG9fcmluZzoKJiM0MzsJcmluZyA9IHN3YXBfcXVldWVbcG9zXTsKJiM0MzsJbmV3X3JpbmcgPSBrbWFsbG9jKHN0cnVjdF9zaXplKHJpbmcsIGRldiwgcmluZy0mZ3Q7c2l6ZSAmIzQzOyAxKSwgZ2ZwKTsKJiM0MzsJaWYgKCFuZXdfcmluZykKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwlpZiAoIWdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwlzcGluX2xvY2soJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKJiM0MzsJbWVtY3B5KG5ld19yaW5nLCByaW5nLCBzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctJmd0O3NpemUpKTsKJiM0MzsJbmV3X3JpbmctJmd0O3NpemUmIzQzOyYjNDM7OwomIzQzOwluZXdfcmluZy0mZ3Q7ZGV2W25ld19yaW5nLSZndDtzaXplIC0gMV0gPSBzaTsKJiM0MzsJb2xkX3JpbmcgPSBzd2FwX3F1ZXVlW3Bvc107CiYjNDM7CXN3YXBfcXVldWVbcG9zXSA9IG5ld19yaW5nOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwlrZnJlZShvbGRfcmluZyk7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2ZhaWxlZDoKJiM0MzsJZnJlZV9wZXJjcHUobmV3X3JlYWRlcnMpOwomIzQzOwlrZnJlZShuZXdfcXVldWUpOwomIzQzOwlrZnJlZShuZXdfcmluZyk7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfZGVsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CWdmcF90IGdmcDsKJiM0MzsJdW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4OwomIzQzOwlzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKm5ld19yZWFkZXJzID0gTlVMTDsKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nLCAqbmV3X3JpbmcgPSBOVUxMLCAqb2xkX3JpbmcgPSBOVUxMOwomIzQzOwlzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipuZXdfcXVldWUgPSBOVUxMLCAqKm9sZF9xdWV1ZSA9IE5VTEw7CiYjNDM7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X2hlbGRfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlpZiAoIXN3YXBfcXVldWVfZmluZChzaSwgJmFtcDtyaW5nX2lkeCwgJmFtcDtkZXZfaWR4KSkgewomIzQzOwkJV0FSTl9PTigxKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUbyBzaHJpbmsgbWVtb3J5IHVzYWdlLCBwcmUtYWxsb2NhdGUgbmV3IHNtYWxsZXIgZGF0YSBiZWZvcmUKJiM0MzsJICogbG9ja2luZy4gRmFpbHVyZSBpcyBmaW5lLCBzd2Fwb2ZmIHdpbGwgcmVsZWFzZSB0aGVtIGFueXdheS4KJiM0MzsJICovCiYjNDM7CWdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDsKJiM0MzsJcmluZyA9IHN3YXBfcXVldWVbcmluZ19pZHhdOwomIzQzOwlpZiAocmluZy0mZ3Q7c2l6ZSAmZ3Q7IDEpCiYjNDM7CQluZXdfcmluZyA9IGttYWxsb2Moc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLSZndDtzaXplIC0gMSksIGdmcCk7CiYjNDM7CWlmIChyaW5nLSZndDtzaXplID09IDEgJmFtcDsmYW1wOyBzd2FwX3F1ZXVlX2xlbiAmZ3Q7IDEpIHsKJiM0MzsJCW5ld19yZWFkZXJzID0gc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKAomIzQzOwkJCQkJc3dhcF9xdWV1ZV9sZW4gLSAxLCBnZnApOwomIzQzOwkJbmV3X3F1ZXVlID0ga21hbGxvYyhzaXplb2YoKnN3YXBfcXVldWUpICoKJiM0MzsJCQkJICAgIChzd2FwX3F1ZXVlX2xlbiAtIDEpLCBnZnApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwlpZiAocmluZy0mZ3Q7c2l6ZSAmZ3Q7IDEpIHsKJiM0MzsJCS8qIFNoaWZ0IHRyYWlsaW5nIGRldmljZXMgbGVmdCB0byBmaWxsIHRoZSBnYXAuICovCiYjNDM7CQl3aGlsZSAoJiM0MzsmIzQzO2Rldl9pZHggJmx0OyByaW5nLSZndDtzaXplKQomIzQzOwkJCXJpbmctJmd0O2RldltkZXZfaWR4IC0gMV0gPQomIzQzOwkJCQlyaW5nLSZndDtkZXZbZGV2X2lkeF07CiYjNDM7CQlyaW5nLSZndDtzaXplLS07CiYjNDM7CQlpZiAobmV3X3JpbmcpIHsKJiM0MzsJCQltZW1jcHkobmV3X3JpbmcsIHJpbmcsCiYjNDM7CQkJICAgICAgIHN0cnVjdF9zaXplKHJpbmcsIGRldiwgcmluZy0mZ3Q7c2l6ZSkpOwomIzQzOwkJCW9sZF9yaW5nID0gcmluZzsKJiM0MzsJCQlzd2FwX3F1ZXVlW3JpbmdfaWR4XSA9IG5ld19yaW5nOwomIzQzOwkJfQomIzQzOwl9IGVsc2UgewomIzQzOwkJLyogTGFzdCBkZXZpY2UgaW4gdGhpcyByaW5nOiByZW1vdmUgdGhlIHJpbmcuICovCiYjNDM7CQlvbGRfcmluZyA9IHJpbmc7CiYjNDM7CQlzd2FwX3F1ZXVlX2xlbi0tOwomIzQzOwkJd2hpbGUgKCYjNDM7JiM0MztyaW5nX2lkeCAmbHQ7PSBzd2FwX3F1ZXVlX2xlbikKJiM0MzsJCQlzd2FwX3F1ZXVlW3JpbmdfaWR4IC0gMV0gPQomIzQzOwkJCQlzd2FwX3F1ZXVlW3JpbmdfaWR4XTsKJiM0MzsJCWlmIChuZXdfcXVldWUpIHsKJiM0MzsJCQltZW1jcHkobmV3X3F1ZXVlLCBzd2FwX3F1ZXVlLAomIzQzOwkJCSAgICAgICBzaXplb2YoKnN3YXBfcXVldWUpICogc3dhcF9xdWV1ZV9sZW4pOwomIzQzOwkJCW9sZF9xdWV1ZSA9IHN3YXBfcXVldWU7CiYjNDM7CQkJc3dhcF9xdWV1ZSA9IG5ld19xdWV1ZTsKJiM0MzsJCX0gZWxzZSBpZiAoIXN3YXBfcXVldWVfbGVuKSB7CiYjNDM7CQkJb2xkX3F1ZXVlID0gc3dhcF9xdWV1ZTsKJiM0MzsJCQlzd2FwX3F1ZXVlID0gTlVMTDsKJiM0MzsJCX0KJiM0MzsJCWlmIChuZXdfcmVhZGVycyB8fCAhc3dhcF9xdWV1ZV9sZW4pCiYjNDM7CQkJc3dhcF9xdWV1ZV9pbnN0YWxsX3JlYWRlcnMobmV3X3JlYWRlcnMpOwomIzQzOwl9CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CiYjNDM7CWtmcmVlKG9sZF9yaW5nKTsKJiM0MzsJa2ZyZWUob2xkX3F1ZXVlKTsKJiM0MzsJcHV0X3N3YXBfZGV2aWNlKHNpKTsKJiM0Mzt9CiYjNDM7CiAvKgogICogVXNlIHRoZSBzZWNvbmQgaGlnaGVzdCBiaXQgb2YgaW51c2VfcGFnZXMgY291bnRlciBhcyB0aGUgaW5kaWNhdG9yCi0gKiBpZiBvbmUgc3dhcCBkZXZpY2UgaXMgb24gdGhlIGF2YWlsYWJsZSBwbGlzdCwgc28gdGhlIGF0b21pYyBjYW4KJiM0MzsgKiBpZiBvbmUgc3dhcCBkZXZpY2UgaXMgdW5hdmFpbGFibGUgZm9yIGFsbG9jYXRpb24sIHNvIHRoZSBhdG9taWMgY2FuCiAgKiBzdGlsbCBiZSB1cGRhdGVkIGFyaXRobWV0aWNhbGx5IHdoaWxlIGhhdmluZyBzcGVjaWFsIGRhdGEgZW1iZWRkZWQuCiAgKgogICogaW51c2VfcGFnZXMgY291bnRlciBpcyB0aGUgb25seSB0aGluZyBpbmRpY2F0aW5nIGlmIGEgZGV2aWNlIHNob3VsZAotICogYmUgb24gYXZhaWxfbGlzdHMgb3Igbm90IChleGNlcHQgc3dhcG9uIC8gc3dhcG9mZikuIEJ5IGVtYmVkZGluZyB0aGUKLSAqIG9mZi1saXN0IGJpdCBpbiB0aGUgYXRvbWljIGNvdW50ZXIsIHVwZGF0ZXMgbm8gbG9uZ2VyIG5lZWQgYW55IGxvY2sKLSAqIHRvIGNoZWNrIHRoZSBsaXN0IHN0YXR1cy4KJiM0MzsgKiBiZSBpbiB0aGUgYXZhaWxhYmxlIHF1ZXVlIG9yIG5vdCAoZXhjZXB0IHN3YXBvbiAvIHN3YXBvZmYpLiBCeQomIzQzOyAqIGVtYmVkZGluZyB0aGUgb2ZmLWxpc3QgYml0IGluIHRoZSBhdG9taWMgY291bnRlciwgdXBkYXRlcyBubyBsb25nZXIKJiM0MzsgKiBuZWVkIGFueSBsb2NrIHRvIGNoZWNrIHRoZSBsaXN0IHN0YXR1cy4KICAqCi0gKiBUaGlzIGJpdCB3aWxsIGJlIHNldCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBvbiB0aGUgcGxpc3QgYW5kIG5vdAotICogdXNhYmxlLCB3aWxsIGJlIGNsZWFyZWQgaWYgdGhlIGRldmljZSBpcyBvbiB0aGUgcGxpc3QuCiYjNDM7ICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3QgaW4gdGhlIGF2YWlsYWJsZSBxdWV1ZQomIzQzOyAqIGFuZCBub3QgdXNhYmxlLCB3aWxsIGJlIGNsZWFyZWQgaWYgdGhlIGRldmljZSBpcyBpbiB0aGUgcXVldWUuCiAgKi8KICNkZWZpbmUgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCAoMVVMICZsdDsmbHQ7IChCSVRTX1BFUl9UWVBFKGF0b21pY190KSAtIDIpKQogI2RlZmluZSBTV0FQX1VTQUdFX0NPVU5URVJfTUFTSyAoflNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpCkBAIC0xNjMsNiAmIzQzOzQ5MSwyNiBAQCBzdGF0aWMgbG9uZyBzd2FwX3VzYWdlX2luX3BhZ2VzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIAlyZXR1cm4gYXRvbWljX2xvbmdfcmVhZCgmYW1wO3NpLSZndDtpbnVzZV9wYWdlcykgJmFtcDsgU1dBUF9VU0FHRV9DT1VOVEVSX01BU0s7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFNlcmlhbGl6ZSB0aGUgYWxsb2NhdGlvbiBvbiBzaW5nbGUgQ1BVIG9yIGdsb2JhbGx5IHRvIGF2b2lkCiYjNDM7ICogZnJhZ21lbnRhdGlvbiBhbmQgbWFrZSB0aGUgd29ya2Zsb3cgZWFzaWVyIHRvIGZvbGxvdy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpCiYjNDM7CQlsb2NhbF9sb2NrKCZhbXA7c2ktJmd0O3BlcmNwdV9jbHVzdGVyLSZndDtsb2NrKTsKJiM0MzsJZWxzZQomIzQzOwkJc3Bpbl9sb2NrKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtsb2NrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpCiYjNDM7CQlsb2NhbF91bmxvY2soJmFtcDtzaS0mZ3Q7cGVyY3B1X2NsdXN0ZXItJmd0O2xvY2spOwomIzQzOwllbHNlCiYjNDM7CQlzcGluX3VubG9jaygmYW1wO3NpLSZndDtnbG9iYWxfY2x1c3Rlci0mZ3Q7bG9jayk7CiYjNDM7fQomIzQzOwogLyogUmVjbGFpbSB0aGUgc3dhcCBlbnRyeSBhbnl3YXkgaWYgcG9zc2libGUgKi8KICNkZWZpbmUgVFRSU19BTllXQVkJCTB4MQogLyoKQEAgLTUzMyw5ICYjNDM7ODgxLDEwIEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiAJICogT25seSBjbHVzdGVyIGlzb2xhdGlvbiBmcm9tIHRoZSBhbGxvY2F0b3IgZG9lcyB0YWJsZSBhbGxvY2F0aW9uLgogCSAqIFN3YXAgYWxsb2NhdG9yIHVzZXMgcGVyY3B1IGNsdXN0ZXJzIGFuZCBob2xkcyB0aGUgbG9jYWwgbG9jay4KIAkgKi8KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7dGhpc19jcHVfcHRyKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3RlciktJmd0O2xvY2spOwotCWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfU09MSURTVEFURSkpCi0JCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFtcDtzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXJfbG9jayk7CiYjNDM7CWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpCiYjNDM7CQlsb2NrZGVwX2Fzc2VydF9oZWxkKHRoaXNfY3B1X3B0cigmYW1wO3NpLSZndDtwZXJjcHVfY2x1c3Rlci0mZ3Q7bG9jaykpOwomIzQzOwllbHNlCiYjNDM7CQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtsb2NrKTsKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7Y2ktJmd0O2xvY2spOwogCiAJaWYgKCFzd2FwX2NsdXN0ZXJfYWxsb2NfdGFibGUoY2ksIF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHwKQEAgLTU0OCw5ICYjNDM7ODk3LDcgQEAgc3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkgKiB0aGUgcG90ZW50aWFsIHJlY3Vyc2l2ZSBhbGxvY2F0aW9uIGlzIGxpbWl0ZWQuCiAJICovCiAJc3Bpbl91bmxvY2soJmFtcDtjaS0mZ3Q7bG9jayk7Ci0JaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSkKLQkJc3Bpbl91bmxvY2soJmFtcDtzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXJfbG9jayk7Ci0JbG9jYWxfdW5sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKJiM0MzsJc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTsKIAogCXJldCA9IHN3YXBfY2x1c3Rlcl9hbGxvY190YWJsZShjaSwgX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfAogCQkJCQkgICBHRlBfS0VSTkVMKTsKQEAgLTU2Myw5ICYjNDM7OTEwLDcgQEAgc3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkgKiBjb3VsZCBoYXBwZW4gd2l0aCBpZ25vcmluZyB0aGUgcGVyY3B1IGNsdXN0ZXIgaXMgZnJhZ21lbnRhdGlvbiwKIAkgKiB3aGljaCBpcyBhY2NlcHRhYmxlIHNpbmNlIHRoaXMgZmFsbGJhY2sgYW5kIHJhY2UgaXMgcmFyZS4KIAkgKi8KLQlsb2NhbF9sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKLQlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpKQotCQlzcGluX2xvY2soJmFtcDtzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXJfbG9jayk7CiYjNDM7CXN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc2kpOwogCXNwaW5fbG9jaygmYW1wO2NpLSZndDtsb2NrKTsKIAogCWlmIChyZXQpIHsKQEAgLTY3MSw3ICYjNDM7MTAxNiw3IEBAIHN0YXRpYyBib29sIHN3YXBfZG9fc2NoZWR1bGVkX2Rpc2NhcmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCQljaSA9IGxpc3RfZmlyc3RfZW50cnkoJmFtcDtzaS0mZ3Q7ZGlzY2FyZF9jbHVzdGVycywgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvLCBsaXN0KTsKIAkJLyoKIAkJICogRGVsZXRlIHRoZSBjbHVzdGVyIGZyb20gbGlzdCB0byBwcmVwYXJlIGZvciBkaXNjYXJkLCBidXQga2VlcAotCQkgKiB0aGUgQ0xVU1RFUl9GTEFHX0RJU0NBUkQgZmxhZywgcGVyY3B1X3N3YXBfY2x1c3RlciBjb3VsZCBiZQomIzQzOwkJICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHRoZXJlIGNvdWxkIGJlIHBlcmNwdV9jbHVzdGVyCiAJCSAqIHBvaW50aW5nIHRvIGl0LCBvciByYW4gaW50byBieSByZWxvY2F0ZV9jbHVzdGVyLgogCQkgKi8KIAkJbGlzdF9kZWwoJmFtcDtjaS0mZ3Q7bGlzdCk7CkBAIC05NTUsNyAmIzQzOzEzMDAsNyBAQCBzdGF0aWMgYm9vbCBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAlpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpCiAJCWNpLSZndDtvcmRlciA9IG9yZGVyOwogCWNpLSZndDtjb3VudCAmIzQzOz0gbnJfcGFnZXM7Ci0Jc3dhcF9yYW5nZV9hbGxvYyhzaSwgbnJfcGFnZXMpOwomIzQzOwlzd2FwX2RldmljZV9pbnVzZV9hZGQoc2ksIG5yX3BhZ2VzKTsKIAogCXJldHVybiB0cnVlOwogfQpAQCAtMTAwMywxMiAmIzQzOzEzNDgsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGludCBhbGxvY19zd2FwX3NjYW5fY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiBvdXQ6CiAJcmVsb2NhdGVfY2x1c3RlcihzaSwgY2kpOwogCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwotCWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpIHsKLQkJdGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5vZmZzZXRbb3JkZXJdLCBuZXh0KTsKLQkJdGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0sIHNpKTsKLQl9IGVsc2UgewomIzQzOwlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKQomIzQzOwkJdGhpc19jcHVfd3JpdGUoc2ktJmd0O3BlcmNwdV9jbHVzdGVyLSZndDtuZXh0W29yZGVyXSwgbmV4dCk7CiYjNDM7CWVsc2UKIAkJc2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtuZXh0W29yZGVyXSA9IG5leHQ7Ci0JfQogCXJldHVybiBmb3VuZDsKIH0KIApAQCAtMTEwMywxMyAmIzQzOzE0NDYsMTQgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAlpZiAob3JkZXIgJmFtcDsmYW1wOyAhKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfQkxLREVWKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpKSB7Ci0JCS8qIFNlcmlhbGl6ZSBIREQgU1dBUCBhbGxvY2F0aW9uIGZvciBlYWNoIGRldmljZS4gKi8KLQkJc3Bpbl9sb2NrKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyX2xvY2spOwomIzQzO3Jlc3RhcnQ6CiYjNDM7CXN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc2kpOwomIzQzOwlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKQomIzQzOwkJb2Zmc2V0ID0gX190aGlzX2NwdV9yZWFkKHNpLSZndDtwZXJjcHVfY2x1c3Rlci0mZ3Q7bmV4dFtvcmRlcl0pOwomIzQzOwllbHNlCiAJCW9mZnNldCA9IHNpLSZndDtnbG9iYWxfY2x1c3Rlci0mZ3Q7bmV4dFtvcmRlcl07Ci0JCWlmIChvZmZzZXQgPT0gU1dBUF9FTlRSWV9JTlZBTElEKQotCQkJZ290byBuZXdfY2x1c3RlcjsKIAomIzQzOwlpZiAob2Zmc2V0ICE9IFNXQVBfRU5UUllfSU5WQUxJRCkgewogCQljaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpOwogCQkvKiBDbHVzdGVyIGNvdWxkIGhhdmUgYmVlbiB1c2VkIGJ5IGFub3RoZXIgb3JkZXIgKi8KIAkJaWYgKGNsdXN0ZXJfaXNfdXNhYmxlKGNpLCBvcmRlcikpIHsKQEAgLTExMjMsNyAmIzQzOzE0NjcsNiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQkJZ290byBkb25lOwogCX0KIAotbmV3X2NsdXN0ZXI6CiAJLyoKIAkgKiBJZiB0aGUgZGV2aWNlIG5lZWQgZGlzY2FyZCwgcHJlZmVyIG5ldyBjbHVzdGVyIG92ZXIgbm9uZnVsbAogCSAqIHRvIHNwcmVhZCBvdXQgdGhlIHdyaXRlcy4KQEAgLTExMzIsNiAmIzQzOzE0NzUsMTIgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkJZm91bmQgPSBhbGxvY19zd2FwX3NjYW5fbGlzdChzaSwgJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycywgZm9saW8sIGZhbHNlKTsKIAkJaWYgKGZvdW5kKQogCQkJZ290byBkb25lOwomIzQzOwomIzQzOwkJaWYgKCFsaXN0X2VtcHR5KCZhbXA7c2ktJmd0O2Rpc2NhcmRfY2x1c3RlcnMpKSB7CiYjNDM7CQkJc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTsKJiM0MzsJCQlzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTsKJiM0MzsJCQlnb3RvIHJlc3RhcnQ7CiYjNDM7CQl9CiAJfQogCiAJaWYgKG9yZGVyICZsdDsgUE1EX09SREVSKSB7CkBAIC0xMTgwLDggJiM0MzsxNTI5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkJCWdvdG8gZG9uZTsKIAl9CiBkb25lOgotCWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfU09MSURTVEFURSkpCi0JCXNwaW5fdW5sb2NrKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyX2xvY2spOwomIzQzOwlzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc2kpOwogCiAJcmV0dXJuIGZvdW5kOwogfQpAQCAtMTE5MSw1NCAmIzQzOzE1MzksNDQgQEAgc3RhdGljIHZvaWQgZGVsX2Zyb21fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9mZikKIHsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiAKLQlpZiAoc3dhcG9mZikgewotCQkvKgotCQkgKiBGb3JjZWZ1bGx5IHJlbW92ZSBpdC4gQ2xlYXIgdGhlIFNXUF9XUklURU9LIGZsYWdzIGZvcgotCQkgKiBzd2Fwb2ZmIGhlcmUgc28gaXQmIzM5O3Mgc3luY2hyb25pemVkIGJ5IGJvdGggc2ktJmd0O2xvY2sgYW5kCi0JCSAqIHN3YXBfYXZhaWxfbG9jaywgdG8gZW5zdXJlIHRoZSByZXN1bHQgY2FuIGJlIHNlZW4gYnkKLQkJICogYWRkX3RvX2F2YWlsX2xpc3QuCi0JCSAqLwotCQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7c2ktJmd0O2xvY2spOwotCQlzaS0mZ3Q7ZmxhZ3MgJmFtcDs9IH5TV1BfV1JJVEVPSzsKLQkJYXRvbWljX2xvbmdfb3IoU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgJmFtcDtzaS0mZ3Q7aW51c2VfcGFnZXMpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIElmIG5vdCBjYWxsZWQgYnkgc3dhcG9mZiwgdGFrZSBpdCBvZmYtbGlzdCBvbmx5IGlmIGl0JiMzOTtzCi0JCSAqIGZ1bGwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgbm90IHNldCAoc3RyaWN0bHkKLQkJICogc2ktJmd0O2ludXNlX3BhZ2VzID09IHBhZ2VzKSwgYW55IGNvbmN1cnJlbnQgc2xvdCBmcmVlaW5nLAotCQkgKiBvciBkZXZpY2UgYWxyZWFkeSByZW1vdmVkIGZyb20gcGxpc3QgYnkgc29tZW9uZSBlbHNlCi0JCSAqIHdpbGwgbWFrZSB0aGlzIHJldHVybiBmYWxzZS4KLQkJICovCiYjNDM7CS8qCiYjNDM7CSAqIEZvcmNlIHJlbW92ZSBpdCBvbmx5IGZvciBzd2Fwb2ZmLiBFbHNlLCB0YWtlIGl0IG9mZi1saXN0IG9ubHkgaWYKJiM0MzsJICogaXQmIzM5O3MgZnVsbCBhbmQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBpcyBub3Qgc2V0IChzdHJpY3RseQomIzQzOwkgKiBzaS0mZ3Q7aW51c2VfcGFnZXMgPT0gcGFnZXMpLCBzbyBjb25jdXJyZW50IHNsb3QgZnJlZWluZywgb3IKJiM0MzsJICogY29uY3VycmVudCBsaXN0IHJlbW92YWwgd2lsbCBtYWtlIHRoZSBjbXB4Y2hnIGZhaWwgYW5kIHNraXAKJiM0MzsJICogdGhlIHJlbW92YWwuCiYjNDM7CSAqLwomIzQzOwlpZiAoIXN3YXBvZmYpIHsKIAkJcGFnZXMgPSBzaS0mZ3Q7cGFnZXM7CiAJCWlmICghYXRvbWljX2xvbmdfdHJ5X2NtcHhjaGcoJmFtcDtzaS0mZ3Q7aW51c2VfcGFnZXMsICZhbXA7cGFnZXMsCiAJCQkJCSAgICAgcGFnZXMgfCBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSkKIAkJCWdvdG8gc2tpcDsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWF0b21pY19sb25nX29yKFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQsICZhbXA7c2ktJmd0O2ludXNlX3BhZ2VzKTsKIAl9CiAKLQlwbGlzdF9kZWwoJmFtcDtzaS0mZ3Q7YXZhaWxfbGlzdCwgJmFtcDtzd2FwX2F2YWlsX2hlYWQpOwotCiYjNDM7CXN3YXBfcXVldWVfbWFzayhzaSk7CiBza2lwOgotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKIH0KIAogLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHRoaXMgaGVscGVyLiAqLwotc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbikKJiM0MztzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiB7CiAJbG9uZyB2YWw7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKIAotCXNwaW5fbG9jaygmYW1wO3N3YXBfYXZhaWxfbG9jayk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwogCi0JLyogQ29ycmVzcG9uZGluZyB0byBTV1BfV1JJVEVPSyBjbGVhcmluZyBpbiBkZWxfZnJvbV9hdmFpbF9saXN0ICovCi0JaWYgKHN3YXBvbikgewotCQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7c2ktJmd0O2xvY2spOwotCQlzaS0mZ3Q7ZmxhZ3MgfD0gU1dQX1dSSVRFT0s7Ci0JfSBlbHNlIHsKLQkJaWYgKCEoUkVBRF9PTkNFKHNpLSZndDtmbGFncykgJmFtcDsgU1dQX1dSSVRFT0spKQotCQkJZ290byBza2lwOwotCX0KJiM0MzsJLyoKJiM0MzsJICogTWFyayB0aGUgZGV2aWNlIGFzIGF2YWlsIGlmIFNXUF9XUklURU9LIGlzIHNldC4gU3dhcG9mZiBjbGVhcnMKJiM0MzsJICogU1dQX1dSSVRFT0sgZmlyc3QsIHNvIGNoZWNrIHRoYXQgZmlyc3Qgc28gdGhlIGRldmljZSB3b24mIzM5O3QgYmUKJiM0MzsJICogcmUtYWRkZWQgYWZ0ZXIgc3dhcG9mZiBzdGFydGVkLgomIzQzOwkgKi8KJiM0MzsJaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSkKJiM0MzsJCWdvdG8gc2tpcDsKIAogCWlmICghKGF0b21pY19sb25nX3JlYWQoJmFtcDtzaS0mZ3Q7aW51c2VfcGFnZXMpICZhbXA7IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKQogCQlnb3RvIHNraXA7CkBAIC0xMjQ2LDkgJiM0MzsxNTg0LDEwIEBAIHN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pCiAJdmFsID0gYXRvbWljX2xvbmdfZmV0Y2hfYW5kX3JlbGF4ZWQoflNXQVBfVVNBR0VfT0ZGTElTVF9CSVQsICZhbXA7c2ktJmd0O2ludXNlX3BhZ2VzKTsKIAogCS8qCi0JICogV2hlbiBkZXZpY2UgaXMgZnVsbCBhbmQgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdCwgb25seSBvbmUgdXBkYXRlciB3aWxsCi0JICogc2VlIChpbnVzZV9wYWdlcyA9PSBzaS0mZ3Q7cGFnZXMpIGFuZCB3aWxsIGNhbGwgZGVsX2Zyb21fYXZhaWxfbGlzdC4gSWYKLQkgKiB0aGF0IHVwZGF0ZXIgaGFwcGVuIHRvIGJlIGhlcmUsIGp1c3Qgc2tpcCBhZGRpbmcuCiYjNDM7CSAqIFdoZW4gZGV2aWNlIGlzIGZ1bGwgYW5kIG1hcmtlZCBhcyBhdmFpbGFibGUsIG9uZSByZWFkZXIgd2lsbCBzZWUKJiM0MzsJICogKGludXNlX3BhZ2VzID09IHNpLSZndDtwYWdlcykgYW5kIHNob3VsZCBtYXJrIGl0IGFzIHVuYXZhaWxhYmxlIGFuZAomIzQzOwkgKiBzZXQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVC4gSWYgdGhhdCB1cGRhdGVyIGhhcHBlbnMgdG8gYmUgaGVyZSwganVzdAomIzQzOwkgKiBza2lwIHRoZSByZXN0LgogCSAqLwogCXBhZ2VzID0gc2ktJmd0O3BhZ2VzOwogCWlmICh2YWwgPT0gcGFnZXMpIHsKQEAgLTEyNTgsNjAgJiM0MzsxNTk3LDQyIEBAIHN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pCiAJCQlnb3RvIHNraXA7CiAJfQogCi0JcGxpc3RfYWRkKCZhbXA7c2ktJmd0O2F2YWlsX2xpc3QsICZhbXA7c3dhcF9hdmFpbF9oZWFkKTsKLQomIzQzOwlzd2FwX3F1ZXVlX3VubWFzayhzaSk7CiBza2lwOgotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKIH0KIAogLyoKLSAqIHN3YXBfdXNhZ2VfYWRkIC8gc3dhcF91c2FnZV9zdWIgb2YgZWFjaCBzbG90IGFyZSBzZXJpYWxpemVkIGJ5IGNpLSZndDtsb2NrCi0gKiB3aXRoaW4gZWFjaCBjbHVzdGVyLCBzbyB0aGUgdG90YWwgY29udHJpYnV0aW9uIHRvIHRoZSBnbG9iYWwgY291bnRlciBzaG91bGQKLSAqIGFsd2F5cyBiZSBwb3NpdGl2ZSBhbmQgY2Fubm90IGV4Y2VlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHVzYWJsZSBzbG90cy4KJiM0MzsgKiBzd2FwX2RldmljZV9pbnVzZV9hZGQgLyBzd2FwX2RldmljZV9pbnVzZV9zdWIgYXJlIGNhbGxlZCB3aXRoaW4gY2x1c3RlcgomIzQzOyAqIHVwZGF0ZSBjcml0aWNhbCBzZWN0aW9ucyBhbmQgc2VyaWFsaXplZCBieSBjaS0mZ3Q7bG9jayB3aXRoaW4gZWFjaCBjbHVzdGVyLAomIzQzOyAqIHNvIHRoZSB0b3RhbCBjb250cmlidXRpb24gdG8gdGhlIGdsb2JhbCBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmUKJiM0MzsgKiBhbmQgY2Fubm90IGV4Y2VlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHVzYWJsZSBzbG90cy4KICAqLwotc3RhdGljIGJvb2wgc3dhcF91c2FnZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBpbnQgbnJfZW50cmllcykKJiM0MztzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAomIzQzOwkJCQkgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKQogewotCWxvbmcgdmFsID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsICZhbXA7c2ktJmd0O2ludXNlX3BhZ2VzKTsKJiM0MzsJbG9uZyBpbnVzZV9wYWdlczsKIAogCS8qCiAJICogSWYgZGV2aWNlIGlzIGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQsCi0JICogcmVtb3ZlIGl0IGZyb20gdGhlIHBsaXN0LgotCSAqLwotCWlmICh1bmxpa2VseSh2YWwgPT0gc2ktJmd0O3BhZ2VzKSkgewotCQlkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgc3dhcF91c2FnZV9zdWIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBpbnQgbnJfZW50cmllcykKLXsKLQlsb25nIHZhbCA9IGF0b21pY19sb25nX3N1Yl9yZXR1cm5fcmVsYXhlZChucl9lbnRyaWVzLCAmYW1wO3NpLSZndDtpbnVzZV9wYWdlcyk7Ci0KLQkvKgotCSAqIElmIGRldmljZSBpcyBub3QgZnVsbCwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgc2V0LAotCSAqIGFkZCBpdCB0byB0aGUgcGxpc3QuCiYjNDM7CSAqIG1hcmsgaXQgdW5hdmFpbGFibGUuCiAJICovCi0JaWYgKHVubGlrZWx5KHZhbCAmYW1wOyBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSkKLQkJYWRkX3RvX2F2YWlsX2xpc3Qoc2ksIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCi0JCQkgICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKQotewotCWlmIChzd2FwX3VzYWdlX2FkZChzaSwgbnJfZW50cmllcykpIHsKJiM0MzsJaW51c2VfcGFnZXMgPSBhdG9taWNfbG9uZ19hZGRfcmV0dXJuX3JlbGF4ZWQobnJfZW50cmllcywgJmFtcDtzaS0mZ3Q7aW51c2VfcGFnZXMpOwomIzQzOwlpZiAodW5saWtlbHkoaW51c2VfcGFnZXMgPT0gc2ktJmd0O3BhZ2VzKSkgewogCQlpZiAodm1fc3dhcF9mdWxsKCkpCiAJCQlzY2hlZHVsZV93b3JrKCZhbXA7c2ktJmd0O3JlY2xhaW1fd29yayk7CiYjNDM7CQlkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7CiAJfQomIzQzOwogCWF0b21pY19sb25nX3N1Yihucl9lbnRyaWVzLCAmYW1wO25yX3N3YXBfcGFnZXMpOwogfQogCi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcykKJiM0MztzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9zdWIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKJiM0MzsJCQkJICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcykKIHsKIAl1bnNpZ25lZCBsb25nIGVuZCA9IG9mZnNldCAmIzQzOyBucl9lbnRyaWVzIC0gMTsKIAl2b2lkICgqc3dhcF9zbG90X2ZyZWVfbm90aWZ5KShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwomIzQzOwlsb25nIGludXNlX3BhZ2VzOwogCXVuc2lnbmVkIGludCBpOwogCiAJZm9yIChpID0gMDsgaSAmbHQ7IG5yX2VudHJpZXM7IGkmIzQzOyYjNDM7KQpAQCAtMTMzNSw3ICYjNDM7MTY1NiwxNCBAQCBzdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkgKi8KIAlzbXBfd21iKCk7CiAJYXRvbWljX2xvbmdfYWRkKG5yX2VudHJpZXMsICZhbXA7bnJfc3dhcF9wYWdlcyk7Ci0Jc3dhcF91c2FnZV9zdWIoc2ksIG5yX2VudHJpZXMpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiBkZXZpY2UgaXMgbm90IGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIHNldCwKJiM0MzsJICogYWRkIGl0IGJhY2sgdG8gdGhlIGF2YWlsYWJsZSBxdWV1ZS4KJiM0MzsJICovCiYjNDM7CWludXNlX3BhZ2VzID0gYXRvbWljX2xvbmdfc3ViX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsICZhbXA7c2ktJmd0O2ludXNlX3BhZ2VzKTsKJiM0MzsJaWYgKHVubGlrZWx5KGludXNlX3BhZ2VzICZhbXA7IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKQomIzQzOwkJYWRkX3RvX2F2YWlsX2xpc3Qoc2kpOwogfQogCiBzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCkBAIC0xMzQ1LDExMyAmIzQzOzE2NzMsNDkgQEAgc3RhdGljIGJvb2wgZ2V0X3N3YXBfZGV2aWNlX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCS8qCiAJICogR3VhcmFudGVlIHRoZSBzaS0mZ3Q7dXNlcnMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyBvdGhlcgogCSAqIGZpZWxkcyBvZiBzd2FwX2luZm9fc3RydWN0LCBhbmQgc2ktJmd0O2ZsYWdzIChTV1BfV1JJVEVPSykgaXMKLQkgKiB1cCB0byBkYXRlZC4KJiM0MzsJICogdXAgdG8gZGF0ZS4KIAkgKgotCSAqIFBhaXJlZCB3aXRoIHRoZSBzcGluX3VubG9jaygpIGFmdGVyIHNldHVwX3N3YXBfaW5mbygpIGluCi0JICogZW5hYmxlX3N3YXBfaW5mbygpLCBhbmQgc21wX3dtYigpIGluIHN3YXBvZmYuCiYjNDM7CSAqIFBhaXJlZCB3aXRoIHBlcmNwdV91cF93cml0ZSgpIGluIHN3YXBfZGV2aWNlX2VuYWJsZSgpLCBhbmQKJiM0MzsJICogc21wX3dtYigpIGFmdGVyIGNsZWFyaW5nIFNXUF9XUklURU9LIGluIHN3YXBvZmYuCiAJICovCiAJc21wX3JtYigpOwogCXJldHVybiB0cnVlOwogfQogCi0vKgotICogRmFzdCBwYXRoIHRyeSB0byBnZXQgc3dhcCBlbnRyaWVzIHdpdGggc3BlY2lmaWVkIG9yZGVyIGZyb20gY3VycmVudAotICogQ1BVJiMzOTtzIHN3YXAgZW50cnkgcG9vbCAoYSBjbHVzdGVyKS4KLSAqLwotc3RhdGljIGJvb2wgc3dhcF9hbGxvY19mYXN0KHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7c3RhdGljIGludCBzd2FwX2FsbG9jX2VudHJ5KHN0cnVjdCBmb2xpbyAqZm9saW8pCiB7Ci0JdW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwotCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7CiYjNDM7CWxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwotCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0KLQkvKgotCSAqIE9uY2UgYWxsb2NhdGVkLCBzd2FwX2luZm9fc3RydWN0IHdpbGwgbmV2ZXIgYmUgY29tcGxldGVseSBmcmVlZCwKLQkgKiBzbyBjaGVja2luZyBpdCYjMzk7cyBsaXZlbmVzcyBieSBnZXRfc3dhcF9kZXZpY2VfaW5mbyBpcyBlbm91Z2guCi0JICovCi0Jc2kgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIuc2lbb3JkZXJdKTsKLQlvZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0W29yZGVyXSk7Ci0JaWYgKCFzaSB8fCAhb2Zmc2V0IHx8ICFnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpCi0JCXJldHVybiBmYWxzZTsKLQotCWNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7Ci0JaWYgKGNsdXN0ZXJfaXNfdXNhYmxlKGNpLCBvcmRlcikpIHsKLQkJaWYgKGNsdXN0ZXJfaXNfZW1wdHkoY2kpKQotCQkJb2Zmc2V0ID0gY2x1c3Rlcl9vZmZzZXQoc2ksIGNpKTsKLQkJYWxsb2Nfc3dhcF9zY2FuX2NsdXN0ZXIoc2ksIGNpLCBmb2xpbywgb2Zmc2V0KTsKLQl9IGVsc2UgewotCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKLQl9CiYjNDM7CWludCBucl9pdGVyLCByZXQ7CiYjNDM7CiYjNDM7CXBlcmNwdV9kb3duX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlmb3IgKG5yX2l0ZXIgPSAwOzsgbnJfaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCXNpID0gc3dhcF9xdWV1ZV9nZXRfZGV2aWNlKG5yX3BhZ2VzLCBucl9pdGVyKTsKJiM0MzsJCWlmIChJU19FUlIoc2kpKSB7CiYjNDM7CQkJcmV0ID0gUFRSX0VSUihzaSk7CiYjNDM7CQkJaWYgKHJldCA9PSAtRUJVU1kpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwkJY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBmb2xpbyk7CiAKLQlwdXRfc3dhcF9kZXZpY2Uoc2kpOwotCXJldHVybiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7Ci19Ci0KLS8qIFJvdGF0ZSB0aGUgZGV2aWNlIGFuZCBzd2l0Y2ggdG8gYSBuZXcgY2x1c3RlciAqLwotc3RhdGljIHZvaWQgc3dhcF9hbGxvY19zbG93KHN0cnVjdCBmb2xpbyAqZm9saW8pCi17Ci0Jc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCAqbmV4dDsKLQotCXNwaW5fbG9jaygmYW1wO3N3YXBfYXZhaWxfbG9jayk7Ci1zdGFydF9vdmVyOgotCXBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2ksIG5leHQsICZhbXA7c3dhcF9hdmFpbF9oZWFkLCBhdmFpbF9saXN0KSB7Ci0JCS8qIFJvdGF0ZSB0aGUgZGV2aWNlIGFuZCBzd2l0Y2ggdG8gYSBuZXcgY2x1c3RlciAqLwotCQlwbGlzdF9yZXF1ZXVlKCZhbXA7c2ktJmd0O2F2YWlsX2xpc3QsICZhbXA7c3dhcF9hdmFpbF9oZWFkKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzd2FwX2F2YWlsX2xvY2spOwotCQlpZiAoZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKSB7Ci0JCQljbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIGZvbGlvKTsKLQkJCXB1dF9zd2FwX2RldmljZShzaSk7Ci0JCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKQotCQkJCXJldHVybjsKLQkJCWlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKLQkJCQlyZXR1cm47CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7CiYjNDM7CQkJcmV0ID0gMDsKJiM0MzsJCQlicmVhazsKIAkJfQogCi0JCXNwaW5fbG9jaygmYW1wO3N3YXBfYXZhaWxfbG9jayk7CiAJCS8qCi0JCSAqIGlmIHdlIGdvdCBoZXJlLCBpdCYjMzk7cyBsaWtlbHkgdGhhdCBzaSB3YXMgYWxtb3N0IGZ1bGwgYmVmb3JlLAotCQkgKiBtdWx0aXBsZSBjYWxsZXJzIHByb2JhYmx5IGFsbCB0cmllZCB0byBnZXQgYSBwYWdlIGZyb20gdGhlCi0JCSAqIHNhbWUgc2kgYW5kIGl0IGZpbGxlZCB1cCBiZWZvcmUgd2UgY291bGQgZ2V0IG9uZTsgb3IsIHRoZSBzaQotCQkgKiBmaWxsZWQgdXAgYmV0d2VlbiB1cyBkcm9wcGluZyBzd2FwX2F2YWlsX2xvY2suCi0JCSAqIFNpbmNlIHdlIGRyb3BwZWQgdGhlIHN3YXBfYXZhaWxfbG9jaywgdGhlIHN3YXBfYXZhaWxfbGlzdAotCQkgKiBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkOyBzbyBpZiBuZXh0IGlzIHN0aWxsIGluIHRoZQotCQkgKiBzd2FwX2F2YWlsX2hlYWQgbGlzdCB0aGVuIHRyeSBpdCwgb3RoZXJ3aXNlIHN0YXJ0IG92ZXIgaWYgd2UKLQkJICogaGF2ZSBub3QgZ290dGVuIGFueSBzbG90cy4KJiM0MzsJCSAqIEZvciBsYXJnZSBhbGxvY2F0aW9uLCByZXR1cm4gZXJyb3IgZGlyZWN0bHkgdG8gaW5mb3JtIHRoZQomIzQzOwkJICogY2FsbGVyIHRvIHNwbGl0IGl0IGluc3RlYWQgb2YgZmFsbGJhY2sgdG8gb3RoZXIgZGV2aWNlcy4KIAkJICovCi0JCWlmIChwbGlzdF9ub2RlX2VtcHR5KCZhbXA7bmV4dC0mZ3Q7YXZhaWxfbGlzdCkpCi0JCQlnb3RvIHN0YXJ0X292ZXI7Ci0JfQotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKLX0KLQotLyoKLSAqIERpc2NhcmQgcGVuZGluZyBjbHVzdGVycyBpbiBhIHN5bmNocm9uaXplZCB3YXkgd2hlbiB1bmRlciBoaWdoIHByZXNzdXJlLgotICogUmV0dXJuOiB0cnVlIGlmIGFueSBjbHVzdGVyIGlzIGRpc2NhcmRlZC4KLSAqLwotc3RhdGljIGJvb2wgc3dhcF9zeW5jX2Rpc2NhcmQodm9pZCkKLXsKLQlib29sIHJldCA9IGZhbHNlOwotCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgKm5leHQ7Ci0KLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwotc3RhcnRfb3ZlcjoKLQlwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNpLCBuZXh0LCAmYW1wO3N3YXBfYWN0aXZlX2hlYWQsIGxpc3QpIHsKLQkJc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwotCQlpZiAoZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKSB7Ci0JCQlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9QQUdFX0RJU0NBUkQpCi0JCQkJcmV0ID0gc3dhcF9kb19zY2hlZHVsZWRfZGlzY2FyZChzaSk7Ci0JCQlwdXRfc3dhcF9kZXZpY2Uoc2kpOwomIzQzOwkJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7CiYjNDM7CQkJcmV0ID0gLUUyQklHOwomIzQzOwkJCWJyZWFrOwogCQl9Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwotCQlpZiAocGxpc3Rfbm9kZV9lbXB0eSgmYW1wO25leHQtJmd0O2xpc3QpKQotCQkJZ290byBzdGFydF9vdmVyOwogCX0KLQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7CiAKLQlyZXR1cm4gZmFsc2U7CiYjNDM7CXBlcmNwdV91cF9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzd2FwX2V4dGVuZF90YWJsZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCkBAIC0xNzM1LDYgJiM0MzsxOTk5LDcgQEAgaW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbykKIHsKIAl1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJdW5zaWduZWQgaW50IHNpemUgPSAxICZsdDsmbHQ7IG9yZGVyOwomIzQzOwlpbnQgcmV0OwogCiAJVk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pLCBmb2xpbyk7CkBAIC0xNzU3LDIzICYjNDM7MjAyMiwxNCBAQCBpbnQgZm9saW9fYWxsb2Nfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCQl9CiAJfQogCi1hZ2FpbjoKLQlsb2NhbF9sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKLQlpZiAoIXN3YXBfYWxsb2NfZmFzdChmb2xpbykpCi0JCXN3YXBfYWxsb2Nfc2xvdyhmb2xpbyk7Ci0JbG9jYWxfdW5sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKLQotCWlmICghb3JkZXIgJmFtcDsmYW1wOyB1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkgewotCQlpZiAoc3dhcF9zeW5jX2Rpc2NhcmQoKSkKLQkJCWdvdG8gYWdhaW47Ci0JfQomIzQzOwlyZXQgPSBzd2FwX2FsbG9jX2VudHJ5KGZvbGlvKTsKIAogCS8qIE5lZWQgdG8gY2FsbCB0aGlzIGV2ZW4gaWYgYWxsb2NhdGlvbiBmYWlsZWQsIGZvciBNRU1DR19TV0FQX0ZBSUwuICovCiAJaWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwKGZvbGlvKSkpCiAJCXN3YXBfY2FjaGVfZGVsX2ZvbGlvKGZvbGlvKTsKIAogCWlmICh1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkKLQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CQlyZXR1cm4gcmV0ID8gcmV0IDogLUVOT01FTTsKIAogCXJldHVybiAwOwogfQpAQCAtMTk0OCw3ICYjNDM7MjIwNCw3IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAlpZiAoYmF0Y2hfaWQpCiAJCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcChiYXRjaF9pZCwgY2lfb2ZmIC0gYmF0Y2hfb2ZmKTsKIAotCXN3YXBfcmFuZ2VfZnJlZShzaSwgY2lfaGVhZCAmIzQzOyBjaV9zdGFydCwgbnJfcGFnZXMpOwomIzQzOwlzd2FwX2RldmljZV9pbnVzZV9zdWIoc2ksIGNpX2hlYWQgJiM0MzsgY2lfc3RhcnQsIG5yX3BhZ2VzKTsKIAlzd2FwX2NsdXN0ZXJfYXNzZXJ0X2VtcHR5KGNpLCBjaV9zdGFydCwgbnJfcGFnZXMsIGZhbHNlKTsKIAogCWlmICghY2ktJmd0O2NvdW50KQpAQCAtMjE1MCwzMSAmIzQzOzI0MDYsMTQgQEAgdm9pZCBzd2FwX3B1dF9lbnRyaWVzX2RpcmVjdChzd3BfZW50cnlfdCBlbnRyeSwgaW50IG5yKQogICovCiBzd3BfZW50cnlfdCBzd2FwX2FsbG9jX2hpYmVybmF0aW9uX3Nsb3QoaW50IHR5cGUpCiB7Ci0Jc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnBjcF9zaSwgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7Ci0JdW5zaWduZWQgbG9uZyBwY3Bfb2Zmc2V0LCBvZmZzZXQgPSBTV0FQX0VOVFJZX0lOVkFMSUQ7Ci0Jc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gU1dBUF9FTlRSWV9JTlZBTElEOwogCXN3cF9lbnRyeV90IGVudHJ5ID0gezB9OwogCiAJaWYgKCFzaSkKIAkJZ290byBmYWlsOwogCi0JLyoKLQkgKiBUcnkgdGhlIGxvY2FsIGNsdXN0ZXIgZmlyc3QgaWYgaXQgbWF0Y2hlcyB0aGUgZGV2aWNlLiBJZgotCSAqIG5vdCwgdHJ5IGdyYWIgYSBuZXcgY2x1c3RlciBhbmQgb3ZlcnJpZGUgbG9jYWwgY2x1c3Rlci4KLQkgKi8KLQlsb2NhbF9sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKLQlwY3Bfc2kgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIuc2lbMF0pOwotCXBjcF9vZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0WzBdKTsKLQlpZiAocGNwX3NpID09IHNpICZhbXA7JmFtcDsgcGNwX29mZnNldCkgewotCQljaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBwY3Bfb2Zmc2V0KTsKLQkJaWYgKGNsdXN0ZXJfaXNfdXNhYmxlKGNpLCAwKSkKLQkJCW9mZnNldCA9IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHNpLCBjaSwgTlVMTCwgcGNwX29mZnNldCk7Ci0JCWVsc2UKLQkJCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwotCX0KLQlpZiAoIW9mZnNldCkKLQkJb2Zmc2V0ID0gY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBOVUxMKTsKLQlsb2NhbF91bmxvY2soJmFtcDtwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spOwomIzQzOwlvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpOwogCWlmIChvZmZzZXQpCiAJCWVudHJ5ID0gc3dwX2VudHJ5KHNpLSZndDt0eXBlLCBvZmZzZXQpOwogCkBAIC0yMjA1LDI2ICYjNDM7MjQ0NCwxOCBAQCB2b2lkIHN3YXBfZnJlZV9oaWJlcm5hdGlvbl9zbG90KHN3cF9lbnRyeV90IGVudHJ5KQogCiBzdGF0aWMgaW50IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpCiB7Ci0JaW50IHR5cGU7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwogCiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHsKLQkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTsKLQotCQlpZiAoIShzaXMtJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChkZXZpY2UgPT0gc2lzLSZndDtiZGV2LSZndDtiZF9kZXYpIHsKLQkJCXN0cnVjdCBzd2FwX2V4dGVudCAqc2UgPSBmaXJzdF9zZShzaXMpOwotCi0JCQlpZiAoc2UtJmd0O3N0YXJ0X2Jsb2NrID09IG9mZnNldCkKLQkJCQlyZXR1cm4gdHlwZTsKJiM0MzsJZm9yX2VhY2hfYXZhaWxfc3dhcChzaSkgewomIzQzOwkJaWYgKGRldmljZSA9PSBzaS0mZ3Q7YmRldi0mZ3Q7YmRfZGV2KSB7CiYjNDM7CQkJaWYgKGZpcnN0X3NlKHNpKS0mZ3Q7c3RhcnRfYmxvY2sgPT0gb2Zmc2V0KQomIzQzOwkJCQlyZXR1cm4gc2ktJmd0O3R5cGU7CiAJCX0KIAl9CiYjNDM7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTIyNDcsMjEgJiM0MzsyNDc4LDE4IEBAIHN0YXRpYyBpbnQgX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldCkKICAqLwogaW50IHBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpCiB7Ci0JaW50IHR5cGU7CiYjNDM7CWludCByZXQ7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQotCXR5cGUgPSBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldmljZSwgb2Zmc2V0KTsKLQlpZiAodHlwZSAmbHQ7IDApIHsKLQkJc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwotCQlyZXR1cm4gdHlwZTsKLQl9CiYjNDM7CXBlcmNwdV9kb3duX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJcmV0ID0gX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZpY2UsIG9mZnNldCk7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJZ290byBvdXQ7CiAKLQlzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpOwomIzQzOwlzaSA9IHN3YXBfdHlwZV90b19pbmZvKHJldCk7CiAJaWYgKFdBUk5fT05fT05DRSghc2kpKSB7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQkJcmV0dXJuIC1FTk9ERVY7CiYjNDM7CQlyZXQgPSAtRU5PREVWOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJLyoKQEAgLTIyNzAsMTQgJiM0MzsyNDk4LDE1IEBAIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KQogCSAqIHRoZSBzYW1lIHNlc3Npb24uCiAJICovCiAJaWYgKFdBUk5fT05fT05DRShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX0hJQkVSTkFUSU9OKSkgewotCQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JCXJldHVybiAtRUJVU1k7CiYjNDM7CQlyZXQgPSAtRUJVU1k7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlzaS0mZ3Q7ZmxhZ3MgfD0gU1dQX0hJQkVSTkFUSU9OOwogCi0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwotCXJldHVybiB0eXBlOwomIzQzO291dDoKJiM0MzsJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0yMjk0LDE0ICYjNDM7MjUyMywxMSBAQCB2b2lkIHVucGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShpbnQgdHlwZSkKIHsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7CiAKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfZG93bl93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiAJc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTsKLQlpZiAoIXNpKSB7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQlzaS0mZ3Q7ZmxhZ3MgJmFtcDs9IH5TV1BfSElCRVJOQVRJT047Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlpZiAoc2kpCiYjNDM7CQlzaS0mZ3Q7ZmxhZ3MgJmFtcDs9IH5TV1BfSElCRVJOQVRJT047CiYjNDM7CXBlcmNwdV91cF93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiB9CiAKIC8qKgpAQCAtMjMyNiwyOSAmIzQzOzI1NTIsMjYgQEAgaW50IGZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KQogewogCWludCB0eXBlOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJcGVyY3B1X2Rvd25fcmVhZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiAJdHlwZSA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpOwotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJcGVyY3B1X3VwX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwogCiAJcmV0dXJuIHR5cGU7CiB9CiAKIGludCBmaW5kX2ZpcnN0X3N3YXAoZGV2X3QgKmRldmljZSkKIHsKLQlpbnQgdHlwZTsKLQotCXNwaW5fbG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHsKLQkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTsKJiM0MzsJaW50IHJldCA9IC1FTk9ERVY7CiYjNDM7CXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTsKIAotCQlpZiAoIShzaXMtJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSkKLQkJCWNvbnRpbnVlOwotCQkqZGV2aWNlID0gc2lzLSZndDtiZGV2LSZndDtiZF9kZXY7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQkJcmV0dXJuIHR5cGU7CiYjNDM7CXBlcmNwdV9kb3duX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlmb3JfZWFjaF9hdmFpbF9zd2FwKHNpKSB7CiYjNDM7CQkqZGV2aWNlID0gc2ktJmd0O2JkZXYtJmd0O2JkX2RldjsKJiM0MzsJCXJldCA9IHNpLSZndDt0eXBlOwomIzQzOwkJYnJlYWs7CiAJfQotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQlyZXR1cm4gLUVOT0RFVjsKJiM0MzsJcGVyY3B1X3VwX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMjM3Niw3ICYjNDM7MjU5OSw3IEBAIHVuc2lnbmVkIGludCBjb3VudF9zd2FwX3BhZ2VzKGludCB0eXBlLCBpbnQgZnJlZSkKIHsKIAl1bnNpZ25lZCBpbnQgbiA9IDA7CiAKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfZG93bl9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlpZiAoKHVuc2lnbmVkIGludCl0eXBlICZsdDsgbnJfc3dhcGZpbGVzKSB7CiAJCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07CiAKQEAgLTIzODgsNyAmIzQzOzI2MTEsNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpCiAJCX0KIAkJc3Bpbl91bmxvY2soJmFtcDtzaXMtJmd0O2xvY2spOwogCX0KLQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CXBlcmNwdV91cF9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlyZXR1cm4gbjsKIH0KICNlbmRpZiAvKiBDT05GSUdfSElCRVJOQVRJT04gKi8KQEAgLTI3MDAsMTAgJiM0MzsyOTIzLDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9uZXh0X3RvX3VudXNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAl1bnNpZ25lZCBsb25nIHN3cF90YjsKIAogCS8qCi0JICogTm8gbmVlZCBmb3Igc3dhcF9sb2NrIGhlcmU6IHdlJiMzOTtyZSBqdXN0IGxvb2tpbmcKJiM0MzsJICogTm8gbmVlZCBmb3Igc3dhcG9uX3J3c2VtIGhlcmU6IHdlJiMzOTtyZSBqdXN0IGxvb2tpbmcKIAkgKiBmb3Igd2hldGhlciBhbiBlbnRyeSBpcyBpbiB1c2UsIG5vdCBtb2RpZnlpbmcgaXQ7IGZhbHNlCiAJICogaGl0cyBhcmUgb2theSwgYW5kIHN5c19zd2Fwb2ZmKCkgaGFzIGFscmVhZHkgcHJldmVudGVkIG5ldwotCSAqIGFsbG9jYXRpb25zIGZyb20gdGhpcyBhcmVhICh3aGlsZSBob2xkaW5nIHN3YXBfbG9jaykuCiYjNDM7CSAqIGFsbG9jYXRpb25zIGZyb20gdGhpcyBhcmVhICh3aGlsZSBob2xkaW5nIHN3YXBvbl9yd3NlbSkuCiAJICovCiAJZm9yIChpID0gcHJldiAmIzQzOyAxOyBpICZsdDsgc2ktJmd0O21heDsgaSYjNDM7JiM0MzspIHsKIAkJc3dwX3RiID0gc3dhcF90YWJsZV9nZXQoX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBpKSwKQEAgLTI4MTYsNyAmIzQzOzMwMzksNyBAQCBzdGF0aWMgaW50IHRyeV90b191bnVzZSh1bnNpZ25lZCBpbnQgdHlwZSkKIHN1Y2Nlc3M6CiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhhdCBmdXJ0aGVyIGNsZWFudXBzIGFmdGVyIHRyeV90b191bnVzZSgpIHJldHVybnMgaGFwcGVuCi0JICogYWZ0ZXIgc3dhcF9yYW5nZV9mcmVlKCkgcmVkdWNlcyBzaS0mZ3Q7aW51c2VfcGFnZXMgdG8gMC4KJiM0MzsJICogYWZ0ZXIgc3dhcF9kZXZpY2VfaW51c2Vfc3ViKCkgcmVkdWNlcyBzaS0mZ3Q7aW51c2VfcGFnZXMgdG8gMC4KIAkgKi8KIAlzbXBfbWIoKTsKIAlyZXR1cm4gMDsKQEAgLTI4MjQsMTggJiM0MzszMDQ3LDIwIEBAIHN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKQogCiAvKgogICogQWZ0ZXIgYSBzdWNjZXNzZnVsIHRyeV90b191bnVzZSwgaWYgbm8gc3dhcCBpcyBub3cgaW4gdXNlLCB3ZSBrbm93Ci0gKiB3ZSBjYW4gZW1wdHkgdGhlIG1tbGlzdC4gIHN3YXBfbG9jayBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuCi0gKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBfbG9jaywgYW5kIGFuIG1tIG11c3QgYmUKJiM0MzsgKiB3ZSBjYW4gZW1wdHkgdGhlIG1tbGlzdC4gc3dhcG9uX3J3c2VtIG11c3QgYmUgaGVsZCBvbiBlbnRyeSBhbmQgZXhpdC4KJiM0MzsgKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBvbl9yd3NlbSwgYW5kIGFuIG1tIG11c3QgYmUKICAqIGFkZGVkIHRvIHRoZSBtbWxpc3QganVzdCBhZnRlciBwYWdlX2R1cGxpY2F0ZSAtIGJlZm9yZSB3b3VsZCBiZSByYWN5LgogICovCiBzdGF0aWMgdm9pZCBkcmFpbl9tbWxpc3Qodm9pZCkKIHsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwogCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuZXh0OwotCXVuc2lnbmVkIGludCB0eXBlOwogCi0JZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspCi0JCWlmIChzd2FwX3VzYWdlX2luX3BhZ2VzKHN3YXBfaW5mb1t0eXBlXSkpCiYjNDM7CWZvcl9lYWNoX3N3YXAoc2kpIHsKJiM0MzsJCWlmIChzd2FwX3VzYWdlX2luX3BhZ2VzKHNpKSkKIAkJCXJldHVybjsKJiM0MzsJfQomIzQzOwogCXNwaW5fbG9jaygmYW1wO21tbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbmV4dCwgJmFtcDtpbml0X21tLm1tbGlzdCkKIAkJbGlzdF9kZWxfaW5pdChwKTsKQEAgLTI5NjgsNTggJiM0MzszMTkzLDY1IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsCiAJcmV0dXJuIGdlbmVyaWNfc3dhcGZpbGVfYWN0aXZhdGUoc2lzLCBzd2FwX2ZpbGUsIHNwYW4pOwogfQogCi1zdGF0aWMgdm9pZCBfZW5hYmxlX3N3YXBfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCi17Ci0JYXRvbWljX2xvbmdfYWRkKHNpLSZndDtwYWdlcywgJmFtcDtucl9zd2FwX3BhZ2VzKTsKLQl0b3RhbF9zd2FwX3BhZ2VzICYjNDM7PSBzaS0mZ3Q7cGFnZXM7Ci0KLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmFtcDtzd2FwX2xvY2spOwotCi0JcGxpc3RfYWRkKCZhbXA7c2ktJmd0O2xpc3QsICZhbXA7c3dhcF9hY3RpdmVfaGVhZCk7Ci0KLQkvKiBBZGQgYmFjayB0byBhdmFpbGFibGUgbGlzdCAqLwotCWFkZF90b19hdmFpbF9saXN0KHNpLCB0cnVlKTsKLX0KLQogLyoKLSAqIENhbGxlZCBhZnRlciB0aGUgc3dhcCBkZXZpY2UgaXMgcmVhZHksIHJlc3VycmVjdCBpdHMgcGVyY3B1IHJlZiwgaXQmIzM5O3Mgbm93Ci0gKiBzYWZlIHRvIHJlZmVyZW5jZSBpdC4gQWRkIGl0IHRvIHRoZSBsaXN0IHRvIGV4cG9zZSBpdCB0byB0aGUgYWxsb2NhdG9yLgomIzQzOyAqIENhbGxlZCBhZnRlciB0aGUgc3dhcCBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgdXNlZC4gTWFya2luZyBpdCB3cml0YWJsZSBhbmQKJiM0MzsgKiBleHBvc2luZyBpdCB0byB0aGUgYWxsb2NhdG9yLiBSZXN1cnJlY3QgaXRzIHBlcmNwdSByZWYgaWYgaXQgd2FzIGRlYWQgYmVmb3JlLgogICovCi1zdGF0aWMgdm9pZCBlbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0MztzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9lbmFibGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogewotCXBlcmNwdV9yZWZfcmVzdXJyZWN0KCZhbXA7c2ktJmd0O3VzZXJzKTsKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwotCXNwaW5fbG9jaygmYW1wO3NpLSZndDtsb2NrKTsKLQlfZW5hYmxlX3N3YXBfaW5mbyhzaSk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzaS0mZ3Q7bG9jayk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwotfQomIzQzOwlwZXJjcHVfZG93bl93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwlzaS0mZ3Q7ZmxhZ3MgfD0gU1dQX1dSSVRFT0s7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CWF0b21pY19sb25nX2FkZChzaS0mZ3Q7cGFnZXMsICZhbXA7bnJfc3dhcF9wYWdlcyk7CiYjNDM7CXRvdGFsX3N3YXBfcGFnZXMgJiM0Mzs9IHNpLSZndDtwYWdlczsKJiM0MzsJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAotc3RhdGljIHZvaWQgcmVpbnNlcnRfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKLXsKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwotCXNwaW5fbG9jaygmYW1wO3NpLSZndDtsb2NrKTsKLQlfZW5hYmxlX3N3YXBfaW5mbyhzaSk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzaS0mZ3Q7bG9jayk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlhZGRfdG9fYXZhaWxfbGlzdChzaSk7CiB9CiAKLS8qCi0gKiBDYWxsZWQgYWZ0ZXIgY2xlYXJpbmcgU1dQX1dSSVRFT0ssIGVuc3VyZXMgY2x1c3Rlcl9hbGxvY19yYW5nZQotICogc2VlIHRoZSB1cGRhdGVkIGZsYWdzLCBzbyB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgYWxsb2NhdGlvbnMuCi0gKi8KLXN0YXRpYyB2b2lkIHdhaXRfZm9yX2FsbG9jYXRpb24oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQomIzQzO3N0YXRpYyBpbnQgc3dhcF9kZXZpY2VfZGlzYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBlbmQgPSBBTElHTihzaS0mZ3Q7bWF4LCBTV0FQRklMRV9DTFVTVEVSKTsKIAlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwogCi0JQlVHX09OKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfV1JJVEVPSyk7CiYjNDM7CS8qCiYjNDM7CSAqIElmIFNXUF9XUklURU9LIGlzIG5vdCBzZXQ6IGFub3RoZXIgcHJvY2VzcyBhbHJlYWR5IGRpc2FibGluZyBpdC4KJiM0MzsJICogSWYgU1dQX0hJQkVSTkFUSU9OIGlzIHNldDogdGhlIGRldmljZSBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uLgomIzQzOwkgKi8KJiM0MzsJcGVyY3B1X2Rvd25fd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1dSSVRFT0spIHx8CiYjNDM7CSAgICBzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX0hJQkVSTkFUSU9OKSB7CiYjNDM7CQlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwkJcmV0dXJuIC1FQlVTWTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VjdXJpdHlfdm1fZW5vdWdoX21lbW9yeV9tbShjdXJyZW50LSZndDttbSwgc2ktJmd0O3BhZ2VzKSkgewomIzQzOwkJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwl9CiYjNDM7CXZtX3VuYWNjdF9tZW1vcnkoc2ktJmd0O3BhZ2VzKTsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CXNpLSZndDtmbGFncyAmYW1wOz0gflNXUF9XUklURU9LOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwl0b3RhbF9zd2FwX3BhZ2VzIC09IHNpLSZndDtwYWdlczsKJiM0MzsJYXRvbWljX2xvbmdfc3ViKHNpLSZndDtwYWdlcywgJmFtcDtucl9zd2FwX3BhZ2VzKTsKJiM0MzsJZGVsX2Zyb21fYXZhaWxfbGlzdChzaSwgdHJ1ZSk7CiYjNDM7CXBlcmNwdV91cF93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiAKJiM0MzsJLyoKJiM0MzsJICogU3dhcCBhbGxvY2F0b3IgZG9lc24mIzM5O3QgdG91Y2ggc2kgbG9jaywgc28gbG9vcGluZyB0aHJvdWdoIGFsbAomIzQzOwkgKiBjaSBsb2NrcyBlbnN1cmVzIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMgc2VlcyB0aGUKJiM0MzsJICogdXBkYXRlZCBmbGFncywgYW5kIG5vIG1vcmUgYWxsb2NhdGlvbnMgd2lsbCBvY2N1ci4KJiM0MzsJICovCiAJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgJmx0OyBlbmQ7IG9mZnNldCAmIzQzOz0gU1dBUEZJTEVfQ0xVU1RFUikgewogCQljaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpOwogCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKIAl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLApAQCAtMzA0MywyOCAmIzQzOzMyNzUsNiBAQCBzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLAogCWt2ZnJlZShjbHVzdGVyX2luZm8pOwogfQogCi0vKgotICogQ2FsbGVkIGFmdGVyIHN3YXAgZGV2aWNlJiMzOTtzIHJlZmVyZW5jZSBjb3VudCBpcyBkZWFkLCBzbwotICogbmVpdGhlciBzY2FuIG5vciBhbGxvY2F0aW9uIHdpbGwgdXNlIGl0LgotICovCi1zdGF0aWMgdm9pZCBmbHVzaF9wZXJjcHVfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKLXsKLQlpbnQgY3B1LCBpOwotCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICoqcGNwX3NpOwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlwY3Bfc2kgPSBwZXJfY3B1X3B0cihwZXJjcHVfc3dhcF9jbHVzdGVyLnNpLCBjcHUpOwotCQkvKgotCQkgKiBJbnZhbGlkYXRlIHRoZSBwZXJjcHUgc3dhcCBjbHVzdGVyIGNhY2hlLCBzaS0mZ3Q7dXNlcnMKLQkJICogaXMgZGVhZCwgc28gbm8gbmV3IHVzZXIgd2lsbCBwb2ludCB0byBpdCwganVzdCBmbHVzaAotCQkgKiBhbnkgZXhpc3RpbmcgdXNlci4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgJmx0OyBTV0FQX05SX09SREVSUzsgaSYjNDM7JiM0MzspCi0JCQljbXB4Y2hnKCZhbXA7cGNwX3NpW2ldLCBzaSwgTlVMTCk7Ci0JfQotfQotCi0KIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSkKIHsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcCA9IE5VTEw7CkBAIC0zMDg2LDQ0ICYjNDM7MzI5NiwyMiBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpCiAJCXJldHVybiBQVFJfRVJSKHZpY3RpbSk7CiAKIAltYXBwaW5nID0gdmljdGltLSZndDtmX21hcHBpbmc7Ci0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQlwbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYW1wO3N3YXBfYWN0aXZlX2hlYWQsIGxpc3QpIHsKLQkJaWYgKHAtJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSB7Ci0JCQlpZiAocC0mZ3Q7c3dhcF9maWxlLSZndDtmX21hcHBpbmcgPT0gbWFwcGluZykgewotCQkJCWZvdW5kID0gMTsKLQkJCQlicmVhazsKLQkJCX0KJiM0MzsJcGVyY3B1X2Rvd25fcmVhZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CWZvcl9lYWNoX2F2YWlsX3N3YXAocCkgewomIzQzOwkJaWYgKHAtJmd0O3N3YXBfZmlsZS0mZ3Q7Zl9tYXBwaW5nID09IG1hcHBpbmcpIHsKJiM0MzsJCQlmb3VuZCA9IDE7CiYjNDM7CQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKCFmb3VuZCkgewotCQllcnIgPSAtRUlOVkFMOwotCQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JCWdvdG8gb3V0X2RwdXQ7Ci0JfQotCi0JLyogUmVmdXNlIHN3YXBvZmYgd2hpbGUgdGhlIGRldmljZSBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uICovCi0JaWYgKHAtJmd0O2ZsYWdzICZhbXA7IFNXUF9ISUJFUk5BVElPTikgewotCQllcnIgPSAtRUJVU1k7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQkJZ290byBvdXRfZHB1dDsKLQl9CiYjNDM7CXBlcmNwdV91cF9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJZmlscF9jbG9zZSh2aWN0aW0sIE5VTEwpOwogCi0JaWYgKCFzZWN1cml0eV92bV9lbm91Z2hfbWVtb3J5X21tKGN1cnJlbnQtJmd0O21tLCBwLSZndDtwYWdlcykpCi0JCXZtX3VuYWNjdF9tZW1vcnkocC0mZ3Q7cGFnZXMpOwotCWVsc2UgewotCQllcnIgPSAtRU5PTUVNOwotCQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JCWdvdG8gb3V0X2RwdXQ7Ci0JfQotCXNwaW5fbG9jaygmYW1wO3AtJmd0O2xvY2spOwotCWRlbF9mcm9tX2F2YWlsX2xpc3QocCwgdHJ1ZSk7Ci0JcGxpc3RfZGVsKCZhbXA7cC0mZ3Q7bGlzdCwgJmFtcDtzd2FwX2FjdGl2ZV9oZWFkKTsKLQlhdG9taWNfbG9uZ19zdWIocC0mZ3Q7cGFnZXMsICZhbXA7bnJfc3dhcF9wYWdlcyk7Ci0JdG90YWxfc3dhcF9wYWdlcyAtPSBwLSZndDtwYWdlczsKLQlzcGluX3VubG9jaygmYW1wO3AtJmd0O2xvY2spOwotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJaWYgKCFmb3VuZCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwogCi0Jd2FpdF9mb3JfYWxsb2NhdGlvbihwKTsKJiM0MzsJZXJyID0gc3dhcF9kZXZpY2VfZGlzYWJsZShwKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiAKIAlzZXRfY3VycmVudF9vb21fb3JpZ2luKCk7CiAJZXJyID0gdHJ5X3RvX3VudXNlKHAtJmd0O3R5cGUpOwpAQCAtMzEzMSwxMCAmIzQzOzMzMTksMTMgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKQogCiAJaWYgKGVycikgewogCQkvKiByZS1pbnNlcnQgc3dhcCBzcGFjZSBiYWNrIGludG8gc3dhcF9saXN0ICovCi0JCXJlaW5zZXJ0X3N3YXBfaW5mbyhwKTsKLQkJZ290byBvdXRfZHB1dDsKJiM0MzsJCXN3YXBfZGV2aWNlX2VuYWJsZShwKTsKJiM0MzsJCXJldHVybiBlcnI7CiAJfQogCiYjNDM7CXBlcmNwdV9kb3duX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJc3dhcF9xdWV1ZV9kZWwocCk7CiYjNDM7CiAJLyoKIAkgKiBXYWl0IGZvciBzd2FwIG9wZXJhdGlvbnMgcHJvdGVjdGVkIGJ5IGdldC9wdXRfc3dhcF9kZXZpY2UoKQogCSAqIHRvIGNvbXBsZXRlLiAgQmVjYXVzZSBvZiBzeW5jaHJvbml6ZV9yY3UoKSBoZXJlLCBhbGwgc3dhcApAQCAtMzE0OSwxNSAmIzQzOzMzNDAsMTIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKQogCiAJZmx1c2hfd29yaygmYW1wO3AtJmd0O2Rpc2NhcmRfd29yayk7CiAJZmx1c2hfd29yaygmYW1wO3AtJmd0O3JlY2xhaW1fd29yayk7Ci0JZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihwKTsKIAogCWRlc3Ryb3lfc3dhcF9leHRlbnRzKHAsIHAtJmd0O3N3YXBfZmlsZSk7CiAKIAlpZiAoIShwLSZndDtmbGFncyAmYW1wOyBTV1BfU09MSURTVEFURSkpCiAJCWF0b21pY19kZWMoJmFtcDtucl9yb3RhdGVfc3dhcCk7CiAKLQltdXRleF9sb2NrKCZhbXA7c3dhcG9uX211dGV4KTsKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwogCXNwaW5fbG9jaygmYW1wO3AtJmd0O2xvY2spOwogCWRyYWluX21tbGlzdCgpOwogCkBAIC0zMTY4LDEwICYjNDM7MzM1NiwxMSBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpCiAJcC0mZ3Q7bWF4ID0gMDsKIAlwLSZndDtjbHVzdGVyX2luZm8gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZhbXA7cC0mZ3Q7bG9jayk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwogCWFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC0mZ3Q7dHlwZSk7CiAJenN3YXBfc3dhcG9mZihwLSZndDt0eXBlKTsKLQltdXRleF91bmxvY2soJmFtcDtzd2Fwb25fbXV0ZXgpOwomIzQzOwlmcmVlX3BlcmNwdShwLSZndDtwZXJjcHVfY2x1c3Rlcik7CiYjNDM7CXAtJmd0O3BlcmNwdV9jbHVzdGVyID0gTlVMTDsKIAlrZnJlZShwLSZndDtnbG9iYWxfY2x1c3Rlcik7CiAJcC0mZ3Q7Z2xvYmFsX2NsdXN0ZXIgPSBOVUxMOwogCWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oY2x1c3Rlcl9pbmZvLCBtYXhwYWdlcyk7CkBAIC0zMTg3LDE4ICYjNDM7MzM3NiwxOSBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpCiAJICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28gdGhhdCBzd2Fwb24KIAkgKiBjYW4gcmV1c2UgdGhpcyBzd2FwX2luZm8gaW4gYWxsb2Nfc3dhcF9pbmZvKCkgc2FmZWx5LiAgSXQgaXMgb2sgdG8KIAkgKiBub3QgaG9sZCBwLSZndDtsb2NrIGFmdGVyIHdlIGNsZWFyZWQgaXRzIFNXUF9XUklURU9LLgomIzQzOwkgKgomIzQzOwkgKiBUaGUgd3JpdGUgbG9jayBlbnN1cmVzIHRoZSBmbGFnIGNsZWFyIGlzIHZpc2libGUgdG8gbG9ja2xlc3MKJiM0MzsJICogcmVhZGVycyBvZiBzd2FwX3R5cGVfdG9faW5mbygpIGJlZm9yZSBhbGxvY19zd2FwX2luZm8oKSByZXVzZXMKJiM0MzsJICogdGhpcyBzbG90LgogCSAqLwotCXNwaW5fbG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CXBlcmNwdV9kb3duX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlwLSZndDtmbGFncyA9IDA7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwogCi0JZXJyID0gMDsKIAlhdG9taWNfaW5jKCZhbXA7cHJvY19wb2xsX2V2ZW50KTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFtcDtwcm9jX3BvbGxfd2FpdCk7CiAKLW91dF9kcHV0OgotCWZpbHBfY2xvc2UodmljdGltLCBOVUxMKTsKLQlyZXR1cm4gZXJyOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCkBAIC0zMjE2LDIwICYjNDM7MzQwNiwxOCBAQCBzdGF0aWMgX19wb2xsX3Qgc3dhcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIAlyZXR1cm4gRVBPTExJTiB8IEVQT0xMUkROT1JNOwogfQogCi0vKiBpdGVyYXRvciAqLwogc3RhdGljIHZvaWQgKnN3YXBfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzd2FwLCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7Ci0JaW50IHR5cGU7CiAJbG9mZl90IGwgPSAqcG9zOwogCi0JbXV0ZXhfbG9jaygmYW1wO3N3YXBvbl9tdXRleCk7CiYjNDM7CXBlcmNwdV9kb3duX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwogCiAJaWYgKCFsKQogCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwogCi0JZm9yICh0eXBlID0gMDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlJiM0MzsmIzQzOykgewotCQlpZiAoIShzaS0mZ3Q7c3dhcF9maWxlKSkKJiM0MzsJZm9yX2VhY2hfc3dhcChzaSkgewomIzQzOwkJaWYgKCFzaS0mZ3Q7c3dhcF9maWxlKQogCQkJY29udGludWU7CiAJCWlmICghLS1sKQogCQkJcmV0dXJuIHNpOwpAQCAtMzI1MCw3ICYjNDM7MzQzOCw3IEBAIHN0YXRpYyB2b2lkICpzd2FwX25leHQoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIAogCSYjNDM7JiM0MzsoKnBvcyk7CiAJZm9yICg7IChzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpKTsgdHlwZSYjNDM7JiM0MzspIHsKLQkJaWYgKCEoc2ktJmd0O3N3YXBfZmlsZSkpCiYjNDM7CQlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1VTRUQpIHx8ICEoc2ktJmd0O3N3YXBfZmlsZSkpCiAJCQljb250aW51ZTsKIAkJcmV0dXJuIHNpOwogCX0KQEAgLTMyNjAsNyAmIzQzOzM0NDgsNyBAQCBzdGF0aWMgdm9pZCAqc3dhcF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiAKIHN0YXRpYyB2b2lkIHN3YXBfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpCiB7Ci0JbXV0ZXhfdW5sb2NrKCZhbXA7c3dhcG9uX211dGV4KTsKJiM0MzsJcGVyY3B1X3VwX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwogfQogCiBzdGF0aWMgaW50IHN3YXBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpCkBAIC0zMzUzLDEzICYjNDM7MzU0MSwxMyBAQCBzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKmFsbG9jX3N3YXBfaW5mbyh2b2lkKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfZG93bl93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiAJZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHsKIAkJaWYgKCEoc3dhcF9pbmZvW3R5cGVdLSZndDtmbGFncyAmYW1wOyBTV1BfVVNFRCkpCiAJCQlicmVhazsKIAl9CiAJaWYgKHR5cGUgJmd0Oz0gTUFYX1NXQVBGSUxFUykgewotCQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CQlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwogCQlwZXJjcHVfcmVmX2V4aXQoJmFtcDtwLSZndDt1c2Vycyk7CiAJCWt2ZnJlZShwKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKQEAgLTMzODEsMTAgJiM0MzszNTY5LDggQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICphbGxvY19zd2FwX2luZm8odm9pZCkKIAkJICovCiAJfQogCXAtJmd0O3N3YXBfZXh0ZW50X3Jvb3QgPSBSQl9ST09UOwotCXBsaXN0X25vZGVfaW5pdCgmYW1wO3AtJmd0O2xpc3QsIDApOwotCXBsaXN0X25vZGVfaW5pdCgmYW1wO3AtJmd0O2F2YWlsX2xpc3QsIDApOwogCXAtJmd0O2ZsYWdzID0gU1dQX1VTRUQ7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwogCWlmIChkZWZlcikgewogCQlwZXJjcHVfcmVmX2V4aXQoJmFtcDtkZWZlci0mZ3Q7dXNlcnMpOwogCQlrdmZyZWUoZGVmZXIpOwpAQCAtMzQ1Myw5ICYjNDM7MzYzOSw4IEBAIF9fd2VhayB1bnNpZ25lZCBsb25nIGFyY2hfbWF4X3N3YXBmaWxlX3NpemUodm9pZCkKIAlyZXR1cm4gZ2VuZXJpY19tYXhfc3dhcGZpbGVfc2l6ZSgpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKLQkJCQkJdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLAotCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKQomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIodW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLAomIzQzOwkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgbWF4cGFnZXM7CkBAIC0zNTIyLDcgJiM0MzszNzA3LDcgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogewogCXVuc2lnbmVkIGxvbmcgbnJfY2x1c3RlcnMgPSBESVZfUk9VTkRfVVAobWF4cGFnZXMsIFNXQVBGSUxFX0NMVVNURVIpOwogCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvOwotCWludCBlcnIgPSAtRU5PTUVNOwomIzQzOwlpbnQgY3B1LCBlcnIgPSAtRU5PTUVNOwogCXVuc2lnbmVkIGxvbmcgaTsKIAogCWNsdXN0ZXJfaW5mbyA9IGt2emFsbG9jX29ianMoKmNsdXN0ZXJfaW5mbywgbnJfY2x1c3RlcnMpOwpAQCAtMzUzMiwxMyAmIzQzOzM3MTcsMjYgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCWZvciAoaSA9IDA7IGkgJmx0OyBucl9jbHVzdGVyczsgaSYjNDM7JiM0MzspCiAJCXNwaW5fbG9ja19pbml0KCZhbXA7Y2x1c3Rlcl9pbmZvW2ldLmxvY2spOwogCi0JaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSkgewomIzQzOwlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSB7CiYjNDM7CQlzaS0mZ3Q7cGVyY3B1X2NsdXN0ZXIgPSBhbGxvY19wZXJjcHUoc3RydWN0IHBlcmNwdV9jbHVzdGVyKTsKJiM0MzsJCWlmICghc2ktJmd0O3BlcmNwdV9jbHVzdGVyKQomIzQzOwkJCWdvdG8gZXJyOwomIzQzOwomIzQzOwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewomIzQzOwkJCXN0cnVjdCBwZXJjcHVfY2x1c3RlciAqY2x1c3RlcjsKJiM0MzsKJiM0MzsJCQljbHVzdGVyID0gcGVyX2NwdV9wdHIoc2ktJmd0O3BlcmNwdV9jbHVzdGVyLCBjcHUpOwomIzQzOwkJCWZvciAoaSA9IDA7IGkgJmx0OyBTV0FQX05SX09SREVSUzsgaSYjNDM7JiM0MzspCiYjNDM7CQkJCWNsdXN0ZXItJmd0O25leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7CiYjNDM7CQkJbG9jYWxfbG9ja19pbml0KCZhbXA7Y2x1c3Rlci0mZ3Q7bG9jayk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiAJCXNpLSZndDtnbG9iYWxfY2x1c3RlciA9IGttYWxsb2Nfb2JqKCpzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXIpOwogCQlpZiAoIXNpLSZndDtnbG9iYWxfY2x1c3RlcikKIAkJCWdvdG8gZXJyOwogCQlmb3IgKGkgPSAwOyBpICZsdDsgU1dBUF9OUl9PUkRFUlM7IGkmIzQzOyYjNDM7KQogCQkJc2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtuZXh0W2ldID0gU1dBUF9FTlRSWV9JTlZBTElEOwotCQlzcGluX2xvY2tfaW5pdCgmYW1wO3NpLSZndDtnbG9iYWxfY2x1c3Rlcl9sb2NrKTsKJiM0MzsJCXNwaW5fbG9ja19pbml0KCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtsb2NrKTsKIAl9CiAKIAkvKgpAQCAtMzYyMSw3ICYjNDM7MzgxOSw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJLyoKIAkgKiBBbGxvY2F0ZSBvciByZXVzZSBleGlzdGluZyAhU1dQX1VTRUQgc3dhcF9pbmZvLiBUaGUgcmV0dXJuZWQKIAkgKiBzaSB3aWxsIHN0YXkgaW4gYSBkeWluZyBzdGF0dXMsIHNvIG5vdGhpbmcgd2lsbCBhY2Nlc3MgaXRzIGNvbnRlbnQKLQkgKiB1bnRpbCBlbmFibGVfc3dhcF9pbmZvIHJlc3VycmVjdHMgaXRzIHBlcmNwdSByZWYgYW5kIGV4cG9zZSBpdC4KJiM0MzsJICogdW50aWwgc3dhcF9kZXZpY2VfZW5hYmxlIHJlc3VycmVjdHMgaXRzIHBlcmNwdSByZWYgYW5kIGV4cG9zZSBpdC4KIAkgKi8KIAlzaSA9IGFsbG9jX3N3YXBfaW5mbygpOwogCWlmIChJU19FUlIoc2kpKQpAQCAtMzY3OSw3ICYjNDM7Mzg3Nyw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJfQogCXN3YXBfaGVhZGVyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgMCk7CiAKLQltYXhwYWdlcyA9IHJlYWRfc3dhcF9oZWFkZXIoc2ksIHN3YXBfaGVhZGVyLCBpbm9kZSk7CiYjNDM7CW1heHBhZ2VzID0gcmVhZF9zd2FwX2hlYWRlcihzd2FwX2hlYWRlciwgaW5vZGUpOwogCWlmICh1bmxpa2VseSghbWF4cGFnZXMpKSB7CiAJCWVycm9yID0gLUVJTlZBTDsKIAkJZ290byBiYWRfc3dhcF91bmxvY2tfaW5vZGU7CkBAIC0zNzAwLDExICYjNDM7Mzg5OCw2IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAKIAltYXhwYWdlcyA9IHNpLSZndDttYXg7CiAKLQkvKiBTZXQgdXAgdGhlIHN3YXAgY2x1c3RlciBpbmZvICovCi0JZXJyb3IgPSBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc2ksIHN3YXBfaGVhZGVyLCBtYXhwYWdlcyk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTsKLQogCWlmIChzaS0mZ3Q7YmRldiAmYW1wOyZhbXA7IGJkZXZfc3RhYmxlX3dyaXRlcyhzaS0mZ3Q7YmRldikpCiAJCXNpLSZndDtmbGFncyB8PSBTV1BfU1RBQkxFX1dSSVRFUzsKIApAQCAtMzcxOCw2ICYjNDM7MzkxMSwxNSBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKQogCQlpbmNlZF9ucl9yb3RhdGVfc3dhcCA9IHRydWU7CiAJfQogCiYjNDM7CS8qCiYjNDM7CSAqIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8uIFRoaXMgbXVzdCBydW4gYWZ0ZXIgU1dQX1NPTElEU1RBVEUKJiM0MzsJICogaXMgZGV0ZXJtaW5lZCBhYm92ZSwgYXMgaXQgZGVjaWRlcyB3aGV0aGVyIHRvIGFsbG9jYXRlIHRoZSBwZXItQ1BVCiYjNDM7CSAqIGNsdXN0ZXIgKHNvbGlkIHN0YXRlKSBvciB0aGUgZ2xvYmFsIGNsdXN0ZXIgKHJvdGF0aW9uYWwpLgomIzQzOwkgKi8KJiM0MzsJZXJyb3IgPSBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc2ksIHN3YXBfaGVhZGVyLCBtYXhwYWdlcyk7CiYjNDM7CWlmIChlcnJvcikKJiM0MzsJCWdvdG8gYmFkX3N3YXBfdW5sb2NrX2lub2RlOwomIzQzOwogCWlmICgoc3dhcF9mbGFncyAmYW1wOyBTV0FQX0ZMQUdfRElTQ0FSRCkgJmFtcDsmYW1wOwogCSAgICBzaS0mZ3Q7YmRldiAmYW1wOyZhbXA7IGJkZXZfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzaS0mZ3Q7YmRldikpIHsKIAkJLyoKQEAgLTM3NjQsMjIgJiM0MzszOTY2LDIyIEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJCWdvdG8gZnJlZV9zd2FwX3pzd2FwOwogCX0KIAotCW11dGV4X2xvY2soJmFtcDtzd2Fwb25fbXV0ZXgpOwogCXByaW8gPSBERUZfU1dBUF9QUklPOwogCWlmIChzd2FwX2ZsYWdzICZhbXA7IFNXQVBfRkxBR19QUkVGRVIpCiAJCXByaW8gPSBzd2FwX2ZsYWdzICZhbXA7IFNXQVBfRkxBR19QUklPX01BU0s7CiAKLQkvKgotCSAqIFRoZSBwbGlzdCBwcmlvIGlzIG5lZ2F0ZWQgYmVjYXVzZSBwbGlzdCBvcmRlcmluZyBpcwotCSAqIGxvdy10by1oaWdoLCB3aGlsZSBzd2FwIG9yZGVyaW5nIGlzIGhpZ2gtdG8tbG93Ci0JICovCiAJc2ktJmd0O3ByaW8gPSBwcmlvOwotCXNpLSZndDtsaXN0LnByaW8gPSAtc2ktJmd0O3ByaW87Ci0Jc2ktJmd0O2F2YWlsX2xpc3QucHJpbyA9IC1zaS0mZ3Q7cHJpbzsKIAlzaS0mZ3Q7c3dhcF9maWxlID0gc3dhcF9maWxlOwogCiAJLyogU2V0cyBTV1BfV1JJVEVPSywgcmVzdXJyZWN0IHRoZSBwZXJjcHUgcmVmLCBleHBvc2UgdGhlIHN3YXAgZGV2aWNlICovCi0JZW5hYmxlX3N3YXBfaW5mbyhzaSk7CiYjNDM7CXBlcmNwdV9yZWZfcmVzdXJyZWN0KCZhbXA7c2ktJmd0O3VzZXJzKTsKJiM0MzsJcGVyY3B1X2Rvd25fd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwllcnJvciA9IHN3YXBfcXVldWVfYWRkKHNpKTsKJiM0MzsJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBmcmVlX3N3YXBfenN3YXA7CiYjNDM7CiYjNDM7CXN3YXBfZGV2aWNlX2VuYWJsZShzaSk7CiAKIAlwcl9pbmZvKCYjMzQ7QWRkaW5nICV1ayBzd2FwIG9uICVzLiAgUHJpb3JpdHk6JWQgZXh0ZW50czolZCBhY3Jvc3M6JWxsdWsgJXMlcyVzJXNcbiYjMzQ7LAogCQlLKHNpLSZndDtwYWdlcyksIG5hbWUtJmd0O25hbWUsIHNpLSZndDtwcmlvLCBucl9leHRlbnRzLApAQCAtMzc4OSw3ICYjNDM7Mzk5MSw2IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJCShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX0FSRUFfRElTQ0FSRCkgPyAmIzM0O3MmIzM0OyA6ICYjMzQ7JiMzNDssCiAJCShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1BBR0VfRElTQ0FSRCkgPyAmIzM0O2MmIzM0OyA6ICYjMzQ7JiMzNDspOwogCi0JbXV0ZXhfdW5sb2NrKCZhbXA7c3dhcG9uX211dGV4KTsKIAlhdG9taWNfaW5jKCZhbXA7cHJvY19wb2xsX2V2ZW50KTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFtcDtwcm9jX3BvbGxfd2FpdCk7CiAKQEAgLTM4MDAsNiAmIzQzOzQwMDEsOCBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKQogYmFkX3N3YXBfdW5sb2NrX2lub2RlOgogCWlub2RlX3VubG9jayhpbm9kZSk7CiBiYWRfc3dhcDoKJiM0MzsJZnJlZV9wZXJjcHUoc2ktJmd0O3BlcmNwdV9jbHVzdGVyKTsKJiM0MzsJc2ktJmd0O3BlcmNwdV9jbHVzdGVyID0gTlVMTDsKIAlrZnJlZShzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXIpOwogCXNpLSZndDtnbG9iYWxfY2x1c3RlciA9IE5VTEw7CiAJaW5vZGUgPSBOVUxMOwpAQCAtMzgxMCw5ICYjNDM7NDAxMyw5IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28KIAkgKiBhbGxvY19zd2FwX2luZm8gY2FuIHJldXNlIHRoaXMgc2kgc2FmZWx5LgogCSAqLwotCXNwaW5fbG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CXBlcmNwdV9kb3duX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlzaS0mZ3Q7ZmxhZ3MgPSAwOwotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlpZiAoaW5jZWRfbnJfcm90YXRlX3N3YXApCiAJCWF0b21pY19kZWMoJmFtcDtucl9yb3RhdGVfc3dhcCk7CiAJaWYgKHN3YXBfZmlsZSkKQEAgLTM4MjcsMTkgJiM0Mzs0MDMwLDE3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAKIHZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbCkKIHsKLQl1bnNpZ25lZCBpbnQgdHlwZTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwogCXVuc2lnbmVkIGxvbmcgbnJfdG9fYmVfdW51c2VkID0gMDsKIAotCXNwaW5fbG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHsKLQkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF9pbmZvW3R5cGVdOwotCi0JCWlmICgoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9VU0VEKSAmYW1wOyZhbXA7ICEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSkKJiM0MzsJcGVyY3B1X2Rvd25fcmVhZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CWZvcl9lYWNoX3N3YXAoc2kpIHsKJiM0MzsJCWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfV1JJVEVPSykpCiAJCQlucl90b19iZV91bnVzZWQgJiM0Mzs9IHN3YXBfdXNhZ2VfaW5fcGFnZXMoc2kpOwogCX0KIAl2YWwtJmd0O2ZyZWVzd2FwID0gYXRvbWljX2xvbmdfcmVhZCgmYW1wO25yX3N3YXBfcGFnZXMpICYjNDM7IG5yX3RvX2JlX3VudXNlZDsKIAl2YWwtJmd0O3RvdGFsc3dhcCA9IHRvdGFsX3N3YXBfcGFnZXMgJiM0MzsgbnJfdG9fYmVfdW51c2VkOwotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJcGVyY3B1X3VwX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwogfQogCiAvKgpAQCAtMzg3OSw3ICYjNDM7NDA4MCw3IEBAIGludCBzd2FwX2R1cF9lbnRyeV9kaXJlY3Qoc3dwX2VudHJ5X3QgZW50cnkpCiAjaWYgZGVmaW5lZChDT05GSUdfTUVNQ0cpICZhbXA7JmFtcDsgZGVmaW5lZChDT05GSUdfQkxLX0NHUk9VUCkKIHN0YXRpYyBib29sIF9faGFzX3VzYWJsZV9zd2FwKHZvaWQpCiB7Ci0JcmV0dXJuICFwbGlzdF9oZWFkX2VtcHR5KCZhbXA7c3dhcF9hY3RpdmVfaGVhZCk7CiYjNDM7CXJldHVybiBSRUFEX09OQ0UodG90YWxfc3dhcF9wYWdlcykgJmd0OyAwOwogfQogCiB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKQpAQCAtMzkwMiwxNCAmIzQzOzQxMDMsMTQgQEAgdm9pZCBfX2ZvbGlvX3Rocm90dGxlX3N3YXByYXRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGdmcF90IGdmcCkKIAlpZiAoY3VycmVudC0mZ3Q7dGhyb3R0bGVfZGlzaykKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKLQlwbGlzdF9mb3JfZWFjaF9lbnRyeShzaSwgJmFtcDtzd2FwX2F2YWlsX2hlYWQsIGF2YWlsX2xpc3QpIHsKJiM0MzsJcGVyY3B1X2Rvd25fcmVhZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CWZvcl9lYWNoX2F2YWlsX3N3YXAoc2kpIHsKIAkJaWYgKHNpLSZndDtiZGV2KSB7CiAJCQlibGtjZ19zY2hlZHVsZV90aHJvdHRsZShzaS0mZ3Q7YmRldi0mZ3Q7YmRfZGlzaywgdHJ1ZSk7CiAJCQlicmVhazsKIAkJfQogCX0KLQlzcGluX3VubG9jaygmYW1wO3N3YXBfYXZhaWxfbG9jayk7CiYjNDM7CXBlcmNwdV91cF9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKIH0KICNlbmRpZgogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1ODYxCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogNDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFN3YXAgU3Vic3lzdGVtIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIOKAkyBhIHByZXR0eSBzaWduaWZpY2FudCBvbmUsIGl0IGxvb2tzIGxpa2Ug4oCTIHRoYXQmIzM5O3MgZnVuZGFtZW50YWxseSBjaGFuZ2luZyB0aGUgTGludXgga2VybmVsJiMzOTtzIHN3YXAgc3Vic3lzdGVtLiBJdCYjMzk7cyByZXBsYWNpbmcgdGhlIGN1cnJlbnQgYHBsaXN0YC1iYXNlZCBxdWV1ZSBmb3Igc3dhcCBkZXZpY2VzIHdpdGggYSBjdXN0b20gcm91bmQtcm9iaW4gaW1wbGVtZW50YXRpb24uICBJbW1lZGlhdGVseSwgSSBjYW4gdGVsbCB0aGlzIGlzIGdvaW5nIHRvIHRvdWNoIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHdoaWNoIGlzIGFsd2F5cyBhIHJlZCBmbGFnIGZvciBwb3RlbnRpYWwgaXNzdWVzLiBUaGUgZmFjdCB0aGF0IGl0JiMzOTtzIHJld3JpdGluZyBzbyBtdWNoIG9mIGBtbS9zd2FwZmlsZS5jYCDigJMgYW5kIHRoZW4gdG91Y2hpbmcgYWxsIHRob3NlIG90aGVyIGhlYWRlciBhbmQgc3VwcG9ydGluZyBmaWxlcyDigJMgIGBpbmNsdWRlL2xpbnV4L3N3YXAuaGAsIGBpbmNsdWRlL2xpbnV4L3BsaXN0LmhgLCBgbGliL3BsaXN0LmNgLCBhbmQgYG1tL3N3YXAuaGAg4oCTIHRlbGxzIG1lIHRoaXMgaXNuJiMzOTt0IGp1c3QgYSBtaW5vciB0d2Vhay4gIEl0JiMzOTtzIGEgZ2VudWluZSBhcmNoaXRlY3R1cmFsIGNoYW5nZS4gIFJlbW92aW5nIGBwbGlzdF9yZXF1ZXVlYCBpcyBhIGNsdWUsIHRvby4KClRoaXMgaW50cm9kdWN0aW9uIG9mIG5ldyBzdHJ1Y3R1cmVzIGxpa2UgYHN3YXBfcXVldWVfcmVhZGVyc2AsIGBzd2FwX3F1ZXVlYCwgYHN3YXBfcXVldWVfbGVuYCwgYHN3YXBfcHJpb19yaW5nYCwgYWxvbmcgd2l0aCB0aGUgdXNlIG9mIGBzd2Fwb25fcndzZW1gIHRvIHJlcGxhY2UgdGhlIG9sZCBsb2NraW5nIG1lY2hhbmlzbXMsIGluZGljYXRlcyBhIHJlLXRoaW5raW5nIG9mIGhvdyBzd2FwIHNwYWNlIGlzIGFsbG9jYXRlZCBhbmQgbWFuYWdlZC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhICptYWpvciogZnVuY3Rpb25hbCBjaGFuZ2UgdG8gdGhlIHZlcnkgY29yZSBvZiBzd2FwIGFsbG9jYXRpb24gbG9naWMuCgpNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgJiMzNDtUaGlzIG5lZWRzIHNvbWUgc2VyaW91cyBmdXp6aW5nLiYjMzQ7ICBHaXZlbiB0aGUgcG90ZW50aWFsIGZvciBtZW1vcnkgY29ycnVwdGlvbiwgcmFjZSBjb25kaXRpb25zLCBvciB1bmV4cGVjdGVkIGJlaGF2aW9yIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcywgSSB3YW50IHRvIHplcm8gaW4gb24gdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQuICBMZXQmIzM5O3Mgc2VlOgoKKiAgIGBzd2FwX2FsbG9jX2VudHJ5YCAoYW5kIGl0cyByZXBsYWNlbWVudHMgb2YgYHN3YXBfYWxsb2NfZmFzdGAgYW5kIGBzd2FwX2FsbG9jX3Nsb3dgKSDigJMgVGhpcyBpcyBteSBwcmltYXJ5IGFyZWEgb2YgaW50ZXJlc3QsIGl0JiMzOTtzIHdoZXJlIHRoZSBzd2FwIGVudHJ5IGFsbG9jYXRpb24gYWN0dWFsbHkgaGFwcGVucy4KKiAgIGBmb2xpb19hbGxvY19zd2FwYCDigJMgYW5vdGhlciBjcml0aWNhbCBlbnRyeSBwb2ludC4KKiAgIFRoZSBxdWV1ZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zOiBgc3dhcF9xdWV1ZV9hZGRgLCBgc3dhcF9xdWV1ZV9kZWxgLCBgc3dhcF9xdWV1ZV9nZXRfZGV2aWNlYCAtIHRoZXNlIGFyZSB0aGUgcG9pbnRzIG9mIGludGVyYWN0aW9ucyB3aXRoIHRoZSBuZXcgc3RydWN0dXJlcy4KKiAgIGBzd2FwX2RldmljZV9lbmFibGVgLCBgc3dhcF9kZXZpY2VfZGlzYWJsZWAgLSB0aGUgcG9pbnRzIG9mIGRldmljZSBjaGFuZ2UgYXJlIGRlZmluaXRlbHkgd29ydGggY2hlY2tpbmcuCiogICBgc3lzX3N3YXBvbmAsIGBzeXNfc3dhcG9mZmAg4oCTIFRoZSB1c2VyLXNwYWNlIGludGVyZmFjZSBpcyBhbHdheXMgYSBnb29kIHRhcmdldC4KKiAgIFRoZSBgc3dhcF9kZXZpY2VfaW51c2VfKmAgZnVuY3Rpb25zIOKAkyB0aGVzZSBhcmUgbGlrZWx5IHRoZSBwbGFjZSB3aGVyZSB0aGUgb2xkIGxvY2tpbmcgd2FzLCB0aGlzIGlzIGFsc28gY3J1Y2lhbC4KKiAgIGBhZGRfdG9fYXZhaWxfbGlzdGAsIGBkZWxfZnJvbV9hdmFpbF9saXN0YCDigJMgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gbG9vayBhdCB0aGUgbmV3IGxpc3QgbWFuaXB1bGF0aW9uLgoqICAgVGhlIG5ldyBxdWV1ZSBtYXNrIGZ1bmN0aW9ucyBgc3dhcF9xdWV1ZV9tYXNrYCwgYHN3YXBfcXVldWVfdW5tYXNrYAoqICAgYGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeWAKCkFscmlnaHQsIEkmIzM5O2xsIG5lZWQgdG8gZmlndXJlIG91dCBhbnkgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLCBhcyB3ZWxsLiBTaW5jZSB0aGlzIGlzIGluIGBtbS9zd2FwZmlsZS5jYCwgaXQmIzM5O3MgYWxtb3N0IGNlcnRhaW5seSBjb250cm9sbGVkIGJ5IGBDT05GSUdfU1dBUGAuIEkgc2hvdWxkIGNoZWNrIHRoZSBgbW0vTWFrZWZpbGVgIHRvIGNvbmZpcm0sIGJ1dCB0aGF0JiMzOTtzIGEgZ2l2ZW4uIEkgYW0gZWFnZXIgdG8gZ2V0IHN0YXJ0ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMDA6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3dhcGZpbGUubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTc2PWVuZGlmXG5tbS9NYWtlZmlsZS03Ny1cbm1tL01ha2VmaWxlOjc4Om9iai0kKENPTkZJR19TV0FQKVx0JiM0Mzs9IHBhZ2VfaW8ubyBzd2FwX3N0YXRlLm8gc3dhcGZpbGUub1xubW0vTWFrZWZpbGUtNzktb2JqLSQoQ09ORklHX1pTV0FQKVx0JiM0Mzs9IHpzd2FwLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAwMDo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzA1OQoJCQkJCQkJb3V0cHV0OiA1NgoJCQkJCQkJdGhvdWdodHM6IDIzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlIFN3YXAgQ29uZmlndXJhdGlvbiBEZXBlbmRlbmN5KioKCkFscmlnaHQsIGl0JiMzOTtzIGNsZWFyIHRoYXQgYENPTkZJR19TV0FQYCBpcyBhIHByZXJlcXVpc2l0ZSBoZXJlLiBUaGF0JiMzOTtzIHRoZSBiYXNlbGluZS4gTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29yZSBsb2dpYyB0aGlzIGNoYW5nZSBpcyB0b3VjaGluZy4gVGhlIG1vc3QgcmVsZXZhbnQgZnVuY3Rpb25zIHNlZW0gdG8gYmUgY2VudGVyZWQgYXJvdW5kIHF1ZXVpbmcsIGRldmljZSBtYW5hZ2VtZW50LCBhbmQgYWxsb2NhdGlvbi4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIHRoaW5raW5nIGFib3V0IGBzd2FwX3F1ZXVlX2FkZGAsIGBzd2FwX3F1ZXVlX2RlbGAsIGBzd2FwX3F1ZXVlX2dldF9kZXZpY2VgLCBgc3dhcF9kZXZpY2VfZW5hYmxlYCwgYHN3YXBfZGV2aWNlX2Rpc2FibGVgLCBgc3dhcF9hbGxvY19lbnRyeWAsIGBzd2FwX2RldmljZV9pbnVzZV9hZGRgLCBgc3dhcF9kZXZpY2VfaW51c2Vfc3ViYCwgYGFkZF90b19hdmFpbF9saXN0YCwgYGRlbF9mcm9tX2F2YWlsX2xpc3RgLCBgc3dhcF9xdWV1ZV9tYXNrYCwgYW5kIGBzd2FwX3F1ZXVlX3VubWFza2AuIFRoZXNlIGFsbCBzZWVtIHRvIHJlc2lkZSB3aXRoaW4gYG1tL3N3YXBmaWxlLmNgLCB3aGljaCBtYWtlcyBzZW5zZS4KCkl0IGxvb2tzIGxpa2UgdGhlIGNoYW5nZSBpbnRlcmFjdHMgd2l0aCBgQ09ORklHX0hJQkVSTkFUSU9OYCB0b28sIGFsc28gaW4gYG1tL3N3YXBmaWxlLmNgLCBhbmQgdGhhdCYjMzk7cyBicmluZ2luZyBpbiBmdW5jdGlvbnMgbGlrZSBgcGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZWAsIGB1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGVgLCBgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGVgLCBgZmluZF9maXJzdF9zd2FwYCwgYW5kIGBjb3VudF9zd2FwX3BhZ2VzYC4gV2hpbGUgaGliZXJuYXRpb24gaXMgaW52b2x2ZWQsIGl0IGFwcGVhcnMgdGhlIGNlbnRyYWwgZm9jdXMgaXMgcmVhbGx5IHRoZSBtZWNoYW5pY3Mgb2Ygc3dhcCBhbGxvY2F0aW9uIGl0c2VsZi4gVGhpcyByZWluZm9yY2VzIG15IGluaXRpYWwgaHVuY2ggYWJvdXQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyBpbnZvbHZlZCwgSSBuZWVkIHRvIGZvY3VzIG9uIHRoaXMgcGFydCB0byBwcm9jZWVkLiBMZXQmIzM5O3MgZ2V0IGRvd24gdG8gc3BlY2lmaWNzLCBJIG5lZWQgdG8gcHVsbCB1cCB0aGlzIGxpc3Qgb2YgZnVuY3Rpb25zIGFnYWluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAwOjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O14oc3RhdGljICk/KGludHx2b2lkfGJvb2x8c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgXFwqKSBbYS16QS1aMC05X10mIzQzO1xcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL3N3YXBmaWxlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcGZpbGUuYy01MC1cbm1tL3N3YXBmaWxlLmM6NTE6c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtNTItXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKTtcbm1tL3N3YXBmaWxlLmM6NTM6c3RhdGljIGJvb2wgZm9saW9fc3dhcGNhY2hlX2ZyZWVhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xubW0vc3dhcGZpbGUuYzo1NDpzdGF0aWMgdm9pZCBtb3ZlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy01NS1cdFx0XHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbm1tL3N3YXBmaWxlLmMtNTYtXHRcdFx0IGVudW0gc3dhcF9jbHVzdGVyX2ZsYWdzIG5ld19mbGFncyk7XG5tbS9zd2FwZmlsZS5jOjU3OnN0YXRpYyBib29sIGdldF9zd2FwX2RldmljZV9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSk7XG5tbS9zd2FwZmlsZS5jLTU4LVxuLS1cbm1tL3N3YXBmaWxlLmM9MjA4PXN0YXRpYyBzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhpbnQgbnJfcmluZ3MsIGdmcF90IGdmcClcbi0tXG5tbS9zd2FwZmlsZS5jLTIxOS1cbm1tL3N3YXBmaWxlLmM6MjIwOnN0YXRpYyB2b2lkIHN3YXBfcXVldWVfaW5zdGFsbF9yZWFkZXJzKHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqcmVhZGVycylcbm1tL3N3YXBmaWxlLmMtMjIxLXtcbi0tXG5tbS9zd2FwZmlsZS5jPTI0Mj1zdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfcXVldWVfZ2V0X2RldmljZShsb25nIG5yX2FsbG9jLCBpbnQgbnJfaXRlcilcbi0tXG5tbS9zd2FwZmlsZS5jLTI4NS1cbm1tL3N3YXBmaWxlLmM6Mjg2OnN0YXRpYyBib29sIHN3YXBfcXVldWVfZmluZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTI4Ny1cdFx0XHQgICAgdW5zaWduZWQgaW50ICpyaW5nX2lkeCwgdW5zaWduZWQgaW50ICpkZXZfaWR4KVxuLS1cbm1tL3N3YXBmaWxlLmMtMzA5LVxubW0vc3dhcGZpbGUuYzozMTA6c3RhdGljIHZvaWQgc3dhcF9xdWV1ZV9tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbm1tL3N3YXBmaWxlLmMtMzExLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTMxOS1cbm1tL3N3YXBmaWxlLmM6MzIwOnN0YXRpYyB2b2lkIHN3YXBfcXVldWVfdW5tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbm1tL3N3YXBmaWxlLmMtMzIxLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTMyOS1cbm1tL3N3YXBmaWxlLmM6MzMwOnN0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxubW0vc3dhcGZpbGUuYy0zMzEte1xuLS1cbm1tL3N3YXBmaWxlLmMtNDA1LVxubW0vc3dhcGZpbGUuYzo0MDY6c3RhdGljIHZvaWQgc3dhcF9xdWV1ZV9kZWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxubW0vc3dhcGZpbGUuYy00MDcte1xuLS1cbm1tL3N3YXBmaWxlLmM9NDg5PXN0YXRpYyBsb25nIHN3YXBfdXNhZ2VfaW5fcGFnZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuLS1cbm1tL3N3YXBmaWxlLmMtNDk3LSAqL1xubW0vc3dhcGZpbGUuYzo0OTg6c3RhdGljIHZvaWQgc3dhcF9hbGxvY19sb2NrX2RldmljZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5tbS9zd2FwZmlsZS5jLTQ5OS17XG4tLVxubW0vc3dhcGZpbGUuYy01MDUtXG5tbS9zd2FwZmlsZS5jOjUwNjpzdGF0aWMgdm9pZCBzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxubW0vc3dhcGZpbGUuYy01MDcte1xuLS1cbm1tL3N3YXBmaWxlLmMtNTIzLVxubW0vc3dhcGZpbGUuYzo1MjQ6c3RhdGljIGJvb2wgc3dhcF9vbmx5X2hhc19jYWNoZShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcGZpbGUuYy01MjUtXHRcdFx0XHR1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IG5yX3BhZ2VzKVxuLS1cbm1tL3N3YXBmaWxlLmMtNTQ1LSAqL1xubW0vc3dhcGZpbGUuYzo1NDY6c3RhdGljIGludCBfX3RyeV90b19yZWNsYWltX3N3YXAoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy01NDctXHRcdFx0XHQgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpXG4tLVxubW0vc3dhcGZpbGUuYz02MTY9c3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9leHRlbnQgKm5leHRfc2Uoc3RydWN0IHN3YXBfZXh0ZW50ICpzZSlcbi0tXG5tbS9zd2FwZmlsZS5jLTYyNS0gKi9cbm1tL3N3YXBmaWxlLmM6NjI2OnN0YXRpYyBpbnQgZGlzY2FyZF9zd2FwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbm1tL3N3YXBmaWxlLmMtNjI3LXtcbi0tXG5tbS9zd2FwZmlsZS5jPTY3OT1zZWN0b3JfdCBzd2FwX2ZvbGlvX3NlY3RvcihzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3N3YXBmaWxlLmMtNjk1LSAqL1xubW0vc3dhcGZpbGUuYzo2OTY6c3RhdGljIHZvaWQgZGlzY2FyZF9zd2FwX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy02OTctXHRcdFx0XHQgcGdvZmZfdCBzdGFydF9wYWdlLCBwZ29mZl90IG5yX3BhZ2VzKVxuLS1cbm1tL3N3YXBmaWxlLmM9NzU1PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNsdXN0ZXJfb2Zmc2V0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTc2MC1cbm1tL3N3YXBmaWxlLmM6NzYxOnN0YXRpYyB2b2lkIHN3YXBfY2x1c3Rlcl9mcmVlX3RhYmxlX2ZvbGlvX3JjdV9jYihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpXG5tbS9zd2FwZmlsZS5jLTc2Mi17XG4tLVxubW0vc3dhcGZpbGUuYy03NjgtXG5tbS9zd2FwZmlsZS5jOjc2OTpzdGF0aWMgdm9pZCBzd2FwX2NsdXN0ZXJfZnJlZV90YWJsZShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxubW0vc3dhcGZpbGUuYy03NzAte1xuLS1cbm1tL3N3YXBmaWxlLmMtNzk2LVxubW0vc3dhcGZpbGUuYzo3OTc6c3RhdGljIGludCBzd2FwX2NsdXN0ZXJfYWxsb2NfdGFibGUoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgZ2ZwX3QgZ2ZwKVxubW0vc3dhcGZpbGUuYy03OTgte1xuLS1cbm1tL3N3YXBmaWxlLmMtODQ1LSAqL1xubW0vc3dhcGZpbGUuYzo4NDY6c3RhdGljIHZvaWQgc3dhcF9jbHVzdGVyX2Fzc2VydF9lbXB0eShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcGZpbGUuYy04NDctXHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgY2lfb2ZmLCB1bnNpZ25lZCBpbnQgbnIsXG4tLVxubW0vc3dhcGZpbGUuYz04NzU9c3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTkyMy1cbm1tL3N3YXBmaWxlLmM6OTI0OnN0YXRpYyB2b2lkIG1vdmVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTkyNS1cdFx0XHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbi0tXG5tbS9zd2FwZmlsZS5jLTk0Mi0vKiBBZGQgYSBjbHVzdGVyIHRvIGRpc2NhcmQgbGlzdCBhbmQgc2NoZWR1bGUgaXQgdG8gZG8gZGlzY2FyZCAqL1xubW0vc3dhcGZpbGUuYzo5NDM6c3RhdGljIHZvaWQgc3dhcF9jbHVzdGVyX3NjaGVkdWxlX2Rpc2NhcmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy05NDQtXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXG4tLVxubW0vc3dhcGZpbGUuYy05NTAtXG5tbS9zd2FwZmlsZS5jOjk1MTpzdGF0aWMgdm9pZCBfX2ZyZWVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXG5tbS9zd2FwZmlsZS5jLTk1Mi17XG4tLVxubW0vc3dhcGZpbGUuYz05Njg9c3RhdGljIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqaXNvbGF0ZV9sb2NrX2NsdXN0ZXIoXG4tLVxubW0vc3dhcGZpbGUuYy0xMDA3LSAqL1xubW0vc3dhcGZpbGUuYzoxMDA4OnN0YXRpYyBib29sIHN3YXBfZG9fc2NoZWR1bGVkX2Rpc2NhcmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxubW0vc3dhcGZpbGUuYy0xMDA5LXtcbi0tXG5tbS9zd2FwZmlsZS5jLTEwNDItXG5tbS9zd2FwZmlsZS5jOjEwNDM6c3RhdGljIHZvaWQgc3dhcF9kaXNjYXJkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxubW0vc3dhcGZpbGUuYy0xMDQ0LXtcbi0tXG5tbS9zd2FwZmlsZS5jLTEwNTEtXG5tbS9zd2FwZmlsZS5jOjEwNTI6c3RhdGljIHZvaWQgc3dhcF91c2Vyc19yZWZfZnJlZShzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmKVxubW0vc3dhcGZpbGUuYy0xMDUzLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTEwNjMtICovXG5tbS9zd2FwZmlsZS5jOjEwNjQ6c3RhdGljIHZvaWQgZnJlZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSlcbm1tL3N3YXBmaWxlLmMtMTA2NS17XG4tLVxubW0vc3dhcGZpbGUuYy0xMDg3LSAqL1xubW0vc3dhcGZpbGUuYzoxMDg4OnN0YXRpYyB2b2lkIHBhcnRpYWxfZnJlZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTA4OS1cdFx0XHRcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxuLS1cbm1tL3N3YXBmaWxlLmMtMTEwMy0gKi9cbm1tL3N3YXBmaWxlLmM6MTEwNDpzdGF0aWMgdm9pZCByZWxvY2F0ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTEwNS1cdFx0XHQgICAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXG4tLVxubW0vc3dhcGZpbGUuYy0xMTMxLSAqL1xubW0vc3dhcGZpbGUuYzoxMTMyOnN0YXRpYyBpbnQgc3dhcF9jbHVzdGVyX3NldHVwX2JhZF9zbG90KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTEzMy1cdFx0XHRcdCAgICAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcbi0tXG5tbS9zd2FwZmlsZS5jLTExODEtICovXG5tbS9zd2FwZmlsZS5jOjExODI6c3RhdGljIGJvb2wgY2x1c3Rlcl9yZWNsYWltX3JhbmdlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTE4My1cdFx0XHRcdCAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTEyMjgtXG5tbS9zd2FwZmlsZS5jOjEyMjk6c3RhdGljIGJvb2wgY2x1c3Rlcl9zY2FuX3JhbmdlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTIzMC1cdFx0XHQgICAgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTEyNTUtXG5tbS9zd2FwZmlsZS5jOjEyNTY6c3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTEyNTctXHRcdFx0XHRcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuLS1cbm1tL3N3YXBmaWxlLmM9MTM1OD1zdGF0aWMgdW5zaWduZWQgaW50IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTEzNzktXG5tbS9zd2FwZmlsZS5jOjEzODA6c3RhdGljIHZvaWQgc3dhcF9yZWNsYWltX2Z1bGxfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIGZvcmNlKVxubW0vc3dhcGZpbGUuYy0xMzgxLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTE0MjEtXG5tbS9zd2FwZmlsZS5jOjE0MjI6c3RhdGljIHZvaWQgc3dhcF9yZWNsYWltX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxubW0vc3dhcGZpbGUuYy0xNDIzLXtcbi0tXG5tbS9zd2FwZmlsZS5jPTE0MzU9c3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTE1MzctLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBzZXQgYnkgdGhpcyBoZWxwZXIuICovXG5tbS9zd2FwZmlsZS5jOjE1Mzg6c3RhdGljIHZvaWQgZGVsX2Zyb21fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9mZilcbm1tL3N3YXBmaWxlLmMtMTUzOS17XG4tLVxubW0vc3dhcGZpbGUuYy0xNTY1LS8qIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgY2FuIG9ubHkgYmUgY2xlYXJlZCBieSB0aGlzIGhlbHBlci4gKi9cbm1tL3N3YXBmaWxlLmM6MTU2NjpzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5tbS9zd2FwZmlsZS5jLTE1Njcte1xuLS1cbm1tL3N3YXBmaWxlLmMtMTYxMC0gKi9cbm1tL3N3YXBmaWxlLmM6MTYxMTpzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy0xNjEyLVx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcylcbi0tXG5tbS9zd2FwZmlsZS5jLTE2MjktXG5tbS9zd2FwZmlsZS5jOjE2MzA6c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2Vfc3ViKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXG5tbS9zd2FwZmlsZS5jLTE2MzEtXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuLS1cbm1tL3N3YXBmaWxlLmMtMTY2OC1cbm1tL3N3YXBmaWxlLmM6MTY2OTpzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5tbS9zd2FwZmlsZS5jLTE2NzAte1xuLS1cbm1tL3N3YXBmaWxlLmMtMTY4NC1cbm1tL3N3YXBmaWxlLmM6MTY4NTpzdGF0aWMgaW50IHN3YXBfYWxsb2NfZW50cnkoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXBmaWxlLmMtMTY4Ni17XG4tLVxubW0vc3dhcGZpbGUuYy0xNzIwLVxubW0vc3dhcGZpbGUuYzoxNzIxOnN0YXRpYyBpbnQgc3dhcF9leHRlbmRfdGFibGVfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy0xNzIyLVx0XHRcdFx0ICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTE3NTYtXG5tbS9zd2FwZmlsZS5jOjE3NTc6aW50IHN3YXBfcmV0cnlfdGFibGVfYWxsb2Moc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcClcbm1tL3N3YXBmaWxlLmMtMTc1OC17XG4tLVxubW0vc3dhcGZpbGUuYy0xNzc0LVxubW0vc3dhcGZpbGUuYzoxNzc1OnN0YXRpYyB2b2lkIHN3YXBfZXh0ZW5kX3RhYmxlX3RyeV9mcmVlKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXG5tbS9zd2FwZmlsZS5jLTE3NzYte1xuLS1cbm1tL3N3YXBmaWxlLmMtMTc5NC0vKiBEZWNyZWFzZSB0aGUgc3dhcCBjb3VudCBvZiBvbmUgc2xvdCwgd2l0aG91dCBmcmVlaW5nIGl0ICovXG5tbS9zd2FwZmlsZS5jOjE3OTU6c3RhdGljIHZvaWQgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5KHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwZmlsZS5jLTE3OTYtXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGNpX29mZilcbi0tXG5tbS9zd2FwZmlsZS5jLTE4NDUtICovXG5tbS9zd2FwZmlsZS5jOjE4NDY6c3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTg0Ny1cdFx0XHRcdCAgICAgcGdvZmZfdCBvZmZzZXQsIGludCBucixcbi0tXG5tbS9zd2FwZmlsZS5jLTE5MDItLyogSW5jcmVhc2UgdGhlIHN3YXAgY291bnQgb2Ygb25lIHNsb3QuICovXG5tbS9zd2FwZmlsZS5jOjE5MDM6c3RhdGljIGludCBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXBmaWxlLmMtMTkwNC1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgY2lfb2ZmKVxuLS1cbm1tL3N3YXBmaWxlLmMtMTk1Mi0gKi9cbm1tL3N3YXBmaWxlLmM6MTk1MzpzdGF0aWMgaW50IHN3YXBfZHVwX2VudHJpZXNfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTE5NTQtXHRcdFx0XHQgICAgcGdvZmZfdCBvZmZzZXQsIGludCBucilcbi0tXG5tbS9zd2FwZmlsZS5jLTE5OTctICovXG5tbS9zd2FwZmlsZS5jOjE5OTg6aW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXBmaWxlLmMtMTk5OS17XG4tLVxubW0vc3dhcGZpbGUuYy0yMDUzLSAqL1xubW0vc3dhcGZpbGUuYzoyMDU0OmludCBmb2xpb19kdXBfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSlcbm1tL3N3YXBmaWxlLmMtMjA1NS17XG4tLVxubW0vc3dhcGZpbGUuYy0yMDc5LSAqL1xubW0vc3dhcGZpbGUuYzoyMDgwOnZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXG5tbS9zd2FwZmlsZS5jLTIwODEte1xuLS1cbm1tL3N3YXBmaWxlLmM9MjEzND1zdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZ2V0X3N3YXBfZGV2aWNlKHN3cF9lbnRyeV90IGVudHJ5KVxuLS1cbm1tL3N3YXBmaWxlLmMtMjE2NC0gKi9cbm1tL3N3YXBmaWxlLmM6MjE2NTp2b2lkIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTIxNjYtXHRcdFx0XHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTIyMTUtXG5tbS9zd2FwZmlsZS5jOjIyMTY6aW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbm1tL3N3YXBmaWxlLmMtMjIxNy17XG4tLVxubW0vc3dhcGZpbGUuYy0yMjI4LSAqL1xubW0vc3dhcGZpbGUuYzoyMjI5OmJvb2wgc3dhcF9lbnRyeV9zd2FwcGVkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3dwX2VudHJ5X3QgZW50cnkpXG5tbS9zd2FwZmlsZS5jLTIyMzAte1xuLS1cbm1tL3N3YXBmaWxlLmMtMjI0NS0gKi9cbm1tL3N3YXBmaWxlLmM6MjI0NjppbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbm1tL3N3YXBmaWxlLmMtMjI0Ny17XG4tLVxubW0vc3dhcGZpbGUuYy0yMjc4LSAqL1xubW0vc3dhcGZpbGUuYzoyMjc5OnN0YXRpYyBib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXBmaWxlLmMtMjI4MC17XG4tLVxubW0vc3dhcGZpbGUuYy0yMzA3LVxubW0vc3dhcGZpbGUuYzoyMzA4OnN0YXRpYyBib29sIGZvbGlvX3N3YXBjYWNoZV9mcmVlYWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxubW0vc3dhcGZpbGUuYy0yMzA5LXtcbi0tXG5tbS9zd2FwZmlsZS5jLTIzNDYtICovXG5tbS9zd2FwZmlsZS5jOjIzNDc6Ym9vbCBmb2xpb19mcmVlX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXBmaWxlLmMtMjM0OC17XG4tLVxubW0vc3dhcGZpbGUuYy0yMzcxLSAqL1xubW0vc3dhcGZpbGUuYzoyMzcyOnZvaWQgc3dhcF9wdXRfZW50cmllc19kaXJlY3Qoc3dwX2VudHJ5X3QgZW50cnksIGludCBucilcbm1tL3N3YXBmaWxlLmMtMjM3My17XG4tLVxubW0vc3dhcGZpbGUuYz0yNDA3PXN3cF9lbnRyeV90IHN3YXBfYWxsb2NfaGliZXJuYXRpb25fc2xvdChpbnQgdHlwZSlcbi0tXG5tbS9zd2FwZmlsZS5jLTI0MjktICovXG5tbS9zd2FwZmlsZS5jOjI0MzA6dm9pZCBzd2FwX2ZyZWVfaGliZXJuYXRpb25fc2xvdChzd3BfZW50cnlfdCBlbnRyeSlcbm1tL3N3YXBmaWxlLmMtMjQzMS17XG4tLVxubW0vc3dhcGZpbGUuYy0yNDQ0LVxubW0vc3dhcGZpbGUuYzoyNDQ1OnN0YXRpYyBpbnQgX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldClcbm1tL3N3YXBmaWxlLmMtMjQ0Ni17XG4tLVxubW0vc3dhcGZpbGUuYy0yNDc4LSAqL1xubW0vc3dhcGZpbGUuYzoyNDc5OmludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxubW0vc3dhcGZpbGUuYy0yNDgwLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTI1MjEtICovXG5tbS9zd2FwZmlsZS5jOjI1MjI6dm9pZCB1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoaW50IHR5cGUpXG5tbS9zd2FwZmlsZS5jLTI1MjMte1xuLS1cbm1tL3N3YXBmaWxlLmMtMjU1MC0gKi9cbm1tL3N3YXBmaWxlLmM6MjU1MTppbnQgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG5tbS9zd2FwZmlsZS5jLTI1NTIte1xuLS1cbm1tL3N3YXBmaWxlLmMtMjU2MS1cbm1tL3N3YXBmaWxlLmM6MjU2MjppbnQgZmluZF9maXJzdF9zd2FwKGRldl90ICpkZXZpY2UpXG5tbS9zd2FwZmlsZS5jLTI1NjMte1xuLS1cbm1tL3N3YXBmaWxlLmM9MjYxOT1zdGF0aWMgaW5saW5lIGludCBwdGVfc2FtZV9hc19zd3AocHRlX3QgcHRlLCBwdGVfdCBzd3BfcHRlKVxuLS1cbm1tL3N3YXBmaWxlLmMtMjYyOC0gKi9cbm1tL3N3YXBmaWxlLmM6MjYyOTpzdGF0aWMgaW50IHVudXNlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbm1tL3N3YXBmaWxlLmMtMjYzMC1cdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9zd2FwZmlsZS5jLTI3NDEtXG5tbS9zd2FwZmlsZS5jOjI3NDI6c3RhdGljIGludCB1bnVzZV9wdGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG5tbS9zd2FwZmlsZS5jLTI3NDMtXHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbi0tXG5tbS9zd2FwZmlsZS5jPTI4NTA9c3RhdGljIGlubGluZSBpbnQgdW51c2VfcDRkX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ2RfdCAqcGdkLFxuLS1cbm1tL3N3YXBmaWxlLmMtMjg2OS1cbm1tL3N3YXBmaWxlLmM6Mjg3MDpzdGF0aWMgaW50IHVudXNlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgaW50IHR5cGUpXG5tbS9zd2FwZmlsZS5jLTI4NzEte1xuLS1cbm1tL3N3YXBmaWxlLmMtMjg5MC1cbm1tL3N3YXBmaWxlLmM6Mjg5MTpzdGF0aWMgaW50IHVudXNlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBpbnQgdHlwZSlcbm1tL3N3YXBmaWxlLmMtMjg5Mi17XG4tLVxubW0vc3dhcGZpbGUuYz0yOTE5PXN0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9uZXh0X3RvX3VudXNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTI5NDUtXG5tbS9zd2FwZmlsZS5jOjI5NDY6c3RhdGljIGludCB0cnlfdG9fdW51c2UodW5zaWduZWQgaW50IHR5cGUpXG5tbS9zd2FwZmlsZS5jLTI5NDcte1xuLS1cbm1tL3N3YXBmaWxlLmMtMzA1My0gKi9cbm1tL3N3YXBmaWxlLmM6MzA1NDpzdGF0aWMgdm9pZCBkcmFpbl9tbWxpc3Qodm9pZClcbm1tL3N3YXBmaWxlLmMtMzA1NS17XG4tLVxubW0vc3dhcGZpbGUuYy0zMDcyLSAqL1xubW0vc3dhcGZpbGUuYzozMDczOnN0YXRpYyB2b2lkIGRlc3Ryb3lfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG5tbS9zd2FwZmlsZS5jLTMwNzQtXHRcdFx0XHQgc3RydWN0IGZpbGUgKnN3YXBfZmlsZSlcbi0tXG5tbS9zd2FwZmlsZS5jPTMxMzg9RVhQT1JUX1NZTUJPTF9HUEwoYWRkX3N3YXBfZXh0ZW50KTtcbi0tXG5tbS9zd2FwZmlsZS5jLTMxNjYtICovXG5tbS9zd2FwZmlsZS5jOjMxNjc6c3RhdGljIGludCBzZXR1cF9zd2FwX2V4dGVudHMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyxcbm1tL3N3YXBmaWxlLmMtMzE2OC1cdFx0XHQgICAgICBzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlLCBzZWN0b3JfdCAqc3Bhbilcbi0tXG5tbS9zd2FwZmlsZS5jLTMxOTktICovXG5tbS9zd2FwZmlsZS5jOjMyMDA6c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfZW5hYmxlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbm1tL3N3YXBmaWxlLmMtMzIwMS17XG4tLVxubW0vc3dhcGZpbGUuYy0zMjEyLVxubW0vc3dhcGZpbGUuYzozMjEzOnN0YXRpYyBpbnQgc3dhcF9kZXZpY2VfZGlzYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5tbS9zd2FwZmlsZS5jLTMyMTQte1xuLS1cbm1tL3N3YXBmaWxlLmMtMzI1Ni1cbm1tL3N3YXBmaWxlLmM6MzI1NzpzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLFxubW0vc3dhcGZpbGUuYy0zMjU4LVx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcbi0tXG5tbS9zd2FwZmlsZS5jPTM0Mjk9c3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuLS1cbm1tL3N3YXBmaWxlLmMtMzQ0OC1cbm1tL3N3YXBmaWxlLmM6MzQ0OTpzdGF0aWMgdm9pZCBzd2FwX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxubW0vc3dhcGZpbGUuYy0zNDUwLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTM0NTMtXG5tbS9zd2FwZmlsZS5jOjM0NTQ6c3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxubW0vc3dhcGZpbGUuYy0zNDU1LXtcbi0tXG5tbS9zd2FwZmlsZS5jPTM0ODE9c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzd2Fwc19vcCA9IHtcbi0tXG5tbS9zd2FwZmlsZS5jLTM0ODctXG5tbS9zd2FwZmlsZS5jOjM0ODg6c3RhdGljIGludCBzd2Fwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxubW0vc3dhcGZpbGUuYy0zNDg5LXtcbi0tXG5tbS9zd2FwZmlsZS5jPTM1Mjg9c3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICphbGxvY19zd2FwX2luZm8odm9pZClcbi0tXG5tbS9zd2FwZmlsZS5jLTM1ODQtXG5tbS9zd2FwZmlsZS5jOjM1ODU6c3RhdGljIGludCBjbGFpbV9zd2FwZmlsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG5tbS9zd2FwZmlsZS5jLTM1ODYte1xuLS1cbm1tL3N3YXBmaWxlLmM9MzY0Mj1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbi0tXG5tbS9zd2FwZmlsZS5jLTM3MDMtXG5tbS9zd2FwZmlsZS5jOjM3MDQ6c3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy0zNzA1LVx0XHRcdFx0ICAgIHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbi0tXG5tbS9zd2FwZmlsZS5jPTM3OTc9U1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbi0tXG5tbS9zd2FwZmlsZS5jLTQwMzAtXG5tbS9zd2FwZmlsZS5jOjQwMzE6dm9pZCBzaV9zd2FwaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqdmFsKVxubW0vc3dhcGZpbGUuYy00MDMyLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTQwNTktICovXG5tbS9zd2FwZmlsZS5jOjQwNjA6aW50IHN3YXBfZHVwX2VudHJ5X2RpcmVjdChzd3BfZW50cnlfdCBlbnRyeSlcbm1tL3N3YXBmaWxlLmMtNDA2MS17XG4tLVxubW0vc3dhcGZpbGUuYy00MDgwLSNpZiBkZWZpbmVkKENPTkZJR19NRU1DRykgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX0JMS19DR1JPVVApXG5tbS9zd2FwZmlsZS5jOjQwODE6c3RhdGljIGJvb2wgX19oYXNfdXNhYmxlX3N3YXAodm9pZClcbm1tL3N3YXBmaWxlLmMtNDA4Mi17XG4tLVxubW0vc3dhcGZpbGUuYy00MDg1LVxubW0vc3dhcGZpbGUuYzo0MDg2OnZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXG5tbS9zd2FwZmlsZS5jLTQwODcte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAwOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzODA1CgkJCQkJCQlvdXRwdXQ6IDE5OQoJCQkJCQkJdGhvdWdodHM6IDU3OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciBUaGlzIFN3YXAgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBzY2FuIGhhcyBoaWdobGlnaHRlZCBhIGhhbmRmdWwgb2YgZnVuY3Rpb25zIGFzIHBvdGVudGlhbCBob3RzcG90cyBpbiB0aGlzIHN3YXAgaW1wbGVtZW50YXRpb24uIEdpdmVuIHRoZSBhcmNoaXRlY3R1cmFsIGNoYW5nZSBkZXNjcmliZWQg4oCTIG1vdmluZyBmcm9tIGEgYHBsaXN0YCB0byBhIHJvdW5kLXJvYmluIHF1ZXVlIOKAkyBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGFyZWFzIHdoZXJlIHRoaXMgbmV3IGxvZ2ljIGlzIGludHJvZHVjZWQgYW5kIGludGVyYWN0cyB3aXRoIHRoZSBleGlzdGluZyBzd2FwIGZyYW1ld29yay4KCkkmIzM5O20gemVyb2luZyBpbiBvbiBhIGZldyBrZXkgZnVuY3Rpb25zOiBgc3dhcF9hbGxvY19lbnRyeWAgbG9va3MgbGlrZSB0aGUgbmV3IGNvcmUgZm9yIGFsbG9jYXRpb24sIHJlcGxhY2luZyBzb21lIG9mIHRoZSBvbGRlciBsb2dpYy4gSSYjMzk7bSBhbHNvIHB1dHRpbmcgYSBwaW4gb24gYHN3YXBfcXVldWVfYWRkYCwgYHN3YXBfcXVldWVfZGVsYCwgYHN3YXBfcXVldWVfZ2V0X2RldmljZWAsIGBzd2FwX2RldmljZV9lbmFibGVgLCBhbmQgYHN3YXBfZGV2aWNlX2Rpc2FibGVgIGFzIHRoZXNlIHNlZW0gdG8gYmUgdGhlIHByaW1hcnkgaW50ZXJhY3Rpb25zIHdpdGggdGhlIG5ldyBxdWV1ZSBtZWNoYW5pc20uIFRoZSBpbi11c2UgY291bnRlcnMsIGBzd2FwX2RldmljZV9pbnVzZV9hZGRgIGFuZCBgc3dhcF9kZXZpY2VfaW51c2Vfc3ViYCwgYXJlIGNydWNpYWwgZm9yIGVuc3VyaW5nIGNvcnJlY3RuZXNzIGFzIHdlbGwgYXMgdGhlIGxpc3QgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBgYWRkX3RvX2F2YWlsX2xpc3RgLCBgZGVsX2Zyb21fYXZhaWxfbGlzdGAsIGBzd2FwX3F1ZXVlX21hc2tgLCBgc3dhcF9xdWV1ZV91bm1hc2tgIGFuZCBgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5YCBhcmUgYWxzbyBlc3NlbnRpYWwuCgpJJiMzOTttIGZpbHRlcmluZyBvdXQgYGZvbGlvX2FsbG9jX3N3YXBgLCBhcyBpbnRlcmVzdGluZyBhcyBpdCBtYXkgYmUsIGJlY2F1c2UgSSBzdXNwZWN0IGl0IGlzIGEgbW9yZSBnZW5lcmljIGhvdCBwYXRoLCB3aGljaCwgd2hpbGUgaW1wb3J0YW50IGZvciBwZXJmb3JtYW5jZSwgd29uJiMzOTt0IG5lY2Vzc2FyaWx5IGV4cG9zZSB0aGUgY29yZSBsb2dpYyBjaGFuZ2VzIEkmIzM5O20gYWZ0ZXIuIGBzd2FwX2FsbG9jX2VudHJ5YCBsb29rcyBsaWtlIGEgYmV0dGVyIHRhcmdldC4KCk5vdywgbGV0JiMzOTtzIGNvbmZpcm0gdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gYENPTkZJR19TV0FQYCBzZWVtcyB0byBiZSB0aGUgbWFpbiBkcml2ZXIuIEkmIzM5O20gcXVpY2tseSB2ZXJpZnlpbmcgdGhhdCBgbW0vc3dhcGZpbGUuY2AgaXMgY29tcGlsZWQgd2hlbiB0aGF0JiMzOTtzIGVuYWJsZWQuIFllcCwgdGhhdCBjb25maXJtcyBpdC4KClRoZXJlZm9yZSwgZm9yIHRoaXMgZnV6emluZyBlZmZvcnQsIEkmIzM5O20gZ29pbmcgdG8gc2V0IGBXb3J0aEZ1enppbmdgIHRvIGB0cnVlYCBnaXZlbiB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UgYW5kIGl0cyBpbXBhY3Qgb24gY29yZSBrZXJuZWwgc3dhcCBsb2dpYy4gVGhlIGBGb2N1c1N5bWJvbHNgIGFyZToKCiogICBgc3dhcF9hbGxvY19lbnRyeWAKKiAgIGBzd2FwX3F1ZXVlX2FkZGAKKiAgIGBzd2FwX3F1ZXVlX2RlbGAKKiAgIGBzd2FwX3F1ZXVlX2dldF9kZXZpY2VgCiogICBgc3dhcF9kZXZpY2VfZW5hYmxlYAoqICAgYHN3YXBfZGV2aWNlX2Rpc2FibGVgCiogICBgc3dhcF9kZXZpY2VfaW51c2VfYWRkYAoqICAgYHN3YXBfZGV2aWNlX2ludXNlX3N1YmAKKiAgIGBhZGRfdG9fYXZhaWxfbGlzdGAKKiAgIGBkZWxfZnJvbV9hdmFpbF9saXN0YAoqICAgYHN3YXBfcXVldWVfbWFza2AKKiAgIGBzd2FwX3F1ZXVlX3VubWFza2AKKiAgIGBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnlgCgpBbmQgSSYjMzk7bGwgZW5hYmxlIG9ubHkgYFNXQVBgIHRvIGJ1aWxkIHRoZSBrZXJuZWwgaW1hZ2UuCk15IHJlYXNvbmluZyBpcyB0aGF0IHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBuZXcgcm91bmQtcm9iaW4gcXVldWUsIGFuZCBpdHMgYXNzb2NpYXRlZCBtYW5hZ2VtZW50IGZ1bmN0aW9ucywgaW50cm9kdWNlcyBuZXcgY29kZSB0aGF0IG5lZWRzIGNhcmVmdWwgZnV6emluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHdpdGggdGhlIHBvdGVudGlhbCBmb3Igc3VidGxlIGJ1Z3MgaW4gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAwMDo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3N3YXBfYWxsb2NfZW50cnkmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9hZGQmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9kZWwmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9nZXRfZGV2aWNlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2VuYWJsZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9kaXNhYmxlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2ludXNlX2FkZCYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9pbnVzZV9zdWImIzM0OywKICAgICYjMzQ7YWRkX3RvX2F2YWlsX2xpc3QmIzM0OywKICAgICYjMzQ7ZGVsX2Zyb21fYXZhaWxfbGlzdCYjMzQ7LAogICAgJiMzNDtzd2FwX3F1ZXVlX21hc2smIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV91bm1hc2smIzM0OywKICAgICYjMzQ7Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3N3YXBfYWxsb2NfZW50cnkmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9hZGQmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9kZWwmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9nZXRfZGV2aWNlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2VuYWJsZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9kaXNhYmxlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2ludXNlX2FkZCYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9pbnVzZV9zdWImIzM0OywKICAgICYjMzQ7YWRkX3RvX2F2YWlsX2xpc3QmIzM0OywKICAgICYjMzQ7ZGVsX2Zyb21fYXZhaWxfbGlzdCYjMzQ7LAogICAgJiMzNDtzd2FwX3F1ZXVlX21hc2smIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV91bm1hc2smIzM0OywKICAgICYjMzQ7Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQzOjQ1LjU2MTY1ODc5N1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3ODg2MTY2MzYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzd2FwX2FsbG9jX2VudHJ5XCIsXG4gICAgXCJzd2FwX3F1ZXVlX2FkZFwiLFxuICAgIFwic3dhcF9xdWV1ZV9kZWxcIixcbiAgICBcInN3YXBfcXVldWVfZ2V0X2RldmljZVwiLFxuICAgIFwic3dhcF9kZXZpY2VfZW5hYmxlXCIsXG4gICAgXCJzd2FwX2RldmljZV9kaXNhYmxlXCIsXG4gICAgXCJzd2FwX2RldmljZV9pbnVzZV9hZGRcIixcbiAgICBcInN3YXBfZGV2aWNlX2ludXNlX3N1YlwiLFxuICAgIFwiYWRkX3RvX2F2YWlsX2xpc3RcIixcbiAgICBcImRlbF9mcm9tX2F2YWlsX2xpc3RcIixcbiAgICBcInN3YXBfcXVldWVfbWFza1wiLFxuICAgIFwic3dhcF9xdWV1ZV91bm1hc2tcIixcbiAgICBcImNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMDA6NDM6NDUuNTYxNjcyNzg3WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1Mjg0NDQxMjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5ZjM0OTM2NWUwZWIxZmUyMTI4YTg0ODRiYjRjYTY1MWYxZGJkMmEyXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgSnVsIDE0IDAwOjQzOjQ0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxpc3QuaCBiL2luY2x1ZGUvbGludXgvcGxpc3QuaFxcbmluZGV4IDE2Y2Y0MzU1YjVjMTMxLi43M2QzNTljMWEwNTM2YSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BsaXN0LmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BsaXN0LmhcXG5AQCAtMTMyLDggKzEzMiw2IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwbGlzdF9ub2RlX2luaXQoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIGludCBwcmlvKVxcbiBleHRlcm4gdm9pZCBwbGlzdF9hZGQoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKTtcXG4gZXh0ZXJuIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XFxuIFxcbi1leHRlcm4gdm9pZCBwbGlzdF9yZXF1ZXVlKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XFxuLVxcbiAvKipcXG4gICogcGxpc3RfZm9yX2VhY2ggLSBpdGVyYXRlIG92ZXIgdGhlIHBsaXN0XFxuICAqIEBwb3M6XFx0dGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXJcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxcbmluZGV4IDY5NmVkMDE3MDljMmJhLi4wNDc2NzU0MDk3MmI4MSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oXFxuQEAgLTE5NCw2ICsxOTQsMjIgQEAgc3RydWN0IHN3YXBfZXh0ZW50IHtcXG4gXFx0KChvZmZzZXRvZih1bmlvbiBzd2FwX2hlYWRlciwgbWFnaWMubWFnaWMpIC0gXFxcXFxcbiBcXHQgIG9mZnNldG9mKHVuaW9uIHN3YXBfaGVhZGVyLCBpbmZvLmJhZHBhZ2VzKSkgLyBzaXplb2YoaW50KSlcXG4gXFxuKy8qXFxuKyAqIFN3YXAgZGV2aWNlIGZsYWdzLCBleGNlcHQgdGhlIG9uZXMgZG9jdW1lbnRlZCBiZWxvdywgYWxsIGFyZSBpbW11dGFibGVcXG4rICogYWZ0ZXIgZXhwb3NlZCBieSBzd2FwX2RldmljZV9lbmFibGUsIGFuZCB1bnRpbCB0aGUgZGV2aWNlIGlzIGZyZWVkIGFnYWluXFxuKyAqIChTV1BfVVNFRCB1bnNldCkuIFRoZSBleGNlcHRpb25zIGFyZSBhbGwgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbTpcXG4rICogLSBTV1BfVVNFRDogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIHRoZSBkZXZpY2UgaXMgaW51c2UuIE9uY2VcXG4rICogICBzZXQsIHdvbid0IGJlIGNsZWFyZWQgdW5sZXNzIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBkZXZpY2UgaXMgZnJlZWQgYW5kXFxuKyAqICAgc3dhcG9mZiBmaW5pc2hlZC5cXG4rICogLSBTV1BfV1JJVEVPSzogUHJvdGVjdGVkIGJ5IGJvdGggc3dhcG9uX3J3c2VtIGFuZCBzd2FwX2F2YWlsX2xvY2ssIGNsZWFyaW5nXFxuKyAqICAgdGhpcyBmbGFnIGFsc28gd2FpdHMgZm9yIGFsbCBjdXJyZW50IGNsdXN0ZXIgbG9jayB1c2VycyB0byBleGl0IHNvXFxuKyAqICAgY2hlY2tpbmcgdGhpcyBmbGFnIHdoaWxlIGhvbGRpbmcgYW55IG9mIHRoZXNlIGxvY2tzIGVuc3VyZXMgdGhlIGRldmljZVxcbisgKiAgIGlzIHNhZmUgdG8gdXNlIGF0IHRoZSBtb21lbnQuIE5vdGU6IGNsZWFyaW5nIHRoaXMgZmxhZyBkb2Vzbid0IGFmZmVjdFxcbisgKiAgIHBlbmRpbmcgSU8gb3IgYXN5bmMgcmVxdWVzdHMsIGl0IG9ubHkgcHJldmVudHMgZnVydGhlciBlbnRyeSBhbGxvY2F0aW9uXFxuKyAqICAgb3IgbmV3IGFzeW5jIHJlcXVlc3QgKGUuZy4gZGlzY2FyZCkgZnJvbSBpbml0aWF0aW5nLlxcbisgKiAtIFNXUF9ISUJFUk5BVElPTjogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIGlmIHRoZSBkZXZpY2VcXG4rICogICBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uLlxcbisgKi9cXG4gZW51bSB7XFxuIFxcdFNXUF9VU0VEXFx0PSAoMSBcXHUwMDNjXFx1MDAzYyAwKSxcXHQvKiBpcyBzbG90IGluIHN3YXBfaW5mb1tdIHVzZWQ/ICovXFxuIFxcdFNXUF9XUklURU9LXFx0PSAoMSBcXHUwMDNjXFx1MDAzYyAxKSxcXHQvKiBvayB0byB3cml0ZSB0byB0aGlzIHN3YXA/XFx0Ki9cXG5AQCAtMjMwLDEwICsyNDYsMTcgQEAgZW51bSB7XFxuICNlbmRpZlxcbiBcXG4gLypcXG4tICogV2Uga2VlcCB1c2luZyBzYW1lIGNsdXN0ZXIgZm9yIHJvdGF0aW9uYWwgZGV2aWNlIHNvIElPIHdpbGwgYmUgc2VxdWVudGlhbC5cXG4tICogVGhlIHB1cnBvc2UgaXMgdG8gb3B0aW1pemUgU1dBUCB0aHJvdWdocHV0IG9uIHRoZXNlIGRldmljZS5cXG4rICogV2UgYXNzaWduIGEgY2x1c3RlciB0byBlYWNoIENQVSwgc28gZWFjaCBDUFUgY2FuIGFsbG9jYXRlIHN3YXAgZW50cnkgZnJvbVxcbisgKiBpdHMgb3duIGNsdXN0ZXIgYW5kIHN3YXBvdXQgc2VxdWVudGlhbGx5LiBUaGUgcHVycG9zZSBpcyB0byBvcHRpbWl6ZSBzd2Fwb3V0XFxuKyAqIHRocm91Z2hwdXQuXFxuICAqL1xcbitzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIge1xcbitcXHRsb2NhbF9sb2NrX3QgbG9jazsgLyogUHJvdGVjdCB0aGUgcGVyY3B1X2NsdXN0ZXIgYWJvdmUgKi9cXG4rXFx0dW5zaWduZWQgaW50IG5leHRbU1dBUF9OUl9PUkRFUlNdOyAvKiBMaWtlbHkgbmV4dCBhbGxvY2F0aW9uIG9mZnNldCAqL1xcbit9O1xcbitcXG4gc3RydWN0IHN3YXBfc2VxdWVudGlhbF9jbHVzdGVyIHtcXG4rXFx0c3BpbmxvY2tfdCBsb2NrOyAvKiBTZXJpYWxpemUgdXNhZ2Ugb2YgZ2xvYmFsIGNsdXN0ZXIgKi9cXG4gXFx0dW5zaWduZWQgaW50IG5leHRbU1dBUF9OUl9PUkRFUlNdOyAvKiBMaWtlbHkgbmV4dCBhbGxvY2F0aW9uIG9mZnNldCAqL1xcbiB9O1xcbiBcXG5AQCAtMjQ0LDcgKzI2Nyw2IEBAIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHtcXG4gXFx0c3RydWN0IHBlcmNwdV9yZWYgdXNlcnM7XFx0LyogaW5kaWNhdGUgYW5kIGtlZXAgc3dhcCBkZXZpY2UgdmFsaWQuICovXFxuIFxcdHVuc2lnbmVkIGxvbmdcXHRmbGFncztcXHRcXHQvKiBTV1BfVVNFRCBldGM6IHNlZSBhYm92ZSAqL1xcbiBcXHRzaWduZWQgc2hvcnRcXHRwcmlvO1xcdFxcdC8qIHN3YXAgcHJpb3JpdHkgb2YgdGhpcyB0eXBlICovXFxuLVxcdHN0cnVjdCBwbGlzdF9ub2RlIGxpc3Q7XFx0XFx0LyogZW50cnkgaW4gc3dhcF9hY3RpdmVfaGVhZCAqL1xcbiBcXHRzaWduZWQgY2hhclxcdHR5cGU7XFx0XFx0Lyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqL1xcbiBcXHR1bnNpZ25lZCBpbnRcXHRtYXg7XFx0XFx0Lyogc2l6ZSBvZiB0aGlzIHN3YXAgZGV2aWNlICovXFxuIFxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvOyAvKiBjbHVzdGVyIGluZm8uIE9ubHkgZm9yIFNTRCAqL1xcbkBAIC0yNTYsMjYgKzI3OCwyMCBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7XFxuIFxcdFxcdFxcdFxcdFxcdC8qIGxpc3Qgb2YgY2x1c3RlciB0aGF0IGFyZSBmcmFnbWVudGVkIG9yIGNvbnRlbnRlZCAqL1xcbiBcXHR1bnNpZ25lZCBpbnQgcGFnZXM7XFx0XFx0LyogdG90YWwgb2YgdXNhYmxlIHBhZ2VzIG9mIHN3YXAgKi9cXG4gXFx0YXRvbWljX2xvbmdfdCBpbnVzZV9wYWdlcztcXHQvKiBudW1iZXIgb2YgdGhvc2UgY3VycmVudGx5IGluIHVzZSAqL1xcbitcXHRzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXJcXHRfX3BlcmNwdSAqcGVyY3B1X2NsdXN0ZXI7IC8qIHBlciBjcHUncyBzd2FwIGxvY2F0aW9uICovXFxuIFxcdHN0cnVjdCBzd2FwX3NlcXVlbnRpYWxfY2x1c3RlciAqZ2xvYmFsX2NsdXN0ZXI7IC8qIFVzZSBvbmUgZ2xvYmFsIGNsdXN0ZXIgZm9yIHJvdGF0aW5nIGRldmljZSAqL1xcbi1cXHRzcGlubG9ja190IGdsb2JhbF9jbHVzdGVyX2xvY2s7XFx0LyogU2VyaWFsaXplIHVzYWdlIG9mIGdsb2JhbCBjbHVzdGVyICovXFxuIFxcdHN0cnVjdCByYl9yb290IHN3YXBfZXh0ZW50X3Jvb3Q7Lyogcm9vdCBvZiB0aGUgc3dhcCBleHRlbnQgcmJ0cmVlICovXFxuIFxcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XFx0Lyogc3dhcCBkZXZpY2Ugb3IgYmRldiBvZiBzd2FwIGZpbGUgKi9cXG4gXFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZTtcXHRcXHQvKiBzZWxkb20gcmVmZXJlbmNlZCAqL1xcbiBcXHRzdHJ1Y3QgY29tcGxldGlvbiBjb21wO1xcdFxcdC8qIHNlbGRvbSByZWZlcmVuY2VkICovXFxuIFxcdHNwaW5sb2NrX3QgbG9jaztcXHRcXHQvKlxcbi1cXHRcXHRcXHRcXHRcXHQgKiBwcm90ZWN0IG1hcCBzY2FuIHJlbGF0ZWQgZmllbGRzIGxpa2VcXG4tXFx0XFx0XFx0XFx0XFx0ICogaW51c2VfcGFnZXMgYW5kIGFsbCBjbHVzdGVyIGxpc3RzLlxcbi1cXHRcXHRcXHRcXHRcXHQgKiBPdGhlciBmaWVsZHMgYXJlIG9ubHkgY2hhbmdlZFxcbi1cXHRcXHRcXHRcXHRcXHQgKiBhdCBzd2Fwb24vc3dhcG9mZiwgc28gYXJlIHByb3RlY3RlZFxcbi1cXHRcXHRcXHRcXHRcXHQgKiBieSBzd2FwX2xvY2suIGNoYW5naW5nIGZsYWdzIG5lZWRcXG4tXFx0XFx0XFx0XFx0XFx0ICogaG9sZCB0aGlzIGxvY2sgYW5kIHN3YXBfbG9jay4gSWZcXG4tXFx0XFx0XFx0XFx0XFx0ICogYm90aCBsb2NrcyBuZWVkIGhvbGQsIGhvbGQgc3dhcF9sb2NrXFxuLVxcdFxcdFxcdFxcdFxcdCAqIGZpcnN0LlxcbitcXHRcXHRcXHRcXHRcXHQgKiBQcm90ZWN0IGNsdXN0ZXIgbGlzdHMuIE90aGVyIGZpZWxkc1xcbitcXHRcXHRcXHRcXHRcXHQgKiBhcmUgb25seSBjaGFuZ2VkIGF0IHN3YXBvbi9zd2Fwb2ZmLFxcbitcXHRcXHRcXHRcXHRcXHQgKiBzbyBhcmUgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS5cXG4gXFx0XFx0XFx0XFx0XFx0ICovXFxuIFxcdHN0cnVjdCB3b3JrX3N0cnVjdCBkaXNjYXJkX3dvcms7IC8qIGRpc2NhcmQgd29ya2VyICovXFxuIFxcdHN0cnVjdCB3b3JrX3N0cnVjdCByZWNsYWltX3dvcms7IC8qIHJlY2xhaW0gd29ya2VyICovXFxuIFxcdHN0cnVjdCBsaXN0X2hlYWQgZGlzY2FyZF9jbHVzdGVyczsgLyogZGlzY2FyZCBjbHVzdGVycyBsaXN0ICovXFxuLVxcdHN0cnVjdCBwbGlzdF9ub2RlIGF2YWlsX2xpc3Q7ICAgLyogZW50cnkgaW4gc3dhcF9hdmFpbF9oZWFkICovXFxuIH07XFxuIFxcbiBzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IHBhZ2Vfc3dhcF9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSlcXG5kaWZmIC0tZ2l0IGEvbGliL3BsaXN0LmMgYi9saWIvcGxpc3QuY1xcbmluZGV4IGE1YmVmMzhhZGQ0MzFkLi5iMDVhZTdmZmVhODdlOCAxMDA2NDRcXG4tLS0gYS9saWIvcGxpc3QuY1xcbisrKyBiL2xpYi9wbGlzdC5jXFxuQEAgLTE0Miw1OCArMTQyLDYgQEAgdm9pZCBwbGlzdF9kZWwoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKVxcbiBcXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xcbiB9XFxuIFxcbi0vKipcXG4tICogcGxpc3RfcmVxdWV1ZSAtIFJlcXVldWUgQG5vZGUgYXQgZW5kIG9mIHNhbWUtcHJpbyBlbnRyaWVzLlxcbi0gKlxcbi0gKiBUaGlzIGlzIGVzc2VudGlhbGx5IGFuIG9wdGltaXplZCBwbGlzdF9kZWwoKSBmb2xsb3dlZCBieVxcbi0gKiBwbGlzdF9hZGQoKS4gIEl0IG1vdmVzIGFuIGVudHJ5IGFscmVhZHkgaW4gdGhlIHBsaXN0IHRvXFxuLSAqIGFmdGVyIGFueSBvdGhlciBzYW1lLXByaW9yaXR5IGVudHJpZXMuXFxuLSAqXFxuLSAqIEBub2RlOlxcdFxcdTAwMjZzdHJ1Y3QgcGxpc3Rfbm9kZSBwb2ludGVyIC0gZW50cnkgdG8gYmUgbW92ZWRcXG4tICogQGhlYWQ6XFx0XFx1MDAyNnN0cnVjdCBwbGlzdF9oZWFkIHBvaW50ZXIgLSBsaXN0IGhlYWRcXG4tICovXFxuLXZvaWQgcGxpc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpXFxuLXtcXG4tXFx0c3RydWN0IHBsaXN0X25vZGUgKml0ZXI7XFxuLVxcdHN0cnVjdCBsaXN0X2hlYWQgKm5vZGVfbmV4dCA9IFxcdTAwMjZoZWFkLVxcdTAwM2Vub2RlX2xpc3Q7XFxuLVxcbi1cXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xcbi1cXHRCVUdfT04ocGxpc3RfaGVhZF9lbXB0eShoZWFkKSk7XFxuLVxcdEJVR19PTihwbGlzdF9ub2RlX2VtcHR5KG5vZGUpKTtcXG4tXFxuLVxcdGlmIChub2RlID09IHBsaXN0X2xhc3QoaGVhZCkpXFxuLVxcdFxcdHJldHVybjtcXG4tXFxuLVxcdGl0ZXIgPSBwbGlzdF9uZXh0KG5vZGUpO1xcbi1cXG4tXFx0aWYgKG5vZGUtXFx1MDAzZXByaW8gIT0gaXRlci1cXHUwMDNlcHJpbylcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0cGxpc3RfZGVsKG5vZGUsIGhlYWQpO1xcbi1cXG4tXFx0LypcXG4tXFx0ICogQWZ0ZXIgcGxpc3RfZGVsKCksIGl0ZXIgaXMgdGhlIHJlcGxhY2VtZW50IG9mIHRoZSBub2RlLiAgSWYgdGhlIG5vZGVcXG4tXFx0ICogd2FzIG9uIHByaW9fbGlzdCwgdGFrZSBzaG9ydGN1dCB0byBmaW5kIG5vZGVfbmV4dCBpbnN0ZWFkIG9mIGxvb3BpbmcuXFxuLVxcdCAqL1xcbi1cXHRpZiAoIWxpc3RfZW1wdHkoXFx1MDAyNml0ZXItXFx1MDAzZXByaW9fbGlzdCkpIHtcXG4tXFx0XFx0aXRlciA9IGxpc3RfZW50cnkoaXRlci1cXHUwMDNlcHJpb19saXN0Lm5leHQsIHN0cnVjdCBwbGlzdF9ub2RlLFxcbi1cXHRcXHRcXHRcXHQgIHByaW9fbGlzdCk7XFxuLVxcdFxcdG5vZGVfbmV4dCA9IFxcdTAwMjZpdGVyLVxcdTAwM2Vub2RlX2xpc3Q7XFxuLVxcdFxcdGdvdG8gcXVldWU7XFxuLVxcdH1cXG4tXFxuLVxcdHBsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlKGl0ZXIsIGhlYWQpIHtcXG4tXFx0XFx0aWYgKG5vZGUtXFx1MDAzZXByaW8gIT0gaXRlci1cXHUwMDNlcHJpbykge1xcbi1cXHRcXHRcXHRub2RlX25leHQgPSBcXHUwMDI2aXRlci1cXHUwMDNlbm9kZV9saXN0O1xcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0fVxcbi1cXHR9XFxuLXF1ZXVlOlxcbi1cXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZub2RlLVxcdTAwM2Vub2RlX2xpc3QsIG5vZGVfbmV4dCk7XFxuLVxcbi1cXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xcbi19XFxuLVxcbiAjaWZkZWYgQ09ORklHX0RFQlVHX1BMSVNUXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQvY2xvY2suaFxcdTAwM2VcXG5AQCAtMjMxLDE0ICsxNzksNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgcGxpc3RfdGVzdF9jaGVjayhpbnQgbnJfZXhwZWN0KVxcbiBcXHRCVUdfT04ocHJpb19wb3MtXFx1MDAzZXByaW9fbGlzdC5uZXh0ICE9IFxcdTAwMjZmaXJzdC1cXHUwMDNlcHJpb19saXN0KTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX19pbml0IHBsaXN0X3Rlc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSlcXG4te1xcbi1cXHRwbGlzdF9yZXF1ZXVlKG5vZGUsIFxcdTAwMjZ0ZXN0X2hlYWQpO1xcbi1cXG4tXFx0aWYgKG5vZGUgIT0gcGxpc3RfbGFzdChcXHUwMDI2dGVzdF9oZWFkKSlcXG4tXFx0XFx0QlVHX09OKG5vZGUtXFx1MDAzZXByaW8gPT0gcGxpc3RfbmV4dChub2RlKS1cXHUwMDNlcHJpbyk7XFxuLX1cXG4tXFxuIHN0YXRpYyBpbnQgIF9faW5pdCBwbGlzdF90ZXN0KHZvaWQpXFxuIHtcXG4gXFx0aW50IG5yX2V4cGVjdCA9IDAsIGksIGxvb3A7XFxuQEAgLTI2MiwxMCArMjAyLDYgQEAgc3RhdGljIGludCAgX19pbml0IHBsaXN0X3Rlc3Qodm9pZClcXG4gXFx0XFx0XFx0bnJfZXhwZWN0LS07XFxuIFxcdFxcdH1cXG4gXFx0XFx0cGxpc3RfdGVzdF9jaGVjayhucl9leHBlY3QpO1xcbi1cXHRcXHRpZiAoIXBsaXN0X25vZGVfZW1wdHkodGVzdF9ub2RlICsgaSkpIHtcXG4tXFx0XFx0XFx0cGxpc3RfdGVzdF9yZXF1ZXVlKHRlc3Rfbm9kZSArIGkpO1xcbi1cXHRcXHRcXHRwbGlzdF90ZXN0X2NoZWNrKG5yX2V4cGVjdCk7XFxuLVxcdFxcdH1cXG4gXFx0fVxcbiBcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUodGVzdF9ub2RlKTsgaSsrKSB7XFxuZGlmZiAtLWdpdCBhL21tL3N3YXAuaCBiL21tL3N3YXAuaFxcbmluZGV4IGI1MWFkMzA3MWE3MzA4Li4wOGE3ODJmM2Q1YWNkMiAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwLmhcXG4rKysgYi9tbS9zd2FwLmhcXG5AQCAtOTEsMTYgKzkxLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHN3cF9jbHVzdGVyX29mZnNldChzd3BfZW50cnlfdCBlbnRyeSlcXG4gICovXFxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKl9fc3dhcF90eXBlX3RvX2luZm8oaW50IHR5cGUpXFxuIHtcXG4tXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xcbi1cXG4tXFx0c2kgPSBSRUFEX09OQ0Uoc3dhcF9pbmZvW3R5cGVdKTsgLyogcmN1X2RlcmVmZXJlbmNlKCkgKi9cXG4tXFx0Vk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybyhcXHUwMDI2c2ktXFx1MDAzZXVzZXJzKSk7IC8qIHJhY2Ugd2l0aCBzd2Fwb2ZmICovXFxuLVxcdHJldHVybiBzaTtcXG4rXFx0cmV0dXJuIFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqL1xcbiB9XFxuIFxcbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpfX3N3YXBfZW50cnlfdG9faW5mbyhzd3BfZW50cnlfdCBlbnRyeSlcXG4ge1xcbi1cXHRyZXR1cm4gX19zd2FwX3R5cGVfdG9faW5mbyhzd3BfdHlwZShlbnRyeSkpO1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuK1xcbitcXHRzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTsgLyogcmN1X2RlcmVmZXJlbmNlKCkgKi9cXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybyhcXHUwMDI2c2ktXFx1MDAzZXVzZXJzKSk7IC8qIHJhY2Ugd2l0aCBzd2Fwb2ZmICovXFxuK1xcdHJldHVybiBzaTtcXG4gfVxcbiBcXG4gc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKl9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihcXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmNcXG5pbmRleCA3NzVjMzg1NDkwYTVmYS4uZjkzODYzMzA5YTVhNTAgMTAwNjQ0XFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xcbisrKyBiL21tL3N3YXBmaWxlLmNcXG5AQCAtNDEsNyArNDEsNiBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGxldGlvbi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc3VzcGVuZC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvenN3YXAuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BsaXN0LmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL3RsYmZsdXNoLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9sZWFmb3BzLmhcXHUwMDNlXFxuQEAgLTQ5LDMxICs0OCwzOCBAQFxcbiAjaW5jbHVkZSBcXFwiaW50ZXJuYWwuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInN3YXAuaFxcXCJcXG4gXFxuLXN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbi1cXHRcXHRcXHQgICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKTtcXG4rc3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7XFxuIHN0YXRpYyBib29sIGZvbGlvX3N3YXBjYWNoZV9mcmVlYWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4gc3RhdGljIHZvaWQgbW92ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0XFx0XFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuIFxcdFxcdFxcdCBlbnVtIHN3YXBfY2x1c3Rlcl9mbGFncyBuZXdfZmxhZ3MpO1xcbitzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpO1xcbiBcXG4gLypcXG4tICogUHJvdGVjdHMgdGhlIHN3YXBfaW5mbyBhcnJheSwgYW5kIHRoZSBTV1BfVVNFRCBmbGFnLiBzd2FwX2luZm8gY29udGFpbnNcXG4tICogbGF6aWx5IGFsbG9jYXRlZCBcXHUwMDI2IGZyZWVkIHN3YXAgZGV2aWNlIGluZm8gc3RydXRzLCBhbmQgU1dQX1VTRUQgaW5kaWNhdGVzXFxuLSAqIHdoaWNoIGRldmljZSBpcyB1c2VkLCB+U1dQX1VTRUQgZGV2aWNlcyBhbmQgY2FuIGJlIHJldXNlZC5cXG4tICpcXG4tICogQWxzbyBwcm90ZWN0cyBzd2FwX2FjdGl2ZV9oZWFkIHRvdGFsX3N3YXBfcGFnZXMsIGFuZCB0aGUgU1dQX1dSSVRFT0sgZmxhZy5cXG4rICogU2VyaWFsaXplcyBzd2Fwb24vc3dhcG9mZiAod3JpdGVycykgYW5kIHByb3RlY3RzIHRoZSBzd2FwX2luZm9cXG4rICogYXJyYXksIG5yX3N3YXBmaWxlcywgdG90YWxfc3dhcF9wYWdlcywgYW5kIHBhcnQgb2Ygc3dhcCBkZXZpY2VcXG4rICogaW5mbyBjb250ZW50IChzZWUgY29tbWVudCBvZiBzd2FwX2luZm9fc3RydWN0KS4gIFJlYWRlcnNcXG4rICogKGFsbG9jYXRpb24sIC9wcm9jL3N3YXBzLCBldGMuKSB0YWtlIHBlcmNwdV9kb3duX3JlYWQoKSB3aGljaFxcbisgKiBpcyBjaGVhcCBhcyB0aGUgaG90IHBhdGguXFxuKyAqL1xcbitERUZJTkVfU1RBVElDX1BFUkNQVV9SV1NFTShzd2Fwb25fcndzZW0pO1xcbisvKlxcbisgKiBzd2FwX2luZm8gY29udGFpbnMgbGF6aWx5IGFsbG9jYXRlZCBzd2FwIGRldmljZSBpbmZvIHN0cnVjdHMsIGFuZFxcbisgKiBTV1BfVVNFRCBpbmRpY2F0ZXMgd2hpY2ggZGV2aWNlIGlzIHVzZWQsIH5TV1BfVVNFRCBkZXZpY2VzIGNhbiBiZVxcbisgKiByZXVzZWQuIFByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0sIGJ1dCByZWFkaW5nIGNvdWxkIGJlIGxvY2tsZXNzLlxcbiAgKi9cXG4tc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spO1xcbitzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9pbmZvW01BWF9TV0FQRklMRVNdO1xcbiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlcztcXG4tYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xcbitsb25nIHRvdGFsX3N3YXBfcGFnZXM7XFxuK1xcbiAvKlxcbiAgKiBTb21lIG1vZHVsZXMgdXNlIHN3YXBwYWJsZSBvYmplY3RzIGFuZCBtYXkgdHJ5IHRvIHN3YXAgdGhlbSBvdXQgdW5kZXJcXG4gICogbWVtb3J5IHByZXNzdXJlICh2aWEgdGhlIHNocmlua2VyKS4gQmVmb3JlIGRvaW5nIHNvLCB0aGV5IG1heSB3aXNoIHRvXFxuICAqIGNoZWNrIHRvIHNlZSBpZiBhbnkgc3dhcCBzcGFjZSBpcyBhdmFpbGFibGUuXFxuICAqL1xcbithdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XFxuIEVYUE9SVF9TWU1CT0xfR1BMKG5yX3N3YXBfcGFnZXMpO1xcbi0vKiBwcm90ZWN0ZWQgd2l0aCBzd2FwX2xvY2suIHJlYWRpbmcgaW4gdm1fc3dhcF9mdWxsKCkgZG9lc24ndCBuZWVkIGxvY2sgKi9cXG4tbG9uZyB0b3RhbF9zd2FwX3BhZ2VzO1xcbiAjZGVmaW5lIERFRl9TV0FQX1BSSU8gIC0xXFxuIHVuc2lnbmVkIGxvbmcgc3dhcGZpbGVfbWF4aW11bV9zaXplO1xcbiAjaWZkZWYgQ09ORklHX01JR1JBVElPTlxcbkBAIC04Myw1MiArODksNDIgQEAgYm9vbCBzd2FwX21pZ3JhdGlvbl9hZF9zdXBwb3J0ZWQ7XFxuIHN0YXRpYyBjb25zdCBjaGFyIEJhZF9maWxlW10gPSBcXFwiQmFkIHN3YXAgZmlsZSBlbnRyeSBcXFwiO1xcbiBzdGF0aWMgY29uc3QgY2hhciBCYWRfb2Zmc2V0W10gPSBcXFwiQmFkIHN3YXAgb2Zmc2V0IGVudHJ5IFxcXCI7XFxuIFxcbi0vKlxcbi0gKiBhbGwgYWN0aXZlIHN3YXBfaW5mb19zdHJ1Y3RzXFxuLSAqIHByb3RlY3RlZCB3aXRoIHN3YXBfbG9jaywgYW5kIG9yZGVyZWQgYnkgcHJpb3JpdHkuXFxuLSAqL1xcbi1zdGF0aWMgUExJU1RfSEVBRChzd2FwX2FjdGl2ZV9oZWFkKTtcXG4rc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqX19zd2FwX2l0ZXIoaW50ICppLCB1bnNpZ25lZCBsb25nIGZsYWcpXFxuK3tcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0d2hpbGUgKCppIFxcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XFxuK1xcdFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oKmkpO1xcbitcXG4rXFx0XFx0Vk1fV0FSTl9PTighc2kpO1xcbitcXHRcXHQoKmkpKys7XFxuK1xcdFxcdGlmIChmbGFnIFxcdTAwMjZcXHUwMDI2ICEoKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IGZsYWcpID09IGZsYWcpKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0cmV0dXJuIHNpO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisjZGVmaW5lIF9fZm9yX2VhY2hfc3dhcChzaSwgZmxhZylcXHRcXHRcXHRcXFxcXFxuK1xcdGZvciAoaW50IF9faSA9IDA7ICgoc2kpID0gX19zd2FwX2l0ZXIoXFx1MDAyNl9faSwgZmxhZykpOylcXG4gXFxuIC8qXFxuLSAqIGFsbCBhdmFpbGFibGUgKGFjdGl2ZSwgbm90IGZ1bGwpIHN3YXBfaW5mb19zdHJ1Y3RzXFxuLSAqIHByb3RlY3RlZCB3aXRoIHN3YXBfYXZhaWxfbG9jaywgb3JkZXJlZCBieSBwcmlvcml0eS5cXG4tICogVGhpcyBpcyB1c2VkIGJ5IGZvbGlvX2FsbG9jX3N3YXAoKSBpbnN0ZWFkIG9mIHN3YXBfYWN0aXZlX2hlYWRcXG4tICogYmVjYXVzZSBzd2FwX2FjdGl2ZV9oZWFkIGluY2x1ZGVzIGFsbCBzd2FwX2luZm9fc3RydWN0cyxcXG4tICogYnV0IGZvbGlvX2FsbG9jX3N3YXAoKSBkb2Vzbid0IG5lZWQgdG8gbG9vayBhdCBmdWxsIG9uZXMuXFxuLSAqIFRoaXMgdXNlcyBpdHMgb3duIGxvY2sgaW5zdGVhZCBvZiBzd2FwX2xvY2sgYmVjYXVzZSB3aGVuIGFcXG4tICogc3dhcF9pbmZvX3N0cnVjdCBjaGFuZ2VzIGJldHdlZW4gbm90LWZ1bGwvZnVsbCwgaXQgbmVlZHMgdG9cXG4tICogYWRkL3JlbW92ZSBpdHNlbGYgdG8vZnJvbSB0aGlzIGxpc3QsIGJ1dCB0aGUgc3dhcF9pbmZvX3N0cnVjdC1cXHUwMDNlbG9ja1xcbi0gKiBpcyBoZWxkIGFuZCB0aGUgbG9ja2luZyBvcmRlciByZXF1aXJlcyBzd2FwX2xvY2sgdG8gYmUgdGFrZW5cXG4tICogYmVmb3JlIGFueSBzd2FwX2luZm9fc3RydWN0LVxcdTAwM2Vsb2NrLlxcbisgKiBmb3JfZWFjaF9zd2FwIC0gaXRlcmF0ZSB0aHJvdWdoIGFsbCBhbGxvY2F0ZWQgYW5kIGludXNlIHN3YXAgZGV2aWNlc1xcbisgKiBAc2k6IHRoZSBpdGVyYXRvclxcbisgKlxcbisgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3QgaG9sZCBzd2Fwb25fcndzZW0uIFRoZSBsb2NrIG1heSBiZSBkcm9wcGVkIGR1cmluZ1xcbisgKiB0aGUgbG9vcCBib2R5IGJ1dCBtdXN0IGJlIHJlLWFjcXVpcmVkIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24uXFxuICAqL1xcbi1zdGF0aWMgUExJU1RfSEVBRChzd2FwX2F2YWlsX2hlYWQpO1xcbi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfYXZhaWxfbG9jayk7XFxuLVxcbi1zdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9pbmZvW01BWF9TV0FQRklMRVNdO1xcbisjZGVmaW5lIGZvcl9lYWNoX3N3YXAoc2kpIF9fZm9yX2VhY2hfc3dhcChzaSwgU1dQX1VTRUQpXFxuKyNkZWZpbmUgZm9yX2VhY2hfYXZhaWxfc3dhcChzaSkgX19mb3JfZWFjaF9zd2FwKHNpLCBTV1BfVVNFRCB8IFNXUF9XUklURU9LKVxcbiBcXG4gc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzd2FwX3RhYmxlX2NhY2hlcDtcXG4gXFxuLS8qIFByb3RlY3RzIHNpLVxcdTAwM2Vzd2FwX2ZpbGUgZm9yIC9wcm9jL3N3YXBzIHVzYWdlICovXFxuLXN0YXRpYyBERUZJTkVfTVVURVgoc3dhcG9uX211dGV4KTtcXG4tXFxuIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChwcm9jX3BvbGxfd2FpdCk7XFxuIC8qIEFjdGl2aXR5IGNvdW50ZXIgdG8gaW5kaWNhdGUgdGhhdCBhIHN3YXBvbiBvciBzd2Fwb2ZmIGhhcyBvY2N1cnJlZCAqL1xcbiBzdGF0aWMgYXRvbWljX3QgcHJvY19wb2xsX2V2ZW50ID0gQVRPTUlDX0lOSVQoMCk7XFxuIFxcbiBhdG9taWNfdCBucl9yb3RhdGVfc3dhcCA9IEFUT01JQ19JTklUKDApO1xcbiBcXG4tc3RydWN0IHBlcmNwdV9zd2FwX2NsdXN0ZXIge1xcbi1cXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lbU1dBUF9OUl9PUkRFUlNdO1xcbi1cXHR1bnNpZ25lZCBsb25nIG9mZnNldFtTV0FQX05SX09SREVSU107XFxuLVxcdGxvY2FsX2xvY2tfdCBsb2NrO1xcbi19O1xcbi1cXG4tc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJjcHVfc3dhcF9jbHVzdGVyLCBwZXJjcHVfc3dhcF9jbHVzdGVyKSA9IHtcXG4tXFx0LnNpID0geyBOVUxMIH0sXFxuLVxcdC5vZmZzZXQgPSB7IFNXQVBfRU5UUllfSU5WQUxJRCB9LFxcbi1cXHQubG9jayA9IElOSVRfTE9DQUxfTE9DSygpLFxcbi19O1xcbi1cXG4gLyogTWF5IHJldHVybiBOVUxMIG9uIGludmFsaWQgdHlwZSwgY2FsbGVyIG11c3QgY2hlY2sgZm9yIE5VTEwgcmV0dXJuICovXFxuIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF90eXBlX3RvX2luZm8oaW50IHR5cGUpXFxuIHtcXG5AQCAtMTQzLDE4ICsxMzksMzUwIEBAIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9lbnRyeV90b19pbmZvKHN3cF9lbnRyeV90IGVudHJ5KVxcbiBcXHRyZXR1cm4gc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTtcXG4gfVxcbiBcXG4rLypcXG4rICogQWxsIGF2YWlsYWJsZSBzd2FwX2luZm9fc3RydWN0cyBhcmUgZ3JvdXBlZCBieSBwcmlvcml0eSByaW5ncywgdGhlIHJpbmdzXFxuKyAqIGFyZSBvcmRlcmVkIGluIGEgcXVldWUgYnkgcHJpb3JpdHkgKGxvd2VyIHByaW8gdmFsdWUgPSBoaWdoZXIgcHJpb3JpdHkpLlxcbisgKiBUaGUgYWxsb2NhdG9yIGl0ZXJhdGVzIGFuZCByb3RhdGVzIGRldmljZXMgd2l0aGluIGVhY2ggcHJpb3JpdHkgcmluZy5cXG4rICogV2hlbiBhbGwgZGV2aWNlcyBpbiBhIHJpbmcgYXJlIGl0ZXJhdGVkLCBpdCBnb2VzIHRvIHRoZSBuZXh0IGxvd2VyXFxuKyAqIHByaW9yaXR5IHJpbmcuXFxuKyAqL1xcbitzdHJ1Y3Qgc3dhcF9wcmlvX3Jpbmcge1xcbitcXHRpbnQgcHJpbztcXG4rXFx0dW5zaWduZWQgaW50IHNpemU7XFxuK1xcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpkZXZbXSBfX2NvdW50ZWRfYnkoc2l6ZSk7XFxuK307XFxuK1xcbisvKlxcbisgKiBUaGUgcmluZyBpcyBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtIHNvIHVwZGF0aW5nIGl0IGlzIGNvc3RseS4gVG8gbWFrZVxcbisgKiB0aGUgYWxsb2NhdG9yIGFuZCBvdGhlciB1c2VycyBza2lwIGZ1bGwgZGV2aWNlcyBmYXN0ZXIsIHRoZSBsb3dlc3QgYml0IG9mXFxuKyAqIGEgZGV2aWNlIHBvaW50ZXIgaXMgdXNlZCB0byBtYXJrIGl0IGRpc2FibGVkICh0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSkuXFxuKyAqIFRoaXMgcmVsaWVzIG9uIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IGJlaW5nIHN1ZmZpY2llbnRseVxcbisgKiBhbGlnbmVkIChndWFyYW50ZWVkIGJ5IGttYWxsb2MpLlxcbisgKi9cXG4rI2RlZmluZSBTV0FQX0RFVklDRV9NQVNLRURfU0hJRlRcXHQwXFxuKyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVFxcdFxcdEJJVChTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQpXFxuK1xcbisvKlxcbisgKiBTZXJpYWxpemVzIHF1ZXVlIGNvbnRlbnQgbXV0YXRpb25zIGFuZCBrZWVwcyBTV0FQX1VTQUdFX09GRkxJU1RfQklUXFxuKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgbWFza2VkIHN0YXRlIG9mIGVhY2ggZGV2aWNlIHBvaW50ZXIuXFxuKyAqL1xcbitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXG4rLypcXG4rICogU3dhcCBxdWV1ZSBpcyBwcm90ZWN0ZWQgYnkgYm90aCBzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrIGFuZCBzd2Fwb25fcndzZW0uXFxuKyAqIE9ubHkgc3dhcG9uL3N3YXBvZmYgd2lsbCB0YWtlIHRoZSB3cml0ZSBsb2NrLCBhbmQgbW9kaWZ5IHRoZSBxdWV1ZSBsZW5ndGhcXG4rICogb3IgYW55IHJpbmcncyBsZW5ndGguIHN3YXBfcXVldWVfdXBkYXRlX2xvY2sgcHJvdGVjdHMgdGhlIGNvbnRlbnQgc29cXG4rICogZGV2aWNlcyBjYW4gYmUgbWFza2VkIGVhc2lseSB3aXRob3V0IHRha2luZyB0aGUgd3JpdGVsb2NrLCB3aGljaCBpcyBoZWF2eS5cXG4rICovXFxuK3N0YXRpYyBzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipzd2FwX3F1ZXVlO1xcbitzdGF0aWMgdW5zaWduZWQgaW50IHN3YXBfcXVldWVfbGVuO1xcbitcXG4rLypcXG4rICogRWFjaCBDUFUgaGFzIGl0cyByZWFkIGl0ZXJhdG9yLCBzbyB0aGUgcXVldWUgaXRzZWxmIHdpbGwgcmVtYWluIHJlYWRcXG4rICogb25seSBhbmQgdGhlIENQVSBzaWRlIHJlYWRlciByb3RhdGVzIGJ5IGl0ZXJhdGluZyB0aGUgZGV2aWNlc1xcbisgKiBwZXJpb2RpY2FsbHkgdXNpbmcgdGhlIGNvdW50ZXIuXFxuKyAqL1xcbisjZGVmaW5lIFNXQVBfUk9VTkRfUk9CSU5fUVVPVEEgU1dBUEZJTEVfQ0xVU1RFUlxcbitzdHJ1Y3Qgc3dhcF9yaW5nX2l0ZXJhdG9yIHtcXG4rXFx0aW50IG9mZnNldDtcXG4rXFx0bG9uZyBycl9jb3VudGVyO1xcbit9O1xcbitcXG4rc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIHtcXG4rXFx0bG9jYWxfbG9ja190IGxvY2s7XFxuK1xcdHN0cnVjdCBzd2FwX3JpbmdfaXRlcmF0b3IgcmlbXTtcXG4rfTtcXG4rXFxuK3N0YXRpYyBfX3BlcmNwdSBzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgKnN3YXBfcXVldWVfcmVhZGVycztcXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBzd2FwX2RldmljZV9tYXNrZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZylzaSBcXHUwMDI2IFNXQVBfREVWSUNFX01BU0tFRF9CSVQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfZGV2aWNlX3VubWFza19wdHIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHJldHVybiAoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKikoKHVuc2lnbmVkIGxvbmcpc2kgXFx1MDAyNiB+U1dBUF9ERVZJQ0VfTUFTS0VEX0JJVCk7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhpbnQgbnJfcmluZ3MsIGdmcF90IGdmcClcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnM7XFxuK1xcbitcXHRpZiAoIW5yX3JpbmdzKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdHJlYWRlcnMgPSBfX2FsbG9jX3BlcmNwdV9nZnAoc3RydWN0X3NpemUocmVhZGVycywgcmksIG5yX3JpbmdzKSxcXG4rXFx0XFx0XFx0XFx0ICAgICBfX2FsaWdub2ZfXygqcmVhZGVycyksIGdmcCk7XFxuK1xcdHJldHVybiByZWFkZXJzO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnMpXFxuK3tcXG4rXFx0aW50IHJpbmdfaWR4LCBjcHU7XFxuK1xcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcXG4rXFxuK1xcdGZyZWVfcGVyY3B1KHN3YXBfcXVldWVfcmVhZGVycyk7XFxuK1xcdHN3YXBfcXVldWVfcmVhZGVycyA9IHJlYWRlcnM7XFxuK1xcdGlmICghcmVhZGVycylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LyogRGlzdHJpYnV0ZSBlYWNoIENQVSdzIHN3YXAgSU8gZmFpcmx5IGFjcm9zcyBkZXZpY2VzLiAqL1xcbitcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuK1xcdFxcdGxvY2FsX2xvY2tfaW5pdChcXHUwMDI2cGVyX2NwdV9wdHIocmVhZGVycywgY3B1KS1cXHUwMDNlbG9jayk7XFxuK1xcbitcXHRcXHRmb3IgKHJpbmdfaWR4ID0gMDsgcmluZ19pZHggXFx1MDAzYyBzd2FwX3F1ZXVlX2xlbjsgcmluZ19pZHgrKykge1xcbitcXHRcXHRcXHRyaW5nID0gc3dhcF9xdWV1ZVtyaW5nX2lkeF07XFxuK1xcdFxcdFxcdHBlcl9jcHVfcHRyKHJlYWRlcnMsIGNwdSktXFx1MDAzZXJpW3JpbmdfaWR4XS5vZmZzZXQgPVxcbitcXHRcXHRcXHRcXHQgICAgY3B1ICUgcmluZy1cXHUwMDNlc2l6ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9xdWV1ZV9nZXRfZGV2aWNlKGxvbmcgbnJfYWxsb2MsIGludCBucl9pdGVyKVxcbit7XFxuK1xcdGJvb2wgcm90YXRlID0gZmFsc2U7XFxuK1xcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4rXFx0c3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciAqcmk7XFxuK1xcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcXG4rXFx0dW5zaWduZWQgaW50IHF1ZXVlX2lkeDtcXG4rXFxuK1xcdGlmICghc3dhcF9xdWV1ZV9sZW4pXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xcbitcXG4rXFx0cXVldWVfaWR4ID0gMDtcXG4rXFx0d2hpbGUgKG5yX2l0ZXIgXFx1MDAzZT0gc3dhcF9xdWV1ZVtxdWV1ZV9pZHhdLVxcdTAwM2VzaXplKSB7XFxuK1xcdFxcdG5yX2l0ZXIgLT0gc3dhcF9xdWV1ZVtxdWV1ZV9pZHhdLVxcdTAwM2VzaXplO1xcbitcXHRcXHRpZiAoKytxdWV1ZV9pZHggXFx1MDAzZT0gc3dhcF9xdWV1ZV9sZW4pXFxuK1xcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xcbitcXHR9XFxuK1xcbitcXHRyaW5nID0gc3dhcF9xdWV1ZVtxdWV1ZV9pZHhdO1xcbitcXHRsb2NhbF9sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3JlYWRlcnMtXFx1MDAzZWxvY2spO1xcbitcXHRyaSA9IHRoaXNfY3B1X3B0cihcXHUwMDI2c3dhcF9xdWV1ZV9yZWFkZXJzLVxcdTAwM2VyaVtxdWV1ZV9pZHhdKTtcXG4rXFx0LyogUm90YXRlIHdoaWxlIGl0ZXJhdGluZyB0aGUgcmluZywganVzdCBub3Qgb24gdGhlIGZpcnN0IHRyeSAqL1xcbitcXHRpZiAobnJfaXRlcilcXG4rXFx0XFx0cm90YXRlID0gdHJ1ZTtcXG4rXFx0ZWxzZSBpZiAocmktXFx1MDAzZXJyX2NvdW50ZXIgXFx1MDAzYyBucl9hbGxvYylcXG4rXFx0XFx0cm90YXRlID0gdHJ1ZTtcXG4rXFx0ZWxzZSBpZiAocmktXFx1MDAzZW9mZnNldCBcXHUwMDNlPSByaW5nLVxcdTAwM2VzaXplKVxcbitcXHRcXHRyb3RhdGUgPSB0cnVlO1xcbitcXHRpZiAocm90YXRlKSB7XFxuK1xcdFxcdHJpLVxcdTAwM2VvZmZzZXQrKztcXG4rXFx0XFx0cmktXFx1MDAzZW9mZnNldCAlPSByaW5nLVxcdTAwM2VzaXplO1xcbitcXHRcXHRyaS1cXHUwMDNlcnJfY291bnRlciA9IFNXQVBfUk9VTkRfUk9CSU5fUVVPVEE7XFxuK1xcdH1cXG4rXFx0cmktXFx1MDAzZXJyX2NvdW50ZXIgLT0gbnJfYWxsb2M7XFxuK1xcdHNpID0gUkVBRF9PTkNFKHJpbmctXFx1MDAzZWRldltyaS1cXHUwMDNlb2Zmc2V0XSk7XFxuK1xcdGxvY2FsX3VubG9jayhcXHUwMDI2c3dhcF9xdWV1ZV9yZWFkZXJzLVxcdTAwM2Vsb2NrKTtcXG4rXFxuK1xcdGlmIChzd2FwX2RldmljZV9tYXNrZWQoc2kpKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUJVU1kpO1xcbitcXG4rXFx0c2kgPSBzd2FwX2RldmljZV91bm1hc2tfcHRyKHNpKTtcXG4rXFx0cmV0dXJuIHNpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBzd2FwX3F1ZXVlX2ZpbmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbitcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50ICpyaW5nX2lkeCwgdW5zaWduZWQgaW50ICpkZXZfaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBpLCBqO1xcbitcXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7XFxuK1xcbitcXHRsb2NrZGVwX2Fzc2VydChsb2NrZGVwX2lzX2hlbGQoXFx1MDAyNnN3YXBvbl9yd3NlbSkgfHxcXG4rXFx0XFx0ICAgICAgIGxvY2tkZXBfaXNfaGVsZChcXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jaykpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHN3YXBfcXVldWVfbGVuOyBpKyspIHtcXG4rXFx0XFx0cmluZyA9IHN3YXBfcXVldWVbaV07XFxuK1xcdFxcdGlmIChyaW5nLVxcdTAwM2VwcmlvICE9IHNpLVxcdTAwM2VwcmlvKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIHJpbmctXFx1MDAzZXNpemU7IGorKykge1xcbitcXHRcXHRcXHRpZiAoc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihSRUFEX09OQ0UocmluZy1cXHUwMDNlZGV2W2pdKSkgIT0gc2kpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHQqcmluZ19pZHggPSBpO1xcbitcXHRcXHRcXHQqZGV2X2lkeCA9IGo7XFxuK1xcdFxcdFxcdHJldHVybiB0cnVlO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX21hc2soc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCByaW5nX2lkeCwgZGV2X2lkeDtcXG4rXFxuK1xcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRpZiAoc3dhcF9xdWV1ZV9maW5kKHNpLCBcXHUwMDI2cmluZ19pZHgsIFxcdTAwMjZkZXZfaWR4KSlcXG4rXFx0XFx0X19zZXRfYml0KFNXQVBfREVWSUNFX01BU0tFRF9TSElGVCxcXG4rXFx0XFx0XFx0ICAodW5zaWduZWQgbG9uZyAqKVxcdTAwMjZzd2FwX3F1ZXVlW3JpbmdfaWR4XS1cXHUwMDNlZGV2W2Rldl9pZHhdKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc3dhcF9xdWV1ZV91bm1hc2soc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCByaW5nX2lkeCwgZGV2X2lkeDtcXG4rXFxuK1xcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRpZiAoc3dhcF9xdWV1ZV9maW5kKHNpLCBcXHUwMDI2cmluZ19pZHgsIFxcdTAwMjZkZXZfaWR4KSlcXG4rXFx0XFx0X19jbGVhcl9iaXQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZULFxcbitcXHRcXHRcXHQgICAgKHVuc2lnbmVkIGxvbmcgKilcXHUwMDI2c3dhcF9xdWV1ZVtyaW5nX2lkeF0tXFx1MDAzZWRldltkZXZfaWR4XSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqKm5ld19xdWV1ZSA9IE5VTEwsICoqb2xkX3F1ZXVlID0gTlVMTDtcXG4rXFx0c3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpuZXdfcmVhZGVycyA9IE5VTEw7XFxuK1xcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZywgKm5ld19yaW5nID0gTlVMTCwgKm9sZF9yaW5nID0gTlVMTDtcXG4rXFx0aW50IHByaW8gPSBzaS1cXHUwMDNlcHJpbztcXG4rXFx0aW50IGksIHBvcywgZXJyID0gLUVOT01FTTtcXG4rXFx0Z2ZwX3QgZ2ZwO1xcbitcXG4rXFx0LyogU3dhcCBub3QgdXNhYmxlIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHN3YXAsIGp1c3QgcmVjbGFpbSBjYWNoZS4gKi9cXG4rXFx0Z2ZwID0gR0ZQX05PSU8gfCBfX0dGUF9ISUdIO1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXG4rXFx0Zm9yIChwb3MgPSAwOyBwb3MgXFx1MDAzYyBzd2FwX3F1ZXVlX2xlbjsgcG9zKyspIHtcXG4rXFx0XFx0aWYgKHN3YXBfcXVldWVbcG9zXS1cXHUwMDNlcHJpbyA9PSBwcmlvKVxcbitcXHRcXHRcXHRnb3RvIGFkZF90b19yaW5nO1xcbitcXHRcXHRpZiAoc3dhcF9xdWV1ZVtwb3NdLVxcdTAwM2VwcmlvIFxcdTAwM2MgcHJpbylcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE5vIHJpbmcgYXQgdGhpcyBwcmlvcml0eTogaW5zZXJ0IGEgbmV3IG9uZSBhdCBwb3MuICovXFxuK1xcdG5ld19yZWFkZXJzID0gc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKHN3YXBfcXVldWVfbGVuICsgMSwgZ2ZwKTtcXG4rXFx0aWYgKCFuZXdfcmVhZGVycylcXG4rXFx0XFx0Z290byBmYWlsZWQ7XFxuK1xcdG5ld19xdWV1ZSA9IGttYWxsb2NfYXJyYXkoc3dhcF9xdWV1ZV9sZW4gKyAxLCBzaXplb2YoKnN3YXBfcXVldWUpLCBnZnApO1xcbitcXHRpZiAoIW5ld19xdWV1ZSlcXG4rXFx0XFx0Z290byBmYWlsZWQ7XFxuK1xcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShuZXdfcmluZywgZGV2LCAxKSwgZ2ZwKTtcXG4rXFx0aWYgKCFuZXdfcmluZylcXG4rXFx0XFx0Z290byBmYWlsZWQ7XFxuK1xcdGlmICghZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxcbitcXHRcXHRnb3RvIGZhaWxlZDtcXG4rXFxuK1xcdG5ld19yaW5nLVxcdTAwM2VwcmlvID0gcHJpbztcXG4rXFx0bmV3X3JpbmctXFx1MDAzZXNpemUgPSAxO1xcbitcXHRuZXdfcmluZy1cXHUwMDNlZGV2WzBdID0gc2k7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBwb3M7IGkrKylcXG4rXFx0XFx0bmV3X3F1ZXVlW2ldID0gc3dhcF9xdWV1ZVtpXTtcXG4rXFx0bmV3X3F1ZXVlW3Bvc10gPSBuZXdfcmluZztcXG4rXFx0Zm9yIChpID0gcG9zOyBpIFxcdTAwM2Mgc3dhcF9xdWV1ZV9sZW47IGkrKylcXG4rXFx0XFx0bmV3X3F1ZXVlW2kgKyAxXSA9IHN3YXBfcXVldWVbaV07XFxuK1xcbitcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRvbGRfcXVldWUgPSBzd2FwX3F1ZXVlO1xcbitcXHRzd2FwX3F1ZXVlID0gbmV3X3F1ZXVlO1xcbitcXHRzd2FwX3F1ZXVlX2xlbisrO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XFxuK1xcdGtmcmVlKG9sZF9xdWV1ZSk7XFxuK1xcbitcXHRzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhuZXdfcmVhZGVycyk7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rYWRkX3RvX3Jpbmc6XFxuK1xcdHJpbmcgPSBzd2FwX3F1ZXVlW3Bvc107XFxuK1xcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXFx1MDAzZXNpemUgKyAxKSwgZ2ZwKTtcXG4rXFx0aWYgKCFuZXdfcmluZylcXG4rXFx0XFx0Z290byBmYWlsZWQ7XFxuK1xcdGlmICghZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxcbitcXHRcXHRnb3RvIGZhaWxlZDtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4rXFx0bWVtY3B5KG5ld19yaW5nLCByaW5nLCBzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXFx1MDAzZXNpemUpKTtcXG4rXFx0bmV3X3JpbmctXFx1MDAzZXNpemUrKztcXG4rXFx0bmV3X3JpbmctXFx1MDAzZWRldltuZXdfcmluZy1cXHUwMDNlc2l6ZSAtIDFdID0gc2k7XFxuK1xcdG9sZF9yaW5nID0gc3dhcF9xdWV1ZVtwb3NdO1xcbitcXHRzd2FwX3F1ZXVlW3Bvc10gPSBuZXdfcmluZztcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRrZnJlZShvbGRfcmluZyk7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZmFpbGVkOlxcbitcXHRmcmVlX3BlcmNwdShuZXdfcmVhZGVycyk7XFxuK1xcdGtmcmVlKG5ld19xdWV1ZSk7XFxuK1xcdGtmcmVlKG5ld19yaW5nKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc3dhcF9xdWV1ZV9kZWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdGdmcF90IGdmcDtcXG4rXFx0dW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4O1xcbitcXHRzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKm5ld19yZWFkZXJzID0gTlVMTDtcXG4rXFx0c3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nLCAqbmV3X3JpbmcgPSBOVUxMLCAqb2xkX3JpbmcgPSBOVUxMO1xcbitcXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipuZXdfcXVldWUgPSBOVUxMLCAqKm9sZF9xdWV1ZSA9IE5VTEw7XFxuK1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRpZiAoIXN3YXBfcXVldWVfZmluZChzaSwgXFx1MDAyNnJpbmdfaWR4LCBcXHUwMDI2ZGV2X2lkeCkpIHtcXG4rXFx0XFx0V0FSTl9PTigxKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUbyBzaHJpbmsgbWVtb3J5IHVzYWdlLCBwcmUtYWxsb2NhdGUgbmV3IHNtYWxsZXIgZGF0YSBiZWZvcmVcXG4rXFx0ICogbG9ja2luZy4gRmFpbHVyZSBpcyBmaW5lLCBzd2Fwb2ZmIHdpbGwgcmVsZWFzZSB0aGVtIGFueXdheS5cXG4rXFx0ICovXFxuK1xcdGdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDtcXG4rXFx0cmluZyA9IHN3YXBfcXVldWVbcmluZ19pZHhdO1xcbitcXHRpZiAocmluZy1cXHUwMDNlc2l6ZSBcXHUwMDNlIDEpXFxuK1xcdFxcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXFx1MDAzZXNpemUgLSAxKSwgZ2ZwKTtcXG4rXFx0aWYgKHJpbmctXFx1MDAzZXNpemUgPT0gMSBcXHUwMDI2XFx1MDAyNiBzd2FwX3F1ZXVlX2xlbiBcXHUwMDNlIDEpIHtcXG4rXFx0XFx0bmV3X3JlYWRlcnMgPSBzd2FwX3F1ZXVlX3ByZWFsbG9jX3JlYWRlcnMoXFxuK1xcdFxcdFxcdFxcdFxcdHN3YXBfcXVldWVfbGVuIC0gMSwgZ2ZwKTtcXG4rXFx0XFx0bmV3X3F1ZXVlID0ga21hbGxvYyhzaXplb2YoKnN3YXBfcXVldWUpICpcXG4rXFx0XFx0XFx0XFx0ICAgIChzd2FwX3F1ZXVlX2xlbiAtIDEpLCBnZnApO1xcbitcXHR9XFxuK1xcbitcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRpZiAocmluZy1cXHUwMDNlc2l6ZSBcXHUwMDNlIDEpIHtcXG4rXFx0XFx0LyogU2hpZnQgdHJhaWxpbmcgZGV2aWNlcyBsZWZ0IHRvIGZpbGwgdGhlIGdhcC4gKi9cXG4rXFx0XFx0d2hpbGUgKCsrZGV2X2lkeCBcXHUwMDNjIHJpbmctXFx1MDAzZXNpemUpXFxuK1xcdFxcdFxcdHJpbmctXFx1MDAzZWRldltkZXZfaWR4IC0gMV0gPVxcbitcXHRcXHRcXHRcXHRyaW5nLVxcdTAwM2VkZXZbZGV2X2lkeF07XFxuK1xcdFxcdHJpbmctXFx1MDAzZXNpemUtLTtcXG4rXFx0XFx0aWYgKG5ld19yaW5nKSB7XFxuK1xcdFxcdFxcdG1lbWNweShuZXdfcmluZywgcmluZyxcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdF9zaXplKHJpbmcsIGRldiwgcmluZy1cXHUwMDNlc2l6ZSkpO1xcbitcXHRcXHRcXHRvbGRfcmluZyA9IHJpbmc7XFxuK1xcdFxcdFxcdHN3YXBfcXVldWVbcmluZ19pZHhdID0gbmV3X3Jpbmc7XFxuK1xcdFxcdH1cXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0LyogTGFzdCBkZXZpY2UgaW4gdGhpcyByaW5nOiByZW1vdmUgdGhlIHJpbmcuICovXFxuK1xcdFxcdG9sZF9yaW5nID0gcmluZztcXG4rXFx0XFx0c3dhcF9xdWV1ZV9sZW4tLTtcXG4rXFx0XFx0d2hpbGUgKCsrcmluZ19pZHggXFx1MDAzYz0gc3dhcF9xdWV1ZV9sZW4pXFxuK1xcdFxcdFxcdHN3YXBfcXVldWVbcmluZ19pZHggLSAxXSA9XFxuK1xcdFxcdFxcdFxcdHN3YXBfcXVldWVbcmluZ19pZHhdO1xcbitcXHRcXHRpZiAobmV3X3F1ZXVlKSB7XFxuK1xcdFxcdFxcdG1lbWNweShuZXdfcXVldWUsIHN3YXBfcXVldWUsXFxuK1xcdFxcdFxcdCAgICAgICBzaXplb2YoKnN3YXBfcXVldWUpICogc3dhcF9xdWV1ZV9sZW4pO1xcbitcXHRcXHRcXHRvbGRfcXVldWUgPSBzd2FwX3F1ZXVlO1xcbitcXHRcXHRcXHRzd2FwX3F1ZXVlID0gbmV3X3F1ZXVlO1xcbitcXHRcXHR9IGVsc2UgaWYgKCFzd2FwX3F1ZXVlX2xlbikge1xcbitcXHRcXHRcXHRvbGRfcXVldWUgPSBzd2FwX3F1ZXVlO1xcbitcXHRcXHRcXHRzd2FwX3F1ZXVlID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAobmV3X3JlYWRlcnMgfHwgIXN3YXBfcXVldWVfbGVuKVxcbitcXHRcXHRcXHRzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhuZXdfcmVhZGVycyk7XFxuK1xcdH1cXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXG4rXFx0a2ZyZWUob2xkX3JpbmcpO1xcbitcXHRrZnJlZShvbGRfcXVldWUpO1xcbitcXHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xcbit9XFxuK1xcbiAvKlxcbiAgKiBVc2UgdGhlIHNlY29uZCBoaWdoZXN0IGJpdCBvZiBpbnVzZV9wYWdlcyBjb3VudGVyIGFzIHRoZSBpbmRpY2F0b3JcXG4tICogaWYgb25lIHN3YXAgZGV2aWNlIGlzIG9uIHRoZSBhdmFpbGFibGUgcGxpc3QsIHNvIHRoZSBhdG9taWMgY2FuXFxuKyAqIGlmIG9uZSBzd2FwIGRldmljZSBpcyB1bmF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiwgc28gdGhlIGF0b21pYyBjYW5cXG4gICogc3RpbGwgYmUgdXBkYXRlZCBhcml0aG1ldGljYWxseSB3aGlsZSBoYXZpbmcgc3BlY2lhbCBkYXRhIGVtYmVkZGVkLlxcbiAgKlxcbiAgKiBpbnVzZV9wYWdlcyBjb3VudGVyIGlzIHRoZSBvbmx5IHRoaW5nIGluZGljYXRpbmcgaWYgYSBkZXZpY2Ugc2hvdWxkXFxuLSAqIGJlIG9uIGF2YWlsX2xpc3RzIG9yIG5vdCAoZXhjZXB0IHN3YXBvbiAvIHN3YXBvZmYpLiBCeSBlbWJlZGRpbmcgdGhlXFxuLSAqIG9mZi1saXN0IGJpdCBpbiB0aGUgYXRvbWljIGNvdW50ZXIsIHVwZGF0ZXMgbm8gbG9uZ2VyIG5lZWQgYW55IGxvY2tcXG4tICogdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxcbisgKiBiZSBpbiB0aGUgYXZhaWxhYmxlIHF1ZXVlIG9yIG5vdCAoZXhjZXB0IHN3YXBvbiAvIHN3YXBvZmYpLiBCeVxcbisgKiBlbWJlZGRpbmcgdGhlIG9mZi1saXN0IGJpdCBpbiB0aGUgYXRvbWljIGNvdW50ZXIsIHVwZGF0ZXMgbm8gbG9uZ2VyXFxuKyAqIG5lZWQgYW55IGxvY2sgdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxcbiAgKlxcbi0gKiBUaGlzIGJpdCB3aWxsIGJlIHNldCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBvbiB0aGUgcGxpc3QgYW5kIG5vdFxcbi0gKiB1c2FibGUsIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGUgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdC5cXG4rICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3QgaW4gdGhlIGF2YWlsYWJsZSBxdWV1ZVxcbisgKiBhbmQgbm90IHVzYWJsZSwgd2lsbCBiZSBjbGVhcmVkIGlmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIHF1ZXVlLlxcbiAgKi9cXG4gI2RlZmluZSBTV0FQX1VTQUdFX09GRkxJU1RfQklUICgxVUwgXFx1MDAzY1xcdTAwM2MgKEJJVFNfUEVSX1RZUEUoYXRvbWljX3QpIC0gMikpXFxuICNkZWZpbmUgU1dBUF9VU0FHRV9DT1VOVEVSX01BU0sgKH5TV0FQX1VTQUdFX09GRkxJU1RfQklUKVxcbkBAIC0xNjMsNiArNDkxLDI2IEBAIHN0YXRpYyBsb25nIHN3YXBfdXNhZ2VfaW5fcGFnZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbiBcXHRyZXR1cm4gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKSBcXHUwMDI2IFNXQVBfVVNBR0VfQ09VTlRFUl9NQVNLO1xcbiB9XFxuIFxcbisvKlxcbisgKiBTZXJpYWxpemUgdGhlIGFsbG9jYXRpb24gb24gc2luZ2xlIENQVSBvciBnbG9iYWxseSB0byBhdm9pZFxcbisgKiBmcmFnbWVudGF0aW9uIGFuZCBtYWtlIHRoZSB3b3JrZmxvdyBlYXNpZXIgdG8gZm9sbG93LlxcbisgKi9cXG4rc3RhdGljIHZvaWQgc3dhcF9hbGxvY19sb2NrX2RldmljZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuK3tcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxcbitcXHRcXHRsb2NhbF9sb2NrKFxcdTAwMjZzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXItXFx1MDAzZWxvY2spO1xcbitcXHRlbHNlXFxuK1xcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyLVxcdTAwM2Vsb2NrKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4re1xcbitcXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpXFxuK1xcdFxcdGxvY2FsX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZXBlcmNwdV9jbHVzdGVyLVxcdTAwM2Vsb2NrKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyLVxcdTAwM2Vsb2NrKTtcXG4rfVxcbitcXG4gLyogUmVjbGFpbSB0aGUgc3dhcCBlbnRyeSBhbnl3YXkgaWYgcG9zc2libGUgKi9cXG4gI2RlZmluZSBUVFJTX0FOWVdBWVxcdFxcdDB4MVxcbiAvKlxcbkBAIC01MzMsOSArODgxLDEwIEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIFxcdCAqIE9ubHkgY2x1c3RlciBpc29sYXRpb24gZnJvbSB0aGUgYWxsb2NhdG9yIGRvZXMgdGFibGUgYWxsb2NhdGlvbi5cXG4gXFx0ICogU3dhcCBhbGxvY2F0b3IgdXNlcyBwZXJjcHUgY2x1c3RlcnMgYW5kIGhvbGRzIHRoZSBsb2NhbCBsb2NrLlxcbiBcXHQgKi9cXG4tXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2dGhpc19jcHVfcHRyKFxcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyKS1cXHUwMDNlbG9jayk7XFxuLVxcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcXG4tXFx0XFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xcbitcXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpXFxuK1xcdFxcdGxvY2tkZXBfYXNzZXJ0X2hlbGQodGhpc19jcHVfcHRyKFxcdTAwMjZzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXItXFx1MDAzZWxvY2spKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZWxvY2spO1xcbiBcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuIFxcbiBcXHRpZiAoIXN3YXBfY2x1c3Rlcl9hbGxvY190YWJsZShjaSwgX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfFxcbkBAIC01NDgsOSArODk3LDcgQEAgc3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0ICogdGhlIHBvdGVudGlhbCByZWN1cnNpdmUgYWxsb2NhdGlvbiBpcyBsaW1pdGVkLlxcbiBcXHQgKi9cXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4tXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xcbi1cXHRsb2NhbF91bmxvY2soXFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XFxuK1xcdHN3YXBfYWxsb2NfdW5sb2NrX2RldmljZShzaSk7XFxuIFxcbiBcXHRyZXQgPSBzd2FwX2NsdXN0ZXJfYWxsb2NfdGFibGUoY2ksIF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgR0ZQX0tFUk5FTCk7XFxuQEAgLTU2Myw5ICs5MTAsNyBAQCBzd2FwX2NsdXN0ZXJfcG9wdWxhdGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHQgKiBjb3VsZCBoYXBwZW4gd2l0aCBpZ25vcmluZyB0aGUgcGVyY3B1IGNsdXN0ZXIgaXMgZnJhZ21lbnRhdGlvbixcXG4gXFx0ICogd2hpY2ggaXMgYWNjZXB0YWJsZSBzaW5jZSB0aGlzIGZhbGxiYWNrIGFuZCByYWNlIGlzIHJhcmUuXFxuIFxcdCAqL1xcbi1cXHRsb2NhbF9sb2NrKFxcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spO1xcbi1cXHRpZiAoIShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfU09MSURTVEFURSkpXFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xcbitcXHRzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHNpKTtcXG4gXFx0c3Bpbl9sb2NrKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuIFxcbiBcXHRpZiAocmV0KSB7XFxuQEAgLTY3MSw3ICsxMDE2LDcgQEAgc3RhdGljIGJvb2wgc3dhcF9kb19zY2hlZHVsZWRfZGlzY2FyZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIFxcdFxcdGNpID0gbGlzdF9maXJzdF9lbnRyeShcXHUwMDI2c2ktXFx1MDAzZWRpc2NhcmRfY2x1c3RlcnMsIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbywgbGlzdCk7XFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIERlbGV0ZSB0aGUgY2x1c3RlciBmcm9tIGxpc3QgdG8gcHJlcGFyZSBmb3IgZGlzY2FyZCwgYnV0IGtlZXBcXG4tXFx0XFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHBlcmNwdV9zd2FwX2NsdXN0ZXIgY291bGQgYmVcXG4rXFx0XFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHRoZXJlIGNvdWxkIGJlIHBlcmNwdV9jbHVzdGVyXFxuIFxcdFxcdCAqIHBvaW50aW5nIHRvIGl0LCBvciByYW4gaW50byBieSByZWxvY2F0ZV9jbHVzdGVyLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0bGlzdF9kZWwoXFx1MDAyNmNpLVxcdTAwM2VsaXN0KTtcXG5AQCAtOTU1LDcgKzEzMDAsNyBAQCBzdGF0aWMgYm9vbCBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0aWYgKGNsdXN0ZXJfaXNfZW1wdHkoY2kpKVxcbiBcXHRcXHRjaS1cXHUwMDNlb3JkZXIgPSBvcmRlcjtcXG4gXFx0Y2ktXFx1MDAzZWNvdW50ICs9IG5yX3BhZ2VzO1xcbi1cXHRzd2FwX3JhbmdlX2FsbG9jKHNpLCBucl9wYWdlcyk7XFxuK1xcdHN3YXBfZGV2aWNlX2ludXNlX2FkZChzaSwgbnJfcGFnZXMpO1xcbiBcXG4gXFx0cmV0dXJuIHRydWU7XFxuIH1cXG5AQCAtMTAwMywxMiArMTM0OCwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gb3V0OlxcbiBcXHRyZWxvY2F0ZV9jbHVzdGVyKHNpLCBjaSk7XFxuIFxcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xcbi1cXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpIHtcXG4tXFx0XFx0dGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5vZmZzZXRbb3JkZXJdLCBuZXh0KTtcXG4tXFx0XFx0dGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0sIHNpKTtcXG4tXFx0fSBlbHNlIHtcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxcbitcXHRcXHR0aGlzX2NwdV93cml0ZShzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXItXFx1MDAzZW5leHRbb3JkZXJdLCBuZXh0KTtcXG4rXFx0ZWxzZVxcbiBcXHRcXHRzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZW5leHRbb3JkZXJdID0gbmV4dDtcXG4tXFx0fVxcbiBcXHRyZXR1cm4gZm91bmQ7XFxuIH1cXG4gXFxuQEAgLTExMDMsMTMgKzE0NDYsMTQgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0aWYgKG9yZGVyIFxcdTAwMjZcXHUwMDI2ICEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX0JMS0RFVikpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpKSB7XFxuLVxcdFxcdC8qIFNlcmlhbGl6ZSBIREQgU1dBUCBhbGxvY2F0aW9uIGZvciBlYWNoIGRldmljZS4gKi9cXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXJfbG9jayk7XFxuK3Jlc3RhcnQ6XFxuK1xcdHN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc2kpO1xcbitcXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpXFxuK1xcdFxcdG9mZnNldCA9IF9fdGhpc19jcHVfcmVhZChzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXItXFx1MDAzZW5leHRbb3JkZXJdKTtcXG4rXFx0ZWxzZVxcbiBcXHRcXHRvZmZzZXQgPSBzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZW5leHRbb3JkZXJdO1xcbi1cXHRcXHRpZiAob2Zmc2V0ID09IFNXQVBfRU5UUllfSU5WQUxJRClcXG4tXFx0XFx0XFx0Z290byBuZXdfY2x1c3RlcjtcXG4gXFxuK1xcdGlmIChvZmZzZXQgIT0gU1dBUF9FTlRSWV9JTlZBTElEKSB7XFxuIFxcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XFxuIFxcdFxcdC8qIENsdXN0ZXIgY291bGQgaGF2ZSBiZWVuIHVzZWQgYnkgYW5vdGhlciBvcmRlciAqL1xcbiBcXHRcXHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIG9yZGVyKSkge1xcbkBAIC0xMTIzLDcgKzE0NjcsNiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRcXHRnb3RvIGRvbmU7XFxuIFxcdH1cXG4gXFxuLW5ld19jbHVzdGVyOlxcbiBcXHQvKlxcbiBcXHQgKiBJZiB0aGUgZGV2aWNlIG5lZWQgZGlzY2FyZCwgcHJlZmVyIG5ldyBjbHVzdGVyIG92ZXIgbm9uZnVsbFxcbiBcXHQgKiB0byBzcHJlYWQgb3V0IHRoZSB3cml0ZXMuXFxuQEAgLTExMzIsNiArMTQ3NSwxMiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRmb3VuZCA9IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHNpLCBcXHUwMDI2c2ktXFx1MDAzZWZyZWVfY2x1c3RlcnMsIGZvbGlvLCBmYWxzZSk7XFxuIFxcdFxcdGlmIChmb3VuZClcXG4gXFx0XFx0XFx0Z290byBkb25lO1xcbitcXG4rXFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZzaS1cXHUwMDNlZGlzY2FyZF9jbHVzdGVycykpIHtcXG4rXFx0XFx0XFx0c3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTtcXG4rXFx0XFx0XFx0c3dhcF9kb19zY2hlZHVsZWRfZGlzY2FyZChzaSk7XFxuK1xcdFxcdFxcdGdvdG8gcmVzdGFydDtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbiBcXHRpZiAob3JkZXIgXFx1MDAzYyBQTURfT1JERVIpIHtcXG5AQCAtMTE4MCw4ICsxNTI5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0XFx0XFx0Z290byBkb25lO1xcbiBcXHR9XFxuIGRvbmU6XFxuLVxcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNpLVxcdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcXG4rXFx0c3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTtcXG4gXFxuIFxcdHJldHVybiBmb3VuZDtcXG4gfVxcbkBAIC0xMTkxLDU0ICsxNTM5LDQ0IEBAIHN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBwYWdlcztcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4gXFxuLVxcdGlmIChzd2Fwb2ZmKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEZvcmNlZnVsbHkgcmVtb3ZlIGl0LiBDbGVhciB0aGUgU1dQX1dSSVRFT0sgZmxhZ3MgZm9yXFxuLVxcdFxcdCAqIHN3YXBvZmYgaGVyZSBzbyBpdCdzIHN5bmNocm9uaXplZCBieSBib3RoIHNpLVxcdTAwM2Vsb2NrIGFuZFxcbi1cXHRcXHQgKiBzd2FwX2F2YWlsX2xvY2ssIHRvIGVuc3VyZSB0aGUgcmVzdWx0IGNhbiBiZSBzZWVuIGJ5XFxuLVxcdFxcdCAqIGFkZF90b19hdmFpbF9saXN0Llxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbi1cXHRcXHRzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNj0gflNXUF9XUklURU9LO1xcbi1cXHRcXHRhdG9taWNfbG9uZ19vcihTV0FQX1VTQUdFX09GRkxJU1RfQklULCBcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgbm90IGNhbGxlZCBieSBzd2Fwb2ZmLCB0YWtlIGl0IG9mZi1saXN0IG9ubHkgaWYgaXQnc1xcbi1cXHRcXHQgKiBmdWxsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQgKHN0cmljdGx5XFxuLVxcdFxcdCAqIHNpLVxcdTAwM2VpbnVzZV9wYWdlcyA9PSBwYWdlcyksIGFueSBjb25jdXJyZW50IHNsb3QgZnJlZWluZyxcXG4tXFx0XFx0ICogb3IgZGV2aWNlIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHBsaXN0IGJ5IHNvbWVvbmUgZWxzZVxcbi1cXHRcXHQgKiB3aWxsIG1ha2UgdGhpcyByZXR1cm4gZmFsc2UuXFxuLVxcdFxcdCAqL1xcbitcXHQvKlxcbitcXHQgKiBGb3JjZSByZW1vdmUgaXQgb25seSBmb3Igc3dhcG9mZi4gRWxzZSwgdGFrZSBpdCBvZmYtbGlzdCBvbmx5IGlmXFxuK1xcdCAqIGl0J3MgZnVsbCBhbmQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBpcyBub3Qgc2V0IChzdHJpY3RseVxcbitcXHQgKiBzaS1cXHUwMDNlaW51c2VfcGFnZXMgPT0gcGFnZXMpLCBzbyBjb25jdXJyZW50IHNsb3QgZnJlZWluZywgb3JcXG4rXFx0ICogY29uY3VycmVudCBsaXN0IHJlbW92YWwgd2lsbCBtYWtlIHRoZSBjbXB4Y2hnIGZhaWwgYW5kIHNraXBcXG4rXFx0ICogdGhlIHJlbW92YWwuXFxuK1xcdCAqL1xcbitcXHRpZiAoIXN3YXBvZmYpIHtcXG4gXFx0XFx0cGFnZXMgPSBzaS1cXHUwMDNlcGFnZXM7XFxuIFxcdFxcdGlmICghYXRvbWljX2xvbmdfdHJ5X2NtcHhjaGcoXFx1MDAyNnNpLVxcdTAwM2VpbnVzZV9wYWdlcywgXFx1MDAyNnBhZ2VzLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VzIHwgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCkpXFxuIFxcdFxcdFxcdGdvdG8gc2tpcDtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0YXRvbWljX2xvbmdfb3IoU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgXFx1MDAyNnNpLVxcdTAwM2VpbnVzZV9wYWdlcyk7XFxuIFxcdH1cXG4gXFxuLVxcdHBsaXN0X2RlbChcXHUwMDI2c2ktXFx1MDAzZWF2YWlsX2xpc3QsIFxcdTAwMjZzd2FwX2F2YWlsX2hlYWQpO1xcbi1cXG4rXFx0c3dhcF9xdWV1ZV9tYXNrKHNpKTtcXG4gc2tpcDpcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4gfVxcbiBcXG4gLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHRoaXMgaGVscGVyLiAqL1xcbi1zdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxcbitzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIHtcXG4gXFx0bG9uZyB2YWw7XFxuIFxcdHVuc2lnbmVkIGxvbmcgcGFnZXM7XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XFxuIFxcbi1cXHQvKiBDb3JyZXNwb25kaW5nIHRvIFNXUF9XUklURU9LIGNsZWFyaW5nIGluIGRlbF9mcm9tX2F2YWlsX2xpc3QgKi9cXG4tXFx0aWYgKHN3YXBvbikge1xcbi1cXHRcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuLVxcdFxcdHNpLVxcdTAwM2VmbGFncyB8PSBTV1BfV1JJVEVPSztcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKCEoUkVBRF9PTkNFKHNpLVxcdTAwM2VmbGFncykgXFx1MDAyNiBTV1BfV1JJVEVPSykpXFxuLVxcdFxcdFxcdGdvdG8gc2tpcDtcXG4tXFx0fVxcbitcXHQvKlxcbitcXHQgKiBNYXJrIHRoZSBkZXZpY2UgYXMgYXZhaWwgaWYgU1dQX1dSSVRFT0sgaXMgc2V0LiBTd2Fwb2ZmIGNsZWFyc1xcbitcXHQgKiBTV1BfV1JJVEVPSyBmaXJzdCwgc28gY2hlY2sgdGhhdCBmaXJzdCBzbyB0aGUgZGV2aWNlIHdvbid0IGJlXFxuK1xcdCAqIHJlLWFkZGVkIGFmdGVyIHN3YXBvZmYgc3RhcnRlZC5cXG4rXFx0ICovXFxuK1xcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9XUklURU9LKSlcXG4rXFx0XFx0Z290byBza2lwO1xcbiBcXG4gXFx0aWYgKCEoYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKSBcXHUwMDI2IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxcbiBcXHRcXHRnb3RvIHNraXA7XFxuQEAgLTEyNDYsOSArMTU4NCwxMCBAQCBzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxcbiBcXHR2YWwgPSBhdG9taWNfbG9uZ19mZXRjaF9hbmRfcmVsYXhlZCh+U1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgXFx1MDAyNnNpLVxcdTAwM2VpbnVzZV9wYWdlcyk7XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBkZXZpY2UgaXMgb24gdGhlIHBsaXN0LCBvbmx5IG9uZSB1cGRhdGVyIHdpbGxcXG4tXFx0ICogc2VlIChpbnVzZV9wYWdlcyA9PSBzaS1cXHUwMDNlcGFnZXMpIGFuZCB3aWxsIGNhbGwgZGVsX2Zyb21fYXZhaWxfbGlzdC4gSWZcXG4tXFx0ICogdGhhdCB1cGRhdGVyIGhhcHBlbiB0byBiZSBoZXJlLCBqdXN0IHNraXAgYWRkaW5nLlxcbitcXHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBtYXJrZWQgYXMgYXZhaWxhYmxlLCBvbmUgcmVhZGVyIHdpbGwgc2VlXFxuK1xcdCAqIChpbnVzZV9wYWdlcyA9PSBzaS1cXHUwMDNlcGFnZXMpIGFuZCBzaG91bGQgbWFyayBpdCBhcyB1bmF2YWlsYWJsZSBhbmRcXG4rXFx0ICogc2V0IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQuIElmIHRoYXQgdXBkYXRlciBoYXBwZW5zIHRvIGJlIGhlcmUsIGp1c3RcXG4rXFx0ICogc2tpcCB0aGUgcmVzdC5cXG4gXFx0ICovXFxuIFxcdHBhZ2VzID0gc2ktXFx1MDAzZXBhZ2VzO1xcbiBcXHRpZiAodmFsID09IHBhZ2VzKSB7XFxuQEAgLTEyNTgsNjAgKzE1OTcsNDIgQEAgc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbilcXG4gXFx0XFx0XFx0Z290byBza2lwO1xcbiBcXHR9XFxuIFxcbi1cXHRwbGlzdF9hZGQoXFx1MDAyNnNpLVxcdTAwM2VhdmFpbF9saXN0LCBcXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcXG4tXFxuK1xcdHN3YXBfcXVldWVfdW5tYXNrKHNpKTtcXG4gc2tpcDpcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4gfVxcbiBcXG4gLypcXG4tICogc3dhcF91c2FnZV9hZGQgLyBzd2FwX3VzYWdlX3N1YiBvZiBlYWNoIHNsb3QgYXJlIHNlcmlhbGl6ZWQgYnkgY2ktXFx1MDAzZWxvY2tcXG4tICogd2l0aGluIGVhY2ggY2x1c3Rlciwgc28gdGhlIHRvdGFsIGNvbnRyaWJ1dGlvbiB0byB0aGUgZ2xvYmFsIGNvdW50ZXIgc2hvdWxkXFxuLSAqIGFsd2F5cyBiZSBwb3NpdGl2ZSBhbmQgY2Fubm90IGV4Y2VlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHVzYWJsZSBzbG90cy5cXG4rICogc3dhcF9kZXZpY2VfaW51c2VfYWRkIC8gc3dhcF9kZXZpY2VfaW51c2Vfc3ViIGFyZSBjYWxsZWQgd2l0aGluIGNsdXN0ZXJcXG4rICogdXBkYXRlIGNyaXRpY2FsIHNlY3Rpb25zIGFuZCBzZXJpYWxpemVkIGJ5IGNpLVxcdTAwM2Vsb2NrIHdpdGhpbiBlYWNoIGNsdXN0ZXIsXFxuKyAqIHNvIHRoZSB0b3RhbCBjb250cmlidXRpb24gdG8gdGhlIGdsb2JhbCBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmVcXG4rICogYW5kIGNhbm5vdCBleGNlZWQgdGhlIHRvdGFsIG51bWJlciBvZiB1c2FibGUgc2xvdHMuXFxuICAqL1xcbi1zdGF0aWMgYm9vbCBzd2FwX3VzYWdlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxcbitzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxcbiB7XFxuLVxcdGxvbmcgdmFsID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFxcdTAwMjZzaS1cXHUwMDNlaW51c2VfcGFnZXMpO1xcbitcXHRsb25nIGludXNlX3BhZ2VzO1xcbiBcXG4gXFx0LypcXG4gXFx0ICogSWYgZGV2aWNlIGlzIGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQsXFxuLVxcdCAqIHJlbW92ZSBpdCBmcm9tIHRoZSBwbGlzdC5cXG4tXFx0ICovXFxuLVxcdGlmICh1bmxpa2VseSh2YWwgPT0gc2ktXFx1MDAzZXBhZ2VzKSkge1xcbi1cXHRcXHRkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7XFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gZmFsc2U7XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIHN3YXBfdXNhZ2Vfc3ViKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXFxuLXtcXG4tXFx0bG9uZyB2YWwgPSBhdG9taWNfbG9uZ19zdWJfcmV0dXJuX3JlbGF4ZWQobnJfZW50cmllcywgXFx1MDAyNnNpLVxcdTAwM2VpbnVzZV9wYWdlcyk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBJZiBkZXZpY2UgaXMgbm90IGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIHNldCxcXG4tXFx0ICogYWRkIGl0IHRvIHRoZSBwbGlzdC5cXG4rXFx0ICogbWFyayBpdCB1bmF2YWlsYWJsZS5cXG4gXFx0ICovXFxuLVxcdGlmICh1bmxpa2VseSh2YWwgXFx1MDAyNiBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSlcXG4tXFx0XFx0YWRkX3RvX2F2YWlsX2xpc3Qoc2ksIGZhbHNlKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuLVxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXFxuLXtcXG4tXFx0aWYgKHN3YXBfdXNhZ2VfYWRkKHNpLCBucl9lbnRyaWVzKSkge1xcbitcXHRpbnVzZV9wYWdlcyA9IGF0b21pY19sb25nX2FkZF9yZXR1cm5fcmVsYXhlZChucl9lbnRyaWVzLCBcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKTtcXG4rXFx0aWYgKHVubGlrZWx5KGludXNlX3BhZ2VzID09IHNpLVxcdTAwM2VwYWdlcykpIHtcXG4gXFx0XFx0aWYgKHZtX3N3YXBfZnVsbCgpKVxcbiBcXHRcXHRcXHRzY2hlZHVsZV93b3JrKFxcdTAwMjZzaS1cXHUwMDNlcmVjbGFpbV93b3JrKTtcXG4rXFx0XFx0ZGVsX2Zyb21fYXZhaWxfbGlzdChzaSwgZmFsc2UpO1xcbiBcXHR9XFxuK1xcbiBcXHRhdG9taWNfbG9uZ19zdWIobnJfZW50cmllcywgXFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcXG4tXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxcbitzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9zdWIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcXG4rXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcylcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIGVuZCA9IG9mZnNldCArIG5yX2VudHJpZXMgLSAxO1xcbiBcXHR2b2lkICgqc3dhcF9zbG90X2ZyZWVfbm90aWZ5KShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpO1xcbitcXHRsb25nIGludXNlX3BhZ2VzO1xcbiBcXHR1bnNpZ25lZCBpbnQgaTtcXG4gXFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9lbnRyaWVzOyBpKyspXFxuQEAgLTEzMzUsNyArMTY1NiwxNCBAQCBzdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcXG4gXFx0ICovXFxuIFxcdHNtcF93bWIoKTtcXG4gXFx0YXRvbWljX2xvbmdfYWRkKG5yX2VudHJpZXMsIFxcdTAwMjZucl9zd2FwX3BhZ2VzKTtcXG4tXFx0c3dhcF91c2FnZV9zdWIoc2ksIG5yX2VudHJpZXMpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSWYgZGV2aWNlIGlzIG5vdCBmdWxsLCBhbmQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBpcyBzZXQsXFxuK1xcdCAqIGFkZCBpdCBiYWNrIHRvIHRoZSBhdmFpbGFibGUgcXVldWUuXFxuK1xcdCAqL1xcbitcXHRpbnVzZV9wYWdlcyA9IGF0b21pY19sb25nX3N1Yl9yZXR1cm5fcmVsYXhlZChucl9lbnRyaWVzLCBcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKTtcXG4rXFx0aWYgKHVubGlrZWx5KGludXNlX3BhZ2VzIFxcdTAwMjYgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCkpXFxuK1xcdFxcdGFkZF90b19hdmFpbF9saXN0KHNpKTtcXG4gfVxcbiBcXG4gc3RhdGljIGJvb2wgZ2V0X3N3YXBfZGV2aWNlX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbkBAIC0xMzQ1LDExMyArMTY3Myw0OSBAQCBzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIFxcdC8qXFxuIFxcdCAqIEd1YXJhbnRlZSB0aGUgc2ktXFx1MDAzZXVzZXJzIGFyZSBjaGVja2VkIGJlZm9yZSBhY2Nlc3Npbmcgb3RoZXJcXG4gXFx0ICogZmllbGRzIG9mIHN3YXBfaW5mb19zdHJ1Y3QsIGFuZCBzaS1cXHUwMDNlZmxhZ3MgKFNXUF9XUklURU9LKSBpc1xcbi1cXHQgKiB1cCB0byBkYXRlZC5cXG4rXFx0ICogdXAgdG8gZGF0ZS5cXG4gXFx0ICpcXG4tXFx0ICogUGFpcmVkIHdpdGggdGhlIHNwaW5fdW5sb2NrKCkgYWZ0ZXIgc2V0dXBfc3dhcF9pbmZvKCkgaW5cXG4tXFx0ICogZW5hYmxlX3N3YXBfaW5mbygpLCBhbmQgc21wX3dtYigpIGluIHN3YXBvZmYuXFxuK1xcdCAqIFBhaXJlZCB3aXRoIHBlcmNwdV91cF93cml0ZSgpIGluIHN3YXBfZGV2aWNlX2VuYWJsZSgpLCBhbmRcXG4rXFx0ICogc21wX3dtYigpIGFmdGVyIGNsZWFyaW5nIFNXUF9XUklURU9LIGluIHN3YXBvZmYuXFxuIFxcdCAqL1xcbiBcXHRzbXBfcm1iKCk7XFxuIFxcdHJldHVybiB0cnVlO1xcbiB9XFxuIFxcbi0vKlxcbi0gKiBGYXN0IHBhdGggdHJ5IHRvIGdldCBzd2FwIGVudHJpZXMgd2l0aCBzcGVjaWZpZWQgb3JkZXIgZnJvbSBjdXJyZW50XFxuLSAqIENQVSdzIHN3YXAgZW50cnkgcG9vbCAoYSBjbHVzdGVyKS5cXG4tICovXFxuLXN0YXRpYyBib29sIHN3YXBfYWxsb2NfZmFzdChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbitzdGF0aWMgaW50IHN3YXBfYWxsb2NfZW50cnkoc3RydWN0IGZvbGlvICpmb2xpbylcXG4ge1xcbi1cXHR1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuLVxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XFxuK1xcdGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuIFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4tXFx0dW5zaWduZWQgaW50IG9mZnNldDtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIE9uY2UgYWxsb2NhdGVkLCBzd2FwX2luZm9fc3RydWN0IHdpbGwgbmV2ZXIgYmUgY29tcGxldGVseSBmcmVlZCxcXG4tXFx0ICogc28gY2hlY2tpbmcgaXQncyBsaXZlbmVzcyBieSBnZXRfc3dhcF9kZXZpY2VfaW5mbyBpcyBlbm91Z2guXFxuLVxcdCAqL1xcbi1cXHRzaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0pO1xcbi1cXHRvZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0W29yZGVyXSk7XFxuLVxcdGlmICghc2kgfHwgIW9mZnNldCB8fCAhZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRjaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpO1xcbi1cXHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIG9yZGVyKSkge1xcbi1cXHRcXHRpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpXFxuLVxcdFxcdFxcdG9mZnNldCA9IGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSk7XFxuLVxcdFxcdGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHNpLCBjaSwgZm9saW8sIG9mZnNldCk7XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xcbi1cXHR9XFxuK1xcdGludCBucl9pdGVyLCByZXQ7XFxuK1xcbitcXHRwZXJjcHVfZG93bl9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRmb3IgKG5yX2l0ZXIgPSAwOzsgbnJfaXRlcisrKSB7XFxuK1xcdFxcdHNpID0gc3dhcF9xdWV1ZV9nZXRfZGV2aWNlKG5yX3BhZ2VzLCBucl9pdGVyKTtcXG4rXFx0XFx0aWYgKElTX0VSUihzaSkpIHtcXG4rXFx0XFx0XFx0cmV0ID0gUFRSX0VSUihzaSk7XFxuK1xcdFxcdFxcdGlmIChyZXQgPT0gLUVCVVNZKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBmb2xpbyk7XFxuIFxcbi1cXHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xcbi1cXHRyZXR1cm4gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbi19XFxuLVxcbi0vKiBSb3RhdGUgdGhlIGRldmljZSBhbmQgc3dpdGNoIHRvIGEgbmV3IGNsdXN0ZXIgKi9cXG4tc3RhdGljIHZvaWQgc3dhcF9hbGxvY19zbG93KHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLXtcXG4tXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCAqbmV4dDtcXG4tXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4tc3RhcnRfb3ZlcjpcXG4tXFx0cGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzaSwgbmV4dCwgXFx1MDAyNnN3YXBfYXZhaWxfaGVhZCwgYXZhaWxfbGlzdCkge1xcbi1cXHRcXHQvKiBSb3RhdGUgdGhlIGRldmljZSBhbmQgc3dpdGNoIHRvIGEgbmV3IGNsdXN0ZXIgKi9cXG4tXFx0XFx0cGxpc3RfcmVxdWV1ZShcXHUwMDI2c2ktXFx1MDAzZWF2YWlsX2xpc3QsIFxcdTAwMjZzd2FwX2F2YWlsX2hlYWQpO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4tXFx0XFx0aWYgKGdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkge1xcbi1cXHRcXHRcXHRjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIGZvbGlvKTtcXG4tXFx0XFx0XFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0cmV0dXJuO1xcbi1cXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuLVxcdFxcdFxcdFxcdHJldHVybjtcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xcbitcXHRcXHRcXHRyZXQgPSAwO1xcbitcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbiBcXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBpZiB3ZSBnb3QgaGVyZSwgaXQncyBsaWtlbHkgdGhhdCBzaSB3YXMgYWxtb3N0IGZ1bGwgYmVmb3JlLFxcbi1cXHRcXHQgKiBtdWx0aXBsZSBjYWxsZXJzIHByb2JhYmx5IGFsbCB0cmllZCB0byBnZXQgYSBwYWdlIGZyb20gdGhlXFxuLVxcdFxcdCAqIHNhbWUgc2kgYW5kIGl0IGZpbGxlZCB1cCBiZWZvcmUgd2UgY291bGQgZ2V0IG9uZTsgb3IsIHRoZSBzaVxcbi1cXHRcXHQgKiBmaWxsZWQgdXAgYmV0d2VlbiB1cyBkcm9wcGluZyBzd2FwX2F2YWlsX2xvY2suXFxuLVxcdFxcdCAqIFNpbmNlIHdlIGRyb3BwZWQgdGhlIHN3YXBfYXZhaWxfbG9jaywgdGhlIHN3YXBfYXZhaWxfbGlzdFxcbi1cXHRcXHQgKiBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkOyBzbyBpZiBuZXh0IGlzIHN0aWxsIGluIHRoZVxcbi1cXHRcXHQgKiBzd2FwX2F2YWlsX2hlYWQgbGlzdCB0aGVuIHRyeSBpdCwgb3RoZXJ3aXNlIHN0YXJ0IG92ZXIgaWYgd2VcXG4tXFx0XFx0ICogaGF2ZSBub3QgZ290dGVuIGFueSBzbG90cy5cXG4rXFx0XFx0ICogRm9yIGxhcmdlIGFsbG9jYXRpb24sIHJldHVybiBlcnJvciBkaXJlY3RseSB0byBpbmZvcm0gdGhlXFxuK1xcdFxcdCAqIGNhbGxlciB0byBzcGxpdCBpdCBpbnN0ZWFkIG9mIGZhbGxiYWNrIHRvIG90aGVyIGRldmljZXMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRpZiAocGxpc3Rfbm9kZV9lbXB0eShcXHUwMDI2bmV4dC1cXHUwMDNlYXZhaWxfbGlzdCkpXFxuLVxcdFxcdFxcdGdvdG8gc3RhcnRfb3ZlcjtcXG4tXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4tfVxcbi1cXG4tLypcXG4tICogRGlzY2FyZCBwZW5kaW5nIGNsdXN0ZXJzIGluIGEgc3luY2hyb25pemVkIHdheSB3aGVuIHVuZGVyIGhpZ2ggcHJlc3N1cmUuXFxuLSAqIFJldHVybjogdHJ1ZSBpZiBhbnkgY2x1c3RlciBpcyBkaXNjYXJkZWQuXFxuLSAqL1xcbi1zdGF0aWMgYm9vbCBzd2FwX3N5bmNfZGlzY2FyZCh2b2lkKVxcbi17XFxuLVxcdGJvb2wgcmV0ID0gZmFsc2U7XFxuLVxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgKm5leHQ7XFxuLVxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLXN0YXJ0X292ZXI6XFxuLVxcdHBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2ksIG5leHQsIFxcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkLCBsaXN0KSB7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXHRcXHRpZiAoZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKSB7XFxuLVxcdFxcdFxcdGlmIChzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfUEFHRV9ESVNDQVJEKVxcbi1cXHRcXHRcXHRcXHRyZXQgPSBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTtcXG4tXFx0XFx0XFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XFxuK1xcdFxcdFxcdHJldCA9IC1FMkJJRztcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0aWYgKHJldClcXG4tXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdFxcdGlmIChwbGlzdF9ub2RlX2VtcHR5KFxcdTAwMjZuZXh0LVxcdTAwM2VsaXN0KSlcXG4tXFx0XFx0XFx0Z290byBzdGFydF9vdmVyO1xcbiBcXHR9XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbiBcXG4tXFx0cmV0dXJuIGZhbHNlO1xcbitcXHRwZXJjcHVfdXBfcmVhZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4gc3RhdGljIGludCBzd2FwX2V4dGVuZF90YWJsZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuQEAgLTE3MzUsNiArMTk5OSw3IEBAIGludCBmb2xpb19hbGxvY19zd2FwKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xcbiBcXHR1bnNpZ25lZCBpbnQgc2l6ZSA9IDEgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGludCByZXQ7XFxuIFxcbiBcXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xcbiBcXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pLCBmb2xpbyk7XFxuQEAgLTE3NTcsMjMgKzIwMjIsMTQgQEAgaW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1hZ2FpbjpcXG4tXFx0bG9jYWxfbG9jayhcXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcXG4tXFx0aWYgKCFzd2FwX2FsbG9jX2Zhc3QoZm9saW8pKVxcbi1cXHRcXHRzd2FwX2FsbG9jX3Nsb3coZm9saW8pO1xcbi1cXHRsb2NhbF91bmxvY2soXFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XFxuLVxcbi1cXHRpZiAoIW9yZGVyIFxcdTAwMjZcXHUwMDI2IHVubGlrZWx5KCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKSB7XFxuLVxcdFxcdGlmIChzd2FwX3N5bmNfZGlzY2FyZCgpKVxcbi1cXHRcXHRcXHRnb3RvIGFnYWluO1xcbi1cXHR9XFxuK1xcdHJldCA9IHN3YXBfYWxsb2NfZW50cnkoZm9saW8pO1xcbiBcXG4gXFx0LyogTmVlZCB0byBjYWxsIHRoaXMgZXZlbiBpZiBhbGxvY2F0aW9uIGZhaWxlZCwgZm9yIE1FTUNHX1NXQVBfRkFJTC4gKi9cXG4gXFx0aWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwKGZvbGlvKSkpXFxuIFxcdFxcdHN3YXBfY2FjaGVfZGVsX2ZvbGlvKGZvbGlvKTtcXG4gXFxuIFxcdGlmICh1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSlcXG4tXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdFxcdHJldHVybiByZXQgPyByZXQgOiAtRU5PTUVNO1xcbiBcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG5AQCAtMTk0OCw3ICsyMjA0LDcgQEAgdm9pZCBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRpZiAoYmF0Y2hfaWQpXFxuIFxcdFxcdG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcChiYXRjaF9pZCwgY2lfb2ZmIC0gYmF0Y2hfb2ZmKTtcXG4gXFxuLVxcdHN3YXBfcmFuZ2VfZnJlZShzaSwgY2lfaGVhZCArIGNpX3N0YXJ0LCBucl9wYWdlcyk7XFxuK1xcdHN3YXBfZGV2aWNlX2ludXNlX3N1YihzaSwgY2lfaGVhZCArIGNpX3N0YXJ0LCBucl9wYWdlcyk7XFxuIFxcdHN3YXBfY2x1c3Rlcl9hc3NlcnRfZW1wdHkoY2ksIGNpX3N0YXJ0LCBucl9wYWdlcywgZmFsc2UpO1xcbiBcXG4gXFx0aWYgKCFjaS1cXHUwMDNlY291bnQpXFxuQEAgLTIxNTAsMzEgKzI0MDYsMTQgQEAgdm9pZCBzd2FwX3B1dF9lbnRyaWVzX2RpcmVjdChzd3BfZW50cnlfdCBlbnRyeSwgaW50IG5yKVxcbiAgKi9cXG4gc3dwX2VudHJ5X3Qgc3dhcF9hbGxvY19oaWJlcm5hdGlvbl9zbG90KGludCB0eXBlKVxcbiB7XFxuLVxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwY3Bfc2ksICpzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xcbi1cXHR1bnNpZ25lZCBsb25nIHBjcF9vZmZzZXQsIG9mZnNldCA9IFNXQVBfRU5UUllfSU5WQUxJRDtcXG4tXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4rXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gU1dBUF9FTlRSWV9JTlZBTElEO1xcbiBcXHRzd3BfZW50cnlfdCBlbnRyeSA9IHswfTtcXG4gXFxuIFxcdGlmICghc2kpXFxuIFxcdFxcdGdvdG8gZmFpbDtcXG4gXFxuLVxcdC8qXFxuLVxcdCAqIFRyeSB0aGUgbG9jYWwgY2x1c3RlciBmaXJzdCBpZiBpdCBtYXRjaGVzIHRoZSBkZXZpY2UuIElmXFxuLVxcdCAqIG5vdCwgdHJ5IGdyYWIgYSBuZXcgY2x1c3RlciBhbmQgb3ZlcnJpZGUgbG9jYWwgY2x1c3Rlci5cXG4tXFx0ICovXFxuLVxcdGxvY2FsX2xvY2soXFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XFxuLVxcdHBjcF9zaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVswXSk7XFxuLVxcdHBjcF9vZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0WzBdKTtcXG4tXFx0aWYgKHBjcF9zaSA9PSBzaSBcXHUwMDI2XFx1MDAyNiBwY3Bfb2Zmc2V0KSB7XFxuLVxcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIHBjcF9vZmZzZXQpO1xcbi1cXHRcXHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIDApKVxcbi1cXHRcXHRcXHRvZmZzZXQgPSBhbGxvY19zd2FwX3NjYW5fY2x1c3RlcihzaSwgY2ksIE5VTEwsIHBjcF9vZmZzZXQpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xcbi1cXHR9XFxuLVxcdGlmICghb2Zmc2V0KVxcbi1cXHRcXHRvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpO1xcbi1cXHRsb2NhbF91bmxvY2soXFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XFxuK1xcdG9mZnNldCA9IGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzaSwgTlVMTCk7XFxuIFxcdGlmIChvZmZzZXQpXFxuIFxcdFxcdGVudHJ5ID0gc3dwX2VudHJ5KHNpLVxcdTAwM2V0eXBlLCBvZmZzZXQpO1xcbiBcXG5AQCAtMjIwNSwyNiArMjQ0NCwxOCBAQCB2b2lkIHN3YXBfZnJlZV9oaWJlcm5hdGlvbl9zbG90KHN3cF9lbnRyeV90IGVudHJ5KVxcbiBcXG4gc3RhdGljIGludCBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbiB7XFxuLVxcdGludCB0eXBlO1xcbi1cXG4tXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2c3dhcF9sb2NrKTtcXG4rXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xcbiBcXG4gXFx0aWYgKCFkZXZpY2UpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0Zm9yICh0eXBlID0gMDsgdHlwZSBcXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSsrKSB7XFxuLVxcdFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07XFxuLVxcbi1cXHRcXHRpZiAoIShzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1dSSVRFT0spKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFxuLVxcdFxcdGlmIChkZXZpY2UgPT0gc2lzLVxcdTAwM2ViZGV2LVxcdTAwM2ViZF9kZXYpIHtcXG4tXFx0XFx0XFx0c3RydWN0IHN3YXBfZXh0ZW50ICpzZSA9IGZpcnN0X3NlKHNpcyk7XFxuLVxcbi1cXHRcXHRcXHRpZiAoc2UtXFx1MDAzZXN0YXJ0X2Jsb2NrID09IG9mZnNldClcXG4tXFx0XFx0XFx0XFx0cmV0dXJuIHR5cGU7XFxuK1xcdGZvcl9lYWNoX2F2YWlsX3N3YXAoc2kpIHtcXG4rXFx0XFx0aWYgKGRldmljZSA9PSBzaS1cXHUwMDNlYmRldi1cXHUwMDNlYmRfZGV2KSB7XFxuK1xcdFxcdFxcdGlmIChmaXJzdF9zZShzaSktXFx1MDAzZXN0YXJ0X2Jsb2NrID09IG9mZnNldClcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIHNpLVxcdTAwM2V0eXBlO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4rXFxuIFxcdHJldHVybiAtRU5PREVWO1xcbiB9XFxuIFxcbkBAIC0yMjQ3LDIxICsyNDc4LDE4IEBAIHN0YXRpYyBpbnQgX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldClcXG4gICovXFxuIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbiB7XFxuLVxcdGludCB0eXBlO1xcbitcXHRpbnQgcmV0O1xcbiBcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcbi1cXHR0eXBlID0gX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZpY2UsIG9mZnNldCk7XFxuLVxcdGlmICh0eXBlIFxcdTAwM2MgMCkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0cmV0dXJuIHR5cGU7XFxuLVxcdH1cXG4rXFx0cGVyY3B1X2Rvd25fd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdHJldCA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuIFxcbi1cXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xcbitcXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHJldCk7XFxuIFxcdGlmIChXQVJOX09OX09OQ0UoIXNpKSkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0cmV0dXJuIC1FTk9ERVY7XFxuK1xcdFxcdHJldCA9IC1FTk9ERVY7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHQvKlxcbkBAIC0yMjcwLDE0ICsyNDk4LDE1IEBAIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbiBcXHQgKiB0aGUgc2FtZSBzZXNzaW9uLlxcbiBcXHQgKi9cXG4gXFx0aWYgKFdBUk5fT05fT05DRShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfSElCRVJOQVRJT04pKSB7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHRzaS1cXHUwMDNlZmxhZ3MgfD0gU1dQX0hJQkVSTkFUSU9OO1xcbiBcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdHJldHVybiB0eXBlO1xcbitvdXQ6XFxuK1xcdHBlcmNwdV91cF93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4gLyoqXFxuQEAgLTIyOTQsMTQgKzI1MjMsMTEgQEAgdm9pZCB1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoaW50IHR5cGUpXFxuIHtcXG4gXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xcbiBcXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfZG93bl93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gXFx0c2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcXG4tXFx0aWYgKCFzaSkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXHR9XFxuLVxcdHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2PSB+U1dQX0hJQkVSTkFUSU9OO1xcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4rXFx0aWYgKHNpKVxcbitcXHRcXHRzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNj0gflNXUF9ISUJFUk5BVElPTjtcXG4rXFx0cGVyY3B1X3VwX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiB9XFxuIFxcbiAvKipcXG5AQCAtMjMyNiwyOSArMjU1MiwyNiBAQCBpbnQgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXFxuIHtcXG4gXFx0aW50IHR5cGU7XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV9kb3duX3JlYWQoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcdHR5cGUgPSBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldmljZSwgb2Zmc2V0KTtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXG4gXFx0cmV0dXJuIHR5cGU7XFxuIH1cXG4gXFxuIGludCBmaW5kX2ZpcnN0X3N3YXAoZGV2X3QgKmRldmljZSlcXG4ge1xcbi1cXHRpbnQgdHlwZTtcXG4tXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0Zm9yICh0eXBlID0gMDsgdHlwZSBcXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSsrKSB7XFxuLVxcdFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07XFxuK1xcdGludCByZXQgPSAtRU5PREVWO1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuIFxcbi1cXHRcXHRpZiAoIShzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1dSSVRFT0spKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0KmRldmljZSA9IHNpcy1cXHUwMDNlYmRldi1cXHUwMDNlYmRfZGV2O1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0cmV0dXJuIHR5cGU7XFxuK1xcdHBlcmNwdV9kb3duX3JlYWQoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdGZvcl9lYWNoX2F2YWlsX3N3YXAoc2kpIHtcXG4rXFx0XFx0KmRldmljZSA9IHNpLVxcdTAwM2ViZGV2LVxcdTAwM2ViZF9kZXY7XFxuK1xcdFxcdHJldCA9IHNpLVxcdTAwM2V0eXBlO1xcbitcXHRcXHRicmVhaztcXG4gXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0cmV0dXJuIC1FTk9ERVY7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbiAvKlxcbkBAIC0yMzc2LDcgKzI1OTksNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IG4gPSAwO1xcbiBcXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfZG93bl9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXHRpZiAoKHVuc2lnbmVkIGludCl0eXBlIFxcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XFxuIFxcdFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07XFxuIFxcbkBAIC0yMzg4LDcgKzI2MTEsNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXFxuIFxcdFxcdH1cXG4gXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNpcy1cXHUwMDNlbG9jayk7XFxuIFxcdH1cXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXHRyZXR1cm4gbjtcXG4gfVxcbiAjZW5kaWYgLyogQ09ORklHX0hJQkVSTkFUSU9OICovXFxuQEAgLTI3MDAsMTAgKzI5MjMsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX25leHRfdG9fdW51c2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcXG4gXFxuIFxcdC8qXFxuLVxcdCAqIE5vIG5lZWQgZm9yIHN3YXBfbG9jayBoZXJlOiB3ZSdyZSBqdXN0IGxvb2tpbmdcXG4rXFx0ICogTm8gbmVlZCBmb3Igc3dhcG9uX3J3c2VtIGhlcmU6IHdlJ3JlIGp1c3QgbG9va2luZ1xcbiBcXHQgKiBmb3Igd2hldGhlciBhbiBlbnRyeSBpcyBpbiB1c2UsIG5vdCBtb2RpZnlpbmcgaXQ7IGZhbHNlXFxuIFxcdCAqIGhpdHMgYXJlIG9rYXksIGFuZCBzeXNfc3dhcG9mZigpIGhhcyBhbHJlYWR5IHByZXZlbnRlZCBuZXdcXG4tXFx0ICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcF9sb2NrKS5cXG4rXFx0ICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcG9uX3J3c2VtKS5cXG4gXFx0ICovXFxuIFxcdGZvciAoaSA9IHByZXYgKyAxOyBpIFxcdTAwM2Mgc2ktXFx1MDAzZW1heDsgaSsrKSB7XFxuIFxcdFxcdHN3cF90YiA9IHN3YXBfdGFibGVfZ2V0KF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgaSksXFxuQEAgLTI4MTYsNyArMzAzOSw3IEBAIHN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKVxcbiBzdWNjZXNzOlxcbiBcXHQvKlxcbiBcXHQgKiBNYWtlIHN1cmUgdGhhdCBmdXJ0aGVyIGNsZWFudXBzIGFmdGVyIHRyeV90b191bnVzZSgpIHJldHVybnMgaGFwcGVuXFxuLVxcdCAqIGFmdGVyIHN3YXBfcmFuZ2VfZnJlZSgpIHJlZHVjZXMgc2ktXFx1MDAzZWludXNlX3BhZ2VzIHRvIDAuXFxuK1xcdCAqIGFmdGVyIHN3YXBfZGV2aWNlX2ludXNlX3N1YigpIHJlZHVjZXMgc2ktXFx1MDAzZWludXNlX3BhZ2VzIHRvIDAuXFxuIFxcdCAqL1xcbiBcXHRzbXBfbWIoKTtcXG4gXFx0cmV0dXJuIDA7XFxuQEAgLTI4MjQsMTggKzMwNDcsMjAgQEAgc3RhdGljIGludCB0cnlfdG9fdW51c2UodW5zaWduZWQgaW50IHR5cGUpXFxuIFxcbiAvKlxcbiAgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgdHJ5X3RvX3VudXNlLCBpZiBubyBzd2FwIGlzIG5vdyBpbiB1c2UsIHdlIGtub3dcXG4tICogd2UgY2FuIGVtcHR5IHRoZSBtbWxpc3QuICBzd2FwX2xvY2sgbXVzdCBiZSBoZWxkIG9uIGVudHJ5IGFuZCBleGl0Llxcbi0gKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBfbG9jaywgYW5kIGFuIG1tIG11c3QgYmVcXG4rICogd2UgY2FuIGVtcHR5IHRoZSBtbWxpc3QuIHN3YXBvbl9yd3NlbSBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuXFxuKyAqIE5vdGUgdGhhdCBtbWxpc3RfbG9jayBuZXN0cyBpbnNpZGUgc3dhcG9uX3J3c2VtLCBhbmQgYW4gbW0gbXVzdCBiZVxcbiAgKiBhZGRlZCB0byB0aGUgbW1saXN0IGp1c3QgYWZ0ZXIgcGFnZV9kdXBsaWNhdGUgLSBiZWZvcmUgd291bGQgYmUgcmFjeS5cXG4gICovXFxuIHN0YXRpYyB2b2lkIGRyYWluX21tbGlzdCh2b2lkKVxcbiB7XFxuK1xcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4gXFx0c3RydWN0IGxpc3RfaGVhZCAqcCwgKm5leHQ7XFxuLVxcdHVuc2lnbmVkIGludCB0eXBlO1xcbiBcXG4tXFx0Zm9yICh0eXBlID0gMDsgdHlwZSBcXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSsrKVxcbi1cXHRcXHRpZiAoc3dhcF91c2FnZV9pbl9wYWdlcyhzd2FwX2luZm9bdHlwZV0pKVxcbitcXHRmb3JfZWFjaF9zd2FwKHNpKSB7XFxuK1xcdFxcdGlmIChzd2FwX3VzYWdlX2luX3BhZ2VzKHNpKSlcXG4gXFx0XFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbiBcXHRzcGluX2xvY2soXFx1MDAyNm1tbGlzdF9sb2NrKTtcXG4gXFx0bGlzdF9mb3JfZWFjaF9zYWZlKHAsIG5leHQsIFxcdTAwMjZpbml0X21tLm1tbGlzdClcXG4gXFx0XFx0bGlzdF9kZWxfaW5pdChwKTtcXG5AQCAtMjk2OCw1OCArMzE5Myw2NSBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfZXh0ZW50cyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzLFxcbiBcXHRyZXR1cm4gZ2VuZXJpY19zd2FwZmlsZV9hY3RpdmF0ZShzaXMsIHN3YXBfZmlsZSwgc3Bhbik7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIF9lbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4te1xcbi1cXHRhdG9taWNfbG9uZ19hZGQoc2ktXFx1MDAzZXBhZ2VzLCBcXHUwMDI2bnJfc3dhcF9wYWdlcyk7XFxuLVxcdHRvdGFsX3N3YXBfcGFnZXMgKz0gc2ktXFx1MDAzZXBhZ2VzO1xcbi1cXG4tXFx0YXNzZXJ0X3NwaW5fbG9ja2VkKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXG4tXFx0cGxpc3RfYWRkKFxcdTAwMjZzaS1cXHUwMDNlbGlzdCwgXFx1MDAyNnN3YXBfYWN0aXZlX2hlYWQpO1xcbi1cXG4tXFx0LyogQWRkIGJhY2sgdG8gYXZhaWxhYmxlIGxpc3QgKi9cXG4tXFx0YWRkX3RvX2F2YWlsX2xpc3Qoc2ksIHRydWUpO1xcbi19XFxuLVxcbiAvKlxcbi0gKiBDYWxsZWQgYWZ0ZXIgdGhlIHN3YXAgZGV2aWNlIGlzIHJlYWR5LCByZXN1cnJlY3QgaXRzIHBlcmNwdSByZWYsIGl0J3Mgbm93XFxuLSAqIHNhZmUgdG8gcmVmZXJlbmNlIGl0LiBBZGQgaXQgdG8gdGhlIGxpc3QgdG8gZXhwb3NlIGl0IHRvIHRoZSBhbGxvY2F0b3IuXFxuKyAqIENhbGxlZCBhZnRlciB0aGUgc3dhcCBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgdXNlZC4gTWFya2luZyBpdCB3cml0YWJsZSBhbmRcXG4rICogZXhwb3NpbmcgaXQgdG8gdGhlIGFsbG9jYXRvci4gUmVzdXJyZWN0IGl0cyBwZXJjcHUgcmVmIGlmIGl0IHdhcyBkZWFkIGJlZm9yZS5cXG4gICovXFxuLXN0YXRpYyB2b2lkIGVuYWJsZV9zd2FwX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbitzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9lbmFibGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbiB7XFxuLVxcdHBlcmNwdV9yZWZfcmVzdXJyZWN0KFxcdTAwMjZzaS1cXHUwMDNldXNlcnMpO1xcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbi1cXHRfZW5hYmxlX3N3YXBfaW5mbyhzaSk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi19XFxuK1xcdHBlcmNwdV9kb3duX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRzaS1cXHUwMDNlZmxhZ3MgfD0gU1dQX1dSSVRFT0s7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4rXFx0YXRvbWljX2xvbmdfYWRkKHNpLVxcdTAwM2VwYWdlcywgXFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xcbitcXHR0b3RhbF9zd2FwX3BhZ2VzICs9IHNpLVxcdTAwM2VwYWdlcztcXG4rXFx0cGVyY3B1X3VwX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXG4tc3RhdGljIHZvaWQgcmVpbnNlcnRfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4te1xcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbi1cXHRfZW5hYmxlX3N3YXBfaW5mbyhzaSk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRhZGRfdG9fYXZhaWxfbGlzdChzaSk7XFxuIH1cXG4gXFxuLS8qXFxuLSAqIENhbGxlZCBhZnRlciBjbGVhcmluZyBTV1BfV1JJVEVPSywgZW5zdXJlcyBjbHVzdGVyX2FsbG9jX3JhbmdlXFxuLSAqIHNlZSB0aGUgdXBkYXRlZCBmbGFncywgc28gdGhlcmUgd2lsbCBiZSBubyBtb3JlIGFsbG9jYXRpb25zLlxcbi0gKi9cXG4tc3RhdGljIHZvaWQgd2FpdF9mb3JfYWxsb2NhdGlvbihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuK3N0YXRpYyBpbnQgc3dhcF9kZXZpY2VfZGlzYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBvZmZzZXQ7XFxuIFxcdHVuc2lnbmVkIGxvbmcgZW5kID0gQUxJR04oc2ktXFx1MDAzZW1heCwgU1dBUEZJTEVfQ0xVU1RFUik7XFxuIFxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XFxuIFxcbi1cXHRCVUdfT04oc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1dSSVRFT0spO1xcbitcXHQvKlxcbitcXHQgKiBJZiBTV1BfV1JJVEVPSyBpcyBub3Qgc2V0OiBhbm90aGVyIHByb2Nlc3MgYWxyZWFkeSBkaXNhYmxpbmcgaXQuXFxuK1xcdCAqIElmIFNXUF9ISUJFUk5BVElPTiBpcyBzZXQ6IHRoZSBkZXZpY2UgaXMgcGlubmVkIGZvciBoaWJlcm5hdGlvbi5cXG4rXFx0ICovXFxuK1xcdHBlcmNwdV9kb3duX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRpZiAoIShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfV1JJVEVPSykgfHxcXG4rXFx0ICAgIHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9ISUJFUk5BVElPTikge1xcbitcXHRcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChzZWN1cml0eV92bV9lbm91Z2hfbWVtb3J5X21tKGN1cnJlbnQtXFx1MDAzZW1tLCBzaS1cXHUwMDNlcGFnZXMpKSB7XFxuK1xcdFxcdHBlcmNwdV91cF93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdH1cXG4rXFx0dm1fdW5hY2N0X21lbW9yeShzaS1cXHUwMDNlcGFnZXMpO1xcbitcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4rXFx0c2ktXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5TV1BfV1JJVEVPSztcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHR0b3RhbF9zd2FwX3BhZ2VzIC09IHNpLVxcdTAwM2VwYWdlcztcXG4rXFx0YXRvbWljX2xvbmdfc3ViKHNpLVxcdTAwM2VwYWdlcywgXFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xcbitcXHRkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCB0cnVlKTtcXG4rXFx0cGVyY3B1X3VwX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogU3dhcCBhbGxvY2F0b3IgZG9lc24ndCB0b3VjaCBzaSBsb2NrLCBzbyBsb29waW5nIHRocm91Z2ggYWxsXFxuK1xcdCAqIGNpIGxvY2tzIGVuc3VyZXMgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyBzZWVzIHRoZVxcbitcXHQgKiB1cGRhdGVkIGZsYWdzLCBhbmQgbm8gbW9yZSBhbGxvY2F0aW9ucyB3aWxsIG9jY3VyLlxcbitcXHQgKi9cXG4gXFx0Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgXFx1MDAzYyBlbmQ7IG9mZnNldCArPSBTV0FQRklMRV9DTFVTVEVSKSB7XFxuIFxcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XFxuIFxcdFxcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xcbiBcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcXG5AQCAtMzA0MywyOCArMzI3NSw2IEBAIHN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXFxuIFxcdGt2ZnJlZShjbHVzdGVyX2luZm8pO1xcbiB9XFxuIFxcbi0vKlxcbi0gKiBDYWxsZWQgYWZ0ZXIgc3dhcCBkZXZpY2UncyByZWZlcmVuY2UgY291bnQgaXMgZGVhZCwgc29cXG4tICogbmVpdGhlciBzY2FuIG5vciBhbGxvY2F0aW9uIHdpbGwgdXNlIGl0Llxcbi0gKi9cXG4tc3RhdGljIHZvaWQgZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuLXtcXG4tXFx0aW50IGNwdSwgaTtcXG4tXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKipwY3Bfc2k7XFxuLVxcbi1cXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuLVxcdFxcdHBjcF9zaSA9IHBlcl9jcHVfcHRyKHBlcmNwdV9zd2FwX2NsdXN0ZXIuc2ksIGNwdSk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEludmFsaWRhdGUgdGhlIHBlcmNwdSBzd2FwIGNsdXN0ZXIgY2FjaGUsIHNpLVxcdTAwM2V1c2Vyc1xcbi1cXHRcXHQgKiBpcyBkZWFkLCBzbyBubyBuZXcgdXNlciB3aWxsIHBvaW50IHRvIGl0LCBqdXN0IGZsdXNoXFxuLVxcdFxcdCAqIGFueSBleGlzdGluZyB1c2VyLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFNXQVBfTlJfT1JERVJTOyBpKyspXFxuLVxcdFxcdFxcdGNtcHhjaGcoXFx1MDAyNnBjcF9zaVtpXSwgc2ksIE5VTEwpO1xcbi1cXHR9XFxuLX1cXG4tXFxuLVxcbiBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXFxuIHtcXG4gXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnAgPSBOVUxMO1xcbkBAIC0zMDg2LDQ0ICszMjk2LDIyIEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcXG4gXFx0XFx0cmV0dXJuIFBUUl9FUlIodmljdGltKTtcXG4gXFxuIFxcdG1hcHBpbmcgPSB2aWN0aW0tXFx1MDAzZWZfbWFwcGluZztcXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXHRwbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBcXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCwgbGlzdCkge1xcbi1cXHRcXHRpZiAocC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfV1JJVEVPSykge1xcbi1cXHRcXHRcXHRpZiAocC1cXHUwMDNlc3dhcF9maWxlLVxcdTAwM2VmX21hcHBpbmcgPT0gbWFwcGluZykge1xcbi1cXHRcXHRcXHRcXHRmb3VuZCA9IDE7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHR9XFxuK1xcdHBlcmNwdV9kb3duX3JlYWQoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdGZvcl9lYWNoX2F2YWlsX3N3YXAocCkge1xcbitcXHRcXHRpZiAocC1cXHUwMDNlc3dhcF9maWxlLVxcdTAwM2VmX21hcHBpbmcgPT0gbWFwcGluZykge1xcbitcXHRcXHRcXHRmb3VuZCA9IDE7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4tXFx0aWYgKCFmb3VuZCkge1xcbi1cXHRcXHRlcnIgPSAtRUlOVkFMO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0Z290byBvdXRfZHB1dDtcXG4tXFx0fVxcbi1cXG4tXFx0LyogUmVmdXNlIHN3YXBvZmYgd2hpbGUgdGhlIGRldmljZSBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uICovXFxuLVxcdGlmIChwLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9ISUJFUk5BVElPTikge1xcbi1cXHRcXHRlcnIgPSAtRUJVU1k7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXHRcXHRnb3RvIG91dF9kcHV0O1xcbi1cXHR9XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRmaWxwX2Nsb3NlKHZpY3RpbSwgTlVMTCk7XFxuIFxcbi1cXHRpZiAoIXNlY3VyaXR5X3ZtX2Vub3VnaF9tZW1vcnlfbW0oY3VycmVudC1cXHUwMDNlbW0sIHAtXFx1MDAzZXBhZ2VzKSlcXG4tXFx0XFx0dm1fdW5hY2N0X21lbW9yeShwLVxcdTAwM2VwYWdlcyk7XFxuLVxcdGVsc2Uge1xcbi1cXHRcXHRlcnIgPSAtRU5PTUVNO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0Z290byBvdXRfZHB1dDtcXG4tXFx0fVxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnAtXFx1MDAzZWxvY2spO1xcbi1cXHRkZWxfZnJvbV9hdmFpbF9saXN0KHAsIHRydWUpO1xcbi1cXHRwbGlzdF9kZWwoXFx1MDAyNnAtXFx1MDAzZWxpc3QsIFxcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkKTtcXG4tXFx0YXRvbWljX2xvbmdfc3ViKHAtXFx1MDAzZXBhZ2VzLCBcXHUwMDI2bnJfc3dhcF9wYWdlcyk7XFxuLVxcdHRvdGFsX3N3YXBfcGFnZXMgLT0gcC1cXHUwMDNlcGFnZXM7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwLVxcdTAwM2Vsb2NrKTtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdGlmICghZm91bmQpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0d2FpdF9mb3JfYWxsb2NhdGlvbihwKTtcXG4rXFx0ZXJyID0gc3dhcF9kZXZpY2VfZGlzYWJsZShwKTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4gXFxuIFxcdHNldF9jdXJyZW50X29vbV9vcmlnaW4oKTtcXG4gXFx0ZXJyID0gdHJ5X3RvX3VudXNlKHAtXFx1MDAzZXR5cGUpO1xcbkBAIC0zMTMxLDEwICszMzE5LDEzIEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcXG4gXFxuIFxcdGlmIChlcnIpIHtcXG4gXFx0XFx0LyogcmUtaW5zZXJ0IHN3YXAgc3BhY2UgYmFjayBpbnRvIHN3YXBfbGlzdCAqL1xcbi1cXHRcXHRyZWluc2VydF9zd2FwX2luZm8ocCk7XFxuLVxcdFxcdGdvdG8gb3V0X2RwdXQ7XFxuK1xcdFxcdHN3YXBfZGV2aWNlX2VuYWJsZShwKTtcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4gXFx0fVxcbiBcXG4rXFx0cGVyY3B1X2Rvd25fd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdHN3YXBfcXVldWVfZGVsKHApO1xcbitcXG4gXFx0LypcXG4gXFx0ICogV2FpdCBmb3Igc3dhcCBvcGVyYXRpb25zIHByb3RlY3RlZCBieSBnZXQvcHV0X3N3YXBfZGV2aWNlKClcXG4gXFx0ICogdG8gY29tcGxldGUuICBCZWNhdXNlIG9mIHN5bmNocm9uaXplX3JjdSgpIGhlcmUsIGFsbCBzd2FwXFxuQEAgLTMxNDksMTUgKzMzNDAsMTIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxcbiBcXG4gXFx0Zmx1c2hfd29yayhcXHUwMDI2cC1cXHUwMDNlZGlzY2FyZF93b3JrKTtcXG4gXFx0Zmx1c2hfd29yayhcXHUwMDI2cC1cXHUwMDNlcmVjbGFpbV93b3JrKTtcXG4tXFx0Zmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihwKTtcXG4gXFxuIFxcdGRlc3Ryb3lfc3dhcF9leHRlbnRzKHAsIHAtXFx1MDAzZXN3YXBfZmlsZSk7XFxuIFxcbiBcXHRpZiAoIShwLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcXG4gXFx0XFx0YXRvbWljX2RlYyhcXHUwMDI2bnJfcm90YXRlX3N3YXApO1xcbiBcXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2c3dhcG9uX211dGV4KTtcXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbiBcXHRzcGluX2xvY2soXFx1MDAyNnAtXFx1MDAzZWxvY2spO1xcbiBcXHRkcmFpbl9tbWxpc3QoKTtcXG4gXFxuQEAgLTMxNjgsMTAgKzMzNTYsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxcbiBcXHRwLVxcdTAwM2VtYXggPSAwO1xcbiBcXHRwLVxcdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xcbiBcXHRzcGluX3VubG9jayhcXHUwMDI2cC1cXHUwMDNlbG9jayk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcdGFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC1cXHUwMDNldHlwZSk7XFxuIFxcdHpzd2FwX3N3YXBvZmYocC1cXHUwMDNldHlwZSk7XFxuLVxcdG11dGV4X3VubG9jayhcXHUwMDI2c3dhcG9uX211dGV4KTtcXG4rXFx0ZnJlZV9wZXJjcHUocC1cXHUwMDNlcGVyY3B1X2NsdXN0ZXIpO1xcbitcXHRwLVxcdTAwM2VwZXJjcHVfY2x1c3RlciA9IE5VTEw7XFxuIFxcdGtmcmVlKHAtXFx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcXG4gXFx0cC1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXIgPSBOVUxMO1xcbiBcXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xcbkBAIC0zMTg3LDE4ICszMzc2LDE5IEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcXG4gXFx0ICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28gdGhhdCBzd2Fwb25cXG4gXFx0ICogY2FuIHJldXNlIHRoaXMgc3dhcF9pbmZvIGluIGFsbG9jX3N3YXBfaW5mbygpIHNhZmVseS4gIEl0IGlzIG9rIHRvXFxuIFxcdCAqIG5vdCBob2xkIHAtXFx1MDAzZWxvY2sgYWZ0ZXIgd2UgY2xlYXJlZCBpdHMgU1dQX1dSSVRFT0suXFxuK1xcdCAqXFxuK1xcdCAqIFRoZSB3cml0ZSBsb2NrIGVuc3VyZXMgdGhlIGZsYWcgY2xlYXIgaXMgdmlzaWJsZSB0byBsb2NrbGVzc1xcbitcXHQgKiByZWFkZXJzIG9mIHN3YXBfdHlwZV90b19pbmZvKCkgYmVmb3JlIGFsbG9jX3N3YXBfaW5mbygpIHJldXNlc1xcbitcXHQgKiB0aGlzIHNsb3QuXFxuIFxcdCAqL1xcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV9kb3duX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXHRwLVxcdTAwM2VmbGFncyA9IDA7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcbi1cXHRlcnIgPSAwO1xcbiBcXHRhdG9taWNfaW5jKFxcdTAwMjZwcm9jX3BvbGxfZXZlbnQpO1xcbiBcXHR3YWtlX3VwX2ludGVycnVwdGlibGUoXFx1MDAyNnByb2NfcG9sbF93YWl0KTtcXG4gXFxuLW91dF9kcHV0Olxcbi1cXHRmaWxwX2Nsb3NlKHZpY3RpbSwgTlVMTCk7XFxuLVxcdHJldHVybiBlcnI7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbiAjaWZkZWYgQ09ORklHX1BST0NfRlNcXG5AQCAtMzIxNiwyMCArMzQwNiwxOCBAQCBzdGF0aWMgX19wb2xsX3Qgc3dhcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdClcXG4gXFx0cmV0dXJuIEVQT0xMSU4gfCBFUE9MTFJETk9STTtcXG4gfVxcbiBcXG4tLyogaXRlcmF0b3IgKi9cXG4gc3RhdGljIHZvaWQgKnN3YXBfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzd2FwLCBsb2ZmX3QgKnBvcylcXG4ge1xcbiBcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuLVxcdGludCB0eXBlO1xcbiBcXHRsb2ZmX3QgbCA9ICpwb3M7XFxuIFxcbi1cXHRtdXRleF9sb2NrKFxcdTAwMjZzd2Fwb25fbXV0ZXgpO1xcbitcXHRwZXJjcHVfZG93bl9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXG4gXFx0aWYgKCFsKVxcbiBcXHRcXHRyZXR1cm4gU0VRX1NUQVJUX1RPS0VOO1xcbiBcXG4tXFx0Zm9yICh0eXBlID0gMDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlKyspIHtcXG4tXFx0XFx0aWYgKCEoc2ktXFx1MDAzZXN3YXBfZmlsZSkpXFxuK1xcdGZvcl9lYWNoX3N3YXAoc2kpIHtcXG4rXFx0XFx0aWYgKCFzaS1cXHUwMDNlc3dhcF9maWxlKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0aWYgKCEtLWwpXFxuIFxcdFxcdFxcdHJldHVybiBzaTtcXG5AQCAtMzI1MCw3ICszNDM4LDcgQEAgc3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxcbiBcXG4gXFx0KysoKnBvcyk7XFxuIFxcdGZvciAoOyAoc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKSk7IHR5cGUrKykge1xcbi1cXHRcXHRpZiAoIShzaS1cXHUwMDNlc3dhcF9maWxlKSlcXG4rXFx0XFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1VTRUQpIHx8ICEoc2ktXFx1MDAzZXN3YXBfZmlsZSkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHRyZXR1cm4gc2k7XFxuIFxcdH1cXG5AQCAtMzI2MCw3ICszNDQ4LDcgQEAgc3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxcbiBcXG4gc3RhdGljIHZvaWQgc3dhcF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdilcXG4ge1xcbi1cXHRtdXRleF91bmxvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IHN3YXBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXFxuQEAgLTMzNTMsMTMgKzM1NDEsMTMgQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICphbGxvY19zd2FwX2luZm8odm9pZClcXG4gXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuIFxcdH1cXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4rXFx0cGVyY3B1X2Rvd25fd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcdGZvciAodHlwZSA9IDA7IHR5cGUgXFx1MDAzYyBucl9zd2FwZmlsZXM7IHR5cGUrKykge1xcbiBcXHRcXHRpZiAoIShzd2FwX2luZm9bdHlwZV0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1VTRUQpKVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0fVxcbiBcXHRpZiAodHlwZSBcXHUwMDNlPSBNQVhfU1dBUEZJTEVTKSB7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcdFxcdHBlcmNwdV9yZWZfZXhpdChcXHUwMDI2cC1cXHUwMDNldXNlcnMpO1xcbiBcXHRcXHRrdmZyZWUocCk7XFxuIFxcdFxcdHJldHVybiBFUlJfUFRSKC1FUEVSTSk7XFxuQEAgLTMzODEsMTAgKzM1NjksOCBAQCBzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKmFsbG9jX3N3YXBfaW5mbyh2b2lkKVxcbiBcXHRcXHQgKi9cXG4gXFx0fVxcbiBcXHRwLVxcdTAwM2Vzd2FwX2V4dGVudF9yb290ID0gUkJfUk9PVDtcXG4tXFx0cGxpc3Rfbm9kZV9pbml0KFxcdTAwMjZwLVxcdTAwM2VsaXN0LCAwKTtcXG4tXFx0cGxpc3Rfbm9kZV9pbml0KFxcdTAwMjZwLVxcdTAwM2VhdmFpbF9saXN0LCAwKTtcXG4gXFx0cC1cXHUwMDNlZmxhZ3MgPSBTV1BfVVNFRDtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gXFx0aWYgKGRlZmVyKSB7XFxuIFxcdFxcdHBlcmNwdV9yZWZfZXhpdChcXHUwMDI2ZGVmZXItXFx1MDAzZXVzZXJzKTtcXG4gXFx0XFx0a3ZmcmVlKGRlZmVyKTtcXG5AQCAtMzQ1Myw5ICszNjM5LDggQEAgX193ZWFrIHVuc2lnbmVkIGxvbmcgYXJjaF9tYXhfc3dhcGZpbGVfc2l6ZSh2b2lkKVxcbiBcXHRyZXR1cm4gZ2VuZXJpY19tYXhfc3dhcGZpbGVfc2l6ZSgpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4tXFx0XFx0XFx0XFx0XFx0dW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxcbi1cXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSlcXG4ge1xcbiBcXHRpbnQgaTtcXG4gXFx0dW5zaWduZWQgbG9uZyBtYXhwYWdlcztcXG5AQCAtMzUyMiw3ICszNzA3LDcgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiB7XFxuIFxcdHVuc2lnbmVkIGxvbmcgbnJfY2x1c3RlcnMgPSBESVZfUk9VTkRfVVAobWF4cGFnZXMsIFNXQVBGSUxFX0NMVVNURVIpO1xcbiBcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbztcXG4tXFx0aW50IGVyciA9IC1FTk9NRU07XFxuK1xcdGludCBjcHUsIGVyciA9IC1FTk9NRU07XFxuIFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4gXFxuIFxcdGNsdXN0ZXJfaW5mbyA9IGt2emFsbG9jX29ianMoKmNsdXN0ZXJfaW5mbywgbnJfY2x1c3RlcnMpO1xcbkBAIC0zNTMyLDEzICszNzE3LDI2IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX2NsdXN0ZXJzOyBpKyspXFxuIFxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZjbHVzdGVyX2luZm9baV0ubG9jayk7XFxuIFxcbi1cXHRpZiAoIShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfU09MSURTVEFURSkpIHtcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSB7XFxuK1xcdFxcdHNpLVxcdTAwM2VwZXJjcHVfY2x1c3RlciA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIpO1xcbitcXHRcXHRpZiAoIXNpLVxcdTAwM2VwZXJjcHVfY2x1c3RlcilcXG4rXFx0XFx0XFx0Z290byBlcnI7XFxuK1xcbitcXHRcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuK1xcdFxcdFxcdHN0cnVjdCBwZXJjcHVfY2x1c3RlciAqY2x1c3RlcjtcXG4rXFxuK1xcdFxcdFxcdGNsdXN0ZXIgPSBwZXJfY3B1X3B0cihzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXIsIGNwdSk7XFxuK1xcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBTV0FQX05SX09SREVSUzsgaSsrKVxcbitcXHRcXHRcXHRcXHRjbHVzdGVyLVxcdTAwM2VuZXh0W2ldID0gU1dBUF9FTlRSWV9JTlZBTElEO1xcbitcXHRcXHRcXHRsb2NhbF9sb2NrX2luaXQoXFx1MDAyNmNsdXN0ZXItXFx1MDAzZWxvY2spO1xcbitcXHRcXHR9XFxuK1xcdH0gZWxzZSB7XFxuIFxcdFxcdHNpLVxcdTAwM2VnbG9iYWxfY2x1c3RlciA9IGttYWxsb2Nfb2JqKCpzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXIpO1xcbiBcXHRcXHRpZiAoIXNpLVxcdTAwM2VnbG9iYWxfY2x1c3RlcilcXG4gXFx0XFx0XFx0Z290byBlcnI7XFxuIFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBTV0FQX05SX09SREVSUzsgaSsrKVxcbiBcXHRcXHRcXHRzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZW5leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XFxuLVxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXJfbG9jayk7XFxuK1xcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZWxvY2spO1xcbiBcXHR9XFxuIFxcbiBcXHQvKlxcbkBAIC0zNjIxLDcgKzM4MTksNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbiBcXHQvKlxcbiBcXHQgKiBBbGxvY2F0ZSBvciByZXVzZSBleGlzdGluZyAhU1dQX1VTRUQgc3dhcF9pbmZvLiBUaGUgcmV0dXJuZWRcXG4gXFx0ICogc2kgd2lsbCBzdGF5IGluIGEgZHlpbmcgc3RhdHVzLCBzbyBub3RoaW5nIHdpbGwgYWNjZXNzIGl0cyBjb250ZW50XFxuLVxcdCAqIHVudGlsIGVuYWJsZV9zd2FwX2luZm8gcmVzdXJyZWN0cyBpdHMgcGVyY3B1IHJlZiBhbmQgZXhwb3NlIGl0LlxcbitcXHQgKiB1bnRpbCBzd2FwX2RldmljZV9lbmFibGUgcmVzdXJyZWN0cyBpdHMgcGVyY3B1IHJlZiBhbmQgZXhwb3NlIGl0LlxcbiBcXHQgKi9cXG4gXFx0c2kgPSBhbGxvY19zd2FwX2luZm8oKTtcXG4gXFx0aWYgKElTX0VSUihzaSkpXFxuQEAgLTM2NzksNyArMzg3Nyw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXFxuIFxcdH1cXG4gXFx0c3dhcF9oZWFkZXIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCAwKTtcXG4gXFxuLVxcdG1heHBhZ2VzID0gcmVhZF9zd2FwX2hlYWRlcihzaSwgc3dhcF9oZWFkZXIsIGlub2RlKTtcXG4rXFx0bWF4cGFnZXMgPSByZWFkX3N3YXBfaGVhZGVyKHN3YXBfaGVhZGVyLCBpbm9kZSk7XFxuIFxcdGlmICh1bmxpa2VseSghbWF4cGFnZXMpKSB7XFxuIFxcdFxcdGVycm9yID0gLUVJTlZBTDtcXG4gXFx0XFx0Z290byBiYWRfc3dhcF91bmxvY2tfaW5vZGU7XFxuQEAgLTM3MDAsMTEgKzM4OTgsNiBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbiBcXG4gXFx0bWF4cGFnZXMgPSBzaS1cXHUwMDNlbWF4O1xcbiBcXG4tXFx0LyogU2V0IHVwIHRoZSBzd2FwIGNsdXN0ZXIgaW5mbyAqL1xcbi1cXHRlcnJvciA9IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzaSwgc3dhcF9oZWFkZXIsIG1heHBhZ2VzKTtcXG4tXFx0aWYgKGVycm9yKVxcbi1cXHRcXHRnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTtcXG4tXFxuIFxcdGlmIChzaS1cXHUwMDNlYmRldiBcXHUwMDI2XFx1MDAyNiBiZGV2X3N0YWJsZV93cml0ZXMoc2ktXFx1MDAzZWJkZXYpKVxcbiBcXHRcXHRzaS1cXHUwMDNlZmxhZ3MgfD0gU1dQX1NUQUJMRV9XUklURVM7XFxuIFxcbkBAIC0zNzE4LDYgKzM5MTEsMTUgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gXFx0XFx0aW5jZWRfbnJfcm90YXRlX3N3YXAgPSB0cnVlO1xcbiBcXHR9XFxuIFxcbitcXHQvKlxcbitcXHQgKiBTZXQgdXAgdGhlIHN3YXAgY2x1c3RlciBpbmZvLiBUaGlzIG11c3QgcnVuIGFmdGVyIFNXUF9TT0xJRFNUQVRFXFxuK1xcdCAqIGlzIGRldGVybWluZWQgYWJvdmUsIGFzIGl0IGRlY2lkZXMgd2hldGhlciB0byBhbGxvY2F0ZSB0aGUgcGVyLUNQVVxcbitcXHQgKiBjbHVzdGVyIChzb2xpZCBzdGF0ZSkgb3IgdGhlIGdsb2JhbCBjbHVzdGVyIChyb3RhdGlvbmFsKS5cXG4rXFx0ICovXFxuK1xcdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xcbitcXHRpZiAoZXJyb3IpXFxuK1xcdFxcdGdvdG8gYmFkX3N3YXBfdW5sb2NrX2lub2RlO1xcbitcXG4gXFx0aWYgKChzd2FwX2ZsYWdzIFxcdTAwMjYgU1dBUF9GTEFHX0RJU0NBUkQpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdCAgICBzaS1cXHUwMDNlYmRldiBcXHUwMDI2XFx1MDAyNiBiZGV2X21heF9kaXNjYXJkX3NlY3RvcnMoc2ktXFx1MDAzZWJkZXYpKSB7XFxuIFxcdFxcdC8qXFxuQEAgLTM3NjQsMjIgKzM5NjYsMjIgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gXFx0XFx0Z290byBmcmVlX3N3YXBfenN3YXA7XFxuIFxcdH1cXG4gXFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuIFxcdHByaW8gPSBERUZfU1dBUF9QUklPO1xcbiBcXHRpZiAoc3dhcF9mbGFncyBcXHUwMDI2IFNXQVBfRkxBR19QUkVGRVIpXFxuIFxcdFxcdHByaW8gPSBzd2FwX2ZsYWdzIFxcdTAwMjYgU1dBUF9GTEFHX1BSSU9fTUFTSztcXG4gXFxuLVxcdC8qXFxuLVxcdCAqIFRoZSBwbGlzdCBwcmlvIGlzIG5lZ2F0ZWQgYmVjYXVzZSBwbGlzdCBvcmRlcmluZyBpc1xcbi1cXHQgKiBsb3ctdG8taGlnaCwgd2hpbGUgc3dhcCBvcmRlcmluZyBpcyBoaWdoLXRvLWxvd1xcbi1cXHQgKi9cXG4gXFx0c2ktXFx1MDAzZXByaW8gPSBwcmlvO1xcbi1cXHRzaS1cXHUwMDNlbGlzdC5wcmlvID0gLXNpLVxcdTAwM2VwcmlvO1xcbi1cXHRzaS1cXHUwMDNlYXZhaWxfbGlzdC5wcmlvID0gLXNpLVxcdTAwM2VwcmlvO1xcbiBcXHRzaS1cXHUwMDNlc3dhcF9maWxlID0gc3dhcF9maWxlO1xcbiBcXG4gXFx0LyogU2V0cyBTV1BfV1JJVEVPSywgcmVzdXJyZWN0IHRoZSBwZXJjcHUgcmVmLCBleHBvc2UgdGhlIHN3YXAgZGV2aWNlICovXFxuLVxcdGVuYWJsZV9zd2FwX2luZm8oc2kpO1xcbitcXHRwZXJjcHVfcmVmX3Jlc3VycmVjdChcXHUwMDI2c2ktXFx1MDAzZXVzZXJzKTtcXG4rXFx0cGVyY3B1X2Rvd25fd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdGVycm9yID0gc3dhcF9xdWV1ZV9hZGQoc2kpO1xcbitcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdGlmIChlcnJvcilcXG4rXFx0XFx0Z290byBmcmVlX3N3YXBfenN3YXA7XFxuK1xcbitcXHRzd2FwX2RldmljZV9lbmFibGUoc2kpO1xcbiBcXG4gXFx0cHJfaW5mbyhcXFwiQWRkaW5nICV1ayBzd2FwIG9uICVzLiAgUHJpb3JpdHk6JWQgZXh0ZW50czolZCBhY3Jvc3M6JWxsdWsgJXMlcyVzJXNcXFxcblxcXCIsXFxuIFxcdFxcdEsoc2ktXFx1MDAzZXBhZ2VzKSwgbmFtZS1cXHUwMDNlbmFtZSwgc2ktXFx1MDAzZXByaW8sIG5yX2V4dGVudHMsXFxuQEAgLTM3ODksNyArMzk5MSw2IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXFxuIFxcdFxcdChzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfQVJFQV9ESVNDQVJEKSA/IFxcXCJzXFxcIiA6IFxcXCJcXFwiLFxcbiBcXHRcXHQoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1BBR0VfRElTQ0FSRCkgPyBcXFwiY1xcXCIgOiBcXFwiXFxcIik7XFxuIFxcbi1cXHRtdXRleF91bmxvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuIFxcdGF0b21pY19pbmMoXFx1MDAyNnByb2NfcG9sbF9ldmVudCk7XFxuIFxcdHdha2VfdXBfaW50ZXJydXB0aWJsZShcXHUwMDI2cHJvY19wb2xsX3dhaXQpO1xcbiBcXG5AQCAtMzgwMCw2ICs0MDAxLDggQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gYmFkX3N3YXBfdW5sb2NrX2lub2RlOlxcbiBcXHRpbm9kZV91bmxvY2soaW5vZGUpO1xcbiBiYWRfc3dhcDpcXG4rXFx0ZnJlZV9wZXJjcHUoc2ktXFx1MDAzZXBlcmNwdV9jbHVzdGVyKTtcXG4rXFx0c2ktXFx1MDAzZXBlcmNwdV9jbHVzdGVyID0gTlVMTDtcXG4gXFx0a2ZyZWUoc2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcXG4gXFx0c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyID0gTlVMTDtcXG4gXFx0aW5vZGUgPSBOVUxMO1xcbkBAIC0zODEwLDkgKzQwMTMsOSBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbiBcXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xcbiBcXHQgKiBhbGxvY19zd2FwX2luZm8gY2FuIHJldXNlIHRoaXMgc2kgc2FmZWx5LlxcbiBcXHQgKi9cXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfZG93bl93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gXFx0c2ktXFx1MDAzZWZsYWdzID0gMDtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gXFx0aWYgKGluY2VkX25yX3JvdGF0ZV9zd2FwKVxcbiBcXHRcXHRhdG9taWNfZGVjKFxcdTAwMjZucl9yb3RhdGVfc3dhcCk7XFxuIFxcdGlmIChzd2FwX2ZpbGUpXFxuQEAgLTM4MjcsMTkgKzQwMzAsMTcgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gXFxuIHZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbClcXG4ge1xcbi1cXHR1bnNpZ25lZCBpbnQgdHlwZTtcXG4rXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xcbiBcXHR1bnNpZ25lZCBsb25nIG5yX3RvX2JlX3VudXNlZCA9IDA7XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdGZvciAodHlwZSA9IDA7IHR5cGUgXFx1MDAzYyBucl9zd2FwZmlsZXM7IHR5cGUrKykge1xcbi1cXHRcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBzd2FwX2luZm9bdHlwZV07XFxuLVxcbi1cXHRcXHRpZiAoKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9VU0VEKSBcXHUwMDI2XFx1MDAyNiAhKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9XUklURU9LKSlcXG4rXFx0cGVyY3B1X2Rvd25fcmVhZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0Zm9yX2VhY2hfc3dhcChzaSkge1xcbitcXHRcXHRpZiAoIShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfV1JJVEVPSykpXFxuIFxcdFxcdFxcdG5yX3RvX2JlX3VudXNlZCArPSBzd2FwX3VzYWdlX2luX3BhZ2VzKHNpKTtcXG4gXFx0fVxcbiBcXHR2YWwtXFx1MDAzZWZyZWVzd2FwID0gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2bnJfc3dhcF9wYWdlcykgKyBucl90b19iZV91bnVzZWQ7XFxuIFxcdHZhbC1cXHUwMDNldG90YWxzd2FwID0gdG90YWxfc3dhcF9wYWdlcyArIG5yX3RvX2JlX3VudXNlZDtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC0zODc5LDcgKzQwODAsNyBAQCBpbnQgc3dhcF9kdXBfZW50cnlfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5KVxcbiAjaWYgZGVmaW5lZChDT05GSUdfTUVNQ0cpIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoQ09ORklHX0JMS19DR1JPVVApXFxuIHN0YXRpYyBib29sIF9faGFzX3VzYWJsZV9zd2FwKHZvaWQpXFxuIHtcXG4tXFx0cmV0dXJuICFwbGlzdF9oZWFkX2VtcHR5KFxcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkKTtcXG4rXFx0cmV0dXJuIFJFQURfT05DRSh0b3RhbF9zd2FwX3BhZ2VzKSBcXHUwMDNlIDA7XFxuIH1cXG4gXFxuIHZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXFxuQEAgLTM5MDIsMTQgKzQxMDMsMTQgQEAgdm9pZCBfX2ZvbGlvX3Rocm90dGxlX3N3YXByYXRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGdmcF90IGdmcClcXG4gXFx0aWYgKGN1cnJlbnQtXFx1MDAzZXRocm90dGxlX2Rpc2spXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4tXFx0cGxpc3RfZm9yX2VhY2hfZW50cnkoc2ksIFxcdTAwMjZzd2FwX2F2YWlsX2hlYWQsIGF2YWlsX2xpc3QpIHtcXG4rXFx0cGVyY3B1X2Rvd25fcmVhZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xcbiBcXHRcXHRpZiAoc2ktXFx1MDAzZWJkZXYpIHtcXG4gXFx0XFx0XFx0YmxrY2dfc2NoZWR1bGVfdGhyb3R0bGUoc2ktXFx1MDAzZWJkZXYtXFx1MDAzZWJkX2Rpc2ssIHRydWUpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbiBcXHR9XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xcbitcXHRwZXJjcHVfdXBfcmVhZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gfVxcbiAjZW5kaWZcXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQzOjQ2LjA5MTA2MDUwOVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjczNTY3NTU0NjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInN3YXBfYWxsb2NfZW50cnlcIixcbiAgICBcInN3YXBfcXVldWVfYWRkXCIsXG4gICAgXCJzd2FwX3F1ZXVlX2RlbFwiLFxuICAgIFwic3dhcF9xdWV1ZV9nZXRfZGV2aWNlXCIsXG4gICAgXCJzd2FwX2RldmljZV9lbmFibGVcIixcbiAgICBcInN3YXBfZGV2aWNlX2Rpc2FibGVcIixcbiAgICBcInN3YXBfZGV2aWNlX2ludXNlX2FkZFwiLFxuICAgIFwic3dhcF9kZXZpY2VfaW51c2Vfc3ViXCIsXG4gICAgXCJhZGRfdG9fYXZhaWxfbGlzdFwiLFxuICAgIFwiZGVsX2Zyb21fYXZhaWxfbGlzdFwiLFxuICAgIFwic3dhcF9xdWV1ZV9tYXNrXCIsXG4gICAgXCJzd2FwX3F1ZXVlX3VubWFza1wiLFxuICAgIFwiY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVwbGFjZXMgdGhlIHBsaXN0LWJhc2VkIHN3YXAgZGV2aWNlIHF1ZXVlIHdpdGggYSBjdXN0b20gcm91bmQtcm9iaW4gcXVldWUsIGludHJvZHVjaW5nIG5ldyBjb3JlIGxvZ2ljIGZvciBzd2FwIGFsbG9jYXRpb24gYW5kIGRldmljZSBtYW5hZ2VtZW50LiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gdGhlIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG5ldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0XG4gICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksXG4gICBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDlmMzQ5MzY1ZTBlYjFmZTIxMjhhODQ4NGJiNGNhNjUxZjFkYmQyYTJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEp1bCAxNCAwMDo0Mzo0NCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxpc3QuaCBiL2luY2x1ZGUvbGludXgvcGxpc3QuaFxuaW5kZXggMTZjZjQzNTViNWMxMzEuLjczZDM1OWMxYTA1MzZhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9wbGlzdC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BsaXN0LmhcbkBAIC0xMzIsOCArMTMyLDYgQEAgc3RhdGljIGlubGluZSB2b2lkIHBsaXN0X25vZGVfaW5pdChzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgaW50IHByaW8pXG4gZXh0ZXJuIHZvaWQgcGxpc3RfYWRkKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XG4gZXh0ZXJuIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XG4gXG4tZXh0ZXJuIHZvaWQgcGxpc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpO1xuLVxuIC8qKlxuICAqIHBsaXN0X2Zvcl9lYWNoIC0gaXRlcmF0ZSBvdmVyIHRoZSBwbGlzdFxuICAqIEBwb3M6XHR0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlclxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcbmluZGV4IDY5NmVkMDE3MDljMmJhLi4wNDc2NzU0MDk3MmI4MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTE5NCw2ICsxOTQsMjIgQEAgc3RydWN0IHN3YXBfZXh0ZW50IHtcbiBcdCgob2Zmc2V0b2YodW5pb24gc3dhcF9oZWFkZXIsIG1hZ2ljLm1hZ2ljKSAtIFxcXG4gXHQgIG9mZnNldG9mKHVuaW9uIHN3YXBfaGVhZGVyLCBpbmZvLmJhZHBhZ2VzKSkgLyBzaXplb2YoaW50KSlcbiBcbisvKlxuKyAqIFN3YXAgZGV2aWNlIGZsYWdzLCBleGNlcHQgdGhlIG9uZXMgZG9jdW1lbnRlZCBiZWxvdywgYWxsIGFyZSBpbW11dGFibGVcbisgKiBhZnRlciBleHBvc2VkIGJ5IHN3YXBfZGV2aWNlX2VuYWJsZSwgYW5kIHVudGlsIHRoZSBkZXZpY2UgaXMgZnJlZWQgYWdhaW5cbisgKiAoU1dQX1VTRUQgdW5zZXQpLiBUaGUgZXhjZXB0aW9ucyBhcmUgYWxsIHByb3RlY3RlZCBieSBzd2Fwb25fcndzZW06XG4rICogLSBTV1BfVVNFRDogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIHRoZSBkZXZpY2UgaXMgaW51c2UuIE9uY2VcbisgKiAgIHNldCwgd29uJ3QgYmUgY2xlYXJlZCB1bmxlc3MgYWxsIHJlZmVyZW5jZSB0byB0aGlzIGRldmljZSBpcyBmcmVlZCBhbmRcbisgKiAgIHN3YXBvZmYgZmluaXNoZWQuXG4rICogLSBTV1BfV1JJVEVPSzogUHJvdGVjdGVkIGJ5IGJvdGggc3dhcG9uX3J3c2VtIGFuZCBzd2FwX2F2YWlsX2xvY2ssIGNsZWFyaW5nXG4rICogICB0aGlzIGZsYWcgYWxzbyB3YWl0cyBmb3IgYWxsIGN1cnJlbnQgY2x1c3RlciBsb2NrIHVzZXJzIHRvIGV4aXQgc29cbisgKiAgIGNoZWNraW5nIHRoaXMgZmxhZyB3aGlsZSBob2xkaW5nIGFueSBvZiB0aGVzZSBsb2NrcyBlbnN1cmVzIHRoZSBkZXZpY2VcbisgKiAgIGlzIHNhZmUgdG8gdXNlIGF0IHRoZSBtb21lbnQuIE5vdGU6IGNsZWFyaW5nIHRoaXMgZmxhZyBkb2Vzbid0IGFmZmVjdFxuKyAqICAgcGVuZGluZyBJTyBvciBhc3luYyByZXF1ZXN0cywgaXQgb25seSBwcmV2ZW50cyBmdXJ0aGVyIGVudHJ5IGFsbG9jYXRpb25cbisgKiAgIG9yIG5ldyBhc3luYyByZXF1ZXN0IChlLmcuIGRpc2NhcmQpIGZyb20gaW5pdGlhdGluZy5cbisgKiAtIFNXUF9ISUJFUk5BVElPTjogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIGlmIHRoZSBkZXZpY2VcbisgKiAgIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uXG4rICovXG4gZW51bSB7XG4gXHRTV1BfVVNFRFx0PSAoMSBcdTAwM2NcdTAwM2MgMCksXHQvKiBpcyBzbG90IGluIHN3YXBfaW5mb1tdIHVzZWQ/ICovXG4gXHRTV1BfV1JJVEVPS1x0PSAoMSBcdTAwM2NcdTAwM2MgMSksXHQvKiBvayB0byB3cml0ZSB0byB0aGlzIHN3YXA/XHQqL1xuQEAgLTIzMCwxMCArMjQ2LDE3IEBAIGVudW0ge1xuICNlbmRpZlxuIFxuIC8qXG4tICogV2Uga2VlcCB1c2luZyBzYW1lIGNsdXN0ZXIgZm9yIHJvdGF0aW9uYWwgZGV2aWNlIHNvIElPIHdpbGwgYmUgc2VxdWVudGlhbC5cbi0gKiBUaGUgcHVycG9zZSBpcyB0byBvcHRpbWl6ZSBTV0FQIHRocm91Z2hwdXQgb24gdGhlc2UgZGV2aWNlLlxuKyAqIFdlIGFzc2lnbiBhIGNsdXN0ZXIgdG8gZWFjaCBDUFUsIHNvIGVhY2ggQ1BVIGNhbiBhbGxvY2F0ZSBzd2FwIGVudHJ5IGZyb21cbisgKiBpdHMgb3duIGNsdXN0ZXIgYW5kIHN3YXBvdXQgc2VxdWVudGlhbGx5LiBUaGUgcHVycG9zZSBpcyB0byBvcHRpbWl6ZSBzd2Fwb3V0XG4rICogdGhyb3VnaHB1dC5cbiAgKi9cbitzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIge1xuK1x0bG9jYWxfbG9ja190IGxvY2s7IC8qIFByb3RlY3QgdGhlIHBlcmNwdV9jbHVzdGVyIGFib3ZlICovXG4rXHR1bnNpZ25lZCBpbnQgbmV4dFtTV0FQX05SX09SREVSU107IC8qIExpa2VseSBuZXh0IGFsbG9jYXRpb24gb2Zmc2V0ICovXG4rfTtcbitcbiBzdHJ1Y3Qgc3dhcF9zZXF1ZW50aWFsX2NsdXN0ZXIge1xuK1x0c3BpbmxvY2tfdCBsb2NrOyAvKiBTZXJpYWxpemUgdXNhZ2Ugb2YgZ2xvYmFsIGNsdXN0ZXIgKi9cbiBcdHVuc2lnbmVkIGludCBuZXh0W1NXQVBfTlJfT1JERVJTXTsgLyogTGlrZWx5IG5leHQgYWxsb2NhdGlvbiBvZmZzZXQgKi9cbiB9O1xuIFxuQEAgLTI0NCw3ICsyNjcsNiBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7XG4gXHRzdHJ1Y3QgcGVyY3B1X3JlZiB1c2VycztcdC8qIGluZGljYXRlIGFuZCBrZWVwIHN3YXAgZGV2aWNlIHZhbGlkLiAqL1xuIFx0dW5zaWduZWQgbG9uZ1x0ZmxhZ3M7XHRcdC8qIFNXUF9VU0VEIGV0Yzogc2VlIGFib3ZlICovXG4gXHRzaWduZWQgc2hvcnRcdHByaW87XHRcdC8qIHN3YXAgcHJpb3JpdHkgb2YgdGhpcyB0eXBlICovXG4tXHRzdHJ1Y3QgcGxpc3Rfbm9kZSBsaXN0O1x0XHQvKiBlbnRyeSBpbiBzd2FwX2FjdGl2ZV9oZWFkICovXG4gXHRzaWduZWQgY2hhclx0dHlwZTtcdFx0Lyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqL1xuIFx0dW5zaWduZWQgaW50XHRtYXg7XHRcdC8qIHNpemUgb2YgdGhpcyBzd2FwIGRldmljZSAqL1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87IC8qIGNsdXN0ZXIgaW5mby4gT25seSBmb3IgU1NEICovXG5AQCAtMjU2LDI2ICsyNzgsMjAgQEAgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3Qge1xuIFx0XHRcdFx0XHQvKiBsaXN0IG9mIGNsdXN0ZXIgdGhhdCBhcmUgZnJhZ21lbnRlZCBvciBjb250ZW50ZWQgKi9cbiBcdHVuc2lnbmVkIGludCBwYWdlcztcdFx0LyogdG90YWwgb2YgdXNhYmxlIHBhZ2VzIG9mIHN3YXAgKi9cbiBcdGF0b21pY19sb25nX3QgaW51c2VfcGFnZXM7XHQvKiBudW1iZXIgb2YgdGhvc2UgY3VycmVudGx5IGluIHVzZSAqL1xuK1x0c3RydWN0IHBlcmNwdV9jbHVzdGVyXHRfX3BlcmNwdSAqcGVyY3B1X2NsdXN0ZXI7IC8qIHBlciBjcHUncyBzd2FwIGxvY2F0aW9uICovXG4gXHRzdHJ1Y3Qgc3dhcF9zZXF1ZW50aWFsX2NsdXN0ZXIgKmdsb2JhbF9jbHVzdGVyOyAvKiBVc2Ugb25lIGdsb2JhbCBjbHVzdGVyIGZvciByb3RhdGluZyBkZXZpY2UgKi9cbi1cdHNwaW5sb2NrX3QgZ2xvYmFsX2NsdXN0ZXJfbG9jaztcdC8qIFNlcmlhbGl6ZSB1c2FnZSBvZiBnbG9iYWwgY2x1c3RlciAqL1xuIFx0c3RydWN0IHJiX3Jvb3Qgc3dhcF9leHRlbnRfcm9vdDsvKiByb290IG9mIHRoZSBzd2FwIGV4dGVudCByYnRyZWUgKi9cbiBcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XHQvKiBzd2FwIGRldmljZSBvciBiZGV2IG9mIHN3YXAgZmlsZSAqL1xuIFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZTtcdFx0Lyogc2VsZG9tIHJlZmVyZW5jZWQgKi9cbiBcdHN0cnVjdCBjb21wbGV0aW9uIGNvbXA7XHRcdC8qIHNlbGRvbSByZWZlcmVuY2VkICovXG4gXHRzcGlubG9ja190IGxvY2s7XHRcdC8qXG4tXHRcdFx0XHRcdCAqIHByb3RlY3QgbWFwIHNjYW4gcmVsYXRlZCBmaWVsZHMgbGlrZVxuLVx0XHRcdFx0XHQgKiBpbnVzZV9wYWdlcyBhbmQgYWxsIGNsdXN0ZXIgbGlzdHMuXG4tXHRcdFx0XHRcdCAqIE90aGVyIGZpZWxkcyBhcmUgb25seSBjaGFuZ2VkXG4tXHRcdFx0XHRcdCAqIGF0IHN3YXBvbi9zd2Fwb2ZmLCBzbyBhcmUgcHJvdGVjdGVkXG4tXHRcdFx0XHRcdCAqIGJ5IHN3YXBfbG9jay4gY2hhbmdpbmcgZmxhZ3MgbmVlZFxuLVx0XHRcdFx0XHQgKiBob2xkIHRoaXMgbG9jayBhbmQgc3dhcF9sb2NrLiBJZlxuLVx0XHRcdFx0XHQgKiBib3RoIGxvY2tzIG5lZWQgaG9sZCwgaG9sZCBzd2FwX2xvY2tcbi1cdFx0XHRcdFx0ICogZmlyc3QuXG4rXHRcdFx0XHRcdCAqIFByb3RlY3QgY2x1c3RlciBsaXN0cy4gT3RoZXIgZmllbGRzXG4rXHRcdFx0XHRcdCAqIGFyZSBvbmx5IGNoYW5nZWQgYXQgc3dhcG9uL3N3YXBvZmYsXG4rXHRcdFx0XHRcdCAqIHNvIGFyZSBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtLlxuIFx0XHRcdFx0XHQgKi9cbiBcdHN0cnVjdCB3b3JrX3N0cnVjdCBkaXNjYXJkX3dvcms7IC8qIGRpc2NhcmQgd29ya2VyICovXG4gXHRzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVjbGFpbV93b3JrOyAvKiByZWNsYWltIHdvcmtlciAqL1xuIFx0c3RydWN0IGxpc3RfaGVhZCBkaXNjYXJkX2NsdXN0ZXJzOyAvKiBkaXNjYXJkIGNsdXN0ZXJzIGxpc3QgKi9cbi1cdHN0cnVjdCBwbGlzdF9ub2RlIGF2YWlsX2xpc3Q7ICAgLyogZW50cnkgaW4gc3dhcF9hdmFpbF9oZWFkICovXG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IHBhZ2Vfc3dhcF9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmRpZmYgLS1naXQgYS9saWIvcGxpc3QuYyBiL2xpYi9wbGlzdC5jXG5pbmRleCBhNWJlZjM4YWRkNDMxZC4uYjA1YWU3ZmZlYTg3ZTggMTAwNjQ0XG4tLS0gYS9saWIvcGxpc3QuY1xuKysrIGIvbGliL3BsaXN0LmNcbkBAIC0xNDIsNTggKzE0Miw2IEBAIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZClcbiBcdHBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7XG4gfVxuIFxuLS8qKlxuLSAqIHBsaXN0X3JlcXVldWUgLSBSZXF1ZXVlIEBub2RlIGF0IGVuZCBvZiBzYW1lLXByaW8gZW50cmllcy5cbi0gKlxuLSAqIFRoaXMgaXMgZXNzZW50aWFsbHkgYW4gb3B0aW1pemVkIHBsaXN0X2RlbCgpIGZvbGxvd2VkIGJ5XG4tICogcGxpc3RfYWRkKCkuICBJdCBtb3ZlcyBhbiBlbnRyeSBhbHJlYWR5IGluIHRoZSBwbGlzdCB0b1xuLSAqIGFmdGVyIGFueSBvdGhlciBzYW1lLXByaW9yaXR5IGVudHJpZXMuXG4tICpcbi0gKiBAbm9kZTpcdFx1MDAyNnN0cnVjdCBwbGlzdF9ub2RlIHBvaW50ZXIgLSBlbnRyeSB0byBiZSBtb3ZlZFxuLSAqIEBoZWFkOlx0XHUwMDI2c3RydWN0IHBsaXN0X2hlYWQgcG9pbnRlciAtIGxpc3QgaGVhZFxuLSAqL1xuLXZvaWQgcGxpc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpXG4te1xuLVx0c3RydWN0IHBsaXN0X25vZGUgKml0ZXI7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkICpub2RlX25leHQgPSBcdTAwMjZoZWFkLVx1MDAzZW5vZGVfbGlzdDtcbi1cbi1cdHBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7XG4tXHRCVUdfT04ocGxpc3RfaGVhZF9lbXB0eShoZWFkKSk7XG4tXHRCVUdfT04ocGxpc3Rfbm9kZV9lbXB0eShub2RlKSk7XG4tXG4tXHRpZiAobm9kZSA9PSBwbGlzdF9sYXN0KGhlYWQpKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRpdGVyID0gcGxpc3RfbmV4dChub2RlKTtcbi1cbi1cdGlmIChub2RlLVx1MDAzZXByaW8gIT0gaXRlci1cdTAwM2VwcmlvKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRwbGlzdF9kZWwobm9kZSwgaGVhZCk7XG4tXG4tXHQvKlxuLVx0ICogQWZ0ZXIgcGxpc3RfZGVsKCksIGl0ZXIgaXMgdGhlIHJlcGxhY2VtZW50IG9mIHRoZSBub2RlLiAgSWYgdGhlIG5vZGVcbi1cdCAqIHdhcyBvbiBwcmlvX2xpc3QsIHRha2Ugc2hvcnRjdXQgdG8gZmluZCBub2RlX25leHQgaW5zdGVhZCBvZiBsb29waW5nLlxuLVx0ICovXG4tXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2aXRlci1cdTAwM2VwcmlvX2xpc3QpKSB7XG4tXHRcdGl0ZXIgPSBsaXN0X2VudHJ5KGl0ZXItXHUwMDNlcHJpb19saXN0Lm5leHQsIHN0cnVjdCBwbGlzdF9ub2RlLFxuLVx0XHRcdFx0ICBwcmlvX2xpc3QpO1xuLVx0XHRub2RlX25leHQgPSBcdTAwMjZpdGVyLVx1MDAzZW5vZGVfbGlzdDtcbi1cdFx0Z290byBxdWV1ZTtcbi1cdH1cbi1cbi1cdHBsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlKGl0ZXIsIGhlYWQpIHtcbi1cdFx0aWYgKG5vZGUtXHUwMDNlcHJpbyAhPSBpdGVyLVx1MDAzZXByaW8pIHtcbi1cdFx0XHRub2RlX25leHQgPSBcdTAwMjZpdGVyLVx1MDAzZW5vZGVfbGlzdDtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuLVx0fVxuLXF1ZXVlOlxuLVx0bGlzdF9hZGRfdGFpbChcdTAwMjZub2RlLVx1MDAzZW5vZGVfbGlzdCwgbm9kZV9uZXh0KTtcbi1cbi1cdHBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7XG4tfVxuLVxuICNpZmRlZiBDT05GSUdfREVCVUdfUExJU1RcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvY2xvY2suaFx1MDAzZVxuQEAgLTIzMSwxNCArMTc5LDYgQEAgc3RhdGljIHZvaWQgX19pbml0IHBsaXN0X3Rlc3RfY2hlY2soaW50IG5yX2V4cGVjdClcbiBcdEJVR19PTihwcmlvX3Bvcy1cdTAwM2VwcmlvX2xpc3QubmV4dCAhPSBcdTAwMjZmaXJzdC1cdTAwM2VwcmlvX2xpc3QpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBfX2luaXQgcGxpc3RfdGVzdF9yZXF1ZXVlKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlKVxuLXtcbi1cdHBsaXN0X3JlcXVldWUobm9kZSwgXHUwMDI2dGVzdF9oZWFkKTtcbi1cbi1cdGlmIChub2RlICE9IHBsaXN0X2xhc3QoXHUwMDI2dGVzdF9oZWFkKSlcbi1cdFx0QlVHX09OKG5vZGUtXHUwMDNlcHJpbyA9PSBwbGlzdF9uZXh0KG5vZGUpLVx1MDAzZXByaW8pO1xuLX1cbi1cbiBzdGF0aWMgaW50ICBfX2luaXQgcGxpc3RfdGVzdCh2b2lkKVxuIHtcbiBcdGludCBucl9leHBlY3QgPSAwLCBpLCBsb29wO1xuQEAgLTI2MiwxMCArMjAyLDYgQEAgc3RhdGljIGludCAgX19pbml0IHBsaXN0X3Rlc3Qodm9pZClcbiBcdFx0XHRucl9leHBlY3QtLTtcbiBcdFx0fVxuIFx0XHRwbGlzdF90ZXN0X2NoZWNrKG5yX2V4cGVjdCk7XG4tXHRcdGlmICghcGxpc3Rfbm9kZV9lbXB0eSh0ZXN0X25vZGUgKyBpKSkge1xuLVx0XHRcdHBsaXN0X3Rlc3RfcmVxdWV1ZSh0ZXN0X25vZGUgKyBpKTtcbi1cdFx0XHRwbGlzdF90ZXN0X2NoZWNrKG5yX2V4cGVjdCk7XG4tXHRcdH1cbiBcdH1cbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUodGVzdF9ub2RlKTsgaSsrKSB7XG5kaWZmIC0tZ2l0IGEvbW0vc3dhcC5oIGIvbW0vc3dhcC5oXG5pbmRleCBiNTFhZDMwNzFhNzMwOC4uMDhhNzgyZjNkNWFjZDIgMTAwNjQ0XG4tLS0gYS9tbS9zd2FwLmhcbisrKyBiL21tL3N3YXAuaFxuQEAgLTkxLDE2ICs5MSwxNiBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzd3BfY2x1c3Rlcl9vZmZzZXQoc3dwX2VudHJ5X3QgZW50cnkpXG4gICovXG4gc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqX19zd2FwX3R5cGVfdG9faW5mbyhpbnQgdHlwZSlcbiB7XG4tXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4tXG4tXHRzaSA9IFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqL1xuLVx0Vk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybyhcdTAwMjZzaS1cdTAwM2V1c2VycykpOyAvKiByYWNlIHdpdGggc3dhcG9mZiAqL1xuLVx0cmV0dXJuIHNpO1xuK1x0cmV0dXJuIFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqL1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpfX3N3YXBfZW50cnlfdG9faW5mbyhzd3BfZW50cnlfdCBlbnRyeSlcbiB7XG4tXHRyZXR1cm4gX19zd2FwX3R5cGVfdG9faW5mbyhzd3BfdHlwZShlbnRyeSkpO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuK1xuK1x0c2kgPSBfX3N3YXBfdHlwZV90b19pbmZvKHN3cF90eXBlKGVudHJ5KSk7IC8qIHJjdV9kZXJlZmVyZW5jZSgpICovXG4rXHRWTV9XQVJOX09OX09OQ0UocGVyY3B1X3JlZl9pc196ZXJvKFx1MDAyNnNpLVx1MDAzZXVzZXJzKSk7IC8qIHJhY2Ugd2l0aCBzd2Fwb2ZmICovXG4rXHRyZXR1cm4gc2k7XG4gfVxuIFxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmNcbmluZGV4IDc3NWMzODU0OTBhNWZhLi5mOTM4NjMzMDlhNWE1MCAxMDA2NDRcbi0tLSBhL21tL3N3YXBmaWxlLmNcbisrKyBiL21tL3N3YXBmaWxlLmNcbkBAIC00MSw3ICs0MSw2IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGxldGlvbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3VzcGVuZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvenN3YXAuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BsaXN0LmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2Nhc20vdGxiZmx1c2guaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2xlYWZvcHMuaFx1MDAzZVxuQEAgLTQ5LDMxICs0OCwzOCBAQFxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gI2luY2x1ZGUgXCJzd2FwLmhcIlxuIFxuLXN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuLVx0XHRcdCAgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpO1xuK3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2ludXNlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKTtcbiBzdGF0aWMgYm9vbCBmb2xpb19zd2FwY2FjaGVfZnJlZWFibGUoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4gc3RhdGljIHZvaWQgbW92ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbiBcdFx0XHQgZW51bSBzd2FwX2NsdXN0ZXJfZmxhZ3MgbmV3X2ZsYWdzKTtcbitzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpO1xuIFxuIC8qXG4tICogUHJvdGVjdHMgdGhlIHN3YXBfaW5mbyBhcnJheSwgYW5kIHRoZSBTV1BfVVNFRCBmbGFnLiBzd2FwX2luZm8gY29udGFpbnNcbi0gKiBsYXppbHkgYWxsb2NhdGVkIFx1MDAyNiBmcmVlZCBzd2FwIGRldmljZSBpbmZvIHN0cnV0cywgYW5kIFNXUF9VU0VEIGluZGljYXRlc1xuLSAqIHdoaWNoIGRldmljZSBpcyB1c2VkLCB+U1dQX1VTRUQgZGV2aWNlcyBhbmQgY2FuIGJlIHJldXNlZC5cbi0gKlxuLSAqIEFsc28gcHJvdGVjdHMgc3dhcF9hY3RpdmVfaGVhZCB0b3RhbF9zd2FwX3BhZ2VzLCBhbmQgdGhlIFNXUF9XUklURU9LIGZsYWcuXG4rICogU2VyaWFsaXplcyBzd2Fwb24vc3dhcG9mZiAod3JpdGVycykgYW5kIHByb3RlY3RzIHRoZSBzd2FwX2luZm9cbisgKiBhcnJheSwgbnJfc3dhcGZpbGVzLCB0b3RhbF9zd2FwX3BhZ2VzLCBhbmQgcGFydCBvZiBzd2FwIGRldmljZVxuKyAqIGluZm8gY29udGVudCAoc2VlIGNvbW1lbnQgb2Ygc3dhcF9pbmZvX3N0cnVjdCkuICBSZWFkZXJzXG4rICogKGFsbG9jYXRpb24sIC9wcm9jL3N3YXBzLCBldGMuKSB0YWtlIHBlcmNwdV9kb3duX3JlYWQoKSB3aGljaFxuKyAqIGlzIGNoZWFwIGFzIHRoZSBob3QgcGF0aC5cbisgKi9cbitERUZJTkVfU1RBVElDX1BFUkNQVV9SV1NFTShzd2Fwb25fcndzZW0pO1xuKy8qXG4rICogc3dhcF9pbmZvIGNvbnRhaW5zIGxhemlseSBhbGxvY2F0ZWQgc3dhcCBkZXZpY2UgaW5mbyBzdHJ1Y3RzLCBhbmRcbisgKiBTV1BfVVNFRCBpbmRpY2F0ZXMgd2hpY2ggZGV2aWNlIGlzIHVzZWQsIH5TV1BfVVNFRCBkZXZpY2VzIGNhbiBiZVxuKyAqIHJldXNlZC4gUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbSwgYnV0IHJlYWRpbmcgY291bGQgYmUgbG9ja2xlc3MuXG4gICovXG4tc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spO1xuK3N0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2luZm9bTUFYX1NXQVBGSUxFU107XG4gc3RhdGljIHVuc2lnbmVkIGludCBucl9zd2FwZmlsZXM7XG4tYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xuK2xvbmcgdG90YWxfc3dhcF9wYWdlcztcbitcbiAvKlxuICAqIFNvbWUgbW9kdWxlcyB1c2Ugc3dhcHBhYmxlIG9iamVjdHMgYW5kIG1heSB0cnkgdG8gc3dhcCB0aGVtIG91dCB1bmRlclxuICAqIG1lbW9yeSBwcmVzc3VyZSAodmlhIHRoZSBzaHJpbmtlcikuIEJlZm9yZSBkb2luZyBzbywgdGhleSBtYXkgd2lzaCB0b1xuICAqIGNoZWNrIHRvIHNlZSBpZiBhbnkgc3dhcCBzcGFjZSBpcyBhdmFpbGFibGUuXG4gICovXG4rYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xuIEVYUE9SVF9TWU1CT0xfR1BMKG5yX3N3YXBfcGFnZXMpO1xuLS8qIHByb3RlY3RlZCB3aXRoIHN3YXBfbG9jay4gcmVhZGluZyBpbiB2bV9zd2FwX2Z1bGwoKSBkb2Vzbid0IG5lZWQgbG9jayAqL1xuLWxvbmcgdG90YWxfc3dhcF9wYWdlcztcbiAjZGVmaW5lIERFRl9TV0FQX1BSSU8gIC0xXG4gdW5zaWduZWQgbG9uZyBzd2FwZmlsZV9tYXhpbXVtX3NpemU7XG4gI2lmZGVmIENPTkZJR19NSUdSQVRJT05cbkBAIC04Myw1MiArODksNDIgQEAgYm9vbCBzd2FwX21pZ3JhdGlvbl9hZF9zdXBwb3J0ZWQ7XG4gc3RhdGljIGNvbnN0IGNoYXIgQmFkX2ZpbGVbXSA9IFwiQmFkIHN3YXAgZmlsZSBlbnRyeSBcIjtcbiBzdGF0aWMgY29uc3QgY2hhciBCYWRfb2Zmc2V0W10gPSBcIkJhZCBzd2FwIG9mZnNldCBlbnRyeSBcIjtcbiBcbi0vKlxuLSAqIGFsbCBhY3RpdmUgc3dhcF9pbmZvX3N0cnVjdHNcbi0gKiBwcm90ZWN0ZWQgd2l0aCBzd2FwX2xvY2ssIGFuZCBvcmRlcmVkIGJ5IHByaW9yaXR5LlxuLSAqL1xuLXN0YXRpYyBQTElTVF9IRUFEKHN3YXBfYWN0aXZlX2hlYWQpO1xuK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKl9fc3dhcF9pdGVyKGludCAqaSwgdW5zaWduZWQgbG9uZyBmbGFnKVxuK3tcbitcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdHdoaWxlICgqaSBcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XG4rXHRcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oKmkpO1xuK1xuK1x0XHRWTV9XQVJOX09OKCFzaSk7XG4rXHRcdCgqaSkrKztcbitcdFx0aWYgKGZsYWcgXHUwMDI2XHUwMDI2ICEoKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBmbGFnKSA9PSBmbGFnKSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0cmV0dXJuIHNpO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKyNkZWZpbmUgX19mb3JfZWFjaF9zd2FwKHNpLCBmbGFnKVx0XHRcdFxcXG4rXHRmb3IgKGludCBfX2kgPSAwOyAoKHNpKSA9IF9fc3dhcF9pdGVyKFx1MDAyNl9faSwgZmxhZykpOylcbiBcbiAvKlxuLSAqIGFsbCBhdmFpbGFibGUgKGFjdGl2ZSwgbm90IGZ1bGwpIHN3YXBfaW5mb19zdHJ1Y3RzXG4tICogcHJvdGVjdGVkIHdpdGggc3dhcF9hdmFpbF9sb2NrLCBvcmRlcmVkIGJ5IHByaW9yaXR5LlxuLSAqIFRoaXMgaXMgdXNlZCBieSBmb2xpb19hbGxvY19zd2FwKCkgaW5zdGVhZCBvZiBzd2FwX2FjdGl2ZV9oZWFkXG4tICogYmVjYXVzZSBzd2FwX2FjdGl2ZV9oZWFkIGluY2x1ZGVzIGFsbCBzd2FwX2luZm9fc3RydWN0cyxcbi0gKiBidXQgZm9saW9fYWxsb2Nfc3dhcCgpIGRvZXNuJ3QgbmVlZCB0byBsb29rIGF0IGZ1bGwgb25lcy5cbi0gKiBUaGlzIHVzZXMgaXRzIG93biBsb2NrIGluc3RlYWQgb2Ygc3dhcF9sb2NrIGJlY2F1c2Ugd2hlbiBhXG4tICogc3dhcF9pbmZvX3N0cnVjdCBjaGFuZ2VzIGJldHdlZW4gbm90LWZ1bGwvZnVsbCwgaXQgbmVlZHMgdG9cbi0gKiBhZGQvcmVtb3ZlIGl0c2VsZiB0by9mcm9tIHRoaXMgbGlzdCwgYnV0IHRoZSBzd2FwX2luZm9fc3RydWN0LVx1MDAzZWxvY2tcbi0gKiBpcyBoZWxkIGFuZCB0aGUgbG9ja2luZyBvcmRlciByZXF1aXJlcyBzd2FwX2xvY2sgdG8gYmUgdGFrZW5cbi0gKiBiZWZvcmUgYW55IHN3YXBfaW5mb19zdHJ1Y3QtXHUwMDNlbG9jay5cbisgKiBmb3JfZWFjaF9zd2FwIC0gaXRlcmF0ZSB0aHJvdWdoIGFsbCBhbGxvY2F0ZWQgYW5kIGludXNlIHN3YXAgZGV2aWNlc1xuKyAqIEBzaTogdGhlIGl0ZXJhdG9yXG4rICpcbisgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3QgaG9sZCBzd2Fwb25fcndzZW0uIFRoZSBsb2NrIG1heSBiZSBkcm9wcGVkIGR1cmluZ1xuKyAqIHRoZSBsb29wIGJvZHkgYnV0IG11c3QgYmUgcmUtYWNxdWlyZWQgYmVmb3JlIHRoZSBuZXh0IGl0ZXJhdGlvbi5cbiAgKi9cbi1zdGF0aWMgUExJU1RfSEVBRChzd2FwX2F2YWlsX2hlYWQpO1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9hdmFpbF9sb2NrKTtcbi1cbi1zdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9pbmZvW01BWF9TV0FQRklMRVNdO1xuKyNkZWZpbmUgZm9yX2VhY2hfc3dhcChzaSkgX19mb3JfZWFjaF9zd2FwKHNpLCBTV1BfVVNFRClcbisjZGVmaW5lIGZvcl9lYWNoX2F2YWlsX3N3YXAoc2kpIF9fZm9yX2VhY2hfc3dhcChzaSwgU1dQX1VTRUQgfCBTV1BfV1JJVEVPSylcbiBcbiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnN3YXBfdGFibGVfY2FjaGVwO1xuIFxuLS8qIFByb3RlY3RzIHNpLVx1MDAzZXN3YXBfZmlsZSBmb3IgL3Byb2Mvc3dhcHMgdXNhZ2UgKi9cbi1zdGF0aWMgREVGSU5FX01VVEVYKHN3YXBvbl9tdXRleCk7XG4tXG4gc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHByb2NfcG9sbF93YWl0KTtcbiAvKiBBY3Rpdml0eSBjb3VudGVyIHRvIGluZGljYXRlIHRoYXQgYSBzd2Fwb24gb3Igc3dhcG9mZiBoYXMgb2NjdXJyZWQgKi9cbiBzdGF0aWMgYXRvbWljX3QgcHJvY19wb2xsX2V2ZW50ID0gQVRPTUlDX0lOSVQoMCk7XG4gXG4gYXRvbWljX3QgbnJfcm90YXRlX3N3YXAgPSBBVE9NSUNfSU5JVCgwKTtcbiBcbi1zdHJ1Y3QgcGVyY3B1X3N3YXBfY2x1c3RlciB7XG4tXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lbU1dBUF9OUl9PUkRFUlNdO1xuLVx0dW5zaWduZWQgbG9uZyBvZmZzZXRbU1dBUF9OUl9PUkRFUlNdO1xuLVx0bG9jYWxfbG9ja190IGxvY2s7XG4tfTtcbi1cbi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcmNwdV9zd2FwX2NsdXN0ZXIsIHBlcmNwdV9zd2FwX2NsdXN0ZXIpID0ge1xuLVx0LnNpID0geyBOVUxMIH0sXG4tXHQub2Zmc2V0ID0geyBTV0FQX0VOVFJZX0lOVkFMSUQgfSxcbi1cdC5sb2NrID0gSU5JVF9MT0NBTF9MT0NLKCksXG4tfTtcbi1cbiAvKiBNYXkgcmV0dXJuIE5VTEwgb24gaW52YWxpZCB0eXBlLCBjYWxsZXIgbXVzdCBjaGVjayBmb3IgTlVMTCByZXR1cm4gKi9cbiBzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfdHlwZV90b19pbmZvKGludCB0eXBlKVxuIHtcbkBAIC0xNDMsMTggKzEzOSwzNTAgQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2VudHJ5X3RvX2luZm8oc3dwX2VudHJ5X3QgZW50cnkpXG4gXHRyZXR1cm4gc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTtcbiB9XG4gXG4rLypcbisgKiBBbGwgYXZhaWxhYmxlIHN3YXBfaW5mb19zdHJ1Y3RzIGFyZSBncm91cGVkIGJ5IHByaW9yaXR5IHJpbmdzLCB0aGUgcmluZ3NcbisgKiBhcmUgb3JkZXJlZCBpbiBhIHF1ZXVlIGJ5IHByaW9yaXR5IChsb3dlciBwcmlvIHZhbHVlID0gaGlnaGVyIHByaW9yaXR5KS5cbisgKiBUaGUgYWxsb2NhdG9yIGl0ZXJhdGVzIGFuZCByb3RhdGVzIGRldmljZXMgd2l0aGluIGVhY2ggcHJpb3JpdHkgcmluZy5cbisgKiBXaGVuIGFsbCBkZXZpY2VzIGluIGEgcmluZyBhcmUgaXRlcmF0ZWQsIGl0IGdvZXMgdG8gdGhlIG5leHQgbG93ZXJcbisgKiBwcmlvcml0eSByaW5nLlxuKyAqL1xuK3N0cnVjdCBzd2FwX3ByaW9fcmluZyB7XG4rXHRpbnQgcHJpbztcbitcdHVuc2lnbmVkIGludCBzaXplO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKmRldltdIF9fY291bnRlZF9ieShzaXplKTtcbit9O1xuK1xuKy8qXG4rICogVGhlIHJpbmcgaXMgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbSBzbyB1cGRhdGluZyBpdCBpcyBjb3N0bHkuIFRvIG1ha2VcbisgKiB0aGUgYWxsb2NhdG9yIGFuZCBvdGhlciB1c2VycyBza2lwIGZ1bGwgZGV2aWNlcyBmYXN0ZXIsIHRoZSBsb3dlc3QgYml0IG9mXG4rICogYSBkZXZpY2UgcG9pbnRlciBpcyB1c2VkIHRvIG1hcmsgaXQgZGlzYWJsZWQgKHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlKS5cbisgKiBUaGlzIHJlbGllcyBvbiBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCBiZWluZyBzdWZmaWNpZW50bHlcbisgKiBhbGlnbmVkIChndWFyYW50ZWVkIGJ5IGttYWxsb2MpLlxuKyAqL1xuKyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZUXHQwXG4rI2RlZmluZSBTV0FQX0RFVklDRV9NQVNLRURfQklUXHRcdEJJVChTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQpXG4rXG4rLypcbisgKiBTZXJpYWxpemVzIHF1ZXVlIGNvbnRlbnQgbXV0YXRpb25zIGFuZCBrZWVwcyBTV0FQX1VTQUdFX09GRkxJU1RfQklUXG4rICogY29uc2lzdGVudCB3aXRoIHRoZSBtYXNrZWQgc3RhdGUgb2YgZWFjaCBkZXZpY2UgcG9pbnRlci5cbisgKi9cbitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1xuKy8qXG4rICogU3dhcCBxdWV1ZSBpcyBwcm90ZWN0ZWQgYnkgYm90aCBzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrIGFuZCBzd2Fwb25fcndzZW0uXG4rICogT25seSBzd2Fwb24vc3dhcG9mZiB3aWxsIHRha2UgdGhlIHdyaXRlIGxvY2ssIGFuZCBtb2RpZnkgdGhlIHF1ZXVlIGxlbmd0aFxuKyAqIG9yIGFueSByaW5nJ3MgbGVuZ3RoLiBzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrIHByb3RlY3RzIHRoZSBjb250ZW50IHNvXG4rICogZGV2aWNlcyBjYW4gYmUgbWFza2VkIGVhc2lseSB3aXRob3V0IHRha2luZyB0aGUgd3JpdGVsb2NrLCB3aGljaCBpcyBoZWF2eS5cbisgKi9cbitzdGF0aWMgc3RydWN0IHN3YXBfcHJpb19yaW5nICoqc3dhcF9xdWV1ZTtcbitzdGF0aWMgdW5zaWduZWQgaW50IHN3YXBfcXVldWVfbGVuO1xuK1xuKy8qXG4rICogRWFjaCBDUFUgaGFzIGl0cyByZWFkIGl0ZXJhdG9yLCBzbyB0aGUgcXVldWUgaXRzZWxmIHdpbGwgcmVtYWluIHJlYWRcbisgKiBvbmx5IGFuZCB0aGUgQ1BVIHNpZGUgcmVhZGVyIHJvdGF0ZXMgYnkgaXRlcmF0aW5nIHRoZSBkZXZpY2VzXG4rICogcGVyaW9kaWNhbGx5IHVzaW5nIHRoZSBjb3VudGVyLlxuKyAqL1xuKyNkZWZpbmUgU1dBUF9ST1VORF9ST0JJTl9RVU9UQSBTV0FQRklMRV9DTFVTVEVSXG4rc3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciB7XG4rXHRpbnQgb2Zmc2V0O1xuK1x0bG9uZyBycl9jb3VudGVyO1xuK307XG4rXG4rc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIHtcbitcdGxvY2FsX2xvY2tfdCBsb2NrO1xuK1x0c3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciByaVtdO1xuK307XG4rXG4rc3RhdGljIF9fcGVyY3B1IHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciAqc3dhcF9xdWV1ZV9yZWFkZXJzO1xuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBzd2FwX2RldmljZV9tYXNrZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuK3tcbitcdHJldHVybiAodW5zaWduZWQgbG9uZylzaSBcdTAwMjYgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4re1xuK1x0cmV0dXJuIChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqKSgodW5zaWduZWQgbG9uZylzaSBcdTAwMjYgflNXQVBfREVWSUNFX01BU0tFRF9CSVQpO1xuK31cbitcbitzdGF0aWMgc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpzd2FwX3F1ZXVlX3ByZWFsbG9jX3JlYWRlcnMoaW50IG5yX3JpbmdzLCBnZnBfdCBnZnApXG4re1xuK1x0c3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpyZWFkZXJzO1xuK1xuK1x0aWYgKCFucl9yaW5ncylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRyZWFkZXJzID0gX19hbGxvY19wZXJjcHVfZ2ZwKHN0cnVjdF9zaXplKHJlYWRlcnMsIHJpLCBucl9yaW5ncyksXG4rXHRcdFx0XHQgICAgIF9fYWxpZ25vZl9fKCpyZWFkZXJzKSwgZ2ZwKTtcbitcdHJldHVybiByZWFkZXJzO1xuK31cbitcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnMpXG4re1xuK1x0aW50IHJpbmdfaWR4LCBjcHU7XG4rXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7XG4rXG4rXHRmcmVlX3BlcmNwdShzd2FwX3F1ZXVlX3JlYWRlcnMpO1xuK1x0c3dhcF9xdWV1ZV9yZWFkZXJzID0gcmVhZGVycztcbitcdGlmICghcmVhZGVycylcbitcdFx0cmV0dXJuO1xuK1xuK1x0LyogRGlzdHJpYnV0ZSBlYWNoIENQVSdzIHN3YXAgSU8gZmFpcmx5IGFjcm9zcyBkZXZpY2VzLiAqL1xuK1x0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuK1x0XHRsb2NhbF9sb2NrX2luaXQoXHUwMDI2cGVyX2NwdV9wdHIocmVhZGVycywgY3B1KS1cdTAwM2Vsb2NrKTtcbitcbitcdFx0Zm9yIChyaW5nX2lkeCA9IDA7IHJpbmdfaWR4IFx1MDAzYyBzd2FwX3F1ZXVlX2xlbjsgcmluZ19pZHgrKykge1xuK1x0XHRcdHJpbmcgPSBzd2FwX3F1ZXVlW3JpbmdfaWR4XTtcbitcdFx0XHRwZXJfY3B1X3B0cihyZWFkZXJzLCBjcHUpLVx1MDAzZXJpW3JpbmdfaWR4XS5vZmZzZXQgPVxuK1x0XHRcdFx0ICAgIGNwdSAlIHJpbmctXHUwMDNlc2l6ZTtcbitcdFx0fVxuK1x0fVxuK31cbitcbitzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfcXVldWVfZ2V0X2RldmljZShsb25nIG5yX2FsbG9jLCBpbnQgbnJfaXRlcilcbit7XG4rXHRib29sIHJvdGF0ZSA9IGZhbHNlO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuK1x0c3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciAqcmk7XG4rXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7XG4rXHR1bnNpZ25lZCBpbnQgcXVldWVfaWR4O1xuK1xuK1x0aWYgKCFzd2FwX3F1ZXVlX2xlbilcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4rXG4rXHRxdWV1ZV9pZHggPSAwO1xuK1x0d2hpbGUgKG5yX2l0ZXIgXHUwMDNlPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF0tXHUwMDNlc2l6ZSkge1xuK1x0XHRucl9pdGVyIC09IHN3YXBfcXVldWVbcXVldWVfaWR4XS1cdTAwM2VzaXplO1xuK1x0XHRpZiAoKytxdWV1ZV9pZHggXHUwMDNlPSBzd2FwX3F1ZXVlX2xlbilcbitcdFx0XHRyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTtcbitcdH1cbitcbitcdHJpbmcgPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF07XG4rXHRsb2NhbF9sb2NrKFx1MDAyNnN3YXBfcXVldWVfcmVhZGVycy1cdTAwM2Vsb2NrKTtcbitcdHJpID0gdGhpc19jcHVfcHRyKFx1MDAyNnN3YXBfcXVldWVfcmVhZGVycy1cdTAwM2VyaVtxdWV1ZV9pZHhdKTtcbitcdC8qIFJvdGF0ZSB3aGlsZSBpdGVyYXRpbmcgdGhlIHJpbmcsIGp1c3Qgbm90IG9uIHRoZSBmaXJzdCB0cnkgKi9cbitcdGlmIChucl9pdGVyKVxuK1x0XHRyb3RhdGUgPSB0cnVlO1xuK1x0ZWxzZSBpZiAocmktXHUwMDNlcnJfY291bnRlciBcdTAwM2MgbnJfYWxsb2MpXG4rXHRcdHJvdGF0ZSA9IHRydWU7XG4rXHRlbHNlIGlmIChyaS1cdTAwM2VvZmZzZXQgXHUwMDNlPSByaW5nLVx1MDAzZXNpemUpXG4rXHRcdHJvdGF0ZSA9IHRydWU7XG4rXHRpZiAocm90YXRlKSB7XG4rXHRcdHJpLVx1MDAzZW9mZnNldCsrO1xuK1x0XHRyaS1cdTAwM2VvZmZzZXQgJT0gcmluZy1cdTAwM2VzaXplO1xuK1x0XHRyaS1cdTAwM2Vycl9jb3VudGVyID0gU1dBUF9ST1VORF9ST0JJTl9RVU9UQTtcbitcdH1cbitcdHJpLVx1MDAzZXJyX2NvdW50ZXIgLT0gbnJfYWxsb2M7XG4rXHRzaSA9IFJFQURfT05DRShyaW5nLVx1MDAzZWRldltyaS1cdTAwM2VvZmZzZXRdKTtcbitcdGxvY2FsX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3JlYWRlcnMtXHUwMDNlbG9jayk7XG4rXG4rXHRpZiAoc3dhcF9kZXZpY2VfbWFza2VkKHNpKSlcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVCVVNZKTtcbitcbitcdHNpID0gc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihzaSk7XG4rXHRyZXR1cm4gc2k7XG4rfVxuK1xuK3N0YXRpYyBib29sIHN3YXBfcXVldWVfZmluZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0ICAgIHVuc2lnbmVkIGludCAqcmluZ19pZHgsIHVuc2lnbmVkIGludCAqZGV2X2lkeClcbit7XG4rXHR1bnNpZ25lZCBpbnQgaSwgajtcbitcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcbitcbitcdGxvY2tkZXBfYXNzZXJ0KGxvY2tkZXBfaXNfaGVsZChcdTAwMjZzd2Fwb25fcndzZW0pIHx8XG4rXHRcdCAgICAgICBsb2NrZGVwX2lzX2hlbGQoXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jaykpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc3dhcF9xdWV1ZV9sZW47IGkrKykge1xuK1x0XHRyaW5nID0gc3dhcF9xdWV1ZVtpXTtcbitcdFx0aWYgKHJpbmctXHUwMDNlcHJpbyAhPSBzaS1cdTAwM2VwcmlvKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyByaW5nLVx1MDAzZXNpemU7IGorKykge1xuK1x0XHRcdGlmIChzd2FwX2RldmljZV91bm1hc2tfcHRyKFJFQURfT05DRShyaW5nLVx1MDAzZWRldltqXSkpICE9IHNpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0KnJpbmdfaWR4ID0gaTtcbitcdFx0XHQqZGV2X2lkeCA9IGo7XG4rXHRcdFx0cmV0dXJuIHRydWU7XG4rXHRcdH1cbitcdH1cbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgc3dhcF9xdWV1ZV9tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbit7XG4rXHR1bnNpZ25lZCBpbnQgcmluZ19pZHgsIGRldl9pZHg7XG4rXG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1x0aWYgKHN3YXBfcXVldWVfZmluZChzaSwgXHUwMDI2cmluZ19pZHgsIFx1MDAyNmRldl9pZHgpKVxuK1x0XHRfX3NldF9iaXQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZULFxuK1x0XHRcdCAgKHVuc2lnbmVkIGxvbmcgKilcdTAwMjZzd2FwX3F1ZXVlW3JpbmdfaWR4XS1cdTAwM2VkZXZbZGV2X2lkeF0pO1xuK31cbitcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX3VubWFzayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4re1xuK1x0dW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4O1xuK1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcdGlmIChzd2FwX3F1ZXVlX2ZpbmQoc2ksIFx1MDAyNnJpbmdfaWR4LCBcdTAwMjZkZXZfaWR4KSlcbitcdFx0X19jbGVhcl9iaXQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZULFxuK1x0XHRcdCAgICAodW5zaWduZWQgbG9uZyAqKVx1MDAyNnN3YXBfcXVldWVbcmluZ19pZHhdLVx1MDAzZWRldltkZXZfaWR4XSk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuK3tcbitcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqKm5ld19xdWV1ZSA9IE5VTEwsICoqb2xkX3F1ZXVlID0gTlVMTDtcbitcdHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqbmV3X3JlYWRlcnMgPSBOVUxMO1xuK1x0c3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nLCAqbmV3X3JpbmcgPSBOVUxMLCAqb2xkX3JpbmcgPSBOVUxMO1xuK1x0aW50IHByaW8gPSBzaS1cdTAwM2VwcmlvO1xuK1x0aW50IGksIHBvcywgZXJyID0gLUVOT01FTTtcbitcdGdmcF90IGdmcDtcbitcbitcdC8qIFN3YXAgbm90IHVzYWJsZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyBzd2FwLCBqdXN0IHJlY2xhaW0gY2FjaGUuICovXG4rXHRnZnAgPSBHRlBfTk9JTyB8IF9fR0ZQX0hJR0g7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXG4rXHRmb3IgKHBvcyA9IDA7IHBvcyBcdTAwM2Mgc3dhcF9xdWV1ZV9sZW47IHBvcysrKSB7XG4rXHRcdGlmIChzd2FwX3F1ZXVlW3Bvc10tXHUwMDNlcHJpbyA9PSBwcmlvKVxuK1x0XHRcdGdvdG8gYWRkX3RvX3Jpbmc7XG4rXHRcdGlmIChzd2FwX3F1ZXVlW3Bvc10tXHUwMDNlcHJpbyBcdTAwM2MgcHJpbylcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdC8qIE5vIHJpbmcgYXQgdGhpcyBwcmlvcml0eTogaW5zZXJ0IGEgbmV3IG9uZSBhdCBwb3MuICovXG4rXHRuZXdfcmVhZGVycyA9IHN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhzd2FwX3F1ZXVlX2xlbiArIDEsIGdmcCk7XG4rXHRpZiAoIW5ld19yZWFkZXJzKVxuK1x0XHRnb3RvIGZhaWxlZDtcbitcdG5ld19xdWV1ZSA9IGttYWxsb2NfYXJyYXkoc3dhcF9xdWV1ZV9sZW4gKyAxLCBzaXplb2YoKnN3YXBfcXVldWUpLCBnZnApO1xuK1x0aWYgKCFuZXdfcXVldWUpXG4rXHRcdGdvdG8gZmFpbGVkO1xuK1x0bmV3X3JpbmcgPSBrbWFsbG9jKHN0cnVjdF9zaXplKG5ld19yaW5nLCBkZXYsIDEpLCBnZnApO1xuK1x0aWYgKCFuZXdfcmluZylcbitcdFx0Z290byBmYWlsZWQ7XG4rXHRpZiAoIWdldF9zd2FwX2RldmljZV9pbmZvKHNpKSlcbitcdFx0Z290byBmYWlsZWQ7XG4rXG4rXHRuZXdfcmluZy1cdTAwM2VwcmlvID0gcHJpbztcbitcdG5ld19yaW5nLVx1MDAzZXNpemUgPSAxO1xuK1x0bmV3X3JpbmctXHUwMDNlZGV2WzBdID0gc2k7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwb3M7IGkrKylcbitcdFx0bmV3X3F1ZXVlW2ldID0gc3dhcF9xdWV1ZVtpXTtcbitcdG5ld19xdWV1ZVtwb3NdID0gbmV3X3Jpbmc7XG4rXHRmb3IgKGkgPSBwb3M7IGkgXHUwMDNjIHN3YXBfcXVldWVfbGVuOyBpKyspXG4rXHRcdG5ld19xdWV1ZVtpICsgMV0gPSBzd2FwX3F1ZXVlW2ldO1xuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1x0b2xkX3F1ZXVlID0gc3dhcF9xdWV1ZTtcbitcdHN3YXBfcXVldWUgPSBuZXdfcXVldWU7XG4rXHRzd2FwX3F1ZXVlX2xlbisrO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4rXHRrZnJlZShvbGRfcXVldWUpO1xuK1xuK1x0c3dhcF9xdWV1ZV9pbnN0YWxsX3JlYWRlcnMobmV3X3JlYWRlcnMpO1xuK1x0cmV0dXJuIDA7XG4rXG4rYWRkX3RvX3Jpbmc6XG4rXHRyaW5nID0gc3dhcF9xdWV1ZVtwb3NdO1xuK1x0bmV3X3JpbmcgPSBrbWFsbG9jKHN0cnVjdF9zaXplKHJpbmcsIGRldiwgcmluZy1cdTAwM2VzaXplICsgMSksIGdmcCk7XG4rXHRpZiAoIW5ld19yaW5nKVxuK1x0XHRnb3RvIGZhaWxlZDtcbitcdGlmICghZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxuK1x0XHRnb3RvIGZhaWxlZDtcbitcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcdG1lbWNweShuZXdfcmluZywgcmluZywgc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLVx1MDAzZXNpemUpKTtcbitcdG5ld19yaW5nLVx1MDAzZXNpemUrKztcbitcdG5ld19yaW5nLVx1MDAzZWRldltuZXdfcmluZy1cdTAwM2VzaXplIC0gMV0gPSBzaTtcbitcdG9sZF9yaW5nID0gc3dhcF9xdWV1ZVtwb3NdO1xuK1x0c3dhcF9xdWV1ZVtwb3NdID0gbmV3X3Jpbmc7XG4rXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcdGtmcmVlKG9sZF9yaW5nKTtcbitcdHJldHVybiAwO1xuK1xuK2ZhaWxlZDpcbitcdGZyZWVfcGVyY3B1KG5ld19yZWFkZXJzKTtcbitcdGtmcmVlKG5ld19xdWV1ZSk7XG4rXHRrZnJlZShuZXdfcmluZyk7XG4rXHRyZXR1cm4gZXJyO1xuK31cbitcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2RlbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4re1xuK1x0Z2ZwX3QgZ2ZwO1xuK1x0dW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4O1xuK1x0c3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpuZXdfcmVhZGVycyA9IE5VTEw7XG4rXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmcsICpuZXdfcmluZyA9IE5VTEwsICpvbGRfcmluZyA9IE5VTEw7XG4rXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipuZXdfcXVldWUgPSBOVUxMLCAqKm9sZF9xdWV1ZSA9IE5VTEw7XG4rXG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRpZiAoIXN3YXBfcXVldWVfZmluZChzaSwgXHUwMDI2cmluZ19pZHgsIFx1MDAyNmRldl9pZHgpKSB7XG4rXHRcdFdBUk5fT04oMSk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBUbyBzaHJpbmsgbWVtb3J5IHVzYWdlLCBwcmUtYWxsb2NhdGUgbmV3IHNtYWxsZXIgZGF0YSBiZWZvcmVcbitcdCAqIGxvY2tpbmcuIEZhaWx1cmUgaXMgZmluZSwgc3dhcG9mZiB3aWxsIHJlbGVhc2UgdGhlbSBhbnl3YXkuXG4rXHQgKi9cbitcdGdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDtcbitcdHJpbmcgPSBzd2FwX3F1ZXVlW3JpbmdfaWR4XTtcbitcdGlmIChyaW5nLVx1MDAzZXNpemUgXHUwMDNlIDEpXG4rXHRcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXHUwMDNlc2l6ZSAtIDEpLCBnZnApO1xuK1x0aWYgKHJpbmctXHUwMDNlc2l6ZSA9PSAxIFx1MDAyNlx1MDAyNiBzd2FwX3F1ZXVlX2xlbiBcdTAwM2UgMSkge1xuK1x0XHRuZXdfcmVhZGVycyA9IHN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhcbitcdFx0XHRcdFx0c3dhcF9xdWV1ZV9sZW4gLSAxLCBnZnApO1xuK1x0XHRuZXdfcXVldWUgPSBrbWFsbG9jKHNpemVvZigqc3dhcF9xdWV1ZSkgKlxuK1x0XHRcdFx0ICAgIChzd2FwX3F1ZXVlX2xlbiAtIDEpLCBnZnApO1xuK1x0fVxuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1x0aWYgKHJpbmctXHUwMDNlc2l6ZSBcdTAwM2UgMSkge1xuK1x0XHQvKiBTaGlmdCB0cmFpbGluZyBkZXZpY2VzIGxlZnQgdG8gZmlsbCB0aGUgZ2FwLiAqL1xuK1x0XHR3aGlsZSAoKytkZXZfaWR4IFx1MDAzYyByaW5nLVx1MDAzZXNpemUpXG4rXHRcdFx0cmluZy1cdTAwM2VkZXZbZGV2X2lkeCAtIDFdID1cbitcdFx0XHRcdHJpbmctXHUwMDNlZGV2W2Rldl9pZHhdO1xuK1x0XHRyaW5nLVx1MDAzZXNpemUtLTtcbitcdFx0aWYgKG5ld19yaW5nKSB7XG4rXHRcdFx0bWVtY3B5KG5ld19yaW5nLCByaW5nLFxuK1x0XHRcdCAgICAgICBzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXHUwMDNlc2l6ZSkpO1xuK1x0XHRcdG9sZF9yaW5nID0gcmluZztcbitcdFx0XHRzd2FwX3F1ZXVlW3JpbmdfaWR4XSA9IG5ld19yaW5nO1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBMYXN0IGRldmljZSBpbiB0aGlzIHJpbmc6IHJlbW92ZSB0aGUgcmluZy4gKi9cbitcdFx0b2xkX3JpbmcgPSByaW5nO1xuK1x0XHRzd2FwX3F1ZXVlX2xlbi0tO1xuK1x0XHR3aGlsZSAoKytyaW5nX2lkeCBcdTAwM2M9IHN3YXBfcXVldWVfbGVuKVxuK1x0XHRcdHN3YXBfcXVldWVbcmluZ19pZHggLSAxXSA9XG4rXHRcdFx0XHRzd2FwX3F1ZXVlW3JpbmdfaWR4XTtcbitcdFx0aWYgKG5ld19xdWV1ZSkge1xuK1x0XHRcdG1lbWNweShuZXdfcXVldWUsIHN3YXBfcXVldWUsXG4rXHRcdFx0ICAgICAgIHNpemVvZigqc3dhcF9xdWV1ZSkgKiBzd2FwX3F1ZXVlX2xlbik7XG4rXHRcdFx0b2xkX3F1ZXVlID0gc3dhcF9xdWV1ZTtcbitcdFx0XHRzd2FwX3F1ZXVlID0gbmV3X3F1ZXVlO1xuK1x0XHR9IGVsc2UgaWYgKCFzd2FwX3F1ZXVlX2xlbikge1xuK1x0XHRcdG9sZF9xdWV1ZSA9IHN3YXBfcXVldWU7XG4rXHRcdFx0c3dhcF9xdWV1ZSA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKG5ld19yZWFkZXJzIHx8ICFzd2FwX3F1ZXVlX2xlbilcbitcdFx0XHRzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhuZXdfcmVhZGVycyk7XG4rXHR9XG4rXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcbitcdGtmcmVlKG9sZF9yaW5nKTtcbitcdGtmcmVlKG9sZF9xdWV1ZSk7XG4rXHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuK31cbitcbiAvKlxuICAqIFVzZSB0aGUgc2Vjb25kIGhpZ2hlc3QgYml0IG9mIGludXNlX3BhZ2VzIGNvdW50ZXIgYXMgdGhlIGluZGljYXRvclxuLSAqIGlmIG9uZSBzd2FwIGRldmljZSBpcyBvbiB0aGUgYXZhaWxhYmxlIHBsaXN0LCBzbyB0aGUgYXRvbWljIGNhblxuKyAqIGlmIG9uZSBzd2FwIGRldmljZSBpcyB1bmF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiwgc28gdGhlIGF0b21pYyBjYW5cbiAgKiBzdGlsbCBiZSB1cGRhdGVkIGFyaXRobWV0aWNhbGx5IHdoaWxlIGhhdmluZyBzcGVjaWFsIGRhdGEgZW1iZWRkZWQuXG4gICpcbiAgKiBpbnVzZV9wYWdlcyBjb3VudGVyIGlzIHRoZSBvbmx5IHRoaW5nIGluZGljYXRpbmcgaWYgYSBkZXZpY2Ugc2hvdWxkXG4tICogYmUgb24gYXZhaWxfbGlzdHMgb3Igbm90IChleGNlcHQgc3dhcG9uIC8gc3dhcG9mZikuIEJ5IGVtYmVkZGluZyB0aGVcbi0gKiBvZmYtbGlzdCBiaXQgaW4gdGhlIGF0b21pYyBjb3VudGVyLCB1cGRhdGVzIG5vIGxvbmdlciBuZWVkIGFueSBsb2NrXG4tICogdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxuKyAqIGJlIGluIHRoZSBhdmFpbGFibGUgcXVldWUgb3Igbm90IChleGNlcHQgc3dhcG9uIC8gc3dhcG9mZikuIEJ5XG4rICogZW1iZWRkaW5nIHRoZSBvZmYtbGlzdCBiaXQgaW4gdGhlIGF0b21pYyBjb3VudGVyLCB1cGRhdGVzIG5vIGxvbmdlclxuKyAqIG5lZWQgYW55IGxvY2sgdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxuICAqXG4tICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3Qgb24gdGhlIHBsaXN0IGFuZCBub3Rcbi0gKiB1c2FibGUsIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGUgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdC5cbisgKiBUaGlzIGJpdCB3aWxsIGJlIHNldCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBpbiB0aGUgYXZhaWxhYmxlIHF1ZXVlXG4rICogYW5kIG5vdCB1c2FibGUsIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBxdWV1ZS5cbiAgKi9cbiAjZGVmaW5lIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgKDFVTCBcdTAwM2NcdTAwM2MgKEJJVFNfUEVSX1RZUEUoYXRvbWljX3QpIC0gMikpXG4gI2RlZmluZSBTV0FQX1VTQUdFX0NPVU5URVJfTUFTSyAoflNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpXG5AQCAtMTYzLDYgKzQ5MSwyNiBAQCBzdGF0aWMgbG9uZyBzd2FwX3VzYWdlX2luX3BhZ2VzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdHJldHVybiBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKSBcdTAwMjYgU1dBUF9VU0FHRV9DT1VOVEVSX01BU0s7XG4gfVxuIFxuKy8qXG4rICogU2VyaWFsaXplIHRoZSBhbGxvY2F0aW9uIG9uIHNpbmdsZSBDUFUgb3IgZ2xvYmFsbHkgdG8gYXZvaWRcbisgKiBmcmFnbWVudGF0aW9uIGFuZCBtYWtlIHRoZSB3b3JrZmxvdyBlYXNpZXIgdG8gZm9sbG93LlxuKyAqL1xuK3N0YXRpYyB2b2lkIHN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuK3tcbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpXG4rXHRcdGxvY2FsX2xvY2soXHUwMDI2c2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbG9jayk7XG4rXHRlbHNlXG4rXHRcdHNwaW5fbG9jayhcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlci1cdTAwM2Vsb2NrKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbit7XG4rXHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuK1x0XHRsb2NhbF91bmxvY2soXHUwMDI2c2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbG9jayk7XG4rXHRlbHNlXG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZWxvY2spO1xuK31cbitcbiAvKiBSZWNsYWltIHRoZSBzd2FwIGVudHJ5IGFueXdheSBpZiBwb3NzaWJsZSAqL1xuICNkZWZpbmUgVFRSU19BTllXQVlcdFx0MHgxXG4gLypcbkBAIC01MzMsOSArODgxLDEwIEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHQgKiBPbmx5IGNsdXN0ZXIgaXNvbGF0aW9uIGZyb20gdGhlIGFsbG9jYXRvciBkb2VzIHRhYmxlIGFsbG9jYXRpb24uXG4gXHQgKiBTd2FwIGFsbG9jYXRvciB1c2VzIHBlcmNwdSBjbHVzdGVycyBhbmQgaG9sZHMgdGhlIGxvY2FsIGxvY2suXG4gXHQgKi9cbi1cdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2dGhpc19jcHVfcHRyKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIpLVx1MDAzZWxvY2spO1xuLVx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbi1cdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpXG4rXHRcdGxvY2tkZXBfYXNzZXJ0X2hlbGQodGhpc19jcHVfcHRyKFx1MDAyNnNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyLVx1MDAzZWxvY2spKTtcbitcdGVsc2VcbitcdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlci1cdTAwM2Vsb2NrKTtcbiBcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXG4gXHRpZiAoIXN3YXBfY2x1c3Rlcl9hbGxvY190YWJsZShjaSwgX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfFxuQEAgLTU0OCw5ICs4OTcsNyBAQCBzd2FwX2NsdXN0ZXJfcG9wdWxhdGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0ICogdGhlIHBvdGVudGlhbCByZWN1cnNpdmUgYWxsb2NhdGlvbiBpcyBsaW1pdGVkLlxuIFx0ICovXG4gXHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4rXHRzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc2kpO1xuIFxuIFx0cmV0ID0gc3dhcF9jbHVzdGVyX2FsbG9jX3RhYmxlKGNpLCBfX0dGUF9ISUdIIHwgX19HRlBfTk9NRU1BTExPQyB8XG4gXHRcdFx0XHRcdCAgIEdGUF9LRVJORUwpO1xuQEAgLTU2Myw5ICs5MTAsNyBAQCBzd2FwX2NsdXN0ZXJfcG9wdWxhdGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0ICogY291bGQgaGFwcGVuIHdpdGggaWdub3JpbmcgdGhlIHBlcmNwdSBjbHVzdGVyIGlzIGZyYWdtZW50YXRpb24sXG4gXHQgKiB3aGljaCBpcyBhY2NlcHRhYmxlIHNpbmNlIHRoaXMgZmFsbGJhY2sgYW5kIHJhY2UgaXMgcmFyZS5cbiBcdCAqL1xuLVx0bG9jYWxfbG9jayhcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spO1xuLVx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuK1x0c3dhcF9hbGxvY19sb2NrX2RldmljZShzaSk7XG4gXHRzcGluX2xvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXG4gXHRpZiAocmV0KSB7XG5AQCAtNjcxLDcgKzEwMTYsNyBAQCBzdGF0aWMgYm9vbCBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdFx0Y2kgPSBsaXN0X2ZpcnN0X2VudHJ5KFx1MDAyNnNpLVx1MDAzZWRpc2NhcmRfY2x1c3RlcnMsIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbywgbGlzdCk7XG4gXHRcdC8qXG4gXHRcdCAqIERlbGV0ZSB0aGUgY2x1c3RlciBmcm9tIGxpc3QgdG8gcHJlcGFyZSBmb3IgZGlzY2FyZCwgYnV0IGtlZXBcbi1cdFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHBlcmNwdV9zd2FwX2NsdXN0ZXIgY291bGQgYmVcbitcdFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHRoZXJlIGNvdWxkIGJlIHBlcmNwdV9jbHVzdGVyXG4gXHRcdCAqIHBvaW50aW5nIHRvIGl0LCBvciByYW4gaW50byBieSByZWxvY2F0ZV9jbHVzdGVyLlxuIFx0XHQgKi9cbiBcdFx0bGlzdF9kZWwoXHUwMDI2Y2ktXHUwMDNlbGlzdCk7XG5AQCAtOTU1LDcgKzEzMDAsNyBAQCBzdGF0aWMgYm9vbCBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdGlmIChjbHVzdGVyX2lzX2VtcHR5KGNpKSlcbiBcdFx0Y2ktXHUwMDNlb3JkZXIgPSBvcmRlcjtcbiBcdGNpLVx1MDAzZWNvdW50ICs9IG5yX3BhZ2VzO1xuLVx0c3dhcF9yYW5nZV9hbGxvYyhzaSwgbnJfcGFnZXMpO1xuK1x0c3dhcF9kZXZpY2VfaW51c2VfYWRkKHNpLCBucl9wYWdlcyk7XG4gXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG5AQCAtMTAwMywxMiArMTM0OCwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBvdXQ6XG4gXHRyZWxvY2F0ZV9jbHVzdGVyKHNpLCBjaSk7XG4gXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpIHtcbi1cdFx0dGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5vZmZzZXRbb3JkZXJdLCBuZXh0KTtcbi1cdFx0dGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0sIHNpKTtcbi1cdH0gZWxzZSB7XG4rXHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuK1x0XHR0aGlzX2NwdV93cml0ZShzaS1cdTAwM2VwZXJjcHVfY2x1c3Rlci1cdTAwM2VuZXh0W29yZGVyXSwgbmV4dCk7XG4rXHRlbHNlXG4gXHRcdHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZW5leHRbb3JkZXJdID0gbmV4dDtcbi1cdH1cbiBcdHJldHVybiBmb3VuZDtcbiB9XG4gXG5AQCAtMTEwMywxMyArMTQ0NiwxNCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiAhKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfQkxLREVWKSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4tXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKSB7XG4tXHRcdC8qIFNlcmlhbGl6ZSBIREQgU1dBUCBhbGxvY2F0aW9uIGZvciBlYWNoIGRldmljZS4gKi9cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuK3Jlc3RhcnQ6XG4rXHRzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHNpKTtcbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpXG4rXHRcdG9mZnNldCA9IF9fdGhpc19jcHVfcmVhZChzaS1cdTAwM2VwZXJjcHVfY2x1c3Rlci1cdTAwM2VuZXh0W29yZGVyXSk7XG4rXHRlbHNlXG4gXHRcdG9mZnNldCA9IHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZW5leHRbb3JkZXJdO1xuLVx0XHRpZiAob2Zmc2V0ID09IFNXQVBfRU5UUllfSU5WQUxJRClcbi1cdFx0XHRnb3RvIG5ld19jbHVzdGVyO1xuIFxuK1x0aWYgKG9mZnNldCAhPSBTV0FQX0VOVFJZX0lOVkFMSUQpIHtcbiBcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfbG9jayhzaSwgb2Zmc2V0KTtcbiBcdFx0LyogQ2x1c3RlciBjb3VsZCBoYXZlIGJlZW4gdXNlZCBieSBhbm90aGVyIG9yZGVyICovXG4gXHRcdGlmIChjbHVzdGVyX2lzX3VzYWJsZShjaSwgb3JkZXIpKSB7XG5AQCAtMTEyMyw3ICsxNDY3LDYgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHRnb3RvIGRvbmU7XG4gXHR9XG4gXG4tbmV3X2NsdXN0ZXI6XG4gXHQvKlxuIFx0ICogSWYgdGhlIGRldmljZSBuZWVkIGRpc2NhcmQsIHByZWZlciBuZXcgY2x1c3RlciBvdmVyIG5vbmZ1bGxcbiBcdCAqIHRvIHNwcmVhZCBvdXQgdGhlIHdyaXRlcy5cbkBAIC0xMTMyLDYgKzE0NzUsMTIgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0Zm91bmQgPSBhbGxvY19zd2FwX3NjYW5fbGlzdChzaSwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycywgZm9saW8sIGZhbHNlKTtcbiBcdFx0aWYgKGZvdW5kKVxuIFx0XHRcdGdvdG8gZG9uZTtcbitcbitcdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNnNpLVx1MDAzZWRpc2NhcmRfY2x1c3RlcnMpKSB7XG4rXHRcdFx0c3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTtcbitcdFx0XHRzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTtcbitcdFx0XHRnb3RvIHJlc3RhcnQ7XG4rXHRcdH1cbiBcdH1cbiBcbiBcdGlmIChvcmRlciBcdTAwM2MgUE1EX09SREVSKSB7XG5AQCAtMTE4MCw4ICsxNTI5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHRnb3RvIGRvbmU7XG4gXHR9XG4gZG9uZTpcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuK1x0c3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTtcbiBcbiBcdHJldHVybiBmb3VuZDtcbiB9XG5AQCAtMTE5MSw1NCArMTUzOSw0NCBAQCBzdGF0aWMgdm9pZCBkZWxfZnJvbV9hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb2ZmKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgcGFnZXM7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbitcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiBcbi1cdGlmIChzd2Fwb2ZmKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZvcmNlZnVsbHkgcmVtb3ZlIGl0LiBDbGVhciB0aGUgU1dQX1dSSVRFT0sgZmxhZ3MgZm9yXG4tXHRcdCAqIHN3YXBvZmYgaGVyZSBzbyBpdCdzIHN5bmNocm9uaXplZCBieSBib3RoIHNpLVx1MDAzZWxvY2sgYW5kXG4tXHRcdCAqIHN3YXBfYXZhaWxfbG9jaywgdG8gZW5zdXJlIHRoZSByZXN1bHQgY2FuIGJlIHNlZW4gYnlcbi1cdFx0ICogYWRkX3RvX2F2YWlsX2xpc3QuXG4tXHRcdCAqL1xuLVx0XHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuLVx0XHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfV1JJVEVPSztcbi1cdFx0YXRvbWljX2xvbmdfb3IoU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgXHUwMDI2c2ktXHUwMDNlaW51c2VfcGFnZXMpO1xuLVx0fSBlbHNlIHtcbi1cdFx0Lypcbi1cdFx0ICogSWYgbm90IGNhbGxlZCBieSBzd2Fwb2ZmLCB0YWtlIGl0IG9mZi1saXN0IG9ubHkgaWYgaXQnc1xuLVx0XHQgKiBmdWxsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQgKHN0cmljdGx5XG4tXHRcdCAqIHNpLVx1MDAzZWludXNlX3BhZ2VzID09IHBhZ2VzKSwgYW55IGNvbmN1cnJlbnQgc2xvdCBmcmVlaW5nLFxuLVx0XHQgKiBvciBkZXZpY2UgYWxyZWFkeSByZW1vdmVkIGZyb20gcGxpc3QgYnkgc29tZW9uZSBlbHNlXG4tXHRcdCAqIHdpbGwgbWFrZSB0aGlzIHJldHVybiBmYWxzZS5cbi1cdFx0ICovXG4rXHQvKlxuK1x0ICogRm9yY2UgcmVtb3ZlIGl0IG9ubHkgZm9yIHN3YXBvZmYuIEVsc2UsIHRha2UgaXQgb2ZmLWxpc3Qgb25seSBpZlxuK1x0ICogaXQncyBmdWxsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQgKHN0cmljdGx5XG4rXHQgKiBzaS1cdTAwM2VpbnVzZV9wYWdlcyA9PSBwYWdlcyksIHNvIGNvbmN1cnJlbnQgc2xvdCBmcmVlaW5nLCBvclxuK1x0ICogY29uY3VycmVudCBsaXN0IHJlbW92YWwgd2lsbCBtYWtlIHRoZSBjbXB4Y2hnIGZhaWwgYW5kIHNraXBcbitcdCAqIHRoZSByZW1vdmFsLlxuK1x0ICovXG4rXHRpZiAoIXN3YXBvZmYpIHtcbiBcdFx0cGFnZXMgPSBzaS1cdTAwM2VwYWdlcztcbiBcdFx0aWYgKCFhdG9taWNfbG9uZ190cnlfY21weGNoZyhcdTAwMjZzaS1cdTAwM2VpbnVzZV9wYWdlcywgXHUwMDI2cGFnZXMsXG4gXHRcdFx0XHRcdCAgICAgcGFnZXMgfCBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSlcbiBcdFx0XHRnb3RvIHNraXA7XG4rXHR9IGVsc2Uge1xuK1x0XHRhdG9taWNfbG9uZ19vcihTV0FQX1VTQUdFX09GRkxJU1RfQklULCBcdTAwMjZzaS1cdTAwM2VpbnVzZV9wYWdlcyk7XG4gXHR9XG4gXG4tXHRwbGlzdF9kZWwoXHUwMDI2c2ktXHUwMDNlYXZhaWxfbGlzdCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcbi1cbitcdHN3YXBfcXVldWVfbWFzayhzaSk7XG4gc2tpcDpcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiB9XG4gXG4gLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHRoaXMgaGVscGVyLiAqL1xuLXN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pXG4rc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIHtcbiBcdGxvbmcgdmFsO1xuIFx0dW5zaWduZWQgbG9uZyBwYWdlcztcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuIFxuLVx0LyogQ29ycmVzcG9uZGluZyB0byBTV1BfV1JJVEVPSyBjbGVhcmluZyBpbiBkZWxfZnJvbV9hdmFpbF9saXN0ICovXG4tXHRpZiAoc3dhcG9uKSB7XG4tXHRcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4tXHRcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9XUklURU9LO1xuLVx0fSBlbHNlIHtcbi1cdFx0aWYgKCEoUkVBRF9PTkNFKHNpLVx1MDAzZWZsYWdzKSBcdTAwMjYgU1dQX1dSSVRFT0spKVxuLVx0XHRcdGdvdG8gc2tpcDtcbi1cdH1cbitcdC8qXG4rXHQgKiBNYXJrIHRoZSBkZXZpY2UgYXMgYXZhaWwgaWYgU1dQX1dSSVRFT0sgaXMgc2V0LiBTd2Fwb2ZmIGNsZWFyc1xuK1x0ICogU1dQX1dSSVRFT0sgZmlyc3QsIHNvIGNoZWNrIHRoYXQgZmlyc3Qgc28gdGhlIGRldmljZSB3b24ndCBiZVxuK1x0ICogcmUtYWRkZWQgYWZ0ZXIgc3dhcG9mZiBzdGFydGVkLlxuK1x0ICovXG4rXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spKVxuK1x0XHRnb3RvIHNraXA7XG4gXG4gXHRpZiAoIShhdG9taWNfbG9uZ19yZWFkKFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKSBcdTAwMjYgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCkpXG4gXHRcdGdvdG8gc2tpcDtcbkBAIC0xMjQ2LDkgKzE1ODQsMTAgQEAgc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbilcbiBcdHZhbCA9IGF0b21pY19sb25nX2ZldGNoX2FuZF9yZWxheGVkKH5TV0FQX1VTQUdFX09GRkxJU1RfQklULCBcdTAwMjZzaS1cdTAwM2VpbnVzZV9wYWdlcyk7XG4gXG4gXHQvKlxuLVx0ICogV2hlbiBkZXZpY2UgaXMgZnVsbCBhbmQgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdCwgb25seSBvbmUgdXBkYXRlciB3aWxsXG4tXHQgKiBzZWUgKGludXNlX3BhZ2VzID09IHNpLVx1MDAzZXBhZ2VzKSBhbmQgd2lsbCBjYWxsIGRlbF9mcm9tX2F2YWlsX2xpc3QuIElmXG4tXHQgKiB0aGF0IHVwZGF0ZXIgaGFwcGVuIHRvIGJlIGhlcmUsIGp1c3Qgc2tpcCBhZGRpbmcuXG4rXHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBtYXJrZWQgYXMgYXZhaWxhYmxlLCBvbmUgcmVhZGVyIHdpbGwgc2VlXG4rXHQgKiAoaW51c2VfcGFnZXMgPT0gc2ktXHUwMDNlcGFnZXMpIGFuZCBzaG91bGQgbWFyayBpdCBhcyB1bmF2YWlsYWJsZSBhbmRcbitcdCAqIHNldCBTV0FQX1VTQUdFX09GRkxJU1RfQklULiBJZiB0aGF0IHVwZGF0ZXIgaGFwcGVucyB0byBiZSBoZXJlLCBqdXN0XG4rXHQgKiBza2lwIHRoZSByZXN0LlxuIFx0ICovXG4gXHRwYWdlcyA9IHNpLVx1MDAzZXBhZ2VzO1xuIFx0aWYgKHZhbCA9PSBwYWdlcykge1xuQEAgLTEyNTgsNjAgKzE1OTcsNDIgQEAgc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbilcbiBcdFx0XHRnb3RvIHNraXA7XG4gXHR9XG4gXG4tXHRwbGlzdF9hZGQoXHUwMDI2c2ktXHUwMDNlYXZhaWxfbGlzdCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcbi1cbitcdHN3YXBfcXVldWVfdW5tYXNrKHNpKTtcbiBza2lwOlxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuIH1cbiBcbiAvKlxuLSAqIHN3YXBfdXNhZ2VfYWRkIC8gc3dhcF91c2FnZV9zdWIgb2YgZWFjaCBzbG90IGFyZSBzZXJpYWxpemVkIGJ5IGNpLVx1MDAzZWxvY2tcbi0gKiB3aXRoaW4gZWFjaCBjbHVzdGVyLCBzbyB0aGUgdG90YWwgY29udHJpYnV0aW9uIHRvIHRoZSBnbG9iYWwgY291bnRlciBzaG91bGRcbi0gKiBhbHdheXMgYmUgcG9zaXRpdmUgYW5kIGNhbm5vdCBleGNlZWQgdGhlIHRvdGFsIG51bWJlciBvZiB1c2FibGUgc2xvdHMuXG4rICogc3dhcF9kZXZpY2VfaW51c2VfYWRkIC8gc3dhcF9kZXZpY2VfaW51c2Vfc3ViIGFyZSBjYWxsZWQgd2l0aGluIGNsdXN0ZXJcbisgKiB1cGRhdGUgY3JpdGljYWwgc2VjdGlvbnMgYW5kIHNlcmlhbGl6ZWQgYnkgY2ktXHUwMDNlbG9jayB3aXRoaW4gZWFjaCBjbHVzdGVyLFxuKyAqIHNvIHRoZSB0b3RhbCBjb250cmlidXRpb24gdG8gdGhlIGdsb2JhbCBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmVcbisgKiBhbmQgY2Fubm90IGV4Y2VlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHVzYWJsZSBzbG90cy5cbiAgKi9cbi1zdGF0aWMgYm9vbCBzd2FwX3VzYWdlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuK3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2ludXNlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuIHtcbi1cdGxvbmcgdmFsID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbitcdGxvbmcgaW51c2VfcGFnZXM7XG4gXG4gXHQvKlxuIFx0ICogSWYgZGV2aWNlIGlzIGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQsXG4tXHQgKiByZW1vdmUgaXQgZnJvbSB0aGUgcGxpc3QuXG4tXHQgKi9cbi1cdGlmICh1bmxpa2VseSh2YWwgPT0gc2ktXHUwMDNlcGFnZXMpKSB7XG4tXHRcdGRlbF9mcm9tX2F2YWlsX2xpc3Qoc2ksIGZhbHNlKTtcbi1cdFx0cmV0dXJuIHRydWU7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHN3YXBfdXNhZ2Vfc3ViKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4te1xuLVx0bG9uZyB2YWwgPSBhdG9taWNfbG9uZ19zdWJfcmV0dXJuX3JlbGF4ZWQobnJfZW50cmllcywgXHUwMDI2c2ktXHUwMDNlaW51c2VfcGFnZXMpO1xuLVxuLVx0Lypcbi1cdCAqIElmIGRldmljZSBpcyBub3QgZnVsbCwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgc2V0LFxuLVx0ICogYWRkIGl0IHRvIHRoZSBwbGlzdC5cbitcdCAqIG1hcmsgaXQgdW5hdmFpbGFibGUuXG4gXHQgKi9cbi1cdGlmICh1bmxpa2VseSh2YWwgXHUwMDI2IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxuLVx0XHRhZGRfdG9fYXZhaWxfbGlzdChzaSwgZmFsc2UpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2FsbG9jKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi1cdFx0XHQgICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuLXtcbi1cdGlmIChzd2FwX3VzYWdlX2FkZChzaSwgbnJfZW50cmllcykpIHtcbitcdGludXNlX3BhZ2VzID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbitcdGlmICh1bmxpa2VseShpbnVzZV9wYWdlcyA9PSBzaS1cdTAwM2VwYWdlcykpIHtcbiBcdFx0aWYgKHZtX3N3YXBfZnVsbCgpKVxuIFx0XHRcdHNjaGVkdWxlX3dvcmsoXHUwMDI2c2ktXHUwMDNlcmVjbGFpbV93b3JrKTtcbitcdFx0ZGVsX2Zyb21fYXZhaWxfbGlzdChzaSwgZmFsc2UpO1xuIFx0fVxuK1xuIFx0YXRvbWljX2xvbmdfc3ViKG5yX2VudHJpZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcbi1cdFx0XHQgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4rc3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2Vfc3ViKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgZW5kID0gb2Zmc2V0ICsgbnJfZW50cmllcyAtIDE7XG4gXHR2b2lkICgqc3dhcF9zbG90X2ZyZWVfbm90aWZ5KShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpO1xuK1x0bG9uZyBpbnVzZV9wYWdlcztcbiBcdHVuc2lnbmVkIGludCBpO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfZW50cmllczsgaSsrKVxuQEAgLTEzMzUsNyArMTY1NiwxNCBAQCBzdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcbiBcdCAqL1xuIFx0c21wX3dtYigpO1xuIFx0YXRvbWljX2xvbmdfYWRkKG5yX2VudHJpZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuLVx0c3dhcF91c2FnZV9zdWIoc2ksIG5yX2VudHJpZXMpO1xuK1xuK1x0LypcbitcdCAqIElmIGRldmljZSBpcyBub3QgZnVsbCwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgc2V0LFxuK1x0ICogYWRkIGl0IGJhY2sgdG8gdGhlIGF2YWlsYWJsZSBxdWV1ZS5cbitcdCAqL1xuK1x0aW51c2VfcGFnZXMgPSBhdG9taWNfbG9uZ19zdWJfcmV0dXJuX3JlbGF4ZWQobnJfZW50cmllcywgXHUwMDI2c2ktXHUwMDNlaW51c2VfcGFnZXMpO1xuK1x0aWYgKHVubGlrZWx5KGludXNlX3BhZ2VzIFx1MDAyNiBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSlcbitcdFx0YWRkX3RvX2F2YWlsX2xpc3Qoc2kpO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5AQCAtMTM0NSwxMTMgKzE2NzMsNDkgQEAgc3RhdGljIGJvb2wgZ2V0X3N3YXBfZGV2aWNlX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIFx0LypcbiBcdCAqIEd1YXJhbnRlZSB0aGUgc2ktXHUwMDNldXNlcnMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyBvdGhlclxuIFx0ICogZmllbGRzIG9mIHN3YXBfaW5mb19zdHJ1Y3QsIGFuZCBzaS1cdTAwM2VmbGFncyAoU1dQX1dSSVRFT0spIGlzXG4tXHQgKiB1cCB0byBkYXRlZC5cbitcdCAqIHVwIHRvIGRhdGUuXG4gXHQgKlxuLVx0ICogUGFpcmVkIHdpdGggdGhlIHNwaW5fdW5sb2NrKCkgYWZ0ZXIgc2V0dXBfc3dhcF9pbmZvKCkgaW5cbi1cdCAqIGVuYWJsZV9zd2FwX2luZm8oKSwgYW5kIHNtcF93bWIoKSBpbiBzd2Fwb2ZmLlxuK1x0ICogUGFpcmVkIHdpdGggcGVyY3B1X3VwX3dyaXRlKCkgaW4gc3dhcF9kZXZpY2VfZW5hYmxlKCksIGFuZFxuK1x0ICogc21wX3dtYigpIGFmdGVyIGNsZWFyaW5nIFNXUF9XUklURU9LIGluIHN3YXBvZmYuXG4gXHQgKi9cbiBcdHNtcF9ybWIoKTtcbiBcdHJldHVybiB0cnVlO1xuIH1cbiBcbi0vKlxuLSAqIEZhc3QgcGF0aCB0cnkgdG8gZ2V0IHN3YXAgZW50cmllcyB3aXRoIHNwZWNpZmllZCBvcmRlciBmcm9tIGN1cnJlbnRcbi0gKiBDUFUncyBzd2FwIGVudHJ5IHBvb2wgKGEgY2x1c3RlcikuXG4tICovXG4tc3RhdGljIGJvb2wgc3dhcF9hbGxvY19mYXN0KHN0cnVjdCBmb2xpbyAqZm9saW8pXG4rc3RhdGljIGludCBzd2FwX2FsbG9jX2VudHJ5KHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0dW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuLVx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbitcdGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4tXHR1bnNpZ25lZCBpbnQgb2Zmc2V0O1xuLVxuLVx0Lypcbi1cdCAqIE9uY2UgYWxsb2NhdGVkLCBzd2FwX2luZm9fc3RydWN0IHdpbGwgbmV2ZXIgYmUgY29tcGxldGVseSBmcmVlZCxcbi1cdCAqIHNvIGNoZWNraW5nIGl0J3MgbGl2ZW5lc3MgYnkgZ2V0X3N3YXBfZGV2aWNlX2luZm8gaXMgZW5vdWdoLlxuLVx0ICovXG4tXHRzaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0pO1xuLVx0b2Zmc2V0ID0gdGhpc19jcHVfcmVhZChwZXJjcHVfc3dhcF9jbHVzdGVyLm9mZnNldFtvcmRlcl0pO1xuLVx0aWYgKCFzaSB8fCAhb2Zmc2V0IHx8ICFnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XG4tXHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIG9yZGVyKSkge1xuLVx0XHRpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpXG4tXHRcdFx0b2Zmc2V0ID0gY2x1c3Rlcl9vZmZzZXQoc2ksIGNpKTtcbi1cdFx0YWxsb2Nfc3dhcF9zY2FuX2NsdXN0ZXIoc2ksIGNpLCBmb2xpbywgb2Zmc2V0KTtcbi1cdH0gZWxzZSB7XG4tXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0fVxuK1x0aW50IG5yX2l0ZXIsIHJldDtcbitcbitcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdGZvciAobnJfaXRlciA9IDA7OyBucl9pdGVyKyspIHtcbitcdFx0c2kgPSBzd2FwX3F1ZXVlX2dldF9kZXZpY2UobnJfcGFnZXMsIG5yX2l0ZXIpO1xuK1x0XHRpZiAoSVNfRVJSKHNpKSkge1xuK1x0XHRcdHJldCA9IFBUUl9FUlIoc2kpO1xuK1x0XHRcdGlmIChyZXQgPT0gLUVCVVNZKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdFx0Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBmb2xpbyk7XG4gXG4tXHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuLVx0cmV0dXJuIGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbi19XG4tXG4tLyogUm90YXRlIHRoZSBkZXZpY2UgYW5kIHN3aXRjaCB0byBhIG5ldyBjbHVzdGVyICovXG4tc3RhdGljIHZvaWQgc3dhcF9hbGxvY19zbG93KHN0cnVjdCBmb2xpbyAqZm9saW8pXG4te1xuLVx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCAqbmV4dDtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuLXN0YXJ0X292ZXI6XG4tXHRwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNpLCBuZXh0LCBcdTAwMjZzd2FwX2F2YWlsX2hlYWQsIGF2YWlsX2xpc3QpIHtcbi1cdFx0LyogUm90YXRlIHRoZSBkZXZpY2UgYW5kIHN3aXRjaCB0byBhIG5ldyBjbHVzdGVyICovXG4tXHRcdHBsaXN0X3JlcXVldWUoXHUwMDI2c2ktXHUwMDNlYXZhaWxfbGlzdCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbi1cdFx0aWYgKGdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkge1xuLVx0XHRcdGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzaSwgZm9saW8pO1xuLVx0XHRcdHB1dF9zd2FwX2RldmljZShzaSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbi1cdFx0XHRcdHJldHVybjtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4tXHRcdFx0XHRyZXR1cm47XG4rXHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbitcdFx0XHRyZXQgPSAwO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuIFx0XHQvKlxuLVx0XHQgKiBpZiB3ZSBnb3QgaGVyZSwgaXQncyBsaWtlbHkgdGhhdCBzaSB3YXMgYWxtb3N0IGZ1bGwgYmVmb3JlLFxuLVx0XHQgKiBtdWx0aXBsZSBjYWxsZXJzIHByb2JhYmx5IGFsbCB0cmllZCB0byBnZXQgYSBwYWdlIGZyb20gdGhlXG4tXHRcdCAqIHNhbWUgc2kgYW5kIGl0IGZpbGxlZCB1cCBiZWZvcmUgd2UgY291bGQgZ2V0IG9uZTsgb3IsIHRoZSBzaVxuLVx0XHQgKiBmaWxsZWQgdXAgYmV0d2VlbiB1cyBkcm9wcGluZyBzd2FwX2F2YWlsX2xvY2suXG4tXHRcdCAqIFNpbmNlIHdlIGRyb3BwZWQgdGhlIHN3YXBfYXZhaWxfbG9jaywgdGhlIHN3YXBfYXZhaWxfbGlzdFxuLVx0XHQgKiBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkOyBzbyBpZiBuZXh0IGlzIHN0aWxsIGluIHRoZVxuLVx0XHQgKiBzd2FwX2F2YWlsX2hlYWQgbGlzdCB0aGVuIHRyeSBpdCwgb3RoZXJ3aXNlIHN0YXJ0IG92ZXIgaWYgd2Vcbi1cdFx0ICogaGF2ZSBub3QgZ290dGVuIGFueSBzbG90cy5cbitcdFx0ICogRm9yIGxhcmdlIGFsbG9jYXRpb24sIHJldHVybiBlcnJvciBkaXJlY3RseSB0byBpbmZvcm0gdGhlXG4rXHRcdCAqIGNhbGxlciB0byBzcGxpdCBpdCBpbnN0ZWFkIG9mIGZhbGxiYWNrIHRvIG90aGVyIGRldmljZXMuXG4gXHRcdCAqL1xuLVx0XHRpZiAocGxpc3Rfbm9kZV9lbXB0eShcdTAwMjZuZXh0LVx1MDAzZWF2YWlsX2xpc3QpKVxuLVx0XHRcdGdvdG8gc3RhcnRfb3Zlcjtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4tfVxuLVxuLS8qXG4tICogRGlzY2FyZCBwZW5kaW5nIGNsdXN0ZXJzIGluIGEgc3luY2hyb25pemVkIHdheSB3aGVuIHVuZGVyIGhpZ2ggcHJlc3N1cmUuXG4tICogUmV0dXJuOiB0cnVlIGlmIGFueSBjbHVzdGVyIGlzIGRpc2NhcmRlZC5cbi0gKi9cbi1zdGF0aWMgYm9vbCBzd2FwX3N5bmNfZGlzY2FyZCh2b2lkKVxuLXtcbi1cdGJvb2wgcmV0ID0gZmFsc2U7XG4tXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksICpuZXh0O1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tc3RhcnRfb3Zlcjpcbi1cdHBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2ksIG5leHQsIFx1MDAyNnN3YXBfYWN0aXZlX2hlYWQsIGxpc3QpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0aWYgKGdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkge1xuLVx0XHRcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1BBR0VfRElTQ0FSRClcbi1cdFx0XHRcdHJldCA9IHN3YXBfZG9fc2NoZWR1bGVkX2Rpc2NhcmQoc2kpO1xuLVx0XHRcdHB1dF9zd2FwX2RldmljZShzaSk7XG4rXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xuK1x0XHRcdHJldCA9IC1FMkJJRztcbitcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRpZiAocmV0KVxuLVx0XHRcdHJldHVybiB0cnVlO1xuLVxuLVx0XHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0aWYgKHBsaXN0X25vZGVfZW1wdHkoXHUwMDI2bmV4dC1cdTAwM2VsaXN0KSlcbi1cdFx0XHRnb3RvIHN0YXJ0X292ZXI7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuIFxuLVx0cmV0dXJuIGZhbHNlO1xuK1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyBpbnQgc3dhcF9leHRlbmRfdGFibGVfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuQEAgLTE3MzUsNiArMTk5OSw3IEBAIGludCBmb2xpb19hbGxvY19zd2FwKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0dW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0dW5zaWduZWQgaW50IHNpemUgPSAxIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGludCByZXQ7XG4gXG4gXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X3VwdG9kYXRlKGZvbGlvKSwgZm9saW8pO1xuQEAgLTE3NTcsMjMgKzIwMjIsMTQgQEAgaW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0fVxuIFx0fVxuIFxuLWFnYWluOlxuLVx0bG9jYWxfbG9jayhcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spO1xuLVx0aWYgKCFzd2FwX2FsbG9jX2Zhc3QoZm9saW8pKVxuLVx0XHRzd2FwX2FsbG9jX3Nsb3coZm9saW8pO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4tXG4tXHRpZiAoIW9yZGVyIFx1MDAyNlx1MDAyNiB1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkge1xuLVx0XHRpZiAoc3dhcF9zeW5jX2Rpc2NhcmQoKSlcbi1cdFx0XHRnb3RvIGFnYWluO1xuLVx0fVxuK1x0cmV0ID0gc3dhcF9hbGxvY19lbnRyeShmb2xpbyk7XG4gXG4gXHQvKiBOZWVkIHRvIGNhbGwgdGhpcyBldmVuIGlmIGFsbG9jYXRpb24gZmFpbGVkLCBmb3IgTUVNQ0dfU1dBUF9GQUlMLiAqL1xuIFx0aWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwKGZvbGlvKSkpXG4gXHRcdHN3YXBfY2FjaGVfZGVsX2ZvbGlvKGZvbGlvKTtcbiBcbiBcdGlmICh1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSlcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4rXHRcdHJldHVybiByZXQgPyByZXQgOiAtRU5PTUVNO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTE5NDgsNyArMjIwNCw3IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdGlmIChiYXRjaF9pZClcbiBcdFx0bWVtX2Nncm91cF91bmNoYXJnZV9zd2FwKGJhdGNoX2lkLCBjaV9vZmYgLSBiYXRjaF9vZmYpO1xuIFxuLVx0c3dhcF9yYW5nZV9mcmVlKHNpLCBjaV9oZWFkICsgY2lfc3RhcnQsIG5yX3BhZ2VzKTtcbitcdHN3YXBfZGV2aWNlX2ludXNlX3N1YihzaSwgY2lfaGVhZCArIGNpX3N0YXJ0LCBucl9wYWdlcyk7XG4gXHRzd2FwX2NsdXN0ZXJfYXNzZXJ0X2VtcHR5KGNpLCBjaV9zdGFydCwgbnJfcGFnZXMsIGZhbHNlKTtcbiBcbiBcdGlmICghY2ktXHUwMDNlY291bnQpXG5AQCAtMjE1MCwzMSArMjQwNiwxNCBAQCB2b2lkIHN3YXBfcHV0X2VudHJpZXNfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5LCBpbnQgbnIpXG4gICovXG4gc3dwX2VudHJ5X3Qgc3dhcF9hbGxvY19oaWJlcm5hdGlvbl9zbG90KGludCB0eXBlKVxuIHtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwY3Bfc2ksICpzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuLVx0dW5zaWduZWQgbG9uZyBwY3Bfb2Zmc2V0LCBvZmZzZXQgPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XG4tXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XG4rXHR1bnNpZ25lZCBsb25nIG9mZnNldCA9IFNXQVBfRU5UUllfSU5WQUxJRDtcbiBcdHN3cF9lbnRyeV90IGVudHJ5ID0gezB9O1xuIFxuIFx0aWYgKCFzaSlcbiBcdFx0Z290byBmYWlsO1xuIFxuLVx0Lypcbi1cdCAqIFRyeSB0aGUgbG9jYWwgY2x1c3RlciBmaXJzdCBpZiBpdCBtYXRjaGVzIHRoZSBkZXZpY2UuIElmXG4tXHQgKiBub3QsIHRyeSBncmFiIGEgbmV3IGNsdXN0ZXIgYW5kIG92ZXJyaWRlIGxvY2FsIGNsdXN0ZXIuXG4tXHQgKi9cbi1cdGxvY2FsX2xvY2soXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcbi1cdHBjcF9zaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVswXSk7XG4tXHRwY3Bfb2Zmc2V0ID0gdGhpc19jcHVfcmVhZChwZXJjcHVfc3dhcF9jbHVzdGVyLm9mZnNldFswXSk7XG4tXHRpZiAocGNwX3NpID09IHNpIFx1MDAyNlx1MDAyNiBwY3Bfb2Zmc2V0KSB7XG4tXHRcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIHBjcF9vZmZzZXQpO1xuLVx0XHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIDApKVxuLVx0XHRcdG9mZnNldCA9IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHNpLCBjaSwgTlVMTCwgcGNwX29mZnNldCk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdH1cbi1cdGlmICghb2Zmc2V0KVxuLVx0XHRvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4rXHRvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpO1xuIFx0aWYgKG9mZnNldClcbiBcdFx0ZW50cnkgPSBzd3BfZW50cnkoc2ktXHUwMDNldHlwZSwgb2Zmc2V0KTtcbiBcbkBAIC0yMjA1LDI2ICsyNDQ0LDE4IEBAIHZvaWQgc3dhcF9mcmVlX2hpYmVybmF0aW9uX3Nsb3Qoc3dwX2VudHJ5X3QgZW50cnkpXG4gXG4gc3RhdGljIGludCBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuIHtcbi1cdGludCB0eXBlO1xuLVxuLVx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzd2FwX2xvY2spO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuIFxuIFx0aWYgKCFkZXZpY2UpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlKyspIHtcbi1cdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTtcbi1cbi1cdFx0aWYgKCEoc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfV1JJVEVPSykpXG4tXHRcdFx0Y29udGludWU7XG4tXG4tXHRcdGlmIChkZXZpY2UgPT0gc2lzLVx1MDAzZWJkZXYtXHUwMDNlYmRfZGV2KSB7XG4tXHRcdFx0c3RydWN0IHN3YXBfZXh0ZW50ICpzZSA9IGZpcnN0X3NlKHNpcyk7XG4tXG4tXHRcdFx0aWYgKHNlLVx1MDAzZXN0YXJ0X2Jsb2NrID09IG9mZnNldClcbi1cdFx0XHRcdHJldHVybiB0eXBlO1xuK1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xuK1x0XHRpZiAoZGV2aWNlID09IHNpLVx1MDAzZWJkZXYtXHUwMDNlYmRfZGV2KSB7XG4rXHRcdFx0aWYgKGZpcnN0X3NlKHNpKS1cdTAwM2VzdGFydF9ibG9jayA9PSBvZmZzZXQpXG4rXHRcdFx0XHRyZXR1cm4gc2ktXHUwMDNldHlwZTtcbiBcdFx0fVxuIFx0fVxuK1xuIFx0cmV0dXJuIC1FTk9ERVY7XG4gfVxuIFxuQEAgLTIyNDcsMjEgKzI0NzgsMTggQEAgc3RhdGljIGludCBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuICAqL1xuIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuIHtcbi1cdGludCB0eXBlO1xuK1x0aW50IHJldDtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVxuLVx0dHlwZSA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpO1xuLVx0aWYgKHR5cGUgXHUwMDNjIDApIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0cmV0dXJuIHR5cGU7XG4tXHR9XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0cmV0ID0gX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZpY2UsIG9mZnNldCk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRnb3RvIG91dDtcbiBcbi1cdHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XG4rXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHJldCk7XG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFzaSkpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0cmV0dXJuIC1FTk9ERVY7XG4rXHRcdHJldCA9IC1FTk9ERVY7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0LypcbkBAIC0yMjcwLDE0ICsyNDk4LDE1IEBAIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuIFx0ICogdGhlIHNhbWUgc2Vzc2lvbi5cbiBcdCAqL1xuIFx0aWYgKFdBUk5fT05fT05DRShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX0hJQkVSTkFUSU9OKSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRyZXR1cm4gLUVCVVNZO1xuK1x0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0c2ktXHUwMDNlZmxhZ3MgfD0gU1dQX0hJQkVSTkFUSU9OO1xuIFxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdHJldHVybiB0eXBlO1xuK291dDpcbitcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gLyoqXG5AQCAtMjI5NCwxNCArMjUyMywxMSBAQCB2b2lkIHVucGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShpbnQgdHlwZSlcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuLVx0aWYgKCFzaSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRyZXR1cm47XG4tXHR9XG4tXHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfSElCRVJOQVRJT047XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0aWYgKHNpKVxuK1x0XHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfSElCRVJOQVRJT047XG4rXHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gXG4gLyoqXG5AQCAtMjMyNiwyOSArMjU1MiwyNiBAQCBpbnQgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4ge1xuIFx0aW50IHR5cGU7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdHR5cGUgPSBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldmljZSwgb2Zmc2V0KTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFxuIFx0cmV0dXJuIHR5cGU7XG4gfVxuIFxuIGludCBmaW5kX2ZpcnN0X3N3YXAoZGV2X3QgKmRldmljZSlcbiB7XG4tXHRpbnQgdHlwZTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlKyspIHtcbi1cdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTtcbitcdGludCByZXQgPSAtRU5PREVWO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuIFxuLVx0XHRpZiAoIShzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0KmRldmljZSA9IHNpcy1cdTAwM2ViZGV2LVx1MDAzZWJkX2Rldjtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0cmV0dXJuIHR5cGU7XG4rXHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRmb3JfZWFjaF9hdmFpbF9zd2FwKHNpKSB7XG4rXHRcdCpkZXZpY2UgPSBzaS1cdTAwM2ViZGV2LVx1MDAzZWJkX2RldjtcbitcdFx0cmV0ID0gc2ktXHUwMDNldHlwZTtcbitcdFx0YnJlYWs7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0cmV0dXJuIC1FTk9ERVY7XG4rXHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gLypcbkBAIC0yMzc2LDcgKzI1OTksNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXG4ge1xuIFx0dW5zaWduZWQgaW50IG4gPSAwO1xuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRpZiAoKHVuc2lnbmVkIGludCl0eXBlIFx1MDAzYyBucl9zd2FwZmlsZXMpIHtcbiBcdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTtcbiBcbkBAIC0yMzg4LDcgKzI2MTEsNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXG4gXHRcdH1cbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2lzLVx1MDAzZWxvY2spO1xuIFx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV91cF9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRyZXR1cm4gbjtcbiB9XG4gI2VuZGlmIC8qIENPTkZJR19ISUJFUk5BVElPTiAqL1xuQEAgLTI3MDAsMTAgKzI5MjMsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX25leHRfdG9fdW51c2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0dW5zaWduZWQgbG9uZyBzd3BfdGI7XG4gXG4gXHQvKlxuLVx0ICogTm8gbmVlZCBmb3Igc3dhcF9sb2NrIGhlcmU6IHdlJ3JlIGp1c3QgbG9va2luZ1xuK1x0ICogTm8gbmVlZCBmb3Igc3dhcG9uX3J3c2VtIGhlcmU6IHdlJ3JlIGp1c3QgbG9va2luZ1xuIFx0ICogZm9yIHdoZXRoZXIgYW4gZW50cnkgaXMgaW4gdXNlLCBub3QgbW9kaWZ5aW5nIGl0OyBmYWxzZVxuIFx0ICogaGl0cyBhcmUgb2theSwgYW5kIHN5c19zd2Fwb2ZmKCkgaGFzIGFscmVhZHkgcHJldmVudGVkIG5ld1xuLVx0ICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcF9sb2NrKS5cbitcdCAqIGFsbG9jYXRpb25zIGZyb20gdGhpcyBhcmVhICh3aGlsZSBob2xkaW5nIHN3YXBvbl9yd3NlbSkuXG4gXHQgKi9cbiBcdGZvciAoaSA9IHByZXYgKyAxOyBpIFx1MDAzYyBzaS1cdTAwM2VtYXg7IGkrKykge1xuIFx0XHRzd3BfdGIgPSBzd2FwX3RhYmxlX2dldChfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2ksIGkpLFxuQEAgLTI4MTYsNyArMzAzOSw3IEBAIHN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKVxuIHN1Y2Nlc3M6XG4gXHQvKlxuIFx0ICogTWFrZSBzdXJlIHRoYXQgZnVydGhlciBjbGVhbnVwcyBhZnRlciB0cnlfdG9fdW51c2UoKSByZXR1cm5zIGhhcHBlblxuLVx0ICogYWZ0ZXIgc3dhcF9yYW5nZV9mcmVlKCkgcmVkdWNlcyBzaS1cdTAwM2VpbnVzZV9wYWdlcyB0byAwLlxuK1x0ICogYWZ0ZXIgc3dhcF9kZXZpY2VfaW51c2Vfc3ViKCkgcmVkdWNlcyBzaS1cdTAwM2VpbnVzZV9wYWdlcyB0byAwLlxuIFx0ICovXG4gXHRzbXBfbWIoKTtcbiBcdHJldHVybiAwO1xuQEAgLTI4MjQsMTggKzMwNDcsMjAgQEAgc3RhdGljIGludCB0cnlfdG9fdW51c2UodW5zaWduZWQgaW50IHR5cGUpXG4gXG4gLypcbiAgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgdHJ5X3RvX3VudXNlLCBpZiBubyBzd2FwIGlzIG5vdyBpbiB1c2UsIHdlIGtub3dcbi0gKiB3ZSBjYW4gZW1wdHkgdGhlIG1tbGlzdC4gIHN3YXBfbG9jayBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuXG4tICogTm90ZSB0aGF0IG1tbGlzdF9sb2NrIG5lc3RzIGluc2lkZSBzd2FwX2xvY2ssIGFuZCBhbiBtbSBtdXN0IGJlXG4rICogd2UgY2FuIGVtcHR5IHRoZSBtbWxpc3QuIHN3YXBvbl9yd3NlbSBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuXG4rICogTm90ZSB0aGF0IG1tbGlzdF9sb2NrIG5lc3RzIGluc2lkZSBzd2Fwb25fcndzZW0sIGFuZCBhbiBtbSBtdXN0IGJlXG4gICogYWRkZWQgdG8gdGhlIG1tbGlzdCBqdXN0IGFmdGVyIHBhZ2VfZHVwbGljYXRlIC0gYmVmb3JlIHdvdWxkIGJlIHJhY3kuXG4gICovXG4gc3RhdGljIHZvaWQgZHJhaW5fbW1saXN0KHZvaWQpXG4ge1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuIFx0c3RydWN0IGxpc3RfaGVhZCAqcCwgKm5leHQ7XG4tXHR1bnNpZ25lZCBpbnQgdHlwZTtcbiBcbi1cdGZvciAodHlwZSA9IDA7IHR5cGUgXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSsrKVxuLVx0XHRpZiAoc3dhcF91c2FnZV9pbl9wYWdlcyhzd2FwX2luZm9bdHlwZV0pKVxuK1x0Zm9yX2VhY2hfc3dhcChzaSkge1xuK1x0XHRpZiAoc3dhcF91c2FnZV9pbl9wYWdlcyhzaSkpXG4gXHRcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0c3Bpbl9sb2NrKFx1MDAyNm1tbGlzdF9sb2NrKTtcbiBcdGxpc3RfZm9yX2VhY2hfc2FmZShwLCBuZXh0LCBcdTAwMjZpbml0X21tLm1tbGlzdClcbiBcdFx0bGlzdF9kZWxfaW5pdChwKTtcbkBAIC0yOTY4LDU4ICszMTkzLDY1IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG4gXHRyZXR1cm4gZ2VuZXJpY19zd2FwZmlsZV9hY3RpdmF0ZShzaXMsIHN3YXBfZmlsZSwgc3Bhbik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9lbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbi17XG4tXHRhdG9taWNfbG9uZ19hZGQoc2ktXHUwMDNlcGFnZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuLVx0dG90YWxfc3dhcF9wYWdlcyArPSBzaS1cdTAwM2VwYWdlcztcbi1cbi1cdGFzc2VydF9zcGluX2xvY2tlZChcdTAwMjZzd2FwX2xvY2spO1xuLVxuLVx0cGxpc3RfYWRkKFx1MDAyNnNpLVx1MDAzZWxpc3QsIFx1MDAyNnN3YXBfYWN0aXZlX2hlYWQpO1xuLVxuLVx0LyogQWRkIGJhY2sgdG8gYXZhaWxhYmxlIGxpc3QgKi9cbi1cdGFkZF90b19hdmFpbF9saXN0KHNpLCB0cnVlKTtcbi19XG4tXG4gLypcbi0gKiBDYWxsZWQgYWZ0ZXIgdGhlIHN3YXAgZGV2aWNlIGlzIHJlYWR5LCByZXN1cnJlY3QgaXRzIHBlcmNwdSByZWYsIGl0J3Mgbm93XG4tICogc2FmZSB0byByZWZlcmVuY2UgaXQuIEFkZCBpdCB0byB0aGUgbGlzdCB0byBleHBvc2UgaXQgdG8gdGhlIGFsbG9jYXRvci5cbisgKiBDYWxsZWQgYWZ0ZXIgdGhlIHN3YXAgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIHVzZWQuIE1hcmtpbmcgaXQgd3JpdGFibGUgYW5kXG4rICogZXhwb3NpbmcgaXQgdG8gdGhlIGFsbG9jYXRvci4gUmVzdXJyZWN0IGl0cyBwZXJjcHUgcmVmIGlmIGl0IHdhcyBkZWFkIGJlZm9yZS5cbiAgKi9cbi1zdGF0aWMgdm9pZCBlbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbitzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9lbmFibGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIHtcbi1cdHBlcmNwdV9yZWZfcmVzdXJyZWN0KFx1MDAyNnNpLVx1MDAzZXVzZXJzKTtcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuLVx0X2VuYWJsZV9zd2FwX2luZm8oc2kpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLX1cbitcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRzcGluX2xvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4rXHRzaS1cdTAwM2VmbGFncyB8PSBTV1BfV1JJVEVPSztcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1x0YXRvbWljX2xvbmdfYWRkKHNpLVx1MDAzZXBhZ2VzLCBcdTAwMjZucl9zd2FwX3BhZ2VzKTtcbitcdHRvdGFsX3N3YXBfcGFnZXMgKz0gc2ktXHUwMDNlcGFnZXM7XG4rXHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcbi1zdGF0aWMgdm9pZCByZWluc2VydF9zd2FwX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuLXtcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuLVx0X2VuYWJsZV9zd2FwX2luZm8oc2kpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0YWRkX3RvX2F2YWlsX2xpc3Qoc2kpO1xuIH1cbiBcbi0vKlxuLSAqIENhbGxlZCBhZnRlciBjbGVhcmluZyBTV1BfV1JJVEVPSywgZW5zdXJlcyBjbHVzdGVyX2FsbG9jX3JhbmdlXG4tICogc2VlIHRoZSB1cGRhdGVkIGZsYWdzLCBzbyB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgYWxsb2NhdGlvbnMuXG4tICovXG4tc3RhdGljIHZvaWQgd2FpdF9mb3JfYWxsb2NhdGlvbihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4rc3RhdGljIGludCBzd2FwX2RldmljZV9kaXNhYmxlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiB7XG4gXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcbiBcdHVuc2lnbmVkIGxvbmcgZW5kID0gQUxJR04oc2ktXHUwMDNlbWF4LCBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4gXG4tXHRCVUdfT04oc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKTtcbitcdC8qXG4rXHQgKiBJZiBTV1BfV1JJVEVPSyBpcyBub3Qgc2V0OiBhbm90aGVyIHByb2Nlc3MgYWxyZWFkeSBkaXNhYmxpbmcgaXQuXG4rXHQgKiBJZiBTV1BfSElCRVJOQVRJT04gaXMgc2V0OiB0aGUgZGV2aWNlIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uXG4rXHQgKi9cbitcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spIHx8XG4rXHQgICAgc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9ISUJFUk5BVElPTikge1xuK1x0XHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcdH1cbitcbitcdGlmIChzZWN1cml0eV92bV9lbm91Z2hfbWVtb3J5X21tKGN1cnJlbnQtXHUwMDNlbW0sIHNpLVx1MDAzZXBhZ2VzKSkge1xuK1x0XHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXHR9XG4rXHR2bV91bmFjY3RfbWVtb3J5KHNpLVx1MDAzZXBhZ2VzKTtcbitcbitcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcdHNpLVx1MDAzZWZsYWdzIFx1MDAyNj0gflNXUF9XUklURU9LO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4rXHR0b3RhbF9zd2FwX3BhZ2VzIC09IHNpLVx1MDAzZXBhZ2VzO1xuK1x0YXRvbWljX2xvbmdfc3ViKHNpLVx1MDAzZXBhZ2VzLCBcdTAwMjZucl9zd2FwX3BhZ2VzKTtcbitcdGRlbF9mcm9tX2F2YWlsX2xpc3Qoc2ksIHRydWUpO1xuK1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXG4rXHQvKlxuK1x0ICogU3dhcCBhbGxvY2F0b3IgZG9lc24ndCB0b3VjaCBzaSBsb2NrLCBzbyBsb29waW5nIHRocm91Z2ggYWxsXG4rXHQgKiBjaSBsb2NrcyBlbnN1cmVzIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMgc2VlcyB0aGVcbitcdCAqIHVwZGF0ZWQgZmxhZ3MsIGFuZCBubyBtb3JlIGFsbG9jYXRpb25zIHdpbGwgb2NjdXIuXG4rXHQgKi9cbiBcdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IFx1MDAzYyBlbmQ7IG9mZnNldCArPSBTV0FQRklMRV9DTFVTVEVSKSB7XG4gXHRcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XG4gXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuIFx0fVxuK1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXG5AQCAtMzA0MywyOCArMzI3NSw2IEBAIHN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXG4gXHRrdmZyZWUoY2x1c3Rlcl9pbmZvKTtcbiB9XG4gXG4tLypcbi0gKiBDYWxsZWQgYWZ0ZXIgc3dhcCBkZXZpY2UncyByZWZlcmVuY2UgY291bnQgaXMgZGVhZCwgc29cbi0gKiBuZWl0aGVyIHNjYW4gbm9yIGFsbG9jYXRpb24gd2lsbCB1c2UgaXQuXG4tICovXG4tc3RhdGljIHZvaWQgZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4te1xuLVx0aW50IGNwdSwgaTtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICoqcGNwX3NpO1xuLVxuLVx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuLVx0XHRwY3Bfc2kgPSBwZXJfY3B1X3B0cihwZXJjcHVfc3dhcF9jbHVzdGVyLnNpLCBjcHUpO1xuLVx0XHQvKlxuLVx0XHQgKiBJbnZhbGlkYXRlIHRoZSBwZXJjcHUgc3dhcCBjbHVzdGVyIGNhY2hlLCBzaS1cdTAwM2V1c2Vyc1xuLVx0XHQgKiBpcyBkZWFkLCBzbyBubyBuZXcgdXNlciB3aWxsIHBvaW50IHRvIGl0LCBqdXN0IGZsdXNoXG4tXHRcdCAqIGFueSBleGlzdGluZyB1c2VyLlxuLVx0XHQgKi9cbi1cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU1dBUF9OUl9PUkRFUlM7IGkrKylcbi1cdFx0XHRjbXB4Y2hnKFx1MDAyNnBjcF9zaVtpXSwgc2ksIE5VTEwpO1xuLVx0fVxuLX1cbi1cbi1cbiBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4ge1xuIFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnAgPSBOVUxMO1xuQEAgLTMwODYsNDQgKzMyOTYsMjIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFx0XHRyZXR1cm4gUFRSX0VSUih2aWN0aW0pO1xuIFxuIFx0bWFwcGluZyA9IHZpY3RpbS1cdTAwM2VmX21hcHBpbmc7XG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdHBsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIFx1MDAyNnN3YXBfYWN0aXZlX2hlYWQsIGxpc3QpIHtcbi1cdFx0aWYgKHAtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSB7XG4tXHRcdFx0aWYgKHAtXHUwMDNlc3dhcF9maWxlLVx1MDAzZWZfbWFwcGluZyA9PSBtYXBwaW5nKSB7XG4tXHRcdFx0XHRmb3VuZCA9IDE7XG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHR9XG4rXHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRmb3JfZWFjaF9hdmFpbF9zd2FwKHApIHtcbitcdFx0aWYgKHAtXHUwMDNlc3dhcF9maWxlLVx1MDAzZWZfbWFwcGluZyA9PSBtYXBwaW5nKSB7XG4rXHRcdFx0Zm91bmQgPSAxO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXHR9XG4tXHRpZiAoIWZvdW5kKSB7XG4tXHRcdGVyciA9IC1FSU5WQUw7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdGdvdG8gb3V0X2RwdXQ7XG4tXHR9XG4tXG4tXHQvKiBSZWZ1c2Ugc3dhcG9mZiB3aGlsZSB0aGUgZGV2aWNlIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24gKi9cbi1cdGlmIChwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfSElCRVJOQVRJT04pIHtcbi1cdFx0ZXJyID0gLUVCVVNZO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuLVx0fVxuK1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdGZpbHBfY2xvc2UodmljdGltLCBOVUxMKTtcbiBcbi1cdGlmICghc2VjdXJpdHlfdm1fZW5vdWdoX21lbW9yeV9tbShjdXJyZW50LVx1MDAzZW1tLCBwLVx1MDAzZXBhZ2VzKSlcbi1cdFx0dm1fdW5hY2N0X21lbW9yeShwLVx1MDAzZXBhZ2VzKTtcbi1cdGVsc2Uge1xuLVx0XHRlcnIgPSAtRU5PTUVNO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuLVx0fVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnAtXHUwMDNlbG9jayk7XG4tXHRkZWxfZnJvbV9hdmFpbF9saXN0KHAsIHRydWUpO1xuLVx0cGxpc3RfZGVsKFx1MDAyNnAtXHUwMDNlbGlzdCwgXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCk7XG4tXHRhdG9taWNfbG9uZ19zdWIocC1cdTAwM2VwYWdlcywgXHUwMDI2bnJfc3dhcF9wYWdlcyk7XG4tXHR0b3RhbF9zd2FwX3BhZ2VzIC09IHAtXHUwMDNlcGFnZXM7XG4tXHRzcGluX3VubG9jayhcdTAwMjZwLVx1MDAzZWxvY2spO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdGlmICghZm91bmQpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0d2FpdF9mb3JfYWxsb2NhdGlvbihwKTtcbitcdGVyciA9IHN3YXBfZGV2aWNlX2Rpc2FibGUocCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuIFxuIFx0c2V0X2N1cnJlbnRfb29tX29yaWdpbigpO1xuIFx0ZXJyID0gdHJ5X3RvX3VudXNlKHAtXHUwMDNldHlwZSk7XG5AQCAtMzEzMSwxMCArMzMxOSwxMyBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXG4gXHRpZiAoZXJyKSB7XG4gXHRcdC8qIHJlLWluc2VydCBzd2FwIHNwYWNlIGJhY2sgaW50byBzd2FwX2xpc3QgKi9cbi1cdFx0cmVpbnNlcnRfc3dhcF9pbmZvKHApO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuK1x0XHRzd2FwX2RldmljZV9lbmFibGUocCk7XG4rXHRcdHJldHVybiBlcnI7XG4gXHR9XG4gXG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0c3dhcF9xdWV1ZV9kZWwocCk7XG4rXG4gXHQvKlxuIFx0ICogV2FpdCBmb3Igc3dhcCBvcGVyYXRpb25zIHByb3RlY3RlZCBieSBnZXQvcHV0X3N3YXBfZGV2aWNlKClcbiBcdCAqIHRvIGNvbXBsZXRlLiAgQmVjYXVzZSBvZiBzeW5jaHJvbml6ZV9yY3UoKSBoZXJlLCBhbGwgc3dhcFxuQEAgLTMxNDksMTUgKzMzNDAsMTIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFxuIFx0Zmx1c2hfd29yayhcdTAwMjZwLVx1MDAzZWRpc2NhcmRfd29yayk7XG4gXHRmbHVzaF93b3JrKFx1MDAyNnAtXHUwMDNlcmVjbGFpbV93b3JrKTtcbi1cdGZsdXNoX3BlcmNwdV9zd2FwX2NsdXN0ZXIocCk7XG4gXG4gXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhwLCBwLVx1MDAzZXN3YXBfZmlsZSk7XG4gXG4gXHRpZiAoIShwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4gXHRcdGF0b21pY19kZWMoXHUwMDI2bnJfcm90YXRlX3N3YXApO1xuIFxuLVx0bXV0ZXhfbG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4gXHRzcGluX2xvY2soXHUwMDI2cC1cdTAwM2Vsb2NrKTtcbiBcdGRyYWluX21tbGlzdCgpO1xuIFxuQEAgLTMxNjgsMTAgKzMzNTYsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFx0cC1cdTAwM2VtYXggPSAwO1xuIFx0cC1cdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2cC1cdTAwM2Vsb2NrKTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdGFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC1cdTAwM2V0eXBlKTtcbiBcdHpzd2FwX3N3YXBvZmYocC1cdTAwM2V0eXBlKTtcbi1cdG11dGV4X3VubG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuK1x0ZnJlZV9wZXJjcHUocC1cdTAwM2VwZXJjcHVfY2x1c3Rlcik7XG4rXHRwLVx1MDAzZXBlcmNwdV9jbHVzdGVyID0gTlVMTDtcbiBcdGtmcmVlKHAtXHUwMDNlZ2xvYmFsX2NsdXN0ZXIpO1xuIFx0cC1cdTAwM2VnbG9iYWxfY2x1c3RlciA9IE5VTEw7XG4gXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xuQEAgLTMxODcsMTggKzMzNzYsMTkgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFx0ICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28gdGhhdCBzd2Fwb25cbiBcdCAqIGNhbiByZXVzZSB0aGlzIHN3YXBfaW5mbyBpbiBhbGxvY19zd2FwX2luZm8oKSBzYWZlbHkuICBJdCBpcyBvayB0b1xuIFx0ICogbm90IGhvbGQgcC1cdTAwM2Vsb2NrIGFmdGVyIHdlIGNsZWFyZWQgaXRzIFNXUF9XUklURU9LLlxuK1x0ICpcbitcdCAqIFRoZSB3cml0ZSBsb2NrIGVuc3VyZXMgdGhlIGZsYWcgY2xlYXIgaXMgdmlzaWJsZSB0byBsb2NrbGVzc1xuK1x0ICogcmVhZGVycyBvZiBzd2FwX3R5cGVfdG9faW5mbygpIGJlZm9yZSBhbGxvY19zd2FwX2luZm8oKSByZXVzZXNcbitcdCAqIHRoaXMgc2xvdC5cbiBcdCAqL1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0cC1cdTAwM2VmbGFncyA9IDA7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXG4tXHRlcnIgPSAwO1xuIFx0YXRvbWljX2luYyhcdTAwMjZwcm9jX3BvbGxfZXZlbnQpO1xuIFx0d2FrZV91cF9pbnRlcnJ1cHRpYmxlKFx1MDAyNnByb2NfcG9sbF93YWl0KTtcbiBcbi1vdXRfZHB1dDpcbi1cdGZpbHBfY2xvc2UodmljdGltLCBOVUxMKTtcbi1cdHJldHVybiBlcnI7XG4rXHRyZXR1cm4gMDtcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19QUk9DX0ZTXG5AQCAtMzIxNiwyMCArMzQwNiwxOCBAQCBzdGF0aWMgX19wb2xsX3Qgc3dhcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdClcbiBcdHJldHVybiBFUE9MTElOIHwgRVBPTExSRE5PUk07XG4gfVxuIFxuLS8qIGl0ZXJhdG9yICovXG4gc3RhdGljIHZvaWQgKnN3YXBfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzd2FwLCBsb2ZmX3QgKnBvcylcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4tXHRpbnQgdHlwZTtcbiBcdGxvZmZfdCBsID0gKnBvcztcbiBcbi1cdG11dGV4X2xvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbitcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcbiBcdGlmICghbClcbiBcdFx0cmV0dXJuIFNFUV9TVEFSVF9UT0tFTjtcbiBcbi1cdGZvciAodHlwZSA9IDA7IChzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpKTsgdHlwZSsrKSB7XG4tXHRcdGlmICghKHNpLVx1MDAzZXN3YXBfZmlsZSkpXG4rXHRmb3JfZWFjaF9zd2FwKHNpKSB7XG4rXHRcdGlmICghc2ktXHUwMDNlc3dhcF9maWxlKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRpZiAoIS0tbClcbiBcdFx0XHRyZXR1cm4gc2k7XG5AQCAtMzI1MCw3ICszNDM4LDcgQEAgc3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuIFxuIFx0KysoKnBvcyk7XG4gXHRmb3IgKDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlKyspIHtcbi1cdFx0aWYgKCEoc2ktXHUwMDNlc3dhcF9maWxlKSlcbitcdFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9VU0VEKSB8fCAhKHNpLVx1MDAzZXN3YXBfZmlsZSkpXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdHJldHVybiBzaTtcbiBcdH1cbkBAIC0zMjYwLDcgKzM0NDgsNyBAQCBzdGF0aWMgdm9pZCAqc3dhcF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXG4gXG4gc3RhdGljIHZvaWQgc3dhcF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdilcbiB7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbitcdHBlcmNwdV91cF9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgc3dhcF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdilcbkBAIC0zMzUzLDEzICszNTQxLDEzIEBAIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqYWxsb2Nfc3dhcF9pbmZvKHZvaWQpXG4gXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuIFx0fVxuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlKyspIHtcbiBcdFx0aWYgKCEoc3dhcF9pbmZvW3R5cGVdLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfVVNFRCkpXG4gXHRcdFx0YnJlYWs7XG4gXHR9XG4gXHRpZiAodHlwZSBcdTAwM2U9IE1BWF9TV0FQRklMRVMpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdFx0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRcdHBlcmNwdV9yZWZfZXhpdChcdTAwMjZwLVx1MDAzZXVzZXJzKTtcbiBcdFx0a3ZmcmVlKHApO1xuIFx0XHRyZXR1cm4gRVJSX1BUUigtRVBFUk0pO1xuQEAgLTMzODEsMTAgKzM1NjksOCBAQCBzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKmFsbG9jX3N3YXBfaW5mbyh2b2lkKVxuIFx0XHQgKi9cbiBcdH1cbiBcdHAtXHUwMDNlc3dhcF9leHRlbnRfcm9vdCA9IFJCX1JPT1Q7XG4tXHRwbGlzdF9ub2RlX2luaXQoXHUwMDI2cC1cdTAwM2VsaXN0LCAwKTtcbi1cdHBsaXN0X25vZGVfaW5pdChcdTAwMjZwLVx1MDAzZWF2YWlsX2xpc3QsIDApO1xuIFx0cC1cdTAwM2VmbGFncyA9IFNXUF9VU0VEO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0aWYgKGRlZmVyKSB7XG4gXHRcdHBlcmNwdV9yZWZfZXhpdChcdTAwMjZkZWZlci1cdTAwM2V1c2Vycyk7XG4gXHRcdGt2ZnJlZShkZWZlcik7XG5AQCAtMzQ1Myw5ICszNjM5LDggQEAgX193ZWFrIHVuc2lnbmVkIGxvbmcgYXJjaF9tYXhfc3dhcGZpbGVfc2l6ZSh2b2lkKVxuIFx0cmV0dXJuIGdlbmVyaWNfbWF4X3N3YXBmaWxlX3NpemUoKTtcbiB9XG4gXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4tXHRcdFx0XHRcdHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbi1cdFx0XHRcdFx0c3RydWN0IGlub2RlICppbm9kZSlcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbitcdFx0XHRcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4ge1xuIFx0aW50IGk7XG4gXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzO1xuQEAgLTM1MjIsNyArMzcwNyw3IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiB7XG4gXHR1bnNpZ25lZCBsb25nIG5yX2NsdXN0ZXJzID0gRElWX1JPVU5EX1VQKG1heHBhZ2VzLCBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvO1xuLVx0aW50IGVyciA9IC1FTk9NRU07XG4rXHRpbnQgY3B1LCBlcnIgPSAtRU5PTUVNO1xuIFx0dW5zaWduZWQgbG9uZyBpO1xuIFxuIFx0Y2x1c3Rlcl9pbmZvID0ga3Z6YWxsb2Nfb2JqcygqY2x1c3Rlcl9pbmZvLCBucl9jbHVzdGVycyk7XG5AQCAtMzUzMiwxMyArMzcxNywyNiBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jbHVzdGVyczsgaSsrKVxuIFx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZjbHVzdGVyX2luZm9baV0ubG9jayk7XG4gXG4tXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKSB7XG4rXHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSB7XG4rXHRcdHNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBwZXJjcHVfY2x1c3Rlcik7XG4rXHRcdGlmICghc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXIpXG4rXHRcdFx0Z290byBlcnI7XG4rXG4rXHRcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbitcdFx0XHRzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIgKmNsdXN0ZXI7XG4rXG4rXHRcdFx0Y2x1c3RlciA9IHBlcl9jcHVfcHRyKHNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyLCBjcHUpO1xuK1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFNXQVBfTlJfT1JERVJTOyBpKyspXG4rXHRcdFx0XHRjbHVzdGVyLVx1MDAzZW5leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XG4rXHRcdFx0bG9jYWxfbG9ja19pbml0KFx1MDAyNmNsdXN0ZXItXHUwMDNlbG9jayk7XG4rXHRcdH1cbitcdH0gZWxzZSB7XG4gXHRcdHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyID0ga21hbGxvY19vYmooKnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcbiBcdFx0aWYgKCFzaS1cdTAwM2VnbG9iYWxfY2x1c3RlcilcbiBcdFx0XHRnb3RvIGVycjtcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU1dBUF9OUl9PUkRFUlM7IGkrKylcbiBcdFx0XHRzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlci1cdTAwM2VuZXh0W2ldID0gU1dBUF9FTlRSWV9JTlZBTElEO1xuLVx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbitcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbG9jayk7XG4gXHR9XG4gXG4gXHQvKlxuQEAgLTM2MjEsNyArMzgxOSw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHQvKlxuIFx0ICogQWxsb2NhdGUgb3IgcmV1c2UgZXhpc3RpbmcgIVNXUF9VU0VEIHN3YXBfaW5mby4gVGhlIHJldHVybmVkXG4gXHQgKiBzaSB3aWxsIHN0YXkgaW4gYSBkeWluZyBzdGF0dXMsIHNvIG5vdGhpbmcgd2lsbCBhY2Nlc3MgaXRzIGNvbnRlbnRcbi1cdCAqIHVudGlsIGVuYWJsZV9zd2FwX2luZm8gcmVzdXJyZWN0cyBpdHMgcGVyY3B1IHJlZiBhbmQgZXhwb3NlIGl0LlxuK1x0ICogdW50aWwgc3dhcF9kZXZpY2VfZW5hYmxlIHJlc3VycmVjdHMgaXRzIHBlcmNwdSByZWYgYW5kIGV4cG9zZSBpdC5cbiBcdCAqL1xuIFx0c2kgPSBhbGxvY19zd2FwX2luZm8oKTtcbiBcdGlmIChJU19FUlIoc2kpKVxuQEAgLTM2NzksNyArMzg3Nyw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHR9XG4gXHRzd2FwX2hlYWRlciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIDApO1xuIFxuLVx0bWF4cGFnZXMgPSByZWFkX3N3YXBfaGVhZGVyKHNpLCBzd2FwX2hlYWRlciwgaW5vZGUpO1xuK1x0bWF4cGFnZXMgPSByZWFkX3N3YXBfaGVhZGVyKHN3YXBfaGVhZGVyLCBpbm9kZSk7XG4gXHRpZiAodW5saWtlbHkoIW1heHBhZ2VzKSkge1xuIFx0XHRlcnJvciA9IC1FSU5WQUw7XG4gXHRcdGdvdG8gYmFkX3N3YXBfdW5sb2NrX2lub2RlO1xuQEAgLTM3MDAsMTEgKzM4OTgsNiBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFxuIFx0bWF4cGFnZXMgPSBzaS1cdTAwM2VtYXg7XG4gXG4tXHQvKiBTZXQgdXAgdGhlIHN3YXAgY2x1c3RlciBpbmZvICovXG4tXHRlcnJvciA9IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzaSwgc3dhcF9oZWFkZXIsIG1heHBhZ2VzKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0Z290byBiYWRfc3dhcF91bmxvY2tfaW5vZGU7XG4tXG4gXHRpZiAoc2ktXHUwMDNlYmRldiBcdTAwMjZcdTAwMjYgYmRldl9zdGFibGVfd3JpdGVzKHNpLVx1MDAzZWJkZXYpKVxuIFx0XHRzaS1cdTAwM2VmbGFncyB8PSBTV1BfU1RBQkxFX1dSSVRFUztcbiBcbkBAIC0zNzE4LDYgKzM5MTEsMTUgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0aW5jZWRfbnJfcm90YXRlX3N3YXAgPSB0cnVlO1xuIFx0fVxuIFxuK1x0LypcbitcdCAqIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8uIFRoaXMgbXVzdCBydW4gYWZ0ZXIgU1dQX1NPTElEU1RBVEVcbitcdCAqIGlzIGRldGVybWluZWQgYWJvdmUsIGFzIGl0IGRlY2lkZXMgd2hldGhlciB0byBhbGxvY2F0ZSB0aGUgcGVyLUNQVVxuK1x0ICogY2x1c3RlciAoc29saWQgc3RhdGUpIG9yIHRoZSBnbG9iYWwgY2x1c3RlciAocm90YXRpb25hbCkuXG4rXHQgKi9cbitcdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xuK1x0aWYgKGVycm9yKVxuK1x0XHRnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTtcbitcbiBcdGlmICgoc3dhcF9mbGFncyBcdTAwMjYgU1dBUF9GTEFHX0RJU0NBUkQpIFx1MDAyNlx1MDAyNlxuIFx0ICAgIHNpLVx1MDAzZWJkZXYgXHUwMDI2XHUwMDI2IGJkZXZfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzaS1cdTAwM2ViZGV2KSkge1xuIFx0XHQvKlxuQEAgLTM3NjQsMjIgKzM5NjYsMjIgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0Z290byBmcmVlX3N3YXBfenN3YXA7XG4gXHR9XG4gXG4tXHRtdXRleF9sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4gXHRwcmlvID0gREVGX1NXQVBfUFJJTztcbiBcdGlmIChzd2FwX2ZsYWdzIFx1MDAyNiBTV0FQX0ZMQUdfUFJFRkVSKVxuIFx0XHRwcmlvID0gc3dhcF9mbGFncyBcdTAwMjYgU1dBUF9GTEFHX1BSSU9fTUFTSztcbiBcbi1cdC8qXG4tXHQgKiBUaGUgcGxpc3QgcHJpbyBpcyBuZWdhdGVkIGJlY2F1c2UgcGxpc3Qgb3JkZXJpbmcgaXNcbi1cdCAqIGxvdy10by1oaWdoLCB3aGlsZSBzd2FwIG9yZGVyaW5nIGlzIGhpZ2gtdG8tbG93XG4tXHQgKi9cbiBcdHNpLVx1MDAzZXByaW8gPSBwcmlvO1xuLVx0c2ktXHUwMDNlbGlzdC5wcmlvID0gLXNpLVx1MDAzZXByaW87XG4tXHRzaS1cdTAwM2VhdmFpbF9saXN0LnByaW8gPSAtc2ktXHUwMDNlcHJpbztcbiBcdHNpLVx1MDAzZXN3YXBfZmlsZSA9IHN3YXBfZmlsZTtcbiBcbiBcdC8qIFNldHMgU1dQX1dSSVRFT0ssIHJlc3VycmVjdCB0aGUgcGVyY3B1IHJlZiwgZXhwb3NlIHRoZSBzd2FwIGRldmljZSAqL1xuLVx0ZW5hYmxlX3N3YXBfaW5mbyhzaSk7XG4rXHRwZXJjcHVfcmVmX3Jlc3VycmVjdChcdTAwMjZzaS1cdTAwM2V1c2Vycyk7XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0ZXJyb3IgPSBzd2FwX3F1ZXVlX2FkZChzaSk7XG4rXHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBmcmVlX3N3YXBfenN3YXA7XG4rXG4rXHRzd2FwX2RldmljZV9lbmFibGUoc2kpO1xuIFxuIFx0cHJfaW5mbyhcIkFkZGluZyAldWsgc3dhcCBvbiAlcy4gIFByaW9yaXR5OiVkIGV4dGVudHM6JWQgYWNyb3NzOiVsbHVrICVzJXMlcyVzXFxuXCIsXG4gXHRcdEsoc2ktXHUwMDNlcGFnZXMpLCBuYW1lLVx1MDAzZW5hbWUsIHNpLVx1MDAzZXByaW8sIG5yX2V4dGVudHMsXG5AQCAtMzc4OSw3ICszOTkxLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0KHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfQVJFQV9ESVNDQVJEKSA/IFwic1wiIDogXCJcIixcbiBcdFx0KHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfUEFHRV9ESVNDQVJEKSA/IFwiY1wiIDogXCJcIik7XG4gXG4tXHRtdXRleF91bmxvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbiBcdGF0b21pY19pbmMoXHUwMDI2cHJvY19wb2xsX2V2ZW50KTtcbiBcdHdha2VfdXBfaW50ZXJydXB0aWJsZShcdTAwMjZwcm9jX3BvbGxfd2FpdCk7XG4gXG5AQCAtMzgwMCw2ICs0MDAxLDggQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBiYWRfc3dhcF91bmxvY2tfaW5vZGU6XG4gXHRpbm9kZV91bmxvY2soaW5vZGUpO1xuIGJhZF9zd2FwOlxuK1x0ZnJlZV9wZXJjcHUoc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXIpO1xuK1x0c2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXIgPSBOVUxMO1xuIFx0a2ZyZWUoc2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXIpO1xuIFx0c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXIgPSBOVUxMO1xuIFx0aW5vZGUgPSBOVUxMO1xuQEAgLTM4MTAsOSArNDAxMyw5IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xuIFx0ICogYWxsb2Nfc3dhcF9pbmZvIGNhbiByZXVzZSB0aGlzIHNpIHNhZmVseS5cbiBcdCAqL1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0c2ktXHUwMDNlZmxhZ3MgPSAwO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0aWYgKGluY2VkX25yX3JvdGF0ZV9zd2FwKVxuIFx0XHRhdG9taWNfZGVjKFx1MDAyNm5yX3JvdGF0ZV9zd2FwKTtcbiBcdGlmIChzd2FwX2ZpbGUpXG5AQCAtMzgyNywxOSArNDAzMCwxNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFxuIHZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbClcbiB7XG4tXHR1bnNpZ25lZCBpbnQgdHlwZTtcbitcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcdHVuc2lnbmVkIGxvbmcgbnJfdG9fYmVfdW51c2VkID0gMDtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlKyspIHtcbi1cdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF9pbmZvW3R5cGVdO1xuLVxuLVx0XHRpZiAoKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfVVNFRCkgXHUwMDI2XHUwMDI2ICEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbitcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdGZvcl9lYWNoX3N3YXAoc2kpIHtcbitcdFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbiBcdFx0XHRucl90b19iZV91bnVzZWQgKz0gc3dhcF91c2FnZV9pbl9wYWdlcyhzaSk7XG4gXHR9XG4gXHR2YWwtXHUwMDNlZnJlZXN3YXAgPSBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNm5yX3N3YXBfcGFnZXMpICsgbnJfdG9fYmVfdW51c2VkO1xuIFx0dmFsLVx1MDAzZXRvdGFsc3dhcCA9IHRvdGFsX3N3YXBfcGFnZXMgKyBucl90b19iZV91bnVzZWQ7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gXG4gLypcbkBAIC0zODc5LDcgKzQwODAsNyBAQCBpbnQgc3dhcF9kdXBfZW50cnlfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5KVxuICNpZiBkZWZpbmVkKENPTkZJR19NRU1DRykgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX0JMS19DR1JPVVApXG4gc3RhdGljIGJvb2wgX19oYXNfdXNhYmxlX3N3YXAodm9pZClcbiB7XG4tXHRyZXR1cm4gIXBsaXN0X2hlYWRfZW1wdHkoXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCk7XG4rXHRyZXR1cm4gUkVBRF9PTkNFKHRvdGFsX3N3YXBfcGFnZXMpIFx1MDAzZSAwO1xuIH1cbiBcbiB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKVxuQEAgLTM5MDIsMTQgKzQxMDMsMTQgQEAgdm9pZCBfX2ZvbGlvX3Rocm90dGxlX3N3YXByYXRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGdmcF90IGdmcClcbiBcdGlmIChjdXJyZW50LVx1MDAzZXRocm90dGxlX2Rpc2spXG4gXHRcdHJldHVybjtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuLVx0cGxpc3RfZm9yX2VhY2hfZW50cnkoc2ksIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCwgYXZhaWxfbGlzdCkge1xuK1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xuIFx0XHRpZiAoc2ktXHUwMDNlYmRldikge1xuIFx0XHRcdGJsa2NnX3NjaGVkdWxlX3Rocm90dGxlKHNpLVx1MDAzZWJkZXYtXHUwMDNlYmRfZGlzaywgdHJ1ZSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbiBcdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4rXHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIH1cbiAjZW5kaWZcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQzOjQ2LjA5MTA2MjI1OVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg1NTQ3Mzc1NjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgU3dhcCBTdWJzeXN0ZW0gUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCB0aGlzIHBhdGNoIOKAkyBhIHByZXR0eSBzaWduaWZpY2FudCBvbmUsIGl0IGxvb2tzIGxpa2Ug4oCTIHRoYXQncyBmdW5kYW1lbnRhbGx5IGNoYW5naW5nIHRoZSBMaW51eCBrZXJuZWwncyBzd2FwIHN1YnN5c3RlbS4gSXQncyByZXBsYWNpbmcgdGhlIGN1cnJlbnQgYHBsaXN0YC1iYXNlZCBxdWV1ZSBmb3Igc3dhcCBkZXZpY2VzIHdpdGggYSBjdXN0b20gcm91bmQtcm9iaW4gaW1wbGVtZW50YXRpb24uICBJbW1lZGlhdGVseSwgSSBjYW4gdGVsbCB0aGlzIGlzIGdvaW5nIHRvIHRvdWNoIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHdoaWNoIGlzIGFsd2F5cyBhIHJlZCBmbGFnIGZvciBwb3RlbnRpYWwgaXNzdWVzLiBUaGUgZmFjdCB0aGF0IGl0J3MgcmV3cml0aW5nIHNvIG11Y2ggb2YgYG1tL3N3YXBmaWxlLmNgIOKAkyBhbmQgdGhlbiB0b3VjaGluZyBhbGwgdGhvc2Ugb3RoZXIgaGVhZGVyIGFuZCBzdXBwb3J0aW5nIGZpbGVzIOKAkyAgYGluY2x1ZGUvbGludXgvc3dhcC5oYCwgYGluY2x1ZGUvbGludXgvcGxpc3QuaGAsIGBsaWIvcGxpc3QuY2AsIGFuZCBgbW0vc3dhcC5oYCDigJMgdGVsbHMgbWUgdGhpcyBpc24ndCBqdXN0IGEgbWlub3IgdHdlYWsuICBJdCdzIGEgZ2VudWluZSBhcmNoaXRlY3R1cmFsIGNoYW5nZS4gIFJlbW92aW5nIGBwbGlzdF9yZXF1ZXVlYCBpcyBhIGNsdWUsIHRvby5cblxuVGhpcyBpbnRyb2R1Y3Rpb24gb2YgbmV3IHN0cnVjdHVyZXMgbGlrZSBgc3dhcF9xdWV1ZV9yZWFkZXJzYCwgYHN3YXBfcXVldWVgLCBgc3dhcF9xdWV1ZV9sZW5gLCBgc3dhcF9wcmlvX3JpbmdgLCBhbG9uZyB3aXRoIHRoZSB1c2Ugb2YgYHN3YXBvbl9yd3NlbWAgdG8gcmVwbGFjZSB0aGUgb2xkIGxvY2tpbmcgbWVjaGFuaXNtcywgaW5kaWNhdGVzIGEgcmUtdGhpbmtpbmcgb2YgaG93IHN3YXAgc3BhY2UgaXMgYWxsb2NhdGVkIGFuZCBtYW5hZ2VkLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UsIGEgKm1ham9yKiBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgdmVyeSBjb3JlIG9mIHN3YXAgYWxsb2NhdGlvbiBsb2dpYy5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiVGhpcyBuZWVkcyBzb21lIHNlcmlvdXMgZnV6emluZy5cIiAgR2l2ZW4gdGhlIHBvdGVudGlhbCBmb3IgbWVtb3J5IGNvcnJ1cHRpb24sIHJhY2UgY29uZGl0aW9ucywgb3IgdW5leHBlY3RlZCBiZWhhdmlvciB3aGVuIGludGVyYWN0aW5nIHdpdGggb3RoZXIga2VybmVsIHN1YnN5c3RlbXMsIEkgd2FudCB0byB6ZXJvIGluIG9uIHRoZSBrZXkgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkLiAgTGV0J3Mgc2VlOlxuXG4qICAgYHN3YXBfYWxsb2NfZW50cnlgIChhbmQgaXRzIHJlcGxhY2VtZW50cyBvZiBgc3dhcF9hbGxvY19mYXN0YCBhbmQgYHN3YXBfYWxsb2Nfc2xvd2ApIOKAkyBUaGlzIGlzIG15IHByaW1hcnkgYXJlYSBvZiBpbnRlcmVzdCwgaXQncyB3aGVyZSB0aGUgc3dhcCBlbnRyeSBhbGxvY2F0aW9uIGFjdHVhbGx5IGhhcHBlbnMuXG4qICAgYGZvbGlvX2FsbG9jX3N3YXBgIOKAkyBhbm90aGVyIGNyaXRpY2FsIGVudHJ5IHBvaW50LlxuKiAgIFRoZSBxdWV1ZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zOiBgc3dhcF9xdWV1ZV9hZGRgLCBgc3dhcF9xdWV1ZV9kZWxgLCBgc3dhcF9xdWV1ZV9nZXRfZGV2aWNlYCAtIHRoZXNlIGFyZSB0aGUgcG9pbnRzIG9mIGludGVyYWN0aW9ucyB3aXRoIHRoZSBuZXcgc3RydWN0dXJlcy5cbiogICBgc3dhcF9kZXZpY2VfZW5hYmxlYCwgYHN3YXBfZGV2aWNlX2Rpc2FibGVgIC0gdGhlIHBvaW50cyBvZiBkZXZpY2UgY2hhbmdlIGFyZSBkZWZpbml0ZWx5IHdvcnRoIGNoZWNraW5nLlxuKiAgIGBzeXNfc3dhcG9uYCwgYHN5c19zd2Fwb2ZmYCDigJMgVGhlIHVzZXItc3BhY2UgaW50ZXJmYWNlIGlzIGFsd2F5cyBhIGdvb2QgdGFyZ2V0LlxuKiAgIFRoZSBgc3dhcF9kZXZpY2VfaW51c2VfKmAgZnVuY3Rpb25zIOKAkyB0aGVzZSBhcmUgbGlrZWx5IHRoZSBwbGFjZSB3aGVyZSB0aGUgb2xkIGxvY2tpbmcgd2FzLCB0aGlzIGlzIGFsc28gY3J1Y2lhbC5cbiogICBgYWRkX3RvX2F2YWlsX2xpc3RgLCBgZGVsX2Zyb21fYXZhaWxfbGlzdGAg4oCTIHRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIGxvb2sgYXQgdGhlIG5ldyBsaXN0IG1hbmlwdWxhdGlvbi5cbiogICBUaGUgbmV3IHF1ZXVlIG1hc2sgZnVuY3Rpb25zIGBzd2FwX3F1ZXVlX21hc2tgLCBgc3dhcF9xdWV1ZV91bm1hc2tgXG4qICAgYGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeWBcblxuQWxyaWdodCwgSSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgYW55IHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYXMgd2VsbC4gU2luY2UgdGhpcyBpcyBpbiBgbW0vc3dhcGZpbGUuY2AsIGl0J3MgYWxtb3N0IGNlcnRhaW5seSBjb250cm9sbGVkIGJ5IGBDT05GSUdfU1dBUGAuIEkgc2hvdWxkIGNoZWNrIHRoZSBgbW0vTWFrZWZpbGVgIHRvIGNvbmZpcm0sIGJ1dCB0aGF0J3MgYSBnaXZlbi4gSSBhbSBlYWdlciB0byBnZXQgc3RhcnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU4NjEsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQwMDo0Mzo1NC42NDU4MDIyN1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1ODQxNjI3OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzd2FwZmlsZS5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL01ha2VmaWxlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTc2PWVuZGlmXFxubW0vTWFrZWZpbGUtNzctXFxubW0vTWFrZWZpbGU6Nzg6b2JqLSQoQ09ORklHX1NXQVApXFx0Kz0gcGFnZV9pby5vIHN3YXBfc3RhdGUubyBzd2FwZmlsZS5vXFxubW0vTWFrZWZpbGUtNzktb2JqLSQoQ09ORklHX1pTV0FQKVxcdCs9IHpzd2FwLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMDA6NDM6NTQuNzA0MjI2MDk5WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjMxMjc2NTI0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlIFN3YXAgQ29uZmlndXJhdGlvbiBEZXBlbmRlbmN5KipcblxuQWxyaWdodCwgaXQncyBjbGVhciB0aGF0IGBDT05GSUdfU1dBUGAgaXMgYSBwcmVyZXF1aXNpdGUgaGVyZS4gVGhhdCdzIHRoZSBiYXNlbGluZS4gTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29yZSBsb2dpYyB0aGlzIGNoYW5nZSBpcyB0b3VjaGluZy4gVGhlIG1vc3QgcmVsZXZhbnQgZnVuY3Rpb25zIHNlZW0gdG8gYmUgY2VudGVyZWQgYXJvdW5kIHF1ZXVpbmcsIGRldmljZSBtYW5hZ2VtZW50LCBhbmQgYWxsb2NhdGlvbi4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgYHN3YXBfcXVldWVfYWRkYCwgYHN3YXBfcXVldWVfZGVsYCwgYHN3YXBfcXVldWVfZ2V0X2RldmljZWAsIGBzd2FwX2RldmljZV9lbmFibGVgLCBgc3dhcF9kZXZpY2VfZGlzYWJsZWAsIGBzd2FwX2FsbG9jX2VudHJ5YCwgYHN3YXBfZGV2aWNlX2ludXNlX2FkZGAsIGBzd2FwX2RldmljZV9pbnVzZV9zdWJgLCBgYWRkX3RvX2F2YWlsX2xpc3RgLCBgZGVsX2Zyb21fYXZhaWxfbGlzdGAsIGBzd2FwX3F1ZXVlX21hc2tgLCBhbmQgYHN3YXBfcXVldWVfdW5tYXNrYC4gVGhlc2UgYWxsIHNlZW0gdG8gcmVzaWRlIHdpdGhpbiBgbW0vc3dhcGZpbGUuY2AsIHdoaWNoIG1ha2VzIHNlbnNlLlxuXG5JdCBsb29rcyBsaWtlIHRoZSBjaGFuZ2UgaW50ZXJhY3RzIHdpdGggYENPTkZJR19ISUJFUk5BVElPTmAgdG9vLCBhbHNvIGluIGBtbS9zd2FwZmlsZS5jYCwgYW5kIHRoYXQncyBicmluZ2luZyBpbiBmdW5jdGlvbnMgbGlrZSBgcGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZWAsIGB1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGVgLCBgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGVgLCBgZmluZF9maXJzdF9zd2FwYCwgYW5kIGBjb3VudF9zd2FwX3BhZ2VzYC4gV2hpbGUgaGliZXJuYXRpb24gaXMgaW52b2x2ZWQsIGl0IGFwcGVhcnMgdGhlIGNlbnRyYWwgZm9jdXMgaXMgcmVhbGx5IHRoZSBtZWNoYW5pY3Mgb2Ygc3dhcCBhbGxvY2F0aW9uIGl0c2VsZi4gVGhpcyByZWluZm9yY2VzIG15IGluaXRpYWwgaHVuY2ggYWJvdXQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyBpbnZvbHZlZCwgSSBuZWVkIHRvIGZvY3VzIG9uIHRoaXMgcGFydCB0byBwcm9jZWVkLiBMZXQncyBnZXQgZG93biB0byBzcGVjaWZpY3MsIEkgbmVlZCB0byBwdWxsIHVwIHRoaXMgbGlzdCBvZiBmdW5jdGlvbnMgYWdhaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3MDU5LCJPdXRwdXRUb2tlbnMiOjU2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQ0OjAxLjAxNjk5NDIzMVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTIyOTM4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKHN0YXRpYyApPyhpbnR8dm9pZHxib29sfHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IFxcXFwqKSBbYS16QS1aMC05X10rXFxcXChcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vc3dhcGZpbGUuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwZmlsZS5jLTUwLVxcbm1tL3N3YXBmaWxlLmM6NTE6c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTUyLVxcdFxcdFxcdFxcdCAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpO1xcbm1tL3N3YXBmaWxlLmM6NTM6c3RhdGljIGJvb2wgZm9saW9fc3dhcGNhY2hlX2ZyZWVhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbm1tL3N3YXBmaWxlLmM6NTQ6c3RhdGljIHZvaWQgbW92ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTU1LVxcdFxcdFxcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbm1tL3N3YXBmaWxlLmMtNTYtXFx0XFx0XFx0IGVudW0gc3dhcF9jbHVzdGVyX2ZsYWdzIG5ld19mbGFncyk7XFxubW0vc3dhcGZpbGUuYzo1NzpzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpO1xcbm1tL3N3YXBmaWxlLmMtNTgtXFxuLS1cXG5tbS9zd2FwZmlsZS5jPTIwOD1zdGF0aWMgc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpzd2FwX3F1ZXVlX3ByZWFsbG9jX3JlYWRlcnMoaW50IG5yX3JpbmdzLCBnZnBfdCBnZnApXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTIxOS1cXG5tbS9zd2FwZmlsZS5jOjIyMDpzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnMpXFxubW0vc3dhcGZpbGUuYy0yMjEte1xcbi0tXFxubW0vc3dhcGZpbGUuYz0yNDI9c3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX3F1ZXVlX2dldF9kZXZpY2UobG9uZyBucl9hbGxvYywgaW50IG5yX2l0ZXIpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI4NS1cXG5tbS9zd2FwZmlsZS5jOjI4NjpzdGF0aWMgYm9vbCBzd2FwX3F1ZXVlX2ZpbmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMjg3LVxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgKnJpbmdfaWR4LCB1bnNpZ25lZCBpbnQgKmRldl9pZHgpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMwOS1cXG5tbS9zd2FwZmlsZS5jOjMxMDpzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX21hc2soc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbm1tL3N3YXBmaWxlLmMtMzExLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzE5LVxcbm1tL3N3YXBmaWxlLmM6MzIwOnN0YXRpYyB2b2lkIHN3YXBfcXVldWVfdW5tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTMyMS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMyOS1cXG5tbS9zd2FwZmlsZS5jOjMzMDpzdGF0aWMgaW50IHN3YXBfcXVldWVfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTMzMS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwNS1cXG5tbS9zd2FwZmlsZS5jOjQwNjpzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2RlbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxubW0vc3dhcGZpbGUuYy00MDcte1xcbi0tXFxubW0vc3dhcGZpbGUuYz00ODk9c3RhdGljIGxvbmcgc3dhcF91c2FnZV9pbl9wYWdlcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQ5Ny0gKi9cXG5tbS9zd2FwZmlsZS5jOjQ5ODpzdGF0aWMgdm9pZCBzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTQ5OS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTUwNS1cXG5tbS9zd2FwZmlsZS5jOjUwNjpzdGF0aWMgdm9pZCBzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbm1tL3N3YXBmaWxlLmMtNTA3LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtNTIzLVxcbm1tL3N3YXBmaWxlLmM6NTI0OnN0YXRpYyBib29sIHN3YXBfb25seV9oYXNfY2FjaGUoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwZmlsZS5jLTUyNS1cXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IG5yX3BhZ2VzKVxcbi0tXFxubW0vc3dhcGZpbGUuYy01NDUtICovXFxubW0vc3dhcGZpbGUuYzo1NDY6c3RhdGljIGludCBfX3RyeV90b19yZWNsYWltX3N3YXAoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtNTQ3LVxcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBmbGFncylcXG4tLVxcbm1tL3N3YXBmaWxlLmM9NjE2PXN0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfZXh0ZW50ICpuZXh0X3NlKHN0cnVjdCBzd2FwX2V4dGVudCAqc2UpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTYyNS0gKi9cXG5tbS9zd2FwZmlsZS5jOjYyNjpzdGF0aWMgaW50IGRpc2NhcmRfc3dhcChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxubW0vc3dhcGZpbGUuYy02Mjcte1xcbi0tXFxubW0vc3dhcGZpbGUuYz02Nzk9c2VjdG9yX3Qgc3dhcF9mb2xpb19zZWN0b3Ioc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBmaWxlLmMtNjk1LSAqL1xcbm1tL3N3YXBmaWxlLmM6Njk2OnN0YXRpYyB2b2lkIGRpc2NhcmRfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTY5Ny1cXHRcXHRcXHRcXHQgcGdvZmZfdCBzdGFydF9wYWdlLCBwZ29mZl90IG5yX3BhZ2VzKVxcbi0tXFxubW0vc3dhcGZpbGUuYz03NTU9c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2x1c3Rlcl9vZmZzZXQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbi0tXFxubW0vc3dhcGZpbGUuYy03NjAtXFxubW0vc3dhcGZpbGUuYzo3NjE6c3RhdGljIHZvaWQgc3dhcF9jbHVzdGVyX2ZyZWVfdGFibGVfZm9saW9fcmN1X2NiKHN0cnVjdCByY3VfaGVhZCAqaGVhZClcXG5tbS9zd2FwZmlsZS5jLTc2Mi17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTc2OC1cXG5tbS9zd2FwZmlsZS5jOjc2OTpzdGF0aWMgdm9pZCBzd2FwX2NsdXN0ZXJfZnJlZV90YWJsZShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxcbm1tL3N3YXBmaWxlLmMtNzcwLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtNzk2LVxcbm1tL3N3YXBmaWxlLmM6Nzk3OnN0YXRpYyBpbnQgc3dhcF9jbHVzdGVyX2FsbG9jX3RhYmxlKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIGdmcF90IGdmcClcXG5tbS9zd2FwZmlsZS5jLTc5OC17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTg0NS0gKi9cXG5tbS9zd2FwZmlsZS5jOjg0NjpzdGF0aWMgdm9pZCBzd2FwX2NsdXN0ZXJfYXNzZXJ0X2VtcHR5KHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxubW0vc3dhcGZpbGUuYy04NDctXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IGNpX29mZiwgdW5zaWduZWQgaW50IG5yLFxcbi0tXFxubW0vc3dhcGZpbGUuYz04NzU9c3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmMtOTIzLVxcbm1tL3N3YXBmaWxlLmM6OTI0OnN0YXRpYyB2b2lkIG1vdmVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxubW0vc3dhcGZpbGUuYy05MjUtXFx0XFx0XFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTk0Mi0vKiBBZGQgYSBjbHVzdGVyIHRvIGRpc2NhcmQgbGlzdCBhbmQgc2NoZWR1bGUgaXQgdG8gZG8gZGlzY2FyZCAqL1xcbm1tL3N3YXBmaWxlLmM6OTQzOnN0YXRpYyB2b2lkIHN3YXBfY2x1c3Rlcl9zY2hlZHVsZV9kaXNjYXJkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTk0NC1cXHRcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxcbi0tXFxubW0vc3dhcGZpbGUuYy05NTAtXFxubW0vc3dhcGZpbGUuYzo5NTE6c3RhdGljIHZvaWQgX19mcmVlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxcbm1tL3N3YXBmaWxlLmMtOTUyLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9OTY4PXN0YXRpYyBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmlzb2xhdGVfbG9ja19jbHVzdGVyKFxcbi0tXFxubW0vc3dhcGZpbGUuYy0xMDA3LSAqL1xcbm1tL3N3YXBmaWxlLmM6MTAwODpzdGF0aWMgYm9vbCBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTEwMDkte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0xMDQyLVxcbm1tL3N3YXBmaWxlLmM6MTA0MzpzdGF0aWMgdm9pZCBzd2FwX2Rpc2NhcmRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxubW0vc3dhcGZpbGUuYy0xMDQ0LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTA1MS1cXG5tbS9zd2FwZmlsZS5jOjEwNTI6c3RhdGljIHZvaWQgc3dhcF91c2Vyc19yZWZfZnJlZShzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmKVxcbm1tL3N3YXBmaWxlLmMtMTA1My17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTEwNjMtICovXFxubW0vc3dhcGZpbGUuYzoxMDY0OnN0YXRpYyB2b2lkIGZyZWVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXFxubW0vc3dhcGZpbGUuYy0xMDY1LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTA4Ny0gKi9cXG5tbS9zd2FwZmlsZS5jOjEwODg6c3RhdGljIHZvaWQgcGFydGlhbF9mcmVlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTA4OS1cXHRcXHRcXHRcXHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSlcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTEwMy0gKi9cXG5tbS9zd2FwZmlsZS5jOjExMDQ6c3RhdGljIHZvaWQgcmVsb2NhdGVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxubW0vc3dhcGZpbGUuYy0xMTA1LVxcdFxcdFxcdCAgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSlcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTEzMS0gKi9cXG5tbS9zd2FwZmlsZS5jOjExMzI6c3RhdGljIGludCBzd2FwX2NsdXN0ZXJfc2V0dXBfYmFkX3Nsb3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTEzMy1cXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTExODEtICovXFxubW0vc3dhcGZpbGUuYzoxMTgyOnN0YXRpYyBib29sIGNsdXN0ZXJfcmVjbGFpbV9yYW5nZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxubW0vc3dhcGZpbGUuYy0xMTgzLVxcdFxcdFxcdFxcdCAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTIyOC1cXG5tbS9zd2FwZmlsZS5jOjEyMjk6c3RhdGljIGJvb2wgY2x1c3Rlcl9zY2FuX3JhbmdlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTEyMzAtXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTEyNTUtXFxubW0vc3dhcGZpbGUuYzoxMjU2OnN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTI1Ny1cXHRcXHRcXHRcXHRcXHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MTM1OD1zdGF0aWMgdW5zaWduZWQgaW50IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTM3OS1cXG5tbS9zd2FwZmlsZS5jOjEzODA6c3RhdGljIHZvaWQgc3dhcF9yZWNsYWltX2Z1bGxfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIGZvcmNlKVxcbm1tL3N3YXBmaWxlLmMtMTM4MS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE0MjEtXFxubW0vc3dhcGZpbGUuYzoxNDIyOnN0YXRpYyB2b2lkIHN3YXBfcmVjbGFpbV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG5tbS9zd2FwZmlsZS5jLTE0MjMte1xcbi0tXFxubW0vc3dhcGZpbGUuYz0xNDM1PXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE1MzctLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBzZXQgYnkgdGhpcyBoZWxwZXIuICovXFxubW0vc3dhcGZpbGUuYzoxNTM4OnN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpXFxubW0vc3dhcGZpbGUuYy0xNTM5LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTU2NS0vKiBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGNhbiBvbmx5IGJlIGNsZWFyZWQgYnkgdGhpcyBoZWxwZXIuICovXFxubW0vc3dhcGZpbGUuYzoxNTY2OnN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTE1Njcte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0xNjEwLSAqL1xcbm1tL3N3YXBmaWxlLmM6MTYxMTpzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTYxMi1cXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxcbi0tXFxubW0vc3dhcGZpbGUuYy0xNjI5LVxcbm1tL3N3YXBmaWxlLmM6MTYzMDpzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9zdWIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcXG5tbS9zd2FwZmlsZS5jLTE2MzEtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcylcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTY2OC1cXG5tbS9zd2FwZmlsZS5jOjE2Njk6c3RhdGljIGJvb2wgZ2V0X3N3YXBfZGV2aWNlX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbm1tL3N3YXBmaWxlLmMtMTY3MC17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE2ODQtXFxubW0vc3dhcGZpbGUuYzoxNjg1OnN0YXRpYyBpbnQgc3dhcF9hbGxvY19lbnRyeShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbm1tL3N3YXBmaWxlLmMtMTY4Ni17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE3MjAtXFxubW0vc3dhcGZpbGUuYzoxNzIxOnN0YXRpYyBpbnQgc3dhcF9leHRlbmRfdGFibGVfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTcyMi1cXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbi0tXFxubW0vc3dhcGZpbGUuYy0xNzU2LVxcbm1tL3N3YXBmaWxlLmM6MTc1NzppbnQgc3dhcF9yZXRyeV90YWJsZV9hbGxvYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwKVxcbm1tL3N3YXBmaWxlLmMtMTc1OC17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE3NzQtXFxubW0vc3dhcGZpbGUuYzoxNzc1OnN0YXRpYyB2b2lkIHN3YXBfZXh0ZW5kX3RhYmxlX3RyeV9mcmVlKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXFxubW0vc3dhcGZpbGUuYy0xNzc2LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTc5NC0vKiBEZWNyZWFzZSB0aGUgc3dhcCBjb3VudCBvZiBvbmUgc2xvdCwgd2l0aG91dCBmcmVlaW5nIGl0ICovXFxubW0vc3dhcGZpbGUuYzoxNzk1OnN0YXRpYyB2b2lkIF9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXBmaWxlLmMtMTc5Ni1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGNpX29mZilcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTg0NS0gKi9cXG5tbS9zd2FwZmlsZS5jOjE4NDY6c3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTE4NDctXFx0XFx0XFx0XFx0ICAgICBwZ29mZl90IG9mZnNldCwgaW50IG5yLFxcbi0tXFxubW0vc3dhcGZpbGUuYy0xOTAyLS8qIEluY3JlYXNlIHRoZSBzd2FwIGNvdW50IG9mIG9uZSBzbG90LiAqL1xcbm1tL3N3YXBmaWxlLmM6MTkwMzpzdGF0aWMgaW50IF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXBmaWxlLmMtMTkwNC1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGNpX29mZilcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTk1Mi0gKi9cXG5tbS9zd2FwZmlsZS5jOjE5NTM6c3RhdGljIGludCBzd2FwX2R1cF9lbnRyaWVzX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTk1NC1cXHRcXHRcXHRcXHQgICAgcGdvZmZfdCBvZmZzZXQsIGludCBucilcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTk5Ny0gKi9cXG5tbS9zd2FwZmlsZS5jOjE5OTg6aW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS9zd2FwZmlsZS5jLTE5OTkte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yMDUzLSAqL1xcbm1tL3N3YXBmaWxlLmM6MjA1NDppbnQgZm9saW9fZHVwX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXFxubW0vc3dhcGZpbGUuYy0yMDU1LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjA3OS0gKi9cXG5tbS9zd2FwZmlsZS5jOjIwODA6dm9pZCBmb2xpb19wdXRfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSlcXG5tbS9zd2FwZmlsZS5jLTIwODEte1xcbi0tXFxubW0vc3dhcGZpbGUuYz0yMTM0PXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpnZXRfc3dhcF9kZXZpY2Uoc3dwX2VudHJ5X3QgZW50cnkpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTIxNjQtICovXFxubW0vc3dhcGZpbGUuYzoyMTY1OnZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTIxNjYtXFx0XFx0XFx0XFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTIyMTUtXFxubW0vc3dhcGZpbGUuYzoyMjE2OmludCBfX3N3YXBfY291bnQoc3dwX2VudHJ5X3QgZW50cnkpXFxubW0vc3dhcGZpbGUuYy0yMjE3LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjIyOC0gKi9cXG5tbS9zd2FwZmlsZS5jOjIyMjk6Ym9vbCBzd2FwX2VudHJ5X3N3YXBwZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzd3BfZW50cnlfdCBlbnRyeSlcXG5tbS9zd2FwZmlsZS5jLTIyMzAte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yMjQ1LSAqL1xcbm1tL3N3YXBmaWxlLmM6MjI0NjppbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSlcXG5tbS9zd2FwZmlsZS5jLTIyNDcte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yMjc4LSAqL1xcbm1tL3N3YXBmaWxlLmM6MjI3OTpzdGF0aWMgYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxubW0vc3dhcGZpbGUuYy0yMjgwLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjMwNy1cXG5tbS9zd2FwZmlsZS5jOjIzMDg6c3RhdGljIGJvb2wgZm9saW9fc3dhcGNhY2hlX2ZyZWVhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxubW0vc3dhcGZpbGUuYy0yMzA5LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjM0Ni0gKi9cXG5tbS9zd2FwZmlsZS5jOjIzNDc6Ym9vbCBmb2xpb19mcmVlX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS9zd2FwZmlsZS5jLTIzNDgte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yMzcxLSAqL1xcbm1tL3N3YXBmaWxlLmM6MjM3Mjp2b2lkIHN3YXBfcHV0X2VudHJpZXNfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5LCBpbnQgbnIpXFxubW0vc3dhcGZpbGUuYy0yMzczLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MjQwNz1zd3BfZW50cnlfdCBzd2FwX2FsbG9jX2hpYmVybmF0aW9uX3Nsb3QoaW50IHR5cGUpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI0MjktICovXFxubW0vc3dhcGZpbGUuYzoyNDMwOnZvaWQgc3dhcF9mcmVlX2hpYmVybmF0aW9uX3Nsb3Qoc3dwX2VudHJ5X3QgZW50cnkpXFxubW0vc3dhcGZpbGUuYy0yNDMxLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjQ0NC1cXG5tbS9zd2FwZmlsZS5jOjI0NDU6c3RhdGljIGludCBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbm1tL3N3YXBmaWxlLmMtMjQ0Ni17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI0NzgtICovXFxubW0vc3dhcGZpbGUuYzoyNDc5OmludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbm1tL3N3YXBmaWxlLmMtMjQ4MC17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI1MjEtICovXFxubW0vc3dhcGZpbGUuYzoyNTIyOnZvaWQgdW5waW5faGliZXJuYXRpb25fc3dhcF90eXBlKGludCB0eXBlKVxcbm1tL3N3YXBmaWxlLmMtMjUyMy17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI1NTAtICovXFxubW0vc3dhcGZpbGUuYzoyNTUxOmludCBmaW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldClcXG5tbS9zd2FwZmlsZS5jLTI1NTIte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yNTYxLVxcbm1tL3N3YXBmaWxlLmM6MjU2MjppbnQgZmluZF9maXJzdF9zd2FwKGRldl90ICpkZXZpY2UpXFxubW0vc3dhcGZpbGUuYy0yNTYzLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MjYxOT1zdGF0aWMgaW5saW5lIGludCBwdGVfc2FtZV9hc19zd3AocHRlX3QgcHRlLCBwdGVfdCBzd3BfcHRlKVxcbi0tXFxubW0vc3dhcGZpbGUuYy0yNjI4LSAqL1xcbm1tL3N3YXBmaWxlLmM6MjYyOTpzdGF0aWMgaW50IHVudXNlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcXG5tbS9zd2FwZmlsZS5jLTI2MzAtXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjc0MS1cXG5tbS9zd2FwZmlsZS5jOjI3NDI6c3RhdGljIGludCB1bnVzZV9wdGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxubW0vc3dhcGZpbGUuYy0yNzQzLVxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXFxuLS1cXG5tbS9zd2FwZmlsZS5jPTI4NTA9c3RhdGljIGlubGluZSBpbnQgdW51c2VfcDRkX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ2RfdCAqcGdkLFxcbi0tXFxubW0vc3dhcGZpbGUuYy0yODY5LVxcbm1tL3N3YXBmaWxlLmM6Mjg3MDpzdGF0aWMgaW50IHVudXNlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgaW50IHR5cGUpXFxubW0vc3dhcGZpbGUuYy0yODcxLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjg5MC1cXG5tbS9zd2FwZmlsZS5jOjI4OTE6c3RhdGljIGludCB1bnVzZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgaW50IHR5cGUpXFxubW0vc3dhcGZpbGUuYy0yODkyLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MjkxOT1zdGF0aWMgdW5zaWduZWQgaW50IGZpbmRfbmV4dF90b191bnVzZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI5NDUtXFxubW0vc3dhcGZpbGUuYzoyOTQ2OnN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKVxcbm1tL3N3YXBmaWxlLmMtMjk0Ny17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMwNTMtICovXFxubW0vc3dhcGZpbGUuYzozMDU0OnN0YXRpYyB2b2lkIGRyYWluX21tbGlzdCh2b2lkKVxcbm1tL3N3YXBmaWxlLmMtMzA1NS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMwNzItICovXFxubW0vc3dhcGZpbGUuYzozMDczOnN0YXRpYyB2b2lkIGRlc3Ryb3lfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXFxubW0vc3dhcGZpbGUuYy0zMDc0LVxcdFxcdFxcdFxcdCBzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlKVxcbi0tXFxubW0vc3dhcGZpbGUuYz0zMTM4PUVYUE9SVF9TWU1CT0xfR1BMKGFkZF9zd2FwX2V4dGVudCk7XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMxNjYtICovXFxubW0vc3dhcGZpbGUuYzozMTY3OnN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXFxubW0vc3dhcGZpbGUuYy0zMTY4LVxcdFxcdFxcdCAgICAgIHN0cnVjdCBmaWxlICpzd2FwX2ZpbGUsIHNlY3Rvcl90ICpzcGFuKVxcbi0tXFxubW0vc3dhcGZpbGUuYy0zMTk5LSAqL1xcbm1tL3N3YXBmaWxlLmM6MzIwMDpzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9lbmFibGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbm1tL3N3YXBmaWxlLmMtMzIwMS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMyMTItXFxubW0vc3dhcGZpbGUuYzozMjEzOnN0YXRpYyBpbnQgc3dhcF9kZXZpY2VfZGlzYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxubW0vc3dhcGZpbGUuYy0zMjE0LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzI1Ni1cXG5tbS9zd2FwZmlsZS5jOjMyNTc6c3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcXG5tbS9zd2FwZmlsZS5jLTMyNTgtXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MzQyOT1zdGF0aWMgdm9pZCAqc3dhcF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTM0NDgtXFxubW0vc3dhcGZpbGUuYzozNDQ5OnN0YXRpYyB2b2lkIHN3YXBfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXFxubW0vc3dhcGZpbGUuYy0zNDUwLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzQ1My1cXG5tbS9zd2FwZmlsZS5jOjM0NTQ6c3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxcbm1tL3N3YXBmaWxlLmMtMzQ1NS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jPTM0ODE9c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzd2Fwc19vcCA9IHtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzQ4Ny1cXG5tbS9zd2FwZmlsZS5jOjM0ODg6c3RhdGljIGludCBzd2Fwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbm1tL3N3YXBmaWxlLmMtMzQ4OS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jPTM1Mjg9c3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICphbGxvY19zd2FwX2luZm8odm9pZClcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzU4NC1cXG5tbS9zd2FwZmlsZS5jOjM1ODU6c3RhdGljIGludCBjbGFpbV9zd2FwZmlsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxubW0vc3dhcGZpbGUuYy0zNTg2LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MzY0Mj1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzcwMy1cXG5tbS9zd2FwZmlsZS5jOjM3MDQ6c3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMzcwNS1cXHRcXHRcXHRcXHQgICAgdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxcbi0tXFxubW0vc3dhcGZpbGUuYz0zNzk3PVNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwMzAtXFxubW0vc3dhcGZpbGUuYzo0MDMxOnZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbClcXG5tbS9zd2FwZmlsZS5jLTQwMzIte1xcbi0tXFxubW0vc3dhcGZpbGUuYy00MDU5LSAqL1xcbm1tL3N3YXBmaWxlLmM6NDA2MDppbnQgc3dhcF9kdXBfZW50cnlfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5KVxcbm1tL3N3YXBmaWxlLmMtNDA2MS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwODAtI2lmIGRlZmluZWQoQ09ORklHX01FTUNHKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19CTEtfQ0dST1VQKVxcbm1tL3N3YXBmaWxlLmM6NDA4MTpzdGF0aWMgYm9vbCBfX2hhc191c2FibGVfc3dhcCh2b2lkKVxcbm1tL3N3YXBmaWxlLmMtNDA4Mi17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwODUtXFxubW0vc3dhcGZpbGUuYzo0MDg2OnZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXFxubW0vc3dhcGZpbGUuYy00MDg3LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMDA6NDQ6MDEuMDc4MjI4NDZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMjI4MTkyNzI3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciBUaGlzIFN3YXAgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgc2NhbiBoYXMgaGlnaGxpZ2h0ZWQgYSBoYW5kZnVsIG9mIGZ1bmN0aW9ucyBhcyBwb3RlbnRpYWwgaG90c3BvdHMgaW4gdGhpcyBzd2FwIGltcGxlbWVudGF0aW9uLiBHaXZlbiB0aGUgYXJjaGl0ZWN0dXJhbCBjaGFuZ2UgZGVzY3JpYmVkIOKAkyBtb3ZpbmcgZnJvbSBhIGBwbGlzdGAgdG8gYSByb3VuZC1yb2JpbiBxdWV1ZSDigJMgSSBuZWVkIHRvIHBpbnBvaW50IHRoZSBhcmVhcyB3aGVyZSB0aGlzIG5ldyBsb2dpYyBpcyBpbnRyb2R1Y2VkIGFuZCBpbnRlcmFjdHMgd2l0aCB0aGUgZXhpc3Rpbmcgc3dhcCBmcmFtZXdvcmsuXG5cbkknbSB6ZXJvaW5nIGluIG9uIGEgZmV3IGtleSBmdW5jdGlvbnM6IGBzd2FwX2FsbG9jX2VudHJ5YCBsb29rcyBsaWtlIHRoZSBuZXcgY29yZSBmb3IgYWxsb2NhdGlvbiwgcmVwbGFjaW5nIHNvbWUgb2YgdGhlIG9sZGVyIGxvZ2ljLiBJJ20gYWxzbyBwdXR0aW5nIGEgcGluIG9uIGBzd2FwX3F1ZXVlX2FkZGAsIGBzd2FwX3F1ZXVlX2RlbGAsIGBzd2FwX3F1ZXVlX2dldF9kZXZpY2VgLCBgc3dhcF9kZXZpY2VfZW5hYmxlYCwgYW5kIGBzd2FwX2RldmljZV9kaXNhYmxlYCBhcyB0aGVzZSBzZWVtIHRvIGJlIHRoZSBwcmltYXJ5IGludGVyYWN0aW9ucyB3aXRoIHRoZSBuZXcgcXVldWUgbWVjaGFuaXNtLiBUaGUgaW4tdXNlIGNvdW50ZXJzLCBgc3dhcF9kZXZpY2VfaW51c2VfYWRkYCBhbmQgYHN3YXBfZGV2aWNlX2ludXNlX3N1YmAsIGFyZSBjcnVjaWFsIGZvciBlbnN1cmluZyBjb3JyZWN0bmVzcyBhcyB3ZWxsIGFzIHRoZSBsaXN0IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgYGFkZF90b19hdmFpbF9saXN0YCwgYGRlbF9mcm9tX2F2YWlsX2xpc3RgLCBgc3dhcF9xdWV1ZV9tYXNrYCwgYHN3YXBfcXVldWVfdW5tYXNrYCBhbmQgYGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeWAgYXJlIGFsc28gZXNzZW50aWFsLlxuXG5JJ20gZmlsdGVyaW5nIG91dCBgZm9saW9fYWxsb2Nfc3dhcGAsIGFzIGludGVyZXN0aW5nIGFzIGl0IG1heSBiZSwgYmVjYXVzZSBJIHN1c3BlY3QgaXQgaXMgYSBtb3JlIGdlbmVyaWMgaG90IHBhdGgsIHdoaWNoLCB3aGlsZSBpbXBvcnRhbnQgZm9yIHBlcmZvcm1hbmNlLCB3b24ndCBuZWNlc3NhcmlseSBleHBvc2UgdGhlIGNvcmUgbG9naWMgY2hhbmdlcyBJJ20gYWZ0ZXIuIGBzd2FwX2FsbG9jX2VudHJ5YCBsb29rcyBsaWtlIGEgYmV0dGVyIHRhcmdldC5cblxuTm93LCBsZXQncyBjb25maXJtIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIGBDT05GSUdfU1dBUGAgc2VlbXMgdG8gYmUgdGhlIG1haW4gZHJpdmVyLiBJJ20gcXVpY2tseSB2ZXJpZnlpbmcgdGhhdCBgbW0vc3dhcGZpbGUuY2AgaXMgY29tcGlsZWQgd2hlbiB0aGF0J3MgZW5hYmxlZC4gWWVwLCB0aGF0IGNvbmZpcm1zIGl0LlxuXG5UaGVyZWZvcmUsIGZvciB0aGlzIGZ1enppbmcgZWZmb3J0LCBJJ20gZ29pbmcgdG8gc2V0IGBXb3J0aEZ1enppbmdgIHRvIGB0cnVlYCBnaXZlbiB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UgYW5kIGl0cyBpbXBhY3Qgb24gY29yZSBrZXJuZWwgc3dhcCBsb2dpYy4gVGhlIGBGb2N1c1N5bWJvbHNgIGFyZTpcblxuKiAgIGBzd2FwX2FsbG9jX2VudHJ5YFxuKiAgIGBzd2FwX3F1ZXVlX2FkZGBcbiogICBgc3dhcF9xdWV1ZV9kZWxgXG4qICAgYHN3YXBfcXVldWVfZ2V0X2RldmljZWBcbiogICBgc3dhcF9kZXZpY2VfZW5hYmxlYFxuKiAgIGBzd2FwX2RldmljZV9kaXNhYmxlYFxuKiAgIGBzd2FwX2RldmljZV9pbnVzZV9hZGRgXG4qICAgYHN3YXBfZGV2aWNlX2ludXNlX3N1YmBcbiogICBgYWRkX3RvX2F2YWlsX2xpc3RgXG4qICAgYGRlbF9mcm9tX2F2YWlsX2xpc3RgXG4qICAgYHN3YXBfcXVldWVfbWFza2BcbiogICBgc3dhcF9xdWV1ZV91bm1hc2tgXG4qICAgYGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeWBcblxuQW5kIEknbGwgZW5hYmxlIG9ubHkgYFNXQVBgIHRvIGJ1aWxkIHRoZSBrZXJuZWwgaW1hZ2UuXG5NeSByZWFzb25pbmcgaXMgdGhhdCB0aGUgaW50cm9kdWN0aW9uIG9mIGEgbmV3IHJvdW5kLXJvYmluIHF1ZXVlLCBhbmQgaXRzIGFzc29jaWF0ZWQgbWFuYWdlbWVudCBmdW5jdGlvbnMsIGludHJvZHVjZXMgbmV3IGNvZGUgdGhhdCBuZWVkcyBjYXJlZnVsIGZ1enppbmcuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIHN1YnRsZSBidWdzIGluIHRoZSBrZXJuZWwncyBtZW1vcnkgbWFuYWdlbWVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzM4MDUsIk91dHB1dFRva2VucyI6MTk5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTc4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQ0OjEzLjM2MDE1Nzk2OVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODc2NTI4MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzd2FwX2FsbG9jX2VudHJ5XCIsXG4gICAgXCJzd2FwX3F1ZXVlX2FkZFwiLFxuICAgIFwic3dhcF9xdWV1ZV9kZWxcIixcbiAgICBcInN3YXBfcXVldWVfZ2V0X2RldmljZVwiLFxuICAgIFwic3dhcF9kZXZpY2VfZW5hYmxlXCIsXG4gICAgXCJzd2FwX2RldmljZV9kaXNhYmxlXCIsXG4gICAgXCJzd2FwX2RldmljZV9pbnVzZV9hZGRcIixcbiAgICBcInN3YXBfZGV2aWNlX2ludXNlX3N1YlwiLFxuICAgIFwiYWRkX3RvX2F2YWlsX2xpc3RcIixcbiAgICBcImRlbF9mcm9tX2F2YWlsX2xpc3RcIixcbiAgICBcInN3YXBfcXVldWVfbWFza1wiLFxuICAgIFwic3dhcF9xdWV1ZV91bm1hc2tcIixcbiAgICBcImNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic3dhcF9hbGxvY19lbnRyeVwiLFxuICAgIFwic3dhcF9xdWV1ZV9hZGRcIixcbiAgICBcInN3YXBfcXVldWVfZGVsXCIsXG4gICAgXCJzd2FwX3F1ZXVlX2dldF9kZXZpY2VcIixcbiAgICBcInN3YXBfZGV2aWNlX2VuYWJsZVwiLFxuICAgIFwic3dhcF9kZXZpY2VfZGlzYWJsZVwiLFxuICAgIFwic3dhcF9kZXZpY2VfaW51c2VfYWRkXCIsXG4gICAgXCJzd2FwX2RldmljZV9pbnVzZV9zdWJcIixcbiAgICBcImFkZF90b19hdmFpbF9saXN0XCIsXG4gICAgXCJkZWxfZnJvbV9hdmFpbF9saXN0XCIsXG4gICAgXCJzd2FwX3F1ZXVlX21hc2tcIixcbiAgICBcInN3YXBfcXVldWVfdW5tYXNrXCIsXG4gICAgXCJjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnlcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXBsYWNlcyB0aGUgcGxpc3QtYmFzZWQgc3dhcCBkZXZpY2UgcXVldWUgd2l0aCBhIGN1c3RvbSByb3VuZC1yb2JpbiBxdWV1ZSwgaW50cm9kdWNpbmcgbmV3IGNvcmUgbG9naWMgZm9yIHN3YXAgYWxsb2NhdGlvbiBhbmQgZGV2aWNlIG1hbmFnZW1lbnQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-14 00:09:04 +0000 UTC FinishedAt: 2026-07-14 00:44:15 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SWAP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SWAP" ], "series_id": "cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "swap_alloc_entry", "swap_queue_add", "swap_queue_del", "swap_queue_get_device", "swap_device_enable", "swap_device_disable", "swap_device_inuse_add", "swap_device_inuse_sub", "add_to_avail_list", "del_from_avail_list", "swap_queue_mask", "swap_queue_unmask", "cluster_alloc_swap_entry" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAwOjQzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzd2FwX2FsbG9jX2VudHJ5JiMzNDssCiAgICAmIzM0O3N3YXBfcXVldWVfYWRkJiMzNDssCiAgICAmIzM0O3N3YXBfcXVldWVfZGVsJiMzNDssCiAgICAmIzM0O3N3YXBfcXVldWVfZ2V0X2RldmljZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9lbmFibGUmIzM0OywKICAgICYjMzQ7c3dhcF9kZXZpY2VfZGlzYWJsZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9pbnVzZV9hZGQmIzM0OywKICAgICYjMzQ7c3dhcF9kZXZpY2VfaW51c2Vfc3ViJiMzNDssCiAgICAmIzM0O2FkZF90b19hdmFpbF9saXN0JiMzNDssCiAgICAmIzM0O2RlbF9mcm9tX2F2YWlsX2xpc3QmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9tYXNrJiMzNDssCiAgICAmIzM0O3N3YXBfcXVldWVfdW5tYXNrJiMzNDssCiAgICAmIzM0O2NsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXBsYWNlcyB0aGUgcGxpc3QtYmFzZWQgc3dhcCBkZXZpY2UgcXVldWUgd2l0aCBhIGN1c3RvbSByb3VuZC1yb2JpbiBxdWV1ZSwgaW50cm9kdWNpbmcgbmV3IGNvcmUgbG9naWMgZm9yIHN3YXAgYWxsb2NhdGlvbiBhbmQgZGV2aWNlIG1hbmFnZW1lbnQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMDA6NDM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5ZjM0OTM2NWUwZWIxZmUyMTI4YTg0ODRiYjRjYTY1MWYxZGJkMmEyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBKdWwgMTQgMDA6NDM6NDQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGlzdC5oIGIvaW5jbHVkZS9saW51eC9wbGlzdC5oXG5pbmRleCAxNmNmNDM1NWI1YzEzMS4uNzNkMzU5YzFhMDUzNmEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BsaXN0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvcGxpc3QuaFxuQEAgLTEzMiw4ICYjNDM7MTMyLDYgQEAgc3RhdGljIGlubGluZSB2b2lkIHBsaXN0X25vZGVfaW5pdChzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgaW50IHByaW8pXG4gZXh0ZXJuIHZvaWQgcGxpc3RfYWRkKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XG4gZXh0ZXJuIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XG4gXG4tZXh0ZXJuIHZvaWQgcGxpc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpO1xuLVxuIC8qKlxuICAqIHBsaXN0X2Zvcl9lYWNoIC0gaXRlcmF0ZSBvdmVyIHRoZSBwbGlzdFxuICAqIEBwb3M6XHR0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlclxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcbmluZGV4IDY5NmVkMDE3MDljMmJhLi4wNDc2NzU0MDk3MmI4MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTE5NCw2ICYjNDM7MTk0LDIyIEBAIHN0cnVjdCBzd2FwX2V4dGVudCB7XG4gXHQoKG9mZnNldG9mKHVuaW9uIHN3YXBfaGVhZGVyLCBtYWdpYy5tYWdpYykgLSBcXFxuIFx0ICBvZmZzZXRvZih1bmlvbiBzd2FwX2hlYWRlciwgaW5mby5iYWRwYWdlcykpIC8gc2l6ZW9mKGludCkpXG4gXG4mIzQzOy8qXG4mIzQzOyAqIFN3YXAgZGV2aWNlIGZsYWdzLCBleGNlcHQgdGhlIG9uZXMgZG9jdW1lbnRlZCBiZWxvdywgYWxsIGFyZSBpbW11dGFibGVcbiYjNDM7ICogYWZ0ZXIgZXhwb3NlZCBieSBzd2FwX2RldmljZV9lbmFibGUsIGFuZCB1bnRpbCB0aGUgZGV2aWNlIGlzIGZyZWVkIGFnYWluXG4mIzQzOyAqIChTV1BfVVNFRCB1bnNldCkuIFRoZSBleGNlcHRpb25zIGFyZSBhbGwgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbTpcbiYjNDM7ICogLSBTV1BfVVNFRDogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIHRoZSBkZXZpY2UgaXMgaW51c2UuIE9uY2VcbiYjNDM7ICogICBzZXQsIHdvbiYjMzk7dCBiZSBjbGVhcmVkIHVubGVzcyBhbGwgcmVmZXJlbmNlIHRvIHRoaXMgZGV2aWNlIGlzIGZyZWVkIGFuZFxuJiM0MzsgKiAgIHN3YXBvZmYgZmluaXNoZWQuXG4mIzQzOyAqIC0gU1dQX1dSSVRFT0s6IFByb3RlY3RlZCBieSBib3RoIHN3YXBvbl9yd3NlbSBhbmQgc3dhcF9hdmFpbF9sb2NrLCBjbGVhcmluZ1xuJiM0MzsgKiAgIHRoaXMgZmxhZyBhbHNvIHdhaXRzIGZvciBhbGwgY3VycmVudCBjbHVzdGVyIGxvY2sgdXNlcnMgdG8gZXhpdCBzb1xuJiM0MzsgKiAgIGNoZWNraW5nIHRoaXMgZmxhZyB3aGlsZSBob2xkaW5nIGFueSBvZiB0aGVzZSBsb2NrcyBlbnN1cmVzIHRoZSBkZXZpY2VcbiYjNDM7ICogICBpcyBzYWZlIHRvIHVzZSBhdCB0aGUgbW9tZW50LiBOb3RlOiBjbGVhcmluZyB0aGlzIGZsYWcgZG9lc24mIzM5O3QgYWZmZWN0XG4mIzQzOyAqICAgcGVuZGluZyBJTyBvciBhc3luYyByZXF1ZXN0cywgaXQgb25seSBwcmV2ZW50cyBmdXJ0aGVyIGVudHJ5IGFsbG9jYXRpb25cbiYjNDM7ICogICBvciBuZXcgYXN5bmMgcmVxdWVzdCAoZS5nLiBkaXNjYXJkKSBmcm9tIGluaXRpYXRpbmcuXG4mIzQzOyAqIC0gU1dQX0hJQkVSTkFUSU9OOiBQcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtLiBJbmRpY2F0ZXMgaWYgdGhlIGRldmljZVxuJiM0MzsgKiAgIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uXG4mIzQzOyAqL1xuIGVudW0ge1xuIFx0U1dQX1VTRURcdD0gKDEgXHUwMDNjXHUwMDNjIDApLFx0LyogaXMgc2xvdCBpbiBzd2FwX2luZm9bXSB1c2VkPyAqL1xuIFx0U1dQX1dSSVRFT0tcdD0gKDEgXHUwMDNjXHUwMDNjIDEpLFx0Lyogb2sgdG8gd3JpdGUgdG8gdGhpcyBzd2FwP1x0Ki9cbkBAIC0yMzAsMTAgJiM0MzsyNDYsMTcgQEAgZW51bSB7XG4gI2VuZGlmXG4gXG4gLypcbi0gKiBXZSBrZWVwIHVzaW5nIHNhbWUgY2x1c3RlciBmb3Igcm90YXRpb25hbCBkZXZpY2Ugc28gSU8gd2lsbCBiZSBzZXF1ZW50aWFsLlxuLSAqIFRoZSBwdXJwb3NlIGlzIHRvIG9wdGltaXplIFNXQVAgdGhyb3VnaHB1dCBvbiB0aGVzZSBkZXZpY2UuXG4mIzQzOyAqIFdlIGFzc2lnbiBhIGNsdXN0ZXIgdG8gZWFjaCBDUFUsIHNvIGVhY2ggQ1BVIGNhbiBhbGxvY2F0ZSBzd2FwIGVudHJ5IGZyb21cbiYjNDM7ICogaXRzIG93biBjbHVzdGVyIGFuZCBzd2Fwb3V0IHNlcXVlbnRpYWxseS4gVGhlIHB1cnBvc2UgaXMgdG8gb3B0aW1pemUgc3dhcG91dFxuJiM0MzsgKiB0aHJvdWdocHV0LlxuICAqL1xuJiM0MztzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIge1xuJiM0MztcdGxvY2FsX2xvY2tfdCBsb2NrOyAvKiBQcm90ZWN0IHRoZSBwZXJjcHVfY2x1c3RlciBhYm92ZSAqL1xuJiM0MztcdHVuc2lnbmVkIGludCBuZXh0W1NXQVBfTlJfT1JERVJTXTsgLyogTGlrZWx5IG5leHQgYWxsb2NhdGlvbiBvZmZzZXQgKi9cbiYjNDM7fTtcbiYjNDM7XG4gc3RydWN0IHN3YXBfc2VxdWVudGlhbF9jbHVzdGVyIHtcbiYjNDM7XHRzcGlubG9ja190IGxvY2s7IC8qIFNlcmlhbGl6ZSB1c2FnZSBvZiBnbG9iYWwgY2x1c3RlciAqL1xuIFx0dW5zaWduZWQgaW50IG5leHRbU1dBUF9OUl9PUkRFUlNdOyAvKiBMaWtlbHkgbmV4dCBhbGxvY2F0aW9uIG9mZnNldCAqL1xuIH07XG4gXG5AQCAtMjQ0LDcgJiM0MzsyNjcsNiBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7XG4gXHRzdHJ1Y3QgcGVyY3B1X3JlZiB1c2VycztcdC8qIGluZGljYXRlIGFuZCBrZWVwIHN3YXAgZGV2aWNlIHZhbGlkLiAqL1xuIFx0dW5zaWduZWQgbG9uZ1x0ZmxhZ3M7XHRcdC8qIFNXUF9VU0VEIGV0Yzogc2VlIGFib3ZlICovXG4gXHRzaWduZWQgc2hvcnRcdHByaW87XHRcdC8qIHN3YXAgcHJpb3JpdHkgb2YgdGhpcyB0eXBlICovXG4tXHRzdHJ1Y3QgcGxpc3Rfbm9kZSBsaXN0O1x0XHQvKiBlbnRyeSBpbiBzd2FwX2FjdGl2ZV9oZWFkICovXG4gXHRzaWduZWQgY2hhclx0dHlwZTtcdFx0Lyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqL1xuIFx0dW5zaWduZWQgaW50XHRtYXg7XHRcdC8qIHNpemUgb2YgdGhpcyBzd2FwIGRldmljZSAqL1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87IC8qIGNsdXN0ZXIgaW5mby4gT25seSBmb3IgU1NEICovXG5AQCAtMjU2LDI2ICYjNDM7Mjc4LDIwIEBAIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHtcbiBcdFx0XHRcdFx0LyogbGlzdCBvZiBjbHVzdGVyIHRoYXQgYXJlIGZyYWdtZW50ZWQgb3IgY29udGVudGVkICovXG4gXHR1bnNpZ25lZCBpbnQgcGFnZXM7XHRcdC8qIHRvdGFsIG9mIHVzYWJsZSBwYWdlcyBvZiBzd2FwICovXG4gXHRhdG9taWNfbG9uZ190IGludXNlX3BhZ2VzO1x0LyogbnVtYmVyIG9mIHRob3NlIGN1cnJlbnRseSBpbiB1c2UgKi9cbiYjNDM7XHRzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXJcdF9fcGVyY3B1ICpwZXJjcHVfY2x1c3RlcjsgLyogcGVyIGNwdSYjMzk7cyBzd2FwIGxvY2F0aW9uICovXG4gXHRzdHJ1Y3Qgc3dhcF9zZXF1ZW50aWFsX2NsdXN0ZXIgKmdsb2JhbF9jbHVzdGVyOyAvKiBVc2Ugb25lIGdsb2JhbCBjbHVzdGVyIGZvciByb3RhdGluZyBkZXZpY2UgKi9cbi1cdHNwaW5sb2NrX3QgZ2xvYmFsX2NsdXN0ZXJfbG9jaztcdC8qIFNlcmlhbGl6ZSB1c2FnZSBvZiBnbG9iYWwgY2x1c3RlciAqL1xuIFx0c3RydWN0IHJiX3Jvb3Qgc3dhcF9leHRlbnRfcm9vdDsvKiByb290IG9mIHRoZSBzd2FwIGV4dGVudCByYnRyZWUgKi9cbiBcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XHQvKiBzd2FwIGRldmljZSBvciBiZGV2IG9mIHN3YXAgZmlsZSAqL1xuIFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZTtcdFx0Lyogc2VsZG9tIHJlZmVyZW5jZWQgKi9cbiBcdHN0cnVjdCBjb21wbGV0aW9uIGNvbXA7XHRcdC8qIHNlbGRvbSByZWZlcmVuY2VkICovXG4gXHRzcGlubG9ja190IGxvY2s7XHRcdC8qXG4tXHRcdFx0XHRcdCAqIHByb3RlY3QgbWFwIHNjYW4gcmVsYXRlZCBmaWVsZHMgbGlrZVxuLVx0XHRcdFx0XHQgKiBpbnVzZV9wYWdlcyBhbmQgYWxsIGNsdXN0ZXIgbGlzdHMuXG4tXHRcdFx0XHRcdCAqIE90aGVyIGZpZWxkcyBhcmUgb25seSBjaGFuZ2VkXG4tXHRcdFx0XHRcdCAqIGF0IHN3YXBvbi9zd2Fwb2ZmLCBzbyBhcmUgcHJvdGVjdGVkXG4tXHRcdFx0XHRcdCAqIGJ5IHN3YXBfbG9jay4gY2hhbmdpbmcgZmxhZ3MgbmVlZFxuLVx0XHRcdFx0XHQgKiBob2xkIHRoaXMgbG9jayBhbmQgc3dhcF9sb2NrLiBJZlxuLVx0XHRcdFx0XHQgKiBib3RoIGxvY2tzIG5lZWQgaG9sZCwgaG9sZCBzd2FwX2xvY2tcbi1cdFx0XHRcdFx0ICogZmlyc3QuXG4mIzQzO1x0XHRcdFx0XHQgKiBQcm90ZWN0IGNsdXN0ZXIgbGlzdHMuIE90aGVyIGZpZWxkc1xuJiM0MztcdFx0XHRcdFx0ICogYXJlIG9ubHkgY2hhbmdlZCBhdCBzd2Fwb24vc3dhcG9mZixcbiYjNDM7XHRcdFx0XHRcdCAqIHNvIGFyZSBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtLlxuIFx0XHRcdFx0XHQgKi9cbiBcdHN0cnVjdCB3b3JrX3N0cnVjdCBkaXNjYXJkX3dvcms7IC8qIGRpc2NhcmQgd29ya2VyICovXG4gXHRzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVjbGFpbV93b3JrOyAvKiByZWNsYWltIHdvcmtlciAqL1xuIFx0c3RydWN0IGxpc3RfaGVhZCBkaXNjYXJkX2NsdXN0ZXJzOyAvKiBkaXNjYXJkIGNsdXN0ZXJzIGxpc3QgKi9cbi1cdHN0cnVjdCBwbGlzdF9ub2RlIGF2YWlsX2xpc3Q7ICAgLyogZW50cnkgaW4gc3dhcF9hdmFpbF9oZWFkICovXG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IHBhZ2Vfc3dhcF9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmRpZmYgLS1naXQgYS9saWIvcGxpc3QuYyBiL2xpYi9wbGlzdC5jXG5pbmRleCBhNWJlZjM4YWRkNDMxZC4uYjA1YWU3ZmZlYTg3ZTggMTAwNjQ0XG4tLS0gYS9saWIvcGxpc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbGliL3BsaXN0LmNcbkBAIC0xNDIsNTggJiM0MzsxNDIsNiBAQCB2b2lkIHBsaXN0X2RlbChzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpXG4gXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xuIH1cbiBcbi0vKipcbi0gKiBwbGlzdF9yZXF1ZXVlIC0gUmVxdWV1ZSBAbm9kZSBhdCBlbmQgb2Ygc2FtZS1wcmlvIGVudHJpZXMuXG4tICpcbi0gKiBUaGlzIGlzIGVzc2VudGlhbGx5IGFuIG9wdGltaXplZCBwbGlzdF9kZWwoKSBmb2xsb3dlZCBieVxuLSAqIHBsaXN0X2FkZCgpLiAgSXQgbW92ZXMgYW4gZW50cnkgYWxyZWFkeSBpbiB0aGUgcGxpc3QgdG9cbi0gKiBhZnRlciBhbnkgb3RoZXIgc2FtZS1wcmlvcml0eSBlbnRyaWVzLlxuLSAqXG4tICogQG5vZGU6XHRcdTAwMjZzdHJ1Y3QgcGxpc3Rfbm9kZSBwb2ludGVyIC0gZW50cnkgdG8gYmUgbW92ZWRcbi0gKiBAaGVhZDpcdFx1MDAyNnN0cnVjdCBwbGlzdF9oZWFkIHBvaW50ZXIgLSBsaXN0IGhlYWRcbi0gKi9cbi12b2lkIHBsaXN0X3JlcXVldWUoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKVxuLXtcbi1cdHN0cnVjdCBwbGlzdF9ub2RlICppdGVyO1xuLVx0c3RydWN0IGxpc3RfaGVhZCAqbm9kZV9uZXh0ID0gXHUwMDI2aGVhZC1cdTAwM2Vub2RlX2xpc3Q7XG4tXG4tXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xuLVx0QlVHX09OKHBsaXN0X2hlYWRfZW1wdHkoaGVhZCkpO1xuLVx0QlVHX09OKHBsaXN0X25vZGVfZW1wdHkobm9kZSkpO1xuLVxuLVx0aWYgKG5vZGUgPT0gcGxpc3RfbGFzdChoZWFkKSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0aXRlciA9IHBsaXN0X25leHQobm9kZSk7XG4tXG4tXHRpZiAobm9kZS1cdTAwM2VwcmlvICE9IGl0ZXItXHUwMDNlcHJpbylcbi1cdFx0cmV0dXJuO1xuLVxuLVx0cGxpc3RfZGVsKG5vZGUsIGhlYWQpO1xuLVxuLVx0Lypcbi1cdCAqIEFmdGVyIHBsaXN0X2RlbCgpLCBpdGVyIGlzIHRoZSByZXBsYWNlbWVudCBvZiB0aGUgbm9kZS4gIElmIHRoZSBub2RlXG4tXHQgKiB3YXMgb24gcHJpb19saXN0LCB0YWtlIHNob3J0Y3V0IHRvIGZpbmQgbm9kZV9uZXh0IGluc3RlYWQgb2YgbG9vcGluZy5cbi1cdCAqL1xuLVx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNml0ZXItXHUwMDNlcHJpb19saXN0KSkge1xuLVx0XHRpdGVyID0gbGlzdF9lbnRyeShpdGVyLVx1MDAzZXByaW9fbGlzdC5uZXh0LCBzdHJ1Y3QgcGxpc3Rfbm9kZSxcbi1cdFx0XHRcdCAgcHJpb19saXN0KTtcbi1cdFx0bm9kZV9uZXh0ID0gXHUwMDI2aXRlci1cdTAwM2Vub2RlX2xpc3Q7XG4tXHRcdGdvdG8gcXVldWU7XG4tXHR9XG4tXG4tXHRwbGlzdF9mb3JfZWFjaF9jb250aW51ZShpdGVyLCBoZWFkKSB7XG4tXHRcdGlmIChub2RlLVx1MDAzZXByaW8gIT0gaXRlci1cdTAwM2VwcmlvKSB7XG4tXHRcdFx0bm9kZV9uZXh0ID0gXHUwMDI2aXRlci1cdTAwM2Vub2RlX2xpc3Q7XG4tXHRcdFx0YnJlYWs7XG4tXHRcdH1cbi1cdH1cbi1xdWV1ZTpcbi1cdGxpc3RfYWRkX3RhaWwoXHUwMDI2bm9kZS1cdTAwM2Vub2RlX2xpc3QsIG5vZGVfbmV4dCk7XG4tXG4tXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xuLX1cbi1cbiAjaWZkZWYgQ09ORklHX0RFQlVHX1BMSVNUXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL2Nsb2NrLmhcdTAwM2VcbkBAIC0yMzEsMTQgJiM0MzsxNzksNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgcGxpc3RfdGVzdF9jaGVjayhpbnQgbnJfZXhwZWN0KVxuIFx0QlVHX09OKHByaW9fcG9zLVx1MDAzZXByaW9fbGlzdC5uZXh0ICE9IFx1MDAyNmZpcnN0LVx1MDAzZXByaW9fbGlzdCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9faW5pdCBwbGlzdF90ZXN0X3JlcXVldWUoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUpXG4te1xuLVx0cGxpc3RfcmVxdWV1ZShub2RlLCBcdTAwMjZ0ZXN0X2hlYWQpO1xuLVxuLVx0aWYgKG5vZGUgIT0gcGxpc3RfbGFzdChcdTAwMjZ0ZXN0X2hlYWQpKVxuLVx0XHRCVUdfT04obm9kZS1cdTAwM2VwcmlvID09IHBsaXN0X25leHQobm9kZSktXHUwMDNlcHJpbyk7XG4tfVxuLVxuIHN0YXRpYyBpbnQgIF9faW5pdCBwbGlzdF90ZXN0KHZvaWQpXG4ge1xuIFx0aW50IG5yX2V4cGVjdCA9IDAsIGksIGxvb3A7XG5AQCAtMjYyLDEwICYjNDM7MjAyLDYgQEAgc3RhdGljIGludCAgX19pbml0IHBsaXN0X3Rlc3Qodm9pZClcbiBcdFx0XHRucl9leHBlY3QtLTtcbiBcdFx0fVxuIFx0XHRwbGlzdF90ZXN0X2NoZWNrKG5yX2V4cGVjdCk7XG4tXHRcdGlmICghcGxpc3Rfbm9kZV9lbXB0eSh0ZXN0X25vZGUgJiM0MzsgaSkpIHtcbi1cdFx0XHRwbGlzdF90ZXN0X3JlcXVldWUodGVzdF9ub2RlICYjNDM7IGkpO1xuLVx0XHRcdHBsaXN0X3Rlc3RfY2hlY2sobnJfZXhwZWN0KTtcbi1cdFx0fVxuIFx0fVxuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRSh0ZXN0X25vZGUpOyBpJiM0MzsmIzQzOykge1xuZGlmZiAtLWdpdCBhL21tL3N3YXAuaCBiL21tL3N3YXAuaFxuaW5kZXggYjUxYWQzMDcxYTczMDguLjA4YTc4MmYzZDVhY2QyIDEwMDY0NFxuLS0tIGEvbW0vc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwLmhcbkBAIC05MSwxNiAmIzQzOzkxLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHN3cF9jbHVzdGVyX29mZnNldChzd3BfZW50cnlfdCBlbnRyeSlcbiAgKi9cbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpfX3N3YXBfdHlwZV90b19pbmZvKGludCB0eXBlKVxuIHtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbi1cbi1cdHNpID0gUkVBRF9PTkNFKHN3YXBfaW5mb1t0eXBlXSk7IC8qIHJjdV9kZXJlZmVyZW5jZSgpICovXG4tXHRWTV9XQVJOX09OX09OQ0UocGVyY3B1X3JlZl9pc196ZXJvKFx1MDAyNnNpLVx1MDAzZXVzZXJzKSk7IC8qIHJhY2Ugd2l0aCBzd2Fwb2ZmICovXG4tXHRyZXR1cm4gc2k7XG4mIzQzO1x0cmV0dXJuIFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqL1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpfX3N3YXBfZW50cnlfdG9faW5mbyhzd3BfZW50cnlfdCBlbnRyeSlcbiB7XG4tXHRyZXR1cm4gX19zd2FwX3R5cGVfdG9faW5mbyhzd3BfdHlwZShlbnRyeSkpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiYjNDM7XG4mIzQzO1x0c2kgPSBfX3N3YXBfdHlwZV90b19pbmZvKHN3cF90eXBlKGVudHJ5KSk7IC8qIHJjdV9kZXJlZmVyZW5jZSgpICovXG4mIzQzO1x0Vk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybyhcdTAwMjZzaS1cdTAwM2V1c2VycykpOyAvKiByYWNlIHdpdGggc3dhcG9mZiAqL1xuJiM0MztcdHJldHVybiBzaTtcbiB9XG4gXG4gc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKl9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihcbmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuY1xuaW5kZXggNzc1YzM4NTQ5MGE1ZmEuLmY5Mzg2MzMwOWE1YTUwIDEwMDY0NFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuY1xuQEAgLTQxLDcgJiM0Mzs0MSw2IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGxldGlvbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3VzcGVuZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvenN3YXAuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BsaXN0LmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2Nhc20vdGxiZmx1c2guaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2xlYWZvcHMuaFx1MDAzZVxuQEAgLTQ5LDMxICYjNDM7NDgsMzggQEBcbiAjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7c3dhcC5oXCYjMzQ7XG4gXG4tc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4tXHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2ludXNlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4mIzQzO1x0XHRcdFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7XG4gc3RhdGljIGJvb2wgZm9saW9fc3dhcGNhY2hlX2ZyZWVhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHN0YXRpYyB2b2lkIG1vdmVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG4gXHRcdFx0IGVudW0gc3dhcF9jbHVzdGVyX2ZsYWdzIG5ld19mbGFncyk7XG4mIzQzO3N0YXRpYyBib29sIGdldF9zd2FwX2RldmljZV9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSk7XG4gXG4gLypcbi0gKiBQcm90ZWN0cyB0aGUgc3dhcF9pbmZvIGFycmF5LCBhbmQgdGhlIFNXUF9VU0VEIGZsYWcuIHN3YXBfaW5mbyBjb250YWluc1xuLSAqIGxhemlseSBhbGxvY2F0ZWQgXHUwMDI2IGZyZWVkIHN3YXAgZGV2aWNlIGluZm8gc3RydXRzLCBhbmQgU1dQX1VTRUQgaW5kaWNhdGVzXG4tICogd2hpY2ggZGV2aWNlIGlzIHVzZWQsIH5TV1BfVVNFRCBkZXZpY2VzIGFuZCBjYW4gYmUgcmV1c2VkLlxuLSAqXG4tICogQWxzbyBwcm90ZWN0cyBzd2FwX2FjdGl2ZV9oZWFkIHRvdGFsX3N3YXBfcGFnZXMsIGFuZCB0aGUgU1dQX1dSSVRFT0sgZmxhZy5cbiYjNDM7ICogU2VyaWFsaXplcyBzd2Fwb24vc3dhcG9mZiAod3JpdGVycykgYW5kIHByb3RlY3RzIHRoZSBzd2FwX2luZm9cbiYjNDM7ICogYXJyYXksIG5yX3N3YXBmaWxlcywgdG90YWxfc3dhcF9wYWdlcywgYW5kIHBhcnQgb2Ygc3dhcCBkZXZpY2VcbiYjNDM7ICogaW5mbyBjb250ZW50IChzZWUgY29tbWVudCBvZiBzd2FwX2luZm9fc3RydWN0KS4gIFJlYWRlcnNcbiYjNDM7ICogKGFsbG9jYXRpb24sIC9wcm9jL3N3YXBzLCBldGMuKSB0YWtlIHBlcmNwdV9kb3duX3JlYWQoKSB3aGljaFxuJiM0MzsgKiBpcyBjaGVhcCBhcyB0aGUgaG90IHBhdGguXG4mIzQzOyAqL1xuJiM0MztERUZJTkVfU1RBVElDX1BFUkNQVV9SV1NFTShzd2Fwb25fcndzZW0pO1xuJiM0MzsvKlxuJiM0MzsgKiBzd2FwX2luZm8gY29udGFpbnMgbGF6aWx5IGFsbG9jYXRlZCBzd2FwIGRldmljZSBpbmZvIHN0cnVjdHMsIGFuZFxuJiM0MzsgKiBTV1BfVVNFRCBpbmRpY2F0ZXMgd2hpY2ggZGV2aWNlIGlzIHVzZWQsIH5TV1BfVVNFRCBkZXZpY2VzIGNhbiBiZVxuJiM0MzsgKiByZXVzZWQuIFByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0sIGJ1dCByZWFkaW5nIGNvdWxkIGJlIGxvY2tsZXNzLlxuICAqL1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9sb2NrKTtcbiYjNDM7c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfaW5mb1tNQVhfU1dBUEZJTEVTXTtcbiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlcztcbi1hdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XG4mIzQzO2xvbmcgdG90YWxfc3dhcF9wYWdlcztcbiYjNDM7XG4gLypcbiAgKiBTb21lIG1vZHVsZXMgdXNlIHN3YXBwYWJsZSBvYmplY3RzIGFuZCBtYXkgdHJ5IHRvIHN3YXAgdGhlbSBvdXQgdW5kZXJcbiAgKiBtZW1vcnkgcHJlc3N1cmUgKHZpYSB0aGUgc2hyaW5rZXIpLiBCZWZvcmUgZG9pbmcgc28sIHRoZXkgbWF5IHdpc2ggdG9cbiAgKiBjaGVjayB0byBzZWUgaWYgYW55IHN3YXAgc3BhY2UgaXMgYXZhaWxhYmxlLlxuICAqL1xuJiM0MzthdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XG4gRVhQT1JUX1NZTUJPTF9HUEwobnJfc3dhcF9wYWdlcyk7XG4tLyogcHJvdGVjdGVkIHdpdGggc3dhcF9sb2NrLiByZWFkaW5nIGluIHZtX3N3YXBfZnVsbCgpIGRvZXNuJiMzOTt0IG5lZWQgbG9jayAqL1xuLWxvbmcgdG90YWxfc3dhcF9wYWdlcztcbiAjZGVmaW5lIERFRl9TV0FQX1BSSU8gIC0xXG4gdW5zaWduZWQgbG9uZyBzd2FwZmlsZV9tYXhpbXVtX3NpemU7XG4gI2lmZGVmIENPTkZJR19NSUdSQVRJT05cbkBAIC04Myw1MiAmIzQzOzg5LDQyIEBAIGJvb2wgc3dhcF9taWdyYXRpb25fYWRfc3VwcG9ydGVkO1xuIHN0YXRpYyBjb25zdCBjaGFyIEJhZF9maWxlW10gPSBcJiMzNDtCYWQgc3dhcCBmaWxlIGVudHJ5IFwmIzM0OztcbiBzdGF0aWMgY29uc3QgY2hhciBCYWRfb2Zmc2V0W10gPSBcJiMzNDtCYWQgc3dhcCBvZmZzZXQgZW50cnkgXCYjMzQ7O1xuIFxuLS8qXG4tICogYWxsIGFjdGl2ZSBzd2FwX2luZm9fc3RydWN0c1xuLSAqIHByb3RlY3RlZCB3aXRoIHN3YXBfbG9jaywgYW5kIG9yZGVyZWQgYnkgcHJpb3JpdHkuXG4tICovXG4tc3RhdGljIFBMSVNUX0hFQUQoc3dhcF9hY3RpdmVfaGVhZCk7XG4mIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKl9fc3dhcF9pdGVyKGludCAqaSwgdW5zaWduZWQgbG9uZyBmbGFnKVxuJiM0Mzt7XG4mIzQzO1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdHdoaWxlICgqaSBcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XG4mIzQzO1x0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBfX3N3YXBfdHlwZV90b19pbmZvKCppKTtcbiYjNDM7XG4mIzQzO1x0XHRWTV9XQVJOX09OKCFzaSk7XG4mIzQzO1x0XHQoKmkpJiM0MzsmIzQzOztcbiYjNDM7XHRcdGlmIChmbGFnIFx1MDAyNlx1MDAyNiAhKChzaS1cdTAwM2VmbGFncyBcdTAwMjYgZmxhZykgPT0gZmxhZykpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0cmV0dXJuIHNpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBfX2Zvcl9lYWNoX3N3YXAoc2ksIGZsYWcpXHRcdFx0XFxcbiYjNDM7XHRmb3IgKGludCBfX2kgPSAwOyAoKHNpKSA9IF9fc3dhcF9pdGVyKFx1MDAyNl9faSwgZmxhZykpOylcbiBcbiAvKlxuLSAqIGFsbCBhdmFpbGFibGUgKGFjdGl2ZSwgbm90IGZ1bGwpIHN3YXBfaW5mb19zdHJ1Y3RzXG4tICogcHJvdGVjdGVkIHdpdGggc3dhcF9hdmFpbF9sb2NrLCBvcmRlcmVkIGJ5IHByaW9yaXR5LlxuLSAqIFRoaXMgaXMgdXNlZCBieSBmb2xpb19hbGxvY19zd2FwKCkgaW5zdGVhZCBvZiBzd2FwX2FjdGl2ZV9oZWFkXG4tICogYmVjYXVzZSBzd2FwX2FjdGl2ZV9oZWFkIGluY2x1ZGVzIGFsbCBzd2FwX2luZm9fc3RydWN0cyxcbi0gKiBidXQgZm9saW9fYWxsb2Nfc3dhcCgpIGRvZXNuJiMzOTt0IG5lZWQgdG8gbG9vayBhdCBmdWxsIG9uZXMuXG4tICogVGhpcyB1c2VzIGl0cyBvd24gbG9jayBpbnN0ZWFkIG9mIHN3YXBfbG9jayBiZWNhdXNlIHdoZW4gYVxuLSAqIHN3YXBfaW5mb19zdHJ1Y3QgY2hhbmdlcyBiZXR3ZWVuIG5vdC1mdWxsL2Z1bGwsIGl0IG5lZWRzIHRvXG4tICogYWRkL3JlbW92ZSBpdHNlbGYgdG8vZnJvbSB0aGlzIGxpc3QsIGJ1dCB0aGUgc3dhcF9pbmZvX3N0cnVjdC1cdTAwM2Vsb2NrXG4tICogaXMgaGVsZCBhbmQgdGhlIGxvY2tpbmcgb3JkZXIgcmVxdWlyZXMgc3dhcF9sb2NrIHRvIGJlIHRha2VuXG4tICogYmVmb3JlIGFueSBzd2FwX2luZm9fc3RydWN0LVx1MDAzZWxvY2suXG4mIzQzOyAqIGZvcl9lYWNoX3N3YXAgLSBpdGVyYXRlIHRocm91Z2ggYWxsIGFsbG9jYXRlZCBhbmQgaW51c2Ugc3dhcCBkZXZpY2VzXG4mIzQzOyAqIEBzaTogdGhlIGl0ZXJhdG9yXG4mIzQzOyAqXG4mIzQzOyAqIENvbnRleHQ6IFRoZSBjYWxsZXIgbXVzdCBob2xkIHN3YXBvbl9yd3NlbS4gVGhlIGxvY2sgbWF5IGJlIGRyb3BwZWQgZHVyaW5nXG4mIzQzOyAqIHRoZSBsb29wIGJvZHkgYnV0IG11c3QgYmUgcmUtYWNxdWlyZWQgYmVmb3JlIHRoZSBuZXh0IGl0ZXJhdGlvbi5cbiAgKi9cbi1zdGF0aWMgUExJU1RfSEVBRChzd2FwX2F2YWlsX2hlYWQpO1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9hdmFpbF9sb2NrKTtcbi1cbi1zdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9pbmZvW01BWF9TV0FQRklMRVNdO1xuJiM0MzsjZGVmaW5lIGZvcl9lYWNoX3N3YXAoc2kpIF9fZm9yX2VhY2hfc3dhcChzaSwgU1dQX1VTRUQpXG4mIzQzOyNkZWZpbmUgZm9yX2VhY2hfYXZhaWxfc3dhcChzaSkgX19mb3JfZWFjaF9zd2FwKHNpLCBTV1BfVVNFRCB8IFNXUF9XUklURU9LKVxuIFxuIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc3dhcF90YWJsZV9jYWNoZXA7XG4gXG4tLyogUHJvdGVjdHMgc2ktXHUwMDNlc3dhcF9maWxlIGZvciAvcHJvYy9zd2FwcyB1c2FnZSAqL1xuLXN0YXRpYyBERUZJTkVfTVVURVgoc3dhcG9uX211dGV4KTtcbi1cbiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocHJvY19wb2xsX3dhaXQpO1xuIC8qIEFjdGl2aXR5IGNvdW50ZXIgdG8gaW5kaWNhdGUgdGhhdCBhIHN3YXBvbiBvciBzd2Fwb2ZmIGhhcyBvY2N1cnJlZCAqL1xuIHN0YXRpYyBhdG9taWNfdCBwcm9jX3BvbGxfZXZlbnQgPSBBVE9NSUNfSU5JVCgwKTtcbiBcbiBhdG9taWNfdCBucl9yb3RhdGVfc3dhcCA9IEFUT01JQ19JTklUKDApO1xuIFxuLXN0cnVjdCBwZXJjcHVfc3dhcF9jbHVzdGVyIHtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaVtTV0FQX05SX09SREVSU107XG4tXHR1bnNpZ25lZCBsb25nIG9mZnNldFtTV0FQX05SX09SREVSU107XG4tXHRsb2NhbF9sb2NrX3QgbG9jaztcbi19O1xuLVxuLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyY3B1X3N3YXBfY2x1c3RlciwgcGVyY3B1X3N3YXBfY2x1c3RlcikgPSB7XG4tXHQuc2kgPSB7IE5VTEwgfSxcbi1cdC5vZmZzZXQgPSB7IFNXQVBfRU5UUllfSU5WQUxJRCB9LFxuLVx0LmxvY2sgPSBJTklUX0xPQ0FMX0xPQ0soKSxcbi19O1xuLVxuIC8qIE1heSByZXR1cm4gTlVMTCBvbiBpbnZhbGlkIHR5cGUsIGNhbGxlciBtdXN0IGNoZWNrIGZvciBOVUxMIHJldHVybiAqL1xuIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF90eXBlX3RvX2luZm8oaW50IHR5cGUpXG4ge1xuQEAgLTE0MywxOCAmIzQzOzEzOSwzNTAgQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2VudHJ5X3RvX2luZm8oc3dwX2VudHJ5X3QgZW50cnkpXG4gXHRyZXR1cm4gc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIEFsbCBhdmFpbGFibGUgc3dhcF9pbmZvX3N0cnVjdHMgYXJlIGdyb3VwZWQgYnkgcHJpb3JpdHkgcmluZ3MsIHRoZSByaW5nc1xuJiM0MzsgKiBhcmUgb3JkZXJlZCBpbiBhIHF1ZXVlIGJ5IHByaW9yaXR5IChsb3dlciBwcmlvIHZhbHVlID0gaGlnaGVyIHByaW9yaXR5KS5cbiYjNDM7ICogVGhlIGFsbG9jYXRvciBpdGVyYXRlcyBhbmQgcm90YXRlcyBkZXZpY2VzIHdpdGhpbiBlYWNoIHByaW9yaXR5IHJpbmcuXG4mIzQzOyAqIFdoZW4gYWxsIGRldmljZXMgaW4gYSByaW5nIGFyZSBpdGVyYXRlZCwgaXQgZ29lcyB0byB0aGUgbmV4dCBsb3dlclxuJiM0MzsgKiBwcmlvcml0eSByaW5nLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IHN3YXBfcHJpb19yaW5nIHtcbiYjNDM7XHRpbnQgcHJpbztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2l6ZTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZGV2W10gX19jb3VudGVkX2J5KHNpemUpO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHJpbmcgaXMgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbSBzbyB1cGRhdGluZyBpdCBpcyBjb3N0bHkuIFRvIG1ha2VcbiYjNDM7ICogdGhlIGFsbG9jYXRvciBhbmQgb3RoZXIgdXNlcnMgc2tpcCBmdWxsIGRldmljZXMgZmFzdGVyLCB0aGUgbG93ZXN0IGJpdCBvZlxuJiM0MzsgKiBhIGRldmljZSBwb2ludGVyIGlzIHVzZWQgdG8gbWFyayBpdCBkaXNhYmxlZCAodGVtcG9yYXJpbHkgdW5hdmFpbGFibGUpLlxuJiM0MzsgKiBUaGlzIHJlbGllcyBvbiBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCBiZWluZyBzdWZmaWNpZW50bHlcbiYjNDM7ICogYWxpZ25lZCAoZ3VhcmFudGVlZCBieSBrbWFsbG9jKS5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZUXHQwXG4mIzQzOyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVFx0XHRCSVQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZUKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2VyaWFsaXplcyBxdWV1ZSBjb250ZW50IG11dGF0aW9ucyBhbmQga2VlcHMgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVFxuJiM0MzsgKiBjb25zaXN0ZW50IHdpdGggdGhlIG1hc2tlZCBzdGF0ZSBvZiBlYWNoIGRldmljZSBwb2ludGVyLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFN3YXAgcXVldWUgaXMgcHJvdGVjdGVkIGJ5IGJvdGggc3dhcF9xdWV1ZV91cGRhdGVfbG9jayBhbmQgc3dhcG9uX3J3c2VtLlxuJiM0MzsgKiBPbmx5IHN3YXBvbi9zd2Fwb2ZmIHdpbGwgdGFrZSB0aGUgd3JpdGUgbG9jaywgYW5kIG1vZGlmeSB0aGUgcXVldWUgbGVuZ3RoXG4mIzQzOyAqIG9yIGFueSByaW5nJiMzOTtzIGxlbmd0aC4gc3dhcF9xdWV1ZV91cGRhdGVfbG9jayBwcm90ZWN0cyB0aGUgY29udGVudCBzb1xuJiM0MzsgKiBkZXZpY2VzIGNhbiBiZSBtYXNrZWQgZWFzaWx5IHdpdGhvdXQgdGFraW5nIHRoZSB3cml0ZWxvY2ssIHdoaWNoIGlzIGhlYXZ5LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqKnN3YXBfcXVldWU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgc3dhcF9xdWV1ZV9sZW47XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFYWNoIENQVSBoYXMgaXRzIHJlYWQgaXRlcmF0b3IsIHNvIHRoZSBxdWV1ZSBpdHNlbGYgd2lsbCByZW1haW4gcmVhZFxuJiM0MzsgKiBvbmx5IGFuZCB0aGUgQ1BVIHNpZGUgcmVhZGVyIHJvdGF0ZXMgYnkgaXRlcmF0aW5nIHRoZSBkZXZpY2VzXG4mIzQzOyAqIHBlcmlvZGljYWxseSB1c2luZyB0aGUgY291bnRlci5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgU1dBUF9ST1VORF9ST0JJTl9RVU9UQSBTV0FQRklMRV9DTFVTVEVSXG4mIzQzO3N0cnVjdCBzd2FwX3JpbmdfaXRlcmF0b3Ige1xuJiM0MztcdGludCBvZmZzZXQ7XG4mIzQzO1x0bG9uZyBycl9jb3VudGVyO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIHtcbiYjNDM7XHRsb2NhbF9sb2NrX3QgbG9jaztcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9yaW5nX2l0ZXJhdG9yIHJpW107XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgX19wZXJjcHUgc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyICpzd2FwX3F1ZXVlX3JlYWRlcnM7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc3dhcF9kZXZpY2VfbWFza2VkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZylzaSBcdTAwMjYgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICopKCh1bnNpZ25lZCBsb25nKXNpIFx1MDAyNiB+U1dBUF9ERVZJQ0VfTUFTS0VEX0JJVCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhpbnQgbnJfcmluZ3MsIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqcmVhZGVycztcbiYjNDM7XG4mIzQzO1x0aWYgKCFucl9yaW5ncylcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRyZWFkZXJzID0gX19hbGxvY19wZXJjcHVfZ2ZwKHN0cnVjdF9zaXplKHJlYWRlcnMsIHJpLCBucl9yaW5ncyksXG4mIzQzO1x0XHRcdFx0ICAgICBfX2FsaWdub2ZfXygqcmVhZGVycyksIGdmcCk7XG4mIzQzO1x0cmV0dXJuIHJlYWRlcnM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfaW5zdGFsbF9yZWFkZXJzKHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqcmVhZGVycylcbiYjNDM7e1xuJiM0MztcdGludCByaW5nX2lkeCwgY3B1O1xuJiM0MztcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcbiYjNDM7XG4mIzQzO1x0ZnJlZV9wZXJjcHUoc3dhcF9xdWV1ZV9yZWFkZXJzKTtcbiYjNDM7XHRzd2FwX3F1ZXVlX3JlYWRlcnMgPSByZWFkZXJzO1xuJiM0MztcdGlmICghcmVhZGVycylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0LyogRGlzdHJpYnV0ZSBlYWNoIENQVSYjMzk7cyBzd2FwIElPIGZhaXJseSBhY3Jvc3MgZGV2aWNlcy4gKi9cbiYjNDM7XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4mIzQzO1x0XHRsb2NhbF9sb2NrX2luaXQoXHUwMDI2cGVyX2NwdV9wdHIocmVhZGVycywgY3B1KS1cdTAwM2Vsb2NrKTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKHJpbmdfaWR4ID0gMDsgcmluZ19pZHggXHUwMDNjIHN3YXBfcXVldWVfbGVuOyByaW5nX2lkeCYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0cmluZyA9IHN3YXBfcXVldWVbcmluZ19pZHhdO1xuJiM0MztcdFx0XHRwZXJfY3B1X3B0cihyZWFkZXJzLCBjcHUpLVx1MDAzZXJpW3JpbmdfaWR4XS5vZmZzZXQgPVxuJiM0MztcdFx0XHRcdCAgICBjcHUgJSByaW5nLVx1MDAzZXNpemU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfcXVldWVfZ2V0X2RldmljZShsb25nIG5yX2FsbG9jLCBpbnQgbnJfaXRlcilcbiYjNDM7e1xuJiM0MztcdGJvb2wgcm90YXRlID0gZmFsc2U7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuJiM0MztcdHN0cnVjdCBzd2FwX3JpbmdfaXRlcmF0b3IgKnJpO1xuJiM0MztcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgcXVldWVfaWR4O1xuJiM0MztcbiYjNDM7XHRpZiAoIXN3YXBfcXVldWVfbGVuKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4mIzQzO1xuJiM0MztcdHF1ZXVlX2lkeCA9IDA7XG4mIzQzO1x0d2hpbGUgKG5yX2l0ZXIgXHUwMDNlPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF0tXHUwMDNlc2l6ZSkge1xuJiM0MztcdFx0bnJfaXRlciAtPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF0tXHUwMDNlc2l6ZTtcbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7cXVldWVfaWR4IFx1MDAzZT0gc3dhcF9xdWV1ZV9sZW4pXG4mIzQzO1x0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmluZyA9IHN3YXBfcXVldWVbcXVldWVfaWR4XTtcbiYjNDM7XHRsb2NhbF9sb2NrKFx1MDAyNnN3YXBfcXVldWVfcmVhZGVycy1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRyaSA9IHRoaXNfY3B1X3B0cihcdTAwMjZzd2FwX3F1ZXVlX3JlYWRlcnMtXHUwMDNlcmlbcXVldWVfaWR4XSk7XG4mIzQzO1x0LyogUm90YXRlIHdoaWxlIGl0ZXJhdGluZyB0aGUgcmluZywganVzdCBub3Qgb24gdGhlIGZpcnN0IHRyeSAqL1xuJiM0MztcdGlmIChucl9pdGVyKVxuJiM0MztcdFx0cm90YXRlID0gdHJ1ZTtcbiYjNDM7XHRlbHNlIGlmIChyaS1cdTAwM2Vycl9jb3VudGVyIFx1MDAzYyBucl9hbGxvYylcbiYjNDM7XHRcdHJvdGF0ZSA9IHRydWU7XG4mIzQzO1x0ZWxzZSBpZiAocmktXHUwMDNlb2Zmc2V0IFx1MDAzZT0gcmluZy1cdTAwM2VzaXplKVxuJiM0MztcdFx0cm90YXRlID0gdHJ1ZTtcbiYjNDM7XHRpZiAocm90YXRlKSB7XG4mIzQzO1x0XHRyaS1cdTAwM2VvZmZzZXQmIzQzOyYjNDM7O1xuJiM0MztcdFx0cmktXHUwMDNlb2Zmc2V0ICU9IHJpbmctXHUwMDNlc2l6ZTtcbiYjNDM7XHRcdHJpLVx1MDAzZXJyX2NvdW50ZXIgPSBTV0FQX1JPVU5EX1JPQklOX1FVT1RBO1xuJiM0MztcdH1cbiYjNDM7XHRyaS1cdTAwM2Vycl9jb3VudGVyIC09IG5yX2FsbG9jO1xuJiM0MztcdHNpID0gUkVBRF9PTkNFKHJpbmctXHUwMDNlZGV2W3JpLVx1MDAzZW9mZnNldF0pO1xuJiM0MztcdGxvY2FsX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3JlYWRlcnMtXHUwMDNlbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmIChzd2FwX2RldmljZV9tYXNrZWQoc2kpKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVCVVNZKTtcbiYjNDM7XG4mIzQzO1x0c2kgPSBzd2FwX2RldmljZV91bm1hc2tfcHRyKHNpKTtcbiYjNDM7XHRyZXR1cm4gc2k7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHN3YXBfcXVldWVfZmluZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4mIzQzO1x0XHRcdCAgICB1bnNpZ25lZCBpbnQgKnJpbmdfaWR4LCB1bnNpZ25lZCBpbnQgKmRldl9pZHgpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaSwgajtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0KGxvY2tkZXBfaXNfaGVsZChcdTAwMjZzd2Fwb25fcndzZW0pIHx8XG4mIzQzO1x0XHQgICAgICAgbG9ja2RlcF9pc19oZWxkKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc3dhcF9xdWV1ZV9sZW47IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRyaW5nID0gc3dhcF9xdWV1ZVtpXTtcbiYjNDM7XHRcdGlmIChyaW5nLVx1MDAzZXByaW8gIT0gc2ktXHUwMDNlcHJpbylcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyByaW5nLVx1MDAzZXNpemU7IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmIChzd2FwX2RldmljZV91bm1hc2tfcHRyKFJFQURfT05DRShyaW5nLVx1MDAzZWRldltqXSkpICE9IHNpKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHQqcmluZ19pZHggPSBpO1xuJiM0MztcdFx0XHQqZGV2X2lkeCA9IGo7XG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfbWFzayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgcmluZ19pZHgsIGRldl9pZHg7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4mIzQzO1x0aWYgKHN3YXBfcXVldWVfZmluZChzaSwgXHUwMDI2cmluZ19pZHgsIFx1MDAyNmRldl9pZHgpKVxuJiM0MztcdFx0X19zZXRfYml0KFNXQVBfREVWSUNFX01BU0tFRF9TSElGVCxcbiYjNDM7XHRcdFx0ICAodW5zaWduZWQgbG9uZyAqKVx1MDAyNnN3YXBfcXVldWVbcmluZ19pZHhdLVx1MDAzZWRldltkZXZfaWR4XSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfdW5tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCByaW5nX2lkeCwgZGV2X2lkeDtcbiYjNDM7XG4mIzQzO1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiYjNDM7XHRpZiAoc3dhcF9xdWV1ZV9maW5kKHNpLCBcdTAwMjZyaW5nX2lkeCwgXHUwMDI2ZGV2X2lkeCkpXG4mIzQzO1x0XHRfX2NsZWFyX2JpdChTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQsXG4mIzQzO1x0XHRcdCAgICAodW5zaWduZWQgbG9uZyAqKVx1MDAyNnN3YXBfcXVldWVbcmluZ19pZHhdLVx1MDAzZWRldltkZXZfaWR4XSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN3YXBfcHJpb19yaW5nICoqbmV3X3F1ZXVlID0gTlVMTCwgKipvbGRfcXVldWUgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqbmV3X3JlYWRlcnMgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZywgKm5ld19yaW5nID0gTlVMTCwgKm9sZF9yaW5nID0gTlVMTDtcbiYjNDM7XHRpbnQgcHJpbyA9IHNpLVx1MDAzZXByaW87XG4mIzQzO1x0aW50IGksIHBvcywgZXJyID0gLUVOT01FTTtcbiYjNDM7XHRnZnBfdCBnZnA7XG4mIzQzO1xuJiM0MztcdC8qIFN3YXAgbm90IHVzYWJsZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyBzd2FwLCBqdXN0IHJlY2xhaW0gY2FjaGUuICovXG4mIzQzO1x0Z2ZwID0gR0ZQX05PSU8gfCBfX0dGUF9ISUdIO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGRfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChwb3MgPSAwOyBwb3MgXHUwMDNjIHN3YXBfcXVldWVfbGVuOyBwb3MmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoc3dhcF9xdWV1ZVtwb3NdLVx1MDAzZXByaW8gPT0gcHJpbylcbiYjNDM7XHRcdFx0Z290byBhZGRfdG9fcmluZztcbiYjNDM7XHRcdGlmIChzd2FwX3F1ZXVlW3Bvc10tXHUwMDNlcHJpbyBcdTAwM2MgcHJpbylcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBObyByaW5nIGF0IHRoaXMgcHJpb3JpdHk6IGluc2VydCBhIG5ldyBvbmUgYXQgcG9zLiAqL1xuJiM0MztcdG5ld19yZWFkZXJzID0gc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKHN3YXBfcXVldWVfbGVuICYjNDM7IDEsIGdmcCk7XG4mIzQzO1x0aWYgKCFuZXdfcmVhZGVycylcbiYjNDM7XHRcdGdvdG8gZmFpbGVkO1xuJiM0MztcdG5ld19xdWV1ZSA9IGttYWxsb2NfYXJyYXkoc3dhcF9xdWV1ZV9sZW4gJiM0MzsgMSwgc2l6ZW9mKCpzd2FwX3F1ZXVlKSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIW5ld19xdWV1ZSlcbiYjNDM7XHRcdGdvdG8gZmFpbGVkO1xuJiM0MztcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShuZXdfcmluZywgZGV2LCAxKSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIW5ld19yaW5nKVxuJiM0MztcdFx0Z290byBmYWlsZWQ7XG4mIzQzO1x0aWYgKCFnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpXG4mIzQzO1x0XHRnb3RvIGZhaWxlZDtcbiYjNDM7XG4mIzQzO1x0bmV3X3JpbmctXHUwMDNlcHJpbyA9IHByaW87XG4mIzQzO1x0bmV3X3JpbmctXHUwMDNlc2l6ZSA9IDE7XG4mIzQzO1x0bmV3X3JpbmctXHUwMDNlZGV2WzBdID0gc2k7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcG9zOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdG5ld19xdWV1ZVtpXSA9IHN3YXBfcXVldWVbaV07XG4mIzQzO1x0bmV3X3F1ZXVlW3Bvc10gPSBuZXdfcmluZztcbiYjNDM7XHRmb3IgKGkgPSBwb3M7IGkgXHUwMDNjIHN3YXBfcXVldWVfbGVuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdG5ld19xdWV1ZVtpICYjNDM7IDFdID0gc3dhcF9xdWV1ZVtpXTtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcdG9sZF9xdWV1ZSA9IHN3YXBfcXVldWU7XG4mIzQzO1x0c3dhcF9xdWV1ZSA9IG5ld19xdWV1ZTtcbiYjNDM7XHRzd2FwX3F1ZXVlX2xlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4mIzQzO1x0a2ZyZWUob2xkX3F1ZXVlKTtcbiYjNDM7XG4mIzQzO1x0c3dhcF9xdWV1ZV9pbnN0YWxsX3JlYWRlcnMobmV3X3JlYWRlcnMpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7YWRkX3RvX3Jpbmc6XG4mIzQzO1x0cmluZyA9IHN3YXBfcXVldWVbcG9zXTtcbiYjNDM7XHRuZXdfcmluZyA9IGttYWxsb2Moc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLVx1MDAzZXNpemUgJiM0MzsgMSksIGdmcCk7XG4mIzQzO1x0aWYgKCFuZXdfcmluZylcbiYjNDM7XHRcdGdvdG8gZmFpbGVkO1xuJiM0MztcdGlmICghZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxuJiM0MztcdFx0Z290byBmYWlsZWQ7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcdG1lbWNweShuZXdfcmluZywgcmluZywgc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLVx1MDAzZXNpemUpKTtcbiYjNDM7XHRuZXdfcmluZy1cdTAwM2VzaXplJiM0MzsmIzQzOztcbiYjNDM7XHRuZXdfcmluZy1cdTAwM2VkZXZbbmV3X3JpbmctXHUwMDNlc2l6ZSAtIDFdID0gc2k7XG4mIzQzO1x0b2xkX3JpbmcgPSBzd2FwX3F1ZXVlW3Bvc107XG4mIzQzO1x0c3dhcF9xdWV1ZVtwb3NdID0gbmV3X3Jpbmc7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4mIzQzO1x0a2ZyZWUob2xkX3JpbmcpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7ZmFpbGVkOlxuJiM0MztcdGZyZWVfcGVyY3B1KG5ld19yZWFkZXJzKTtcbiYjNDM7XHRrZnJlZShuZXdfcXVldWUpO1xuJiM0MztcdGtmcmVlKG5ld19yaW5nKTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2RlbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRnZnBfdCBnZnA7XG4mIzQzO1x0dW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4O1xuJiM0MztcdHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqbmV3X3JlYWRlcnMgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZywgKm5ld19yaW5nID0gTlVMTCwgKm9sZF9yaW5nID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipuZXdfcXVldWUgPSBOVUxMLCAqKm9sZF9xdWV1ZSA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGRfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRpZiAoIXN3YXBfcXVldWVfZmluZChzaSwgXHUwMDI2cmluZ19pZHgsIFx1MDAyNmRldl9pZHgpKSB7XG4mIzQzO1x0XHRXQVJOX09OKDEpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUbyBzaHJpbmsgbWVtb3J5IHVzYWdlLCBwcmUtYWxsb2NhdGUgbmV3IHNtYWxsZXIgZGF0YSBiZWZvcmVcbiYjNDM7XHQgKiBsb2NraW5nLiBGYWlsdXJlIGlzIGZpbmUsIHN3YXBvZmYgd2lsbCByZWxlYXNlIHRoZW0gYW55d2F5LlxuJiM0MztcdCAqL1xuJiM0MztcdGdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDtcbiYjNDM7XHRyaW5nID0gc3dhcF9xdWV1ZVtyaW5nX2lkeF07XG4mIzQzO1x0aWYgKHJpbmctXHUwMDNlc2l6ZSBcdTAwM2UgMSlcbiYjNDM7XHRcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXHUwMDNlc2l6ZSAtIDEpLCBnZnApO1xuJiM0MztcdGlmIChyaW5nLVx1MDAzZXNpemUgPT0gMSBcdTAwMjZcdTAwMjYgc3dhcF9xdWV1ZV9sZW4gXHUwMDNlIDEpIHtcbiYjNDM7XHRcdG5ld19yZWFkZXJzID0gc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKFxuJiM0MztcdFx0XHRcdFx0c3dhcF9xdWV1ZV9sZW4gLSAxLCBnZnApO1xuJiM0MztcdFx0bmV3X3F1ZXVlID0ga21hbGxvYyhzaXplb2YoKnN3YXBfcXVldWUpICpcbiYjNDM7XHRcdFx0XHQgICAgKHN3YXBfcXVldWVfbGVuIC0gMSksIGdmcCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4mIzQzO1x0aWYgKHJpbmctXHUwMDNlc2l6ZSBcdTAwM2UgMSkge1xuJiM0MztcdFx0LyogU2hpZnQgdHJhaWxpbmcgZGV2aWNlcyBsZWZ0IHRvIGZpbGwgdGhlIGdhcC4gKi9cbiYjNDM7XHRcdHdoaWxlICgmIzQzOyYjNDM7ZGV2X2lkeCBcdTAwM2MgcmluZy1cdTAwM2VzaXplKVxuJiM0MztcdFx0XHRyaW5nLVx1MDAzZWRldltkZXZfaWR4IC0gMV0gPVxuJiM0MztcdFx0XHRcdHJpbmctXHUwMDNlZGV2W2Rldl9pZHhdO1xuJiM0MztcdFx0cmluZy1cdTAwM2VzaXplLS07XG4mIzQzO1x0XHRpZiAobmV3X3JpbmcpIHtcbiYjNDM7XHRcdFx0bWVtY3B5KG5ld19yaW5nLCByaW5nLFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLVx1MDAzZXNpemUpKTtcbiYjNDM7XHRcdFx0b2xkX3JpbmcgPSByaW5nO1xuJiM0MztcdFx0XHRzd2FwX3F1ZXVlW3JpbmdfaWR4XSA9IG5ld19yaW5nO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHQvKiBMYXN0IGRldmljZSBpbiB0aGlzIHJpbmc6IHJlbW92ZSB0aGUgcmluZy4gKi9cbiYjNDM7XHRcdG9sZF9yaW5nID0gcmluZztcbiYjNDM7XHRcdHN3YXBfcXVldWVfbGVuLS07XG4mIzQzO1x0XHR3aGlsZSAoJiM0MzsmIzQzO3JpbmdfaWR4IFx1MDAzYz0gc3dhcF9xdWV1ZV9sZW4pXG4mIzQzO1x0XHRcdHN3YXBfcXVldWVbcmluZ19pZHggLSAxXSA9XG4mIzQzO1x0XHRcdFx0c3dhcF9xdWV1ZVtyaW5nX2lkeF07XG4mIzQzO1x0XHRpZiAobmV3X3F1ZXVlKSB7XG4mIzQzO1x0XHRcdG1lbWNweShuZXdfcXVldWUsIHN3YXBfcXVldWUsXG4mIzQzO1x0XHRcdCAgICAgICBzaXplb2YoKnN3YXBfcXVldWUpICogc3dhcF9xdWV1ZV9sZW4pO1xuJiM0MztcdFx0XHRvbGRfcXVldWUgPSBzd2FwX3F1ZXVlO1xuJiM0MztcdFx0XHRzd2FwX3F1ZXVlID0gbmV3X3F1ZXVlO1xuJiM0MztcdFx0fSBlbHNlIGlmICghc3dhcF9xdWV1ZV9sZW4pIHtcbiYjNDM7XHRcdFx0b2xkX3F1ZXVlID0gc3dhcF9xdWV1ZTtcbiYjNDM7XHRcdFx0c3dhcF9xdWV1ZSA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAobmV3X3JlYWRlcnMgfHwgIXN3YXBfcXVldWVfbGVuKVxuJiM0MztcdFx0XHRzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhuZXdfcmVhZGVycyk7XG4mIzQzO1x0fVxuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRrZnJlZShvbGRfcmluZyk7XG4mIzQzO1x0a2ZyZWUob2xkX3F1ZXVlKTtcbiYjNDM7XHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qXG4gICogVXNlIHRoZSBzZWNvbmQgaGlnaGVzdCBiaXQgb2YgaW51c2VfcGFnZXMgY291bnRlciBhcyB0aGUgaW5kaWNhdG9yXG4tICogaWYgb25lIHN3YXAgZGV2aWNlIGlzIG9uIHRoZSBhdmFpbGFibGUgcGxpc3QsIHNvIHRoZSBhdG9taWMgY2FuXG4mIzQzOyAqIGlmIG9uZSBzd2FwIGRldmljZSBpcyB1bmF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiwgc28gdGhlIGF0b21pYyBjYW5cbiAgKiBzdGlsbCBiZSB1cGRhdGVkIGFyaXRobWV0aWNhbGx5IHdoaWxlIGhhdmluZyBzcGVjaWFsIGRhdGEgZW1iZWRkZWQuXG4gICpcbiAgKiBpbnVzZV9wYWdlcyBjb3VudGVyIGlzIHRoZSBvbmx5IHRoaW5nIGluZGljYXRpbmcgaWYgYSBkZXZpY2Ugc2hvdWxkXG4tICogYmUgb24gYXZhaWxfbGlzdHMgb3Igbm90IChleGNlcHQgc3dhcG9uIC8gc3dhcG9mZikuIEJ5IGVtYmVkZGluZyB0aGVcbi0gKiBvZmYtbGlzdCBiaXQgaW4gdGhlIGF0b21pYyBjb3VudGVyLCB1cGRhdGVzIG5vIGxvbmdlciBuZWVkIGFueSBsb2NrXG4tICogdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxuJiM0MzsgKiBiZSBpbiB0aGUgYXZhaWxhYmxlIHF1ZXVlIG9yIG5vdCAoZXhjZXB0IHN3YXBvbiAvIHN3YXBvZmYpLiBCeVxuJiM0MzsgKiBlbWJlZGRpbmcgdGhlIG9mZi1saXN0IGJpdCBpbiB0aGUgYXRvbWljIGNvdW50ZXIsIHVwZGF0ZXMgbm8gbG9uZ2VyXG4mIzQzOyAqIG5lZWQgYW55IGxvY2sgdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxuICAqXG4tICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3Qgb24gdGhlIHBsaXN0IGFuZCBub3Rcbi0gKiB1c2FibGUsIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGUgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdC5cbiYjNDM7ICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3QgaW4gdGhlIGF2YWlsYWJsZSBxdWV1ZVxuJiM0MzsgKiBhbmQgbm90IHVzYWJsZSwgd2lsbCBiZSBjbGVhcmVkIGlmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIHF1ZXVlLlxuICAqL1xuICNkZWZpbmUgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCAoMVVMIFx1MDAzY1x1MDAzYyAoQklUU19QRVJfVFlQRShhdG9taWNfdCkgLSAyKSlcbiAjZGVmaW5lIFNXQVBfVVNBR0VfQ09VTlRFUl9NQVNLICh+U1dBUF9VU0FHRV9PRkZMSVNUX0JJVClcbkBAIC0xNjMsNiAmIzQzOzQ5MSwyNiBAQCBzdGF0aWMgbG9uZyBzd2FwX3VzYWdlX2luX3BhZ2VzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdHJldHVybiBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKSBcdTAwMjYgU1dBUF9VU0FHRV9DT1VOVEVSX01BU0s7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBTZXJpYWxpemUgdGhlIGFsbG9jYXRpb24gb24gc2luZ2xlIENQVSBvciBnbG9iYWxseSB0byBhdm9pZFxuJiM0MzsgKiBmcmFnbWVudGF0aW9uIGFuZCBtYWtlIHRoZSB3b3JrZmxvdyBlYXNpZXIgdG8gZm9sbG93LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgc3dhcF9hbGxvY19sb2NrX2RldmljZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuJiM0MztcdFx0bG9jYWxfbG9jayhcdTAwMjZzaS1cdTAwM2VwZXJjcHVfY2x1c3Rlci1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRzcGluX2xvY2soXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbG9jayk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfYWxsb2NfdW5sb2NrX2RldmljZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3tcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuJiM0MztcdFx0bG9jYWxfdW5sb2NrKFx1MDAyNnNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyLVx1MDAzZWxvY2spO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZWxvY2spO1xuJiM0Mzt9XG4mIzQzO1xuIC8qIFJlY2xhaW0gdGhlIHN3YXAgZW50cnkgYW55d2F5IGlmIHBvc3NpYmxlICovXG4gI2RlZmluZSBUVFJTX0FOWVdBWVx0XHQweDFcbiAvKlxuQEAgLTUzMyw5ICYjNDM7ODgxLDEwIEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHQgKiBPbmx5IGNsdXN0ZXIgaXNvbGF0aW9uIGZyb20gdGhlIGFsbG9jYXRvciBkb2VzIHRhYmxlIGFsbG9jYXRpb24uXG4gXHQgKiBTd2FwIGFsbG9jYXRvciB1c2VzIHBlcmNwdSBjbHVzdGVycyBhbmQgaG9sZHMgdGhlIGxvY2FsIGxvY2suXG4gXHQgKi9cbi1cdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2dGhpc19jcHVfcHRyKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIpLVx1MDAzZWxvY2spO1xuLVx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbi1cdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuJiM0MztcdFx0bG9ja2RlcF9hc3NlcnRfaGVsZCh0aGlzX2NwdV9wdHIoXHUwMDI2c2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbG9jaykpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbG9jayk7XG4gXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuIFxuIFx0aWYgKCFzd2FwX2NsdXN0ZXJfYWxsb2NfdGFibGUoY2ksIF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHxcbkBAIC01NDgsOSAmIzQzOzg5Nyw3IEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHQgKiB0aGUgcG90ZW50aWFsIHJlY3Vyc2l2ZSBhbGxvY2F0aW9uIGlzIGxpbWl0ZWQuXG4gXHQgKi9cbiBcdHNwaW5fdW5sb2NrKFx1MDAyNmNpLVx1MDAzZWxvY2spO1xuLVx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXJfbG9jayk7XG4tXHRsb2NhbF91bmxvY2soXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcbiYjNDM7XHRzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc2kpO1xuIFxuIFx0cmV0ID0gc3dhcF9jbHVzdGVyX2FsbG9jX3RhYmxlKGNpLCBfX0dGUF9ISUdIIHwgX19HRlBfTk9NRU1BTExPQyB8XG4gXHRcdFx0XHRcdCAgIEdGUF9LRVJORUwpO1xuQEAgLTU2Myw5ICYjNDM7OTEwLDcgQEAgc3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdCAqIGNvdWxkIGhhcHBlbiB3aXRoIGlnbm9yaW5nIHRoZSBwZXJjcHUgY2x1c3RlciBpcyBmcmFnbWVudGF0aW9uLFxuIFx0ICogd2hpY2ggaXMgYWNjZXB0YWJsZSBzaW5jZSB0aGlzIGZhbGxiYWNrIGFuZCByYWNlIGlzIHJhcmUuXG4gXHQgKi9cbi1cdGxvY2FsX2xvY2soXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbiYjNDM7XHRzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHNpKTtcbiBcdHNwaW5fbG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbiBcbiBcdGlmIChyZXQpIHtcbkBAIC02NzEsNyAmIzQzOzEwMTYsNyBAQCBzdGF0aWMgYm9vbCBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdFx0Y2kgPSBsaXN0X2ZpcnN0X2VudHJ5KFx1MDAyNnNpLVx1MDAzZWRpc2NhcmRfY2x1c3RlcnMsIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbywgbGlzdCk7XG4gXHRcdC8qXG4gXHRcdCAqIERlbGV0ZSB0aGUgY2x1c3RlciBmcm9tIGxpc3QgdG8gcHJlcGFyZSBmb3IgZGlzY2FyZCwgYnV0IGtlZXBcbi1cdFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHBlcmNwdV9zd2FwX2NsdXN0ZXIgY291bGQgYmVcbiYjNDM7XHRcdCAqIHRoZSBDTFVTVEVSX0ZMQUdfRElTQ0FSRCBmbGFnLCB0aGVyZSBjb3VsZCBiZSBwZXJjcHVfY2x1c3RlclxuIFx0XHQgKiBwb2ludGluZyB0byBpdCwgb3IgcmFuIGludG8gYnkgcmVsb2NhdGVfY2x1c3Rlci5cbiBcdFx0ICovXG4gXHRcdGxpc3RfZGVsKFx1MDAyNmNpLVx1MDAzZWxpc3QpO1xuQEAgLTk1NSw3ICYjNDM7MTMwMCw3IEBAIHN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aWYgKGNsdXN0ZXJfaXNfZW1wdHkoY2kpKVxuIFx0XHRjaS1cdTAwM2VvcmRlciA9IG9yZGVyO1xuIFx0Y2ktXHUwMDNlY291bnQgJiM0Mzs9IG5yX3BhZ2VzO1xuLVx0c3dhcF9yYW5nZV9hbGxvYyhzaSwgbnJfcGFnZXMpO1xuJiM0MztcdHN3YXBfZGV2aWNlX2ludXNlX2FkZChzaSwgbnJfcGFnZXMpO1xuIFxuIFx0cmV0dXJuIHRydWU7XG4gfVxuQEAgLTEwMDMsMTIgJiM0MzsxMzQ4LDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWxsb2Nfc3dhcF9zY2FuX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIG91dDpcbiBcdHJlbG9jYXRlX2NsdXN0ZXIoc2ksIGNpKTtcbiBcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0aWYgKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkge1xuLVx0XHR0aGlzX2NwdV93cml0ZShwZXJjcHVfc3dhcF9jbHVzdGVyLm9mZnNldFtvcmRlcl0sIG5leHQpO1xuLVx0XHR0aGlzX2NwdV93cml0ZShwZXJjcHVfc3dhcF9jbHVzdGVyLnNpW29yZGVyXSwgc2kpO1xuLVx0fSBlbHNlIHtcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuJiM0MztcdFx0dGhpc19jcHVfd3JpdGUoc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbmV4dFtvcmRlcl0sIG5leHQpO1xuJiM0MztcdGVsc2VcbiBcdFx0c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbmV4dFtvcmRlcl0gPSBuZXh0O1xuLVx0fVxuIFx0cmV0dXJuIGZvdW5kO1xuIH1cbiBcbkBAIC0xMTAzLDEzICYjNDM7MTQ0NiwxNCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiAhKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfQkxLREVWKSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4tXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKSB7XG4tXHRcdC8qIFNlcmlhbGl6ZSBIREQgU1dBUCBhbGxvY2F0aW9uIGZvciBlYWNoIGRldmljZS4gKi9cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuJiM0MztyZXN0YXJ0OlxuJiM0MztcdHN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc2kpO1xuJiM0MztcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpXG4mIzQzO1x0XHRvZmZzZXQgPSBfX3RoaXNfY3B1X3JlYWQoc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbmV4dFtvcmRlcl0pO1xuJiM0MztcdGVsc2VcbiBcdFx0b2Zmc2V0ID0gc2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbmV4dFtvcmRlcl07XG4tXHRcdGlmIChvZmZzZXQgPT0gU1dBUF9FTlRSWV9JTlZBTElEKVxuLVx0XHRcdGdvdG8gbmV3X2NsdXN0ZXI7XG4gXG4mIzQzO1x0aWYgKG9mZnNldCAhPSBTV0FQX0VOVFJZX0lOVkFMSUQpIHtcbiBcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfbG9jayhzaSwgb2Zmc2V0KTtcbiBcdFx0LyogQ2x1c3RlciBjb3VsZCBoYXZlIGJlZW4gdXNlZCBieSBhbm90aGVyIG9yZGVyICovXG4gXHRcdGlmIChjbHVzdGVyX2lzX3VzYWJsZShjaSwgb3JkZXIpKSB7XG5AQCAtMTEyMyw3ICYjNDM7MTQ2Nyw2IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRcdFx0Z290byBkb25lO1xuIFx0fVxuIFxuLW5ld19jbHVzdGVyOlxuIFx0LypcbiBcdCAqIElmIHRoZSBkZXZpY2UgbmVlZCBkaXNjYXJkLCBwcmVmZXIgbmV3IGNsdXN0ZXIgb3ZlciBub25mdWxsXG4gXHQgKiB0byBzcHJlYWQgb3V0IHRoZSB3cml0ZXMuXG5AQCAtMTEzMiw2ICYjNDM7MTQ3NSwxMiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0XHRmb3VuZCA9IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHNpLCBcdTAwMjZzaS1cdTAwM2VmcmVlX2NsdXN0ZXJzLCBmb2xpbywgZmFsc2UpO1xuIFx0XHRpZiAoZm91bmQpXG4gXHRcdFx0Z290byBkb25lO1xuJiM0MztcbiYjNDM7XHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZzaS1cdTAwM2VkaXNjYXJkX2NsdXN0ZXJzKSkge1xuJiM0MztcdFx0XHRzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc2kpO1xuJiM0MztcdFx0XHRzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTtcbiYjNDM7XHRcdFx0Z290byByZXN0YXJ0O1xuJiM0MztcdFx0fVxuIFx0fVxuIFxuIFx0aWYgKG9yZGVyIFx1MDAzYyBQTURfT1JERVIpIHtcbkBAIC0xMTgwLDggJiM0MzsxNTI5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHRnb3RvIGRvbmU7XG4gXHR9XG4gZG9uZTpcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuJiM0MztcdHN3YXBfYWxsb2NfdW5sb2NrX2RldmljZShzaSk7XG4gXG4gXHRyZXR1cm4gZm91bmQ7XG4gfVxuQEAgLTExOTEsNTQgJiM0MzsxNTM5LDQ0IEBAIHN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBwYWdlcztcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiBcbi1cdGlmIChzd2Fwb2ZmKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZvcmNlZnVsbHkgcmVtb3ZlIGl0LiBDbGVhciB0aGUgU1dQX1dSSVRFT0sgZmxhZ3MgZm9yXG4tXHRcdCAqIHN3YXBvZmYgaGVyZSBzbyBpdCYjMzk7cyBzeW5jaHJvbml6ZWQgYnkgYm90aCBzaS1cdTAwM2Vsb2NrIGFuZFxuLVx0XHQgKiBzd2FwX2F2YWlsX2xvY2ssIHRvIGVuc3VyZSB0aGUgcmVzdWx0IGNhbiBiZSBzZWVuIGJ5XG4tXHRcdCAqIGFkZF90b19hdmFpbF9saXN0LlxuLVx0XHQgKi9cbi1cdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbi1cdFx0c2ktXHUwMDNlZmxhZ3MgXHUwMDI2PSB+U1dQX1dSSVRFT0s7XG4tXHRcdGF0b21pY19sb25nX29yKFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbi1cdH0gZWxzZSB7XG4tXHRcdC8qXG4tXHRcdCAqIElmIG5vdCBjYWxsZWQgYnkgc3dhcG9mZiwgdGFrZSBpdCBvZmYtbGlzdCBvbmx5IGlmIGl0JiMzOTtzXG4tXHRcdCAqIGZ1bGwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgbm90IHNldCAoc3RyaWN0bHlcbi1cdFx0ICogc2ktXHUwMDNlaW51c2VfcGFnZXMgPT0gcGFnZXMpLCBhbnkgY29uY3VycmVudCBzbG90IGZyZWVpbmcsXG4tXHRcdCAqIG9yIGRldmljZSBhbHJlYWR5IHJlbW92ZWQgZnJvbSBwbGlzdCBieSBzb21lb25lIGVsc2Vcbi1cdFx0ICogd2lsbCBtYWtlIHRoaXMgcmV0dXJuIGZhbHNlLlxuLVx0XHQgKi9cbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZvcmNlIHJlbW92ZSBpdCBvbmx5IGZvciBzd2Fwb2ZmLiBFbHNlLCB0YWtlIGl0IG9mZi1saXN0IG9ubHkgaWZcbiYjNDM7XHQgKiBpdCYjMzk7cyBmdWxsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQgKHN0cmljdGx5XG4mIzQzO1x0ICogc2ktXHUwMDNlaW51c2VfcGFnZXMgPT0gcGFnZXMpLCBzbyBjb25jdXJyZW50IHNsb3QgZnJlZWluZywgb3JcbiYjNDM7XHQgKiBjb25jdXJyZW50IGxpc3QgcmVtb3ZhbCB3aWxsIG1ha2UgdGhlIGNtcHhjaGcgZmFpbCBhbmQgc2tpcFxuJiM0MztcdCAqIHRoZSByZW1vdmFsLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghc3dhcG9mZikge1xuIFx0XHRwYWdlcyA9IHNpLVx1MDAzZXBhZ2VzO1xuIFx0XHRpZiAoIWF0b21pY19sb25nX3RyeV9jbXB4Y2hnKFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzLCBcdTAwMjZwYWdlcyxcbiBcdFx0XHRcdFx0ICAgICBwYWdlcyB8IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxuIFx0XHRcdGdvdG8gc2tpcDtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0YXRvbWljX2xvbmdfb3IoU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgXHUwMDI2c2ktXHUwMDNlaW51c2VfcGFnZXMpO1xuIFx0fVxuIFxuLVx0cGxpc3RfZGVsKFx1MDAyNnNpLVx1MDAzZWF2YWlsX2xpc3QsIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XG4tXG4mIzQzO1x0c3dhcF9xdWV1ZV9tYXNrKHNpKTtcbiBza2lwOlxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiB9XG4gXG4gLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHRoaXMgaGVscGVyLiAqL1xuLXN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pXG4mIzQzO3N0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiB7XG4gXHRsb25nIHZhbDtcbiBcdHVuc2lnbmVkIGxvbmcgcGFnZXM7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4gXG4tXHQvKiBDb3JyZXNwb25kaW5nIHRvIFNXUF9XUklURU9LIGNsZWFyaW5nIGluIGRlbF9mcm9tX2F2YWlsX2xpc3QgKi9cbi1cdGlmIChzd2Fwb24pIHtcbi1cdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbi1cdFx0c2ktXHUwMDNlZmxhZ3MgfD0gU1dQX1dSSVRFT0s7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoIShSRUFEX09OQ0Uoc2ktXHUwMDNlZmxhZ3MpIFx1MDAyNiBTV1BfV1JJVEVPSykpXG4tXHRcdFx0Z290byBza2lwO1xuLVx0fVxuJiM0MztcdC8qXG4mIzQzO1x0ICogTWFyayB0aGUgZGV2aWNlIGFzIGF2YWlsIGlmIFNXUF9XUklURU9LIGlzIHNldC4gU3dhcG9mZiBjbGVhcnNcbiYjNDM7XHQgKiBTV1BfV1JJVEVPSyBmaXJzdCwgc28gY2hlY2sgdGhhdCBmaXJzdCBzbyB0aGUgZGV2aWNlIHdvbiYjMzk7dCBiZVxuJiM0MztcdCAqIHJlLWFkZGVkIGFmdGVyIHN3YXBvZmYgc3RhcnRlZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spKVxuJiM0MztcdFx0Z290byBza2lwO1xuIFxuIFx0aWYgKCEoYXRvbWljX2xvbmdfcmVhZChcdTAwMjZzaS1cdTAwM2VpbnVzZV9wYWdlcykgXHUwMDI2IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxuIFx0XHRnb3RvIHNraXA7XG5AQCAtMTI0Niw5ICYjNDM7MTU4NCwxMCBAQCBzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxuIFx0dmFsID0gYXRvbWljX2xvbmdfZmV0Y2hfYW5kX3JlbGF4ZWQoflNXQVBfVVNBR0VfT0ZGTElTVF9CSVQsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbiBcbiBcdC8qXG4tXHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBkZXZpY2UgaXMgb24gdGhlIHBsaXN0LCBvbmx5IG9uZSB1cGRhdGVyIHdpbGxcbi1cdCAqIHNlZSAoaW51c2VfcGFnZXMgPT0gc2ktXHUwMDNlcGFnZXMpIGFuZCB3aWxsIGNhbGwgZGVsX2Zyb21fYXZhaWxfbGlzdC4gSWZcbi1cdCAqIHRoYXQgdXBkYXRlciBoYXBwZW4gdG8gYmUgaGVyZSwganVzdCBza2lwIGFkZGluZy5cbiYjNDM7XHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBtYXJrZWQgYXMgYXZhaWxhYmxlLCBvbmUgcmVhZGVyIHdpbGwgc2VlXG4mIzQzO1x0ICogKGludXNlX3BhZ2VzID09IHNpLVx1MDAzZXBhZ2VzKSBhbmQgc2hvdWxkIG1hcmsgaXQgYXMgdW5hdmFpbGFibGUgYW5kXG4mIzQzO1x0ICogc2V0IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQuIElmIHRoYXQgdXBkYXRlciBoYXBwZW5zIHRvIGJlIGhlcmUsIGp1c3RcbiYjNDM7XHQgKiBza2lwIHRoZSByZXN0LlxuIFx0ICovXG4gXHRwYWdlcyA9IHNpLVx1MDAzZXBhZ2VzO1xuIFx0aWYgKHZhbCA9PSBwYWdlcykge1xuQEAgLTEyNTgsNjAgJiM0MzsxNTk3LDQyIEBAIHN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pXG4gXHRcdFx0Z290byBza2lwO1xuIFx0fVxuIFxuLVx0cGxpc3RfYWRkKFx1MDAyNnNpLVx1MDAzZWF2YWlsX2xpc3QsIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XG4tXG4mIzQzO1x0c3dhcF9xdWV1ZV91bm1hc2soc2kpO1xuIHNraXA6XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuIH1cbiBcbiAvKlxuLSAqIHN3YXBfdXNhZ2VfYWRkIC8gc3dhcF91c2FnZV9zdWIgb2YgZWFjaCBzbG90IGFyZSBzZXJpYWxpemVkIGJ5IGNpLVx1MDAzZWxvY2tcbi0gKiB3aXRoaW4gZWFjaCBjbHVzdGVyLCBzbyB0aGUgdG90YWwgY29udHJpYnV0aW9uIHRvIHRoZSBnbG9iYWwgY291bnRlciBzaG91bGRcbi0gKiBhbHdheXMgYmUgcG9zaXRpdmUgYW5kIGNhbm5vdCBleGNlZWQgdGhlIHRvdGFsIG51bWJlciBvZiB1c2FibGUgc2xvdHMuXG4mIzQzOyAqIHN3YXBfZGV2aWNlX2ludXNlX2FkZCAvIHN3YXBfZGV2aWNlX2ludXNlX3N1YiBhcmUgY2FsbGVkIHdpdGhpbiBjbHVzdGVyXG4mIzQzOyAqIHVwZGF0ZSBjcml0aWNhbCBzZWN0aW9ucyBhbmQgc2VyaWFsaXplZCBieSBjaS1cdTAwM2Vsb2NrIHdpdGhpbiBlYWNoIGNsdXN0ZXIsXG4mIzQzOyAqIHNvIHRoZSB0b3RhbCBjb250cmlidXRpb24gdG8gdGhlIGdsb2JhbCBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmVcbiYjNDM7ICogYW5kIGNhbm5vdCBleGNlZWQgdGhlIHRvdGFsIG51bWJlciBvZiB1c2FibGUgc2xvdHMuXG4gICovXG4tc3RhdGljIGJvb2wgc3dhcF91c2FnZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBpbnQgbnJfZW50cmllcylcbiYjNDM7c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiYjNDM7XHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuIHtcbi1cdGxvbmcgdmFsID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbiYjNDM7XHRsb25nIGludXNlX3BhZ2VzO1xuIFxuIFx0LypcbiBcdCAqIElmIGRldmljZSBpcyBmdWxsLCBhbmQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBpcyBub3Qgc2V0LFxuLVx0ICogcmVtb3ZlIGl0IGZyb20gdGhlIHBsaXN0LlxuLVx0ICovXG4tXHRpZiAodW5saWtlbHkodmFsID09IHNpLVx1MDAzZXBhZ2VzKSkge1xuLVx0XHRkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBzd2FwX3VzYWdlX3N1YihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuLXtcbi1cdGxvbmcgdmFsID0gYXRvbWljX2xvbmdfc3ViX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbi1cbi1cdC8qXG4tXHQgKiBJZiBkZXZpY2UgaXMgbm90IGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIHNldCxcbi1cdCAqIGFkZCBpdCB0byB0aGUgcGxpc3QuXG4mIzQzO1x0ICogbWFyayBpdCB1bmF2YWlsYWJsZS5cbiBcdCAqL1xuLVx0aWYgKHVubGlrZWx5KHZhbCBcdTAwMjYgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCkpXG4tXHRcdGFkZF90b19hdmFpbF9saXN0KHNpLCBmYWxzZSk7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuLVx0XHRcdCAgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4te1xuLVx0aWYgKHN3YXBfdXNhZ2VfYWRkKHNpLCBucl9lbnRyaWVzKSkge1xuJiM0MztcdGludXNlX3BhZ2VzID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbiYjNDM7XHRpZiAodW5saWtlbHkoaW51c2VfcGFnZXMgPT0gc2ktXHUwMDNlcGFnZXMpKSB7XG4gXHRcdGlmICh2bV9zd2FwX2Z1bGwoKSlcbiBcdFx0XHRzY2hlZHVsZV93b3JrKFx1MDAyNnNpLVx1MDAzZXJlY2xhaW1fd29yayk7XG4mIzQzO1x0XHRkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7XG4gXHR9XG4mIzQzO1xuIFx0YXRvbWljX2xvbmdfc3ViKG5yX2VudHJpZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcbi1cdFx0XHQgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2ludXNlX3N1YihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBlbmQgPSBvZmZzZXQgJiM0MzsgbnJfZW50cmllcyAtIDE7XG4gXHR2b2lkICgqc3dhcF9zbG90X2ZyZWVfbm90aWZ5KShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpO1xuJiM0MztcdGxvbmcgaW51c2VfcGFnZXM7XG4gXHR1bnNpZ25lZCBpbnQgaTtcbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX2VudHJpZXM7IGkmIzQzOyYjNDM7KVxuQEAgLTEzMzUsNyAmIzQzOzE2NTYsMTQgQEAgc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9mcmVlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXG4gXHQgKi9cbiBcdHNtcF93bWIoKTtcbiBcdGF0b21pY19sb25nX2FkZChucl9lbnRyaWVzLCBcdTAwMjZucl9zd2FwX3BhZ2VzKTtcbi1cdHN3YXBfdXNhZ2Vfc3ViKHNpLCBucl9lbnRyaWVzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZiBkZXZpY2UgaXMgbm90IGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIHNldCxcbiYjNDM7XHQgKiBhZGQgaXQgYmFjayB0byB0aGUgYXZhaWxhYmxlIHF1ZXVlLlxuJiM0MztcdCAqL1xuJiM0MztcdGludXNlX3BhZ2VzID0gYXRvbWljX2xvbmdfc3ViX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbiYjNDM7XHRpZiAodW5saWtlbHkoaW51c2VfcGFnZXMgXHUwMDI2IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxuJiM0MztcdFx0YWRkX3RvX2F2YWlsX2xpc3Qoc2kpO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5AQCAtMTM0NSwxMTMgJiM0MzsxNjczLDQ5IEBAIHN0YXRpYyBib29sIGdldF9zd2FwX2RldmljZV9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdC8qXG4gXHQgKiBHdWFyYW50ZWUgdGhlIHNpLVx1MDAzZXVzZXJzIGFyZSBjaGVja2VkIGJlZm9yZSBhY2Nlc3Npbmcgb3RoZXJcbiBcdCAqIGZpZWxkcyBvZiBzd2FwX2luZm9fc3RydWN0LCBhbmQgc2ktXHUwMDNlZmxhZ3MgKFNXUF9XUklURU9LKSBpc1xuLVx0ICogdXAgdG8gZGF0ZWQuXG4mIzQzO1x0ICogdXAgdG8gZGF0ZS5cbiBcdCAqXG4tXHQgKiBQYWlyZWQgd2l0aCB0aGUgc3Bpbl91bmxvY2soKSBhZnRlciBzZXR1cF9zd2FwX2luZm8oKSBpblxuLVx0ICogZW5hYmxlX3N3YXBfaW5mbygpLCBhbmQgc21wX3dtYigpIGluIHN3YXBvZmYuXG4mIzQzO1x0ICogUGFpcmVkIHdpdGggcGVyY3B1X3VwX3dyaXRlKCkgaW4gc3dhcF9kZXZpY2VfZW5hYmxlKCksIGFuZFxuJiM0MztcdCAqIHNtcF93bWIoKSBhZnRlciBjbGVhcmluZyBTV1BfV1JJVEVPSyBpbiBzd2Fwb2ZmLlxuIFx0ICovXG4gXHRzbXBfcm1iKCk7XG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4tLypcbi0gKiBGYXN0IHBhdGggdHJ5IHRvIGdldCBzd2FwIGVudHJpZXMgd2l0aCBzcGVjaWZpZWQgb3JkZXIgZnJvbSBjdXJyZW50XG4tICogQ1BVJiMzOTtzIHN3YXAgZW50cnkgcG9vbCAoYSBjbHVzdGVyKS5cbi0gKi9cbi1zdGF0aWMgYm9vbCBzd2FwX2FsbG9jX2Zhc3Qoc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7c3RhdGljIGludCBzd2FwX2FsbG9jX2VudHJ5KHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0dW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuLVx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbiYjNDM7XHRsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuLVx0dW5zaWduZWQgaW50IG9mZnNldDtcbi1cbi1cdC8qXG4tXHQgKiBPbmNlIGFsbG9jYXRlZCwgc3dhcF9pbmZvX3N0cnVjdCB3aWxsIG5ldmVyIGJlIGNvbXBsZXRlbHkgZnJlZWQsXG4tXHQgKiBzbyBjaGVja2luZyBpdCYjMzk7cyBsaXZlbmVzcyBieSBnZXRfc3dhcF9kZXZpY2VfaW5mbyBpcyBlbm91Z2guXG4tXHQgKi9cbi1cdHNpID0gdGhpc19jcHVfcmVhZChwZXJjcHVfc3dhcF9jbHVzdGVyLnNpW29yZGVyXSk7XG4tXHRvZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0W29yZGVyXSk7XG4tXHRpZiAoIXNpIHx8ICFvZmZzZXQgfHwgIWdldF9zd2FwX2RldmljZV9pbmZvKHNpKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0Y2kgPSBzd2FwX2NsdXN0ZXJfbG9jayhzaSwgb2Zmc2V0KTtcbi1cdGlmIChjbHVzdGVyX2lzX3VzYWJsZShjaSwgb3JkZXIpKSB7XG4tXHRcdGlmIChjbHVzdGVyX2lzX2VtcHR5KGNpKSlcbi1cdFx0XHRvZmZzZXQgPSBjbHVzdGVyX29mZnNldChzaSwgY2kpO1xuLVx0XHRhbGxvY19zd2FwX3NjYW5fY2x1c3RlcihzaSwgY2ksIGZvbGlvLCBvZmZzZXQpO1xuLVx0fSBlbHNlIHtcbi1cdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9XG4mIzQzO1x0aW50IG5yX2l0ZXIsIHJldDtcbiYjNDM7XG4mIzQzO1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdGZvciAobnJfaXRlciA9IDA7OyBucl9pdGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0c2kgPSBzd2FwX3F1ZXVlX2dldF9kZXZpY2UobnJfcGFnZXMsIG5yX2l0ZXIpO1xuJiM0MztcdFx0aWYgKElTX0VSUihzaSkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gUFRSX0VSUihzaSk7XG4mIzQzO1x0XHRcdGlmIChyZXQgPT0gLUVCVVNZKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzaSwgZm9saW8pO1xuIFxuLVx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcbi1cdHJldHVybiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4tfVxuLVxuLS8qIFJvdGF0ZSB0aGUgZGV2aWNlIGFuZCBzd2l0Y2ggdG8gYSBuZXcgY2x1c3RlciAqL1xuLXN0YXRpYyB2b2lkIHN3YXBfYWxsb2Nfc2xvdyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLXtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgKm5leHQ7XG4tXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbi1zdGFydF9vdmVyOlxuLVx0cGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzaSwgbmV4dCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkLCBhdmFpbF9saXN0KSB7XG4tXHRcdC8qIFJvdGF0ZSB0aGUgZGV2aWNlIGFuZCBzd2l0Y2ggdG8gYSBuZXcgY2x1c3RlciAqL1xuLVx0XHRwbGlzdF9yZXF1ZXVlKFx1MDAyNnNpLVx1MDAzZWF2YWlsX2xpc3QsIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4tXHRcdGlmIChnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpIHtcbi1cdFx0XHRjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIGZvbGlvKTtcbi1cdFx0XHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4tXHRcdFx0XHRyZXR1cm47XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuLVx0XHRcdFx0cmV0dXJuO1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xuJiM0MztcdFx0XHRyZXQgPSAwO1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0fVxuIFxuLVx0XHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbiBcdFx0Lypcbi1cdFx0ICogaWYgd2UgZ290IGhlcmUsIGl0JiMzOTtzIGxpa2VseSB0aGF0IHNpIHdhcyBhbG1vc3QgZnVsbCBiZWZvcmUsXG4tXHRcdCAqIG11bHRpcGxlIGNhbGxlcnMgcHJvYmFibHkgYWxsIHRyaWVkIHRvIGdldCBhIHBhZ2UgZnJvbSB0aGVcbi1cdFx0ICogc2FtZSBzaSBhbmQgaXQgZmlsbGVkIHVwIGJlZm9yZSB3ZSBjb3VsZCBnZXQgb25lOyBvciwgdGhlIHNpXG4tXHRcdCAqIGZpbGxlZCB1cCBiZXR3ZWVuIHVzIGRyb3BwaW5nIHN3YXBfYXZhaWxfbG9jay5cbi1cdFx0ICogU2luY2Ugd2UgZHJvcHBlZCB0aGUgc3dhcF9hdmFpbF9sb2NrLCB0aGUgc3dhcF9hdmFpbF9saXN0XG4tXHRcdCAqIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQ7IHNvIGlmIG5leHQgaXMgc3RpbGwgaW4gdGhlXG4tXHRcdCAqIHN3YXBfYXZhaWxfaGVhZCBsaXN0IHRoZW4gdHJ5IGl0LCBvdGhlcndpc2Ugc3RhcnQgb3ZlciBpZiB3ZVxuLVx0XHQgKiBoYXZlIG5vdCBnb3R0ZW4gYW55IHNsb3RzLlxuJiM0MztcdFx0ICogRm9yIGxhcmdlIGFsbG9jYXRpb24sIHJldHVybiBlcnJvciBkaXJlY3RseSB0byBpbmZvcm0gdGhlXG4mIzQzO1x0XHQgKiBjYWxsZXIgdG8gc3BsaXQgaXQgaW5zdGVhZCBvZiBmYWxsYmFjayB0byBvdGhlciBkZXZpY2VzLlxuIFx0XHQgKi9cbi1cdFx0aWYgKHBsaXN0X25vZGVfZW1wdHkoXHUwMDI2bmV4dC1cdTAwM2VhdmFpbF9saXN0KSlcbi1cdFx0XHRnb3RvIHN0YXJ0X292ZXI7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuLX1cbi1cbi0vKlxuLSAqIERpc2NhcmQgcGVuZGluZyBjbHVzdGVycyBpbiBhIHN5bmNocm9uaXplZCB3YXkgd2hlbiB1bmRlciBoaWdoIHByZXNzdXJlLlxuLSAqIFJldHVybjogdHJ1ZSBpZiBhbnkgY2x1c3RlciBpcyBkaXNjYXJkZWQuXG4tICovXG4tc3RhdGljIGJvb2wgc3dhcF9zeW5jX2Rpc2NhcmQodm9pZClcbi17XG4tXHRib29sIHJldCA9IGZhbHNlO1xuLVx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCAqbmV4dDtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLXN0YXJ0X292ZXI6XG4tXHRwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNpLCBuZXh0LCBcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkLCBsaXN0KSB7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdGlmIChnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpIHtcbi1cdFx0XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9QQUdFX0RJU0NBUkQpXG4tXHRcdFx0XHRyZXQgPSBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTtcbi1cdFx0XHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4mIzQzO1x0XHRcdHJldCA9IC1FMkJJRztcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKHJldClcbi1cdFx0XHRyZXR1cm4gdHJ1ZTtcbi1cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdGlmIChwbGlzdF9ub2RlX2VtcHR5KFx1MDAyNm5leHQtXHUwMDNlbGlzdCkpXG4tXHRcdFx0Z290byBzdGFydF9vdmVyO1xuIFx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiBcbi1cdHJldHVybiBmYWxzZTtcbiYjNDM7XHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyBpbnQgc3dhcF9leHRlbmRfdGFibGVfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuQEAgLTE3MzUsNiAmIzQzOzE5OTksNyBAQCBpbnQgZm9saW9fYWxsb2Nfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiBcdHVuc2lnbmVkIGludCBvcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHVuc2lnbmVkIGludCBzaXplID0gMSBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0aW50IHJldDtcbiBcbiBcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pLCBmb2xpbyk7XG5AQCAtMTc1NywyMyAmIzQzOzIwMjIsMTQgQEAgaW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0fVxuIFx0fVxuIFxuLWFnYWluOlxuLVx0bG9jYWxfbG9jayhcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spO1xuLVx0aWYgKCFzd2FwX2FsbG9jX2Zhc3QoZm9saW8pKVxuLVx0XHRzd2FwX2FsbG9jX3Nsb3coZm9saW8pO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4tXG4tXHRpZiAoIW9yZGVyIFx1MDAyNlx1MDAyNiB1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkge1xuLVx0XHRpZiAoc3dhcF9zeW5jX2Rpc2NhcmQoKSlcbi1cdFx0XHRnb3RvIGFnYWluO1xuLVx0fVxuJiM0MztcdHJldCA9IHN3YXBfYWxsb2NfZW50cnkoZm9saW8pO1xuIFxuIFx0LyogTmVlZCB0byBjYWxsIHRoaXMgZXZlbiBpZiBhbGxvY2F0aW9uIGZhaWxlZCwgZm9yIE1FTUNHX1NXQVBfRkFJTC4gKi9cbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcChmb2xpbykpKVxuIFx0XHRzd2FwX2NhY2hlX2RlbF9mb2xpbyhmb2xpbyk7XG4gXG4gXHRpZiAodW5saWtlbHkoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdFx0cmV0dXJuIHJldCA/IHJldCA6IC1FTk9NRU07XG4gXG4gXHRyZXR1cm4gMDtcbiB9XG5AQCAtMTk0OCw3ICYjNDM7MjIwNCw3IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdGlmIChiYXRjaF9pZClcbiBcdFx0bWVtX2Nncm91cF91bmNoYXJnZV9zd2FwKGJhdGNoX2lkLCBjaV9vZmYgLSBiYXRjaF9vZmYpO1xuIFxuLVx0c3dhcF9yYW5nZV9mcmVlKHNpLCBjaV9oZWFkICYjNDM7IGNpX3N0YXJ0LCBucl9wYWdlcyk7XG4mIzQzO1x0c3dhcF9kZXZpY2VfaW51c2Vfc3ViKHNpLCBjaV9oZWFkICYjNDM7IGNpX3N0YXJ0LCBucl9wYWdlcyk7XG4gXHRzd2FwX2NsdXN0ZXJfYXNzZXJ0X2VtcHR5KGNpLCBjaV9zdGFydCwgbnJfcGFnZXMsIGZhbHNlKTtcbiBcbiBcdGlmICghY2ktXHUwMDNlY291bnQpXG5AQCAtMjE1MCwzMSAmIzQzOzI0MDYsMTQgQEAgdm9pZCBzd2FwX3B1dF9lbnRyaWVzX2RpcmVjdChzd3BfZW50cnlfdCBlbnRyeSwgaW50IG5yKVxuICAqL1xuIHN3cF9lbnRyeV90IHN3YXBfYWxsb2NfaGliZXJuYXRpb25fc2xvdChpbnQgdHlwZSlcbiB7XG4tXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcGNwX3NpLCAqc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcbi1cdHVuc2lnbmVkIGxvbmcgcGNwX29mZnNldCwgb2Zmc2V0ID0gU1dBUF9FTlRSWV9JTlZBTElEO1xuLVx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG9mZnNldCA9IFNXQVBfRU5UUllfSU5WQUxJRDtcbiBcdHN3cF9lbnRyeV90IGVudHJ5ID0gezB9O1xuIFxuIFx0aWYgKCFzaSlcbiBcdFx0Z290byBmYWlsO1xuIFxuLVx0Lypcbi1cdCAqIFRyeSB0aGUgbG9jYWwgY2x1c3RlciBmaXJzdCBpZiBpdCBtYXRjaGVzIHRoZSBkZXZpY2UuIElmXG4tXHQgKiBub3QsIHRyeSBncmFiIGEgbmV3IGNsdXN0ZXIgYW5kIG92ZXJyaWRlIGxvY2FsIGNsdXN0ZXIuXG4tXHQgKi9cbi1cdGxvY2FsX2xvY2soXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcbi1cdHBjcF9zaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVswXSk7XG4tXHRwY3Bfb2Zmc2V0ID0gdGhpc19jcHVfcmVhZChwZXJjcHVfc3dhcF9jbHVzdGVyLm9mZnNldFswXSk7XG4tXHRpZiAocGNwX3NpID09IHNpIFx1MDAyNlx1MDAyNiBwY3Bfb2Zmc2V0KSB7XG4tXHRcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIHBjcF9vZmZzZXQpO1xuLVx0XHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIDApKVxuLVx0XHRcdG9mZnNldCA9IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHNpLCBjaSwgTlVMTCwgcGNwX29mZnNldCk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdH1cbi1cdGlmICghb2Zmc2V0KVxuLVx0XHRvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4mIzQzO1x0b2Zmc2V0ID0gY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBOVUxMKTtcbiBcdGlmIChvZmZzZXQpXG4gXHRcdGVudHJ5ID0gc3dwX2VudHJ5KHNpLVx1MDAzZXR5cGUsIG9mZnNldCk7XG4gXG5AQCAtMjIwNSwyNiAmIzQzOzI0NDQsMTggQEAgdm9pZCBzd2FwX2ZyZWVfaGliZXJuYXRpb25fc2xvdChzd3BfZW50cnlfdCBlbnRyeSlcbiBcbiBzdGF0aWMgaW50IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4ge1xuLVx0aW50IHR5cGU7XG4tXG4tXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuIFxuIFx0aWYgKCFkZXZpY2UpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlJiM0MzsmIzQzOykge1xuLVx0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzID0gc3dhcF9pbmZvW3R5cGVdO1xuLVxuLVx0XHRpZiAoIShzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbi1cdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0aWYgKGRldmljZSA9PSBzaXMtXHUwMDNlYmRldi1cdTAwM2ViZF9kZXYpIHtcbi1cdFx0XHRzdHJ1Y3Qgc3dhcF9leHRlbnQgKnNlID0gZmlyc3Rfc2Uoc2lzKTtcbi1cbi1cdFx0XHRpZiAoc2UtXHUwMDNlc3RhcnRfYmxvY2sgPT0gb2Zmc2V0KVxuLVx0XHRcdFx0cmV0dXJuIHR5cGU7XG4mIzQzO1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xuJiM0MztcdFx0aWYgKGRldmljZSA9PSBzaS1cdTAwM2ViZGV2LVx1MDAzZWJkX2Rldikge1xuJiM0MztcdFx0XHRpZiAoZmlyc3Rfc2Uoc2kpLVx1MDAzZXN0YXJ0X2Jsb2NrID09IG9mZnNldClcbiYjNDM7XHRcdFx0XHRyZXR1cm4gc2ktXHUwMDNldHlwZTtcbiBcdFx0fVxuIFx0fVxuJiM0MztcbiBcdHJldHVybiAtRU5PREVWO1xuIH1cbiBcbkBAIC0yMjQ3LDIxICYjNDM7MjQ3OCwxOCBAQCBzdGF0aWMgaW50IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4gICovXG4gaW50IHBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4ge1xuLVx0aW50IHR5cGU7XG4mIzQzO1x0aW50IHJldDtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVxuLVx0dHlwZSA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpO1xuLVx0aWYgKHR5cGUgXHUwMDNjIDApIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0cmV0dXJuIHR5cGU7XG4tXHR9XG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRyZXQgPSBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldmljZSwgb2Zmc2V0KTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4gXG4tXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuJiM0MztcdHNpID0gc3dhcF90eXBlX3RvX2luZm8ocmV0KTtcbiBcdGlmIChXQVJOX09OX09OQ0UoIXNpKSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRyZXR1cm4gLUVOT0RFVjtcbiYjNDM7XHRcdHJldCA9IC1FTk9ERVY7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMjI3MCwxNCAmIzQzOzI0OTgsMTUgQEAgaW50IHBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4gXHQgKiB0aGUgc2FtZSBzZXNzaW9uLlxuIFx0ICovXG4gXHRpZiAoV0FSTl9PTl9PTkNFKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfSElCRVJOQVRJT04pKSB7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdHJldHVybiAtRUJVU1k7XG4mIzQzO1x0XHRyZXQgPSAtRUJVU1k7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9ISUJFUk5BVElPTjtcbiBcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRyZXR1cm4gdHlwZTtcbiYjNDM7b3V0OlxuJiM0MztcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdHJldHVybiByZXQ7XG4gfVxuIFxuIC8qKlxuQEAgLTIyOTQsMTQgJiM0MzsyNTIzLDExIEBAIHZvaWQgdW5waW5faGliZXJuYXRpb25fc3dhcF90eXBlKGludCB0eXBlKVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuLVx0aWYgKCFzaSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRyZXR1cm47XG4tXHR9XG4tXHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfSElCRVJOQVRJT047XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdGlmIChzaSlcbiYjNDM7XHRcdHNpLVx1MDAzZWZsYWdzIFx1MDAyNj0gflNXUF9ISUJFUk5BVElPTjtcbiYjNDM7XHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gXG4gLyoqXG5AQCAtMjMyNiwyOSAmIzQzOzI1NTIsMjYgQEAgaW50IGZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuIHtcbiBcdGludCB0eXBlO1xuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0dHlwZSA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFxuIFx0cmV0dXJuIHR5cGU7XG4gfVxuIFxuIGludCBmaW5kX2ZpcnN0X3N3YXAoZGV2X3QgKmRldmljZSlcbiB7XG4tXHRpbnQgdHlwZTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlJiM0MzsmIzQzOykge1xuLVx0XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzID0gc3dhcF9pbmZvW3R5cGVdO1xuJiM0MztcdGludCByZXQgPSAtRU5PREVWO1xuJiM0MztcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcbi1cdFx0aWYgKCEoc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfV1JJVEVPSykpXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdCpkZXZpY2UgPSBzaXMtXHUwMDNlYmRldi1cdTAwM2ViZF9kZXY7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdHJldHVybiB0eXBlO1xuJiM0MztcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRmb3JfZWFjaF9hdmFpbF9zd2FwKHNpKSB7XG4mIzQzO1x0XHQqZGV2aWNlID0gc2ktXHUwMDNlYmRldi1cdTAwM2ViZF9kZXY7XG4mIzQzO1x0XHRyZXQgPSBzaS1cdTAwM2V0eXBlO1xuJiM0MztcdFx0YnJlYWs7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiAvKlxuQEAgLTIzNzYsNyAmIzQzOzI1OTksNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXG4ge1xuIFx0dW5zaWduZWQgaW50IG4gPSAwO1xuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0aWYgKCh1bnNpZ25lZCBpbnQpdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XG4gXHRcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07XG4gXG5AQCAtMjM4OCw3ICYjNDM7MjYxMSw3IEBAIHVuc2lnbmVkIGludCBjb3VudF9zd2FwX3BhZ2VzKGludCB0eXBlLCBpbnQgZnJlZSlcbiBcdFx0fVxuIFx0XHRzcGluX3VubG9jayhcdTAwMjZzaXMtXHUwMDNlbG9jayk7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV91cF9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRyZXR1cm4gbjtcbiB9XG4gI2VuZGlmIC8qIENPTkZJR19ISUJFUk5BVElPTiAqL1xuQEAgLTI3MDAsMTAgJiM0MzsyOTIzLDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9uZXh0X3RvX3VudXNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdHVuc2lnbmVkIGxvbmcgc3dwX3RiO1xuIFxuIFx0Lypcbi1cdCAqIE5vIG5lZWQgZm9yIHN3YXBfbG9jayBoZXJlOiB3ZSYjMzk7cmUganVzdCBsb29raW5nXG4mIzQzO1x0ICogTm8gbmVlZCBmb3Igc3dhcG9uX3J3c2VtIGhlcmU6IHdlJiMzOTtyZSBqdXN0IGxvb2tpbmdcbiBcdCAqIGZvciB3aGV0aGVyIGFuIGVudHJ5IGlzIGluIHVzZSwgbm90IG1vZGlmeWluZyBpdDsgZmFsc2VcbiBcdCAqIGhpdHMgYXJlIG9rYXksIGFuZCBzeXNfc3dhcG9mZigpIGhhcyBhbHJlYWR5IHByZXZlbnRlZCBuZXdcbi1cdCAqIGFsbG9jYXRpb25zIGZyb20gdGhpcyBhcmVhICh3aGlsZSBob2xkaW5nIHN3YXBfbG9jaykuXG4mIzQzO1x0ICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcG9uX3J3c2VtKS5cbiBcdCAqL1xuIFx0Zm9yIChpID0gcHJldiAmIzQzOyAxOyBpIFx1MDAzYyBzaS1cdTAwM2VtYXg7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdHN3cF90YiA9IHN3YXBfdGFibGVfZ2V0KF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgaSksXG5AQCAtMjgxNiw3ICYjNDM7MzAzOSw3IEBAIHN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKVxuIHN1Y2Nlc3M6XG4gXHQvKlxuIFx0ICogTWFrZSBzdXJlIHRoYXQgZnVydGhlciBjbGVhbnVwcyBhZnRlciB0cnlfdG9fdW51c2UoKSByZXR1cm5zIGhhcHBlblxuLVx0ICogYWZ0ZXIgc3dhcF9yYW5nZV9mcmVlKCkgcmVkdWNlcyBzaS1cdTAwM2VpbnVzZV9wYWdlcyB0byAwLlxuJiM0MztcdCAqIGFmdGVyIHN3YXBfZGV2aWNlX2ludXNlX3N1YigpIHJlZHVjZXMgc2ktXHUwMDNlaW51c2VfcGFnZXMgdG8gMC5cbiBcdCAqL1xuIFx0c21wX21iKCk7XG4gXHRyZXR1cm4gMDtcbkBAIC0yODI0LDE4ICYjNDM7MzA0NywyMCBAQCBzdGF0aWMgaW50IHRyeV90b191bnVzZSh1bnNpZ25lZCBpbnQgdHlwZSlcbiBcbiAvKlxuICAqIEFmdGVyIGEgc3VjY2Vzc2Z1bCB0cnlfdG9fdW51c2UsIGlmIG5vIHN3YXAgaXMgbm93IGluIHVzZSwgd2Uga25vd1xuLSAqIHdlIGNhbiBlbXB0eSB0aGUgbW1saXN0LiAgc3dhcF9sb2NrIG11c3QgYmUgaGVsZCBvbiBlbnRyeSBhbmQgZXhpdC5cbi0gKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBfbG9jaywgYW5kIGFuIG1tIG11c3QgYmVcbiYjNDM7ICogd2UgY2FuIGVtcHR5IHRoZSBtbWxpc3QuIHN3YXBvbl9yd3NlbSBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuXG4mIzQzOyAqIE5vdGUgdGhhdCBtbWxpc3RfbG9jayBuZXN0cyBpbnNpZGUgc3dhcG9uX3J3c2VtLCBhbmQgYW4gbW0gbXVzdCBiZVxuICAqIGFkZGVkIHRvIHRoZSBtbWxpc3QganVzdCBhZnRlciBwYWdlX2R1cGxpY2F0ZSAtIGJlZm9yZSB3b3VsZCBiZSByYWN5LlxuICAqL1xuIHN0YXRpYyB2b2lkIGRyYWluX21tbGlzdCh2b2lkKVxuIHtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbmV4dDtcbi1cdHVuc2lnbmVkIGludCB0eXBlO1xuIFxuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlJiM0MzsmIzQzOylcbi1cdFx0aWYgKHN3YXBfdXNhZ2VfaW5fcGFnZXMoc3dhcF9pbmZvW3R5cGVdKSlcbiYjNDM7XHRmb3JfZWFjaF9zd2FwKHNpKSB7XG4mIzQzO1x0XHRpZiAoc3dhcF91c2FnZV9pbl9wYWdlcyhzaSkpXG4gXHRcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRzcGluX2xvY2soXHUwMDI2bW1saXN0X2xvY2spO1xuIFx0bGlzdF9mb3JfZWFjaF9zYWZlKHAsIG5leHQsIFx1MDAyNmluaXRfbW0ubW1saXN0KVxuIFx0XHRsaXN0X2RlbF9pbml0KHApO1xuQEAgLTI5NjgsNTggJiM0MzszMTkzLDY1IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG4gXHRyZXR1cm4gZ2VuZXJpY19zd2FwZmlsZV9hY3RpdmF0ZShzaXMsIHN3YXBfZmlsZSwgc3Bhbik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9lbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbi17XG4tXHRhdG9taWNfbG9uZ19hZGQoc2ktXHUwMDNlcGFnZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuLVx0dG90YWxfc3dhcF9wYWdlcyAmIzQzOz0gc2ktXHUwMDNlcGFnZXM7XG4tXG4tXHRhc3NlcnRfc3Bpbl9sb2NrZWQoXHUwMDI2c3dhcF9sb2NrKTtcbi1cbi1cdHBsaXN0X2FkZChcdTAwMjZzaS1cdTAwM2VsaXN0LCBcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkKTtcbi1cbi1cdC8qIEFkZCBiYWNrIHRvIGF2YWlsYWJsZSBsaXN0ICovXG4tXHRhZGRfdG9fYXZhaWxfbGlzdChzaSwgdHJ1ZSk7XG4tfVxuLVxuIC8qXG4tICogQ2FsbGVkIGFmdGVyIHRoZSBzd2FwIGRldmljZSBpcyByZWFkeSwgcmVzdXJyZWN0IGl0cyBwZXJjcHUgcmVmLCBpdCYjMzk7cyBub3dcbi0gKiBzYWZlIHRvIHJlZmVyZW5jZSBpdC4gQWRkIGl0IHRvIHRoZSBsaXN0IHRvIGV4cG9zZSBpdCB0byB0aGUgYWxsb2NhdG9yLlxuJiM0MzsgKiBDYWxsZWQgYWZ0ZXIgdGhlIHN3YXAgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIHVzZWQuIE1hcmtpbmcgaXQgd3JpdGFibGUgYW5kXG4mIzQzOyAqIGV4cG9zaW5nIGl0IHRvIHRoZSBhbGxvY2F0b3IuIFJlc3VycmVjdCBpdHMgcGVyY3B1IHJlZiBpZiBpdCB3YXMgZGVhZCBiZWZvcmUuXG4gICovXG4tc3RhdGljIHZvaWQgZW5hYmxlX3N3YXBfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4mIzQzO3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2VuYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4ge1xuLVx0cGVyY3B1X3JlZl9yZXN1cnJlY3QoXHUwMDI2c2ktXHUwMDNldXNlcnMpO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRzcGluX2xvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4tXHRfZW5hYmxlX3N3YXBfaW5mbyhzaSk7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tfVxuJiM0MztcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9XUklURU9LO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuJiM0MztcdGF0b21pY19sb25nX2FkZChzaS1cdTAwM2VwYWdlcywgXHUwMDI2bnJfc3dhcF9wYWdlcyk7XG4mIzQzO1x0dG90YWxfc3dhcF9wYWdlcyAmIzQzOz0gc2ktXHUwMDNlcGFnZXM7XG4mIzQzO1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXG4tc3RhdGljIHZvaWQgcmVpbnNlcnRfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbi17XG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdHNwaW5fbG9jayhcdTAwMjZzaS1cdTAwM2Vsb2NrKTtcbi1cdF9lbmFibGVfc3dhcF9pbmZvKHNpKTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRhZGRfdG9fYXZhaWxfbGlzdChzaSk7XG4gfVxuIFxuLS8qXG4tICogQ2FsbGVkIGFmdGVyIGNsZWFyaW5nIFNXUF9XUklURU9LLCBlbnN1cmVzIGNsdXN0ZXJfYWxsb2NfcmFuZ2Vcbi0gKiBzZWUgdGhlIHVwZGF0ZWQgZmxhZ3MsIHNvIHRoZXJlIHdpbGwgYmUgbm8gbW9yZSBhbGxvY2F0aW9ucy5cbi0gKi9cbi1zdGF0aWMgdm9pZCB3YWl0X2Zvcl9hbGxvY2F0aW9uKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiYjNDM7c3RhdGljIGludCBzd2FwX2RldmljZV9kaXNhYmxlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiB7XG4gXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcbiBcdHVuc2lnbmVkIGxvbmcgZW5kID0gQUxJR04oc2ktXHUwMDNlbWF4LCBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4gXG4tXHRCVUdfT04oc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIFNXUF9XUklURU9LIGlzIG5vdCBzZXQ6IGFub3RoZXIgcHJvY2VzcyBhbHJlYWR5IGRpc2FibGluZyBpdC5cbiYjNDM7XHQgKiBJZiBTV1BfSElCRVJOQVRJT04gaXMgc2V0OiB0aGUgZGV2aWNlIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiYjNDM7XHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spIHx8XG4mIzQzO1x0ICAgIHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfSElCRVJOQVRJT04pIHtcbiYjNDM7XHRcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChzZWN1cml0eV92bV9lbm91Z2hfbWVtb3J5X21tKGN1cnJlbnQtXHUwMDNlbW0sIHNpLVx1MDAzZXBhZ2VzKSkge1xuJiM0MztcdFx0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHR9XG4mIzQzO1x0dm1fdW5hY2N0X21lbW9yeShzaS1cdTAwM2VwYWdlcyk7XG4mIzQzO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiYjNDM7XHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfV1JJVEVPSztcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiYjNDM7XHR0b3RhbF9zd2FwX3BhZ2VzIC09IHNpLVx1MDAzZXBhZ2VzO1xuJiM0MztcdGF0b21pY19sb25nX3N1YihzaS1cdTAwM2VwYWdlcywgXHUwMDI2bnJfc3dhcF9wYWdlcyk7XG4mIzQzO1x0ZGVsX2Zyb21fYXZhaWxfbGlzdChzaSwgdHJ1ZSk7XG4mIzQzO1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTd2FwIGFsbG9jYXRvciBkb2VzbiYjMzk7dCB0b3VjaCBzaSBsb2NrLCBzbyBsb29waW5nIHRocm91Z2ggYWxsXG4mIzQzO1x0ICogY2kgbG9ja3MgZW5zdXJlcyBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzIHNlZXMgdGhlXG4mIzQzO1x0ICogdXBkYXRlZCBmbGFncywgYW5kIG5vIG1vcmUgYWxsb2NhdGlvbnMgd2lsbCBvY2N1ci5cbiYjNDM7XHQgKi9cbiBcdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IFx1MDAzYyBlbmQ7IG9mZnNldCAmIzQzOz0gU1dBUEZJTEVfQ0xVU1RFUikge1xuIFx0XHRjaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpO1xuIFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbiBcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXG5AQCAtMzA0MywyOCAmIzQzOzMyNzUsNiBAQCBzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLFxuIFx0a3ZmcmVlKGNsdXN0ZXJfaW5mbyk7XG4gfVxuIFxuLS8qXG4tICogQ2FsbGVkIGFmdGVyIHN3YXAgZGV2aWNlJiMzOTtzIHJlZmVyZW5jZSBjb3VudCBpcyBkZWFkLCBzb1xuLSAqIG5laXRoZXIgc2NhbiBub3IgYWxsb2NhdGlvbiB3aWxsIHVzZSBpdC5cbi0gKi9cbi1zdGF0aWMgdm9pZCBmbHVzaF9wZXJjcHVfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbi17XG4tXHRpbnQgY3B1LCBpO1xuLVx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKipwY3Bfc2k7XG4tXG4tXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4tXHRcdHBjcF9zaSA9IHBlcl9jcHVfcHRyKHBlcmNwdV9zd2FwX2NsdXN0ZXIuc2ksIGNwdSk7XG4tXHRcdC8qXG4tXHRcdCAqIEludmFsaWRhdGUgdGhlIHBlcmNwdSBzd2FwIGNsdXN0ZXIgY2FjaGUsIHNpLVx1MDAzZXVzZXJzXG4tXHRcdCAqIGlzIGRlYWQsIHNvIG5vIG5ldyB1c2VyIHdpbGwgcG9pbnQgdG8gaXQsIGp1c3QgZmx1c2hcbi1cdFx0ICogYW55IGV4aXN0aW5nIHVzZXIuXG4tXHRcdCAqL1xuLVx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBTV0FQX05SX09SREVSUzsgaSYjNDM7JiM0MzspXG4tXHRcdFx0Y21weGNoZyhcdTAwMjZwY3Bfc2lbaV0sIHNpLCBOVUxMKTtcbi1cdH1cbi19XG4tXG4tXG4gU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIHtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwID0gTlVMTDtcbkBAIC0zMDg2LDQ0ICYjNDM7MzI5NiwyMiBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXHRcdHJldHVybiBQVFJfRVJSKHZpY3RpbSk7XG4gXG4gXHRtYXBwaW5nID0gdmljdGltLVx1MDAzZWZfbWFwcGluZztcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0cGxpc3RfZm9yX2VhY2hfZW50cnkocCwgXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCwgbGlzdCkge1xuLVx0XHRpZiAocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spIHtcbi1cdFx0XHRpZiAocC1cdTAwM2Vzd2FwX2ZpbGUtXHUwMDNlZl9tYXBwaW5nID09IG1hcHBpbmcpIHtcbi1cdFx0XHRcdGZvdW5kID0gMTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbiYjNDM7XHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChwKSB7XG4mIzQzO1x0XHRpZiAocC1cdTAwM2Vzd2FwX2ZpbGUtXHUwMDNlZl9tYXBwaW5nID09IG1hcHBpbmcpIHtcbiYjNDM7XHRcdFx0Zm91bmQgPSAxO1xuJiM0MztcdFx0XHRicmVhaztcbiBcdFx0fVxuIFx0fVxuLVx0aWYgKCFmb3VuZCkge1xuLVx0XHRlcnIgPSAtRUlOVkFMO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuLVx0fVxuLVxuLVx0LyogUmVmdXNlIHN3YXBvZmYgd2hpbGUgdGhlIGRldmljZSBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uICovXG4tXHRpZiAocC1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX0hJQkVSTkFUSU9OKSB7XG4tXHRcdGVyciA9IC1FQlVTWTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0Z290byBvdXRfZHB1dDtcbi1cdH1cbiYjNDM7XHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdGZpbHBfY2xvc2UodmljdGltLCBOVUxMKTtcbiBcbi1cdGlmICghc2VjdXJpdHlfdm1fZW5vdWdoX21lbW9yeV9tbShjdXJyZW50LVx1MDAzZW1tLCBwLVx1MDAzZXBhZ2VzKSlcbi1cdFx0dm1fdW5hY2N0X21lbW9yeShwLVx1MDAzZXBhZ2VzKTtcbi1cdGVsc2Uge1xuLVx0XHRlcnIgPSAtRU5PTUVNO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuLVx0fVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnAtXHUwMDNlbG9jayk7XG4tXHRkZWxfZnJvbV9hdmFpbF9saXN0KHAsIHRydWUpO1xuLVx0cGxpc3RfZGVsKFx1MDAyNnAtXHUwMDNlbGlzdCwgXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCk7XG4tXHRhdG9taWNfbG9uZ19zdWIocC1cdTAwM2VwYWdlcywgXHUwMDI2bnJfc3dhcF9wYWdlcyk7XG4tXHR0b3RhbF9zd2FwX3BhZ2VzIC09IHAtXHUwMDNlcGFnZXM7XG4tXHRzcGluX3VubG9jayhcdTAwMjZwLVx1MDAzZWxvY2spO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRpZiAoIWZvdW5kKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHR3YWl0X2Zvcl9hbGxvY2F0aW9uKHApO1xuJiM0MztcdGVyciA9IHN3YXBfZGV2aWNlX2Rpc2FibGUocCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4gXG4gXHRzZXRfY3VycmVudF9vb21fb3JpZ2luKCk7XG4gXHRlcnIgPSB0cnlfdG9fdW51c2UocC1cdTAwM2V0eXBlKTtcbkBAIC0zMTMxLDEwICYjNDM7MzMxOSwxMyBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXG4gXHRpZiAoZXJyKSB7XG4gXHRcdC8qIHJlLWluc2VydCBzd2FwIHNwYWNlIGJhY2sgaW50byBzd2FwX2xpc3QgKi9cbi1cdFx0cmVpbnNlcnRfc3dhcF9pbmZvKHApO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuJiM0MztcdFx0c3dhcF9kZXZpY2VfZW5hYmxlKHApO1xuJiM0MztcdFx0cmV0dXJuIGVycjtcbiBcdH1cbiBcbiYjNDM7XHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdHN3YXBfcXVldWVfZGVsKHApO1xuJiM0MztcbiBcdC8qXG4gXHQgKiBXYWl0IGZvciBzd2FwIG9wZXJhdGlvbnMgcHJvdGVjdGVkIGJ5IGdldC9wdXRfc3dhcF9kZXZpY2UoKVxuIFx0ICogdG8gY29tcGxldGUuICBCZWNhdXNlIG9mIHN5bmNocm9uaXplX3JjdSgpIGhlcmUsIGFsbCBzd2FwXG5AQCAtMzE0OSwxNSAmIzQzOzMzNDAsMTIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFxuIFx0Zmx1c2hfd29yayhcdTAwMjZwLVx1MDAzZWRpc2NhcmRfd29yayk7XG4gXHRmbHVzaF93b3JrKFx1MDAyNnAtXHUwMDNlcmVjbGFpbV93b3JrKTtcbi1cdGZsdXNoX3BlcmNwdV9zd2FwX2NsdXN0ZXIocCk7XG4gXG4gXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhwLCBwLVx1MDAzZXN3YXBfZmlsZSk7XG4gXG4gXHRpZiAoIShwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4gXHRcdGF0b21pY19kZWMoXHUwMDI2bnJfcm90YXRlX3N3YXApO1xuIFxuLVx0bXV0ZXhfbG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4gXHRzcGluX2xvY2soXHUwMDI2cC1cdTAwM2Vsb2NrKTtcbiBcdGRyYWluX21tbGlzdCgpO1xuIFxuQEAgLTMxNjgsMTAgJiM0MzszMzU2LDExIEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcbiBcdHAtXHUwMDNlbWF4ID0gMDtcbiBcdHAtXHUwMDNlY2x1c3Rlcl9pbmZvID0gTlVMTDtcbiBcdHNwaW5fdW5sb2NrKFx1MDAyNnAtXHUwMDNlbG9jayk7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0YXJjaF9zd2FwX2ludmFsaWRhdGVfYXJlYShwLVx1MDAzZXR5cGUpO1xuIFx0enN3YXBfc3dhcG9mZihwLVx1MDAzZXR5cGUpO1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4mIzQzO1x0ZnJlZV9wZXJjcHUocC1cdTAwM2VwZXJjcHVfY2x1c3Rlcik7XG4mIzQzO1x0cC1cdTAwM2VwZXJjcHVfY2x1c3RlciA9IE5VTEw7XG4gXHRrZnJlZShwLVx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcbiBcdHAtXHUwMDNlZ2xvYmFsX2NsdXN0ZXIgPSBOVUxMO1xuIFx0ZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhjbHVzdGVyX2luZm8sIG1heHBhZ2VzKTtcbkBAIC0zMTg3LDE4ICYjNDM7MzM3NiwxOSBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzbyB0aGF0IHN3YXBvblxuIFx0ICogY2FuIHJldXNlIHRoaXMgc3dhcF9pbmZvIGluIGFsbG9jX3N3YXBfaW5mbygpIHNhZmVseS4gIEl0IGlzIG9rIHRvXG4gXHQgKiBub3QgaG9sZCBwLVx1MDAzZWxvY2sgYWZ0ZXIgd2UgY2xlYXJlZCBpdHMgU1dQX1dSSVRFT0suXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBUaGUgd3JpdGUgbG9jayBlbnN1cmVzIHRoZSBmbGFnIGNsZWFyIGlzIHZpc2libGUgdG8gbG9ja2xlc3NcbiYjNDM7XHQgKiByZWFkZXJzIG9mIHN3YXBfdHlwZV90b19pbmZvKCkgYmVmb3JlIGFsbG9jX3N3YXBfaW5mbygpIHJldXNlc1xuJiM0MztcdCAqIHRoaXMgc2xvdC5cbiBcdCAqL1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdHAtXHUwMDNlZmxhZ3MgPSAwO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcbi1cdGVyciA9IDA7XG4gXHRhdG9taWNfaW5jKFx1MDAyNnByb2NfcG9sbF9ldmVudCk7XG4gXHR3YWtlX3VwX2ludGVycnVwdGlibGUoXHUwMDI2cHJvY19wb2xsX3dhaXQpO1xuIFxuLW91dF9kcHV0OlxuLVx0ZmlscF9jbG9zZSh2aWN0aW0sIE5VTEwpO1xuLVx0cmV0dXJuIGVycjtcbiYjNDM7XHRyZXR1cm4gMDtcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19QUk9DX0ZTXG5AQCAtMzIxNiwyMCAmIzQzOzM0MDYsMTggQEAgc3RhdGljIF9fcG9sbF90IHN3YXBzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpXG4gXHRyZXR1cm4gRVBPTExJTiB8IEVQT0xMUkROT1JNO1xuIH1cbiBcbi0vKiBpdGVyYXRvciAqL1xuIHN0YXRpYyB2b2lkICpzd2FwX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgbG9mZl90ICpwb3MpXG4ge1xuIFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuLVx0aW50IHR5cGU7XG4gXHRsb2ZmX3QgbCA9ICpwb3M7XG4gXG4tXHRtdXRleF9sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFxuIFx0aWYgKCFsKVxuIFx0XHRyZXR1cm4gU0VRX1NUQVJUX1RPS0VOO1xuIFxuLVx0Zm9yICh0eXBlID0gMDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlJiM0MzsmIzQzOykge1xuLVx0XHRpZiAoIShzaS1cdTAwM2Vzd2FwX2ZpbGUpKVxuJiM0MztcdGZvcl9lYWNoX3N3YXAoc2kpIHtcbiYjNDM7XHRcdGlmICghc2ktXHUwMDNlc3dhcF9maWxlKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRpZiAoIS0tbClcbiBcdFx0XHRyZXR1cm4gc2k7XG5AQCAtMzI1MCw3ICYjNDM7MzQzOCw3IEBAIHN0YXRpYyB2b2lkICpzd2FwX25leHQoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcylcbiBcbiBcdCYjNDM7JiM0MzsoKnBvcyk7XG4gXHRmb3IgKDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlJiM0MzsmIzQzOykge1xuLVx0XHRpZiAoIShzaS1cdTAwM2Vzd2FwX2ZpbGUpKVxuJiM0MztcdFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9VU0VEKSB8fCAhKHNpLVx1MDAzZXN3YXBfZmlsZSkpXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdHJldHVybiBzaTtcbiBcdH1cbkBAIC0zMjYwLDcgJiM0MzszNDQ4LDcgQEAgc3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuIFxuIHN0YXRpYyB2b2lkIHN3YXBfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXG4ge1xuLVx0bXV0ZXhfdW5sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4mIzQzO1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gXG4gc3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxuQEAgLTMzNTMsMTMgJiM0MzszNTQxLDEzIEBAIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqYWxsb2Nfc3dhcF9pbmZvKHZvaWQpXG4gXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuIFx0fVxuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdGZvciAodHlwZSA9IDA7IHR5cGUgXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHtcbiBcdFx0aWYgKCEoc3dhcF9pbmZvW3R5cGVdLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfVVNFRCkpXG4gXHRcdFx0YnJlYWs7XG4gXHR9XG4gXHRpZiAodHlwZSBcdTAwM2U9IE1BWF9TV0FQRklMRVMpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbiYjNDM7XHRcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0XHRwZXJjcHVfcmVmX2V4aXQoXHUwMDI2cC1cdTAwM2V1c2Vycyk7XG4gXHRcdGt2ZnJlZShwKTtcbiBcdFx0cmV0dXJuIEVSUl9QVFIoLUVQRVJNKTtcbkBAIC0zMzgxLDEwICYjNDM7MzU2OSw4IEBAIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqYWxsb2Nfc3dhcF9pbmZvKHZvaWQpXG4gXHRcdCAqL1xuIFx0fVxuIFx0cC1cdTAwM2Vzd2FwX2V4dGVudF9yb290ID0gUkJfUk9PVDtcbi1cdHBsaXN0X25vZGVfaW5pdChcdTAwMjZwLVx1MDAzZWxpc3QsIDApO1xuLVx0cGxpc3Rfbm9kZV9pbml0KFx1MDAyNnAtXHUwMDNlYXZhaWxfbGlzdCwgMCk7XG4gXHRwLVx1MDAzZWZsYWdzID0gU1dQX1VTRUQ7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0aWYgKGRlZmVyKSB7XG4gXHRcdHBlcmNwdV9yZWZfZXhpdChcdTAwMjZkZWZlci1cdTAwM2V1c2Vycyk7XG4gXHRcdGt2ZnJlZShkZWZlcik7XG5AQCAtMzQ1Myw5ICYjNDM7MzYzOSw4IEBAIF9fd2VhayB1bnNpZ25lZCBsb25nIGFyY2hfbWF4X3N3YXBmaWxlX3NpemUodm9pZClcbiBcdHJldHVybiBnZW5lcmljX21heF9zd2FwZmlsZV9zaXplKCk7XG4gfVxuIFxuLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuLVx0XHRcdFx0XHR1bmlvbiBzd2FwX2hlYWRlciAqc3dhcF9oZWFkZXIsXG4tXHRcdFx0XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIodW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4ge1xuIFx0aW50IGk7XG4gXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzO1xuQEAgLTM1MjIsNyAmIzQzOzM3MDcsNyBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBucl9jbHVzdGVycyA9IERJVl9ST1VORF9VUChtYXhwYWdlcywgU1dBUEZJTEVfQ0xVU1RFUik7XG4gXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbztcbi1cdGludCBlcnIgPSAtRU5PTUVNO1xuJiM0MztcdGludCBjcHUsIGVyciA9IC1FTk9NRU07XG4gXHR1bnNpZ25lZCBsb25nIGk7XG4gXG4gXHRjbHVzdGVyX2luZm8gPSBrdnphbGxvY19vYmpzKCpjbHVzdGVyX2luZm8sIG5yX2NsdXN0ZXJzKTtcbkBAIC0zNTMyLDEzICYjNDM7MzcxNywyNiBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jbHVzdGVyczsgaSYjNDM7JiM0MzspXG4gXHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNmNsdXN0ZXJfaW5mb1tpXS5sb2NrKTtcbiBcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpIHtcbiYjNDM7XHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSB7XG4mIzQzO1x0XHRzaS1cdTAwM2VwZXJjcHVfY2x1c3RlciA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIpO1xuJiM0MztcdFx0aWYgKCFzaS1cdTAwM2VwZXJjcHVfY2x1c3RlcilcbiYjNDM7XHRcdFx0Z290byBlcnI7XG4mIzQzO1xuJiM0MztcdFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuJiM0MztcdFx0XHRzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIgKmNsdXN0ZXI7XG4mIzQzO1xuJiM0MztcdFx0XHRjbHVzdGVyID0gcGVyX2NwdV9wdHIoc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXIsIGNwdSk7XG4mIzQzO1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFNXQVBfTlJfT1JERVJTOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0XHRjbHVzdGVyLVx1MDAzZW5leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XG4mIzQzO1x0XHRcdGxvY2FsX2xvY2tfaW5pdChcdTAwMjZjbHVzdGVyLVx1MDAzZWxvY2spO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4gXHRcdHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyID0ga21hbGxvY19vYmooKnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcbiBcdFx0aWYgKCFzaS1cdTAwM2VnbG9iYWxfY2x1c3RlcilcbiBcdFx0XHRnb3RvIGVycjtcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU1dBUF9OUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuIFx0XHRcdHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZW5leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XG4tXHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuJiM0MztcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbG9jayk7XG4gXHR9XG4gXG4gXHQvKlxuQEAgLTM2MjEsNyAmIzQzOzM4MTksNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFx0LypcbiBcdCAqIEFsbG9jYXRlIG9yIHJldXNlIGV4aXN0aW5nICFTV1BfVVNFRCBzd2FwX2luZm8uIFRoZSByZXR1cm5lZFxuIFx0ICogc2kgd2lsbCBzdGF5IGluIGEgZHlpbmcgc3RhdHVzLCBzbyBub3RoaW5nIHdpbGwgYWNjZXNzIGl0cyBjb250ZW50XG4tXHQgKiB1bnRpbCBlbmFibGVfc3dhcF9pbmZvIHJlc3VycmVjdHMgaXRzIHBlcmNwdSByZWYgYW5kIGV4cG9zZSBpdC5cbiYjNDM7XHQgKiB1bnRpbCBzd2FwX2RldmljZV9lbmFibGUgcmVzdXJyZWN0cyBpdHMgcGVyY3B1IHJlZiBhbmQgZXhwb3NlIGl0LlxuIFx0ICovXG4gXHRzaSA9IGFsbG9jX3N3YXBfaW5mbygpO1xuIFx0aWYgKElTX0VSUihzaSkpXG5AQCAtMzY3OSw3ICYjNDM7Mzg3Nyw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHR9XG4gXHRzd2FwX2hlYWRlciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIDApO1xuIFxuLVx0bWF4cGFnZXMgPSByZWFkX3N3YXBfaGVhZGVyKHNpLCBzd2FwX2hlYWRlciwgaW5vZGUpO1xuJiM0MztcdG1heHBhZ2VzID0gcmVhZF9zd2FwX2hlYWRlcihzd2FwX2hlYWRlciwgaW5vZGUpO1xuIFx0aWYgKHVubGlrZWx5KCFtYXhwYWdlcykpIHtcbiBcdFx0ZXJyb3IgPSAtRUlOVkFMO1xuIFx0XHRnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTtcbkBAIC0zNzAwLDExICYjNDM7Mzg5OCw2IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXG4gXHRtYXhwYWdlcyA9IHNpLVx1MDAzZW1heDtcbiBcbi1cdC8qIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8gKi9cbi1cdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xuLVx0aWYgKGVycm9yKVxuLVx0XHRnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTtcbi1cbiBcdGlmIChzaS1cdTAwM2ViZGV2IFx1MDAyNlx1MDAyNiBiZGV2X3N0YWJsZV93cml0ZXMoc2ktXHUwMDNlYmRldikpXG4gXHRcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9TVEFCTEVfV1JJVEVTO1xuIFxuQEAgLTM3MTgsNiAmIzQzOzM5MTEsMTUgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0aW5jZWRfbnJfcm90YXRlX3N3YXAgPSB0cnVlO1xuIFx0fVxuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogU2V0IHVwIHRoZSBzd2FwIGNsdXN0ZXIgaW5mby4gVGhpcyBtdXN0IHJ1biBhZnRlciBTV1BfU09MSURTVEFURVxuJiM0MztcdCAqIGlzIGRldGVybWluZWQgYWJvdmUsIGFzIGl0IGRlY2lkZXMgd2hldGhlciB0byBhbGxvY2F0ZSB0aGUgcGVyLUNQVVxuJiM0MztcdCAqIGNsdXN0ZXIgKHNvbGlkIHN0YXRlKSBvciB0aGUgZ2xvYmFsIGNsdXN0ZXIgKHJvdGF0aW9uYWwpLlxuJiM0MztcdCAqL1xuJiM0MztcdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGdvdG8gYmFkX3N3YXBfdW5sb2NrX2lub2RlO1xuJiM0MztcbiBcdGlmICgoc3dhcF9mbGFncyBcdTAwMjYgU1dBUF9GTEFHX0RJU0NBUkQpIFx1MDAyNlx1MDAyNlxuIFx0ICAgIHNpLVx1MDAzZWJkZXYgXHUwMDI2XHUwMDI2IGJkZXZfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzaS1cdTAwM2ViZGV2KSkge1xuIFx0XHQvKlxuQEAgLTM3NjQsMjIgJiM0MzszOTY2LDIyIEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHRcdGdvdG8gZnJlZV9zd2FwX3pzd2FwO1xuIFx0fVxuIFxuLVx0bXV0ZXhfbG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuIFx0cHJpbyA9IERFRl9TV0FQX1BSSU87XG4gXHRpZiAoc3dhcF9mbGFncyBcdTAwMjYgU1dBUF9GTEFHX1BSRUZFUilcbiBcdFx0cHJpbyA9IHN3YXBfZmxhZ3MgXHUwMDI2IFNXQVBfRkxBR19QUklPX01BU0s7XG4gXG4tXHQvKlxuLVx0ICogVGhlIHBsaXN0IHByaW8gaXMgbmVnYXRlZCBiZWNhdXNlIHBsaXN0IG9yZGVyaW5nIGlzXG4tXHQgKiBsb3ctdG8taGlnaCwgd2hpbGUgc3dhcCBvcmRlcmluZyBpcyBoaWdoLXRvLWxvd1xuLVx0ICovXG4gXHRzaS1cdTAwM2VwcmlvID0gcHJpbztcbi1cdHNpLVx1MDAzZWxpc3QucHJpbyA9IC1zaS1cdTAwM2VwcmlvO1xuLVx0c2ktXHUwMDNlYXZhaWxfbGlzdC5wcmlvID0gLXNpLVx1MDAzZXByaW87XG4gXHRzaS1cdTAwM2Vzd2FwX2ZpbGUgPSBzd2FwX2ZpbGU7XG4gXG4gXHQvKiBTZXRzIFNXUF9XUklURU9LLCByZXN1cnJlY3QgdGhlIHBlcmNwdSByZWYsIGV4cG9zZSB0aGUgc3dhcCBkZXZpY2UgKi9cbi1cdGVuYWJsZV9zd2FwX2luZm8oc2kpO1xuJiM0MztcdHBlcmNwdV9yZWZfcmVzdXJyZWN0KFx1MDAyNnNpLVx1MDAzZXVzZXJzKTtcbiYjNDM7XHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdGVycm9yID0gc3dhcF9xdWV1ZV9hZGQoc2kpO1xuJiM0MztcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuJiM0MztcdGlmIChlcnJvcilcbiYjNDM7XHRcdGdvdG8gZnJlZV9zd2FwX3pzd2FwO1xuJiM0MztcbiYjNDM7XHRzd2FwX2RldmljZV9lbmFibGUoc2kpO1xuIFxuIFx0cHJfaW5mbyhcJiMzNDtBZGRpbmcgJXVrIHN3YXAgb24gJXMuICBQcmlvcml0eTolZCBleHRlbnRzOiVkIGFjcm9zczolbGx1ayAlcyVzJXMlc1xcblwmIzM0OyxcbiBcdFx0SyhzaS1cdTAwM2VwYWdlcyksIG5hbWUtXHUwMDNlbmFtZSwgc2ktXHUwMDNlcHJpbywgbnJfZXh0ZW50cyxcbkBAIC0zNzg5LDcgJiM0MzszOTkxLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0KHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfQVJFQV9ESVNDQVJEKSA/IFwmIzM0O3NcJiMzNDsgOiBcJiMzNDtcJiMzNDssXG4gXHRcdChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1BBR0VfRElTQ0FSRCkgPyBcJiMzNDtjXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7KTtcbiBcbi1cdG11dGV4X3VubG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuIFx0YXRvbWljX2luYyhcdTAwMjZwcm9jX3BvbGxfZXZlbnQpO1xuIFx0d2FrZV91cF9pbnRlcnJ1cHRpYmxlKFx1MDAyNnByb2NfcG9sbF93YWl0KTtcbiBcbkBAIC0zODAwLDYgJiM0Mzs0MDAxLDggQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBiYWRfc3dhcF91bmxvY2tfaW5vZGU6XG4gXHRpbm9kZV91bmxvY2soaW5vZGUpO1xuIGJhZF9zd2FwOlxuJiM0MztcdGZyZWVfcGVyY3B1KHNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyKTtcbiYjNDM7XHRzaS1cdTAwM2VwZXJjcHVfY2x1c3RlciA9IE5VTEw7XG4gXHRrZnJlZShzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcik7XG4gXHRzaS1cdTAwM2VnbG9iYWxfY2x1c3RlciA9IE5VTEw7XG4gXHRpbm9kZSA9IE5VTEw7XG5AQCAtMzgxMCw5ICYjNDM7NDAxMyw5IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xuIFx0ICogYWxsb2Nfc3dhcF9pbmZvIGNhbiByZXVzZSB0aGlzIHNpIHNhZmVseS5cbiBcdCAqL1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X2Rvd25fd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdHNpLVx1MDAzZWZsYWdzID0gMDtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4mIzQzO1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRpZiAoaW5jZWRfbnJfcm90YXRlX3N3YXApXG4gXHRcdGF0b21pY19kZWMoXHUwMDI2bnJfcm90YXRlX3N3YXApO1xuIFx0aWYgKHN3YXBfZmlsZSlcbkBAIC0zODI3LDE5ICYjNDM7NDAzMCwxNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFxuIHZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbClcbiB7XG4tXHR1bnNpZ25lZCBpbnQgdHlwZTtcbiYjNDM7XHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4gXHR1bnNpZ25lZCBsb25nIG5yX3RvX2JlX3VudXNlZCA9IDA7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdGZvciAodHlwZSA9IDA7IHR5cGUgXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHtcbi1cdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF9pbmZvW3R5cGVdO1xuLVxuLVx0XHRpZiAoKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfVVNFRCkgXHUwMDI2XHUwMDI2ICEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbiYjNDM7XHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0Zm9yX2VhY2hfc3dhcChzaSkge1xuJiM0MztcdFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbiBcdFx0XHRucl90b19iZV91bnVzZWQgJiM0Mzs9IHN3YXBfdXNhZ2VfaW5fcGFnZXMoc2kpO1xuIFx0fVxuIFx0dmFsLVx1MDAzZWZyZWVzd2FwID0gYXRvbWljX2xvbmdfcmVhZChcdTAwMjZucl9zd2FwX3BhZ2VzKSAmIzQzOyBucl90b19iZV91bnVzZWQ7XG4gXHR2YWwtXHUwMDNldG90YWxzd2FwID0gdG90YWxfc3dhcF9wYWdlcyAmIzQzOyBucl90b19iZV91bnVzZWQ7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuJiM0MztcdHBlcmNwdV91cF9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gfVxuIFxuIC8qXG5AQCAtMzg3OSw3ICYjNDM7NDA4MCw3IEBAIGludCBzd2FwX2R1cF9lbnRyeV9kaXJlY3Qoc3dwX2VudHJ5X3QgZW50cnkpXG4gI2lmIGRlZmluZWQoQ09ORklHX01FTUNHKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfQkxLX0NHUk9VUClcbiBzdGF0aWMgYm9vbCBfX2hhc191c2FibGVfc3dhcCh2b2lkKVxuIHtcbi1cdHJldHVybiAhcGxpc3RfaGVhZF9lbXB0eShcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkKTtcbiYjNDM7XHRyZXR1cm4gUkVBRF9PTkNFKHRvdGFsX3N3YXBfcGFnZXMpIFx1MDAzZSAwO1xuIH1cbiBcbiB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKVxuQEAgLTM5MDIsMTQgJiM0Mzs0MTAzLDE0IEBAIHZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXG4gXHRpZiAoY3VycmVudC1cdTAwM2V0aHJvdHRsZV9kaXNrKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbi1cdHBsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpLCBcdTAwMjZzd2FwX2F2YWlsX2hlYWQsIGF2YWlsX2xpc3QpIHtcbiYjNDM7XHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4mIzQzO1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xuIFx0XHRpZiAoc2ktXHUwMDNlYmRldikge1xuIFx0XHRcdGJsa2NnX3NjaGVkdWxlX3Rocm90dGxlKHNpLVx1MDAzZWJkZXYtXHUwMDNlYmRfZGlzaywgdHJ1ZSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbiBcdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4mIzQzO1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gI2VuZGlmXG4gXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMDA6NDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3N3YXBfYWxsb2NfZW50cnkmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9hZGQmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9kZWwmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9nZXRfZGV2aWNlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2VuYWJsZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9kaXNhYmxlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2ludXNlX2FkZCYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9pbnVzZV9zdWImIzM0OywKICAgICYjMzQ7YWRkX3RvX2F2YWlsX2xpc3QmIzM0OywKICAgICYjMzQ7ZGVsX2Zyb21fYXZhaWxfbGlzdCYjMzQ7LAogICAgJiMzNDtzd2FwX3F1ZXVlX21hc2smIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV91bm1hc2smIzM0OywKICAgICYjMzQ7Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWYzNDkzNjVlMGViMWZlMjEyOGE4NDg0YmI0Y2E2NTFmMWRiZDJhMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgSnVsIDE0IDAwOjQzOjQ0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGlzdC5oIGIvaW5jbHVkZS9saW51eC9wbGlzdC5oCmluZGV4IDE2Y2Y0MzU1YjVjMTMxLi43M2QzNTljMWEwNTM2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGlzdC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvcGxpc3QuaApAQCAtMTMyLDggJiM0MzsxMzIsNiBAQCBzdGF0aWMgaW5saW5lIHZvaWQgcGxpc3Rfbm9kZV9pbml0KHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBpbnQgcHJpbykKIGV4dGVybiB2b2lkIHBsaXN0X2FkZChzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpOwogZXh0ZXJuIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7CiAKLWV4dGVybiB2b2lkIHBsaXN0X3JlcXVldWUoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKTsKLQogLyoqCiAgKiBwbGlzdF9mb3JfZWFjaCAtIGl0ZXJhdGUgb3ZlciB0aGUgcGxpc3QKICAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDY5NmVkMDE3MDljMmJhLi4wNDc2NzU0MDk3MmI4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTE5NCw2ICYjNDM7MTk0LDIyIEBAIHN0cnVjdCBzd2FwX2V4dGVudCB7CiAJKChvZmZzZXRvZih1bmlvbiBzd2FwX2hlYWRlciwgbWFnaWMubWFnaWMpIC0gXAogCSAgb2Zmc2V0b2YodW5pb24gc3dhcF9oZWFkZXIsIGluZm8uYmFkcGFnZXMpKSAvIHNpemVvZihpbnQpKQogCiYjNDM7LyoKJiM0MzsgKiBTd2FwIGRldmljZSBmbGFncywgZXhjZXB0IHRoZSBvbmVzIGRvY3VtZW50ZWQgYmVsb3csIGFsbCBhcmUgaW1tdXRhYmxlCiYjNDM7ICogYWZ0ZXIgZXhwb3NlZCBieSBzd2FwX2RldmljZV9lbmFibGUsIGFuZCB1bnRpbCB0aGUgZGV2aWNlIGlzIGZyZWVkIGFnYWluCiYjNDM7ICogKFNXUF9VU0VEIHVuc2V0KS4gVGhlIGV4Y2VwdGlvbnMgYXJlIGFsbCBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtOgomIzQzOyAqIC0gU1dQX1VTRUQ6IFByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0uIEluZGljYXRlcyB0aGUgZGV2aWNlIGlzIGludXNlLiBPbmNlCiYjNDM7ICogICBzZXQsIHdvbiYjMzk7dCBiZSBjbGVhcmVkIHVubGVzcyBhbGwgcmVmZXJlbmNlIHRvIHRoaXMgZGV2aWNlIGlzIGZyZWVkIGFuZAomIzQzOyAqICAgc3dhcG9mZiBmaW5pc2hlZC4KJiM0MzsgKiAtIFNXUF9XUklURU9LOiBQcm90ZWN0ZWQgYnkgYm90aCBzd2Fwb25fcndzZW0gYW5kIHN3YXBfYXZhaWxfbG9jaywgY2xlYXJpbmcKJiM0MzsgKiAgIHRoaXMgZmxhZyBhbHNvIHdhaXRzIGZvciBhbGwgY3VycmVudCBjbHVzdGVyIGxvY2sgdXNlcnMgdG8gZXhpdCBzbwomIzQzOyAqICAgY2hlY2tpbmcgdGhpcyBmbGFnIHdoaWxlIGhvbGRpbmcgYW55IG9mIHRoZXNlIGxvY2tzIGVuc3VyZXMgdGhlIGRldmljZQomIzQzOyAqICAgaXMgc2FmZSB0byB1c2UgYXQgdGhlIG1vbWVudC4gTm90ZTogY2xlYXJpbmcgdGhpcyBmbGFnIGRvZXNuJiMzOTt0IGFmZmVjdAomIzQzOyAqICAgcGVuZGluZyBJTyBvciBhc3luYyByZXF1ZXN0cywgaXQgb25seSBwcmV2ZW50cyBmdXJ0aGVyIGVudHJ5IGFsbG9jYXRpb24KJiM0MzsgKiAgIG9yIG5ldyBhc3luYyByZXF1ZXN0IChlLmcuIGRpc2NhcmQpIGZyb20gaW5pdGlhdGluZy4KJiM0MzsgKiAtIFNXUF9ISUJFUk5BVElPTjogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIGlmIHRoZSBkZXZpY2UKJiM0MzsgKiAgIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uCiYjNDM7ICovCiBlbnVtIHsKIAlTV1BfVVNFRAk9ICgxICZsdDsmbHQ7IDApLAkvKiBpcyBzbG90IGluIHN3YXBfaW5mb1tdIHVzZWQ/ICovCiAJU1dQX1dSSVRFT0sJPSAoMSAmbHQ7Jmx0OyAxKSwJLyogb2sgdG8gd3JpdGUgdG8gdGhpcyBzd2FwPwkqLwpAQCAtMjMwLDEwICYjNDM7MjQ2LDE3IEBAIGVudW0gewogI2VuZGlmCiAKIC8qCi0gKiBXZSBrZWVwIHVzaW5nIHNhbWUgY2x1c3RlciBmb3Igcm90YXRpb25hbCBkZXZpY2Ugc28gSU8gd2lsbCBiZSBzZXF1ZW50aWFsLgotICogVGhlIHB1cnBvc2UgaXMgdG8gb3B0aW1pemUgU1dBUCB0aHJvdWdocHV0IG9uIHRoZXNlIGRldmljZS4KJiM0MzsgKiBXZSBhc3NpZ24gYSBjbHVzdGVyIHRvIGVhY2ggQ1BVLCBzbyBlYWNoIENQVSBjYW4gYWxsb2NhdGUgc3dhcCBlbnRyeSBmcm9tCiYjNDM7ICogaXRzIG93biBjbHVzdGVyIGFuZCBzd2Fwb3V0IHNlcXVlbnRpYWxseS4gVGhlIHB1cnBvc2UgaXMgdG8gb3B0aW1pemUgc3dhcG91dAomIzQzOyAqIHRocm91Z2hwdXQuCiAgKi8KJiM0MztzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIgewomIzQzOwlsb2NhbF9sb2NrX3QgbG9jazsgLyogUHJvdGVjdCB0aGUgcGVyY3B1X2NsdXN0ZXIgYWJvdmUgKi8KJiM0MzsJdW5zaWduZWQgaW50IG5leHRbU1dBUF9OUl9PUkRFUlNdOyAvKiBMaWtlbHkgbmV4dCBhbGxvY2F0aW9uIG9mZnNldCAqLwomIzQzO307CiYjNDM7CiBzdHJ1Y3Qgc3dhcF9zZXF1ZW50aWFsX2NsdXN0ZXIgewomIzQzOwlzcGlubG9ja190IGxvY2s7IC8qIFNlcmlhbGl6ZSB1c2FnZSBvZiBnbG9iYWwgY2x1c3RlciAqLwogCXVuc2lnbmVkIGludCBuZXh0W1NXQVBfTlJfT1JERVJTXTsgLyogTGlrZWx5IG5leHQgYWxsb2NhdGlvbiBvZmZzZXQgKi8KIH07CiAKQEAgLTI0NCw3ICYjNDM7MjY3LDYgQEAgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgewogCXN0cnVjdCBwZXJjcHVfcmVmIHVzZXJzOwkvKiBpbmRpY2F0ZSBhbmQga2VlcCBzd2FwIGRldmljZSB2YWxpZC4gKi8KIAl1bnNpZ25lZCBsb25nCWZsYWdzOwkJLyogU1dQX1VTRUQgZXRjOiBzZWUgYWJvdmUgKi8KIAlzaWduZWQgc2hvcnQJcHJpbzsJCS8qIHN3YXAgcHJpb3JpdHkgb2YgdGhpcyB0eXBlICovCi0Jc3RydWN0IHBsaXN0X25vZGUgbGlzdDsJCS8qIGVudHJ5IGluIHN3YXBfYWN0aXZlX2hlYWQgKi8KIAlzaWduZWQgY2hhcgl0eXBlOwkJLyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqLwogCXVuc2lnbmVkIGludAltYXg7CQkvKiBzaXplIG9mIHRoaXMgc3dhcCBkZXZpY2UgKi8KIAlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbzsgLyogY2x1c3RlciBpbmZvLiBPbmx5IGZvciBTU0QgKi8KQEAgLTI1NiwyNiAmIzQzOzI3OCwyMCBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7CiAJCQkJCS8qIGxpc3Qgb2YgY2x1c3RlciB0aGF0IGFyZSBmcmFnbWVudGVkIG9yIGNvbnRlbnRlZCAqLwogCXVuc2lnbmVkIGludCBwYWdlczsJCS8qIHRvdGFsIG9mIHVzYWJsZSBwYWdlcyBvZiBzd2FwICovCiAJYXRvbWljX2xvbmdfdCBpbnVzZV9wYWdlczsJLyogbnVtYmVyIG9mIHRob3NlIGN1cnJlbnRseSBpbiB1c2UgKi8KJiM0MzsJc3RydWN0IHBlcmNwdV9jbHVzdGVyCV9fcGVyY3B1ICpwZXJjcHVfY2x1c3RlcjsgLyogcGVyIGNwdSYjMzk7cyBzd2FwIGxvY2F0aW9uICovCiAJc3RydWN0IHN3YXBfc2VxdWVudGlhbF9jbHVzdGVyICpnbG9iYWxfY2x1c3RlcjsgLyogVXNlIG9uZSBnbG9iYWwgY2x1c3RlciBmb3Igcm90YXRpbmcgZGV2aWNlICovCi0Jc3BpbmxvY2tfdCBnbG9iYWxfY2x1c3Rlcl9sb2NrOwkvKiBTZXJpYWxpemUgdXNhZ2Ugb2YgZ2xvYmFsIGNsdXN0ZXIgKi8KIAlzdHJ1Y3QgcmJfcm9vdCBzd2FwX2V4dGVudF9yb290Oy8qIHJvb3Qgb2YgdGhlIHN3YXAgZXh0ZW50IHJidHJlZSAqLwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CS8qIHN3YXAgZGV2aWNlIG9yIGJkZXYgb2Ygc3dhcCBmaWxlICovCiAJc3RydWN0IGZpbGUgKnN3YXBfZmlsZTsJCS8qIHNlbGRvbSByZWZlcmVuY2VkICovCiAJc3RydWN0IGNvbXBsZXRpb24gY29tcDsJCS8qIHNlbGRvbSByZWZlcmVuY2VkICovCiAJc3BpbmxvY2tfdCBsb2NrOwkJLyoKLQkJCQkJICogcHJvdGVjdCBtYXAgc2NhbiByZWxhdGVkIGZpZWxkcyBsaWtlCi0JCQkJCSAqIGludXNlX3BhZ2VzIGFuZCBhbGwgY2x1c3RlciBsaXN0cy4KLQkJCQkJICogT3RoZXIgZmllbGRzIGFyZSBvbmx5IGNoYW5nZWQKLQkJCQkJICogYXQgc3dhcG9uL3N3YXBvZmYsIHNvIGFyZSBwcm90ZWN0ZWQKLQkJCQkJICogYnkgc3dhcF9sb2NrLiBjaGFuZ2luZyBmbGFncyBuZWVkCi0JCQkJCSAqIGhvbGQgdGhpcyBsb2NrIGFuZCBzd2FwX2xvY2suIElmCi0JCQkJCSAqIGJvdGggbG9ja3MgbmVlZCBob2xkLCBob2xkIHN3YXBfbG9jawotCQkJCQkgKiBmaXJzdC4KJiM0MzsJCQkJCSAqIFByb3RlY3QgY2x1c3RlciBsaXN0cy4gT3RoZXIgZmllbGRzCiYjNDM7CQkJCQkgKiBhcmUgb25seSBjaGFuZ2VkIGF0IHN3YXBvbi9zd2Fwb2ZmLAomIzQzOwkJCQkJICogc28gYXJlIHByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0uCiAJCQkJCSAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCBkaXNjYXJkX3dvcms7IC8qIGRpc2NhcmQgd29ya2VyICovCiAJc3RydWN0IHdvcmtfc3RydWN0IHJlY2xhaW1fd29yazsgLyogcmVjbGFpbSB3b3JrZXIgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGRpc2NhcmRfY2x1c3RlcnM7IC8qIGRpc2NhcmQgY2x1c3RlcnMgbGlzdCAqLwotCXN0cnVjdCBwbGlzdF9ub2RlIGF2YWlsX2xpc3Q7ICAgLyogZW50cnkgaW4gc3dhcF9hdmFpbF9oZWFkICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IHBhZ2Vfc3dhcF9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSkKZGlmZiAtLWdpdCBhL2xpYi9wbGlzdC5jIGIvbGliL3BsaXN0LmMKaW5kZXggYTViZWYzOGFkZDQzMWQuLmIwNWFlN2ZmZWE4N2U4IDEwMDY0NAotLS0gYS9saWIvcGxpc3QuYwomIzQzOyYjNDM7JiM0MzsgYi9saWIvcGxpc3QuYwpAQCAtMTQyLDU4ICYjNDM7MTQyLDYgQEAgdm9pZCBwbGlzdF9kZWwoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKQogCXBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7CiB9CiAKLS8qKgotICogcGxpc3RfcmVxdWV1ZSAtIFJlcXVldWUgQG5vZGUgYXQgZW5kIG9mIHNhbWUtcHJpbyBlbnRyaWVzLgotICoKLSAqIFRoaXMgaXMgZXNzZW50aWFsbHkgYW4gb3B0aW1pemVkIHBsaXN0X2RlbCgpIGZvbGxvd2VkIGJ5Ci0gKiBwbGlzdF9hZGQoKS4gIEl0IG1vdmVzIGFuIGVudHJ5IGFscmVhZHkgaW4gdGhlIHBsaXN0IHRvCi0gKiBhZnRlciBhbnkgb3RoZXIgc2FtZS1wcmlvcml0eSBlbnRyaWVzLgotICoKLSAqIEBub2RlOgkmYW1wO3N0cnVjdCBwbGlzdF9ub2RlIHBvaW50ZXIgLSBlbnRyeSB0byBiZSBtb3ZlZAotICogQGhlYWQ6CSZhbXA7c3RydWN0IHBsaXN0X2hlYWQgcG9pbnRlciAtIGxpc3QgaGVhZAotICovCi12b2lkIHBsaXN0X3JlcXVldWUoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKQotewotCXN0cnVjdCBwbGlzdF9ub2RlICppdGVyOwotCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGVfbmV4dCA9ICZhbXA7aGVhZC0mZ3Q7bm9kZV9saXN0OwotCi0JcGxpc3RfY2hlY2tfaGVhZChoZWFkKTsKLQlCVUdfT04ocGxpc3RfaGVhZF9lbXB0eShoZWFkKSk7Ci0JQlVHX09OKHBsaXN0X25vZGVfZW1wdHkobm9kZSkpOwotCi0JaWYgKG5vZGUgPT0gcGxpc3RfbGFzdChoZWFkKSkKLQkJcmV0dXJuOwotCi0JaXRlciA9IHBsaXN0X25leHQobm9kZSk7Ci0KLQlpZiAobm9kZS0mZ3Q7cHJpbyAhPSBpdGVyLSZndDtwcmlvKQotCQlyZXR1cm47Ci0KLQlwbGlzdF9kZWwobm9kZSwgaGVhZCk7Ci0KLQkvKgotCSAqIEFmdGVyIHBsaXN0X2RlbCgpLCBpdGVyIGlzIHRoZSByZXBsYWNlbWVudCBvZiB0aGUgbm9kZS4gIElmIHRoZSBub2RlCi0JICogd2FzIG9uIHByaW9fbGlzdCwgdGFrZSBzaG9ydGN1dCB0byBmaW5kIG5vZGVfbmV4dCBpbnN0ZWFkIG9mIGxvb3BpbmcuCi0JICovCi0JaWYgKCFsaXN0X2VtcHR5KCZhbXA7aXRlci0mZ3Q7cHJpb19saXN0KSkgewotCQlpdGVyID0gbGlzdF9lbnRyeShpdGVyLSZndDtwcmlvX2xpc3QubmV4dCwgc3RydWN0IHBsaXN0X25vZGUsCi0JCQkJICBwcmlvX2xpc3QpOwotCQlub2RlX25leHQgPSAmYW1wO2l0ZXItJmd0O25vZGVfbGlzdDsKLQkJZ290byBxdWV1ZTsKLQl9Ci0KLQlwbGlzdF9mb3JfZWFjaF9jb250aW51ZShpdGVyLCBoZWFkKSB7Ci0JCWlmIChub2RlLSZndDtwcmlvICE9IGl0ZXItJmd0O3ByaW8pIHsKLQkJCW5vZGVfbmV4dCA9ICZhbXA7aXRlci0mZ3Q7bm9kZV9saXN0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci1xdWV1ZToKLQlsaXN0X2FkZF90YWlsKCZhbXA7bm9kZS0mZ3Q7bm9kZV9saXN0LCBub2RlX25leHQpOwotCi0JcGxpc3RfY2hlY2tfaGVhZChoZWFkKTsKLX0KLQogI2lmZGVmIENPTkZJR19ERUJVR19QTElTVAogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc2NoZWQvY2xvY2suaCZndDsKQEAgLTIzMSwxNCAmIzQzOzE3OSw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBwbGlzdF90ZXN0X2NoZWNrKGludCBucl9leHBlY3QpCiAJQlVHX09OKHByaW9fcG9zLSZndDtwcmlvX2xpc3QubmV4dCAhPSAmYW1wO2ZpcnN0LSZndDtwcmlvX2xpc3QpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGxpc3RfdGVzdF9yZXF1ZXVlKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlKQotewotCXBsaXN0X3JlcXVldWUobm9kZSwgJmFtcDt0ZXN0X2hlYWQpOwotCi0JaWYgKG5vZGUgIT0gcGxpc3RfbGFzdCgmYW1wO3Rlc3RfaGVhZCkpCi0JCUJVR19PTihub2RlLSZndDtwcmlvID09IHBsaXN0X25leHQobm9kZSktJmd0O3ByaW8pOwotfQotCiBzdGF0aWMgaW50ICBfX2luaXQgcGxpc3RfdGVzdCh2b2lkKQogewogCWludCBucl9leHBlY3QgPSAwLCBpLCBsb29wOwpAQCAtMjYyLDEwICYjNDM7MjAyLDYgQEAgc3RhdGljIGludCAgX19pbml0IHBsaXN0X3Rlc3Qodm9pZCkKIAkJCW5yX2V4cGVjdC0tOwogCQl9CiAJCXBsaXN0X3Rlc3RfY2hlY2sobnJfZXhwZWN0KTsKLQkJaWYgKCFwbGlzdF9ub2RlX2VtcHR5KHRlc3Rfbm9kZSAmIzQzOyBpKSkgewotCQkJcGxpc3RfdGVzdF9yZXF1ZXVlKHRlc3Rfbm9kZSAmIzQzOyBpKTsKLQkJCXBsaXN0X3Rlc3RfY2hlY2sobnJfZXhwZWN0KTsKLQkJfQogCX0KIAogCWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKHRlc3Rfbm9kZSk7IGkmIzQzOyYjNDM7KSB7CmRpZmYgLS1naXQgYS9tbS9zd2FwLmggYi9tbS9zd2FwLmgKaW5kZXggYjUxYWQzMDcxYTczMDguLjA4YTc4MmYzZDVhY2QyIDEwMDY0NAotLS0gYS9tbS9zd2FwLmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcC5oCkBAIC05MSwxNiAmIzQzOzkxLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHN3cF9jbHVzdGVyX29mZnNldChzd3BfZW50cnlfdCBlbnRyeSkKICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqX19zd2FwX3R5cGVfdG9faW5mbyhpbnQgdHlwZSkKIHsKLQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7Ci0KLQlzaSA9IFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqLwotCVZNX1dBUk5fT05fT05DRShwZXJjcHVfcmVmX2lzX3plcm8oJmFtcDtzaS0mZ3Q7dXNlcnMpKTsgLyogcmFjZSB3aXRoIHN3YXBvZmYgKi8KLQlyZXR1cm4gc2k7CiYjNDM7CXJldHVybiBSRUFEX09OQ0Uoc3dhcF9pbmZvW3R5cGVdKTsgLyogcmN1X2RlcmVmZXJlbmNlKCkgKi8KIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqX19zd2FwX2VudHJ5X3RvX2luZm8oc3dwX2VudHJ5X3QgZW50cnkpCiB7Ci0JcmV0dXJuIF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwomIzQzOwomIzQzOwlzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTsgLyogcmN1X2RlcmVmZXJlbmNlKCkgKi8KJiM0MzsJVk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybygmYW1wO3NpLSZndDt1c2VycykpOyAvKiByYWNlIHdpdGggc3dhcG9mZiAqLwomIzQzOwlyZXR1cm4gc2k7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoCmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCA3NzVjMzg1NDkwYTVmYS4uZjkzODYzMzA5YTVhNTAgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcGZpbGUuYwpAQCAtNDEsNyAmIzQzOzQxLDYgQEAKICNpbmNsdWRlICZsdDtsaW51eC9jb21wbGV0aW9uLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc3VzcGVuZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3pzd2FwLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGxpc3QuaCZndDsKIAogI2luY2x1ZGUgJmx0O2FzbS90bGJmbHVzaC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2xlYWZvcHMuaCZndDsKQEAgLTQ5LDMxICYjNDM7NDgsMzggQEAKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3N3YXAuaCYjMzQ7CiAKLXN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAotCQkJICAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7CiYjNDM7c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKJiM0MzsJCQkJICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7CiBzdGF0aWMgYm9vbCBmb2xpb19zd2FwY2FjaGVfZnJlZWFibGUoc3RydWN0IGZvbGlvICpmb2xpbyk7CiBzdGF0aWMgdm9pZCBtb3ZlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQkJIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiAJCQkgZW51bSBzd2FwX2NsdXN0ZXJfZmxhZ3MgbmV3X2ZsYWdzKTsKJiM0MztzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpOwogCiAvKgotICogUHJvdGVjdHMgdGhlIHN3YXBfaW5mbyBhcnJheSwgYW5kIHRoZSBTV1BfVVNFRCBmbGFnLiBzd2FwX2luZm8gY29udGFpbnMKLSAqIGxhemlseSBhbGxvY2F0ZWQgJmFtcDsgZnJlZWQgc3dhcCBkZXZpY2UgaW5mbyBzdHJ1dHMsIGFuZCBTV1BfVVNFRCBpbmRpY2F0ZXMKLSAqIHdoaWNoIGRldmljZSBpcyB1c2VkLCB+U1dQX1VTRUQgZGV2aWNlcyBhbmQgY2FuIGJlIHJldXNlZC4KLSAqCi0gKiBBbHNvIHByb3RlY3RzIHN3YXBfYWN0aXZlX2hlYWQgdG90YWxfc3dhcF9wYWdlcywgYW5kIHRoZSBTV1BfV1JJVEVPSyBmbGFnLgomIzQzOyAqIFNlcmlhbGl6ZXMgc3dhcG9uL3N3YXBvZmYgKHdyaXRlcnMpIGFuZCBwcm90ZWN0cyB0aGUgc3dhcF9pbmZvCiYjNDM7ICogYXJyYXksIG5yX3N3YXBmaWxlcywgdG90YWxfc3dhcF9wYWdlcywgYW5kIHBhcnQgb2Ygc3dhcCBkZXZpY2UKJiM0MzsgKiBpbmZvIGNvbnRlbnQgKHNlZSBjb21tZW50IG9mIHN3YXBfaW5mb19zdHJ1Y3QpLiAgUmVhZGVycwomIzQzOyAqIChhbGxvY2F0aW9uLCAvcHJvYy9zd2FwcywgZXRjLikgdGFrZSBwZXJjcHVfZG93bl9yZWFkKCkgd2hpY2gKJiM0MzsgKiBpcyBjaGVhcCBhcyB0aGUgaG90IHBhdGguCiYjNDM7ICovCiYjNDM7REVGSU5FX1NUQVRJQ19QRVJDUFVfUldTRU0oc3dhcG9uX3J3c2VtKTsKJiM0MzsvKgomIzQzOyAqIHN3YXBfaW5mbyBjb250YWlucyBsYXppbHkgYWxsb2NhdGVkIHN3YXAgZGV2aWNlIGluZm8gc3RydWN0cywgYW5kCiYjNDM7ICogU1dQX1VTRUQgaW5kaWNhdGVzIHdoaWNoIGRldmljZSBpcyB1c2VkLCB+U1dQX1VTRUQgZGV2aWNlcyBjYW4gYmUKJiM0MzsgKiByZXVzZWQuIFByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0sIGJ1dCByZWFkaW5nIGNvdWxkIGJlIGxvY2tsZXNzLgogICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfbG9jayk7CiYjNDM7c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfaW5mb1tNQVhfU1dBUEZJTEVTXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfc3dhcGZpbGVzOwotYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzOwomIzQzO2xvbmcgdG90YWxfc3dhcF9wYWdlczsKJiM0MzsKIC8qCiAgKiBTb21lIG1vZHVsZXMgdXNlIHN3YXBwYWJsZSBvYmplY3RzIGFuZCBtYXkgdHJ5IHRvIHN3YXAgdGhlbSBvdXQgdW5kZXIKICAqIG1lbW9yeSBwcmVzc3VyZSAodmlhIHRoZSBzaHJpbmtlcikuIEJlZm9yZSBkb2luZyBzbywgdGhleSBtYXkgd2lzaCB0bwogICogY2hlY2sgdG8gc2VlIGlmIGFueSBzd2FwIHNwYWNlIGlzIGF2YWlsYWJsZS4KICAqLwomIzQzO2F0b21pY19sb25nX3QgbnJfc3dhcF9wYWdlczsKIEVYUE9SVF9TWU1CT0xfR1BMKG5yX3N3YXBfcGFnZXMpOwotLyogcHJvdGVjdGVkIHdpdGggc3dhcF9sb2NrLiByZWFkaW5nIGluIHZtX3N3YXBfZnVsbCgpIGRvZXNuJiMzOTt0IG5lZWQgbG9jayAqLwotbG9uZyB0b3RhbF9zd2FwX3BhZ2VzOwogI2RlZmluZSBERUZfU1dBUF9QUklPICAtMQogdW5zaWduZWQgbG9uZyBzd2FwZmlsZV9tYXhpbXVtX3NpemU7CiAjaWZkZWYgQ09ORklHX01JR1JBVElPTgpAQCAtODMsNTIgJiM0Mzs4OSw0MiBAQCBib29sIHN3YXBfbWlncmF0aW9uX2FkX3N1cHBvcnRlZDsKIHN0YXRpYyBjb25zdCBjaGFyIEJhZF9maWxlW10gPSAmIzM0O0JhZCBzd2FwIGZpbGUgZW50cnkgJiMzNDs7CiBzdGF0aWMgY29uc3QgY2hhciBCYWRfb2Zmc2V0W10gPSAmIzM0O0JhZCBzd2FwIG9mZnNldCBlbnRyeSAmIzM0OzsKIAotLyoKLSAqIGFsbCBhY3RpdmUgc3dhcF9pbmZvX3N0cnVjdHMKLSAqIHByb3RlY3RlZCB3aXRoIHN3YXBfbG9jaywgYW5kIG9yZGVyZWQgYnkgcHJpb3JpdHkuCi0gKi8KLXN0YXRpYyBQTElTVF9IRUFEKHN3YXBfYWN0aXZlX2hlYWQpOwomIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKl9fc3dhcF9pdGVyKGludCAqaSwgdW5zaWduZWQgbG9uZyBmbGFnKQomIzQzO3sKJiM0MzsJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CXdoaWxlICgqaSAmbHQ7IG5yX3N3YXBmaWxlcykgewomIzQzOwkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gX19zd2FwX3R5cGVfdG9faW5mbygqaSk7CiYjNDM7CiYjNDM7CQlWTV9XQVJOX09OKCFzaSk7CiYjNDM7CQkoKmkpJiM0MzsmIzQzOzsKJiM0MzsJCWlmIChmbGFnICZhbXA7JmFtcDsgISgoc2ktJmd0O2ZsYWdzICZhbXA7IGZsYWcpID09IGZsYWcpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJcmV0dXJuIHNpOwomIzQzOwl9CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIF9fZm9yX2VhY2hfc3dhcChzaSwgZmxhZykJCQlcCiYjNDM7CWZvciAoaW50IF9faSA9IDA7ICgoc2kpID0gX19zd2FwX2l0ZXIoJmFtcDtfX2ksIGZsYWcpKTspCiAKIC8qCi0gKiBhbGwgYXZhaWxhYmxlIChhY3RpdmUsIG5vdCBmdWxsKSBzd2FwX2luZm9fc3RydWN0cwotICogcHJvdGVjdGVkIHdpdGggc3dhcF9hdmFpbF9sb2NrLCBvcmRlcmVkIGJ5IHByaW9yaXR5LgotICogVGhpcyBpcyB1c2VkIGJ5IGZvbGlvX2FsbG9jX3N3YXAoKSBpbnN0ZWFkIG9mIHN3YXBfYWN0aXZlX2hlYWQKLSAqIGJlY2F1c2Ugc3dhcF9hY3RpdmVfaGVhZCBpbmNsdWRlcyBhbGwgc3dhcF9pbmZvX3N0cnVjdHMsCi0gKiBidXQgZm9saW9fYWxsb2Nfc3dhcCgpIGRvZXNuJiMzOTt0IG5lZWQgdG8gbG9vayBhdCBmdWxsIG9uZXMuCi0gKiBUaGlzIHVzZXMgaXRzIG93biBsb2NrIGluc3RlYWQgb2Ygc3dhcF9sb2NrIGJlY2F1c2Ugd2hlbiBhCi0gKiBzd2FwX2luZm9fc3RydWN0IGNoYW5nZXMgYmV0d2VlbiBub3QtZnVsbC9mdWxsLCBpdCBuZWVkcyB0bwotICogYWRkL3JlbW92ZSBpdHNlbGYgdG8vZnJvbSB0aGlzIGxpc3QsIGJ1dCB0aGUgc3dhcF9pbmZvX3N0cnVjdC0mZ3Q7bG9jawotICogaXMgaGVsZCBhbmQgdGhlIGxvY2tpbmcgb3JkZXIgcmVxdWlyZXMgc3dhcF9sb2NrIHRvIGJlIHRha2VuCi0gKiBiZWZvcmUgYW55IHN3YXBfaW5mb19zdHJ1Y3QtJmd0O2xvY2suCiYjNDM7ICogZm9yX2VhY2hfc3dhcCAtIGl0ZXJhdGUgdGhyb3VnaCBhbGwgYWxsb2NhdGVkIGFuZCBpbnVzZSBzd2FwIGRldmljZXMKJiM0MzsgKiBAc2k6IHRoZSBpdGVyYXRvcgomIzQzOyAqCiYjNDM7ICogQ29udGV4dDogVGhlIGNhbGxlciBtdXN0IGhvbGQgc3dhcG9uX3J3c2VtLiBUaGUgbG9jayBtYXkgYmUgZHJvcHBlZCBkdXJpbmcKJiM0MzsgKiB0aGUgbG9vcCBib2R5IGJ1dCBtdXN0IGJlIHJlLWFjcXVpcmVkIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24uCiAgKi8KLXN0YXRpYyBQTElTVF9IRUFEKHN3YXBfYXZhaWxfaGVhZCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfYXZhaWxfbG9jayk7Ci0KLXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2luZm9bTUFYX1NXQVBGSUxFU107CiYjNDM7I2RlZmluZSBmb3JfZWFjaF9zd2FwKHNpKSBfX2Zvcl9lYWNoX3N3YXAoc2ksIFNXUF9VU0VEKQomIzQzOyNkZWZpbmUgZm9yX2VhY2hfYXZhaWxfc3dhcChzaSkgX19mb3JfZWFjaF9zd2FwKHNpLCBTV1BfVVNFRCB8IFNXUF9XUklURU9LKQogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnN3YXBfdGFibGVfY2FjaGVwOwogCi0vKiBQcm90ZWN0cyBzaS0mZ3Q7c3dhcF9maWxlIGZvciAvcHJvYy9zd2FwcyB1c2FnZSAqLwotc3RhdGljIERFRklORV9NVVRFWChzd2Fwb25fbXV0ZXgpOwotCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocHJvY19wb2xsX3dhaXQpOwogLyogQWN0aXZpdHkgY291bnRlciB0byBpbmRpY2F0ZSB0aGF0IGEgc3dhcG9uIG9yIHN3YXBvZmYgaGFzIG9jY3VycmVkICovCiBzdGF0aWMgYXRvbWljX3QgcHJvY19wb2xsX2V2ZW50ID0gQVRPTUlDX0lOSVQoMCk7CiAKIGF0b21pY190IG5yX3JvdGF0ZV9zd2FwID0gQVRPTUlDX0lOSVQoMCk7CiAKLXN0cnVjdCBwZXJjcHVfc3dhcF9jbHVzdGVyIHsKLQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lbU1dBUF9OUl9PUkRFUlNdOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0W1NXQVBfTlJfT1JERVJTXTsKLQlsb2NhbF9sb2NrX3QgbG9jazsKLX07Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyY3B1X3N3YXBfY2x1c3RlciwgcGVyY3B1X3N3YXBfY2x1c3RlcikgPSB7Ci0JLnNpID0geyBOVUxMIH0sCi0JLm9mZnNldCA9IHsgU1dBUF9FTlRSWV9JTlZBTElEIH0sCi0JLmxvY2sgPSBJTklUX0xPQ0FMX0xPQ0soKSwKLX07Ci0KIC8qIE1heSByZXR1cm4gTlVMTCBvbiBpbnZhbGlkIHR5cGUsIGNhbGxlciBtdXN0IGNoZWNrIGZvciBOVUxMIHJldHVybiAqLwogc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX3R5cGVfdG9faW5mbyhpbnQgdHlwZSkKIHsKQEAgLTE0MywxOCAmIzQzOzEzOSwzNTAgQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2VudHJ5X3RvX2luZm8oc3dwX2VudHJ5X3QgZW50cnkpCiAJcmV0dXJuIHN3YXBfdHlwZV90b19pbmZvKHN3cF90eXBlKGVudHJ5KSk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIEFsbCBhdmFpbGFibGUgc3dhcF9pbmZvX3N0cnVjdHMgYXJlIGdyb3VwZWQgYnkgcHJpb3JpdHkgcmluZ3MsIHRoZSByaW5ncwomIzQzOyAqIGFyZSBvcmRlcmVkIGluIGEgcXVldWUgYnkgcHJpb3JpdHkgKGxvd2VyIHByaW8gdmFsdWUgPSBoaWdoZXIgcHJpb3JpdHkpLgomIzQzOyAqIFRoZSBhbGxvY2F0b3IgaXRlcmF0ZXMgYW5kIHJvdGF0ZXMgZGV2aWNlcyB3aXRoaW4gZWFjaCBwcmlvcml0eSByaW5nLgomIzQzOyAqIFdoZW4gYWxsIGRldmljZXMgaW4gYSByaW5nIGFyZSBpdGVyYXRlZCwgaXQgZ29lcyB0byB0aGUgbmV4dCBsb3dlcgomIzQzOyAqIHByaW9yaXR5IHJpbmcuCiYjNDM7ICovCiYjNDM7c3RydWN0IHN3YXBfcHJpb19yaW5nIHsKJiM0MzsJaW50IHByaW87CiYjNDM7CXVuc2lnbmVkIGludCBzaXplOwomIzQzOwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZGV2W10gX19jb3VudGVkX2J5KHNpemUpOwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgcmluZyBpcyBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtIHNvIHVwZGF0aW5nIGl0IGlzIGNvc3RseS4gVG8gbWFrZQomIzQzOyAqIHRoZSBhbGxvY2F0b3IgYW5kIG90aGVyIHVzZXJzIHNraXAgZnVsbCBkZXZpY2VzIGZhc3RlciwgdGhlIGxvd2VzdCBiaXQgb2YKJiM0MzsgKiBhIGRldmljZSBwb2ludGVyIGlzIHVzZWQgdG8gbWFyayBpdCBkaXNhYmxlZCAodGVtcG9yYXJpbHkgdW5hdmFpbGFibGUpLgomIzQzOyAqIFRoaXMgcmVsaWVzIG9uIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IGJlaW5nIHN1ZmZpY2llbnRseQomIzQzOyAqIGFsaWduZWQgKGd1YXJhbnRlZWQgYnkga21hbGxvYykuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQJMAomIzQzOyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVAkJQklUKFNXQVBfREVWSUNFX01BU0tFRF9TSElGVCkKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFNlcmlhbGl6ZXMgcXVldWUgY29udGVudCBtdXRhdGlvbnMgYW5kIGtlZXBzIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQKJiM0MzsgKiBjb25zaXN0ZW50IHdpdGggdGhlIG1hc2tlZCBzdGF0ZSBvZiBlYWNoIGRldmljZSBwb2ludGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTd2FwIHF1ZXVlIGlzIHByb3RlY3RlZCBieSBib3RoIHN3YXBfcXVldWVfdXBkYXRlX2xvY2sgYW5kIHN3YXBvbl9yd3NlbS4KJiM0MzsgKiBPbmx5IHN3YXBvbi9zd2Fwb2ZmIHdpbGwgdGFrZSB0aGUgd3JpdGUgbG9jaywgYW5kIG1vZGlmeSB0aGUgcXVldWUgbGVuZ3RoCiYjNDM7ICogb3IgYW55IHJpbmcmIzM5O3MgbGVuZ3RoLiBzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrIHByb3RlY3RzIHRoZSBjb250ZW50IHNvCiYjNDM7ICogZGV2aWNlcyBjYW4gYmUgbWFza2VkIGVhc2lseSB3aXRob3V0IHRha2luZyB0aGUgd3JpdGVsb2NrLCB3aGljaCBpcyBoZWF2eS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgc3RydWN0IHN3YXBfcHJpb19yaW5nICoqc3dhcF9xdWV1ZTsKJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHN3YXBfcXVldWVfbGVuOwomIzQzOwomIzQzOy8qCiYjNDM7ICogRWFjaCBDUFUgaGFzIGl0cyByZWFkIGl0ZXJhdG9yLCBzbyB0aGUgcXVldWUgaXRzZWxmIHdpbGwgcmVtYWluIHJlYWQKJiM0MzsgKiBvbmx5IGFuZCB0aGUgQ1BVIHNpZGUgcmVhZGVyIHJvdGF0ZXMgYnkgaXRlcmF0aW5nIHRoZSBkZXZpY2VzCiYjNDM7ICogcGVyaW9kaWNhbGx5IHVzaW5nIHRoZSBjb3VudGVyLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgU1dBUF9ST1VORF9ST0JJTl9RVU9UQSBTV0FQRklMRV9DTFVTVEVSCiYjNDM7c3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciB7CiYjNDM7CWludCBvZmZzZXQ7CiYjNDM7CWxvbmcgcnJfY291bnRlcjsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciB7CiYjNDM7CWxvY2FsX2xvY2tfdCBsb2NrOwomIzQzOwlzdHJ1Y3Qgc3dhcF9yaW5nX2l0ZXJhdG9yIHJpW107CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgX19wZXJjcHUgc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyICpzd2FwX3F1ZXVlX3JlYWRlcnM7CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIHN3YXBfZGV2aWNlX21hc2tlZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpc2kgJmFtcDsgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICopKCh1bnNpZ25lZCBsb25nKXNpICZhbXA7IH5TV0FQX0RFVklDRV9NQVNLRURfQklUKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKGludCBucl9yaW5ncywgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpyZWFkZXJzOwomIzQzOwomIzQzOwlpZiAoIW5yX3JpbmdzKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CXJlYWRlcnMgPSBfX2FsbG9jX3BlcmNwdV9nZnAoc3RydWN0X3NpemUocmVhZGVycywgcmksIG5yX3JpbmdzKSwKJiM0MzsJCQkJICAgICBfX2FsaWdub2ZfXygqcmVhZGVycyksIGdmcCk7CiYjNDM7CXJldHVybiByZWFkZXJzOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnMpCiYjNDM7ewomIzQzOwlpbnQgcmluZ19pZHgsIGNwdTsKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nOwomIzQzOwomIzQzOwlmcmVlX3BlcmNwdShzd2FwX3F1ZXVlX3JlYWRlcnMpOwomIzQzOwlzd2FwX3F1ZXVlX3JlYWRlcnMgPSByZWFkZXJzOwomIzQzOwlpZiAoIXJlYWRlcnMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qIERpc3RyaWJ1dGUgZWFjaCBDUFUmIzM5O3Mgc3dhcCBJTyBmYWlybHkgYWNyb3NzIGRldmljZXMuICovCiYjNDM7CWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKJiM0MzsJCWxvY2FsX2xvY2tfaW5pdCgmYW1wO3Blcl9jcHVfcHRyKHJlYWRlcnMsIGNwdSktJmd0O2xvY2spOwomIzQzOwomIzQzOwkJZm9yIChyaW5nX2lkeCA9IDA7IHJpbmdfaWR4ICZsdDsgc3dhcF9xdWV1ZV9sZW47IHJpbmdfaWR4JiM0MzsmIzQzOykgewomIzQzOwkJCXJpbmcgPSBzd2FwX3F1ZXVlW3JpbmdfaWR4XTsKJiM0MzsJCQlwZXJfY3B1X3B0cihyZWFkZXJzLCBjcHUpLSZndDtyaVtyaW5nX2lkeF0ub2Zmc2V0ID0KJiM0MzsJCQkJICAgIGNwdSAlIHJpbmctJmd0O3NpemU7CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX3F1ZXVlX2dldF9kZXZpY2UobG9uZyBucl9hbGxvYywgaW50IG5yX2l0ZXIpCiYjNDM7ewomIzQzOwlib29sIHJvdGF0ZSA9IGZhbHNlOwomIzQzOwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7CiYjNDM7CXN0cnVjdCBzd2FwX3JpbmdfaXRlcmF0b3IgKnJpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7CiYjNDM7CXVuc2lnbmVkIGludCBxdWV1ZV9pZHg7CiYjNDM7CiYjNDM7CWlmICghc3dhcF9xdWV1ZV9sZW4pCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKJiM0MzsKJiM0MzsJcXVldWVfaWR4ID0gMDsKJiM0MzsJd2hpbGUgKG5yX2l0ZXIgJmd0Oz0gc3dhcF9xdWV1ZVtxdWV1ZV9pZHhdLSZndDtzaXplKSB7CiYjNDM7CQlucl9pdGVyIC09IHN3YXBfcXVldWVbcXVldWVfaWR4XS0mZ3Q7c2l6ZTsKJiM0MzsJCWlmICgmIzQzOyYjNDM7cXVldWVfaWR4ICZndDs9IHN3YXBfcXVldWVfbGVuKQomIzQzOwkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJpbmcgPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF07CiYjNDM7CWxvY2FsX2xvY2soJmFtcDtzd2FwX3F1ZXVlX3JlYWRlcnMtJmd0O2xvY2spOwomIzQzOwlyaSA9IHRoaXNfY3B1X3B0cigmYW1wO3N3YXBfcXVldWVfcmVhZGVycy0mZ3Q7cmlbcXVldWVfaWR4XSk7CiYjNDM7CS8qIFJvdGF0ZSB3aGlsZSBpdGVyYXRpbmcgdGhlIHJpbmcsIGp1c3Qgbm90IG9uIHRoZSBmaXJzdCB0cnkgKi8KJiM0MzsJaWYgKG5yX2l0ZXIpCiYjNDM7CQlyb3RhdGUgPSB0cnVlOwomIzQzOwllbHNlIGlmIChyaS0mZ3Q7cnJfY291bnRlciAmbHQ7IG5yX2FsbG9jKQomIzQzOwkJcm90YXRlID0gdHJ1ZTsKJiM0MzsJZWxzZSBpZiAocmktJmd0O29mZnNldCAmZ3Q7PSByaW5nLSZndDtzaXplKQomIzQzOwkJcm90YXRlID0gdHJ1ZTsKJiM0MzsJaWYgKHJvdGF0ZSkgewomIzQzOwkJcmktJmd0O29mZnNldCYjNDM7JiM0Mzs7CiYjNDM7CQlyaS0mZ3Q7b2Zmc2V0ICU9IHJpbmctJmd0O3NpemU7CiYjNDM7CQlyaS0mZ3Q7cnJfY291bnRlciA9IFNXQVBfUk9VTkRfUk9CSU5fUVVPVEE7CiYjNDM7CX0KJiM0MzsJcmktJmd0O3JyX2NvdW50ZXIgLT0gbnJfYWxsb2M7CiYjNDM7CXNpID0gUkVBRF9PTkNFKHJpbmctJmd0O2RldltyaS0mZ3Q7b2Zmc2V0XSk7CiYjNDM7CWxvY2FsX3VubG9jaygmYW1wO3N3YXBfcXVldWVfcmVhZGVycy0mZ3Q7bG9jayk7CiYjNDM7CiYjNDM7CWlmIChzd2FwX2RldmljZV9tYXNrZWQoc2kpKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKJiM0MzsKJiM0MzsJc2kgPSBzd2FwX2RldmljZV91bm1hc2tfcHRyKHNpKTsKJiM0MzsJcmV0dXJuIHNpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBzd2FwX3F1ZXVlX2ZpbmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgKnJpbmdfaWR4LCB1bnNpZ25lZCBpbnQgKmRldl9pZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgaSwgajsKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nOwomIzQzOwomIzQzOwlsb2NrZGVwX2Fzc2VydChsb2NrZGVwX2lzX2hlbGQoJmFtcDtzd2Fwb25fcndzZW0pIHx8CiYjNDM7CQkgICAgICAgbG9ja2RlcF9pc19oZWxkKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jaykpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgc3dhcF9xdWV1ZV9sZW47IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyaW5nID0gc3dhcF9xdWV1ZVtpXTsKJiM0MzsJCWlmIChyaW5nLSZndDtwcmlvICE9IHNpLSZndDtwcmlvKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJZm9yIChqID0gMDsgaiAmbHQ7IHJpbmctJmd0O3NpemU7IGomIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHN3YXBfZGV2aWNlX3VubWFza19wdHIoUkVBRF9PTkNFKHJpbmctJmd0O2RldltqXSkpICE9IHNpKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQkqcmluZ19pZHggPSBpOwomIzQzOwkJCSpkZXZfaWR4ID0gajsKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfbWFzayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgcmluZ19pZHgsIGRldl9pZHg7CiYjNDM7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKJiM0MzsJaWYgKHN3YXBfcXVldWVfZmluZChzaSwgJmFtcDtyaW5nX2lkeCwgJmFtcDtkZXZfaWR4KSkKJiM0MzsJCV9fc2V0X2JpdChTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQsCiYjNDM7CQkJICAodW5zaWduZWQgbG9uZyAqKSZhbXA7c3dhcF9xdWV1ZVtyaW5nX2lkeF0tJmd0O2RldltkZXZfaWR4XSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfdW5tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCByaW5nX2lkeCwgZGV2X2lkeDsKJiM0MzsKJiM0MzsJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwlpZiAoc3dhcF9xdWV1ZV9maW5kKHNpLCAmYW1wO3JpbmdfaWR4LCAmYW1wO2Rldl9pZHgpKQomIzQzOwkJX19jbGVhcl9iaXQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZULAomIzQzOwkJCSAgICAodW5zaWduZWQgbG9uZyAqKSZhbXA7c3dhcF9xdWV1ZVtyaW5nX2lkeF0tJmd0O2RldltkZXZfaWR4XSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQomIzQzO3sKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICoqbmV3X3F1ZXVlID0gTlVMTCwgKipvbGRfcXVldWUgPSBOVUxMOwomIzQzOwlzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKm5ld19yZWFkZXJzID0gTlVMTDsKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nLCAqbmV3X3JpbmcgPSBOVUxMLCAqb2xkX3JpbmcgPSBOVUxMOwomIzQzOwlpbnQgcHJpbyA9IHNpLSZndDtwcmlvOwomIzQzOwlpbnQgaSwgcG9zLCBlcnIgPSAtRU5PTUVNOwomIzQzOwlnZnBfdCBnZnA7CiYjNDM7CiYjNDM7CS8qIFN3YXAgbm90IHVzYWJsZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyBzd2FwLCBqdXN0IHJlY2xhaW0gY2FjaGUuICovCiYjNDM7CWdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDsKJiM0MzsJbG9ja2RlcF9hc3NlcnRfaGVsZF93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CiYjNDM7CWZvciAocG9zID0gMDsgcG9zICZsdDsgc3dhcF9xdWV1ZV9sZW47IHBvcyYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChzd2FwX3F1ZXVlW3Bvc10tJmd0O3ByaW8gPT0gcHJpbykKJiM0MzsJCQlnb3RvIGFkZF90b19yaW5nOwomIzQzOwkJaWYgKHN3YXBfcXVldWVbcG9zXS0mZ3Q7cHJpbyAmbHQ7IHByaW8pCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogTm8gcmluZyBhdCB0aGlzIHByaW9yaXR5OiBpbnNlcnQgYSBuZXcgb25lIGF0IHBvcy4gKi8KJiM0MzsJbmV3X3JlYWRlcnMgPSBzd2FwX3F1ZXVlX3ByZWFsbG9jX3JlYWRlcnMoc3dhcF9xdWV1ZV9sZW4gJiM0MzsgMSwgZ2ZwKTsKJiM0MzsJaWYgKCFuZXdfcmVhZGVycykKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwluZXdfcXVldWUgPSBrbWFsbG9jX2FycmF5KHN3YXBfcXVldWVfbGVuICYjNDM7IDEsIHNpemVvZigqc3dhcF9xdWV1ZSksIGdmcCk7CiYjNDM7CWlmICghbmV3X3F1ZXVlKQomIzQzOwkJZ290byBmYWlsZWQ7CiYjNDM7CW5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShuZXdfcmluZywgZGV2LCAxKSwgZ2ZwKTsKJiM0MzsJaWYgKCFuZXdfcmluZykKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwlpZiAoIWdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwomIzQzOwluZXdfcmluZy0mZ3Q7cHJpbyA9IHByaW87CiYjNDM7CW5ld19yaW5nLSZndDtzaXplID0gMTsKJiM0MzsJbmV3X3JpbmctJmd0O2RldlswXSA9IHNpOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgcG9zOyBpJiM0MzsmIzQzOykKJiM0MzsJCW5ld19xdWV1ZVtpXSA9IHN3YXBfcXVldWVbaV07CiYjNDM7CW5ld19xdWV1ZVtwb3NdID0gbmV3X3Jpbmc7CiYjNDM7CWZvciAoaSA9IHBvczsgaSAmbHQ7IHN3YXBfcXVldWVfbGVuOyBpJiM0MzsmIzQzOykKJiM0MzsJCW5ld19xdWV1ZVtpICYjNDM7IDFdID0gc3dhcF9xdWV1ZVtpXTsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CW9sZF9xdWV1ZSA9IHN3YXBfcXVldWU7CiYjNDM7CXN3YXBfcXVldWUgPSBuZXdfcXVldWU7CiYjNDM7CXN3YXBfcXVldWVfbGVuJiM0MzsmIzQzOzsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKJiM0MzsJa2ZyZWUob2xkX3F1ZXVlKTsKJiM0MzsKJiM0MzsJc3dhcF9xdWV1ZV9pbnN0YWxsX3JlYWRlcnMobmV3X3JlYWRlcnMpOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MzthZGRfdG9fcmluZzoKJiM0MzsJcmluZyA9IHN3YXBfcXVldWVbcG9zXTsKJiM0MzsJbmV3X3JpbmcgPSBrbWFsbG9jKHN0cnVjdF9zaXplKHJpbmcsIGRldiwgcmluZy0mZ3Q7c2l6ZSAmIzQzOyAxKSwgZ2ZwKTsKJiM0MzsJaWYgKCFuZXdfcmluZykKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwlpZiAoIWdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkKJiM0MzsJCWdvdG8gZmFpbGVkOwomIzQzOwlzcGluX2xvY2soJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKJiM0MzsJbWVtY3B5KG5ld19yaW5nLCByaW5nLCBzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctJmd0O3NpemUpKTsKJiM0MzsJbmV3X3JpbmctJmd0O3NpemUmIzQzOyYjNDM7OwomIzQzOwluZXdfcmluZy0mZ3Q7ZGV2W25ld19yaW5nLSZndDtzaXplIC0gMV0gPSBzaTsKJiM0MzsJb2xkX3JpbmcgPSBzd2FwX3F1ZXVlW3Bvc107CiYjNDM7CXN3YXBfcXVldWVbcG9zXSA9IG5ld19yaW5nOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwlrZnJlZShvbGRfcmluZyk7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2ZhaWxlZDoKJiM0MzsJZnJlZV9wZXJjcHUobmV3X3JlYWRlcnMpOwomIzQzOwlrZnJlZShuZXdfcXVldWUpOwomIzQzOwlrZnJlZShuZXdfcmluZyk7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHN3YXBfcXVldWVfZGVsKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CWdmcF90IGdmcDsKJiM0MzsJdW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4OwomIzQzOwlzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKm5ld19yZWFkZXJzID0gTlVMTDsKJiM0MzsJc3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nLCAqbmV3X3JpbmcgPSBOVUxMLCAqb2xkX3JpbmcgPSBOVUxMOwomIzQzOwlzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipuZXdfcXVldWUgPSBOVUxMLCAqKm9sZF9xdWV1ZSA9IE5VTEw7CiYjNDM7CiYjNDM7CWxvY2tkZXBfYXNzZXJ0X2hlbGRfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlpZiAoIXN3YXBfcXVldWVfZmluZChzaSwgJmFtcDtyaW5nX2lkeCwgJmFtcDtkZXZfaWR4KSkgewomIzQzOwkJV0FSTl9PTigxKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUbyBzaHJpbmsgbWVtb3J5IHVzYWdlLCBwcmUtYWxsb2NhdGUgbmV3IHNtYWxsZXIgZGF0YSBiZWZvcmUKJiM0MzsJICogbG9ja2luZy4gRmFpbHVyZSBpcyBmaW5lLCBzd2Fwb2ZmIHdpbGwgcmVsZWFzZSB0aGVtIGFueXdheS4KJiM0MzsJICovCiYjNDM7CWdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDsKJiM0MzsJcmluZyA9IHN3YXBfcXVldWVbcmluZ19pZHhdOwomIzQzOwlpZiAocmluZy0mZ3Q7c2l6ZSAmZ3Q7IDEpCiYjNDM7CQluZXdfcmluZyA9IGttYWxsb2Moc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLSZndDtzaXplIC0gMSksIGdmcCk7CiYjNDM7CWlmIChyaW5nLSZndDtzaXplID09IDEgJmFtcDsmYW1wOyBzd2FwX3F1ZXVlX2xlbiAmZ3Q7IDEpIHsKJiM0MzsJCW5ld19yZWFkZXJzID0gc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKAomIzQzOwkJCQkJc3dhcF9xdWV1ZV9sZW4gLSAxLCBnZnApOwomIzQzOwkJbmV3X3F1ZXVlID0ga21hbGxvYyhzaXplb2YoKnN3YXBfcXVldWUpICoKJiM0MzsJCQkJICAgIChzd2FwX3F1ZXVlX2xlbiAtIDEpLCBnZnApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwlpZiAocmluZy0mZ3Q7c2l6ZSAmZ3Q7IDEpIHsKJiM0MzsJCS8qIFNoaWZ0IHRyYWlsaW5nIGRldmljZXMgbGVmdCB0byBmaWxsIHRoZSBnYXAuICovCiYjNDM7CQl3aGlsZSAoJiM0MzsmIzQzO2Rldl9pZHggJmx0OyByaW5nLSZndDtzaXplKQomIzQzOwkJCXJpbmctJmd0O2RldltkZXZfaWR4IC0gMV0gPQomIzQzOwkJCQlyaW5nLSZndDtkZXZbZGV2X2lkeF07CiYjNDM7CQlyaW5nLSZndDtzaXplLS07CiYjNDM7CQlpZiAobmV3X3JpbmcpIHsKJiM0MzsJCQltZW1jcHkobmV3X3JpbmcsIHJpbmcsCiYjNDM7CQkJICAgICAgIHN0cnVjdF9zaXplKHJpbmcsIGRldiwgcmluZy0mZ3Q7c2l6ZSkpOwomIzQzOwkJCW9sZF9yaW5nID0gcmluZzsKJiM0MzsJCQlzd2FwX3F1ZXVlW3JpbmdfaWR4XSA9IG5ld19yaW5nOwomIzQzOwkJfQomIzQzOwl9IGVsc2UgewomIzQzOwkJLyogTGFzdCBkZXZpY2UgaW4gdGhpcyByaW5nOiByZW1vdmUgdGhlIHJpbmcuICovCiYjNDM7CQlvbGRfcmluZyA9IHJpbmc7CiYjNDM7CQlzd2FwX3F1ZXVlX2xlbi0tOwomIzQzOwkJd2hpbGUgKCYjNDM7JiM0MztyaW5nX2lkeCAmbHQ7PSBzd2FwX3F1ZXVlX2xlbikKJiM0MzsJCQlzd2FwX3F1ZXVlW3JpbmdfaWR4IC0gMV0gPQomIzQzOwkJCQlzd2FwX3F1ZXVlW3JpbmdfaWR4XTsKJiM0MzsJCWlmIChuZXdfcXVldWUpIHsKJiM0MzsJCQltZW1jcHkobmV3X3F1ZXVlLCBzd2FwX3F1ZXVlLAomIzQzOwkJCSAgICAgICBzaXplb2YoKnN3YXBfcXVldWUpICogc3dhcF9xdWV1ZV9sZW4pOwomIzQzOwkJCW9sZF9xdWV1ZSA9IHN3YXBfcXVldWU7CiYjNDM7CQkJc3dhcF9xdWV1ZSA9IG5ld19xdWV1ZTsKJiM0MzsJCX0gZWxzZSBpZiAoIXN3YXBfcXVldWVfbGVuKSB7CiYjNDM7CQkJb2xkX3F1ZXVlID0gc3dhcF9xdWV1ZTsKJiM0MzsJCQlzd2FwX3F1ZXVlID0gTlVMTDsKJiM0MzsJCX0KJiM0MzsJCWlmIChuZXdfcmVhZGVycyB8fCAhc3dhcF9xdWV1ZV9sZW4pCiYjNDM7CQkJc3dhcF9xdWV1ZV9pbnN0YWxsX3JlYWRlcnMobmV3X3JlYWRlcnMpOwomIzQzOwl9CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CiYjNDM7CWtmcmVlKG9sZF9yaW5nKTsKJiM0MzsJa2ZyZWUob2xkX3F1ZXVlKTsKJiM0MzsJcHV0X3N3YXBfZGV2aWNlKHNpKTsKJiM0Mzt9CiYjNDM7CiAvKgogICogVXNlIHRoZSBzZWNvbmQgaGlnaGVzdCBiaXQgb2YgaW51c2VfcGFnZXMgY291bnRlciBhcyB0aGUgaW5kaWNhdG9yCi0gKiBpZiBvbmUgc3dhcCBkZXZpY2UgaXMgb24gdGhlIGF2YWlsYWJsZSBwbGlzdCwgc28gdGhlIGF0b21pYyBjYW4KJiM0MzsgKiBpZiBvbmUgc3dhcCBkZXZpY2UgaXMgdW5hdmFpbGFibGUgZm9yIGFsbG9jYXRpb24sIHNvIHRoZSBhdG9taWMgY2FuCiAgKiBzdGlsbCBiZSB1cGRhdGVkIGFyaXRobWV0aWNhbGx5IHdoaWxlIGhhdmluZyBzcGVjaWFsIGRhdGEgZW1iZWRkZWQuCiAgKgogICogaW51c2VfcGFnZXMgY291bnRlciBpcyB0aGUgb25seSB0aGluZyBpbmRpY2F0aW5nIGlmIGEgZGV2aWNlIHNob3VsZAotICogYmUgb24gYXZhaWxfbGlzdHMgb3Igbm90IChleGNlcHQgc3dhcG9uIC8gc3dhcG9mZikuIEJ5IGVtYmVkZGluZyB0aGUKLSAqIG9mZi1saXN0IGJpdCBpbiB0aGUgYXRvbWljIGNvdW50ZXIsIHVwZGF0ZXMgbm8gbG9uZ2VyIG5lZWQgYW55IGxvY2sKLSAqIHRvIGNoZWNrIHRoZSBsaXN0IHN0YXR1cy4KJiM0MzsgKiBiZSBpbiB0aGUgYXZhaWxhYmxlIHF1ZXVlIG9yIG5vdCAoZXhjZXB0IHN3YXBvbiAvIHN3YXBvZmYpLiBCeQomIzQzOyAqIGVtYmVkZGluZyB0aGUgb2ZmLWxpc3QgYml0IGluIHRoZSBhdG9taWMgY291bnRlciwgdXBkYXRlcyBubyBsb25nZXIKJiM0MzsgKiBuZWVkIGFueSBsb2NrIHRvIGNoZWNrIHRoZSBsaXN0IHN0YXR1cy4KICAqCi0gKiBUaGlzIGJpdCB3aWxsIGJlIHNldCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBvbiB0aGUgcGxpc3QgYW5kIG5vdAotICogdXNhYmxlLCB3aWxsIGJlIGNsZWFyZWQgaWYgdGhlIGRldmljZSBpcyBvbiB0aGUgcGxpc3QuCiYjNDM7ICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3QgaW4gdGhlIGF2YWlsYWJsZSBxdWV1ZQomIzQzOyAqIGFuZCBub3QgdXNhYmxlLCB3aWxsIGJlIGNsZWFyZWQgaWYgdGhlIGRldmljZSBpcyBpbiB0aGUgcXVldWUuCiAgKi8KICNkZWZpbmUgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCAoMVVMICZsdDsmbHQ7IChCSVRTX1BFUl9UWVBFKGF0b21pY190KSAtIDIpKQogI2RlZmluZSBTV0FQX1VTQUdFX0NPVU5URVJfTUFTSyAoflNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpCkBAIC0xNjMsNiAmIzQzOzQ5MSwyNiBAQCBzdGF0aWMgbG9uZyBzd2FwX3VzYWdlX2luX3BhZ2VzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIAlyZXR1cm4gYXRvbWljX2xvbmdfcmVhZCgmYW1wO3NpLSZndDtpbnVzZV9wYWdlcykgJmFtcDsgU1dBUF9VU0FHRV9DT1VOVEVSX01BU0s7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFNlcmlhbGl6ZSB0aGUgYWxsb2NhdGlvbiBvbiBzaW5nbGUgQ1BVIG9yIGdsb2JhbGx5IHRvIGF2b2lkCiYjNDM7ICogZnJhZ21lbnRhdGlvbiBhbmQgbWFrZSB0aGUgd29ya2Zsb3cgZWFzaWVyIHRvIGZvbGxvdy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpCiYjNDM7CQlsb2NhbF9sb2NrKCZhbXA7c2ktJmd0O3BlcmNwdV9jbHVzdGVyLSZndDtsb2NrKTsKJiM0MzsJZWxzZQomIzQzOwkJc3Bpbl9sb2NrKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtsb2NrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0Mzt7CiYjNDM7CWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpCiYjNDM7CQlsb2NhbF91bmxvY2soJmFtcDtzaS0mZ3Q7cGVyY3B1X2NsdXN0ZXItJmd0O2xvY2spOwomIzQzOwllbHNlCiYjNDM7CQlzcGluX3VubG9jaygmYW1wO3NpLSZndDtnbG9iYWxfY2x1c3Rlci0mZ3Q7bG9jayk7CiYjNDM7fQomIzQzOwogLyogUmVjbGFpbSB0aGUgc3dhcCBlbnRyeSBhbnl3YXkgaWYgcG9zc2libGUgKi8KICNkZWZpbmUgVFRSU19BTllXQVkJCTB4MQogLyoKQEAgLTUzMyw5ICYjNDM7ODgxLDEwIEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiAJICogT25seSBjbHVzdGVyIGlzb2xhdGlvbiBmcm9tIHRoZSBhbGxvY2F0b3IgZG9lcyB0YWJsZSBhbGxvY2F0aW9uLgogCSAqIFN3YXAgYWxsb2NhdG9yIHVzZXMgcGVyY3B1IGNsdXN0ZXJzIGFuZCBob2xkcyB0aGUgbG9jYWwgbG9jay4KIAkgKi8KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7dGhpc19jcHVfcHRyKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3RlciktJmd0O2xvY2spOwotCWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfU09MSURTVEFURSkpCi0JCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFtcDtzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXJfbG9jayk7CiYjNDM7CWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpCiYjNDM7CQlsb2NrZGVwX2Fzc2VydF9oZWxkKHRoaXNfY3B1X3B0cigmYW1wO3NpLSZndDtwZXJjcHVfY2x1c3Rlci0mZ3Q7bG9jaykpOwomIzQzOwllbHNlCiYjNDM7CQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtsb2NrKTsKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7Y2ktJmd0O2xvY2spOwogCiAJaWYgKCFzd2FwX2NsdXN0ZXJfYWxsb2NfdGFibGUoY2ksIF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHwKQEAgLTU0OCw5ICYjNDM7ODk3LDcgQEAgc3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkgKiB0aGUgcG90ZW50aWFsIHJlY3Vyc2l2ZSBhbGxvY2F0aW9uIGlzIGxpbWl0ZWQuCiAJICovCiAJc3Bpbl91bmxvY2soJmFtcDtjaS0mZ3Q7bG9jayk7Ci0JaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSkKLQkJc3Bpbl91bmxvY2soJmFtcDtzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXJfbG9jayk7Ci0JbG9jYWxfdW5sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKJiM0MzsJc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTsKIAogCXJldCA9IHN3YXBfY2x1c3Rlcl9hbGxvY190YWJsZShjaSwgX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfAogCQkJCQkgICBHRlBfS0VSTkVMKTsKQEAgLTU2Myw5ICYjNDM7OTEwLDcgQEAgc3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkgKiBjb3VsZCBoYXBwZW4gd2l0aCBpZ25vcmluZyB0aGUgcGVyY3B1IGNsdXN0ZXIgaXMgZnJhZ21lbnRhdGlvbiwKIAkgKiB3aGljaCBpcyBhY2NlcHRhYmxlIHNpbmNlIHRoaXMgZmFsbGJhY2sgYW5kIHJhY2UgaXMgcmFyZS4KIAkgKi8KLQlsb2NhbF9sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKLQlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpKQotCQlzcGluX2xvY2soJmFtcDtzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXJfbG9jayk7CiYjNDM7CXN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc2kpOwogCXNwaW5fbG9jaygmYW1wO2NpLSZndDtsb2NrKTsKIAogCWlmIChyZXQpIHsKQEAgLTY3MSw3ICYjNDM7MTAxNiw3IEBAIHN0YXRpYyBib29sIHN3YXBfZG9fc2NoZWR1bGVkX2Rpc2NhcmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCQljaSA9IGxpc3RfZmlyc3RfZW50cnkoJmFtcDtzaS0mZ3Q7ZGlzY2FyZF9jbHVzdGVycywgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvLCBsaXN0KTsKIAkJLyoKIAkJICogRGVsZXRlIHRoZSBjbHVzdGVyIGZyb20gbGlzdCB0byBwcmVwYXJlIGZvciBkaXNjYXJkLCBidXQga2VlcAotCQkgKiB0aGUgQ0xVU1RFUl9GTEFHX0RJU0NBUkQgZmxhZywgcGVyY3B1X3N3YXBfY2x1c3RlciBjb3VsZCBiZQomIzQzOwkJICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHRoZXJlIGNvdWxkIGJlIHBlcmNwdV9jbHVzdGVyCiAJCSAqIHBvaW50aW5nIHRvIGl0LCBvciByYW4gaW50byBieSByZWxvY2F0ZV9jbHVzdGVyLgogCQkgKi8KIAkJbGlzdF9kZWwoJmFtcDtjaS0mZ3Q7bGlzdCk7CkBAIC05NTUsNyAmIzQzOzEzMDAsNyBAQCBzdGF0aWMgYm9vbCBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAlpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpCiAJCWNpLSZndDtvcmRlciA9IG9yZGVyOwogCWNpLSZndDtjb3VudCAmIzQzOz0gbnJfcGFnZXM7Ci0Jc3dhcF9yYW5nZV9hbGxvYyhzaSwgbnJfcGFnZXMpOwomIzQzOwlzd2FwX2RldmljZV9pbnVzZV9hZGQoc2ksIG5yX3BhZ2VzKTsKIAogCXJldHVybiB0cnVlOwogfQpAQCAtMTAwMywxMiAmIzQzOzEzNDgsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGludCBhbGxvY19zd2FwX3NjYW5fY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCiBvdXQ6CiAJcmVsb2NhdGVfY2x1c3RlcihzaSwgY2kpOwogCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwotCWlmIChzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpIHsKLQkJdGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5vZmZzZXRbb3JkZXJdLCBuZXh0KTsKLQkJdGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0sIHNpKTsKLQl9IGVsc2UgewomIzQzOwlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKQomIzQzOwkJdGhpc19jcHVfd3JpdGUoc2ktJmd0O3BlcmNwdV9jbHVzdGVyLSZndDtuZXh0W29yZGVyXSwgbmV4dCk7CiYjNDM7CWVsc2UKIAkJc2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtuZXh0W29yZGVyXSA9IG5leHQ7Ci0JfQogCXJldHVybiBmb3VuZDsKIH0KIApAQCAtMTEwMywxMyAmIzQzOzE0NDYsMTQgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAlpZiAob3JkZXIgJmFtcDsmYW1wOyAhKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfQkxLREVWKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1NPTElEU1RBVEUpKSB7Ci0JCS8qIFNlcmlhbGl6ZSBIREQgU1dBUCBhbGxvY2F0aW9uIGZvciBlYWNoIGRldmljZS4gKi8KLQkJc3Bpbl9sb2NrKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyX2xvY2spOwomIzQzO3Jlc3RhcnQ6CiYjNDM7CXN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc2kpOwomIzQzOwlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKQomIzQzOwkJb2Zmc2V0ID0gX190aGlzX2NwdV9yZWFkKHNpLSZndDtwZXJjcHVfY2x1c3Rlci0mZ3Q7bmV4dFtvcmRlcl0pOwomIzQzOwllbHNlCiAJCW9mZnNldCA9IHNpLSZndDtnbG9iYWxfY2x1c3Rlci0mZ3Q7bmV4dFtvcmRlcl07Ci0JCWlmIChvZmZzZXQgPT0gU1dBUF9FTlRSWV9JTlZBTElEKQotCQkJZ290byBuZXdfY2x1c3RlcjsKIAomIzQzOwlpZiAob2Zmc2V0ICE9IFNXQVBfRU5UUllfSU5WQUxJRCkgewogCQljaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpOwogCQkvKiBDbHVzdGVyIGNvdWxkIGhhdmUgYmVlbiB1c2VkIGJ5IGFub3RoZXIgb3JkZXIgKi8KIAkJaWYgKGNsdXN0ZXJfaXNfdXNhYmxlKGNpLCBvcmRlcikpIHsKQEAgLTExMjMsNyAmIzQzOzE0NjcsNiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQkJZ290byBkb25lOwogCX0KIAotbmV3X2NsdXN0ZXI6CiAJLyoKIAkgKiBJZiB0aGUgZGV2aWNlIG5lZWQgZGlzY2FyZCwgcHJlZmVyIG5ldyBjbHVzdGVyIG92ZXIgbm9uZnVsbAogCSAqIHRvIHNwcmVhZCBvdXQgdGhlIHdyaXRlcy4KQEAgLTExMzIsNiAmIzQzOzE0NzUsMTIgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkJZm91bmQgPSBhbGxvY19zd2FwX3NjYW5fbGlzdChzaSwgJmFtcDtzaS0mZ3Q7ZnJlZV9jbHVzdGVycywgZm9saW8sIGZhbHNlKTsKIAkJaWYgKGZvdW5kKQogCQkJZ290byBkb25lOwomIzQzOwomIzQzOwkJaWYgKCFsaXN0X2VtcHR5KCZhbXA7c2ktJmd0O2Rpc2NhcmRfY2x1c3RlcnMpKSB7CiYjNDM7CQkJc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTsKJiM0MzsJCQlzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTsKJiM0MzsJCQlnb3RvIHJlc3RhcnQ7CiYjNDM7CQl9CiAJfQogCiAJaWYgKG9yZGVyICZsdDsgUE1EX09SREVSKSB7CkBAIC0xMTgwLDggJiM0MzsxNTI5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAkJCWdvdG8gZG9uZTsKIAl9CiBkb25lOgotCWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfU09MSURTVEFURSkpCi0JCXNwaW5fdW5sb2NrKCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyX2xvY2spOwomIzQzOwlzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc2kpOwogCiAJcmV0dXJuIGZvdW5kOwogfQpAQCAtMTE5MSw1NCAmIzQzOzE1MzksNDQgQEAgc3RhdGljIHZvaWQgZGVsX2Zyb21fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9mZikKIHsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiAKLQlpZiAoc3dhcG9mZikgewotCQkvKgotCQkgKiBGb3JjZWZ1bGx5IHJlbW92ZSBpdC4gQ2xlYXIgdGhlIFNXUF9XUklURU9LIGZsYWdzIGZvcgotCQkgKiBzd2Fwb2ZmIGhlcmUgc28gaXQmIzM5O3Mgc3luY2hyb25pemVkIGJ5IGJvdGggc2ktJmd0O2xvY2sgYW5kCi0JCSAqIHN3YXBfYXZhaWxfbG9jaywgdG8gZW5zdXJlIHRoZSByZXN1bHQgY2FuIGJlIHNlZW4gYnkKLQkJICogYWRkX3RvX2F2YWlsX2xpc3QuCi0JCSAqLwotCQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7c2ktJmd0O2xvY2spOwotCQlzaS0mZ3Q7ZmxhZ3MgJmFtcDs9IH5TV1BfV1JJVEVPSzsKLQkJYXRvbWljX2xvbmdfb3IoU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgJmFtcDtzaS0mZ3Q7aW51c2VfcGFnZXMpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIElmIG5vdCBjYWxsZWQgYnkgc3dhcG9mZiwgdGFrZSBpdCBvZmYtbGlzdCBvbmx5IGlmIGl0JiMzOTtzCi0JCSAqIGZ1bGwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgbm90IHNldCAoc3RyaWN0bHkKLQkJICogc2ktJmd0O2ludXNlX3BhZ2VzID09IHBhZ2VzKSwgYW55IGNvbmN1cnJlbnQgc2xvdCBmcmVlaW5nLAotCQkgKiBvciBkZXZpY2UgYWxyZWFkeSByZW1vdmVkIGZyb20gcGxpc3QgYnkgc29tZW9uZSBlbHNlCi0JCSAqIHdpbGwgbWFrZSB0aGlzIHJldHVybiBmYWxzZS4KLQkJICovCiYjNDM7CS8qCiYjNDM7CSAqIEZvcmNlIHJlbW92ZSBpdCBvbmx5IGZvciBzd2Fwb2ZmLiBFbHNlLCB0YWtlIGl0IG9mZi1saXN0IG9ubHkgaWYKJiM0MzsJICogaXQmIzM5O3MgZnVsbCBhbmQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBpcyBub3Qgc2V0IChzdHJpY3RseQomIzQzOwkgKiBzaS0mZ3Q7aW51c2VfcGFnZXMgPT0gcGFnZXMpLCBzbyBjb25jdXJyZW50IHNsb3QgZnJlZWluZywgb3IKJiM0MzsJICogY29uY3VycmVudCBsaXN0IHJlbW92YWwgd2lsbCBtYWtlIHRoZSBjbXB4Y2hnIGZhaWwgYW5kIHNraXAKJiM0MzsJICogdGhlIHJlbW92YWwuCiYjNDM7CSAqLwomIzQzOwlpZiAoIXN3YXBvZmYpIHsKIAkJcGFnZXMgPSBzaS0mZ3Q7cGFnZXM7CiAJCWlmICghYXRvbWljX2xvbmdfdHJ5X2NtcHhjaGcoJmFtcDtzaS0mZ3Q7aW51c2VfcGFnZXMsICZhbXA7cGFnZXMsCiAJCQkJCSAgICAgcGFnZXMgfCBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSkKIAkJCWdvdG8gc2tpcDsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWF0b21pY19sb25nX29yKFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQsICZhbXA7c2ktJmd0O2ludXNlX3BhZ2VzKTsKIAl9CiAKLQlwbGlzdF9kZWwoJmFtcDtzaS0mZ3Q7YXZhaWxfbGlzdCwgJmFtcDtzd2FwX2F2YWlsX2hlYWQpOwotCiYjNDM7CXN3YXBfcXVldWVfbWFzayhzaSk7CiBza2lwOgotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKIH0KIAogLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHRoaXMgaGVscGVyLiAqLwotc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbikKJiM0MztzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiB7CiAJbG9uZyB2YWw7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKIAotCXNwaW5fbG9jaygmYW1wO3N3YXBfYXZhaWxfbG9jayk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwogCi0JLyogQ29ycmVzcG9uZGluZyB0byBTV1BfV1JJVEVPSyBjbGVhcmluZyBpbiBkZWxfZnJvbV9hdmFpbF9saXN0ICovCi0JaWYgKHN3YXBvbikgewotCQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7c2ktJmd0O2xvY2spOwotCQlzaS0mZ3Q7ZmxhZ3MgfD0gU1dQX1dSSVRFT0s7Ci0JfSBlbHNlIHsKLQkJaWYgKCEoUkVBRF9PTkNFKHNpLSZndDtmbGFncykgJmFtcDsgU1dQX1dSSVRFT0spKQotCQkJZ290byBza2lwOwotCX0KJiM0MzsJLyoKJiM0MzsJICogTWFyayB0aGUgZGV2aWNlIGFzIGF2YWlsIGlmIFNXUF9XUklURU9LIGlzIHNldC4gU3dhcG9mZiBjbGVhcnMKJiM0MzsJICogU1dQX1dSSVRFT0sgZmlyc3QsIHNvIGNoZWNrIHRoYXQgZmlyc3Qgc28gdGhlIGRldmljZSB3b24mIzM5O3QgYmUKJiM0MzsJICogcmUtYWRkZWQgYWZ0ZXIgc3dhcG9mZiBzdGFydGVkLgomIzQzOwkgKi8KJiM0MzsJaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSkKJiM0MzsJCWdvdG8gc2tpcDsKIAogCWlmICghKGF0b21pY19sb25nX3JlYWQoJmFtcDtzaS0mZ3Q7aW51c2VfcGFnZXMpICZhbXA7IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKQogCQlnb3RvIHNraXA7CkBAIC0xMjQ2LDkgJiM0MzsxNTg0LDEwIEBAIHN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pCiAJdmFsID0gYXRvbWljX2xvbmdfZmV0Y2hfYW5kX3JlbGF4ZWQoflNXQVBfVVNBR0VfT0ZGTElTVF9CSVQsICZhbXA7c2ktJmd0O2ludXNlX3BhZ2VzKTsKIAogCS8qCi0JICogV2hlbiBkZXZpY2UgaXMgZnVsbCBhbmQgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdCwgb25seSBvbmUgdXBkYXRlciB3aWxsCi0JICogc2VlIChpbnVzZV9wYWdlcyA9PSBzaS0mZ3Q7cGFnZXMpIGFuZCB3aWxsIGNhbGwgZGVsX2Zyb21fYXZhaWxfbGlzdC4gSWYKLQkgKiB0aGF0IHVwZGF0ZXIgaGFwcGVuIHRvIGJlIGhlcmUsIGp1c3Qgc2tpcCBhZGRpbmcuCiYjNDM7CSAqIFdoZW4gZGV2aWNlIGlzIGZ1bGwgYW5kIG1hcmtlZCBhcyBhdmFpbGFibGUsIG9uZSByZWFkZXIgd2lsbCBzZWUKJiM0MzsJICogKGludXNlX3BhZ2VzID09IHNpLSZndDtwYWdlcykgYW5kIHNob3VsZCBtYXJrIGl0IGFzIHVuYXZhaWxhYmxlIGFuZAomIzQzOwkgKiBzZXQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVC4gSWYgdGhhdCB1cGRhdGVyIGhhcHBlbnMgdG8gYmUgaGVyZSwganVzdAomIzQzOwkgKiBza2lwIHRoZSByZXN0LgogCSAqLwogCXBhZ2VzID0gc2ktJmd0O3BhZ2VzOwogCWlmICh2YWwgPT0gcGFnZXMpIHsKQEAgLTEyNTgsNjAgJiM0MzsxNTk3LDQyIEBAIHN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pCiAJCQlnb3RvIHNraXA7CiAJfQogCi0JcGxpc3RfYWRkKCZhbXA7c2ktJmd0O2F2YWlsX2xpc3QsICZhbXA7c3dhcF9hdmFpbF9oZWFkKTsKLQomIzQzOwlzd2FwX3F1ZXVlX3VubWFzayhzaSk7CiBza2lwOgotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTsKIH0KIAogLyoKLSAqIHN3YXBfdXNhZ2VfYWRkIC8gc3dhcF91c2FnZV9zdWIgb2YgZWFjaCBzbG90IGFyZSBzZXJpYWxpemVkIGJ5IGNpLSZndDtsb2NrCi0gKiB3aXRoaW4gZWFjaCBjbHVzdGVyLCBzbyB0aGUgdG90YWwgY29udHJpYnV0aW9uIHRvIHRoZSBnbG9iYWwgY291bnRlciBzaG91bGQKLSAqIGFsd2F5cyBiZSBwb3NpdGl2ZSBhbmQgY2Fubm90IGV4Y2VlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHVzYWJsZSBzbG90cy4KJiM0MzsgKiBzd2FwX2RldmljZV9pbnVzZV9hZGQgLyBzd2FwX2RldmljZV9pbnVzZV9zdWIgYXJlIGNhbGxlZCB3aXRoaW4gY2x1c3RlcgomIzQzOyAqIHVwZGF0ZSBjcml0aWNhbCBzZWN0aW9ucyBhbmQgc2VyaWFsaXplZCBieSBjaS0mZ3Q7bG9jayB3aXRoaW4gZWFjaCBjbHVzdGVyLAomIzQzOyAqIHNvIHRoZSB0b3RhbCBjb250cmlidXRpb24gdG8gdGhlIGdsb2JhbCBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmUKJiM0MzsgKiBhbmQgY2Fubm90IGV4Y2VlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHVzYWJsZSBzbG90cy4KICAqLwotc3RhdGljIGJvb2wgc3dhcF91c2FnZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBpbnQgbnJfZW50cmllcykKJiM0MztzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAomIzQzOwkJCQkgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKQogewotCWxvbmcgdmFsID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsICZhbXA7c2ktJmd0O2ludXNlX3BhZ2VzKTsKJiM0MzsJbG9uZyBpbnVzZV9wYWdlczsKIAogCS8qCiAJICogSWYgZGV2aWNlIGlzIGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQsCi0JICogcmVtb3ZlIGl0IGZyb20gdGhlIHBsaXN0LgotCSAqLwotCWlmICh1bmxpa2VseSh2YWwgPT0gc2ktJmd0O3BhZ2VzKSkgewotCQlkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgc3dhcF91c2FnZV9zdWIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBpbnQgbnJfZW50cmllcykKLXsKLQlsb25nIHZhbCA9IGF0b21pY19sb25nX3N1Yl9yZXR1cm5fcmVsYXhlZChucl9lbnRyaWVzLCAmYW1wO3NpLSZndDtpbnVzZV9wYWdlcyk7Ci0KLQkvKgotCSAqIElmIGRldmljZSBpcyBub3QgZnVsbCwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgc2V0LAotCSAqIGFkZCBpdCB0byB0aGUgcGxpc3QuCiYjNDM7CSAqIG1hcmsgaXQgdW5hdmFpbGFibGUuCiAJICovCi0JaWYgKHVubGlrZWx5KHZhbCAmYW1wOyBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSkKLQkJYWRkX3RvX2F2YWlsX2xpc3Qoc2ksIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCi0JCQkgICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKQotewotCWlmIChzd2FwX3VzYWdlX2FkZChzaSwgbnJfZW50cmllcykpIHsKJiM0MzsJaW51c2VfcGFnZXMgPSBhdG9taWNfbG9uZ19hZGRfcmV0dXJuX3JlbGF4ZWQobnJfZW50cmllcywgJmFtcDtzaS0mZ3Q7aW51c2VfcGFnZXMpOwomIzQzOwlpZiAodW5saWtlbHkoaW51c2VfcGFnZXMgPT0gc2ktJmd0O3BhZ2VzKSkgewogCQlpZiAodm1fc3dhcF9mdWxsKCkpCiAJCQlzY2hlZHVsZV93b3JrKCZhbXA7c2ktJmd0O3JlY2xhaW1fd29yayk7CiYjNDM7CQlkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7CiAJfQomIzQzOwogCWF0b21pY19sb25nX3N1Yihucl9lbnRyaWVzLCAmYW1wO25yX3N3YXBfcGFnZXMpOwogfQogCi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcykKJiM0MztzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9zdWIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKJiM0MzsJCQkJICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcykKIHsKIAl1bnNpZ25lZCBsb25nIGVuZCA9IG9mZnNldCAmIzQzOyBucl9lbnRyaWVzIC0gMTsKIAl2b2lkICgqc3dhcF9zbG90X2ZyZWVfbm90aWZ5KShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwomIzQzOwlsb25nIGludXNlX3BhZ2VzOwogCXVuc2lnbmVkIGludCBpOwogCiAJZm9yIChpID0gMDsgaSAmbHQ7IG5yX2VudHJpZXM7IGkmIzQzOyYjNDM7KQpAQCAtMTMzNSw3ICYjNDM7MTY1NiwxNCBAQCBzdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkgKi8KIAlzbXBfd21iKCk7CiAJYXRvbWljX2xvbmdfYWRkKG5yX2VudHJpZXMsICZhbXA7bnJfc3dhcF9wYWdlcyk7Ci0Jc3dhcF91c2FnZV9zdWIoc2ksIG5yX2VudHJpZXMpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiBkZXZpY2UgaXMgbm90IGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIHNldCwKJiM0MzsJICogYWRkIGl0IGJhY2sgdG8gdGhlIGF2YWlsYWJsZSBxdWV1ZS4KJiM0MzsJICovCiYjNDM7CWludXNlX3BhZ2VzID0gYXRvbWljX2xvbmdfc3ViX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsICZhbXA7c2ktJmd0O2ludXNlX3BhZ2VzKTsKJiM0MzsJaWYgKHVubGlrZWx5KGludXNlX3BhZ2VzICZhbXA7IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKQomIzQzOwkJYWRkX3RvX2F2YWlsX2xpc3Qoc2kpOwogfQogCiBzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCkBAIC0xMzQ1LDExMyAmIzQzOzE2NzMsNDkgQEAgc3RhdGljIGJvb2wgZ2V0X3N3YXBfZGV2aWNlX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCS8qCiAJICogR3VhcmFudGVlIHRoZSBzaS0mZ3Q7dXNlcnMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyBvdGhlcgogCSAqIGZpZWxkcyBvZiBzd2FwX2luZm9fc3RydWN0LCBhbmQgc2ktJmd0O2ZsYWdzIChTV1BfV1JJVEVPSykgaXMKLQkgKiB1cCB0byBkYXRlZC4KJiM0MzsJICogdXAgdG8gZGF0ZS4KIAkgKgotCSAqIFBhaXJlZCB3aXRoIHRoZSBzcGluX3VubG9jaygpIGFmdGVyIHNldHVwX3N3YXBfaW5mbygpIGluCi0JICogZW5hYmxlX3N3YXBfaW5mbygpLCBhbmQgc21wX3dtYigpIGluIHN3YXBvZmYuCiYjNDM7CSAqIFBhaXJlZCB3aXRoIHBlcmNwdV91cF93cml0ZSgpIGluIHN3YXBfZGV2aWNlX2VuYWJsZSgpLCBhbmQKJiM0MzsJICogc21wX3dtYigpIGFmdGVyIGNsZWFyaW5nIFNXUF9XUklURU9LIGluIHN3YXBvZmYuCiAJICovCiAJc21wX3JtYigpOwogCXJldHVybiB0cnVlOwogfQogCi0vKgotICogRmFzdCBwYXRoIHRyeSB0byBnZXQgc3dhcCBlbnRyaWVzIHdpdGggc3BlY2lmaWVkIG9yZGVyIGZyb20gY3VycmVudAotICogQ1BVJiMzOTtzIHN3YXAgZW50cnkgcG9vbCAoYSBjbHVzdGVyKS4KLSAqLwotc3RhdGljIGJvb2wgc3dhcF9hbGxvY19mYXN0KHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7c3RhdGljIGludCBzd2FwX2FsbG9jX2VudHJ5KHN0cnVjdCBmb2xpbyAqZm9saW8pCiB7Ci0JdW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwotCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7CiYjNDM7CWxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwotCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0KLQkvKgotCSAqIE9uY2UgYWxsb2NhdGVkLCBzd2FwX2luZm9fc3RydWN0IHdpbGwgbmV2ZXIgYmUgY29tcGxldGVseSBmcmVlZCwKLQkgKiBzbyBjaGVja2luZyBpdCYjMzk7cyBsaXZlbmVzcyBieSBnZXRfc3dhcF9kZXZpY2VfaW5mbyBpcyBlbm91Z2guCi0JICovCi0Jc2kgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIuc2lbb3JkZXJdKTsKLQlvZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0W29yZGVyXSk7Ci0JaWYgKCFzaSB8fCAhb2Zmc2V0IHx8ICFnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpCi0JCXJldHVybiBmYWxzZTsKLQotCWNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7Ci0JaWYgKGNsdXN0ZXJfaXNfdXNhYmxlKGNpLCBvcmRlcikpIHsKLQkJaWYgKGNsdXN0ZXJfaXNfZW1wdHkoY2kpKQotCQkJb2Zmc2V0ID0gY2x1c3Rlcl9vZmZzZXQoc2ksIGNpKTsKLQkJYWxsb2Nfc3dhcF9zY2FuX2NsdXN0ZXIoc2ksIGNpLCBmb2xpbywgb2Zmc2V0KTsKLQl9IGVsc2UgewotCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKLQl9CiYjNDM7CWludCBucl9pdGVyLCByZXQ7CiYjNDM7CiYjNDM7CXBlcmNwdV9kb3duX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlmb3IgKG5yX2l0ZXIgPSAwOzsgbnJfaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCXNpID0gc3dhcF9xdWV1ZV9nZXRfZGV2aWNlKG5yX3BhZ2VzLCBucl9pdGVyKTsKJiM0MzsJCWlmIChJU19FUlIoc2kpKSB7CiYjNDM7CQkJcmV0ID0gUFRSX0VSUihzaSk7CiYjNDM7CQkJaWYgKHJldCA9PSAtRUJVU1kpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwkJY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBmb2xpbyk7CiAKLQlwdXRfc3dhcF9kZXZpY2Uoc2kpOwotCXJldHVybiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7Ci19Ci0KLS8qIFJvdGF0ZSB0aGUgZGV2aWNlIGFuZCBzd2l0Y2ggdG8gYSBuZXcgY2x1c3RlciAqLwotc3RhdGljIHZvaWQgc3dhcF9hbGxvY19zbG93KHN0cnVjdCBmb2xpbyAqZm9saW8pCi17Ci0Jc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCAqbmV4dDsKLQotCXNwaW5fbG9jaygmYW1wO3N3YXBfYXZhaWxfbG9jayk7Ci1zdGFydF9vdmVyOgotCXBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2ksIG5leHQsICZhbXA7c3dhcF9hdmFpbF9oZWFkLCBhdmFpbF9saXN0KSB7Ci0JCS8qIFJvdGF0ZSB0aGUgZGV2aWNlIGFuZCBzd2l0Y2ggdG8gYSBuZXcgY2x1c3RlciAqLwotCQlwbGlzdF9yZXF1ZXVlKCZhbXA7c2ktJmd0O2F2YWlsX2xpc3QsICZhbXA7c3dhcF9hdmFpbF9oZWFkKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzd2FwX2F2YWlsX2xvY2spOwotCQlpZiAoZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKSB7Ci0JCQljbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIGZvbGlvKTsKLQkJCXB1dF9zd2FwX2RldmljZShzaSk7Ci0JCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKQotCQkJCXJldHVybjsKLQkJCWlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKLQkJCQlyZXR1cm47CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7CiYjNDM7CQkJcmV0ID0gMDsKJiM0MzsJCQlicmVhazsKIAkJfQogCi0JCXNwaW5fbG9jaygmYW1wO3N3YXBfYXZhaWxfbG9jayk7CiAJCS8qCi0JCSAqIGlmIHdlIGdvdCBoZXJlLCBpdCYjMzk7cyBsaWtlbHkgdGhhdCBzaSB3YXMgYWxtb3N0IGZ1bGwgYmVmb3JlLAotCQkgKiBtdWx0aXBsZSBjYWxsZXJzIHByb2JhYmx5IGFsbCB0cmllZCB0byBnZXQgYSBwYWdlIGZyb20gdGhlCi0JCSAqIHNhbWUgc2kgYW5kIGl0IGZpbGxlZCB1cCBiZWZvcmUgd2UgY291bGQgZ2V0IG9uZTsgb3IsIHRoZSBzaQotCQkgKiBmaWxsZWQgdXAgYmV0d2VlbiB1cyBkcm9wcGluZyBzd2FwX2F2YWlsX2xvY2suCi0JCSAqIFNpbmNlIHdlIGRyb3BwZWQgdGhlIHN3YXBfYXZhaWxfbG9jaywgdGhlIHN3YXBfYXZhaWxfbGlzdAotCQkgKiBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkOyBzbyBpZiBuZXh0IGlzIHN0aWxsIGluIHRoZQotCQkgKiBzd2FwX2F2YWlsX2hlYWQgbGlzdCB0aGVuIHRyeSBpdCwgb3RoZXJ3aXNlIHN0YXJ0IG92ZXIgaWYgd2UKLQkJICogaGF2ZSBub3QgZ290dGVuIGFueSBzbG90cy4KJiM0MzsJCSAqIEZvciBsYXJnZSBhbGxvY2F0aW9uLCByZXR1cm4gZXJyb3IgZGlyZWN0bHkgdG8gaW5mb3JtIHRoZQomIzQzOwkJICogY2FsbGVyIHRvIHNwbGl0IGl0IGluc3RlYWQgb2YgZmFsbGJhY2sgdG8gb3RoZXIgZGV2aWNlcy4KIAkJICovCi0JCWlmIChwbGlzdF9ub2RlX2VtcHR5KCZhbXA7bmV4dC0mZ3Q7YXZhaWxfbGlzdCkpCi0JCQlnb3RvIHN0YXJ0X292ZXI7Ci0JfQotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKLX0KLQotLyoKLSAqIERpc2NhcmQgcGVuZGluZyBjbHVzdGVycyBpbiBhIHN5bmNocm9uaXplZCB3YXkgd2hlbiB1bmRlciBoaWdoIHByZXNzdXJlLgotICogUmV0dXJuOiB0cnVlIGlmIGFueSBjbHVzdGVyIGlzIGRpc2NhcmRlZC4KLSAqLwotc3RhdGljIGJvb2wgc3dhcF9zeW5jX2Rpc2NhcmQodm9pZCkKLXsKLQlib29sIHJldCA9IGZhbHNlOwotCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgKm5leHQ7Ci0KLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwotc3RhcnRfb3ZlcjoKLQlwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNpLCBuZXh0LCAmYW1wO3N3YXBfYWN0aXZlX2hlYWQsIGxpc3QpIHsKLQkJc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwotCQlpZiAoZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKSB7Ci0JCQlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9QQUdFX0RJU0NBUkQpCi0JCQkJcmV0ID0gc3dhcF9kb19zY2hlZHVsZWRfZGlzY2FyZChzaSk7Ci0JCQlwdXRfc3dhcF9kZXZpY2Uoc2kpOwomIzQzOwkJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7CiYjNDM7CQkJcmV0ID0gLUUyQklHOwomIzQzOwkJCWJyZWFrOwogCQl9Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwotCQlpZiAocGxpc3Rfbm9kZV9lbXB0eSgmYW1wO25leHQtJmd0O2xpc3QpKQotCQkJZ290byBzdGFydF9vdmVyOwogCX0KLQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7CiAKLQlyZXR1cm4gZmFsc2U7CiYjNDM7CXBlcmNwdV91cF9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzd2FwX2V4dGVuZF90YWJsZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCkBAIC0xNzM1LDYgJiM0MzsxOTk5LDcgQEAgaW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbykKIHsKIAl1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJdW5zaWduZWQgaW50IHNpemUgPSAxICZsdDsmbHQ7IG9yZGVyOwomIzQzOwlpbnQgcmV0OwogCiAJVk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pLCBmb2xpbyk7CkBAIC0xNzU3LDIzICYjNDM7MjAyMiwxNCBAQCBpbnQgZm9saW9fYWxsb2Nfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCQl9CiAJfQogCi1hZ2FpbjoKLQlsb2NhbF9sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKLQlpZiAoIXN3YXBfYWxsb2NfZmFzdChmb2xpbykpCi0JCXN3YXBfYWxsb2Nfc2xvdyhmb2xpbyk7Ci0JbG9jYWxfdW5sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKLQotCWlmICghb3JkZXIgJmFtcDsmYW1wOyB1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkgewotCQlpZiAoc3dhcF9zeW5jX2Rpc2NhcmQoKSkKLQkJCWdvdG8gYWdhaW47Ci0JfQomIzQzOwlyZXQgPSBzd2FwX2FsbG9jX2VudHJ5KGZvbGlvKTsKIAogCS8qIE5lZWQgdG8gY2FsbCB0aGlzIGV2ZW4gaWYgYWxsb2NhdGlvbiBmYWlsZWQsIGZvciBNRU1DR19TV0FQX0ZBSUwuICovCiAJaWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwKGZvbGlvKSkpCiAJCXN3YXBfY2FjaGVfZGVsX2ZvbGlvKGZvbGlvKTsKIAogCWlmICh1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkKLQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CQlyZXR1cm4gcmV0ID8gcmV0IDogLUVOT01FTTsKIAogCXJldHVybiAwOwogfQpAQCAtMTk0OCw3ICYjNDM7MjIwNCw3IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAlpZiAoYmF0Y2hfaWQpCiAJCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcChiYXRjaF9pZCwgY2lfb2ZmIC0gYmF0Y2hfb2ZmKTsKIAotCXN3YXBfcmFuZ2VfZnJlZShzaSwgY2lfaGVhZCAmIzQzOyBjaV9zdGFydCwgbnJfcGFnZXMpOwomIzQzOwlzd2FwX2RldmljZV9pbnVzZV9zdWIoc2ksIGNpX2hlYWQgJiM0MzsgY2lfc3RhcnQsIG5yX3BhZ2VzKTsKIAlzd2FwX2NsdXN0ZXJfYXNzZXJ0X2VtcHR5KGNpLCBjaV9zdGFydCwgbnJfcGFnZXMsIGZhbHNlKTsKIAogCWlmICghY2ktJmd0O2NvdW50KQpAQCAtMjE1MCwzMSAmIzQzOzI0MDYsMTQgQEAgdm9pZCBzd2FwX3B1dF9lbnRyaWVzX2RpcmVjdChzd3BfZW50cnlfdCBlbnRyeSwgaW50IG5yKQogICovCiBzd3BfZW50cnlfdCBzd2FwX2FsbG9jX2hpYmVybmF0aW9uX3Nsb3QoaW50IHR5cGUpCiB7Ci0Jc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnBjcF9zaSwgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7Ci0JdW5zaWduZWQgbG9uZyBwY3Bfb2Zmc2V0LCBvZmZzZXQgPSBTV0FQX0VOVFJZX0lOVkFMSUQ7Ci0Jc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gU1dBUF9FTlRSWV9JTlZBTElEOwogCXN3cF9lbnRyeV90IGVudHJ5ID0gezB9OwogCiAJaWYgKCFzaSkKIAkJZ290byBmYWlsOwogCi0JLyoKLQkgKiBUcnkgdGhlIGxvY2FsIGNsdXN0ZXIgZmlyc3QgaWYgaXQgbWF0Y2hlcyB0aGUgZGV2aWNlLiBJZgotCSAqIG5vdCwgdHJ5IGdyYWIgYSBuZXcgY2x1c3RlciBhbmQgb3ZlcnJpZGUgbG9jYWwgY2x1c3Rlci4KLQkgKi8KLQlsb2NhbF9sb2NrKCZhbXA7cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTsKLQlwY3Bfc2kgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIuc2lbMF0pOwotCXBjcF9vZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0WzBdKTsKLQlpZiAocGNwX3NpID09IHNpICZhbXA7JmFtcDsgcGNwX29mZnNldCkgewotCQljaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBwY3Bfb2Zmc2V0KTsKLQkJaWYgKGNsdXN0ZXJfaXNfdXNhYmxlKGNpLCAwKSkKLQkJCW9mZnNldCA9IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHNpLCBjaSwgTlVMTCwgcGNwX29mZnNldCk7Ci0JCWVsc2UKLQkJCXN3YXBfY2x1c3Rlcl91bmxvY2soY2kpOwotCX0KLQlpZiAoIW9mZnNldCkKLQkJb2Zmc2V0ID0gY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBOVUxMKTsKLQlsb2NhbF91bmxvY2soJmFtcDtwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spOwomIzQzOwlvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpOwogCWlmIChvZmZzZXQpCiAJCWVudHJ5ID0gc3dwX2VudHJ5KHNpLSZndDt0eXBlLCBvZmZzZXQpOwogCkBAIC0yMjA1LDI2ICYjNDM7MjQ0NCwxOCBAQCB2b2lkIHN3YXBfZnJlZV9oaWJlcm5hdGlvbl9zbG90KHN3cF9lbnRyeV90IGVudHJ5KQogCiBzdGF0aWMgaW50IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpCiB7Ci0JaW50IHR5cGU7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwogCiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHsKLQkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTsKLQotCQlpZiAoIShzaXMtJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChkZXZpY2UgPT0gc2lzLSZndDtiZGV2LSZndDtiZF9kZXYpIHsKLQkJCXN0cnVjdCBzd2FwX2V4dGVudCAqc2UgPSBmaXJzdF9zZShzaXMpOwotCi0JCQlpZiAoc2UtJmd0O3N0YXJ0X2Jsb2NrID09IG9mZnNldCkKLQkJCQlyZXR1cm4gdHlwZTsKJiM0MzsJZm9yX2VhY2hfYXZhaWxfc3dhcChzaSkgewomIzQzOwkJaWYgKGRldmljZSA9PSBzaS0mZ3Q7YmRldi0mZ3Q7YmRfZGV2KSB7CiYjNDM7CQkJaWYgKGZpcnN0X3NlKHNpKS0mZ3Q7c3RhcnRfYmxvY2sgPT0gb2Zmc2V0KQomIzQzOwkJCQlyZXR1cm4gc2ktJmd0O3R5cGU7CiAJCX0KIAl9CiYjNDM7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTIyNDcsMjEgJiM0MzsyNDc4LDE4IEBAIHN0YXRpYyBpbnQgX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldCkKICAqLwogaW50IHBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpCiB7Ci0JaW50IHR5cGU7CiYjNDM7CWludCByZXQ7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQotCXR5cGUgPSBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldmljZSwgb2Zmc2V0KTsKLQlpZiAodHlwZSAmbHQ7IDApIHsKLQkJc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwotCQlyZXR1cm4gdHlwZTsKLQl9CiYjNDM7CXBlcmNwdV9kb3duX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJcmV0ID0gX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZpY2UsIG9mZnNldCk7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJZ290byBvdXQ7CiAKLQlzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpOwomIzQzOwlzaSA9IHN3YXBfdHlwZV90b19pbmZvKHJldCk7CiAJaWYgKFdBUk5fT05fT05DRSghc2kpKSB7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQkJcmV0dXJuIC1FTk9ERVY7CiYjNDM7CQlyZXQgPSAtRU5PREVWOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJLyoKQEAgLTIyNzAsMTQgJiM0MzsyNDk4LDE1IEBAIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KQogCSAqIHRoZSBzYW1lIHNlc3Npb24uCiAJICovCiAJaWYgKFdBUk5fT05fT05DRShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX0hJQkVSTkFUSU9OKSkgewotCQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JCXJldHVybiAtRUJVU1k7CiYjNDM7CQlyZXQgPSAtRUJVU1k7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAKIAlzaS0mZ3Q7ZmxhZ3MgfD0gU1dQX0hJQkVSTkFUSU9OOwogCi0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwotCXJldHVybiB0eXBlOwomIzQzO291dDoKJiM0MzsJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0yMjk0LDE0ICYjNDM7MjUyMywxMSBAQCB2b2lkIHVucGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShpbnQgdHlwZSkKIHsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7CiAKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfZG93bl93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiAJc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTsKLQlpZiAoIXNpKSB7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQlzaS0mZ3Q7ZmxhZ3MgJmFtcDs9IH5TV1BfSElCRVJOQVRJT047Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlpZiAoc2kpCiYjNDM7CQlzaS0mZ3Q7ZmxhZ3MgJmFtcDs9IH5TV1BfSElCRVJOQVRJT047CiYjNDM7CXBlcmNwdV91cF93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiB9CiAKIC8qKgpAQCAtMjMyNiwyOSAmIzQzOzI1NTIsMjYgQEAgaW50IGZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KQogewogCWludCB0eXBlOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJcGVyY3B1X2Rvd25fcmVhZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiAJdHlwZSA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpOwotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJcGVyY3B1X3VwX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwogCiAJcmV0dXJuIHR5cGU7CiB9CiAKIGludCBmaW5kX2ZpcnN0X3N3YXAoZGV2X3QgKmRldmljZSkKIHsKLQlpbnQgdHlwZTsKLQotCXNwaW5fbG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHsKLQkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTsKJiM0MzsJaW50IHJldCA9IC1FTk9ERVY7CiYjNDM7CXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTsKIAotCQlpZiAoIShzaXMtJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSkKLQkJCWNvbnRpbnVlOwotCQkqZGV2aWNlID0gc2lzLSZndDtiZGV2LSZndDtiZF9kZXY7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQkJcmV0dXJuIHR5cGU7CiYjNDM7CXBlcmNwdV9kb3duX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlmb3JfZWFjaF9hdmFpbF9zd2FwKHNpKSB7CiYjNDM7CQkqZGV2aWNlID0gc2ktJmd0O2JkZXYtJmd0O2JkX2RldjsKJiM0MzsJCXJldCA9IHNpLSZndDt0eXBlOwomIzQzOwkJYnJlYWs7CiAJfQotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQlyZXR1cm4gLUVOT0RFVjsKJiM0MzsJcGVyY3B1X3VwX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMjM3Niw3ICYjNDM7MjU5OSw3IEBAIHVuc2lnbmVkIGludCBjb3VudF9zd2FwX3BhZ2VzKGludCB0eXBlLCBpbnQgZnJlZSkKIHsKIAl1bnNpZ25lZCBpbnQgbiA9IDA7CiAKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfZG93bl9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlpZiAoKHVuc2lnbmVkIGludCl0eXBlICZsdDsgbnJfc3dhcGZpbGVzKSB7CiAJCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07CiAKQEAgLTIzODgsNyAmIzQzOzI2MTEsNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpCiAJCX0KIAkJc3Bpbl91bmxvY2soJmFtcDtzaXMtJmd0O2xvY2spOwogCX0KLQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CXBlcmNwdV91cF9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlyZXR1cm4gbjsKIH0KICNlbmRpZiAvKiBDT05GSUdfSElCRVJOQVRJT04gKi8KQEAgLTI3MDAsMTAgJiM0MzsyOTIzLDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9uZXh0X3RvX3VudXNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKIAl1bnNpZ25lZCBsb25nIHN3cF90YjsKIAogCS8qCi0JICogTm8gbmVlZCBmb3Igc3dhcF9sb2NrIGhlcmU6IHdlJiMzOTtyZSBqdXN0IGxvb2tpbmcKJiM0MzsJICogTm8gbmVlZCBmb3Igc3dhcG9uX3J3c2VtIGhlcmU6IHdlJiMzOTtyZSBqdXN0IGxvb2tpbmcKIAkgKiBmb3Igd2hldGhlciBhbiBlbnRyeSBpcyBpbiB1c2UsIG5vdCBtb2RpZnlpbmcgaXQ7IGZhbHNlCiAJICogaGl0cyBhcmUgb2theSwgYW5kIHN5c19zd2Fwb2ZmKCkgaGFzIGFscmVhZHkgcHJldmVudGVkIG5ldwotCSAqIGFsbG9jYXRpb25zIGZyb20gdGhpcyBhcmVhICh3aGlsZSBob2xkaW5nIHN3YXBfbG9jaykuCiYjNDM7CSAqIGFsbG9jYXRpb25zIGZyb20gdGhpcyBhcmVhICh3aGlsZSBob2xkaW5nIHN3YXBvbl9yd3NlbSkuCiAJICovCiAJZm9yIChpID0gcHJldiAmIzQzOyAxOyBpICZsdDsgc2ktJmd0O21heDsgaSYjNDM7JiM0MzspIHsKIAkJc3dwX3RiID0gc3dhcF90YWJsZV9nZXQoX19zd2FwX29mZnNldF90b19jbHVzdGVyKHNpLCBpKSwKQEAgLTI4MTYsNyAmIzQzOzMwMzksNyBAQCBzdGF0aWMgaW50IHRyeV90b191bnVzZSh1bnNpZ25lZCBpbnQgdHlwZSkKIHN1Y2Nlc3M6CiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhhdCBmdXJ0aGVyIGNsZWFudXBzIGFmdGVyIHRyeV90b191bnVzZSgpIHJldHVybnMgaGFwcGVuCi0JICogYWZ0ZXIgc3dhcF9yYW5nZV9mcmVlKCkgcmVkdWNlcyBzaS0mZ3Q7aW51c2VfcGFnZXMgdG8gMC4KJiM0MzsJICogYWZ0ZXIgc3dhcF9kZXZpY2VfaW51c2Vfc3ViKCkgcmVkdWNlcyBzaS0mZ3Q7aW51c2VfcGFnZXMgdG8gMC4KIAkgKi8KIAlzbXBfbWIoKTsKIAlyZXR1cm4gMDsKQEAgLTI4MjQsMTggJiM0MzszMDQ3LDIwIEBAIHN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKQogCiAvKgogICogQWZ0ZXIgYSBzdWNjZXNzZnVsIHRyeV90b191bnVzZSwgaWYgbm8gc3dhcCBpcyBub3cgaW4gdXNlLCB3ZSBrbm93Ci0gKiB3ZSBjYW4gZW1wdHkgdGhlIG1tbGlzdC4gIHN3YXBfbG9jayBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuCi0gKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBfbG9jaywgYW5kIGFuIG1tIG11c3QgYmUKJiM0MzsgKiB3ZSBjYW4gZW1wdHkgdGhlIG1tbGlzdC4gc3dhcG9uX3J3c2VtIG11c3QgYmUgaGVsZCBvbiBlbnRyeSBhbmQgZXhpdC4KJiM0MzsgKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBvbl9yd3NlbSwgYW5kIGFuIG1tIG11c3QgYmUKICAqIGFkZGVkIHRvIHRoZSBtbWxpc3QganVzdCBhZnRlciBwYWdlX2R1cGxpY2F0ZSAtIGJlZm9yZSB3b3VsZCBiZSByYWN5LgogICovCiBzdGF0aWMgdm9pZCBkcmFpbl9tbWxpc3Qodm9pZCkKIHsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwogCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuZXh0OwotCXVuc2lnbmVkIGludCB0eXBlOwogCi0JZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspCi0JCWlmIChzd2FwX3VzYWdlX2luX3BhZ2VzKHN3YXBfaW5mb1t0eXBlXSkpCiYjNDM7CWZvcl9lYWNoX3N3YXAoc2kpIHsKJiM0MzsJCWlmIChzd2FwX3VzYWdlX2luX3BhZ2VzKHNpKSkKIAkJCXJldHVybjsKJiM0MzsJfQomIzQzOwogCXNwaW5fbG9jaygmYW1wO21tbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbmV4dCwgJmFtcDtpbml0X21tLm1tbGlzdCkKIAkJbGlzdF9kZWxfaW5pdChwKTsKQEAgLTI5NjgsNTggJiM0MzszMTkzLDY1IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsCiAJcmV0dXJuIGdlbmVyaWNfc3dhcGZpbGVfYWN0aXZhdGUoc2lzLCBzd2FwX2ZpbGUsIHNwYW4pOwogfQogCi1zdGF0aWMgdm9pZCBfZW5hYmxlX3N3YXBfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCi17Ci0JYXRvbWljX2xvbmdfYWRkKHNpLSZndDtwYWdlcywgJmFtcDtucl9zd2FwX3BhZ2VzKTsKLQl0b3RhbF9zd2FwX3BhZ2VzICYjNDM7PSBzaS0mZ3Q7cGFnZXM7Ci0KLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmFtcDtzd2FwX2xvY2spOwotCi0JcGxpc3RfYWRkKCZhbXA7c2ktJmd0O2xpc3QsICZhbXA7c3dhcF9hY3RpdmVfaGVhZCk7Ci0KLQkvKiBBZGQgYmFjayB0byBhdmFpbGFibGUgbGlzdCAqLwotCWFkZF90b19hdmFpbF9saXN0KHNpLCB0cnVlKTsKLX0KLQogLyoKLSAqIENhbGxlZCBhZnRlciB0aGUgc3dhcCBkZXZpY2UgaXMgcmVhZHksIHJlc3VycmVjdCBpdHMgcGVyY3B1IHJlZiwgaXQmIzM5O3Mgbm93Ci0gKiBzYWZlIHRvIHJlZmVyZW5jZSBpdC4gQWRkIGl0IHRvIHRoZSBsaXN0IHRvIGV4cG9zZSBpdCB0byB0aGUgYWxsb2NhdG9yLgomIzQzOyAqIENhbGxlZCBhZnRlciB0aGUgc3dhcCBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgdXNlZC4gTWFya2luZyBpdCB3cml0YWJsZSBhbmQKJiM0MzsgKiBleHBvc2luZyBpdCB0byB0aGUgYWxsb2NhdG9yLiBSZXN1cnJlY3QgaXRzIHBlcmNwdSByZWYgaWYgaXQgd2FzIGRlYWQgYmVmb3JlLgogICovCi1zdGF0aWMgdm9pZCBlbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKJiM0MztzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9lbmFibGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogewotCXBlcmNwdV9yZWZfcmVzdXJyZWN0KCZhbXA7c2ktJmd0O3VzZXJzKTsKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwotCXNwaW5fbG9jaygmYW1wO3NpLSZndDtsb2NrKTsKLQlfZW5hYmxlX3N3YXBfaW5mbyhzaSk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzaS0mZ3Q7bG9jayk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwotfQomIzQzOwlwZXJjcHVfZG93bl93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwlzaS0mZ3Q7ZmxhZ3MgfD0gU1dQX1dSSVRFT0s7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CWF0b21pY19sb25nX2FkZChzaS0mZ3Q7cGFnZXMsICZhbXA7bnJfc3dhcF9wYWdlcyk7CiYjNDM7CXRvdGFsX3N3YXBfcGFnZXMgJiM0Mzs9IHNpLSZndDtwYWdlczsKJiM0MzsJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAotc3RhdGljIHZvaWQgcmVpbnNlcnRfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKLXsKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwotCXNwaW5fbG9jaygmYW1wO3NpLSZndDtsb2NrKTsKLQlfZW5hYmxlX3N3YXBfaW5mbyhzaSk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzaS0mZ3Q7bG9jayk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlhZGRfdG9fYXZhaWxfbGlzdChzaSk7CiB9CiAKLS8qCi0gKiBDYWxsZWQgYWZ0ZXIgY2xlYXJpbmcgU1dQX1dSSVRFT0ssIGVuc3VyZXMgY2x1c3Rlcl9hbGxvY19yYW5nZQotICogc2VlIHRoZSB1cGRhdGVkIGZsYWdzLCBzbyB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgYWxsb2NhdGlvbnMuCi0gKi8KLXN0YXRpYyB2b2lkIHdhaXRfZm9yX2FsbG9jYXRpb24oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQomIzQzO3N0YXRpYyBpbnQgc3dhcF9kZXZpY2VfZGlzYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBlbmQgPSBBTElHTihzaS0mZ3Q7bWF4LCBTV0FQRklMRV9DTFVTVEVSKTsKIAlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpOwogCi0JQlVHX09OKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfV1JJVEVPSyk7CiYjNDM7CS8qCiYjNDM7CSAqIElmIFNXUF9XUklURU9LIGlzIG5vdCBzZXQ6IGFub3RoZXIgcHJvY2VzcyBhbHJlYWR5IGRpc2FibGluZyBpdC4KJiM0MzsJICogSWYgU1dQX0hJQkVSTkFUSU9OIGlzIHNldDogdGhlIGRldmljZSBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uLgomIzQzOwkgKi8KJiM0MzsJcGVyY3B1X2Rvd25fd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1dSSVRFT0spIHx8CiYjNDM7CSAgICBzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX0hJQkVSTkFUSU9OKSB7CiYjNDM7CQlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwkJcmV0dXJuIC1FQlVTWTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VjdXJpdHlfdm1fZW5vdWdoX21lbW9yeV9tbShjdXJyZW50LSZndDttbSwgc2ktJmd0O3BhZ2VzKSkgewomIzQzOwkJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwl9CiYjNDM7CXZtX3VuYWNjdF9tZW1vcnkoc2ktJmd0O3BhZ2VzKTsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7CiYjNDM7CXNpLSZndDtmbGFncyAmYW1wOz0gflNXUF9XUklURU9LOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3N3YXBfcXVldWVfdXBkYXRlX2xvY2spOwomIzQzOwl0b3RhbF9zd2FwX3BhZ2VzIC09IHNpLSZndDtwYWdlczsKJiM0MzsJYXRvbWljX2xvbmdfc3ViKHNpLSZndDtwYWdlcywgJmFtcDtucl9zd2FwX3BhZ2VzKTsKJiM0MzsJZGVsX2Zyb21fYXZhaWxfbGlzdChzaSwgdHJ1ZSk7CiYjNDM7CXBlcmNwdV91cF93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiAKJiM0MzsJLyoKJiM0MzsJICogU3dhcCBhbGxvY2F0b3IgZG9lc24mIzM5O3QgdG91Y2ggc2kgbG9jaywgc28gbG9vcGluZyB0aHJvdWdoIGFsbAomIzQzOwkgKiBjaSBsb2NrcyBlbnN1cmVzIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMgc2VlcyB0aGUKJiM0MzsJICogdXBkYXRlZCBmbGFncywgYW5kIG5vIG1vcmUgYWxsb2NhdGlvbnMgd2lsbCBvY2N1ci4KJiM0MzsJICovCiAJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgJmx0OyBlbmQ7IG9mZnNldCAmIzQzOz0gU1dBUEZJTEVfQ0xVU1RFUikgewogCQljaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpOwogCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKIAl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLApAQCAtMzA0MywyOCAmIzQzOzMyNzUsNiBAQCBzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLAogCWt2ZnJlZShjbHVzdGVyX2luZm8pOwogfQogCi0vKgotICogQ2FsbGVkIGFmdGVyIHN3YXAgZGV2aWNlJiMzOTtzIHJlZmVyZW5jZSBjb3VudCBpcyBkZWFkLCBzbwotICogbmVpdGhlciBzY2FuIG5vciBhbGxvY2F0aW9uIHdpbGwgdXNlIGl0LgotICovCi1zdGF0aWMgdm9pZCBmbHVzaF9wZXJjcHVfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKLXsKLQlpbnQgY3B1LCBpOwotCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICoqcGNwX3NpOwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlwY3Bfc2kgPSBwZXJfY3B1X3B0cihwZXJjcHVfc3dhcF9jbHVzdGVyLnNpLCBjcHUpOwotCQkvKgotCQkgKiBJbnZhbGlkYXRlIHRoZSBwZXJjcHUgc3dhcCBjbHVzdGVyIGNhY2hlLCBzaS0mZ3Q7dXNlcnMKLQkJICogaXMgZGVhZCwgc28gbm8gbmV3IHVzZXIgd2lsbCBwb2ludCB0byBpdCwganVzdCBmbHVzaAotCQkgKiBhbnkgZXhpc3RpbmcgdXNlci4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgJmx0OyBTV0FQX05SX09SREVSUzsgaSYjNDM7JiM0MzspCi0JCQljbXB4Y2hnKCZhbXA7cGNwX3NpW2ldLCBzaSwgTlVMTCk7Ci0JfQotfQotCi0KIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSkKIHsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcCA9IE5VTEw7CkBAIC0zMDg2LDQ0ICYjNDM7MzI5NiwyMiBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpCiAJCXJldHVybiBQVFJfRVJSKHZpY3RpbSk7CiAKIAltYXBwaW5nID0gdmljdGltLSZndDtmX21hcHBpbmc7Ci0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQlwbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYW1wO3N3YXBfYWN0aXZlX2hlYWQsIGxpc3QpIHsKLQkJaWYgKHAtJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSB7Ci0JCQlpZiAocC0mZ3Q7c3dhcF9maWxlLSZndDtmX21hcHBpbmcgPT0gbWFwcGluZykgewotCQkJCWZvdW5kID0gMTsKLQkJCQlicmVhazsKLQkJCX0KJiM0MzsJcGVyY3B1X2Rvd25fcmVhZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CWZvcl9lYWNoX2F2YWlsX3N3YXAocCkgewomIzQzOwkJaWYgKHAtJmd0O3N3YXBfZmlsZS0mZ3Q7Zl9tYXBwaW5nID09IG1hcHBpbmcpIHsKJiM0MzsJCQlmb3VuZCA9IDE7CiYjNDM7CQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKCFmb3VuZCkgewotCQllcnIgPSAtRUlOVkFMOwotCQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JCWdvdG8gb3V0X2RwdXQ7Ci0JfQotCi0JLyogUmVmdXNlIHN3YXBvZmYgd2hpbGUgdGhlIGRldmljZSBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uICovCi0JaWYgKHAtJmd0O2ZsYWdzICZhbXA7IFNXUF9ISUJFUk5BVElPTikgewotCQllcnIgPSAtRUJVU1k7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKLQkJZ290byBvdXRfZHB1dDsKLQl9CiYjNDM7CXBlcmNwdV91cF9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJZmlscF9jbG9zZSh2aWN0aW0sIE5VTEwpOwogCi0JaWYgKCFzZWN1cml0eV92bV9lbm91Z2hfbWVtb3J5X21tKGN1cnJlbnQtJmd0O21tLCBwLSZndDtwYWdlcykpCi0JCXZtX3VuYWNjdF9tZW1vcnkocC0mZ3Q7cGFnZXMpOwotCWVsc2UgewotCQllcnIgPSAtRU5PTUVNOwotCQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JCWdvdG8gb3V0X2RwdXQ7Ci0JfQotCXNwaW5fbG9jaygmYW1wO3AtJmd0O2xvY2spOwotCWRlbF9mcm9tX2F2YWlsX2xpc3QocCwgdHJ1ZSk7Ci0JcGxpc3RfZGVsKCZhbXA7cC0mZ3Q7bGlzdCwgJmFtcDtzd2FwX2FjdGl2ZV9oZWFkKTsKLQlhdG9taWNfbG9uZ19zdWIocC0mZ3Q7cGFnZXMsICZhbXA7bnJfc3dhcF9wYWdlcyk7Ci0JdG90YWxfc3dhcF9wYWdlcyAtPSBwLSZndDtwYWdlczsKLQlzcGluX3VubG9jaygmYW1wO3AtJmd0O2xvY2spOwotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJaWYgKCFmb3VuZCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwogCi0Jd2FpdF9mb3JfYWxsb2NhdGlvbihwKTsKJiM0MzsJZXJyID0gc3dhcF9kZXZpY2VfZGlzYWJsZShwKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiAKIAlzZXRfY3VycmVudF9vb21fb3JpZ2luKCk7CiAJZXJyID0gdHJ5X3RvX3VudXNlKHAtJmd0O3R5cGUpOwpAQCAtMzEzMSwxMCAmIzQzOzMzMTksMTMgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKQogCiAJaWYgKGVycikgewogCQkvKiByZS1pbnNlcnQgc3dhcCBzcGFjZSBiYWNrIGludG8gc3dhcF9saXN0ICovCi0JCXJlaW5zZXJ0X3N3YXBfaW5mbyhwKTsKLQkJZ290byBvdXRfZHB1dDsKJiM0MzsJCXN3YXBfZGV2aWNlX2VuYWJsZShwKTsKJiM0MzsJCXJldHVybiBlcnI7CiAJfQogCiYjNDM7CXBlcmNwdV9kb3duX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJc3dhcF9xdWV1ZV9kZWwocCk7CiYjNDM7CiAJLyoKIAkgKiBXYWl0IGZvciBzd2FwIG9wZXJhdGlvbnMgcHJvdGVjdGVkIGJ5IGdldC9wdXRfc3dhcF9kZXZpY2UoKQogCSAqIHRvIGNvbXBsZXRlLiAgQmVjYXVzZSBvZiBzeW5jaHJvbml6ZV9yY3UoKSBoZXJlLCBhbGwgc3dhcApAQCAtMzE0OSwxNSAmIzQzOzMzNDAsMTIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKQogCiAJZmx1c2hfd29yaygmYW1wO3AtJmd0O2Rpc2NhcmRfd29yayk7CiAJZmx1c2hfd29yaygmYW1wO3AtJmd0O3JlY2xhaW1fd29yayk7Ci0JZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihwKTsKIAogCWRlc3Ryb3lfc3dhcF9leHRlbnRzKHAsIHAtJmd0O3N3YXBfZmlsZSk7CiAKIAlpZiAoIShwLSZndDtmbGFncyAmYW1wOyBTV1BfU09MSURTVEFURSkpCiAJCWF0b21pY19kZWMoJmFtcDtucl9yb3RhdGVfc3dhcCk7CiAKLQltdXRleF9sb2NrKCZhbXA7c3dhcG9uX211dGV4KTsKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwogCXNwaW5fbG9jaygmYW1wO3AtJmd0O2xvY2spOwogCWRyYWluX21tbGlzdCgpOwogCkBAIC0zMTY4LDEwICYjNDM7MzM1NiwxMSBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpCiAJcC0mZ3Q7bWF4ID0gMDsKIAlwLSZndDtjbHVzdGVyX2luZm8gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZhbXA7cC0mZ3Q7bG9jayk7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwogCWFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC0mZ3Q7dHlwZSk7CiAJenN3YXBfc3dhcG9mZihwLSZndDt0eXBlKTsKLQltdXRleF91bmxvY2soJmFtcDtzd2Fwb25fbXV0ZXgpOwomIzQzOwlmcmVlX3BlcmNwdShwLSZndDtwZXJjcHVfY2x1c3Rlcik7CiYjNDM7CXAtJmd0O3BlcmNwdV9jbHVzdGVyID0gTlVMTDsKIAlrZnJlZShwLSZndDtnbG9iYWxfY2x1c3Rlcik7CiAJcC0mZ3Q7Z2xvYmFsX2NsdXN0ZXIgPSBOVUxMOwogCWZyZWVfc3dhcF9jbHVzdGVyX2luZm8oY2x1c3Rlcl9pbmZvLCBtYXhwYWdlcyk7CkBAIC0zMTg3LDE4ICYjNDM7MzM3NiwxOSBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpCiAJICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28gdGhhdCBzd2Fwb24KIAkgKiBjYW4gcmV1c2UgdGhpcyBzd2FwX2luZm8gaW4gYWxsb2Nfc3dhcF9pbmZvKCkgc2FmZWx5LiAgSXQgaXMgb2sgdG8KIAkgKiBub3QgaG9sZCBwLSZndDtsb2NrIGFmdGVyIHdlIGNsZWFyZWQgaXRzIFNXUF9XUklURU9LLgomIzQzOwkgKgomIzQzOwkgKiBUaGUgd3JpdGUgbG9jayBlbnN1cmVzIHRoZSBmbGFnIGNsZWFyIGlzIHZpc2libGUgdG8gbG9ja2xlc3MKJiM0MzsJICogcmVhZGVycyBvZiBzd2FwX3R5cGVfdG9faW5mbygpIGJlZm9yZSBhbGxvY19zd2FwX2luZm8oKSByZXVzZXMKJiM0MzsJICogdGhpcyBzbG90LgogCSAqLwotCXNwaW5fbG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CXBlcmNwdV9kb3duX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlwLSZndDtmbGFncyA9IDA7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwogCi0JZXJyID0gMDsKIAlhdG9taWNfaW5jKCZhbXA7cHJvY19wb2xsX2V2ZW50KTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFtcDtwcm9jX3BvbGxfd2FpdCk7CiAKLW91dF9kcHV0OgotCWZpbHBfY2xvc2UodmljdGltLCBOVUxMKTsKLQlyZXR1cm4gZXJyOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCkBAIC0zMjE2LDIwICYjNDM7MzQwNiwxOCBAQCBzdGF0aWMgX19wb2xsX3Qgc3dhcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIAlyZXR1cm4gRVBPTExJTiB8IEVQT0xMUkROT1JNOwogfQogCi0vKiBpdGVyYXRvciAqLwogc3RhdGljIHZvaWQgKnN3YXBfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzd2FwLCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7Ci0JaW50IHR5cGU7CiAJbG9mZl90IGwgPSAqcG9zOwogCi0JbXV0ZXhfbG9jaygmYW1wO3N3YXBvbl9tdXRleCk7CiYjNDM7CXBlcmNwdV9kb3duX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwogCiAJaWYgKCFsKQogCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwogCi0JZm9yICh0eXBlID0gMDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlJiM0MzsmIzQzOykgewotCQlpZiAoIShzaS0mZ3Q7c3dhcF9maWxlKSkKJiM0MzsJZm9yX2VhY2hfc3dhcChzaSkgewomIzQzOwkJaWYgKCFzaS0mZ3Q7c3dhcF9maWxlKQogCQkJY29udGludWU7CiAJCWlmICghLS1sKQogCQkJcmV0dXJuIHNpOwpAQCAtMzI1MCw3ICYjNDM7MzQzOCw3IEBAIHN0YXRpYyB2b2lkICpzd2FwX25leHQoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIAogCSYjNDM7JiM0MzsoKnBvcyk7CiAJZm9yICg7IChzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpKTsgdHlwZSYjNDM7JiM0MzspIHsKLQkJaWYgKCEoc2ktJmd0O3N3YXBfZmlsZSkpCiYjNDM7CQlpZiAoIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1VTRUQpIHx8ICEoc2ktJmd0O3N3YXBfZmlsZSkpCiAJCQljb250aW51ZTsKIAkJcmV0dXJuIHNpOwogCX0KQEAgLTMyNjAsNyAmIzQzOzM0NDgsNyBAQCBzdGF0aWMgdm9pZCAqc3dhcF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiAKIHN0YXRpYyB2b2lkIHN3YXBfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpCiB7Ci0JbXV0ZXhfdW5sb2NrKCZhbXA7c3dhcG9uX211dGV4KTsKJiM0MzsJcGVyY3B1X3VwX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwogfQogCiBzdGF0aWMgaW50IHN3YXBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpCkBAIC0zMzUzLDEzICYjNDM7MzU0MSwxMyBAQCBzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKmFsbG9jX3N3YXBfaW5mbyh2b2lkKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQlzcGluX2xvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfZG93bl93cml0ZSgmYW1wO3N3YXBvbl9yd3NlbSk7CiAJZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHsKIAkJaWYgKCEoc3dhcF9pbmZvW3R5cGVdLSZndDtmbGFncyAmYW1wOyBTV1BfVVNFRCkpCiAJCQlicmVhazsKIAl9CiAJaWYgKHR5cGUgJmd0Oz0gTUFYX1NXQVBGSUxFUykgewotCQlzcGluX3VubG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CQlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwogCQlwZXJjcHVfcmVmX2V4aXQoJmFtcDtwLSZndDt1c2Vycyk7CiAJCWt2ZnJlZShwKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKQEAgLTMzODEsMTAgJiM0MzszNTY5LDggQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICphbGxvY19zd2FwX2luZm8odm9pZCkKIAkJICovCiAJfQogCXAtJmd0O3N3YXBfZXh0ZW50X3Jvb3QgPSBSQl9ST09UOwotCXBsaXN0X25vZGVfaW5pdCgmYW1wO3AtJmd0O2xpc3QsIDApOwotCXBsaXN0X25vZGVfaW5pdCgmYW1wO3AtJmd0O2F2YWlsX2xpc3QsIDApOwogCXAtJmd0O2ZsYWdzID0gU1dQX1VTRUQ7Ci0Jc3Bpbl91bmxvY2soJmFtcDtzd2FwX2xvY2spOwomIzQzOwlwZXJjcHVfdXBfd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwogCWlmIChkZWZlcikgewogCQlwZXJjcHVfcmVmX2V4aXQoJmFtcDtkZWZlci0mZ3Q7dXNlcnMpOwogCQlrdmZyZWUoZGVmZXIpOwpAQCAtMzQ1Myw5ICYjNDM7MzYzOSw4IEBAIF9fd2VhayB1bnNpZ25lZCBsb25nIGFyY2hfbWF4X3N3YXBmaWxlX3NpemUodm9pZCkKIAlyZXR1cm4gZ2VuZXJpY19tYXhfc3dhcGZpbGVfc2l6ZSgpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKLQkJCQkJdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLAotCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKQomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfc3dhcF9oZWFkZXIodW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLAomIzQzOwkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgbWF4cGFnZXM7CkBAIC0zNTIyLDcgJiM0MzszNzA3LDcgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogewogCXVuc2lnbmVkIGxvbmcgbnJfY2x1c3RlcnMgPSBESVZfUk9VTkRfVVAobWF4cGFnZXMsIFNXQVBGSUxFX0NMVVNURVIpOwogCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvOwotCWludCBlcnIgPSAtRU5PTUVNOwomIzQzOwlpbnQgY3B1LCBlcnIgPSAtRU5PTUVNOwogCXVuc2lnbmVkIGxvbmcgaTsKIAogCWNsdXN0ZXJfaW5mbyA9IGt2emFsbG9jX29ianMoKmNsdXN0ZXJfaW5mbywgbnJfY2x1c3RlcnMpOwpAQCAtMzUzMiwxMyAmIzQzOzM3MTcsMjYgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCWZvciAoaSA9IDA7IGkgJmx0OyBucl9jbHVzdGVyczsgaSYjNDM7JiM0MzspCiAJCXNwaW5fbG9ja19pbml0KCZhbXA7Y2x1c3Rlcl9pbmZvW2ldLmxvY2spOwogCi0JaWYgKCEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSkgewomIzQzOwlpZiAoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9TT0xJRFNUQVRFKSB7CiYjNDM7CQlzaS0mZ3Q7cGVyY3B1X2NsdXN0ZXIgPSBhbGxvY19wZXJjcHUoc3RydWN0IHBlcmNwdV9jbHVzdGVyKTsKJiM0MzsJCWlmICghc2ktJmd0O3BlcmNwdV9jbHVzdGVyKQomIzQzOwkJCWdvdG8gZXJyOwomIzQzOwomIzQzOwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewomIzQzOwkJCXN0cnVjdCBwZXJjcHVfY2x1c3RlciAqY2x1c3RlcjsKJiM0MzsKJiM0MzsJCQljbHVzdGVyID0gcGVyX2NwdV9wdHIoc2ktJmd0O3BlcmNwdV9jbHVzdGVyLCBjcHUpOwomIzQzOwkJCWZvciAoaSA9IDA7IGkgJmx0OyBTV0FQX05SX09SREVSUzsgaSYjNDM7JiM0MzspCiYjNDM7CQkJCWNsdXN0ZXItJmd0O25leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7CiYjNDM7CQkJbG9jYWxfbG9ja19pbml0KCZhbXA7Y2x1c3Rlci0mZ3Q7bG9jayk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiAJCXNpLSZndDtnbG9iYWxfY2x1c3RlciA9IGttYWxsb2Nfb2JqKCpzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXIpOwogCQlpZiAoIXNpLSZndDtnbG9iYWxfY2x1c3RlcikKIAkJCWdvdG8gZXJyOwogCQlmb3IgKGkgPSAwOyBpICZsdDsgU1dBUF9OUl9PUkRFUlM7IGkmIzQzOyYjNDM7KQogCQkJc2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtuZXh0W2ldID0gU1dBUF9FTlRSWV9JTlZBTElEOwotCQlzcGluX2xvY2tfaW5pdCgmYW1wO3NpLSZndDtnbG9iYWxfY2x1c3Rlcl9sb2NrKTsKJiM0MzsJCXNwaW5fbG9ja19pbml0KCZhbXA7c2ktJmd0O2dsb2JhbF9jbHVzdGVyLSZndDtsb2NrKTsKIAl9CiAKIAkvKgpAQCAtMzYyMSw3ICYjNDM7MzgxOSw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJLyoKIAkgKiBBbGxvY2F0ZSBvciByZXVzZSBleGlzdGluZyAhU1dQX1VTRUQgc3dhcF9pbmZvLiBUaGUgcmV0dXJuZWQKIAkgKiBzaSB3aWxsIHN0YXkgaW4gYSBkeWluZyBzdGF0dXMsIHNvIG5vdGhpbmcgd2lsbCBhY2Nlc3MgaXRzIGNvbnRlbnQKLQkgKiB1bnRpbCBlbmFibGVfc3dhcF9pbmZvIHJlc3VycmVjdHMgaXRzIHBlcmNwdSByZWYgYW5kIGV4cG9zZSBpdC4KJiM0MzsJICogdW50aWwgc3dhcF9kZXZpY2VfZW5hYmxlIHJlc3VycmVjdHMgaXRzIHBlcmNwdSByZWYgYW5kIGV4cG9zZSBpdC4KIAkgKi8KIAlzaSA9IGFsbG9jX3N3YXBfaW5mbygpOwogCWlmIChJU19FUlIoc2kpKQpAQCAtMzY3OSw3ICYjNDM7Mzg3Nyw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJfQogCXN3YXBfaGVhZGVyID0ga21hcF9sb2NhbF9mb2xpbyhmb2xpbywgMCk7CiAKLQltYXhwYWdlcyA9IHJlYWRfc3dhcF9oZWFkZXIoc2ksIHN3YXBfaGVhZGVyLCBpbm9kZSk7CiYjNDM7CW1heHBhZ2VzID0gcmVhZF9zd2FwX2hlYWRlcihzd2FwX2hlYWRlciwgaW5vZGUpOwogCWlmICh1bmxpa2VseSghbWF4cGFnZXMpKSB7CiAJCWVycm9yID0gLUVJTlZBTDsKIAkJZ290byBiYWRfc3dhcF91bmxvY2tfaW5vZGU7CkBAIC0zNzAwLDExICYjNDM7Mzg5OCw2IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAKIAltYXhwYWdlcyA9IHNpLSZndDttYXg7CiAKLQkvKiBTZXQgdXAgdGhlIHN3YXAgY2x1c3RlciBpbmZvICovCi0JZXJyb3IgPSBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc2ksIHN3YXBfaGVhZGVyLCBtYXhwYWdlcyk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTsKLQogCWlmIChzaS0mZ3Q7YmRldiAmYW1wOyZhbXA7IGJkZXZfc3RhYmxlX3dyaXRlcyhzaS0mZ3Q7YmRldikpCiAJCXNpLSZndDtmbGFncyB8PSBTV1BfU1RBQkxFX1dSSVRFUzsKIApAQCAtMzcxOCw2ICYjNDM7MzkxMSwxNSBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKQogCQlpbmNlZF9ucl9yb3RhdGVfc3dhcCA9IHRydWU7CiAJfQogCiYjNDM7CS8qCiYjNDM7CSAqIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8uIFRoaXMgbXVzdCBydW4gYWZ0ZXIgU1dQX1NPTElEU1RBVEUKJiM0MzsJICogaXMgZGV0ZXJtaW5lZCBhYm92ZSwgYXMgaXQgZGVjaWRlcyB3aGV0aGVyIHRvIGFsbG9jYXRlIHRoZSBwZXItQ1BVCiYjNDM7CSAqIGNsdXN0ZXIgKHNvbGlkIHN0YXRlKSBvciB0aGUgZ2xvYmFsIGNsdXN0ZXIgKHJvdGF0aW9uYWwpLgomIzQzOwkgKi8KJiM0MzsJZXJyb3IgPSBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc2ksIHN3YXBfaGVhZGVyLCBtYXhwYWdlcyk7CiYjNDM7CWlmIChlcnJvcikKJiM0MzsJCWdvdG8gYmFkX3N3YXBfdW5sb2NrX2lub2RlOwomIzQzOwogCWlmICgoc3dhcF9mbGFncyAmYW1wOyBTV0FQX0ZMQUdfRElTQ0FSRCkgJmFtcDsmYW1wOwogCSAgICBzaS0mZ3Q7YmRldiAmYW1wOyZhbXA7IGJkZXZfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzaS0mZ3Q7YmRldikpIHsKIAkJLyoKQEAgLTM3NjQsMjIgJiM0MzszOTY2LDIyIEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJCWdvdG8gZnJlZV9zd2FwX3pzd2FwOwogCX0KIAotCW11dGV4X2xvY2soJmFtcDtzd2Fwb25fbXV0ZXgpOwogCXByaW8gPSBERUZfU1dBUF9QUklPOwogCWlmIChzd2FwX2ZsYWdzICZhbXA7IFNXQVBfRkxBR19QUkVGRVIpCiAJCXByaW8gPSBzd2FwX2ZsYWdzICZhbXA7IFNXQVBfRkxBR19QUklPX01BU0s7CiAKLQkvKgotCSAqIFRoZSBwbGlzdCBwcmlvIGlzIG5lZ2F0ZWQgYmVjYXVzZSBwbGlzdCBvcmRlcmluZyBpcwotCSAqIGxvdy10by1oaWdoLCB3aGlsZSBzd2FwIG9yZGVyaW5nIGlzIGhpZ2gtdG8tbG93Ci0JICovCiAJc2ktJmd0O3ByaW8gPSBwcmlvOwotCXNpLSZndDtsaXN0LnByaW8gPSAtc2ktJmd0O3ByaW87Ci0Jc2ktJmd0O2F2YWlsX2xpc3QucHJpbyA9IC1zaS0mZ3Q7cHJpbzsKIAlzaS0mZ3Q7c3dhcF9maWxlID0gc3dhcF9maWxlOwogCiAJLyogU2V0cyBTV1BfV1JJVEVPSywgcmVzdXJyZWN0IHRoZSBwZXJjcHUgcmVmLCBleHBvc2UgdGhlIHN3YXAgZGV2aWNlICovCi0JZW5hYmxlX3N3YXBfaW5mbyhzaSk7CiYjNDM7CXBlcmNwdV9yZWZfcmVzdXJyZWN0KCZhbXA7c2ktJmd0O3VzZXJzKTsKJiM0MzsJcGVyY3B1X2Rvd25fd3JpdGUoJmFtcDtzd2Fwb25fcndzZW0pOwomIzQzOwllcnJvciA9IHN3YXBfcXVldWVfYWRkKHNpKTsKJiM0MzsJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKJiM0MzsJaWYgKGVycm9yKQomIzQzOwkJZ290byBmcmVlX3N3YXBfenN3YXA7CiYjNDM7CiYjNDM7CXN3YXBfZGV2aWNlX2VuYWJsZShzaSk7CiAKIAlwcl9pbmZvKCYjMzQ7QWRkaW5nICV1ayBzd2FwIG9uICVzLiAgUHJpb3JpdHk6JWQgZXh0ZW50czolZCBhY3Jvc3M6JWxsdWsgJXMlcyVzJXNcbiYjMzQ7LAogCQlLKHNpLSZndDtwYWdlcyksIG5hbWUtJmd0O25hbWUsIHNpLSZndDtwcmlvLCBucl9leHRlbnRzLApAQCAtMzc4OSw3ICYjNDM7Mzk5MSw2IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJCShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX0FSRUFfRElTQ0FSRCkgPyAmIzM0O3MmIzM0OyA6ICYjMzQ7JiMzNDssCiAJCShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1BBR0VfRElTQ0FSRCkgPyAmIzM0O2MmIzM0OyA6ICYjMzQ7JiMzNDspOwogCi0JbXV0ZXhfdW5sb2NrKCZhbXA7c3dhcG9uX211dGV4KTsKIAlhdG9taWNfaW5jKCZhbXA7cHJvY19wb2xsX2V2ZW50KTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFtcDtwcm9jX3BvbGxfd2FpdCk7CiAKQEAgLTM4MDAsNiAmIzQzOzQwMDEsOCBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKQogYmFkX3N3YXBfdW5sb2NrX2lub2RlOgogCWlub2RlX3VubG9jayhpbm9kZSk7CiBiYWRfc3dhcDoKJiM0MzsJZnJlZV9wZXJjcHUoc2ktJmd0O3BlcmNwdV9jbHVzdGVyKTsKJiM0MzsJc2ktJmd0O3BlcmNwdV9jbHVzdGVyID0gTlVMTDsKIAlrZnJlZShzaS0mZ3Q7Z2xvYmFsX2NsdXN0ZXIpOwogCXNpLSZndDtnbG9iYWxfY2x1c3RlciA9IE5VTEw7CiAJaW5vZGUgPSBOVUxMOwpAQCAtMzgxMCw5ICYjNDM7NDAxMyw5IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAJICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28KIAkgKiBhbGxvY19zd2FwX2luZm8gY2FuIHJldXNlIHRoaXMgc2kgc2FmZWx5LgogCSAqLwotCXNwaW5fbG9jaygmYW1wO3N3YXBfbG9jayk7CiYjNDM7CXBlcmNwdV9kb3duX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlzaS0mZ3Q7ZmxhZ3MgPSAwOwotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJcGVyY3B1X3VwX3dyaXRlKCZhbXA7c3dhcG9uX3J3c2VtKTsKIAlpZiAoaW5jZWRfbnJfcm90YXRlX3N3YXApCiAJCWF0b21pY19kZWMoJmFtcDtucl9yb3RhdGVfc3dhcCk7CiAJaWYgKHN3YXBfZmlsZSkKQEAgLTM4MjcsMTkgJiM0Mzs0MDMwLDE3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpCiAKIHZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbCkKIHsKLQl1bnNpZ25lZCBpbnQgdHlwZTsKJiM0MzsJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpOwogCXVuc2lnbmVkIGxvbmcgbnJfdG9fYmVfdW51c2VkID0gMDsKIAotCXNwaW5fbG9jaygmYW1wO3N3YXBfbG9jayk7Ci0JZm9yICh0eXBlID0gMDsgdHlwZSAmbHQ7IG5yX3N3YXBmaWxlczsgdHlwZSYjNDM7JiM0MzspIHsKLQkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF9pbmZvW3R5cGVdOwotCi0JCWlmICgoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9VU0VEKSAmYW1wOyZhbXA7ICEoc2ktJmd0O2ZsYWdzICZhbXA7IFNXUF9XUklURU9LKSkKJiM0MzsJcGVyY3B1X2Rvd25fcmVhZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CWZvcl9lYWNoX3N3YXAoc2kpIHsKJiM0MzsJCWlmICghKHNpLSZndDtmbGFncyAmYW1wOyBTV1BfV1JJVEVPSykpCiAJCQlucl90b19iZV91bnVzZWQgJiM0Mzs9IHN3YXBfdXNhZ2VfaW5fcGFnZXMoc2kpOwogCX0KIAl2YWwtJmd0O2ZyZWVzd2FwID0gYXRvbWljX2xvbmdfcmVhZCgmYW1wO25yX3N3YXBfcGFnZXMpICYjNDM7IG5yX3RvX2JlX3VudXNlZDsKIAl2YWwtJmd0O3RvdGFsc3dhcCA9IHRvdGFsX3N3YXBfcGFnZXMgJiM0MzsgbnJfdG9fYmVfdW51c2VkOwotCXNwaW5fdW5sb2NrKCZhbXA7c3dhcF9sb2NrKTsKJiM0MzsJcGVyY3B1X3VwX3JlYWQoJmFtcDtzd2Fwb25fcndzZW0pOwogfQogCiAvKgpAQCAtMzg3OSw3ICYjNDM7NDA4MCw3IEBAIGludCBzd2FwX2R1cF9lbnRyeV9kaXJlY3Qoc3dwX2VudHJ5X3QgZW50cnkpCiAjaWYgZGVmaW5lZChDT05GSUdfTUVNQ0cpICZhbXA7JmFtcDsgZGVmaW5lZChDT05GSUdfQkxLX0NHUk9VUCkKIHN0YXRpYyBib29sIF9faGFzX3VzYWJsZV9zd2FwKHZvaWQpCiB7Ci0JcmV0dXJuICFwbGlzdF9oZWFkX2VtcHR5KCZhbXA7c3dhcF9hY3RpdmVfaGVhZCk7CiYjNDM7CXJldHVybiBSRUFEX09OQ0UodG90YWxfc3dhcF9wYWdlcykgJmd0OyAwOwogfQogCiB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKQpAQCAtMzkwMiwxNCAmIzQzOzQxMDMsMTQgQEAgdm9pZCBfX2ZvbGlvX3Rocm90dGxlX3N3YXByYXRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGdmcF90IGdmcCkKIAlpZiAoY3VycmVudC0mZ3Q7dGhyb3R0bGVfZGlzaykKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c3dhcF9hdmFpbF9sb2NrKTsKLQlwbGlzdF9mb3JfZWFjaF9lbnRyeShzaSwgJmFtcDtzd2FwX2F2YWlsX2hlYWQsIGF2YWlsX2xpc3QpIHsKJiM0MzsJcGVyY3B1X2Rvd25fcmVhZCgmYW1wO3N3YXBvbl9yd3NlbSk7CiYjNDM7CWZvcl9lYWNoX2F2YWlsX3N3YXAoc2kpIHsKIAkJaWYgKHNpLSZndDtiZGV2KSB7CiAJCQlibGtjZ19zY2hlZHVsZV90aHJvdHRsZShzaS0mZ3Q7YmRldi0mZ3Q7YmRfZGlzaywgdHJ1ZSk7CiAJCQlicmVhazsKIAkJfQogCX0KLQlzcGluX3VubG9jaygmYW1wO3N3YXBfYXZhaWxfbG9jayk7CiYjNDM7CXBlcmNwdV91cF9yZWFkKCZhbXA7c3dhcG9uX3J3c2VtKTsKIH0KICNlbmRpZgogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAwOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1ODYxCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogNDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFN3YXAgU3Vic3lzdGVtIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIOKAkyBhIHByZXR0eSBzaWduaWZpY2FudCBvbmUsIGl0IGxvb2tzIGxpa2Ug4oCTIHRoYXQmIzM5O3MgZnVuZGFtZW50YWxseSBjaGFuZ2luZyB0aGUgTGludXgga2VybmVsJiMzOTtzIHN3YXAgc3Vic3lzdGVtLiBJdCYjMzk7cyByZXBsYWNpbmcgdGhlIGN1cnJlbnQgYHBsaXN0YC1iYXNlZCBxdWV1ZSBmb3Igc3dhcCBkZXZpY2VzIHdpdGggYSBjdXN0b20gcm91bmQtcm9iaW4gaW1wbGVtZW50YXRpb24uICBJbW1lZGlhdGVseSwgSSBjYW4gdGVsbCB0aGlzIGlzIGdvaW5nIHRvIHRvdWNoIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHdoaWNoIGlzIGFsd2F5cyBhIHJlZCBmbGFnIGZvciBwb3RlbnRpYWwgaXNzdWVzLiBUaGUgZmFjdCB0aGF0IGl0JiMzOTtzIHJld3JpdGluZyBzbyBtdWNoIG9mIGBtbS9zd2FwZmlsZS5jYCDigJMgYW5kIHRoZW4gdG91Y2hpbmcgYWxsIHRob3NlIG90aGVyIGhlYWRlciBhbmQgc3VwcG9ydGluZyBmaWxlcyDigJMgIGBpbmNsdWRlL2xpbnV4L3N3YXAuaGAsIGBpbmNsdWRlL2xpbnV4L3BsaXN0LmhgLCBgbGliL3BsaXN0LmNgLCBhbmQgYG1tL3N3YXAuaGAg4oCTIHRlbGxzIG1lIHRoaXMgaXNuJiMzOTt0IGp1c3QgYSBtaW5vciB0d2Vhay4gIEl0JiMzOTtzIGEgZ2VudWluZSBhcmNoaXRlY3R1cmFsIGNoYW5nZS4gIFJlbW92aW5nIGBwbGlzdF9yZXF1ZXVlYCBpcyBhIGNsdWUsIHRvby4KClRoaXMgaW50cm9kdWN0aW9uIG9mIG5ldyBzdHJ1Y3R1cmVzIGxpa2UgYHN3YXBfcXVldWVfcmVhZGVyc2AsIGBzd2FwX3F1ZXVlYCwgYHN3YXBfcXVldWVfbGVuYCwgYHN3YXBfcHJpb19yaW5nYCwgYWxvbmcgd2l0aCB0aGUgdXNlIG9mIGBzd2Fwb25fcndzZW1gIHRvIHJlcGxhY2UgdGhlIG9sZCBsb2NraW5nIG1lY2hhbmlzbXMsIGluZGljYXRlcyBhIHJlLXRoaW5raW5nIG9mIGhvdyBzd2FwIHNwYWNlIGlzIGFsbG9jYXRlZCBhbmQgbWFuYWdlZC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhICptYWpvciogZnVuY3Rpb25hbCBjaGFuZ2UgdG8gdGhlIHZlcnkgY29yZSBvZiBzd2FwIGFsbG9jYXRpb24gbG9naWMuCgpNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgJiMzNDtUaGlzIG5lZWRzIHNvbWUgc2VyaW91cyBmdXp6aW5nLiYjMzQ7ICBHaXZlbiB0aGUgcG90ZW50aWFsIGZvciBtZW1vcnkgY29ycnVwdGlvbiwgcmFjZSBjb25kaXRpb25zLCBvciB1bmV4cGVjdGVkIGJlaGF2aW9yIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcywgSSB3YW50IHRvIHplcm8gaW4gb24gdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQuICBMZXQmIzM5O3Mgc2VlOgoKKiAgIGBzd2FwX2FsbG9jX2VudHJ5YCAoYW5kIGl0cyByZXBsYWNlbWVudHMgb2YgYHN3YXBfYWxsb2NfZmFzdGAgYW5kIGBzd2FwX2FsbG9jX3Nsb3dgKSDigJMgVGhpcyBpcyBteSBwcmltYXJ5IGFyZWEgb2YgaW50ZXJlc3QsIGl0JiMzOTtzIHdoZXJlIHRoZSBzd2FwIGVudHJ5IGFsbG9jYXRpb24gYWN0dWFsbHkgaGFwcGVucy4KKiAgIGBmb2xpb19hbGxvY19zd2FwYCDigJMgYW5vdGhlciBjcml0aWNhbCBlbnRyeSBwb2ludC4KKiAgIFRoZSBxdWV1ZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zOiBgc3dhcF9xdWV1ZV9hZGRgLCBgc3dhcF9xdWV1ZV9kZWxgLCBgc3dhcF9xdWV1ZV9nZXRfZGV2aWNlYCAtIHRoZXNlIGFyZSB0aGUgcG9pbnRzIG9mIGludGVyYWN0aW9ucyB3aXRoIHRoZSBuZXcgc3RydWN0dXJlcy4KKiAgIGBzd2FwX2RldmljZV9lbmFibGVgLCBgc3dhcF9kZXZpY2VfZGlzYWJsZWAgLSB0aGUgcG9pbnRzIG9mIGRldmljZSBjaGFuZ2UgYXJlIGRlZmluaXRlbHkgd29ydGggY2hlY2tpbmcuCiogICBgc3lzX3N3YXBvbmAsIGBzeXNfc3dhcG9mZmAg4oCTIFRoZSB1c2VyLXNwYWNlIGludGVyZmFjZSBpcyBhbHdheXMgYSBnb29kIHRhcmdldC4KKiAgIFRoZSBgc3dhcF9kZXZpY2VfaW51c2VfKmAgZnVuY3Rpb25zIOKAkyB0aGVzZSBhcmUgbGlrZWx5IHRoZSBwbGFjZSB3aGVyZSB0aGUgb2xkIGxvY2tpbmcgd2FzLCB0aGlzIGlzIGFsc28gY3J1Y2lhbC4KKiAgIGBhZGRfdG9fYXZhaWxfbGlzdGAsIGBkZWxfZnJvbV9hdmFpbF9saXN0YCDigJMgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gbG9vayBhdCB0aGUgbmV3IGxpc3QgbWFuaXB1bGF0aW9uLgoqICAgVGhlIG5ldyBxdWV1ZSBtYXNrIGZ1bmN0aW9ucyBgc3dhcF9xdWV1ZV9tYXNrYCwgYHN3YXBfcXVldWVfdW5tYXNrYAoqICAgYGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeWAKCkFscmlnaHQsIEkmIzM5O2xsIG5lZWQgdG8gZmlndXJlIG91dCBhbnkgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLCBhcyB3ZWxsLiBTaW5jZSB0aGlzIGlzIGluIGBtbS9zd2FwZmlsZS5jYCwgaXQmIzM5O3MgYWxtb3N0IGNlcnRhaW5seSBjb250cm9sbGVkIGJ5IGBDT05GSUdfU1dBUGAuIEkgc2hvdWxkIGNoZWNrIHRoZSBgbW0vTWFrZWZpbGVgIHRvIGNvbmZpcm0sIGJ1dCB0aGF0JiMzOTtzIGEgZ2l2ZW4uIEkgYW0gZWFnZXIgdG8gZ2V0IHN0YXJ0ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMDA6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3dhcGZpbGUubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTc2PWVuZGlmXG5tbS9NYWtlZmlsZS03Ny1cbm1tL01ha2VmaWxlOjc4Om9iai0kKENPTkZJR19TV0FQKVx0JiM0Mzs9IHBhZ2VfaW8ubyBzd2FwX3N0YXRlLm8gc3dhcGZpbGUub1xubW0vTWFrZWZpbGUtNzktb2JqLSQoQ09ORklHX1pTV0FQKVx0JiM0Mzs9IHpzd2FwLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAwMDo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzA1OQoJCQkJCQkJb3V0cHV0OiA1NgoJCQkJCQkJdGhvdWdodHM6IDIzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlIFN3YXAgQ29uZmlndXJhdGlvbiBEZXBlbmRlbmN5KioKCkFscmlnaHQsIGl0JiMzOTtzIGNsZWFyIHRoYXQgYENPTkZJR19TV0FQYCBpcyBhIHByZXJlcXVpc2l0ZSBoZXJlLiBUaGF0JiMzOTtzIHRoZSBiYXNlbGluZS4gTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29yZSBsb2dpYyB0aGlzIGNoYW5nZSBpcyB0b3VjaGluZy4gVGhlIG1vc3QgcmVsZXZhbnQgZnVuY3Rpb25zIHNlZW0gdG8gYmUgY2VudGVyZWQgYXJvdW5kIHF1ZXVpbmcsIGRldmljZSBtYW5hZ2VtZW50LCBhbmQgYWxsb2NhdGlvbi4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIHRoaW5raW5nIGFib3V0IGBzd2FwX3F1ZXVlX2FkZGAsIGBzd2FwX3F1ZXVlX2RlbGAsIGBzd2FwX3F1ZXVlX2dldF9kZXZpY2VgLCBgc3dhcF9kZXZpY2VfZW5hYmxlYCwgYHN3YXBfZGV2aWNlX2Rpc2FibGVgLCBgc3dhcF9hbGxvY19lbnRyeWAsIGBzd2FwX2RldmljZV9pbnVzZV9hZGRgLCBgc3dhcF9kZXZpY2VfaW51c2Vfc3ViYCwgYGFkZF90b19hdmFpbF9saXN0YCwgYGRlbF9mcm9tX2F2YWlsX2xpc3RgLCBgc3dhcF9xdWV1ZV9tYXNrYCwgYW5kIGBzd2FwX3F1ZXVlX3VubWFza2AuIFRoZXNlIGFsbCBzZWVtIHRvIHJlc2lkZSB3aXRoaW4gYG1tL3N3YXBmaWxlLmNgLCB3aGljaCBtYWtlcyBzZW5zZS4KCkl0IGxvb2tzIGxpa2UgdGhlIGNoYW5nZSBpbnRlcmFjdHMgd2l0aCBgQ09ORklHX0hJQkVSTkFUSU9OYCB0b28sIGFsc28gaW4gYG1tL3N3YXBmaWxlLmNgLCBhbmQgdGhhdCYjMzk7cyBicmluZ2luZyBpbiBmdW5jdGlvbnMgbGlrZSBgcGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZWAsIGB1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGVgLCBgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGVgLCBgZmluZF9maXJzdF9zd2FwYCwgYW5kIGBjb3VudF9zd2FwX3BhZ2VzYC4gV2hpbGUgaGliZXJuYXRpb24gaXMgaW52b2x2ZWQsIGl0IGFwcGVhcnMgdGhlIGNlbnRyYWwgZm9jdXMgaXMgcmVhbGx5IHRoZSBtZWNoYW5pY3Mgb2Ygc3dhcCBhbGxvY2F0aW9uIGl0c2VsZi4gVGhpcyByZWluZm9yY2VzIG15IGluaXRpYWwgaHVuY2ggYWJvdXQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyBpbnZvbHZlZCwgSSBuZWVkIHRvIGZvY3VzIG9uIHRoaXMgcGFydCB0byBwcm9jZWVkLiBMZXQmIzM5O3MgZ2V0IGRvd24gdG8gc3BlY2lmaWNzLCBJIG5lZWQgdG8gcHVsbCB1cCB0aGlzIGxpc3Qgb2YgZnVuY3Rpb25zIGFnYWluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAwOjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O14oc3RhdGljICk/KGludHx2b2lkfGJvb2x8c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgXFwqKSBbYS16QS1aMC05X10mIzQzO1xcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL3N3YXBmaWxlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcGZpbGUuYy01MC1cbm1tL3N3YXBmaWxlLmM6NTE6c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtNTItXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKTtcbm1tL3N3YXBmaWxlLmM6NTM6c3RhdGljIGJvb2wgZm9saW9fc3dhcGNhY2hlX2ZyZWVhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xubW0vc3dhcGZpbGUuYzo1NDpzdGF0aWMgdm9pZCBtb3ZlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy01NS1cdFx0XHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbm1tL3N3YXBmaWxlLmMtNTYtXHRcdFx0IGVudW0gc3dhcF9jbHVzdGVyX2ZsYWdzIG5ld19mbGFncyk7XG5tbS9zd2FwZmlsZS5jOjU3OnN0YXRpYyBib29sIGdldF9zd2FwX2RldmljZV9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSk7XG5tbS9zd2FwZmlsZS5jLTU4LVxuLS1cbm1tL3N3YXBmaWxlLmM9MjA4PXN0YXRpYyBzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhpbnQgbnJfcmluZ3MsIGdmcF90IGdmcClcbi0tXG5tbS9zd2FwZmlsZS5jLTIxOS1cbm1tL3N3YXBmaWxlLmM6MjIwOnN0YXRpYyB2b2lkIHN3YXBfcXVldWVfaW5zdGFsbF9yZWFkZXJzKHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqcmVhZGVycylcbm1tL3N3YXBmaWxlLmMtMjIxLXtcbi0tXG5tbS9zd2FwZmlsZS5jPTI0Mj1zdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfcXVldWVfZ2V0X2RldmljZShsb25nIG5yX2FsbG9jLCBpbnQgbnJfaXRlcilcbi0tXG5tbS9zd2FwZmlsZS5jLTI4NS1cbm1tL3N3YXBmaWxlLmM6Mjg2OnN0YXRpYyBib29sIHN3YXBfcXVldWVfZmluZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTI4Ny1cdFx0XHQgICAgdW5zaWduZWQgaW50ICpyaW5nX2lkeCwgdW5zaWduZWQgaW50ICpkZXZfaWR4KVxuLS1cbm1tL3N3YXBmaWxlLmMtMzA5LVxubW0vc3dhcGZpbGUuYzozMTA6c3RhdGljIHZvaWQgc3dhcF9xdWV1ZV9tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbm1tL3N3YXBmaWxlLmMtMzExLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTMxOS1cbm1tL3N3YXBmaWxlLmM6MzIwOnN0YXRpYyB2b2lkIHN3YXBfcXVldWVfdW5tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbm1tL3N3YXBmaWxlLmMtMzIxLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTMyOS1cbm1tL3N3YXBmaWxlLmM6MzMwOnN0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxubW0vc3dhcGZpbGUuYy0zMzEte1xuLS1cbm1tL3N3YXBmaWxlLmMtNDA1LVxubW0vc3dhcGZpbGUuYzo0MDY6c3RhdGljIHZvaWQgc3dhcF9xdWV1ZV9kZWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxubW0vc3dhcGZpbGUuYy00MDcte1xuLS1cbm1tL3N3YXBmaWxlLmM9NDg5PXN0YXRpYyBsb25nIHN3YXBfdXNhZ2VfaW5fcGFnZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuLS1cbm1tL3N3YXBmaWxlLmMtNDk3LSAqL1xubW0vc3dhcGZpbGUuYzo0OTg6c3RhdGljIHZvaWQgc3dhcF9hbGxvY19sb2NrX2RldmljZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5tbS9zd2FwZmlsZS5jLTQ5OS17XG4tLVxubW0vc3dhcGZpbGUuYy01MDUtXG5tbS9zd2FwZmlsZS5jOjUwNjpzdGF0aWMgdm9pZCBzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxubW0vc3dhcGZpbGUuYy01MDcte1xuLS1cbm1tL3N3YXBmaWxlLmMtNTIzLVxubW0vc3dhcGZpbGUuYzo1MjQ6c3RhdGljIGJvb2wgc3dhcF9vbmx5X2hhc19jYWNoZShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcGZpbGUuYy01MjUtXHRcdFx0XHR1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IG5yX3BhZ2VzKVxuLS1cbm1tL3N3YXBmaWxlLmMtNTQ1LSAqL1xubW0vc3dhcGZpbGUuYzo1NDY6c3RhdGljIGludCBfX3RyeV90b19yZWNsYWltX3N3YXAoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy01NDctXHRcdFx0XHQgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpXG4tLVxubW0vc3dhcGZpbGUuYz02MTY9c3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9leHRlbnQgKm5leHRfc2Uoc3RydWN0IHN3YXBfZXh0ZW50ICpzZSlcbi0tXG5tbS9zd2FwZmlsZS5jLTYyNS0gKi9cbm1tL3N3YXBmaWxlLmM6NjI2OnN0YXRpYyBpbnQgZGlzY2FyZF9zd2FwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbm1tL3N3YXBmaWxlLmMtNjI3LXtcbi0tXG5tbS9zd2FwZmlsZS5jPTY3OT1zZWN0b3JfdCBzd2FwX2ZvbGlvX3NlY3RvcihzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3N3YXBmaWxlLmMtNjk1LSAqL1xubW0vc3dhcGZpbGUuYzo2OTY6c3RhdGljIHZvaWQgZGlzY2FyZF9zd2FwX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy02OTctXHRcdFx0XHQgcGdvZmZfdCBzdGFydF9wYWdlLCBwZ29mZl90IG5yX3BhZ2VzKVxuLS1cbm1tL3N3YXBmaWxlLmM9NzU1PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNsdXN0ZXJfb2Zmc2V0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTc2MC1cbm1tL3N3YXBmaWxlLmM6NzYxOnN0YXRpYyB2b2lkIHN3YXBfY2x1c3Rlcl9mcmVlX3RhYmxlX2ZvbGlvX3JjdV9jYihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpXG5tbS9zd2FwZmlsZS5jLTc2Mi17XG4tLVxubW0vc3dhcGZpbGUuYy03NjgtXG5tbS9zd2FwZmlsZS5jOjc2OTpzdGF0aWMgdm9pZCBzd2FwX2NsdXN0ZXJfZnJlZV90YWJsZShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxubW0vc3dhcGZpbGUuYy03NzAte1xuLS1cbm1tL3N3YXBmaWxlLmMtNzk2LVxubW0vc3dhcGZpbGUuYzo3OTc6c3RhdGljIGludCBzd2FwX2NsdXN0ZXJfYWxsb2NfdGFibGUoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgZ2ZwX3QgZ2ZwKVxubW0vc3dhcGZpbGUuYy03OTgte1xuLS1cbm1tL3N3YXBmaWxlLmMtODQ1LSAqL1xubW0vc3dhcGZpbGUuYzo4NDY6c3RhdGljIHZvaWQgc3dhcF9jbHVzdGVyX2Fzc2VydF9lbXB0eShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcGZpbGUuYy04NDctXHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgY2lfb2ZmLCB1bnNpZ25lZCBpbnQgbnIsXG4tLVxubW0vc3dhcGZpbGUuYz04NzU9c3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTkyMy1cbm1tL3N3YXBmaWxlLmM6OTI0OnN0YXRpYyB2b2lkIG1vdmVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTkyNS1cdFx0XHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbi0tXG5tbS9zd2FwZmlsZS5jLTk0Mi0vKiBBZGQgYSBjbHVzdGVyIHRvIGRpc2NhcmQgbGlzdCBhbmQgc2NoZWR1bGUgaXQgdG8gZG8gZGlzY2FyZCAqL1xubW0vc3dhcGZpbGUuYzo5NDM6c3RhdGljIHZvaWQgc3dhcF9jbHVzdGVyX3NjaGVkdWxlX2Rpc2NhcmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy05NDQtXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXG4tLVxubW0vc3dhcGZpbGUuYy05NTAtXG5tbS9zd2FwZmlsZS5jOjk1MTpzdGF0aWMgdm9pZCBfX2ZyZWVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXG5tbS9zd2FwZmlsZS5jLTk1Mi17XG4tLVxubW0vc3dhcGZpbGUuYz05Njg9c3RhdGljIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqaXNvbGF0ZV9sb2NrX2NsdXN0ZXIoXG4tLVxubW0vc3dhcGZpbGUuYy0xMDA3LSAqL1xubW0vc3dhcGZpbGUuYzoxMDA4OnN0YXRpYyBib29sIHN3YXBfZG9fc2NoZWR1bGVkX2Rpc2NhcmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxubW0vc3dhcGZpbGUuYy0xMDA5LXtcbi0tXG5tbS9zd2FwZmlsZS5jLTEwNDItXG5tbS9zd2FwZmlsZS5jOjEwNDM6c3RhdGljIHZvaWQgc3dhcF9kaXNjYXJkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxubW0vc3dhcGZpbGUuYy0xMDQ0LXtcbi0tXG5tbS9zd2FwZmlsZS5jLTEwNTEtXG5tbS9zd2FwZmlsZS5jOjEwNTI6c3RhdGljIHZvaWQgc3dhcF91c2Vyc19yZWZfZnJlZShzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmKVxubW0vc3dhcGZpbGUuYy0xMDUzLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTEwNjMtICovXG5tbS9zd2FwZmlsZS5jOjEwNjQ6c3RhdGljIHZvaWQgZnJlZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSlcbm1tL3N3YXBmaWxlLmMtMTA2NS17XG4tLVxubW0vc3dhcGZpbGUuYy0xMDg3LSAqL1xubW0vc3dhcGZpbGUuYzoxMDg4OnN0YXRpYyB2b2lkIHBhcnRpYWxfZnJlZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTA4OS1cdFx0XHRcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxuLS1cbm1tL3N3YXBmaWxlLmMtMTEwMy0gKi9cbm1tL3N3YXBmaWxlLmM6MTEwNDpzdGF0aWMgdm9pZCByZWxvY2F0ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTEwNS1cdFx0XHQgICAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXG4tLVxubW0vc3dhcGZpbGUuYy0xMTMxLSAqL1xubW0vc3dhcGZpbGUuYzoxMTMyOnN0YXRpYyBpbnQgc3dhcF9jbHVzdGVyX3NldHVwX2JhZF9zbG90KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTEzMy1cdFx0XHRcdCAgICAgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcbi0tXG5tbS9zd2FwZmlsZS5jLTExODEtICovXG5tbS9zd2FwZmlsZS5jOjExODI6c3RhdGljIGJvb2wgY2x1c3Rlcl9yZWNsYWltX3JhbmdlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTE4My1cdFx0XHRcdCAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTEyMjgtXG5tbS9zd2FwZmlsZS5jOjEyMjk6c3RhdGljIGJvb2wgY2x1c3Rlcl9zY2FuX3JhbmdlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTIzMC1cdFx0XHQgICAgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTEyNTUtXG5tbS9zd2FwZmlsZS5jOjEyNTY6c3RhdGljIGJvb2wgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTEyNTctXHRcdFx0XHRcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuLS1cbm1tL3N3YXBmaWxlLmM9MTM1OD1zdGF0aWMgdW5zaWduZWQgaW50IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTEzNzktXG5tbS9zd2FwZmlsZS5jOjEzODA6c3RhdGljIHZvaWQgc3dhcF9yZWNsYWltX2Z1bGxfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIGZvcmNlKVxubW0vc3dhcGZpbGUuYy0xMzgxLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTE0MjEtXG5tbS9zd2FwZmlsZS5jOjE0MjI6c3RhdGljIHZvaWQgc3dhcF9yZWNsYWltX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxubW0vc3dhcGZpbGUuYy0xNDIzLXtcbi0tXG5tbS9zd2FwZmlsZS5jPTE0MzU9c3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTE1MzctLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBzZXQgYnkgdGhpcyBoZWxwZXIuICovXG5tbS9zd2FwZmlsZS5jOjE1Mzg6c3RhdGljIHZvaWQgZGVsX2Zyb21fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9mZilcbm1tL3N3YXBmaWxlLmMtMTUzOS17XG4tLVxubW0vc3dhcGZpbGUuYy0xNTY1LS8qIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgY2FuIG9ubHkgYmUgY2xlYXJlZCBieSB0aGlzIGhlbHBlci4gKi9cbm1tL3N3YXBmaWxlLmM6MTU2NjpzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5tbS9zd2FwZmlsZS5jLTE1Njcte1xuLS1cbm1tL3N3YXBmaWxlLmMtMTYxMC0gKi9cbm1tL3N3YXBmaWxlLmM6MTYxMTpzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy0xNjEyLVx0XHRcdFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcylcbi0tXG5tbS9zd2FwZmlsZS5jLTE2MjktXG5tbS9zd2FwZmlsZS5jOjE2MzA6c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2Vfc3ViKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXG5tbS9zd2FwZmlsZS5jLTE2MzEtXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuLS1cbm1tL3N3YXBmaWxlLmMtMTY2OC1cbm1tL3N3YXBmaWxlLmM6MTY2OTpzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5tbS9zd2FwZmlsZS5jLTE2NzAte1xuLS1cbm1tL3N3YXBmaWxlLmMtMTY4NC1cbm1tL3N3YXBmaWxlLmM6MTY4NTpzdGF0aWMgaW50IHN3YXBfYWxsb2NfZW50cnkoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXBmaWxlLmMtMTY4Ni17XG4tLVxubW0vc3dhcGZpbGUuYy0xNzIwLVxubW0vc3dhcGZpbGUuYzoxNzIxOnN0YXRpYyBpbnQgc3dhcF9leHRlbmRfdGFibGVfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy0xNzIyLVx0XHRcdFx0ICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTE3NTYtXG5tbS9zd2FwZmlsZS5jOjE3NTc6aW50IHN3YXBfcmV0cnlfdGFibGVfYWxsb2Moc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcClcbm1tL3N3YXBmaWxlLmMtMTc1OC17XG4tLVxubW0vc3dhcGZpbGUuYy0xNzc0LVxubW0vc3dhcGZpbGUuYzoxNzc1OnN0YXRpYyB2b2lkIHN3YXBfZXh0ZW5kX3RhYmxlX3RyeV9mcmVlKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXG5tbS9zd2FwZmlsZS5jLTE3NzYte1xuLS1cbm1tL3N3YXBmaWxlLmMtMTc5NC0vKiBEZWNyZWFzZSB0aGUgc3dhcCBjb3VudCBvZiBvbmUgc2xvdCwgd2l0aG91dCBmcmVlaW5nIGl0ICovXG5tbS9zd2FwZmlsZS5jOjE3OTU6c3RhdGljIHZvaWQgX19zd2FwX2NsdXN0ZXJfcHV0X2VudHJ5KHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwZmlsZS5jLTE3OTYtXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGNpX29mZilcbi0tXG5tbS9zd2FwZmlsZS5jLTE4NDUtICovXG5tbS9zd2FwZmlsZS5jOjE4NDY6c3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbm1tL3N3YXBmaWxlLmMtMTg0Ny1cdFx0XHRcdCAgICAgcGdvZmZfdCBvZmZzZXQsIGludCBucixcbi0tXG5tbS9zd2FwZmlsZS5jLTE5MDItLyogSW5jcmVhc2UgdGhlIHN3YXAgY291bnQgb2Ygb25lIHNsb3QuICovXG5tbS9zd2FwZmlsZS5jOjE5MDM6c3RhdGljIGludCBfX3N3YXBfY2x1c3Rlcl9kdXBfZW50cnkoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXBmaWxlLmMtMTkwNC1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgY2lfb2ZmKVxuLS1cbm1tL3N3YXBmaWxlLmMtMTk1Mi0gKi9cbm1tL3N3YXBmaWxlLmM6MTk1MzpzdGF0aWMgaW50IHN3YXBfZHVwX2VudHJpZXNfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTE5NTQtXHRcdFx0XHQgICAgcGdvZmZfdCBvZmZzZXQsIGludCBucilcbi0tXG5tbS9zd2FwZmlsZS5jLTE5OTctICovXG5tbS9zd2FwZmlsZS5jOjE5OTg6aW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXBmaWxlLmMtMTk5OS17XG4tLVxubW0vc3dhcGZpbGUuYy0yMDUzLSAqL1xubW0vc3dhcGZpbGUuYzoyMDU0OmludCBmb2xpb19kdXBfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSlcbm1tL3N3YXBmaWxlLmMtMjA1NS17XG4tLVxubW0vc3dhcGZpbGUuYy0yMDc5LSAqL1xubW0vc3dhcGZpbGUuYzoyMDgwOnZvaWQgZm9saW9fcHV0X3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXG5tbS9zd2FwZmlsZS5jLTIwODEte1xuLS1cbm1tL3N3YXBmaWxlLmM9MjEzND1zdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZ2V0X3N3YXBfZGV2aWNlKHN3cF9lbnRyeV90IGVudHJ5KVxuLS1cbm1tL3N3YXBmaWxlLmMtMjE2NC0gKi9cbm1tL3N3YXBmaWxlLmM6MjE2NTp2b2lkIF9fc3dhcF9jbHVzdGVyX2ZyZWVfZW50cmllcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG5tbS9zd2FwZmlsZS5jLTIxNjYtXHRcdFx0XHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTIyMTUtXG5tbS9zd2FwZmlsZS5jOjIyMTY6aW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbm1tL3N3YXBmaWxlLmMtMjIxNy17XG4tLVxubW0vc3dhcGZpbGUuYy0yMjI4LSAqL1xubW0vc3dhcGZpbGUuYzoyMjI5OmJvb2wgc3dhcF9lbnRyeV9zd2FwcGVkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3dwX2VudHJ5X3QgZW50cnkpXG5tbS9zd2FwZmlsZS5jLTIyMzAte1xuLS1cbm1tL3N3YXBmaWxlLmMtMjI0NS0gKi9cbm1tL3N3YXBmaWxlLmM6MjI0NjppbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSlcbm1tL3N3YXBmaWxlLmMtMjI0Ny17XG4tLVxubW0vc3dhcGZpbGUuYy0yMjc4LSAqL1xubW0vc3dhcGZpbGUuYzoyMjc5OnN0YXRpYyBib29sIGZvbGlvX21heWJlX3N3YXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXBmaWxlLmMtMjI4MC17XG4tLVxubW0vc3dhcGZpbGUuYy0yMzA3LVxubW0vc3dhcGZpbGUuYzoyMzA4OnN0YXRpYyBib29sIGZvbGlvX3N3YXBjYWNoZV9mcmVlYWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxubW0vc3dhcGZpbGUuYy0yMzA5LXtcbi0tXG5tbS9zd2FwZmlsZS5jLTIzNDYtICovXG5tbS9zd2FwZmlsZS5jOjIzNDc6Ym9vbCBmb2xpb19mcmVlX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3N3YXBmaWxlLmMtMjM0OC17XG4tLVxubW0vc3dhcGZpbGUuYy0yMzcxLSAqL1xubW0vc3dhcGZpbGUuYzoyMzcyOnZvaWQgc3dhcF9wdXRfZW50cmllc19kaXJlY3Qoc3dwX2VudHJ5X3QgZW50cnksIGludCBucilcbm1tL3N3YXBmaWxlLmMtMjM3My17XG4tLVxubW0vc3dhcGZpbGUuYz0yNDA3PXN3cF9lbnRyeV90IHN3YXBfYWxsb2NfaGliZXJuYXRpb25fc2xvdChpbnQgdHlwZSlcbi0tXG5tbS9zd2FwZmlsZS5jLTI0MjktICovXG5tbS9zd2FwZmlsZS5jOjI0MzA6dm9pZCBzd2FwX2ZyZWVfaGliZXJuYXRpb25fc2xvdChzd3BfZW50cnlfdCBlbnRyeSlcbm1tL3N3YXBmaWxlLmMtMjQzMS17XG4tLVxubW0vc3dhcGZpbGUuYy0yNDQ0LVxubW0vc3dhcGZpbGUuYzoyNDQ1OnN0YXRpYyBpbnQgX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldClcbm1tL3N3YXBmaWxlLmMtMjQ0Ni17XG4tLVxubW0vc3dhcGZpbGUuYy0yNDc4LSAqL1xubW0vc3dhcGZpbGUuYzoyNDc5OmludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxubW0vc3dhcGZpbGUuYy0yNDgwLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTI1MjEtICovXG5tbS9zd2FwZmlsZS5jOjI1MjI6dm9pZCB1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoaW50IHR5cGUpXG5tbS9zd2FwZmlsZS5jLTI1MjMte1xuLS1cbm1tL3N3YXBmaWxlLmMtMjU1MC0gKi9cbm1tL3N3YXBmaWxlLmM6MjU1MTppbnQgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG5tbS9zd2FwZmlsZS5jLTI1NTIte1xuLS1cbm1tL3N3YXBmaWxlLmMtMjU2MS1cbm1tL3N3YXBmaWxlLmM6MjU2MjppbnQgZmluZF9maXJzdF9zd2FwKGRldl90ICpkZXZpY2UpXG5tbS9zd2FwZmlsZS5jLTI1NjMte1xuLS1cbm1tL3N3YXBmaWxlLmM9MjYxOT1zdGF0aWMgaW5saW5lIGludCBwdGVfc2FtZV9hc19zd3AocHRlX3QgcHRlLCBwdGVfdCBzd3BfcHRlKVxuLS1cbm1tL3N3YXBmaWxlLmMtMjYyOC0gKi9cbm1tL3N3YXBmaWxlLmM6MjYyOTpzdGF0aWMgaW50IHVudXNlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbm1tL3N3YXBmaWxlLmMtMjYzMC1cdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9zd2FwZmlsZS5jLTI3NDEtXG5tbS9zd2FwZmlsZS5jOjI3NDI6c3RhdGljIGludCB1bnVzZV9wdGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG5tbS9zd2FwZmlsZS5jLTI3NDMtXHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbi0tXG5tbS9zd2FwZmlsZS5jPTI4NTA9c3RhdGljIGlubGluZSBpbnQgdW51c2VfcDRkX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ2RfdCAqcGdkLFxuLS1cbm1tL3N3YXBmaWxlLmMtMjg2OS1cbm1tL3N3YXBmaWxlLmM6Mjg3MDpzdGF0aWMgaW50IHVudXNlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgaW50IHR5cGUpXG5tbS9zd2FwZmlsZS5jLTI4NzEte1xuLS1cbm1tL3N3YXBmaWxlLmMtMjg5MC1cbm1tL3N3YXBmaWxlLmM6Mjg5MTpzdGF0aWMgaW50IHVudXNlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBpbnQgdHlwZSlcbm1tL3N3YXBmaWxlLmMtMjg5Mi17XG4tLVxubW0vc3dhcGZpbGUuYz0yOTE5PXN0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9uZXh0X3RvX3VudXNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi0tXG5tbS9zd2FwZmlsZS5jLTI5NDUtXG5tbS9zd2FwZmlsZS5jOjI5NDY6c3RhdGljIGludCB0cnlfdG9fdW51c2UodW5zaWduZWQgaW50IHR5cGUpXG5tbS9zd2FwZmlsZS5jLTI5NDcte1xuLS1cbm1tL3N3YXBmaWxlLmMtMzA1My0gKi9cbm1tL3N3YXBmaWxlLmM6MzA1NDpzdGF0aWMgdm9pZCBkcmFpbl9tbWxpc3Qodm9pZClcbm1tL3N3YXBmaWxlLmMtMzA1NS17XG4tLVxubW0vc3dhcGZpbGUuYy0zMDcyLSAqL1xubW0vc3dhcGZpbGUuYzozMDczOnN0YXRpYyB2b2lkIGRlc3Ryb3lfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG5tbS9zd2FwZmlsZS5jLTMwNzQtXHRcdFx0XHQgc3RydWN0IGZpbGUgKnN3YXBfZmlsZSlcbi0tXG5tbS9zd2FwZmlsZS5jPTMxMzg9RVhQT1JUX1NZTUJPTF9HUEwoYWRkX3N3YXBfZXh0ZW50KTtcbi0tXG5tbS9zd2FwZmlsZS5jLTMxNjYtICovXG5tbS9zd2FwZmlsZS5jOjMxNjc6c3RhdGljIGludCBzZXR1cF9zd2FwX2V4dGVudHMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyxcbm1tL3N3YXBmaWxlLmMtMzE2OC1cdFx0XHQgICAgICBzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlLCBzZWN0b3JfdCAqc3Bhbilcbi0tXG5tbS9zd2FwZmlsZS5jLTMxOTktICovXG5tbS9zd2FwZmlsZS5jOjMyMDA6c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfZW5hYmxlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbm1tL3N3YXBmaWxlLmMtMzIwMS17XG4tLVxubW0vc3dhcGZpbGUuYy0zMjEyLVxubW0vc3dhcGZpbGUuYzozMjEzOnN0YXRpYyBpbnQgc3dhcF9kZXZpY2VfZGlzYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5tbS9zd2FwZmlsZS5jLTMyMTQte1xuLS1cbm1tL3N3YXBmaWxlLmMtMzI1Ni1cbm1tL3N3YXBmaWxlLmM6MzI1NzpzdGF0aWMgdm9pZCBmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvLFxubW0vc3dhcGZpbGUuYy0zMjU4LVx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcbi0tXG5tbS9zd2FwZmlsZS5jPTM0Mjk9c3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuLS1cbm1tL3N3YXBmaWxlLmMtMzQ0OC1cbm1tL3N3YXBmaWxlLmM6MzQ0OTpzdGF0aWMgdm9pZCBzd2FwX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxubW0vc3dhcGZpbGUuYy0zNDUwLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTM0NTMtXG5tbS9zd2FwZmlsZS5jOjM0NTQ6c3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxubW0vc3dhcGZpbGUuYy0zNDU1LXtcbi0tXG5tbS9zd2FwZmlsZS5jPTM0ODE9c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzd2Fwc19vcCA9IHtcbi0tXG5tbS9zd2FwZmlsZS5jLTM0ODctXG5tbS9zd2FwZmlsZS5jOjM0ODg6c3RhdGljIGludCBzd2Fwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxubW0vc3dhcGZpbGUuYy0zNDg5LXtcbi0tXG5tbS9zd2FwZmlsZS5jPTM1Mjg9c3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICphbGxvY19zd2FwX2luZm8odm9pZClcbi0tXG5tbS9zd2FwZmlsZS5jLTM1ODQtXG5tbS9zd2FwZmlsZS5jOjM1ODU6c3RhdGljIGludCBjbGFpbV9zd2FwZmlsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG5tbS9zd2FwZmlsZS5jLTM1ODYte1xuLS1cbm1tL3N3YXBmaWxlLmM9MzY0Mj1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbi0tXG5tbS9zd2FwZmlsZS5jLTM3MDMtXG5tbS9zd2FwZmlsZS5jOjM3MDQ6c3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxubW0vc3dhcGZpbGUuYy0zNzA1LVx0XHRcdFx0ICAgIHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbi0tXG5tbS9zd2FwZmlsZS5jPTM3OTc9U1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbi0tXG5tbS9zd2FwZmlsZS5jLTQwMzAtXG5tbS9zd2FwZmlsZS5jOjQwMzE6dm9pZCBzaV9zd2FwaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqdmFsKVxubW0vc3dhcGZpbGUuYy00MDMyLXtcbi0tXG5tbS9zd2FwZmlsZS5jLTQwNTktICovXG5tbS9zd2FwZmlsZS5jOjQwNjA6aW50IHN3YXBfZHVwX2VudHJ5X2RpcmVjdChzd3BfZW50cnlfdCBlbnRyeSlcbm1tL3N3YXBmaWxlLmMtNDA2MS17XG4tLVxubW0vc3dhcGZpbGUuYy00MDgwLSNpZiBkZWZpbmVkKENPTkZJR19NRU1DRykgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX0JMS19DR1JPVVApXG5tbS9zd2FwZmlsZS5jOjQwODE6c3RhdGljIGJvb2wgX19oYXNfdXNhYmxlX3N3YXAodm9pZClcbm1tL3N3YXBmaWxlLmMtNDA4Mi17XG4tLVxubW0vc3dhcGZpbGUuYy00MDg1LVxubW0vc3dhcGZpbGUuYzo0MDg2OnZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXG5tbS9zd2FwZmlsZS5jLTQwODcte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDAwOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzODA1CgkJCQkJCQlvdXRwdXQ6IDE5OQoJCQkJCQkJdGhvdWdodHM6IDU3OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciBUaGlzIFN3YXAgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBzY2FuIGhhcyBoaWdobGlnaHRlZCBhIGhhbmRmdWwgb2YgZnVuY3Rpb25zIGFzIHBvdGVudGlhbCBob3RzcG90cyBpbiB0aGlzIHN3YXAgaW1wbGVtZW50YXRpb24uIEdpdmVuIHRoZSBhcmNoaXRlY3R1cmFsIGNoYW5nZSBkZXNjcmliZWQg4oCTIG1vdmluZyBmcm9tIGEgYHBsaXN0YCB0byBhIHJvdW5kLXJvYmluIHF1ZXVlIOKAkyBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGFyZWFzIHdoZXJlIHRoaXMgbmV3IGxvZ2ljIGlzIGludHJvZHVjZWQgYW5kIGludGVyYWN0cyB3aXRoIHRoZSBleGlzdGluZyBzd2FwIGZyYW1ld29yay4KCkkmIzM5O20gemVyb2luZyBpbiBvbiBhIGZldyBrZXkgZnVuY3Rpb25zOiBgc3dhcF9hbGxvY19lbnRyeWAgbG9va3MgbGlrZSB0aGUgbmV3IGNvcmUgZm9yIGFsbG9jYXRpb24sIHJlcGxhY2luZyBzb21lIG9mIHRoZSBvbGRlciBsb2dpYy4gSSYjMzk7bSBhbHNvIHB1dHRpbmcgYSBwaW4gb24gYHN3YXBfcXVldWVfYWRkYCwgYHN3YXBfcXVldWVfZGVsYCwgYHN3YXBfcXVldWVfZ2V0X2RldmljZWAsIGBzd2FwX2RldmljZV9lbmFibGVgLCBhbmQgYHN3YXBfZGV2aWNlX2Rpc2FibGVgIGFzIHRoZXNlIHNlZW0gdG8gYmUgdGhlIHByaW1hcnkgaW50ZXJhY3Rpb25zIHdpdGggdGhlIG5ldyBxdWV1ZSBtZWNoYW5pc20uIFRoZSBpbi11c2UgY291bnRlcnMsIGBzd2FwX2RldmljZV9pbnVzZV9hZGRgIGFuZCBgc3dhcF9kZXZpY2VfaW51c2Vfc3ViYCwgYXJlIGNydWNpYWwgZm9yIGVuc3VyaW5nIGNvcnJlY3RuZXNzIGFzIHdlbGwgYXMgdGhlIGxpc3QgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBgYWRkX3RvX2F2YWlsX2xpc3RgLCBgZGVsX2Zyb21fYXZhaWxfbGlzdGAsIGBzd2FwX3F1ZXVlX21hc2tgLCBgc3dhcF9xdWV1ZV91bm1hc2tgIGFuZCBgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5YCBhcmUgYWxzbyBlc3NlbnRpYWwuCgpJJiMzOTttIGZpbHRlcmluZyBvdXQgYGZvbGlvX2FsbG9jX3N3YXBgLCBhcyBpbnRlcmVzdGluZyBhcyBpdCBtYXkgYmUsIGJlY2F1c2UgSSBzdXNwZWN0IGl0IGlzIGEgbW9yZSBnZW5lcmljIGhvdCBwYXRoLCB3aGljaCwgd2hpbGUgaW1wb3J0YW50IGZvciBwZXJmb3JtYW5jZSwgd29uJiMzOTt0IG5lY2Vzc2FyaWx5IGV4cG9zZSB0aGUgY29yZSBsb2dpYyBjaGFuZ2VzIEkmIzM5O20gYWZ0ZXIuIGBzd2FwX2FsbG9jX2VudHJ5YCBsb29rcyBsaWtlIGEgYmV0dGVyIHRhcmdldC4KCk5vdywgbGV0JiMzOTtzIGNvbmZpcm0gdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gYENPTkZJR19TV0FQYCBzZWVtcyB0byBiZSB0aGUgbWFpbiBkcml2ZXIuIEkmIzM5O20gcXVpY2tseSB2ZXJpZnlpbmcgdGhhdCBgbW0vc3dhcGZpbGUuY2AgaXMgY29tcGlsZWQgd2hlbiB0aGF0JiMzOTtzIGVuYWJsZWQuIFllcCwgdGhhdCBjb25maXJtcyBpdC4KClRoZXJlZm9yZSwgZm9yIHRoaXMgZnV6emluZyBlZmZvcnQsIEkmIzM5O20gZ29pbmcgdG8gc2V0IGBXb3J0aEZ1enppbmdgIHRvIGB0cnVlYCBnaXZlbiB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UgYW5kIGl0cyBpbXBhY3Qgb24gY29yZSBrZXJuZWwgc3dhcCBsb2dpYy4gVGhlIGBGb2N1c1N5bWJvbHNgIGFyZToKCiogICBgc3dhcF9hbGxvY19lbnRyeWAKKiAgIGBzd2FwX3F1ZXVlX2FkZGAKKiAgIGBzd2FwX3F1ZXVlX2RlbGAKKiAgIGBzd2FwX3F1ZXVlX2dldF9kZXZpY2VgCiogICBgc3dhcF9kZXZpY2VfZW5hYmxlYAoqICAgYHN3YXBfZGV2aWNlX2Rpc2FibGVgCiogICBgc3dhcF9kZXZpY2VfaW51c2VfYWRkYAoqICAgYHN3YXBfZGV2aWNlX2ludXNlX3N1YmAKKiAgIGBhZGRfdG9fYXZhaWxfbGlzdGAKKiAgIGBkZWxfZnJvbV9hdmFpbF9saXN0YAoqICAgYHN3YXBfcXVldWVfbWFza2AKKiAgIGBzd2FwX3F1ZXVlX3VubWFza2AKKiAgIGBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnlgCgpBbmQgSSYjMzk7bGwgZW5hYmxlIG9ubHkgYFNXQVBgIHRvIGJ1aWxkIHRoZSBrZXJuZWwgaW1hZ2UuCk15IHJlYXNvbmluZyBpcyB0aGF0IHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBuZXcgcm91bmQtcm9iaW4gcXVldWUsIGFuZCBpdHMgYXNzb2NpYXRlZCBtYW5hZ2VtZW50IGZ1bmN0aW9ucywgaW50cm9kdWNlcyBuZXcgY29kZSB0aGF0IG5lZWRzIGNhcmVmdWwgZnV6emluZy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHdpdGggdGhlIHBvdGVudGlhbCBmb3Igc3VidGxlIGJ1Z3MgaW4gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAwMDo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3N3YXBfYWxsb2NfZW50cnkmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9hZGQmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9kZWwmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9nZXRfZGV2aWNlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2VuYWJsZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9kaXNhYmxlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2ludXNlX2FkZCYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9pbnVzZV9zdWImIzM0OywKICAgICYjMzQ7YWRkX3RvX2F2YWlsX2xpc3QmIzM0OywKICAgICYjMzQ7ZGVsX2Zyb21fYXZhaWxfbGlzdCYjMzQ7LAogICAgJiMzNDtzd2FwX3F1ZXVlX21hc2smIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV91bm1hc2smIzM0OywKICAgICYjMzQ7Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3N3YXBfYWxsb2NfZW50cnkmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9hZGQmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9kZWwmIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV9nZXRfZGV2aWNlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2VuYWJsZSYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9kaXNhYmxlJiMzNDssCiAgICAmIzM0O3N3YXBfZGV2aWNlX2ludXNlX2FkZCYjMzQ7LAogICAgJiMzNDtzd2FwX2RldmljZV9pbnVzZV9zdWImIzM0OywKICAgICYjMzQ7YWRkX3RvX2F2YWlsX2xpc3QmIzM0OywKICAgICYjMzQ7ZGVsX2Zyb21fYXZhaWxfbGlzdCYjMzQ7LAogICAgJiMzNDtzd2FwX3F1ZXVlX21hc2smIzM0OywKICAgICYjMzQ7c3dhcF9xdWV1ZV91bm1hc2smIzM0OywKICAgICYjMzQ7Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQzOjQ1LjU2MTY1ODc5N1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3ODg2MTY2MzYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzd2FwX2FsbG9jX2VudHJ5XCIsXG4gICAgXCJzd2FwX3F1ZXVlX2FkZFwiLFxuICAgIFwic3dhcF9xdWV1ZV9kZWxcIixcbiAgICBcInN3YXBfcXVldWVfZ2V0X2RldmljZVwiLFxuICAgIFwic3dhcF9kZXZpY2VfZW5hYmxlXCIsXG4gICAgXCJzd2FwX2RldmljZV9kaXNhYmxlXCIsXG4gICAgXCJzd2FwX2RldmljZV9pbnVzZV9hZGRcIixcbiAgICBcInN3YXBfZGV2aWNlX2ludXNlX3N1YlwiLFxuICAgIFwiYWRkX3RvX2F2YWlsX2xpc3RcIixcbiAgICBcImRlbF9mcm9tX2F2YWlsX2xpc3RcIixcbiAgICBcInN3YXBfcXVldWVfbWFza1wiLFxuICAgIFwic3dhcF9xdWV1ZV91bm1hc2tcIixcbiAgICBcImNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMDA6NDM6NDUuNTYxNjcyNzg3WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1Mjg0NDQxMjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5ZjM0OTM2NWUwZWIxZmUyMTI4YTg0ODRiYjRjYTY1MWYxZGJkMmEyXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgSnVsIDE0IDAwOjQzOjQ0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxpc3QuaCBiL2luY2x1ZGUvbGludXgvcGxpc3QuaFxcbmluZGV4IDE2Y2Y0MzU1YjVjMTMxLi43M2QzNTljMWEwNTM2YSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BsaXN0LmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BsaXN0LmhcXG5AQCAtMTMyLDggKzEzMiw2IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwbGlzdF9ub2RlX2luaXQoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIGludCBwcmlvKVxcbiBleHRlcm4gdm9pZCBwbGlzdF9hZGQoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKTtcXG4gZXh0ZXJuIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XFxuIFxcbi1leHRlcm4gdm9pZCBwbGlzdF9yZXF1ZXVlKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XFxuLVxcbiAvKipcXG4gICogcGxpc3RfZm9yX2VhY2ggLSBpdGVyYXRlIG92ZXIgdGhlIHBsaXN0XFxuICAqIEBwb3M6XFx0dGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXJcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxcbmluZGV4IDY5NmVkMDE3MDljMmJhLi4wNDc2NzU0MDk3MmI4MSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oXFxuQEAgLTE5NCw2ICsxOTQsMjIgQEAgc3RydWN0IHN3YXBfZXh0ZW50IHtcXG4gXFx0KChvZmZzZXRvZih1bmlvbiBzd2FwX2hlYWRlciwgbWFnaWMubWFnaWMpIC0gXFxcXFxcbiBcXHQgIG9mZnNldG9mKHVuaW9uIHN3YXBfaGVhZGVyLCBpbmZvLmJhZHBhZ2VzKSkgLyBzaXplb2YoaW50KSlcXG4gXFxuKy8qXFxuKyAqIFN3YXAgZGV2aWNlIGZsYWdzLCBleGNlcHQgdGhlIG9uZXMgZG9jdW1lbnRlZCBiZWxvdywgYWxsIGFyZSBpbW11dGFibGVcXG4rICogYWZ0ZXIgZXhwb3NlZCBieSBzd2FwX2RldmljZV9lbmFibGUsIGFuZCB1bnRpbCB0aGUgZGV2aWNlIGlzIGZyZWVkIGFnYWluXFxuKyAqIChTV1BfVVNFRCB1bnNldCkuIFRoZSBleGNlcHRpb25zIGFyZSBhbGwgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbTpcXG4rICogLSBTV1BfVVNFRDogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIHRoZSBkZXZpY2UgaXMgaW51c2UuIE9uY2VcXG4rICogICBzZXQsIHdvbid0IGJlIGNsZWFyZWQgdW5sZXNzIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBkZXZpY2UgaXMgZnJlZWQgYW5kXFxuKyAqICAgc3dhcG9mZiBmaW5pc2hlZC5cXG4rICogLSBTV1BfV1JJVEVPSzogUHJvdGVjdGVkIGJ5IGJvdGggc3dhcG9uX3J3c2VtIGFuZCBzd2FwX2F2YWlsX2xvY2ssIGNsZWFyaW5nXFxuKyAqICAgdGhpcyBmbGFnIGFsc28gd2FpdHMgZm9yIGFsbCBjdXJyZW50IGNsdXN0ZXIgbG9jayB1c2VycyB0byBleGl0IHNvXFxuKyAqICAgY2hlY2tpbmcgdGhpcyBmbGFnIHdoaWxlIGhvbGRpbmcgYW55IG9mIHRoZXNlIGxvY2tzIGVuc3VyZXMgdGhlIGRldmljZVxcbisgKiAgIGlzIHNhZmUgdG8gdXNlIGF0IHRoZSBtb21lbnQuIE5vdGU6IGNsZWFyaW5nIHRoaXMgZmxhZyBkb2Vzbid0IGFmZmVjdFxcbisgKiAgIHBlbmRpbmcgSU8gb3IgYXN5bmMgcmVxdWVzdHMsIGl0IG9ubHkgcHJldmVudHMgZnVydGhlciBlbnRyeSBhbGxvY2F0aW9uXFxuKyAqICAgb3IgbmV3IGFzeW5jIHJlcXVlc3QgKGUuZy4gZGlzY2FyZCkgZnJvbSBpbml0aWF0aW5nLlxcbisgKiAtIFNXUF9ISUJFUk5BVElPTjogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIGlmIHRoZSBkZXZpY2VcXG4rICogICBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uLlxcbisgKi9cXG4gZW51bSB7XFxuIFxcdFNXUF9VU0VEXFx0PSAoMSBcXHUwMDNjXFx1MDAzYyAwKSxcXHQvKiBpcyBzbG90IGluIHN3YXBfaW5mb1tdIHVzZWQ/ICovXFxuIFxcdFNXUF9XUklURU9LXFx0PSAoMSBcXHUwMDNjXFx1MDAzYyAxKSxcXHQvKiBvayB0byB3cml0ZSB0byB0aGlzIHN3YXA/XFx0Ki9cXG5AQCAtMjMwLDEwICsyNDYsMTcgQEAgZW51bSB7XFxuICNlbmRpZlxcbiBcXG4gLypcXG4tICogV2Uga2VlcCB1c2luZyBzYW1lIGNsdXN0ZXIgZm9yIHJvdGF0aW9uYWwgZGV2aWNlIHNvIElPIHdpbGwgYmUgc2VxdWVudGlhbC5cXG4tICogVGhlIHB1cnBvc2UgaXMgdG8gb3B0aW1pemUgU1dBUCB0aHJvdWdocHV0IG9uIHRoZXNlIGRldmljZS5cXG4rICogV2UgYXNzaWduIGEgY2x1c3RlciB0byBlYWNoIENQVSwgc28gZWFjaCBDUFUgY2FuIGFsbG9jYXRlIHN3YXAgZW50cnkgZnJvbVxcbisgKiBpdHMgb3duIGNsdXN0ZXIgYW5kIHN3YXBvdXQgc2VxdWVudGlhbGx5LiBUaGUgcHVycG9zZSBpcyB0byBvcHRpbWl6ZSBzd2Fwb3V0XFxuKyAqIHRocm91Z2hwdXQuXFxuICAqL1xcbitzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIge1xcbitcXHRsb2NhbF9sb2NrX3QgbG9jazsgLyogUHJvdGVjdCB0aGUgcGVyY3B1X2NsdXN0ZXIgYWJvdmUgKi9cXG4rXFx0dW5zaWduZWQgaW50IG5leHRbU1dBUF9OUl9PUkRFUlNdOyAvKiBMaWtlbHkgbmV4dCBhbGxvY2F0aW9uIG9mZnNldCAqL1xcbit9O1xcbitcXG4gc3RydWN0IHN3YXBfc2VxdWVudGlhbF9jbHVzdGVyIHtcXG4rXFx0c3BpbmxvY2tfdCBsb2NrOyAvKiBTZXJpYWxpemUgdXNhZ2Ugb2YgZ2xvYmFsIGNsdXN0ZXIgKi9cXG4gXFx0dW5zaWduZWQgaW50IG5leHRbU1dBUF9OUl9PUkRFUlNdOyAvKiBMaWtlbHkgbmV4dCBhbGxvY2F0aW9uIG9mZnNldCAqL1xcbiB9O1xcbiBcXG5AQCAtMjQ0LDcgKzI2Nyw2IEBAIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHtcXG4gXFx0c3RydWN0IHBlcmNwdV9yZWYgdXNlcnM7XFx0LyogaW5kaWNhdGUgYW5kIGtlZXAgc3dhcCBkZXZpY2UgdmFsaWQuICovXFxuIFxcdHVuc2lnbmVkIGxvbmdcXHRmbGFncztcXHRcXHQvKiBTV1BfVVNFRCBldGM6IHNlZSBhYm92ZSAqL1xcbiBcXHRzaWduZWQgc2hvcnRcXHRwcmlvO1xcdFxcdC8qIHN3YXAgcHJpb3JpdHkgb2YgdGhpcyB0eXBlICovXFxuLVxcdHN0cnVjdCBwbGlzdF9ub2RlIGxpc3Q7XFx0XFx0LyogZW50cnkgaW4gc3dhcF9hY3RpdmVfaGVhZCAqL1xcbiBcXHRzaWduZWQgY2hhclxcdHR5cGU7XFx0XFx0Lyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqL1xcbiBcXHR1bnNpZ25lZCBpbnRcXHRtYXg7XFx0XFx0Lyogc2l6ZSBvZiB0aGlzIHN3YXAgZGV2aWNlICovXFxuIFxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvOyAvKiBjbHVzdGVyIGluZm8uIE9ubHkgZm9yIFNTRCAqL1xcbkBAIC0yNTYsMjYgKzI3OCwyMCBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7XFxuIFxcdFxcdFxcdFxcdFxcdC8qIGxpc3Qgb2YgY2x1c3RlciB0aGF0IGFyZSBmcmFnbWVudGVkIG9yIGNvbnRlbnRlZCAqL1xcbiBcXHR1bnNpZ25lZCBpbnQgcGFnZXM7XFx0XFx0LyogdG90YWwgb2YgdXNhYmxlIHBhZ2VzIG9mIHN3YXAgKi9cXG4gXFx0YXRvbWljX2xvbmdfdCBpbnVzZV9wYWdlcztcXHQvKiBudW1iZXIgb2YgdGhvc2UgY3VycmVudGx5IGluIHVzZSAqL1xcbitcXHRzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXJcXHRfX3BlcmNwdSAqcGVyY3B1X2NsdXN0ZXI7IC8qIHBlciBjcHUncyBzd2FwIGxvY2F0aW9uICovXFxuIFxcdHN0cnVjdCBzd2FwX3NlcXVlbnRpYWxfY2x1c3RlciAqZ2xvYmFsX2NsdXN0ZXI7IC8qIFVzZSBvbmUgZ2xvYmFsIGNsdXN0ZXIgZm9yIHJvdGF0aW5nIGRldmljZSAqL1xcbi1cXHRzcGlubG9ja190IGdsb2JhbF9jbHVzdGVyX2xvY2s7XFx0LyogU2VyaWFsaXplIHVzYWdlIG9mIGdsb2JhbCBjbHVzdGVyICovXFxuIFxcdHN0cnVjdCByYl9yb290IHN3YXBfZXh0ZW50X3Jvb3Q7Lyogcm9vdCBvZiB0aGUgc3dhcCBleHRlbnQgcmJ0cmVlICovXFxuIFxcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XFx0Lyogc3dhcCBkZXZpY2Ugb3IgYmRldiBvZiBzd2FwIGZpbGUgKi9cXG4gXFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZTtcXHRcXHQvKiBzZWxkb20gcmVmZXJlbmNlZCAqL1xcbiBcXHRzdHJ1Y3QgY29tcGxldGlvbiBjb21wO1xcdFxcdC8qIHNlbGRvbSByZWZlcmVuY2VkICovXFxuIFxcdHNwaW5sb2NrX3QgbG9jaztcXHRcXHQvKlxcbi1cXHRcXHRcXHRcXHRcXHQgKiBwcm90ZWN0IG1hcCBzY2FuIHJlbGF0ZWQgZmllbGRzIGxpa2VcXG4tXFx0XFx0XFx0XFx0XFx0ICogaW51c2VfcGFnZXMgYW5kIGFsbCBjbHVzdGVyIGxpc3RzLlxcbi1cXHRcXHRcXHRcXHRcXHQgKiBPdGhlciBmaWVsZHMgYXJlIG9ubHkgY2hhbmdlZFxcbi1cXHRcXHRcXHRcXHRcXHQgKiBhdCBzd2Fwb24vc3dhcG9mZiwgc28gYXJlIHByb3RlY3RlZFxcbi1cXHRcXHRcXHRcXHRcXHQgKiBieSBzd2FwX2xvY2suIGNoYW5naW5nIGZsYWdzIG5lZWRcXG4tXFx0XFx0XFx0XFx0XFx0ICogaG9sZCB0aGlzIGxvY2sgYW5kIHN3YXBfbG9jay4gSWZcXG4tXFx0XFx0XFx0XFx0XFx0ICogYm90aCBsb2NrcyBuZWVkIGhvbGQsIGhvbGQgc3dhcF9sb2NrXFxuLVxcdFxcdFxcdFxcdFxcdCAqIGZpcnN0LlxcbitcXHRcXHRcXHRcXHRcXHQgKiBQcm90ZWN0IGNsdXN0ZXIgbGlzdHMuIE90aGVyIGZpZWxkc1xcbitcXHRcXHRcXHRcXHRcXHQgKiBhcmUgb25seSBjaGFuZ2VkIGF0IHN3YXBvbi9zd2Fwb2ZmLFxcbitcXHRcXHRcXHRcXHRcXHQgKiBzbyBhcmUgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS5cXG4gXFx0XFx0XFx0XFx0XFx0ICovXFxuIFxcdHN0cnVjdCB3b3JrX3N0cnVjdCBkaXNjYXJkX3dvcms7IC8qIGRpc2NhcmQgd29ya2VyICovXFxuIFxcdHN0cnVjdCB3b3JrX3N0cnVjdCByZWNsYWltX3dvcms7IC8qIHJlY2xhaW0gd29ya2VyICovXFxuIFxcdHN0cnVjdCBsaXN0X2hlYWQgZGlzY2FyZF9jbHVzdGVyczsgLyogZGlzY2FyZCBjbHVzdGVycyBsaXN0ICovXFxuLVxcdHN0cnVjdCBwbGlzdF9ub2RlIGF2YWlsX2xpc3Q7ICAgLyogZW50cnkgaW4gc3dhcF9hdmFpbF9oZWFkICovXFxuIH07XFxuIFxcbiBzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IHBhZ2Vfc3dhcF9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSlcXG5kaWZmIC0tZ2l0IGEvbGliL3BsaXN0LmMgYi9saWIvcGxpc3QuY1xcbmluZGV4IGE1YmVmMzhhZGQ0MzFkLi5iMDVhZTdmZmVhODdlOCAxMDA2NDRcXG4tLS0gYS9saWIvcGxpc3QuY1xcbisrKyBiL2xpYi9wbGlzdC5jXFxuQEAgLTE0Miw1OCArMTQyLDYgQEAgdm9pZCBwbGlzdF9kZWwoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKVxcbiBcXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xcbiB9XFxuIFxcbi0vKipcXG4tICogcGxpc3RfcmVxdWV1ZSAtIFJlcXVldWUgQG5vZGUgYXQgZW5kIG9mIHNhbWUtcHJpbyBlbnRyaWVzLlxcbi0gKlxcbi0gKiBUaGlzIGlzIGVzc2VudGlhbGx5IGFuIG9wdGltaXplZCBwbGlzdF9kZWwoKSBmb2xsb3dlZCBieVxcbi0gKiBwbGlzdF9hZGQoKS4gIEl0IG1vdmVzIGFuIGVudHJ5IGFscmVhZHkgaW4gdGhlIHBsaXN0IHRvXFxuLSAqIGFmdGVyIGFueSBvdGhlciBzYW1lLXByaW9yaXR5IGVudHJpZXMuXFxuLSAqXFxuLSAqIEBub2RlOlxcdFxcdTAwMjZzdHJ1Y3QgcGxpc3Rfbm9kZSBwb2ludGVyIC0gZW50cnkgdG8gYmUgbW92ZWRcXG4tICogQGhlYWQ6XFx0XFx1MDAyNnN0cnVjdCBwbGlzdF9oZWFkIHBvaW50ZXIgLSBsaXN0IGhlYWRcXG4tICovXFxuLXZvaWQgcGxpc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpXFxuLXtcXG4tXFx0c3RydWN0IHBsaXN0X25vZGUgKml0ZXI7XFxuLVxcdHN0cnVjdCBsaXN0X2hlYWQgKm5vZGVfbmV4dCA9IFxcdTAwMjZoZWFkLVxcdTAwM2Vub2RlX2xpc3Q7XFxuLVxcbi1cXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xcbi1cXHRCVUdfT04ocGxpc3RfaGVhZF9lbXB0eShoZWFkKSk7XFxuLVxcdEJVR19PTihwbGlzdF9ub2RlX2VtcHR5KG5vZGUpKTtcXG4tXFxuLVxcdGlmIChub2RlID09IHBsaXN0X2xhc3QoaGVhZCkpXFxuLVxcdFxcdHJldHVybjtcXG4tXFxuLVxcdGl0ZXIgPSBwbGlzdF9uZXh0KG5vZGUpO1xcbi1cXG4tXFx0aWYgKG5vZGUtXFx1MDAzZXByaW8gIT0gaXRlci1cXHUwMDNlcHJpbylcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXG4tXFx0cGxpc3RfZGVsKG5vZGUsIGhlYWQpO1xcbi1cXG4tXFx0LypcXG4tXFx0ICogQWZ0ZXIgcGxpc3RfZGVsKCksIGl0ZXIgaXMgdGhlIHJlcGxhY2VtZW50IG9mIHRoZSBub2RlLiAgSWYgdGhlIG5vZGVcXG4tXFx0ICogd2FzIG9uIHByaW9fbGlzdCwgdGFrZSBzaG9ydGN1dCB0byBmaW5kIG5vZGVfbmV4dCBpbnN0ZWFkIG9mIGxvb3BpbmcuXFxuLVxcdCAqL1xcbi1cXHRpZiAoIWxpc3RfZW1wdHkoXFx1MDAyNml0ZXItXFx1MDAzZXByaW9fbGlzdCkpIHtcXG4tXFx0XFx0aXRlciA9IGxpc3RfZW50cnkoaXRlci1cXHUwMDNlcHJpb19saXN0Lm5leHQsIHN0cnVjdCBwbGlzdF9ub2RlLFxcbi1cXHRcXHRcXHRcXHQgIHByaW9fbGlzdCk7XFxuLVxcdFxcdG5vZGVfbmV4dCA9IFxcdTAwMjZpdGVyLVxcdTAwM2Vub2RlX2xpc3Q7XFxuLVxcdFxcdGdvdG8gcXVldWU7XFxuLVxcdH1cXG4tXFxuLVxcdHBsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlKGl0ZXIsIGhlYWQpIHtcXG4tXFx0XFx0aWYgKG5vZGUtXFx1MDAzZXByaW8gIT0gaXRlci1cXHUwMDNlcHJpbykge1xcbi1cXHRcXHRcXHRub2RlX25leHQgPSBcXHUwMDI2aXRlci1cXHUwMDNlbm9kZV9saXN0O1xcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0fVxcbi1cXHR9XFxuLXF1ZXVlOlxcbi1cXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZub2RlLVxcdTAwM2Vub2RlX2xpc3QsIG5vZGVfbmV4dCk7XFxuLVxcbi1cXHRwbGlzdF9jaGVja19oZWFkKGhlYWQpO1xcbi19XFxuLVxcbiAjaWZkZWYgQ09ORklHX0RFQlVHX1BMSVNUXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQvY2xvY2suaFxcdTAwM2VcXG5AQCAtMjMxLDE0ICsxNzksNiBAQCBzdGF0aWMgdm9pZCBfX2luaXQgcGxpc3RfdGVzdF9jaGVjayhpbnQgbnJfZXhwZWN0KVxcbiBcXHRCVUdfT04ocHJpb19wb3MtXFx1MDAzZXByaW9fbGlzdC5uZXh0ICE9IFxcdTAwMjZmaXJzdC1cXHUwMDNlcHJpb19saXN0KTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX19pbml0IHBsaXN0X3Rlc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSlcXG4te1xcbi1cXHRwbGlzdF9yZXF1ZXVlKG5vZGUsIFxcdTAwMjZ0ZXN0X2hlYWQpO1xcbi1cXG4tXFx0aWYgKG5vZGUgIT0gcGxpc3RfbGFzdChcXHUwMDI2dGVzdF9oZWFkKSlcXG4tXFx0XFx0QlVHX09OKG5vZGUtXFx1MDAzZXByaW8gPT0gcGxpc3RfbmV4dChub2RlKS1cXHUwMDNlcHJpbyk7XFxuLX1cXG4tXFxuIHN0YXRpYyBpbnQgIF9faW5pdCBwbGlzdF90ZXN0KHZvaWQpXFxuIHtcXG4gXFx0aW50IG5yX2V4cGVjdCA9IDAsIGksIGxvb3A7XFxuQEAgLTI2MiwxMCArMjAyLDYgQEAgc3RhdGljIGludCAgX19pbml0IHBsaXN0X3Rlc3Qodm9pZClcXG4gXFx0XFx0XFx0bnJfZXhwZWN0LS07XFxuIFxcdFxcdH1cXG4gXFx0XFx0cGxpc3RfdGVzdF9jaGVjayhucl9leHBlY3QpO1xcbi1cXHRcXHRpZiAoIXBsaXN0X25vZGVfZW1wdHkodGVzdF9ub2RlICsgaSkpIHtcXG4tXFx0XFx0XFx0cGxpc3RfdGVzdF9yZXF1ZXVlKHRlc3Rfbm9kZSArIGkpO1xcbi1cXHRcXHRcXHRwbGlzdF90ZXN0X2NoZWNrKG5yX2V4cGVjdCk7XFxuLVxcdFxcdH1cXG4gXFx0fVxcbiBcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUodGVzdF9ub2RlKTsgaSsrKSB7XFxuZGlmZiAtLWdpdCBhL21tL3N3YXAuaCBiL21tL3N3YXAuaFxcbmluZGV4IGI1MWFkMzA3MWE3MzA4Li4wOGE3ODJmM2Q1YWNkMiAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwLmhcXG4rKysgYi9tbS9zd2FwLmhcXG5AQCAtOTEsMTYgKzkxLDE2IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHN3cF9jbHVzdGVyX29mZnNldChzd3BfZW50cnlfdCBlbnRyeSlcXG4gICovXFxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKl9fc3dhcF90eXBlX3RvX2luZm8oaW50IHR5cGUpXFxuIHtcXG4tXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xcbi1cXG4tXFx0c2kgPSBSRUFEX09OQ0Uoc3dhcF9pbmZvW3R5cGVdKTsgLyogcmN1X2RlcmVmZXJlbmNlKCkgKi9cXG4tXFx0Vk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybyhcXHUwMDI2c2ktXFx1MDAzZXVzZXJzKSk7IC8qIHJhY2Ugd2l0aCBzd2Fwb2ZmICovXFxuLVxcdHJldHVybiBzaTtcXG4rXFx0cmV0dXJuIFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqL1xcbiB9XFxuIFxcbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpfX3N3YXBfZW50cnlfdG9faW5mbyhzd3BfZW50cnlfdCBlbnRyeSlcXG4ge1xcbi1cXHRyZXR1cm4gX19zd2FwX3R5cGVfdG9faW5mbyhzd3BfdHlwZShlbnRyeSkpO1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuK1xcbitcXHRzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTsgLyogcmN1X2RlcmVmZXJlbmNlKCkgKi9cXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybyhcXHUwMDI2c2ktXFx1MDAzZXVzZXJzKSk7IC8qIHJhY2Ugd2l0aCBzd2Fwb2ZmICovXFxuK1xcdHJldHVybiBzaTtcXG4gfVxcbiBcXG4gc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKl9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihcXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmNcXG5pbmRleCA3NzVjMzg1NDkwYTVmYS4uZjkzODYzMzA5YTVhNTAgMTAwNjQ0XFxuLS0tIGEvbW0vc3dhcGZpbGUuY1xcbisrKyBiL21tL3N3YXBmaWxlLmNcXG5AQCAtNDEsNyArNDEsNiBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGxldGlvbi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc3VzcGVuZC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvenN3YXAuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BsaXN0LmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL3RsYmZsdXNoLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9sZWFmb3BzLmhcXHUwMDNlXFxuQEAgLTQ5LDMxICs0OCwzOCBAQFxcbiAjaW5jbHVkZSBcXFwiaW50ZXJuYWwuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInN3YXAuaFxcXCJcXG4gXFxuLXN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbi1cXHRcXHRcXHQgICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKTtcXG4rc3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4rXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcyk7XFxuIHN0YXRpYyBib29sIGZvbGlvX3N3YXBjYWNoZV9mcmVlYWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG4gc3RhdGljIHZvaWQgbW92ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0XFx0XFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuIFxcdFxcdFxcdCBlbnVtIHN3YXBfY2x1c3Rlcl9mbGFncyBuZXdfZmxhZ3MpO1xcbitzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpO1xcbiBcXG4gLypcXG4tICogUHJvdGVjdHMgdGhlIHN3YXBfaW5mbyBhcnJheSwgYW5kIHRoZSBTV1BfVVNFRCBmbGFnLiBzd2FwX2luZm8gY29udGFpbnNcXG4tICogbGF6aWx5IGFsbG9jYXRlZCBcXHUwMDI2IGZyZWVkIHN3YXAgZGV2aWNlIGluZm8gc3RydXRzLCBhbmQgU1dQX1VTRUQgaW5kaWNhdGVzXFxuLSAqIHdoaWNoIGRldmljZSBpcyB1c2VkLCB+U1dQX1VTRUQgZGV2aWNlcyBhbmQgY2FuIGJlIHJldXNlZC5cXG4tICpcXG4tICogQWxzbyBwcm90ZWN0cyBzd2FwX2FjdGl2ZV9oZWFkIHRvdGFsX3N3YXBfcGFnZXMsIGFuZCB0aGUgU1dQX1dSSVRFT0sgZmxhZy5cXG4rICogU2VyaWFsaXplcyBzd2Fwb24vc3dhcG9mZiAod3JpdGVycykgYW5kIHByb3RlY3RzIHRoZSBzd2FwX2luZm9cXG4rICogYXJyYXksIG5yX3N3YXBmaWxlcywgdG90YWxfc3dhcF9wYWdlcywgYW5kIHBhcnQgb2Ygc3dhcCBkZXZpY2VcXG4rICogaW5mbyBjb250ZW50IChzZWUgY29tbWVudCBvZiBzd2FwX2luZm9fc3RydWN0KS4gIFJlYWRlcnNcXG4rICogKGFsbG9jYXRpb24sIC9wcm9jL3N3YXBzLCBldGMuKSB0YWtlIHBlcmNwdV9kb3duX3JlYWQoKSB3aGljaFxcbisgKiBpcyBjaGVhcCBhcyB0aGUgaG90IHBhdGguXFxuKyAqL1xcbitERUZJTkVfU1RBVElDX1BFUkNQVV9SV1NFTShzd2Fwb25fcndzZW0pO1xcbisvKlxcbisgKiBzd2FwX2luZm8gY29udGFpbnMgbGF6aWx5IGFsbG9jYXRlZCBzd2FwIGRldmljZSBpbmZvIHN0cnVjdHMsIGFuZFxcbisgKiBTV1BfVVNFRCBpbmRpY2F0ZXMgd2hpY2ggZGV2aWNlIGlzIHVzZWQsIH5TV1BfVVNFRCBkZXZpY2VzIGNhbiBiZVxcbisgKiByZXVzZWQuIFByb3RlY3RlZCBieSBzd2Fwb25fcndzZW0sIGJ1dCByZWFkaW5nIGNvdWxkIGJlIGxvY2tsZXNzLlxcbiAgKi9cXG4tc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spO1xcbitzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9pbmZvW01BWF9TV0FQRklMRVNdO1xcbiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3N3YXBmaWxlcztcXG4tYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xcbitsb25nIHRvdGFsX3N3YXBfcGFnZXM7XFxuK1xcbiAvKlxcbiAgKiBTb21lIG1vZHVsZXMgdXNlIHN3YXBwYWJsZSBvYmplY3RzIGFuZCBtYXkgdHJ5IHRvIHN3YXAgdGhlbSBvdXQgdW5kZXJcXG4gICogbWVtb3J5IHByZXNzdXJlICh2aWEgdGhlIHNocmlua2VyKS4gQmVmb3JlIGRvaW5nIHNvLCB0aGV5IG1heSB3aXNoIHRvXFxuICAqIGNoZWNrIHRvIHNlZSBpZiBhbnkgc3dhcCBzcGFjZSBpcyBhdmFpbGFibGUuXFxuICAqL1xcbithdG9taWNfbG9uZ190IG5yX3N3YXBfcGFnZXM7XFxuIEVYUE9SVF9TWU1CT0xfR1BMKG5yX3N3YXBfcGFnZXMpO1xcbi0vKiBwcm90ZWN0ZWQgd2l0aCBzd2FwX2xvY2suIHJlYWRpbmcgaW4gdm1fc3dhcF9mdWxsKCkgZG9lc24ndCBuZWVkIGxvY2sgKi9cXG4tbG9uZyB0b3RhbF9zd2FwX3BhZ2VzO1xcbiAjZGVmaW5lIERFRl9TV0FQX1BSSU8gIC0xXFxuIHVuc2lnbmVkIGxvbmcgc3dhcGZpbGVfbWF4aW11bV9zaXplO1xcbiAjaWZkZWYgQ09ORklHX01JR1JBVElPTlxcbkBAIC04Myw1MiArODksNDIgQEAgYm9vbCBzd2FwX21pZ3JhdGlvbl9hZF9zdXBwb3J0ZWQ7XFxuIHN0YXRpYyBjb25zdCBjaGFyIEJhZF9maWxlW10gPSBcXFwiQmFkIHN3YXAgZmlsZSBlbnRyeSBcXFwiO1xcbiBzdGF0aWMgY29uc3QgY2hhciBCYWRfb2Zmc2V0W10gPSBcXFwiQmFkIHN3YXAgb2Zmc2V0IGVudHJ5IFxcXCI7XFxuIFxcbi0vKlxcbi0gKiBhbGwgYWN0aXZlIHN3YXBfaW5mb19zdHJ1Y3RzXFxuLSAqIHByb3RlY3RlZCB3aXRoIHN3YXBfbG9jaywgYW5kIG9yZGVyZWQgYnkgcHJpb3JpdHkuXFxuLSAqL1xcbi1zdGF0aWMgUExJU1RfSEVBRChzd2FwX2FjdGl2ZV9oZWFkKTtcXG4rc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqX19zd2FwX2l0ZXIoaW50ICppLCB1bnNpZ25lZCBsb25nIGZsYWcpXFxuK3tcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0d2hpbGUgKCppIFxcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XFxuK1xcdFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oKmkpO1xcbitcXG4rXFx0XFx0Vk1fV0FSTl9PTighc2kpO1xcbitcXHRcXHQoKmkpKys7XFxuK1xcdFxcdGlmIChmbGFnIFxcdTAwMjZcXHUwMDI2ICEoKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IGZsYWcpID09IGZsYWcpKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0cmV0dXJuIHNpO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisjZGVmaW5lIF9fZm9yX2VhY2hfc3dhcChzaSwgZmxhZylcXHRcXHRcXHRcXFxcXFxuK1xcdGZvciAoaW50IF9faSA9IDA7ICgoc2kpID0gX19zd2FwX2l0ZXIoXFx1MDAyNl9faSwgZmxhZykpOylcXG4gXFxuIC8qXFxuLSAqIGFsbCBhdmFpbGFibGUgKGFjdGl2ZSwgbm90IGZ1bGwpIHN3YXBfaW5mb19zdHJ1Y3RzXFxuLSAqIHByb3RlY3RlZCB3aXRoIHN3YXBfYXZhaWxfbG9jaywgb3JkZXJlZCBieSBwcmlvcml0eS5cXG4tICogVGhpcyBpcyB1c2VkIGJ5IGZvbGlvX2FsbG9jX3N3YXAoKSBpbnN0ZWFkIG9mIHN3YXBfYWN0aXZlX2hlYWRcXG4tICogYmVjYXVzZSBzd2FwX2FjdGl2ZV9oZWFkIGluY2x1ZGVzIGFsbCBzd2FwX2luZm9fc3RydWN0cyxcXG4tICogYnV0IGZvbGlvX2FsbG9jX3N3YXAoKSBkb2Vzbid0IG5lZWQgdG8gbG9vayBhdCBmdWxsIG9uZXMuXFxuLSAqIFRoaXMgdXNlcyBpdHMgb3duIGxvY2sgaW5zdGVhZCBvZiBzd2FwX2xvY2sgYmVjYXVzZSB3aGVuIGFcXG4tICogc3dhcF9pbmZvX3N0cnVjdCBjaGFuZ2VzIGJldHdlZW4gbm90LWZ1bGwvZnVsbCwgaXQgbmVlZHMgdG9cXG4tICogYWRkL3JlbW92ZSBpdHNlbGYgdG8vZnJvbSB0aGlzIGxpc3QsIGJ1dCB0aGUgc3dhcF9pbmZvX3N0cnVjdC1cXHUwMDNlbG9ja1xcbi0gKiBpcyBoZWxkIGFuZCB0aGUgbG9ja2luZyBvcmRlciByZXF1aXJlcyBzd2FwX2xvY2sgdG8gYmUgdGFrZW5cXG4tICogYmVmb3JlIGFueSBzd2FwX2luZm9fc3RydWN0LVxcdTAwM2Vsb2NrLlxcbisgKiBmb3JfZWFjaF9zd2FwIC0gaXRlcmF0ZSB0aHJvdWdoIGFsbCBhbGxvY2F0ZWQgYW5kIGludXNlIHN3YXAgZGV2aWNlc1xcbisgKiBAc2k6IHRoZSBpdGVyYXRvclxcbisgKlxcbisgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3QgaG9sZCBzd2Fwb25fcndzZW0uIFRoZSBsb2NrIG1heSBiZSBkcm9wcGVkIGR1cmluZ1xcbisgKiB0aGUgbG9vcCBib2R5IGJ1dCBtdXN0IGJlIHJlLWFjcXVpcmVkIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24uXFxuICAqL1xcbi1zdGF0aWMgUExJU1RfSEVBRChzd2FwX2F2YWlsX2hlYWQpO1xcbi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfYXZhaWxfbG9jayk7XFxuLVxcbi1zdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9pbmZvW01BWF9TV0FQRklMRVNdO1xcbisjZGVmaW5lIGZvcl9lYWNoX3N3YXAoc2kpIF9fZm9yX2VhY2hfc3dhcChzaSwgU1dQX1VTRUQpXFxuKyNkZWZpbmUgZm9yX2VhY2hfYXZhaWxfc3dhcChzaSkgX19mb3JfZWFjaF9zd2FwKHNpLCBTV1BfVVNFRCB8IFNXUF9XUklURU9LKVxcbiBcXG4gc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzd2FwX3RhYmxlX2NhY2hlcDtcXG4gXFxuLS8qIFByb3RlY3RzIHNpLVxcdTAwM2Vzd2FwX2ZpbGUgZm9yIC9wcm9jL3N3YXBzIHVzYWdlICovXFxuLXN0YXRpYyBERUZJTkVfTVVURVgoc3dhcG9uX211dGV4KTtcXG4tXFxuIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChwcm9jX3BvbGxfd2FpdCk7XFxuIC8qIEFjdGl2aXR5IGNvdW50ZXIgdG8gaW5kaWNhdGUgdGhhdCBhIHN3YXBvbiBvciBzd2Fwb2ZmIGhhcyBvY2N1cnJlZCAqL1xcbiBzdGF0aWMgYXRvbWljX3QgcHJvY19wb2xsX2V2ZW50ID0gQVRPTUlDX0lOSVQoMCk7XFxuIFxcbiBhdG9taWNfdCBucl9yb3RhdGVfc3dhcCA9IEFUT01JQ19JTklUKDApO1xcbiBcXG4tc3RydWN0IHBlcmNwdV9zd2FwX2NsdXN0ZXIge1xcbi1cXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lbU1dBUF9OUl9PUkRFUlNdO1xcbi1cXHR1bnNpZ25lZCBsb25nIG9mZnNldFtTV0FQX05SX09SREVSU107XFxuLVxcdGxvY2FsX2xvY2tfdCBsb2NrO1xcbi19O1xcbi1cXG4tc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJjcHVfc3dhcF9jbHVzdGVyLCBwZXJjcHVfc3dhcF9jbHVzdGVyKSA9IHtcXG4tXFx0LnNpID0geyBOVUxMIH0sXFxuLVxcdC5vZmZzZXQgPSB7IFNXQVBfRU5UUllfSU5WQUxJRCB9LFxcbi1cXHQubG9jayA9IElOSVRfTE9DQUxfTE9DSygpLFxcbi19O1xcbi1cXG4gLyogTWF5IHJldHVybiBOVUxMIG9uIGludmFsaWQgdHlwZSwgY2FsbGVyIG11c3QgY2hlY2sgZm9yIE5VTEwgcmV0dXJuICovXFxuIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF90eXBlX3RvX2luZm8oaW50IHR5cGUpXFxuIHtcXG5AQCAtMTQzLDE4ICsxMzksMzUwIEBAIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9lbnRyeV90b19pbmZvKHN3cF9lbnRyeV90IGVudHJ5KVxcbiBcXHRyZXR1cm4gc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTtcXG4gfVxcbiBcXG4rLypcXG4rICogQWxsIGF2YWlsYWJsZSBzd2FwX2luZm9fc3RydWN0cyBhcmUgZ3JvdXBlZCBieSBwcmlvcml0eSByaW5ncywgdGhlIHJpbmdzXFxuKyAqIGFyZSBvcmRlcmVkIGluIGEgcXVldWUgYnkgcHJpb3JpdHkgKGxvd2VyIHByaW8gdmFsdWUgPSBoaWdoZXIgcHJpb3JpdHkpLlxcbisgKiBUaGUgYWxsb2NhdG9yIGl0ZXJhdGVzIGFuZCByb3RhdGVzIGRldmljZXMgd2l0aGluIGVhY2ggcHJpb3JpdHkgcmluZy5cXG4rICogV2hlbiBhbGwgZGV2aWNlcyBpbiBhIHJpbmcgYXJlIGl0ZXJhdGVkLCBpdCBnb2VzIHRvIHRoZSBuZXh0IGxvd2VyXFxuKyAqIHByaW9yaXR5IHJpbmcuXFxuKyAqL1xcbitzdHJ1Y3Qgc3dhcF9wcmlvX3Jpbmcge1xcbitcXHRpbnQgcHJpbztcXG4rXFx0dW5zaWduZWQgaW50IHNpemU7XFxuK1xcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpkZXZbXSBfX2NvdW50ZWRfYnkoc2l6ZSk7XFxuK307XFxuK1xcbisvKlxcbisgKiBUaGUgcmluZyBpcyBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtIHNvIHVwZGF0aW5nIGl0IGlzIGNvc3RseS4gVG8gbWFrZVxcbisgKiB0aGUgYWxsb2NhdG9yIGFuZCBvdGhlciB1c2VycyBza2lwIGZ1bGwgZGV2aWNlcyBmYXN0ZXIsIHRoZSBsb3dlc3QgYml0IG9mXFxuKyAqIGEgZGV2aWNlIHBvaW50ZXIgaXMgdXNlZCB0byBtYXJrIGl0IGRpc2FibGVkICh0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSkuXFxuKyAqIFRoaXMgcmVsaWVzIG9uIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IGJlaW5nIHN1ZmZpY2llbnRseVxcbisgKiBhbGlnbmVkIChndWFyYW50ZWVkIGJ5IGttYWxsb2MpLlxcbisgKi9cXG4rI2RlZmluZSBTV0FQX0RFVklDRV9NQVNLRURfU0hJRlRcXHQwXFxuKyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVFxcdFxcdEJJVChTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQpXFxuK1xcbisvKlxcbisgKiBTZXJpYWxpemVzIHF1ZXVlIGNvbnRlbnQgbXV0YXRpb25zIGFuZCBrZWVwcyBTV0FQX1VTQUdFX09GRkxJU1RfQklUXFxuKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgbWFza2VkIHN0YXRlIG9mIGVhY2ggZGV2aWNlIHBvaW50ZXIuXFxuKyAqL1xcbitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXG4rLypcXG4rICogU3dhcCBxdWV1ZSBpcyBwcm90ZWN0ZWQgYnkgYm90aCBzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrIGFuZCBzd2Fwb25fcndzZW0uXFxuKyAqIE9ubHkgc3dhcG9uL3N3YXBvZmYgd2lsbCB0YWtlIHRoZSB3cml0ZSBsb2NrLCBhbmQgbW9kaWZ5IHRoZSBxdWV1ZSBsZW5ndGhcXG4rICogb3IgYW55IHJpbmcncyBsZW5ndGguIHN3YXBfcXVldWVfdXBkYXRlX2xvY2sgcHJvdGVjdHMgdGhlIGNvbnRlbnQgc29cXG4rICogZGV2aWNlcyBjYW4gYmUgbWFza2VkIGVhc2lseSB3aXRob3V0IHRha2luZyB0aGUgd3JpdGVsb2NrLCB3aGljaCBpcyBoZWF2eS5cXG4rICovXFxuK3N0YXRpYyBzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipzd2FwX3F1ZXVlO1xcbitzdGF0aWMgdW5zaWduZWQgaW50IHN3YXBfcXVldWVfbGVuO1xcbitcXG4rLypcXG4rICogRWFjaCBDUFUgaGFzIGl0cyByZWFkIGl0ZXJhdG9yLCBzbyB0aGUgcXVldWUgaXRzZWxmIHdpbGwgcmVtYWluIHJlYWRcXG4rICogb25seSBhbmQgdGhlIENQVSBzaWRlIHJlYWRlciByb3RhdGVzIGJ5IGl0ZXJhdGluZyB0aGUgZGV2aWNlc1xcbisgKiBwZXJpb2RpY2FsbHkgdXNpbmcgdGhlIGNvdW50ZXIuXFxuKyAqL1xcbisjZGVmaW5lIFNXQVBfUk9VTkRfUk9CSU5fUVVPVEEgU1dBUEZJTEVfQ0xVU1RFUlxcbitzdHJ1Y3Qgc3dhcF9yaW5nX2l0ZXJhdG9yIHtcXG4rXFx0aW50IG9mZnNldDtcXG4rXFx0bG9uZyBycl9jb3VudGVyO1xcbit9O1xcbitcXG4rc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIHtcXG4rXFx0bG9jYWxfbG9ja190IGxvY2s7XFxuK1xcdHN0cnVjdCBzd2FwX3JpbmdfaXRlcmF0b3IgcmlbXTtcXG4rfTtcXG4rXFxuK3N0YXRpYyBfX3BlcmNwdSBzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgKnN3YXBfcXVldWVfcmVhZGVycztcXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBzd2FwX2RldmljZV9tYXNrZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZylzaSBcXHUwMDI2IFNXQVBfREVWSUNFX01BU0tFRF9CSVQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfZGV2aWNlX3VubWFza19wdHIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHJldHVybiAoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKikoKHVuc2lnbmVkIGxvbmcpc2kgXFx1MDAyNiB+U1dBUF9ERVZJQ0VfTUFTS0VEX0JJVCk7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhpbnQgbnJfcmluZ3MsIGdmcF90IGdmcClcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnM7XFxuK1xcbitcXHRpZiAoIW5yX3JpbmdzKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdHJlYWRlcnMgPSBfX2FsbG9jX3BlcmNwdV9nZnAoc3RydWN0X3NpemUocmVhZGVycywgcmksIG5yX3JpbmdzKSxcXG4rXFx0XFx0XFx0XFx0ICAgICBfX2FsaWdub2ZfXygqcmVhZGVycyksIGdmcCk7XFxuK1xcdHJldHVybiByZWFkZXJzO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnMpXFxuK3tcXG4rXFx0aW50IHJpbmdfaWR4LCBjcHU7XFxuK1xcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcXG4rXFxuK1xcdGZyZWVfcGVyY3B1KHN3YXBfcXVldWVfcmVhZGVycyk7XFxuK1xcdHN3YXBfcXVldWVfcmVhZGVycyA9IHJlYWRlcnM7XFxuK1xcdGlmICghcmVhZGVycylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LyogRGlzdHJpYnV0ZSBlYWNoIENQVSdzIHN3YXAgSU8gZmFpcmx5IGFjcm9zcyBkZXZpY2VzLiAqL1xcbitcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuK1xcdFxcdGxvY2FsX2xvY2tfaW5pdChcXHUwMDI2cGVyX2NwdV9wdHIocmVhZGVycywgY3B1KS1cXHUwMDNlbG9jayk7XFxuK1xcbitcXHRcXHRmb3IgKHJpbmdfaWR4ID0gMDsgcmluZ19pZHggXFx1MDAzYyBzd2FwX3F1ZXVlX2xlbjsgcmluZ19pZHgrKykge1xcbitcXHRcXHRcXHRyaW5nID0gc3dhcF9xdWV1ZVtyaW5nX2lkeF07XFxuK1xcdFxcdFxcdHBlcl9jcHVfcHRyKHJlYWRlcnMsIGNwdSktXFx1MDAzZXJpW3JpbmdfaWR4XS5vZmZzZXQgPVxcbitcXHRcXHRcXHRcXHQgICAgY3B1ICUgcmluZy1cXHUwMDNlc2l6ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9xdWV1ZV9nZXRfZGV2aWNlKGxvbmcgbnJfYWxsb2MsIGludCBucl9pdGVyKVxcbit7XFxuK1xcdGJvb2wgcm90YXRlID0gZmFsc2U7XFxuK1xcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4rXFx0c3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciAqcmk7XFxuK1xcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcXG4rXFx0dW5zaWduZWQgaW50IHF1ZXVlX2lkeDtcXG4rXFxuK1xcdGlmICghc3dhcF9xdWV1ZV9sZW4pXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xcbitcXG4rXFx0cXVldWVfaWR4ID0gMDtcXG4rXFx0d2hpbGUgKG5yX2l0ZXIgXFx1MDAzZT0gc3dhcF9xdWV1ZVtxdWV1ZV9pZHhdLVxcdTAwM2VzaXplKSB7XFxuK1xcdFxcdG5yX2l0ZXIgLT0gc3dhcF9xdWV1ZVtxdWV1ZV9pZHhdLVxcdTAwM2VzaXplO1xcbitcXHRcXHRpZiAoKytxdWV1ZV9pZHggXFx1MDAzZT0gc3dhcF9xdWV1ZV9sZW4pXFxuK1xcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xcbitcXHR9XFxuK1xcbitcXHRyaW5nID0gc3dhcF9xdWV1ZVtxdWV1ZV9pZHhdO1xcbitcXHRsb2NhbF9sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3JlYWRlcnMtXFx1MDAzZWxvY2spO1xcbitcXHRyaSA9IHRoaXNfY3B1X3B0cihcXHUwMDI2c3dhcF9xdWV1ZV9yZWFkZXJzLVxcdTAwM2VyaVtxdWV1ZV9pZHhdKTtcXG4rXFx0LyogUm90YXRlIHdoaWxlIGl0ZXJhdGluZyB0aGUgcmluZywganVzdCBub3Qgb24gdGhlIGZpcnN0IHRyeSAqL1xcbitcXHRpZiAobnJfaXRlcilcXG4rXFx0XFx0cm90YXRlID0gdHJ1ZTtcXG4rXFx0ZWxzZSBpZiAocmktXFx1MDAzZXJyX2NvdW50ZXIgXFx1MDAzYyBucl9hbGxvYylcXG4rXFx0XFx0cm90YXRlID0gdHJ1ZTtcXG4rXFx0ZWxzZSBpZiAocmktXFx1MDAzZW9mZnNldCBcXHUwMDNlPSByaW5nLVxcdTAwM2VzaXplKVxcbitcXHRcXHRyb3RhdGUgPSB0cnVlO1xcbitcXHRpZiAocm90YXRlKSB7XFxuK1xcdFxcdHJpLVxcdTAwM2VvZmZzZXQrKztcXG4rXFx0XFx0cmktXFx1MDAzZW9mZnNldCAlPSByaW5nLVxcdTAwM2VzaXplO1xcbitcXHRcXHRyaS1cXHUwMDNlcnJfY291bnRlciA9IFNXQVBfUk9VTkRfUk9CSU5fUVVPVEE7XFxuK1xcdH1cXG4rXFx0cmktXFx1MDAzZXJyX2NvdW50ZXIgLT0gbnJfYWxsb2M7XFxuK1xcdHNpID0gUkVBRF9PTkNFKHJpbmctXFx1MDAzZWRldltyaS1cXHUwMDNlb2Zmc2V0XSk7XFxuK1xcdGxvY2FsX3VubG9jayhcXHUwMDI2c3dhcF9xdWV1ZV9yZWFkZXJzLVxcdTAwM2Vsb2NrKTtcXG4rXFxuK1xcdGlmIChzd2FwX2RldmljZV9tYXNrZWQoc2kpKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUJVU1kpO1xcbitcXG4rXFx0c2kgPSBzd2FwX2RldmljZV91bm1hc2tfcHRyKHNpKTtcXG4rXFx0cmV0dXJuIHNpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBzd2FwX3F1ZXVlX2ZpbmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbitcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50ICpyaW5nX2lkeCwgdW5zaWduZWQgaW50ICpkZXZfaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBpLCBqO1xcbitcXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7XFxuK1xcbitcXHRsb2NrZGVwX2Fzc2VydChsb2NrZGVwX2lzX2hlbGQoXFx1MDAyNnN3YXBvbl9yd3NlbSkgfHxcXG4rXFx0XFx0ICAgICAgIGxvY2tkZXBfaXNfaGVsZChcXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jaykpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHN3YXBfcXVldWVfbGVuOyBpKyspIHtcXG4rXFx0XFx0cmluZyA9IHN3YXBfcXVldWVbaV07XFxuK1xcdFxcdGlmIChyaW5nLVxcdTAwM2VwcmlvICE9IHNpLVxcdTAwM2VwcmlvKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIHJpbmctXFx1MDAzZXNpemU7IGorKykge1xcbitcXHRcXHRcXHRpZiAoc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihSRUFEX09OQ0UocmluZy1cXHUwMDNlZGV2W2pdKSkgIT0gc2kpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHQqcmluZ19pZHggPSBpO1xcbitcXHRcXHRcXHQqZGV2X2lkeCA9IGo7XFxuK1xcdFxcdFxcdHJldHVybiB0cnVlO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX21hc2soc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCByaW5nX2lkeCwgZGV2X2lkeDtcXG4rXFxuK1xcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRpZiAoc3dhcF9xdWV1ZV9maW5kKHNpLCBcXHUwMDI2cmluZ19pZHgsIFxcdTAwMjZkZXZfaWR4KSlcXG4rXFx0XFx0X19zZXRfYml0KFNXQVBfREVWSUNFX01BU0tFRF9TSElGVCxcXG4rXFx0XFx0XFx0ICAodW5zaWduZWQgbG9uZyAqKVxcdTAwMjZzd2FwX3F1ZXVlW3JpbmdfaWR4XS1cXHUwMDNlZGV2W2Rldl9pZHhdKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc3dhcF9xdWV1ZV91bm1hc2soc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCByaW5nX2lkeCwgZGV2X2lkeDtcXG4rXFxuK1xcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRpZiAoc3dhcF9xdWV1ZV9maW5kKHNpLCBcXHUwMDI2cmluZ19pZHgsIFxcdTAwMjZkZXZfaWR4KSlcXG4rXFx0XFx0X19jbGVhcl9iaXQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZULFxcbitcXHRcXHRcXHQgICAgKHVuc2lnbmVkIGxvbmcgKilcXHUwMDI2c3dhcF9xdWV1ZVtyaW5nX2lkeF0tXFx1MDAzZWRldltkZXZfaWR4XSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqKm5ld19xdWV1ZSA9IE5VTEwsICoqb2xkX3F1ZXVlID0gTlVMTDtcXG4rXFx0c3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpuZXdfcmVhZGVycyA9IE5VTEw7XFxuK1xcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZywgKm5ld19yaW5nID0gTlVMTCwgKm9sZF9yaW5nID0gTlVMTDtcXG4rXFx0aW50IHByaW8gPSBzaS1cXHUwMDNlcHJpbztcXG4rXFx0aW50IGksIHBvcywgZXJyID0gLUVOT01FTTtcXG4rXFx0Z2ZwX3QgZ2ZwO1xcbitcXG4rXFx0LyogU3dhcCBub3QgdXNhYmxlIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHN3YXAsIGp1c3QgcmVjbGFpbSBjYWNoZS4gKi9cXG4rXFx0Z2ZwID0gR0ZQX05PSU8gfCBfX0dGUF9ISUdIO1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXG4rXFx0Zm9yIChwb3MgPSAwOyBwb3MgXFx1MDAzYyBzd2FwX3F1ZXVlX2xlbjsgcG9zKyspIHtcXG4rXFx0XFx0aWYgKHN3YXBfcXVldWVbcG9zXS1cXHUwMDNlcHJpbyA9PSBwcmlvKVxcbitcXHRcXHRcXHRnb3RvIGFkZF90b19yaW5nO1xcbitcXHRcXHRpZiAoc3dhcF9xdWV1ZVtwb3NdLVxcdTAwM2VwcmlvIFxcdTAwM2MgcHJpbylcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE5vIHJpbmcgYXQgdGhpcyBwcmlvcml0eTogaW5zZXJ0IGEgbmV3IG9uZSBhdCBwb3MuICovXFxuK1xcdG5ld19yZWFkZXJzID0gc3dhcF9xdWV1ZV9wcmVhbGxvY19yZWFkZXJzKHN3YXBfcXVldWVfbGVuICsgMSwgZ2ZwKTtcXG4rXFx0aWYgKCFuZXdfcmVhZGVycylcXG4rXFx0XFx0Z290byBmYWlsZWQ7XFxuK1xcdG5ld19xdWV1ZSA9IGttYWxsb2NfYXJyYXkoc3dhcF9xdWV1ZV9sZW4gKyAxLCBzaXplb2YoKnN3YXBfcXVldWUpLCBnZnApO1xcbitcXHRpZiAoIW5ld19xdWV1ZSlcXG4rXFx0XFx0Z290byBmYWlsZWQ7XFxuK1xcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShuZXdfcmluZywgZGV2LCAxKSwgZ2ZwKTtcXG4rXFx0aWYgKCFuZXdfcmluZylcXG4rXFx0XFx0Z290byBmYWlsZWQ7XFxuK1xcdGlmICghZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxcbitcXHRcXHRnb3RvIGZhaWxlZDtcXG4rXFxuK1xcdG5ld19yaW5nLVxcdTAwM2VwcmlvID0gcHJpbztcXG4rXFx0bmV3X3JpbmctXFx1MDAzZXNpemUgPSAxO1xcbitcXHRuZXdfcmluZy1cXHUwMDNlZGV2WzBdID0gc2k7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBwb3M7IGkrKylcXG4rXFx0XFx0bmV3X3F1ZXVlW2ldID0gc3dhcF9xdWV1ZVtpXTtcXG4rXFx0bmV3X3F1ZXVlW3Bvc10gPSBuZXdfcmluZztcXG4rXFx0Zm9yIChpID0gcG9zOyBpIFxcdTAwM2Mgc3dhcF9xdWV1ZV9sZW47IGkrKylcXG4rXFx0XFx0bmV3X3F1ZXVlW2kgKyAxXSA9IHN3YXBfcXVldWVbaV07XFxuK1xcbitcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRvbGRfcXVldWUgPSBzd2FwX3F1ZXVlO1xcbitcXHRzd2FwX3F1ZXVlID0gbmV3X3F1ZXVlO1xcbitcXHRzd2FwX3F1ZXVlX2xlbisrO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XFxuK1xcdGtmcmVlKG9sZF9xdWV1ZSk7XFxuK1xcbitcXHRzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhuZXdfcmVhZGVycyk7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rYWRkX3RvX3Jpbmc6XFxuK1xcdHJpbmcgPSBzd2FwX3F1ZXVlW3Bvc107XFxuK1xcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXFx1MDAzZXNpemUgKyAxKSwgZ2ZwKTtcXG4rXFx0aWYgKCFuZXdfcmluZylcXG4rXFx0XFx0Z290byBmYWlsZWQ7XFxuK1xcdGlmICghZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxcbitcXHRcXHRnb3RvIGZhaWxlZDtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4rXFx0bWVtY3B5KG5ld19yaW5nLCByaW5nLCBzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXFx1MDAzZXNpemUpKTtcXG4rXFx0bmV3X3JpbmctXFx1MDAzZXNpemUrKztcXG4rXFx0bmV3X3JpbmctXFx1MDAzZWRldltuZXdfcmluZy1cXHUwMDNlc2l6ZSAtIDFdID0gc2k7XFxuK1xcdG9sZF9yaW5nID0gc3dhcF9xdWV1ZVtwb3NdO1xcbitcXHRzd2FwX3F1ZXVlW3Bvc10gPSBuZXdfcmluZztcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRrZnJlZShvbGRfcmluZyk7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZmFpbGVkOlxcbitcXHRmcmVlX3BlcmNwdShuZXdfcmVhZGVycyk7XFxuK1xcdGtmcmVlKG5ld19xdWV1ZSk7XFxuK1xcdGtmcmVlKG5ld19yaW5nKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc3dhcF9xdWV1ZV9kZWwoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbit7XFxuK1xcdGdmcF90IGdmcDtcXG4rXFx0dW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4O1xcbitcXHRzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKm5ld19yZWFkZXJzID0gTlVMTDtcXG4rXFx0c3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nLCAqbmV3X3JpbmcgPSBOVUxMLCAqb2xkX3JpbmcgPSBOVUxMO1xcbitcXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipuZXdfcXVldWUgPSBOVUxMLCAqKm9sZF9xdWV1ZSA9IE5VTEw7XFxuK1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRpZiAoIXN3YXBfcXVldWVfZmluZChzaSwgXFx1MDAyNnJpbmdfaWR4LCBcXHUwMDI2ZGV2X2lkeCkpIHtcXG4rXFx0XFx0V0FSTl9PTigxKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUbyBzaHJpbmsgbWVtb3J5IHVzYWdlLCBwcmUtYWxsb2NhdGUgbmV3IHNtYWxsZXIgZGF0YSBiZWZvcmVcXG4rXFx0ICogbG9ja2luZy4gRmFpbHVyZSBpcyBmaW5lLCBzd2Fwb2ZmIHdpbGwgcmVsZWFzZSB0aGVtIGFueXdheS5cXG4rXFx0ICovXFxuK1xcdGdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDtcXG4rXFx0cmluZyA9IHN3YXBfcXVldWVbcmluZ19pZHhdO1xcbitcXHRpZiAocmluZy1cXHUwMDNlc2l6ZSBcXHUwMDNlIDEpXFxuK1xcdFxcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXFx1MDAzZXNpemUgLSAxKSwgZ2ZwKTtcXG4rXFx0aWYgKHJpbmctXFx1MDAzZXNpemUgPT0gMSBcXHUwMDI2XFx1MDAyNiBzd2FwX3F1ZXVlX2xlbiBcXHUwMDNlIDEpIHtcXG4rXFx0XFx0bmV3X3JlYWRlcnMgPSBzd2FwX3F1ZXVlX3ByZWFsbG9jX3JlYWRlcnMoXFxuK1xcdFxcdFxcdFxcdFxcdHN3YXBfcXVldWVfbGVuIC0gMSwgZ2ZwKTtcXG4rXFx0XFx0bmV3X3F1ZXVlID0ga21hbGxvYyhzaXplb2YoKnN3YXBfcXVldWUpICpcXG4rXFx0XFx0XFx0XFx0ICAgIChzd2FwX3F1ZXVlX2xlbiAtIDEpLCBnZnApO1xcbitcXHR9XFxuK1xcbitcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRpZiAocmluZy1cXHUwMDNlc2l6ZSBcXHUwMDNlIDEpIHtcXG4rXFx0XFx0LyogU2hpZnQgdHJhaWxpbmcgZGV2aWNlcyBsZWZ0IHRvIGZpbGwgdGhlIGdhcC4gKi9cXG4rXFx0XFx0d2hpbGUgKCsrZGV2X2lkeCBcXHUwMDNjIHJpbmctXFx1MDAzZXNpemUpXFxuK1xcdFxcdFxcdHJpbmctXFx1MDAzZWRldltkZXZfaWR4IC0gMV0gPVxcbitcXHRcXHRcXHRcXHRyaW5nLVxcdTAwM2VkZXZbZGV2X2lkeF07XFxuK1xcdFxcdHJpbmctXFx1MDAzZXNpemUtLTtcXG4rXFx0XFx0aWYgKG5ld19yaW5nKSB7XFxuK1xcdFxcdFxcdG1lbWNweShuZXdfcmluZywgcmluZyxcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdF9zaXplKHJpbmcsIGRldiwgcmluZy1cXHUwMDNlc2l6ZSkpO1xcbitcXHRcXHRcXHRvbGRfcmluZyA9IHJpbmc7XFxuK1xcdFxcdFxcdHN3YXBfcXVldWVbcmluZ19pZHhdID0gbmV3X3Jpbmc7XFxuK1xcdFxcdH1cXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0LyogTGFzdCBkZXZpY2UgaW4gdGhpcyByaW5nOiByZW1vdmUgdGhlIHJpbmcuICovXFxuK1xcdFxcdG9sZF9yaW5nID0gcmluZztcXG4rXFx0XFx0c3dhcF9xdWV1ZV9sZW4tLTtcXG4rXFx0XFx0d2hpbGUgKCsrcmluZ19pZHggXFx1MDAzYz0gc3dhcF9xdWV1ZV9sZW4pXFxuK1xcdFxcdFxcdHN3YXBfcXVldWVbcmluZ19pZHggLSAxXSA9XFxuK1xcdFxcdFxcdFxcdHN3YXBfcXVldWVbcmluZ19pZHhdO1xcbitcXHRcXHRpZiAobmV3X3F1ZXVlKSB7XFxuK1xcdFxcdFxcdG1lbWNweShuZXdfcXVldWUsIHN3YXBfcXVldWUsXFxuK1xcdFxcdFxcdCAgICAgICBzaXplb2YoKnN3YXBfcXVldWUpICogc3dhcF9xdWV1ZV9sZW4pO1xcbitcXHRcXHRcXHRvbGRfcXVldWUgPSBzd2FwX3F1ZXVlO1xcbitcXHRcXHRcXHRzd2FwX3F1ZXVlID0gbmV3X3F1ZXVlO1xcbitcXHRcXHR9IGVsc2UgaWYgKCFzd2FwX3F1ZXVlX2xlbikge1xcbitcXHRcXHRcXHRvbGRfcXVldWUgPSBzd2FwX3F1ZXVlO1xcbitcXHRcXHRcXHRzd2FwX3F1ZXVlID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAobmV3X3JlYWRlcnMgfHwgIXN3YXBfcXVldWVfbGVuKVxcbitcXHRcXHRcXHRzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhuZXdfcmVhZGVycyk7XFxuK1xcdH1cXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXG4rXFx0a2ZyZWUob2xkX3JpbmcpO1xcbitcXHRrZnJlZShvbGRfcXVldWUpO1xcbitcXHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xcbit9XFxuK1xcbiAvKlxcbiAgKiBVc2UgdGhlIHNlY29uZCBoaWdoZXN0IGJpdCBvZiBpbnVzZV9wYWdlcyBjb3VudGVyIGFzIHRoZSBpbmRpY2F0b3JcXG4tICogaWYgb25lIHN3YXAgZGV2aWNlIGlzIG9uIHRoZSBhdmFpbGFibGUgcGxpc3QsIHNvIHRoZSBhdG9taWMgY2FuXFxuKyAqIGlmIG9uZSBzd2FwIGRldmljZSBpcyB1bmF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiwgc28gdGhlIGF0b21pYyBjYW5cXG4gICogc3RpbGwgYmUgdXBkYXRlZCBhcml0aG1ldGljYWxseSB3aGlsZSBoYXZpbmcgc3BlY2lhbCBkYXRhIGVtYmVkZGVkLlxcbiAgKlxcbiAgKiBpbnVzZV9wYWdlcyBjb3VudGVyIGlzIHRoZSBvbmx5IHRoaW5nIGluZGljYXRpbmcgaWYgYSBkZXZpY2Ugc2hvdWxkXFxuLSAqIGJlIG9uIGF2YWlsX2xpc3RzIG9yIG5vdCAoZXhjZXB0IHN3YXBvbiAvIHN3YXBvZmYpLiBCeSBlbWJlZGRpbmcgdGhlXFxuLSAqIG9mZi1saXN0IGJpdCBpbiB0aGUgYXRvbWljIGNvdW50ZXIsIHVwZGF0ZXMgbm8gbG9uZ2VyIG5lZWQgYW55IGxvY2tcXG4tICogdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxcbisgKiBiZSBpbiB0aGUgYXZhaWxhYmxlIHF1ZXVlIG9yIG5vdCAoZXhjZXB0IHN3YXBvbiAvIHN3YXBvZmYpLiBCeVxcbisgKiBlbWJlZGRpbmcgdGhlIG9mZi1saXN0IGJpdCBpbiB0aGUgYXRvbWljIGNvdW50ZXIsIHVwZGF0ZXMgbm8gbG9uZ2VyXFxuKyAqIG5lZWQgYW55IGxvY2sgdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxcbiAgKlxcbi0gKiBUaGlzIGJpdCB3aWxsIGJlIHNldCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBvbiB0aGUgcGxpc3QgYW5kIG5vdFxcbi0gKiB1c2FibGUsIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGUgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdC5cXG4rICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3QgaW4gdGhlIGF2YWlsYWJsZSBxdWV1ZVxcbisgKiBhbmQgbm90IHVzYWJsZSwgd2lsbCBiZSBjbGVhcmVkIGlmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIHF1ZXVlLlxcbiAgKi9cXG4gI2RlZmluZSBTV0FQX1VTQUdFX09GRkxJU1RfQklUICgxVUwgXFx1MDAzY1xcdTAwM2MgKEJJVFNfUEVSX1RZUEUoYXRvbWljX3QpIC0gMikpXFxuICNkZWZpbmUgU1dBUF9VU0FHRV9DT1VOVEVSX01BU0sgKH5TV0FQX1VTQUdFX09GRkxJU1RfQklUKVxcbkBAIC0xNjMsNiArNDkxLDI2IEBAIHN0YXRpYyBsb25nIHN3YXBfdXNhZ2VfaW5fcGFnZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbiBcXHRyZXR1cm4gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKSBcXHUwMDI2IFNXQVBfVVNBR0VfQ09VTlRFUl9NQVNLO1xcbiB9XFxuIFxcbisvKlxcbisgKiBTZXJpYWxpemUgdGhlIGFsbG9jYXRpb24gb24gc2luZ2xlIENQVSBvciBnbG9iYWxseSB0byBhdm9pZFxcbisgKiBmcmFnbWVudGF0aW9uIGFuZCBtYWtlIHRoZSB3b3JrZmxvdyBlYXNpZXIgdG8gZm9sbG93LlxcbisgKi9cXG4rc3RhdGljIHZvaWQgc3dhcF9hbGxvY19sb2NrX2RldmljZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuK3tcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxcbitcXHRcXHRsb2NhbF9sb2NrKFxcdTAwMjZzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXItXFx1MDAzZWxvY2spO1xcbitcXHRlbHNlXFxuK1xcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyLVxcdTAwM2Vsb2NrKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4re1xcbitcXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpXFxuK1xcdFxcdGxvY2FsX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZXBlcmNwdV9jbHVzdGVyLVxcdTAwM2Vsb2NrKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyLVxcdTAwM2Vsb2NrKTtcXG4rfVxcbitcXG4gLyogUmVjbGFpbSB0aGUgc3dhcCBlbnRyeSBhbnl3YXkgaWYgcG9zc2libGUgKi9cXG4gI2RlZmluZSBUVFJTX0FOWVdBWVxcdFxcdDB4MVxcbiAvKlxcbkBAIC01MzMsOSArODgxLDEwIEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuIFxcdCAqIE9ubHkgY2x1c3RlciBpc29sYXRpb24gZnJvbSB0aGUgYWxsb2NhdG9yIGRvZXMgdGFibGUgYWxsb2NhdGlvbi5cXG4gXFx0ICogU3dhcCBhbGxvY2F0b3IgdXNlcyBwZXJjcHUgY2x1c3RlcnMgYW5kIGhvbGRzIHRoZSBsb2NhbCBsb2NrLlxcbiBcXHQgKi9cXG4tXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2dGhpc19jcHVfcHRyKFxcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyKS1cXHUwMDNlbG9jayk7XFxuLVxcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcXG4tXFx0XFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xcbitcXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpXFxuK1xcdFxcdGxvY2tkZXBfYXNzZXJ0X2hlbGQodGhpc19jcHVfcHRyKFxcdTAwMjZzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXItXFx1MDAzZWxvY2spKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZWxvY2spO1xcbiBcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuIFxcbiBcXHRpZiAoIXN3YXBfY2x1c3Rlcl9hbGxvY190YWJsZShjaSwgX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfFxcbkBAIC01NDgsOSArODk3LDcgQEAgc3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0ICogdGhlIHBvdGVudGlhbCByZWN1cnNpdmUgYWxsb2NhdGlvbiBpcyBsaW1pdGVkLlxcbiBcXHQgKi9cXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNmNpLVxcdTAwM2Vsb2NrKTtcXG4tXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpKVxcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xcbi1cXHRsb2NhbF91bmxvY2soXFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XFxuK1xcdHN3YXBfYWxsb2NfdW5sb2NrX2RldmljZShzaSk7XFxuIFxcbiBcXHRyZXQgPSBzd2FwX2NsdXN0ZXJfYWxsb2NfdGFibGUoY2ksIF9fR0ZQX0hJR0ggfCBfX0dGUF9OT01FTUFMTE9DIHxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgR0ZQX0tFUk5FTCk7XFxuQEAgLTU2Myw5ICs5MTAsNyBAQCBzd2FwX2NsdXN0ZXJfcG9wdWxhdGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHQgKiBjb3VsZCBoYXBwZW4gd2l0aCBpZ25vcmluZyB0aGUgcGVyY3B1IGNsdXN0ZXIgaXMgZnJhZ21lbnRhdGlvbixcXG4gXFx0ICogd2hpY2ggaXMgYWNjZXB0YWJsZSBzaW5jZSB0aGlzIGZhbGxiYWNrIGFuZCByYWNlIGlzIHJhcmUuXFxuIFxcdCAqL1xcbi1cXHRsb2NhbF9sb2NrKFxcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spO1xcbi1cXHRpZiAoIShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfU09MSURTVEFURSkpXFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xcbitcXHRzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHNpKTtcXG4gXFx0c3Bpbl9sb2NrKFxcdTAwMjZjaS1cXHUwMDNlbG9jayk7XFxuIFxcbiBcXHRpZiAocmV0KSB7XFxuQEAgLTY3MSw3ICsxMDE2LDcgQEAgc3RhdGljIGJvb2wgc3dhcF9kb19zY2hlZHVsZWRfZGlzY2FyZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIFxcdFxcdGNpID0gbGlzdF9maXJzdF9lbnRyeShcXHUwMDI2c2ktXFx1MDAzZWRpc2NhcmRfY2x1c3RlcnMsIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbywgbGlzdCk7XFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIERlbGV0ZSB0aGUgY2x1c3RlciBmcm9tIGxpc3QgdG8gcHJlcGFyZSBmb3IgZGlzY2FyZCwgYnV0IGtlZXBcXG4tXFx0XFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHBlcmNwdV9zd2FwX2NsdXN0ZXIgY291bGQgYmVcXG4rXFx0XFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHRoZXJlIGNvdWxkIGJlIHBlcmNwdV9jbHVzdGVyXFxuIFxcdFxcdCAqIHBvaW50aW5nIHRvIGl0LCBvciByYW4gaW50byBieSByZWxvY2F0ZV9jbHVzdGVyLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0bGlzdF9kZWwoXFx1MDAyNmNpLVxcdTAwM2VsaXN0KTtcXG5AQCAtOTU1LDcgKzEzMDAsNyBAQCBzdGF0aWMgYm9vbCBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0aWYgKGNsdXN0ZXJfaXNfZW1wdHkoY2kpKVxcbiBcXHRcXHRjaS1cXHUwMDNlb3JkZXIgPSBvcmRlcjtcXG4gXFx0Y2ktXFx1MDAzZWNvdW50ICs9IG5yX3BhZ2VzO1xcbi1cXHRzd2FwX3JhbmdlX2FsbG9jKHNpLCBucl9wYWdlcyk7XFxuK1xcdHN3YXBfZGV2aWNlX2ludXNlX2FkZChzaSwgbnJfcGFnZXMpO1xcbiBcXG4gXFx0cmV0dXJuIHRydWU7XFxuIH1cXG5AQCAtMTAwMywxMiArMTM0OCwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gb3V0OlxcbiBcXHRyZWxvY2F0ZV9jbHVzdGVyKHNpLCBjaSk7XFxuIFxcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xcbi1cXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpIHtcXG4tXFx0XFx0dGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5vZmZzZXRbb3JkZXJdLCBuZXh0KTtcXG4tXFx0XFx0dGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0sIHNpKTtcXG4tXFx0fSBlbHNlIHtcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxcbitcXHRcXHR0aGlzX2NwdV93cml0ZShzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXItXFx1MDAzZW5leHRbb3JkZXJdLCBuZXh0KTtcXG4rXFx0ZWxzZVxcbiBcXHRcXHRzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZW5leHRbb3JkZXJdID0gbmV4dDtcXG4tXFx0fVxcbiBcXHRyZXR1cm4gZm91bmQ7XFxuIH1cXG4gXFxuQEAgLTExMDMsMTMgKzE0NDYsMTQgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0aWYgKG9yZGVyIFxcdTAwMjZcXHUwMDI2ICEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX0JMS0RFVikpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpKSB7XFxuLVxcdFxcdC8qIFNlcmlhbGl6ZSBIREQgU1dBUCBhbGxvY2F0aW9uIGZvciBlYWNoIGRldmljZS4gKi9cXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXJfbG9jayk7XFxuK3Jlc3RhcnQ6XFxuK1xcdHN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc2kpO1xcbitcXHRpZiAoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1NPTElEU1RBVEUpXFxuK1xcdFxcdG9mZnNldCA9IF9fdGhpc19jcHVfcmVhZChzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXItXFx1MDAzZW5leHRbb3JkZXJdKTtcXG4rXFx0ZWxzZVxcbiBcXHRcXHRvZmZzZXQgPSBzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZW5leHRbb3JkZXJdO1xcbi1cXHRcXHRpZiAob2Zmc2V0ID09IFNXQVBfRU5UUllfSU5WQUxJRClcXG4tXFx0XFx0XFx0Z290byBuZXdfY2x1c3RlcjtcXG4gXFxuK1xcdGlmIChvZmZzZXQgIT0gU1dBUF9FTlRSWV9JTlZBTElEKSB7XFxuIFxcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XFxuIFxcdFxcdC8qIENsdXN0ZXIgY291bGQgaGF2ZSBiZWVuIHVzZWQgYnkgYW5vdGhlciBvcmRlciAqL1xcbiBcXHRcXHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIG9yZGVyKSkge1xcbkBAIC0xMTIzLDcgKzE0NjcsNiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRcXHRnb3RvIGRvbmU7XFxuIFxcdH1cXG4gXFxuLW5ld19jbHVzdGVyOlxcbiBcXHQvKlxcbiBcXHQgKiBJZiB0aGUgZGV2aWNlIG5lZWQgZGlzY2FyZCwgcHJlZmVyIG5ldyBjbHVzdGVyIG92ZXIgbm9uZnVsbFxcbiBcXHQgKiB0byBzcHJlYWQgb3V0IHRoZSB3cml0ZXMuXFxuQEAgLTExMzIsNiArMTQ3NSwxMiBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRcXHRmb3VuZCA9IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHNpLCBcXHUwMDI2c2ktXFx1MDAzZWZyZWVfY2x1c3RlcnMsIGZvbGlvLCBmYWxzZSk7XFxuIFxcdFxcdGlmIChmb3VuZClcXG4gXFx0XFx0XFx0Z290byBkb25lO1xcbitcXG4rXFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZzaS1cXHUwMDNlZGlzY2FyZF9jbHVzdGVycykpIHtcXG4rXFx0XFx0XFx0c3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTtcXG4rXFx0XFx0XFx0c3dhcF9kb19zY2hlZHVsZWRfZGlzY2FyZChzaSk7XFxuK1xcdFxcdFxcdGdvdG8gcmVzdGFydDtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbiBcXHRpZiAob3JkZXIgXFx1MDAzYyBQTURfT1JERVIpIHtcXG5AQCAtMTE4MCw4ICsxNTI5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0XFx0XFx0Z290byBkb25lO1xcbiBcXHR9XFxuIGRvbmU6XFxuLVxcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNpLVxcdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcXG4rXFx0c3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTtcXG4gXFxuIFxcdHJldHVybiBmb3VuZDtcXG4gfVxcbkBAIC0xMTkxLDU0ICsxNTM5LDQ0IEBAIHN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBwYWdlcztcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4gXFxuLVxcdGlmIChzd2Fwb2ZmKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEZvcmNlZnVsbHkgcmVtb3ZlIGl0LiBDbGVhciB0aGUgU1dQX1dSSVRFT0sgZmxhZ3MgZm9yXFxuLVxcdFxcdCAqIHN3YXBvZmYgaGVyZSBzbyBpdCdzIHN5bmNocm9uaXplZCBieSBib3RoIHNpLVxcdTAwM2Vsb2NrIGFuZFxcbi1cXHRcXHQgKiBzd2FwX2F2YWlsX2xvY2ssIHRvIGVuc3VyZSB0aGUgcmVzdWx0IGNhbiBiZSBzZWVuIGJ5XFxuLVxcdFxcdCAqIGFkZF90b19hdmFpbF9saXN0Llxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbi1cXHRcXHRzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNj0gflNXUF9XUklURU9LO1xcbi1cXHRcXHRhdG9taWNfbG9uZ19vcihTV0FQX1VTQUdFX09GRkxJU1RfQklULCBcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgbm90IGNhbGxlZCBieSBzd2Fwb2ZmLCB0YWtlIGl0IG9mZi1saXN0IG9ubHkgaWYgaXQnc1xcbi1cXHRcXHQgKiBmdWxsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQgKHN0cmljdGx5XFxuLVxcdFxcdCAqIHNpLVxcdTAwM2VpbnVzZV9wYWdlcyA9PSBwYWdlcyksIGFueSBjb25jdXJyZW50IHNsb3QgZnJlZWluZyxcXG4tXFx0XFx0ICogb3IgZGV2aWNlIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHBsaXN0IGJ5IHNvbWVvbmUgZWxzZVxcbi1cXHRcXHQgKiB3aWxsIG1ha2UgdGhpcyByZXR1cm4gZmFsc2UuXFxuLVxcdFxcdCAqL1xcbitcXHQvKlxcbitcXHQgKiBGb3JjZSByZW1vdmUgaXQgb25seSBmb3Igc3dhcG9mZi4gRWxzZSwgdGFrZSBpdCBvZmYtbGlzdCBvbmx5IGlmXFxuK1xcdCAqIGl0J3MgZnVsbCBhbmQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBpcyBub3Qgc2V0IChzdHJpY3RseVxcbitcXHQgKiBzaS1cXHUwMDNlaW51c2VfcGFnZXMgPT0gcGFnZXMpLCBzbyBjb25jdXJyZW50IHNsb3QgZnJlZWluZywgb3JcXG4rXFx0ICogY29uY3VycmVudCBsaXN0IHJlbW92YWwgd2lsbCBtYWtlIHRoZSBjbXB4Y2hnIGZhaWwgYW5kIHNraXBcXG4rXFx0ICogdGhlIHJlbW92YWwuXFxuK1xcdCAqL1xcbitcXHRpZiAoIXN3YXBvZmYpIHtcXG4gXFx0XFx0cGFnZXMgPSBzaS1cXHUwMDNlcGFnZXM7XFxuIFxcdFxcdGlmICghYXRvbWljX2xvbmdfdHJ5X2NtcHhjaGcoXFx1MDAyNnNpLVxcdTAwM2VpbnVzZV9wYWdlcywgXFx1MDAyNnBhZ2VzLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VzIHwgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCkpXFxuIFxcdFxcdFxcdGdvdG8gc2tpcDtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0YXRvbWljX2xvbmdfb3IoU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgXFx1MDAyNnNpLVxcdTAwM2VpbnVzZV9wYWdlcyk7XFxuIFxcdH1cXG4gXFxuLVxcdHBsaXN0X2RlbChcXHUwMDI2c2ktXFx1MDAzZWF2YWlsX2xpc3QsIFxcdTAwMjZzd2FwX2F2YWlsX2hlYWQpO1xcbi1cXG4rXFx0c3dhcF9xdWV1ZV9tYXNrKHNpKTtcXG4gc2tpcDpcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4gfVxcbiBcXG4gLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHRoaXMgaGVscGVyLiAqL1xcbi1zdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxcbitzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIHtcXG4gXFx0bG9uZyB2YWw7XFxuIFxcdHVuc2lnbmVkIGxvbmcgcGFnZXM7XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XFxuIFxcbi1cXHQvKiBDb3JyZXNwb25kaW5nIHRvIFNXUF9XUklURU9LIGNsZWFyaW5nIGluIGRlbF9mcm9tX2F2YWlsX2xpc3QgKi9cXG4tXFx0aWYgKHN3YXBvbikge1xcbi1cXHRcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuLVxcdFxcdHNpLVxcdTAwM2VmbGFncyB8PSBTV1BfV1JJVEVPSztcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKCEoUkVBRF9PTkNFKHNpLVxcdTAwM2VmbGFncykgXFx1MDAyNiBTV1BfV1JJVEVPSykpXFxuLVxcdFxcdFxcdGdvdG8gc2tpcDtcXG4tXFx0fVxcbitcXHQvKlxcbitcXHQgKiBNYXJrIHRoZSBkZXZpY2UgYXMgYXZhaWwgaWYgU1dQX1dSSVRFT0sgaXMgc2V0LiBTd2Fwb2ZmIGNsZWFyc1xcbitcXHQgKiBTV1BfV1JJVEVPSyBmaXJzdCwgc28gY2hlY2sgdGhhdCBmaXJzdCBzbyB0aGUgZGV2aWNlIHdvbid0IGJlXFxuK1xcdCAqIHJlLWFkZGVkIGFmdGVyIHN3YXBvZmYgc3RhcnRlZC5cXG4rXFx0ICovXFxuK1xcdGlmICghKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9XUklURU9LKSlcXG4rXFx0XFx0Z290byBza2lwO1xcbiBcXG4gXFx0aWYgKCEoYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKSBcXHUwMDI2IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxcbiBcXHRcXHRnb3RvIHNraXA7XFxuQEAgLTEyNDYsOSArMTU4NCwxMCBAQCBzdGF0aWMgdm9pZCBhZGRfdG9fYXZhaWxfbGlzdChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIGJvb2wgc3dhcG9uKVxcbiBcXHR2YWwgPSBhdG9taWNfbG9uZ19mZXRjaF9hbmRfcmVsYXhlZCh+U1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgXFx1MDAyNnNpLVxcdTAwM2VpbnVzZV9wYWdlcyk7XFxuIFxcbiBcXHQvKlxcbi1cXHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBkZXZpY2UgaXMgb24gdGhlIHBsaXN0LCBvbmx5IG9uZSB1cGRhdGVyIHdpbGxcXG4tXFx0ICogc2VlIChpbnVzZV9wYWdlcyA9PSBzaS1cXHUwMDNlcGFnZXMpIGFuZCB3aWxsIGNhbGwgZGVsX2Zyb21fYXZhaWxfbGlzdC4gSWZcXG4tXFx0ICogdGhhdCB1cGRhdGVyIGhhcHBlbiB0byBiZSBoZXJlLCBqdXN0IHNraXAgYWRkaW5nLlxcbitcXHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBtYXJrZWQgYXMgYXZhaWxhYmxlLCBvbmUgcmVhZGVyIHdpbGwgc2VlXFxuK1xcdCAqIChpbnVzZV9wYWdlcyA9PSBzaS1cXHUwMDNlcGFnZXMpIGFuZCBzaG91bGQgbWFyayBpdCBhcyB1bmF2YWlsYWJsZSBhbmRcXG4rXFx0ICogc2V0IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQuIElmIHRoYXQgdXBkYXRlciBoYXBwZW5zIHRvIGJlIGhlcmUsIGp1c3RcXG4rXFx0ICogc2tpcCB0aGUgcmVzdC5cXG4gXFx0ICovXFxuIFxcdHBhZ2VzID0gc2ktXFx1MDAzZXBhZ2VzO1xcbiBcXHRpZiAodmFsID09IHBhZ2VzKSB7XFxuQEAgLTEyNTgsNjAgKzE1OTcsNDIgQEAgc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbilcXG4gXFx0XFx0XFx0Z290byBza2lwO1xcbiBcXHR9XFxuIFxcbi1cXHRwbGlzdF9hZGQoXFx1MDAyNnNpLVxcdTAwM2VhdmFpbF9saXN0LCBcXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcXG4tXFxuK1xcdHN3YXBfcXVldWVfdW5tYXNrKHNpKTtcXG4gc2tpcDpcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4gfVxcbiBcXG4gLypcXG4tICogc3dhcF91c2FnZV9hZGQgLyBzd2FwX3VzYWdlX3N1YiBvZiBlYWNoIHNsb3QgYXJlIHNlcmlhbGl6ZWQgYnkgY2ktXFx1MDAzZWxvY2tcXG4tICogd2l0aGluIGVhY2ggY2x1c3Rlciwgc28gdGhlIHRvdGFsIGNvbnRyaWJ1dGlvbiB0byB0aGUgZ2xvYmFsIGNvdW50ZXIgc2hvdWxkXFxuLSAqIGFsd2F5cyBiZSBwb3NpdGl2ZSBhbmQgY2Fubm90IGV4Y2VlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHVzYWJsZSBzbG90cy5cXG4rICogc3dhcF9kZXZpY2VfaW51c2VfYWRkIC8gc3dhcF9kZXZpY2VfaW51c2Vfc3ViIGFyZSBjYWxsZWQgd2l0aGluIGNsdXN0ZXJcXG4rICogdXBkYXRlIGNyaXRpY2FsIHNlY3Rpb25zIGFuZCBzZXJpYWxpemVkIGJ5IGNpLVxcdTAwM2Vsb2NrIHdpdGhpbiBlYWNoIGNsdXN0ZXIsXFxuKyAqIHNvIHRoZSB0b3RhbCBjb250cmlidXRpb24gdG8gdGhlIGdsb2JhbCBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmVcXG4rICogYW5kIGNhbm5vdCBleGNlZWQgdGhlIHRvdGFsIG51bWJlciBvZiB1c2FibGUgc2xvdHMuXFxuICAqL1xcbi1zdGF0aWMgYm9vbCBzd2FwX3VzYWdlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxcbitzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxcbiB7XFxuLVxcdGxvbmcgdmFsID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFxcdTAwMjZzaS1cXHUwMDNlaW51c2VfcGFnZXMpO1xcbitcXHRsb25nIGludXNlX3BhZ2VzO1xcbiBcXG4gXFx0LypcXG4gXFx0ICogSWYgZGV2aWNlIGlzIGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQsXFxuLVxcdCAqIHJlbW92ZSBpdCBmcm9tIHRoZSBwbGlzdC5cXG4tXFx0ICovXFxuLVxcdGlmICh1bmxpa2VseSh2YWwgPT0gc2ktXFx1MDAzZXBhZ2VzKSkge1xcbi1cXHRcXHRkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCBmYWxzZSk7XFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gZmFsc2U7XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIHN3YXBfdXNhZ2Vfc3ViKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXFxuLXtcXG4tXFx0bG9uZyB2YWwgPSBhdG9taWNfbG9uZ19zdWJfcmV0dXJuX3JlbGF4ZWQobnJfZW50cmllcywgXFx1MDAyNnNpLVxcdTAwM2VpbnVzZV9wYWdlcyk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBJZiBkZXZpY2UgaXMgbm90IGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIHNldCxcXG4tXFx0ICogYWRkIGl0IHRvIHRoZSBwbGlzdC5cXG4rXFx0ICogbWFyayBpdCB1bmF2YWlsYWJsZS5cXG4gXFx0ICovXFxuLVxcdGlmICh1bmxpa2VseSh2YWwgXFx1MDAyNiBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSlcXG4tXFx0XFx0YWRkX3RvX2F2YWlsX2xpc3Qoc2ksIGZhbHNlKTtcXG4tfVxcbi1cXG4tc3RhdGljIHZvaWQgc3dhcF9yYW5nZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuLVxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXFxuLXtcXG4tXFx0aWYgKHN3YXBfdXNhZ2VfYWRkKHNpLCBucl9lbnRyaWVzKSkge1xcbitcXHRpbnVzZV9wYWdlcyA9IGF0b21pY19sb25nX2FkZF9yZXR1cm5fcmVsYXhlZChucl9lbnRyaWVzLCBcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKTtcXG4rXFx0aWYgKHVubGlrZWx5KGludXNlX3BhZ2VzID09IHNpLVxcdTAwM2VwYWdlcykpIHtcXG4gXFx0XFx0aWYgKHZtX3N3YXBfZnVsbCgpKVxcbiBcXHRcXHRcXHRzY2hlZHVsZV93b3JrKFxcdTAwMjZzaS1cXHUwMDNlcmVjbGFpbV93b3JrKTtcXG4rXFx0XFx0ZGVsX2Zyb21fYXZhaWxfbGlzdChzaSwgZmFsc2UpO1xcbiBcXHR9XFxuK1xcbiBcXHRhdG9taWNfbG9uZ19zdWIobnJfZW50cmllcywgXFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcXG4tXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxcbitzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9zdWIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcXG4rXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcylcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIGVuZCA9IG9mZnNldCArIG5yX2VudHJpZXMgLSAxO1xcbiBcXHR2b2lkICgqc3dhcF9zbG90X2ZyZWVfbm90aWZ5KShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpO1xcbitcXHRsb25nIGludXNlX3BhZ2VzO1xcbiBcXHR1bnNpZ25lZCBpbnQgaTtcXG4gXFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9lbnRyaWVzOyBpKyspXFxuQEAgLTEzMzUsNyArMTY1NiwxNCBAQCBzdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcXG4gXFx0ICovXFxuIFxcdHNtcF93bWIoKTtcXG4gXFx0YXRvbWljX2xvbmdfYWRkKG5yX2VudHJpZXMsIFxcdTAwMjZucl9zd2FwX3BhZ2VzKTtcXG4tXFx0c3dhcF91c2FnZV9zdWIoc2ksIG5yX2VudHJpZXMpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSWYgZGV2aWNlIGlzIG5vdCBmdWxsLCBhbmQgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBpcyBzZXQsXFxuK1xcdCAqIGFkZCBpdCBiYWNrIHRvIHRoZSBhdmFpbGFibGUgcXVldWUuXFxuK1xcdCAqL1xcbitcXHRpbnVzZV9wYWdlcyA9IGF0b21pY19sb25nX3N1Yl9yZXR1cm5fcmVsYXhlZChucl9lbnRyaWVzLCBcXHUwMDI2c2ktXFx1MDAzZWludXNlX3BhZ2VzKTtcXG4rXFx0aWYgKHVubGlrZWx5KGludXNlX3BhZ2VzIFxcdTAwMjYgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCkpXFxuK1xcdFxcdGFkZF90b19hdmFpbF9saXN0KHNpKTtcXG4gfVxcbiBcXG4gc3RhdGljIGJvb2wgZ2V0X3N3YXBfZGV2aWNlX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbkBAIC0xMzQ1LDExMyArMTY3Myw0OSBAQCBzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIFxcdC8qXFxuIFxcdCAqIEd1YXJhbnRlZSB0aGUgc2ktXFx1MDAzZXVzZXJzIGFyZSBjaGVja2VkIGJlZm9yZSBhY2Nlc3Npbmcgb3RoZXJcXG4gXFx0ICogZmllbGRzIG9mIHN3YXBfaW5mb19zdHJ1Y3QsIGFuZCBzaS1cXHUwMDNlZmxhZ3MgKFNXUF9XUklURU9LKSBpc1xcbi1cXHQgKiB1cCB0byBkYXRlZC5cXG4rXFx0ICogdXAgdG8gZGF0ZS5cXG4gXFx0ICpcXG4tXFx0ICogUGFpcmVkIHdpdGggdGhlIHNwaW5fdW5sb2NrKCkgYWZ0ZXIgc2V0dXBfc3dhcF9pbmZvKCkgaW5cXG4tXFx0ICogZW5hYmxlX3N3YXBfaW5mbygpLCBhbmQgc21wX3dtYigpIGluIHN3YXBvZmYuXFxuK1xcdCAqIFBhaXJlZCB3aXRoIHBlcmNwdV91cF93cml0ZSgpIGluIHN3YXBfZGV2aWNlX2VuYWJsZSgpLCBhbmRcXG4rXFx0ICogc21wX3dtYigpIGFmdGVyIGNsZWFyaW5nIFNXUF9XUklURU9LIGluIHN3YXBvZmYuXFxuIFxcdCAqL1xcbiBcXHRzbXBfcm1iKCk7XFxuIFxcdHJldHVybiB0cnVlO1xcbiB9XFxuIFxcbi0vKlxcbi0gKiBGYXN0IHBhdGggdHJ5IHRvIGdldCBzd2FwIGVudHJpZXMgd2l0aCBzcGVjaWZpZWQgb3JkZXIgZnJvbSBjdXJyZW50XFxuLSAqIENQVSdzIHN3YXAgZW50cnkgcG9vbCAoYSBjbHVzdGVyKS5cXG4tICovXFxuLXN0YXRpYyBib29sIHN3YXBfYWxsb2NfZmFzdChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbitzdGF0aWMgaW50IHN3YXBfYWxsb2NfZW50cnkoc3RydWN0IGZvbGlvICpmb2xpbylcXG4ge1xcbi1cXHR1bnNpZ25lZCBpbnQgb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuLVxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XFxuK1xcdGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuIFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4tXFx0dW5zaWduZWQgaW50IG9mZnNldDtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIE9uY2UgYWxsb2NhdGVkLCBzd2FwX2luZm9fc3RydWN0IHdpbGwgbmV2ZXIgYmUgY29tcGxldGVseSBmcmVlZCxcXG4tXFx0ICogc28gY2hlY2tpbmcgaXQncyBsaXZlbmVzcyBieSBnZXRfc3dhcF9kZXZpY2VfaW5mbyBpcyBlbm91Z2guXFxuLVxcdCAqL1xcbi1cXHRzaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0pO1xcbi1cXHRvZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0W29yZGVyXSk7XFxuLVxcdGlmICghc2kgfHwgIW9mZnNldCB8fCAhZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRjaSA9IHN3YXBfY2x1c3Rlcl9sb2NrKHNpLCBvZmZzZXQpO1xcbi1cXHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIG9yZGVyKSkge1xcbi1cXHRcXHRpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpXFxuLVxcdFxcdFxcdG9mZnNldCA9IGNsdXN0ZXJfb2Zmc2V0KHNpLCBjaSk7XFxuLVxcdFxcdGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHNpLCBjaSwgZm9saW8sIG9mZnNldCk7XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xcbi1cXHR9XFxuK1xcdGludCBucl9pdGVyLCByZXQ7XFxuK1xcbitcXHRwZXJjcHVfZG93bl9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRmb3IgKG5yX2l0ZXIgPSAwOzsgbnJfaXRlcisrKSB7XFxuK1xcdFxcdHNpID0gc3dhcF9xdWV1ZV9nZXRfZGV2aWNlKG5yX3BhZ2VzLCBucl9pdGVyKTtcXG4rXFx0XFx0aWYgKElTX0VSUihzaSkpIHtcXG4rXFx0XFx0XFx0cmV0ID0gUFRSX0VSUihzaSk7XFxuK1xcdFxcdFxcdGlmIChyZXQgPT0gLUVCVVNZKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBmb2xpbyk7XFxuIFxcbi1cXHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xcbi1cXHRyZXR1cm4gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbi19XFxuLVxcbi0vKiBSb3RhdGUgdGhlIGRldmljZSBhbmQgc3dpdGNoIHRvIGEgbmV3IGNsdXN0ZXIgKi9cXG4tc3RhdGljIHZvaWQgc3dhcF9hbGxvY19zbG93KHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLXtcXG4tXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCAqbmV4dDtcXG4tXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4tc3RhcnRfb3ZlcjpcXG4tXFx0cGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzaSwgbmV4dCwgXFx1MDAyNnN3YXBfYXZhaWxfaGVhZCwgYXZhaWxfbGlzdCkge1xcbi1cXHRcXHQvKiBSb3RhdGUgdGhlIGRldmljZSBhbmQgc3dpdGNoIHRvIGEgbmV3IGNsdXN0ZXIgKi9cXG4tXFx0XFx0cGxpc3RfcmVxdWV1ZShcXHUwMDI2c2ktXFx1MDAzZWF2YWlsX2xpc3QsIFxcdTAwMjZzd2FwX2F2YWlsX2hlYWQpO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4tXFx0XFx0aWYgKGdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkge1xcbi1cXHRcXHRcXHRjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIGZvbGlvKTtcXG4tXFx0XFx0XFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0cmV0dXJuO1xcbi1cXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuLVxcdFxcdFxcdFxcdHJldHVybjtcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xcbitcXHRcXHRcXHRyZXQgPSAwO1xcbitcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbiBcXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBpZiB3ZSBnb3QgaGVyZSwgaXQncyBsaWtlbHkgdGhhdCBzaSB3YXMgYWxtb3N0IGZ1bGwgYmVmb3JlLFxcbi1cXHRcXHQgKiBtdWx0aXBsZSBjYWxsZXJzIHByb2JhYmx5IGFsbCB0cmllZCB0byBnZXQgYSBwYWdlIGZyb20gdGhlXFxuLVxcdFxcdCAqIHNhbWUgc2kgYW5kIGl0IGZpbGxlZCB1cCBiZWZvcmUgd2UgY291bGQgZ2V0IG9uZTsgb3IsIHRoZSBzaVxcbi1cXHRcXHQgKiBmaWxsZWQgdXAgYmV0d2VlbiB1cyBkcm9wcGluZyBzd2FwX2F2YWlsX2xvY2suXFxuLVxcdFxcdCAqIFNpbmNlIHdlIGRyb3BwZWQgdGhlIHN3YXBfYXZhaWxfbG9jaywgdGhlIHN3YXBfYXZhaWxfbGlzdFxcbi1cXHRcXHQgKiBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkOyBzbyBpZiBuZXh0IGlzIHN0aWxsIGluIHRoZVxcbi1cXHRcXHQgKiBzd2FwX2F2YWlsX2hlYWQgbGlzdCB0aGVuIHRyeSBpdCwgb3RoZXJ3aXNlIHN0YXJ0IG92ZXIgaWYgd2VcXG4tXFx0XFx0ICogaGF2ZSBub3QgZ290dGVuIGFueSBzbG90cy5cXG4rXFx0XFx0ICogRm9yIGxhcmdlIGFsbG9jYXRpb24sIHJldHVybiBlcnJvciBkaXJlY3RseSB0byBpbmZvcm0gdGhlXFxuK1xcdFxcdCAqIGNhbGxlciB0byBzcGxpdCBpdCBpbnN0ZWFkIG9mIGZhbGxiYWNrIHRvIG90aGVyIGRldmljZXMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRpZiAocGxpc3Rfbm9kZV9lbXB0eShcXHUwMDI2bmV4dC1cXHUwMDNlYXZhaWxfbGlzdCkpXFxuLVxcdFxcdFxcdGdvdG8gc3RhcnRfb3ZlcjtcXG4tXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4tfVxcbi1cXG4tLypcXG4tICogRGlzY2FyZCBwZW5kaW5nIGNsdXN0ZXJzIGluIGEgc3luY2hyb25pemVkIHdheSB3aGVuIHVuZGVyIGhpZ2ggcHJlc3N1cmUuXFxuLSAqIFJldHVybjogdHJ1ZSBpZiBhbnkgY2x1c3RlciBpcyBkaXNjYXJkZWQuXFxuLSAqL1xcbi1zdGF0aWMgYm9vbCBzd2FwX3N5bmNfZGlzY2FyZCh2b2lkKVxcbi17XFxuLVxcdGJvb2wgcmV0ID0gZmFsc2U7XFxuLVxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgKm5leHQ7XFxuLVxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLXN0YXJ0X292ZXI6XFxuLVxcdHBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2ksIG5leHQsIFxcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkLCBsaXN0KSB7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXHRcXHRpZiAoZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKSB7XFxuLVxcdFxcdFxcdGlmIChzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfUEFHRV9ESVNDQVJEKVxcbi1cXHRcXHRcXHRcXHRyZXQgPSBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTtcXG4tXFx0XFx0XFx0cHV0X3N3YXBfZGV2aWNlKHNpKTtcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XFxuK1xcdFxcdFxcdHJldCA9IC1FMkJJRztcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0aWYgKHJldClcXG4tXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdFxcdGlmIChwbGlzdF9ub2RlX2VtcHR5KFxcdTAwMjZuZXh0LVxcdTAwM2VsaXN0KSlcXG4tXFx0XFx0XFx0Z290byBzdGFydF9vdmVyO1xcbiBcXHR9XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbiBcXG4tXFx0cmV0dXJuIGZhbHNlO1xcbitcXHRwZXJjcHVfdXBfcmVhZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4gc3RhdGljIGludCBzd2FwX2V4dGVuZF90YWJsZV9hbGxvYyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuQEAgLTE3MzUsNiArMTk5OSw3IEBAIGludCBmb2xpb19hbGxvY19zd2FwKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xcbiBcXHR1bnNpZ25lZCBpbnQgc2l6ZSA9IDEgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGludCByZXQ7XFxuIFxcbiBcXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xcbiBcXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pLCBmb2xpbyk7XFxuQEAgLTE3NTcsMjMgKzIwMjIsMTQgQEAgaW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1hZ2FpbjpcXG4tXFx0bG9jYWxfbG9jayhcXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcXG4tXFx0aWYgKCFzd2FwX2FsbG9jX2Zhc3QoZm9saW8pKVxcbi1cXHRcXHRzd2FwX2FsbG9jX3Nsb3coZm9saW8pO1xcbi1cXHRsb2NhbF91bmxvY2soXFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XFxuLVxcbi1cXHRpZiAoIW9yZGVyIFxcdTAwMjZcXHUwMDI2IHVubGlrZWx5KCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKSB7XFxuLVxcdFxcdGlmIChzd2FwX3N5bmNfZGlzY2FyZCgpKVxcbi1cXHRcXHRcXHRnb3RvIGFnYWluO1xcbi1cXHR9XFxuK1xcdHJldCA9IHN3YXBfYWxsb2NfZW50cnkoZm9saW8pO1xcbiBcXG4gXFx0LyogTmVlZCB0byBjYWxsIHRoaXMgZXZlbiBpZiBhbGxvY2F0aW9uIGZhaWxlZCwgZm9yIE1FTUNHX1NXQVBfRkFJTC4gKi9cXG4gXFx0aWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwKGZvbGlvKSkpXFxuIFxcdFxcdHN3YXBfY2FjaGVfZGVsX2ZvbGlvKGZvbGlvKTtcXG4gXFxuIFxcdGlmICh1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSlcXG4tXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdFxcdHJldHVybiByZXQgPyByZXQgOiAtRU5PTUVNO1xcbiBcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG5AQCAtMTk0OCw3ICsyMjA0LDcgQEAgdm9pZCBfX3N3YXBfY2x1c3Rlcl9mcmVlX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHRpZiAoYmF0Y2hfaWQpXFxuIFxcdFxcdG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcChiYXRjaF9pZCwgY2lfb2ZmIC0gYmF0Y2hfb2ZmKTtcXG4gXFxuLVxcdHN3YXBfcmFuZ2VfZnJlZShzaSwgY2lfaGVhZCArIGNpX3N0YXJ0LCBucl9wYWdlcyk7XFxuK1xcdHN3YXBfZGV2aWNlX2ludXNlX3N1YihzaSwgY2lfaGVhZCArIGNpX3N0YXJ0LCBucl9wYWdlcyk7XFxuIFxcdHN3YXBfY2x1c3Rlcl9hc3NlcnRfZW1wdHkoY2ksIGNpX3N0YXJ0LCBucl9wYWdlcywgZmFsc2UpO1xcbiBcXG4gXFx0aWYgKCFjaS1cXHUwMDNlY291bnQpXFxuQEAgLTIxNTAsMzEgKzI0MDYsMTQgQEAgdm9pZCBzd2FwX3B1dF9lbnRyaWVzX2RpcmVjdChzd3BfZW50cnlfdCBlbnRyeSwgaW50IG5yKVxcbiAgKi9cXG4gc3dwX2VudHJ5X3Qgc3dhcF9hbGxvY19oaWJlcm5hdGlvbl9zbG90KGludCB0eXBlKVxcbiB7XFxuLVxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwY3Bfc2ksICpzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xcbi1cXHR1bnNpZ25lZCBsb25nIHBjcF9vZmZzZXQsIG9mZnNldCA9IFNXQVBfRU5UUllfSU5WQUxJRDtcXG4tXFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcXG4rXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gU1dBUF9FTlRSWV9JTlZBTElEO1xcbiBcXHRzd3BfZW50cnlfdCBlbnRyeSA9IHswfTtcXG4gXFxuIFxcdGlmICghc2kpXFxuIFxcdFxcdGdvdG8gZmFpbDtcXG4gXFxuLVxcdC8qXFxuLVxcdCAqIFRyeSB0aGUgbG9jYWwgY2x1c3RlciBmaXJzdCBpZiBpdCBtYXRjaGVzIHRoZSBkZXZpY2UuIElmXFxuLVxcdCAqIG5vdCwgdHJ5IGdyYWIgYSBuZXcgY2x1c3RlciBhbmQgb3ZlcnJpZGUgbG9jYWwgY2x1c3Rlci5cXG4tXFx0ICovXFxuLVxcdGxvY2FsX2xvY2soXFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XFxuLVxcdHBjcF9zaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVswXSk7XFxuLVxcdHBjcF9vZmZzZXQgPSB0aGlzX2NwdV9yZWFkKHBlcmNwdV9zd2FwX2NsdXN0ZXIub2Zmc2V0WzBdKTtcXG4tXFx0aWYgKHBjcF9zaSA9PSBzaSBcXHUwMDI2XFx1MDAyNiBwY3Bfb2Zmc2V0KSB7XFxuLVxcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIHBjcF9vZmZzZXQpO1xcbi1cXHRcXHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIDApKVxcbi1cXHRcXHRcXHRvZmZzZXQgPSBhbGxvY19zd2FwX3NjYW5fY2x1c3RlcihzaSwgY2ksIE5VTEwsIHBjcF9vZmZzZXQpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xcbi1cXHR9XFxuLVxcdGlmICghb2Zmc2V0KVxcbi1cXHRcXHRvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpO1xcbi1cXHRsb2NhbF91bmxvY2soXFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XFxuK1xcdG9mZnNldCA9IGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzaSwgTlVMTCk7XFxuIFxcdGlmIChvZmZzZXQpXFxuIFxcdFxcdGVudHJ5ID0gc3dwX2VudHJ5KHNpLVxcdTAwM2V0eXBlLCBvZmZzZXQpO1xcbiBcXG5AQCAtMjIwNSwyNiArMjQ0NCwxOCBAQCB2b2lkIHN3YXBfZnJlZV9oaWJlcm5hdGlvbl9zbG90KHN3cF9lbnRyeV90IGVudHJ5KVxcbiBcXG4gc3RhdGljIGludCBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbiB7XFxuLVxcdGludCB0eXBlO1xcbi1cXG4tXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2c3dhcF9sb2NrKTtcXG4rXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xcbiBcXG4gXFx0aWYgKCFkZXZpY2UpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0Zm9yICh0eXBlID0gMDsgdHlwZSBcXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSsrKSB7XFxuLVxcdFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07XFxuLVxcbi1cXHRcXHRpZiAoIShzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1dSSVRFT0spKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFxuLVxcdFxcdGlmIChkZXZpY2UgPT0gc2lzLVxcdTAwM2ViZGV2LVxcdTAwM2ViZF9kZXYpIHtcXG4tXFx0XFx0XFx0c3RydWN0IHN3YXBfZXh0ZW50ICpzZSA9IGZpcnN0X3NlKHNpcyk7XFxuLVxcbi1cXHRcXHRcXHRpZiAoc2UtXFx1MDAzZXN0YXJ0X2Jsb2NrID09IG9mZnNldClcXG4tXFx0XFx0XFx0XFx0cmV0dXJuIHR5cGU7XFxuK1xcdGZvcl9lYWNoX2F2YWlsX3N3YXAoc2kpIHtcXG4rXFx0XFx0aWYgKGRldmljZSA9PSBzaS1cXHUwMDNlYmRldi1cXHUwMDNlYmRfZGV2KSB7XFxuK1xcdFxcdFxcdGlmIChmaXJzdF9zZShzaSktXFx1MDAzZXN0YXJ0X2Jsb2NrID09IG9mZnNldClcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIHNpLVxcdTAwM2V0eXBlO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4rXFxuIFxcdHJldHVybiAtRU5PREVWO1xcbiB9XFxuIFxcbkBAIC0yMjQ3LDIxICsyNDc4LDE4IEBAIHN0YXRpYyBpbnQgX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldClcXG4gICovXFxuIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbiB7XFxuLVxcdGludCB0eXBlO1xcbitcXHRpbnQgcmV0O1xcbiBcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcbi1cXHR0eXBlID0gX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZpY2UsIG9mZnNldCk7XFxuLVxcdGlmICh0eXBlIFxcdTAwM2MgMCkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0cmV0dXJuIHR5cGU7XFxuLVxcdH1cXG4rXFx0cGVyY3B1X2Rvd25fd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdHJldCA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuIFxcbi1cXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xcbitcXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHJldCk7XFxuIFxcdGlmIChXQVJOX09OX09OQ0UoIXNpKSkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0cmV0dXJuIC1FTk9ERVY7XFxuK1xcdFxcdHJldCA9IC1FTk9ERVY7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHQvKlxcbkBAIC0yMjcwLDE0ICsyNDk4LDE1IEBAIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbiBcXHQgKiB0aGUgc2FtZSBzZXNzaW9uLlxcbiBcXHQgKi9cXG4gXFx0aWYgKFdBUk5fT05fT05DRShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfSElCRVJOQVRJT04pKSB7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHRzaS1cXHUwMDNlZmxhZ3MgfD0gU1dQX0hJQkVSTkFUSU9OO1xcbiBcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdHJldHVybiB0eXBlO1xcbitvdXQ6XFxuK1xcdHBlcmNwdV91cF93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4gLyoqXFxuQEAgLTIyOTQsMTQgKzI1MjMsMTEgQEAgdm9pZCB1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoaW50IHR5cGUpXFxuIHtcXG4gXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xcbiBcXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfZG93bl93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gXFx0c2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcXG4tXFx0aWYgKCFzaSkge1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXHR9XFxuLVxcdHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2PSB+U1dQX0hJQkVSTkFUSU9OO1xcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4rXFx0aWYgKHNpKVxcbitcXHRcXHRzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNj0gflNXUF9ISUJFUk5BVElPTjtcXG4rXFx0cGVyY3B1X3VwX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiB9XFxuIFxcbiAvKipcXG5AQCAtMjMyNiwyOSArMjU1MiwyNiBAQCBpbnQgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXFxuIHtcXG4gXFx0aW50IHR5cGU7XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV9kb3duX3JlYWQoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcdHR5cGUgPSBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldmljZSwgb2Zmc2V0KTtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXG4gXFx0cmV0dXJuIHR5cGU7XFxuIH1cXG4gXFxuIGludCBmaW5kX2ZpcnN0X3N3YXAoZGV2X3QgKmRldmljZSlcXG4ge1xcbi1cXHRpbnQgdHlwZTtcXG4tXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0Zm9yICh0eXBlID0gMDsgdHlwZSBcXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSsrKSB7XFxuLVxcdFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07XFxuK1xcdGludCByZXQgPSAtRU5PREVWO1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuIFxcbi1cXHRcXHRpZiAoIShzaXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1dSSVRFT0spKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0KmRldmljZSA9IHNpcy1cXHUwMDNlYmRldi1cXHUwMDNlYmRfZGV2O1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0cmV0dXJuIHR5cGU7XFxuK1xcdHBlcmNwdV9kb3duX3JlYWQoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdGZvcl9lYWNoX2F2YWlsX3N3YXAoc2kpIHtcXG4rXFx0XFx0KmRldmljZSA9IHNpLVxcdTAwM2ViZGV2LVxcdTAwM2ViZF9kZXY7XFxuK1xcdFxcdHJldCA9IHNpLVxcdTAwM2V0eXBlO1xcbitcXHRcXHRicmVhaztcXG4gXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0cmV0dXJuIC1FTk9ERVY7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbiAvKlxcbkBAIC0yMzc2LDcgKzI1OTksNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IG4gPSAwO1xcbiBcXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfZG93bl9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXHRpZiAoKHVuc2lnbmVkIGludCl0eXBlIFxcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XFxuIFxcdFxcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMgPSBzd2FwX2luZm9bdHlwZV07XFxuIFxcbkBAIC0yMzg4LDcgKzI2MTEsNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXFxuIFxcdFxcdH1cXG4gXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNpcy1cXHUwMDNlbG9jayk7XFxuIFxcdH1cXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXHRyZXR1cm4gbjtcXG4gfVxcbiAjZW5kaWYgLyogQ09ORklHX0hJQkVSTkFUSU9OICovXFxuQEAgLTI3MDAsMTAgKzI5MjMsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX25leHRfdG9fdW51c2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiBcXHR1bnNpZ25lZCBsb25nIHN3cF90YjtcXG4gXFxuIFxcdC8qXFxuLVxcdCAqIE5vIG5lZWQgZm9yIHN3YXBfbG9jayBoZXJlOiB3ZSdyZSBqdXN0IGxvb2tpbmdcXG4rXFx0ICogTm8gbmVlZCBmb3Igc3dhcG9uX3J3c2VtIGhlcmU6IHdlJ3JlIGp1c3QgbG9va2luZ1xcbiBcXHQgKiBmb3Igd2hldGhlciBhbiBlbnRyeSBpcyBpbiB1c2UsIG5vdCBtb2RpZnlpbmcgaXQ7IGZhbHNlXFxuIFxcdCAqIGhpdHMgYXJlIG9rYXksIGFuZCBzeXNfc3dhcG9mZigpIGhhcyBhbHJlYWR5IHByZXZlbnRlZCBuZXdcXG4tXFx0ICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcF9sb2NrKS5cXG4rXFx0ICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcG9uX3J3c2VtKS5cXG4gXFx0ICovXFxuIFxcdGZvciAoaSA9IHByZXYgKyAxOyBpIFxcdTAwM2Mgc2ktXFx1MDAzZW1heDsgaSsrKSB7XFxuIFxcdFxcdHN3cF90YiA9IHN3YXBfdGFibGVfZ2V0KF9fc3dhcF9vZmZzZXRfdG9fY2x1c3RlcihzaSwgaSksXFxuQEAgLTI4MTYsNyArMzAzOSw3IEBAIHN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKVxcbiBzdWNjZXNzOlxcbiBcXHQvKlxcbiBcXHQgKiBNYWtlIHN1cmUgdGhhdCBmdXJ0aGVyIGNsZWFudXBzIGFmdGVyIHRyeV90b191bnVzZSgpIHJldHVybnMgaGFwcGVuXFxuLVxcdCAqIGFmdGVyIHN3YXBfcmFuZ2VfZnJlZSgpIHJlZHVjZXMgc2ktXFx1MDAzZWludXNlX3BhZ2VzIHRvIDAuXFxuK1xcdCAqIGFmdGVyIHN3YXBfZGV2aWNlX2ludXNlX3N1YigpIHJlZHVjZXMgc2ktXFx1MDAzZWludXNlX3BhZ2VzIHRvIDAuXFxuIFxcdCAqL1xcbiBcXHRzbXBfbWIoKTtcXG4gXFx0cmV0dXJuIDA7XFxuQEAgLTI4MjQsMTggKzMwNDcsMjAgQEAgc3RhdGljIGludCB0cnlfdG9fdW51c2UodW5zaWduZWQgaW50IHR5cGUpXFxuIFxcbiAvKlxcbiAgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgdHJ5X3RvX3VudXNlLCBpZiBubyBzd2FwIGlzIG5vdyBpbiB1c2UsIHdlIGtub3dcXG4tICogd2UgY2FuIGVtcHR5IHRoZSBtbWxpc3QuICBzd2FwX2xvY2sgbXVzdCBiZSBoZWxkIG9uIGVudHJ5IGFuZCBleGl0Llxcbi0gKiBOb3RlIHRoYXQgbW1saXN0X2xvY2sgbmVzdHMgaW5zaWRlIHN3YXBfbG9jaywgYW5kIGFuIG1tIG11c3QgYmVcXG4rICogd2UgY2FuIGVtcHR5IHRoZSBtbWxpc3QuIHN3YXBvbl9yd3NlbSBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuXFxuKyAqIE5vdGUgdGhhdCBtbWxpc3RfbG9jayBuZXN0cyBpbnNpZGUgc3dhcG9uX3J3c2VtLCBhbmQgYW4gbW0gbXVzdCBiZVxcbiAgKiBhZGRlZCB0byB0aGUgbW1saXN0IGp1c3QgYWZ0ZXIgcGFnZV9kdXBsaWNhdGUgLSBiZWZvcmUgd291bGQgYmUgcmFjeS5cXG4gICovXFxuIHN0YXRpYyB2b2lkIGRyYWluX21tbGlzdCh2b2lkKVxcbiB7XFxuK1xcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcXG4gXFx0c3RydWN0IGxpc3RfaGVhZCAqcCwgKm5leHQ7XFxuLVxcdHVuc2lnbmVkIGludCB0eXBlO1xcbiBcXG4tXFx0Zm9yICh0eXBlID0gMDsgdHlwZSBcXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSsrKVxcbi1cXHRcXHRpZiAoc3dhcF91c2FnZV9pbl9wYWdlcyhzd2FwX2luZm9bdHlwZV0pKVxcbitcXHRmb3JfZWFjaF9zd2FwKHNpKSB7XFxuK1xcdFxcdGlmIChzd2FwX3VzYWdlX2luX3BhZ2VzKHNpKSlcXG4gXFx0XFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbiBcXHRzcGluX2xvY2soXFx1MDAyNm1tbGlzdF9sb2NrKTtcXG4gXFx0bGlzdF9mb3JfZWFjaF9zYWZlKHAsIG5leHQsIFxcdTAwMjZpbml0X21tLm1tbGlzdClcXG4gXFx0XFx0bGlzdF9kZWxfaW5pdChwKTtcXG5AQCAtMjk2OCw1OCArMzE5Myw2NSBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfZXh0ZW50cyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzLFxcbiBcXHRyZXR1cm4gZ2VuZXJpY19zd2FwZmlsZV9hY3RpdmF0ZShzaXMsIHN3YXBfZmlsZSwgc3Bhbik7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIF9lbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4te1xcbi1cXHRhdG9taWNfbG9uZ19hZGQoc2ktXFx1MDAzZXBhZ2VzLCBcXHUwMDI2bnJfc3dhcF9wYWdlcyk7XFxuLVxcdHRvdGFsX3N3YXBfcGFnZXMgKz0gc2ktXFx1MDAzZXBhZ2VzO1xcbi1cXG4tXFx0YXNzZXJ0X3NwaW5fbG9ja2VkKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXG4tXFx0cGxpc3RfYWRkKFxcdTAwMjZzaS1cXHUwMDNlbGlzdCwgXFx1MDAyNnN3YXBfYWN0aXZlX2hlYWQpO1xcbi1cXG4tXFx0LyogQWRkIGJhY2sgdG8gYXZhaWxhYmxlIGxpc3QgKi9cXG4tXFx0YWRkX3RvX2F2YWlsX2xpc3Qoc2ksIHRydWUpO1xcbi19XFxuLVxcbiAvKlxcbi0gKiBDYWxsZWQgYWZ0ZXIgdGhlIHN3YXAgZGV2aWNlIGlzIHJlYWR5LCByZXN1cnJlY3QgaXRzIHBlcmNwdSByZWYsIGl0J3Mgbm93XFxuLSAqIHNhZmUgdG8gcmVmZXJlbmNlIGl0LiBBZGQgaXQgdG8gdGhlIGxpc3QgdG8gZXhwb3NlIGl0IHRvIHRoZSBhbGxvY2F0b3IuXFxuKyAqIENhbGxlZCBhZnRlciB0aGUgc3dhcCBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgdXNlZC4gTWFya2luZyBpdCB3cml0YWJsZSBhbmRcXG4rICogZXhwb3NpbmcgaXQgdG8gdGhlIGFsbG9jYXRvci4gUmVzdXJyZWN0IGl0cyBwZXJjcHUgcmVmIGlmIGl0IHdhcyBkZWFkIGJlZm9yZS5cXG4gICovXFxuLXN0YXRpYyB2b2lkIGVuYWJsZV9zd2FwX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbitzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9lbmFibGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbiB7XFxuLVxcdHBlcmNwdV9yZWZfcmVzdXJyZWN0KFxcdTAwMjZzaS1cXHUwMDNldXNlcnMpO1xcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbi1cXHRfZW5hYmxlX3N3YXBfaW5mbyhzaSk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi19XFxuK1xcdHBlcmNwdV9kb3duX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHRzaS1cXHUwMDNlZmxhZ3MgfD0gU1dQX1dSSVRFT0s7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4rXFx0YXRvbWljX2xvbmdfYWRkKHNpLVxcdTAwM2VwYWdlcywgXFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xcbitcXHR0b3RhbF9zd2FwX3BhZ2VzICs9IHNpLVxcdTAwM2VwYWdlcztcXG4rXFx0cGVyY3B1X3VwX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXG4tc3RhdGljIHZvaWQgcmVpbnNlcnRfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG4te1xcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c2ktXFx1MDAzZWxvY2spO1xcbi1cXHRfZW5hYmxlX3N3YXBfaW5mbyhzaSk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzaS1cXHUwMDNlbG9jayk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRhZGRfdG9fYXZhaWxfbGlzdChzaSk7XFxuIH1cXG4gXFxuLS8qXFxuLSAqIENhbGxlZCBhZnRlciBjbGVhcmluZyBTV1BfV1JJVEVPSywgZW5zdXJlcyBjbHVzdGVyX2FsbG9jX3JhbmdlXFxuLSAqIHNlZSB0aGUgdXBkYXRlZCBmbGFncywgc28gdGhlcmUgd2lsbCBiZSBubyBtb3JlIGFsbG9jYXRpb25zLlxcbi0gKi9cXG4tc3RhdGljIHZvaWQgd2FpdF9mb3JfYWxsb2NhdGlvbihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuK3N0YXRpYyBpbnQgc3dhcF9kZXZpY2VfZGlzYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBvZmZzZXQ7XFxuIFxcdHVuc2lnbmVkIGxvbmcgZW5kID0gQUxJR04oc2ktXFx1MDAzZW1heCwgU1dBUEZJTEVfQ0xVU1RFUik7XFxuIFxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XFxuIFxcbi1cXHRCVUdfT04oc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1dSSVRFT0spO1xcbitcXHQvKlxcbitcXHQgKiBJZiBTV1BfV1JJVEVPSyBpcyBub3Qgc2V0OiBhbm90aGVyIHByb2Nlc3MgYWxyZWFkeSBkaXNhYmxpbmcgaXQuXFxuK1xcdCAqIElmIFNXUF9ISUJFUk5BVElPTiBpcyBzZXQ6IHRoZSBkZXZpY2UgaXMgcGlubmVkIGZvciBoaWJlcm5hdGlvbi5cXG4rXFx0ICovXFxuK1xcdHBlcmNwdV9kb3duX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRpZiAoIShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfV1JJVEVPSykgfHxcXG4rXFx0ICAgIHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9ISUJFUk5BVElPTikge1xcbitcXHRcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChzZWN1cml0eV92bV9lbm91Z2hfbWVtb3J5X21tKGN1cnJlbnQtXFx1MDAzZW1tLCBzaS1cXHUwMDNlcGFnZXMpKSB7XFxuK1xcdFxcdHBlcmNwdV91cF93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdH1cXG4rXFx0dm1fdW5hY2N0X21lbW9yeShzaS1cXHUwMDNlcGFnZXMpO1xcbitcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcXG4rXFx0c2ktXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5TV1BfV1JJVEVPSztcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xcbitcXHR0b3RhbF9zd2FwX3BhZ2VzIC09IHNpLVxcdTAwM2VwYWdlcztcXG4rXFx0YXRvbWljX2xvbmdfc3ViKHNpLVxcdTAwM2VwYWdlcywgXFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xcbitcXHRkZWxfZnJvbV9hdmFpbF9saXN0KHNpLCB0cnVlKTtcXG4rXFx0cGVyY3B1X3VwX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogU3dhcCBhbGxvY2F0b3IgZG9lc24ndCB0b3VjaCBzaSBsb2NrLCBzbyBsb29waW5nIHRocm91Z2ggYWxsXFxuK1xcdCAqIGNpIGxvY2tzIGVuc3VyZXMgX19zd2FwX2NsdXN0ZXJfYWxsb2NfZW50cmllcyBzZWVzIHRoZVxcbitcXHQgKiB1cGRhdGVkIGZsYWdzLCBhbmQgbm8gbW9yZSBhbGxvY2F0aW9ucyB3aWxsIG9jY3VyLlxcbitcXHQgKi9cXG4gXFx0Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgXFx1MDAzYyBlbmQ7IG9mZnNldCArPSBTV0FQRklMRV9DTFVTVEVSKSB7XFxuIFxcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XFxuIFxcdFxcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xcbiBcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcXG5AQCAtMzA0MywyOCArMzI3NSw2IEBAIHN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXFxuIFxcdGt2ZnJlZShjbHVzdGVyX2luZm8pO1xcbiB9XFxuIFxcbi0vKlxcbi0gKiBDYWxsZWQgYWZ0ZXIgc3dhcCBkZXZpY2UncyByZWZlcmVuY2UgY291bnQgaXMgZGVhZCwgc29cXG4tICogbmVpdGhlciBzY2FuIG5vciBhbGxvY2F0aW9uIHdpbGwgdXNlIGl0Llxcbi0gKi9cXG4tc3RhdGljIHZvaWQgZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuLXtcXG4tXFx0aW50IGNwdSwgaTtcXG4tXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKipwY3Bfc2k7XFxuLVxcbi1cXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuLVxcdFxcdHBjcF9zaSA9IHBlcl9jcHVfcHRyKHBlcmNwdV9zd2FwX2NsdXN0ZXIuc2ksIGNwdSk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEludmFsaWRhdGUgdGhlIHBlcmNwdSBzd2FwIGNsdXN0ZXIgY2FjaGUsIHNpLVxcdTAwM2V1c2Vyc1xcbi1cXHRcXHQgKiBpcyBkZWFkLCBzbyBubyBuZXcgdXNlciB3aWxsIHBvaW50IHRvIGl0LCBqdXN0IGZsdXNoXFxuLVxcdFxcdCAqIGFueSBleGlzdGluZyB1c2VyLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFNXQVBfTlJfT1JERVJTOyBpKyspXFxuLVxcdFxcdFxcdGNtcHhjaGcoXFx1MDAyNnBjcF9zaVtpXSwgc2ksIE5VTEwpO1xcbi1cXHR9XFxuLX1cXG4tXFxuLVxcbiBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXFxuIHtcXG4gXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnAgPSBOVUxMO1xcbkBAIC0zMDg2LDQ0ICszMjk2LDIyIEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcXG4gXFx0XFx0cmV0dXJuIFBUUl9FUlIodmljdGltKTtcXG4gXFxuIFxcdG1hcHBpbmcgPSB2aWN0aW0tXFx1MDAzZWZfbWFwcGluZztcXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXHRwbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBcXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCwgbGlzdCkge1xcbi1cXHRcXHRpZiAocC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfV1JJVEVPSykge1xcbi1cXHRcXHRcXHRpZiAocC1cXHUwMDNlc3dhcF9maWxlLVxcdTAwM2VmX21hcHBpbmcgPT0gbWFwcGluZykge1xcbi1cXHRcXHRcXHRcXHRmb3VuZCA9IDE7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHR9XFxuK1xcdHBlcmNwdV9kb3duX3JlYWQoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdGZvcl9lYWNoX2F2YWlsX3N3YXAocCkge1xcbitcXHRcXHRpZiAocC1cXHUwMDNlc3dhcF9maWxlLVxcdTAwM2VmX21hcHBpbmcgPT0gbWFwcGluZykge1xcbitcXHRcXHRcXHRmb3VuZCA9IDE7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4tXFx0aWYgKCFmb3VuZCkge1xcbi1cXHRcXHRlcnIgPSAtRUlOVkFMO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0Z290byBvdXRfZHB1dDtcXG4tXFx0fVxcbi1cXG4tXFx0LyogUmVmdXNlIHN3YXBvZmYgd2hpbGUgdGhlIGRldmljZSBpcyBwaW5uZWQgZm9yIGhpYmVybmF0aW9uICovXFxuLVxcdGlmIChwLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9ISUJFUk5BVElPTikge1xcbi1cXHRcXHRlcnIgPSAtRUJVU1k7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbi1cXHRcXHRnb3RvIG91dF9kcHV0O1xcbi1cXHR9XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbitcXHRmaWxwX2Nsb3NlKHZpY3RpbSwgTlVMTCk7XFxuIFxcbi1cXHRpZiAoIXNlY3VyaXR5X3ZtX2Vub3VnaF9tZW1vcnlfbW0oY3VycmVudC1cXHUwMDNlbW0sIHAtXFx1MDAzZXBhZ2VzKSlcXG4tXFx0XFx0dm1fdW5hY2N0X21lbW9yeShwLVxcdTAwM2VwYWdlcyk7XFxuLVxcdGVsc2Uge1xcbi1cXHRcXHRlcnIgPSAtRU5PTUVNO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4tXFx0XFx0Z290byBvdXRfZHB1dDtcXG4tXFx0fVxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnAtXFx1MDAzZWxvY2spO1xcbi1cXHRkZWxfZnJvbV9hdmFpbF9saXN0KHAsIHRydWUpO1xcbi1cXHRwbGlzdF9kZWwoXFx1MDAyNnAtXFx1MDAzZWxpc3QsIFxcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkKTtcXG4tXFx0YXRvbWljX2xvbmdfc3ViKHAtXFx1MDAzZXBhZ2VzLCBcXHUwMDI2bnJfc3dhcF9wYWdlcyk7XFxuLVxcdHRvdGFsX3N3YXBfcGFnZXMgLT0gcC1cXHUwMDNlcGFnZXM7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZwLVxcdTAwM2Vsb2NrKTtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdGlmICghZm91bmQpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0d2FpdF9mb3JfYWxsb2NhdGlvbihwKTtcXG4rXFx0ZXJyID0gc3dhcF9kZXZpY2VfZGlzYWJsZShwKTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4gXFxuIFxcdHNldF9jdXJyZW50X29vbV9vcmlnaW4oKTtcXG4gXFx0ZXJyID0gdHJ5X3RvX3VudXNlKHAtXFx1MDAzZXR5cGUpO1xcbkBAIC0zMTMxLDEwICszMzE5LDEzIEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcXG4gXFxuIFxcdGlmIChlcnIpIHtcXG4gXFx0XFx0LyogcmUtaW5zZXJ0IHN3YXAgc3BhY2UgYmFjayBpbnRvIHN3YXBfbGlzdCAqL1xcbi1cXHRcXHRyZWluc2VydF9zd2FwX2luZm8ocCk7XFxuLVxcdFxcdGdvdG8gb3V0X2RwdXQ7XFxuK1xcdFxcdHN3YXBfZGV2aWNlX2VuYWJsZShwKTtcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4gXFx0fVxcbiBcXG4rXFx0cGVyY3B1X2Rvd25fd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdHN3YXBfcXVldWVfZGVsKHApO1xcbitcXG4gXFx0LypcXG4gXFx0ICogV2FpdCBmb3Igc3dhcCBvcGVyYXRpb25zIHByb3RlY3RlZCBieSBnZXQvcHV0X3N3YXBfZGV2aWNlKClcXG4gXFx0ICogdG8gY29tcGxldGUuICBCZWNhdXNlIG9mIHN5bmNocm9uaXplX3JjdSgpIGhlcmUsIGFsbCBzd2FwXFxuQEAgLTMxNDksMTUgKzMzNDAsMTIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxcbiBcXG4gXFx0Zmx1c2hfd29yayhcXHUwMDI2cC1cXHUwMDNlZGlzY2FyZF93b3JrKTtcXG4gXFx0Zmx1c2hfd29yayhcXHUwMDI2cC1cXHUwMDNlcmVjbGFpbV93b3JrKTtcXG4tXFx0Zmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihwKTtcXG4gXFxuIFxcdGRlc3Ryb3lfc3dhcF9leHRlbnRzKHAsIHAtXFx1MDAzZXN3YXBfZmlsZSk7XFxuIFxcbiBcXHRpZiAoIShwLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcXG4gXFx0XFx0YXRvbWljX2RlYyhcXHUwMDI2bnJfcm90YXRlX3N3YXApO1xcbiBcXG4tXFx0bXV0ZXhfbG9jayhcXHUwMDI2c3dhcG9uX211dGV4KTtcXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbiBcXHRzcGluX2xvY2soXFx1MDAyNnAtXFx1MDAzZWxvY2spO1xcbiBcXHRkcmFpbl9tbWxpc3QoKTtcXG4gXFxuQEAgLTMxNjgsMTAgKzMzNTYsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxcbiBcXHRwLVxcdTAwM2VtYXggPSAwO1xcbiBcXHRwLVxcdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xcbiBcXHRzcGluX3VubG9jayhcXHUwMDI2cC1cXHUwMDNlbG9jayk7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcdGFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC1cXHUwMDNldHlwZSk7XFxuIFxcdHpzd2FwX3N3YXBvZmYocC1cXHUwMDNldHlwZSk7XFxuLVxcdG11dGV4X3VubG9jayhcXHUwMDI2c3dhcG9uX211dGV4KTtcXG4rXFx0ZnJlZV9wZXJjcHUocC1cXHUwMDNlcGVyY3B1X2NsdXN0ZXIpO1xcbitcXHRwLVxcdTAwM2VwZXJjcHVfY2x1c3RlciA9IE5VTEw7XFxuIFxcdGtmcmVlKHAtXFx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcXG4gXFx0cC1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXIgPSBOVUxMO1xcbiBcXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xcbkBAIC0zMTg3LDE4ICszMzc2LDE5IEBAIFNZU0NBTExfREVGSU5FMShzd2Fwb2ZmLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSlcXG4gXFx0ICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28gdGhhdCBzd2Fwb25cXG4gXFx0ICogY2FuIHJldXNlIHRoaXMgc3dhcF9pbmZvIGluIGFsbG9jX3N3YXBfaW5mbygpIHNhZmVseS4gIEl0IGlzIG9rIHRvXFxuIFxcdCAqIG5vdCBob2xkIHAtXFx1MDAzZWxvY2sgYWZ0ZXIgd2UgY2xlYXJlZCBpdHMgU1dQX1dSSVRFT0suXFxuK1xcdCAqXFxuK1xcdCAqIFRoZSB3cml0ZSBsb2NrIGVuc3VyZXMgdGhlIGZsYWcgY2xlYXIgaXMgdmlzaWJsZSB0byBsb2NrbGVzc1xcbitcXHQgKiByZWFkZXJzIG9mIHN3YXBfdHlwZV90b19pbmZvKCkgYmVmb3JlIGFsbG9jX3N3YXBfaW5mbygpIHJldXNlc1xcbitcXHQgKiB0aGlzIHNsb3QuXFxuIFxcdCAqL1xcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV9kb3duX3dyaXRlKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXHRwLVxcdTAwM2VmbGFncyA9IDA7XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcbi1cXHRlcnIgPSAwO1xcbiBcXHRhdG9taWNfaW5jKFxcdTAwMjZwcm9jX3BvbGxfZXZlbnQpO1xcbiBcXHR3YWtlX3VwX2ludGVycnVwdGlibGUoXFx1MDAyNnByb2NfcG9sbF93YWl0KTtcXG4gXFxuLW91dF9kcHV0Olxcbi1cXHRmaWxwX2Nsb3NlKHZpY3RpbSwgTlVMTCk7XFxuLVxcdHJldHVybiBlcnI7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbiAjaWZkZWYgQ09ORklHX1BST0NfRlNcXG5AQCAtMzIxNiwyMCArMzQwNiwxOCBAQCBzdGF0aWMgX19wb2xsX3Qgc3dhcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdClcXG4gXFx0cmV0dXJuIEVQT0xMSU4gfCBFUE9MTFJETk9STTtcXG4gfVxcbiBcXG4tLyogaXRlcmF0b3IgKi9cXG4gc3RhdGljIHZvaWQgKnN3YXBfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzd2FwLCBsb2ZmX3QgKnBvcylcXG4ge1xcbiBcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XFxuLVxcdGludCB0eXBlO1xcbiBcXHRsb2ZmX3QgbCA9ICpwb3M7XFxuIFxcbi1cXHRtdXRleF9sb2NrKFxcdTAwMjZzd2Fwb25fbXV0ZXgpO1xcbitcXHRwZXJjcHVfZG93bl9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiBcXG4gXFx0aWYgKCFsKVxcbiBcXHRcXHRyZXR1cm4gU0VRX1NUQVJUX1RPS0VOO1xcbiBcXG4tXFx0Zm9yICh0eXBlID0gMDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlKyspIHtcXG4tXFx0XFx0aWYgKCEoc2ktXFx1MDAzZXN3YXBfZmlsZSkpXFxuK1xcdGZvcl9lYWNoX3N3YXAoc2kpIHtcXG4rXFx0XFx0aWYgKCFzaS1cXHUwMDNlc3dhcF9maWxlKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0aWYgKCEtLWwpXFxuIFxcdFxcdFxcdHJldHVybiBzaTtcXG5AQCAtMzI1MCw3ICszNDM4LDcgQEAgc3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxcbiBcXG4gXFx0KysoKnBvcyk7XFxuIFxcdGZvciAoOyAoc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKSk7IHR5cGUrKykge1xcbi1cXHRcXHRpZiAoIShzaS1cXHUwMDNlc3dhcF9maWxlKSlcXG4rXFx0XFx0aWYgKCEoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1VTRUQpIHx8ICEoc2ktXFx1MDAzZXN3YXBfZmlsZSkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHRyZXR1cm4gc2k7XFxuIFxcdH1cXG5AQCAtMzI2MCw3ICszNDQ4LDcgQEAgc3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxcbiBcXG4gc3RhdGljIHZvaWQgc3dhcF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdilcXG4ge1xcbi1cXHRtdXRleF91bmxvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IHN3YXBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXFxuQEAgLTMzNTMsMTMgKzM1NDEsMTMgQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICphbGxvY19zd2FwX2luZm8odm9pZClcXG4gXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuIFxcdH1cXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9sb2NrKTtcXG4rXFx0cGVyY3B1X2Rvd25fd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcdGZvciAodHlwZSA9IDA7IHR5cGUgXFx1MDAzYyBucl9zd2FwZmlsZXM7IHR5cGUrKykge1xcbiBcXHRcXHRpZiAoIShzd2FwX2luZm9bdHlwZV0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1VTRUQpKVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0fVxcbiBcXHRpZiAodHlwZSBcXHUwMDNlPSBNQVhfU1dBUEZJTEVTKSB7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuIFxcdFxcdHBlcmNwdV9yZWZfZXhpdChcXHUwMDI2cC1cXHUwMDNldXNlcnMpO1xcbiBcXHRcXHRrdmZyZWUocCk7XFxuIFxcdFxcdHJldHVybiBFUlJfUFRSKC1FUEVSTSk7XFxuQEAgLTMzODEsMTAgKzM1NjksOCBAQCBzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKmFsbG9jX3N3YXBfaW5mbyh2b2lkKVxcbiBcXHRcXHQgKi9cXG4gXFx0fVxcbiBcXHRwLVxcdTAwM2Vzd2FwX2V4dGVudF9yb290ID0gUkJfUk9PVDtcXG4tXFx0cGxpc3Rfbm9kZV9pbml0KFxcdTAwMjZwLVxcdTAwM2VsaXN0LCAwKTtcXG4tXFx0cGxpc3Rfbm9kZV9pbml0KFxcdTAwMjZwLVxcdTAwM2VhdmFpbF9saXN0LCAwKTtcXG4gXFx0cC1cXHUwMDNlZmxhZ3MgPSBTV1BfVVNFRDtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gXFx0aWYgKGRlZmVyKSB7XFxuIFxcdFxcdHBlcmNwdV9yZWZfZXhpdChcXHUwMDI2ZGVmZXItXFx1MDAzZXVzZXJzKTtcXG4gXFx0XFx0a3ZmcmVlKGRlZmVyKTtcXG5AQCAtMzQ1Myw5ICszNjM5LDggQEAgX193ZWFrIHVuc2lnbmVkIGxvbmcgYXJjaF9tYXhfc3dhcGZpbGVfc2l6ZSh2b2lkKVxcbiBcXHRyZXR1cm4gZ2VuZXJpY19tYXhfc3dhcGZpbGVfc2l6ZSgpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4tXFx0XFx0XFx0XFx0XFx0dW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxcbi1cXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSlcXG4ge1xcbiBcXHRpbnQgaTtcXG4gXFx0dW5zaWduZWQgbG9uZyBtYXhwYWdlcztcXG5AQCAtMzUyMiw3ICszNzA3LDcgQEAgc3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbiB7XFxuIFxcdHVuc2lnbmVkIGxvbmcgbnJfY2x1c3RlcnMgPSBESVZfUk9VTkRfVVAobWF4cGFnZXMsIFNXQVBGSUxFX0NMVVNURVIpO1xcbiBcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbztcXG4tXFx0aW50IGVyciA9IC1FTk9NRU07XFxuK1xcdGludCBjcHUsIGVyciA9IC1FTk9NRU07XFxuIFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4gXFxuIFxcdGNsdXN0ZXJfaW5mbyA9IGt2emFsbG9jX29ianMoKmNsdXN0ZXJfaW5mbywgbnJfY2x1c3RlcnMpO1xcbkBAIC0zNTMyLDEzICszNzE3LDI2IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX2NsdXN0ZXJzOyBpKyspXFxuIFxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZjbHVzdGVyX2luZm9baV0ubG9jayk7XFxuIFxcbi1cXHRpZiAoIShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfU09MSURTVEFURSkpIHtcXG4rXFx0aWYgKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSB7XFxuK1xcdFxcdHNpLVxcdTAwM2VwZXJjcHVfY2x1c3RlciA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIpO1xcbitcXHRcXHRpZiAoIXNpLVxcdTAwM2VwZXJjcHVfY2x1c3RlcilcXG4rXFx0XFx0XFx0Z290byBlcnI7XFxuK1xcbitcXHRcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuK1xcdFxcdFxcdHN0cnVjdCBwZXJjcHVfY2x1c3RlciAqY2x1c3RlcjtcXG4rXFxuK1xcdFxcdFxcdGNsdXN0ZXIgPSBwZXJfY3B1X3B0cihzaS1cXHUwMDNlcGVyY3B1X2NsdXN0ZXIsIGNwdSk7XFxuK1xcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBTV0FQX05SX09SREVSUzsgaSsrKVxcbitcXHRcXHRcXHRcXHRjbHVzdGVyLVxcdTAwM2VuZXh0W2ldID0gU1dBUF9FTlRSWV9JTlZBTElEO1xcbitcXHRcXHRcXHRsb2NhbF9sb2NrX2luaXQoXFx1MDAyNmNsdXN0ZXItXFx1MDAzZWxvY2spO1xcbitcXHRcXHR9XFxuK1xcdH0gZWxzZSB7XFxuIFxcdFxcdHNpLVxcdTAwM2VnbG9iYWxfY2x1c3RlciA9IGttYWxsb2Nfb2JqKCpzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXIpO1xcbiBcXHRcXHRpZiAoIXNpLVxcdTAwM2VnbG9iYWxfY2x1c3RlcilcXG4gXFx0XFx0XFx0Z290byBlcnI7XFxuIFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBTV0FQX05SX09SREVSUzsgaSsrKVxcbiBcXHRcXHRcXHRzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZW5leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XFxuLVxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXJfbG9jayk7XFxuK1xcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzaS1cXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXFx1MDAzZWxvY2spO1xcbiBcXHR9XFxuIFxcbiBcXHQvKlxcbkBAIC0zNjIxLDcgKzM4MTksNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbiBcXHQvKlxcbiBcXHQgKiBBbGxvY2F0ZSBvciByZXVzZSBleGlzdGluZyAhU1dQX1VTRUQgc3dhcF9pbmZvLiBUaGUgcmV0dXJuZWRcXG4gXFx0ICogc2kgd2lsbCBzdGF5IGluIGEgZHlpbmcgc3RhdHVzLCBzbyBub3RoaW5nIHdpbGwgYWNjZXNzIGl0cyBjb250ZW50XFxuLVxcdCAqIHVudGlsIGVuYWJsZV9zd2FwX2luZm8gcmVzdXJyZWN0cyBpdHMgcGVyY3B1IHJlZiBhbmQgZXhwb3NlIGl0LlxcbitcXHQgKiB1bnRpbCBzd2FwX2RldmljZV9lbmFibGUgcmVzdXJyZWN0cyBpdHMgcGVyY3B1IHJlZiBhbmQgZXhwb3NlIGl0LlxcbiBcXHQgKi9cXG4gXFx0c2kgPSBhbGxvY19zd2FwX2luZm8oKTtcXG4gXFx0aWYgKElTX0VSUihzaSkpXFxuQEAgLTM2NzksNyArMzg3Nyw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXFxuIFxcdH1cXG4gXFx0c3dhcF9oZWFkZXIgPSBrbWFwX2xvY2FsX2ZvbGlvKGZvbGlvLCAwKTtcXG4gXFxuLVxcdG1heHBhZ2VzID0gcmVhZF9zd2FwX2hlYWRlcihzaSwgc3dhcF9oZWFkZXIsIGlub2RlKTtcXG4rXFx0bWF4cGFnZXMgPSByZWFkX3N3YXBfaGVhZGVyKHN3YXBfaGVhZGVyLCBpbm9kZSk7XFxuIFxcdGlmICh1bmxpa2VseSghbWF4cGFnZXMpKSB7XFxuIFxcdFxcdGVycm9yID0gLUVJTlZBTDtcXG4gXFx0XFx0Z290byBiYWRfc3dhcF91bmxvY2tfaW5vZGU7XFxuQEAgLTM3MDAsMTEgKzM4OTgsNiBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbiBcXG4gXFx0bWF4cGFnZXMgPSBzaS1cXHUwMDNlbWF4O1xcbiBcXG4tXFx0LyogU2V0IHVwIHRoZSBzd2FwIGNsdXN0ZXIgaW5mbyAqL1xcbi1cXHRlcnJvciA9IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzaSwgc3dhcF9oZWFkZXIsIG1heHBhZ2VzKTtcXG4tXFx0aWYgKGVycm9yKVxcbi1cXHRcXHRnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTtcXG4tXFxuIFxcdGlmIChzaS1cXHUwMDNlYmRldiBcXHUwMDI2XFx1MDAyNiBiZGV2X3N0YWJsZV93cml0ZXMoc2ktXFx1MDAzZWJkZXYpKVxcbiBcXHRcXHRzaS1cXHUwMDNlZmxhZ3MgfD0gU1dQX1NUQUJMRV9XUklURVM7XFxuIFxcbkBAIC0zNzE4LDYgKzM5MTEsMTUgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gXFx0XFx0aW5jZWRfbnJfcm90YXRlX3N3YXAgPSB0cnVlO1xcbiBcXHR9XFxuIFxcbitcXHQvKlxcbitcXHQgKiBTZXQgdXAgdGhlIHN3YXAgY2x1c3RlciBpbmZvLiBUaGlzIG11c3QgcnVuIGFmdGVyIFNXUF9TT0xJRFNUQVRFXFxuK1xcdCAqIGlzIGRldGVybWluZWQgYWJvdmUsIGFzIGl0IGRlY2lkZXMgd2hldGhlciB0byBhbGxvY2F0ZSB0aGUgcGVyLUNQVVxcbitcXHQgKiBjbHVzdGVyIChzb2xpZCBzdGF0ZSkgb3IgdGhlIGdsb2JhbCBjbHVzdGVyIChyb3RhdGlvbmFsKS5cXG4rXFx0ICovXFxuK1xcdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xcbitcXHRpZiAoZXJyb3IpXFxuK1xcdFxcdGdvdG8gYmFkX3N3YXBfdW5sb2NrX2lub2RlO1xcbitcXG4gXFx0aWYgKChzd2FwX2ZsYWdzIFxcdTAwMjYgU1dBUF9GTEFHX0RJU0NBUkQpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdCAgICBzaS1cXHUwMDNlYmRldiBcXHUwMDI2XFx1MDAyNiBiZGV2X21heF9kaXNjYXJkX3NlY3RvcnMoc2ktXFx1MDAzZWJkZXYpKSB7XFxuIFxcdFxcdC8qXFxuQEAgLTM3NjQsMjIgKzM5NjYsMjIgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gXFx0XFx0Z290byBmcmVlX3N3YXBfenN3YXA7XFxuIFxcdH1cXG4gXFxuLVxcdG11dGV4X2xvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuIFxcdHByaW8gPSBERUZfU1dBUF9QUklPO1xcbiBcXHRpZiAoc3dhcF9mbGFncyBcXHUwMDI2IFNXQVBfRkxBR19QUkVGRVIpXFxuIFxcdFxcdHByaW8gPSBzd2FwX2ZsYWdzIFxcdTAwMjYgU1dBUF9GTEFHX1BSSU9fTUFTSztcXG4gXFxuLVxcdC8qXFxuLVxcdCAqIFRoZSBwbGlzdCBwcmlvIGlzIG5lZ2F0ZWQgYmVjYXVzZSBwbGlzdCBvcmRlcmluZyBpc1xcbi1cXHQgKiBsb3ctdG8taGlnaCwgd2hpbGUgc3dhcCBvcmRlcmluZyBpcyBoaWdoLXRvLWxvd1xcbi1cXHQgKi9cXG4gXFx0c2ktXFx1MDAzZXByaW8gPSBwcmlvO1xcbi1cXHRzaS1cXHUwMDNlbGlzdC5wcmlvID0gLXNpLVxcdTAwM2VwcmlvO1xcbi1cXHRzaS1cXHUwMDNlYXZhaWxfbGlzdC5wcmlvID0gLXNpLVxcdTAwM2VwcmlvO1xcbiBcXHRzaS1cXHUwMDNlc3dhcF9maWxlID0gc3dhcF9maWxlO1xcbiBcXG4gXFx0LyogU2V0cyBTV1BfV1JJVEVPSywgcmVzdXJyZWN0IHRoZSBwZXJjcHUgcmVmLCBleHBvc2UgdGhlIHN3YXAgZGV2aWNlICovXFxuLVxcdGVuYWJsZV9zd2FwX2luZm8oc2kpO1xcbitcXHRwZXJjcHVfcmVmX3Jlc3VycmVjdChcXHUwMDI2c2ktXFx1MDAzZXVzZXJzKTtcXG4rXFx0cGVyY3B1X2Rvd25fd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdGVycm9yID0gc3dhcF9xdWV1ZV9hZGQoc2kpO1xcbitcXHRwZXJjcHVfdXBfd3JpdGUoXFx1MDAyNnN3YXBvbl9yd3NlbSk7XFxuK1xcdGlmIChlcnJvcilcXG4rXFx0XFx0Z290byBmcmVlX3N3YXBfenN3YXA7XFxuK1xcbitcXHRzd2FwX2RldmljZV9lbmFibGUoc2kpO1xcbiBcXG4gXFx0cHJfaW5mbyhcXFwiQWRkaW5nICV1ayBzd2FwIG9uICVzLiAgUHJpb3JpdHk6JWQgZXh0ZW50czolZCBhY3Jvc3M6JWxsdWsgJXMlcyVzJXNcXFxcblxcXCIsXFxuIFxcdFxcdEsoc2ktXFx1MDAzZXBhZ2VzKSwgbmFtZS1cXHUwMDNlbmFtZSwgc2ktXFx1MDAzZXByaW8sIG5yX2V4dGVudHMsXFxuQEAgLTM3ODksNyArMzk5MSw2IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXFxuIFxcdFxcdChzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfQVJFQV9ESVNDQVJEKSA/IFxcXCJzXFxcIiA6IFxcXCJcXFwiLFxcbiBcXHRcXHQoc2ktXFx1MDAzZWZsYWdzIFxcdTAwMjYgU1dQX1BBR0VfRElTQ0FSRCkgPyBcXFwiY1xcXCIgOiBcXFwiXFxcIik7XFxuIFxcbi1cXHRtdXRleF91bmxvY2soXFx1MDAyNnN3YXBvbl9tdXRleCk7XFxuIFxcdGF0b21pY19pbmMoXFx1MDAyNnByb2NfcG9sbF9ldmVudCk7XFxuIFxcdHdha2VfdXBfaW50ZXJydXB0aWJsZShcXHUwMDI2cHJvY19wb2xsX3dhaXQpO1xcbiBcXG5AQCAtMzgwMCw2ICs0MDAxLDggQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gYmFkX3N3YXBfdW5sb2NrX2lub2RlOlxcbiBcXHRpbm9kZV91bmxvY2soaW5vZGUpO1xcbiBiYWRfc3dhcDpcXG4rXFx0ZnJlZV9wZXJjcHUoc2ktXFx1MDAzZXBlcmNwdV9jbHVzdGVyKTtcXG4rXFx0c2ktXFx1MDAzZXBlcmNwdV9jbHVzdGVyID0gTlVMTDtcXG4gXFx0a2ZyZWUoc2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcXG4gXFx0c2ktXFx1MDAzZWdsb2JhbF9jbHVzdGVyID0gTlVMTDtcXG4gXFx0aW5vZGUgPSBOVUxMO1xcbkBAIC0zODEwLDkgKzQwMTMsOSBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxcbiBcXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xcbiBcXHQgKiBhbGxvY19zd2FwX2luZm8gY2FuIHJldXNlIHRoaXMgc2kgc2FmZWx5LlxcbiBcXHQgKi9cXG4tXFx0c3Bpbl9sb2NrKFxcdTAwMjZzd2FwX2xvY2spO1xcbitcXHRwZXJjcHVfZG93bl93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gXFx0c2ktXFx1MDAzZWZsYWdzID0gMDtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF93cml0ZShcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gXFx0aWYgKGluY2VkX25yX3JvdGF0ZV9zd2FwKVxcbiBcXHRcXHRhdG9taWNfZGVjKFxcdTAwMjZucl9yb3RhdGVfc3dhcCk7XFxuIFxcdGlmIChzd2FwX2ZpbGUpXFxuQEAgLTM4MjcsMTkgKzQwMzAsMTcgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcXG4gXFxuIHZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbClcXG4ge1xcbi1cXHR1bnNpZ25lZCBpbnQgdHlwZTtcXG4rXFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xcbiBcXHR1bnNpZ25lZCBsb25nIG5yX3RvX2JlX3VudXNlZCA9IDA7XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuLVxcdGZvciAodHlwZSA9IDA7IHR5cGUgXFx1MDAzYyBucl9zd2FwZmlsZXM7IHR5cGUrKykge1xcbi1cXHRcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBzd2FwX2luZm9bdHlwZV07XFxuLVxcbi1cXHRcXHRpZiAoKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9VU0VEKSBcXHUwMDI2XFx1MDAyNiAhKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9XUklURU9LKSlcXG4rXFx0cGVyY3B1X2Rvd25fcmVhZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0Zm9yX2VhY2hfc3dhcChzaSkge1xcbitcXHRcXHRpZiAoIShzaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBTV1BfV1JJVEVPSykpXFxuIFxcdFxcdFxcdG5yX3RvX2JlX3VudXNlZCArPSBzd2FwX3VzYWdlX2luX3BhZ2VzKHNpKTtcXG4gXFx0fVxcbiBcXHR2YWwtXFx1MDAzZWZyZWVzd2FwID0gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2bnJfc3dhcF9wYWdlcykgKyBucl90b19iZV91bnVzZWQ7XFxuIFxcdHZhbC1cXHUwMDNldG90YWxzd2FwID0gdG90YWxfc3dhcF9wYWdlcyArIG5yX3RvX2JlX3VudXNlZDtcXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnN3YXBfbG9jayk7XFxuK1xcdHBlcmNwdV91cF9yZWFkKFxcdTAwMjZzd2Fwb25fcndzZW0pO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC0zODc5LDcgKzQwODAsNyBAQCBpbnQgc3dhcF9kdXBfZW50cnlfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5KVxcbiAjaWYgZGVmaW5lZChDT05GSUdfTUVNQ0cpIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoQ09ORklHX0JMS19DR1JPVVApXFxuIHN0YXRpYyBib29sIF9faGFzX3VzYWJsZV9zd2FwKHZvaWQpXFxuIHtcXG4tXFx0cmV0dXJuICFwbGlzdF9oZWFkX2VtcHR5KFxcdTAwMjZzd2FwX2FjdGl2ZV9oZWFkKTtcXG4rXFx0cmV0dXJuIFJFQURfT05DRSh0b3RhbF9zd2FwX3BhZ2VzKSBcXHUwMDNlIDA7XFxuIH1cXG4gXFxuIHZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXFxuQEAgLTM5MDIsMTQgKzQxMDMsMTQgQEAgdm9pZCBfX2ZvbGlvX3Rocm90dGxlX3N3YXByYXRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGdmcF90IGdmcClcXG4gXFx0aWYgKGN1cnJlbnQtXFx1MDAzZXRocm90dGxlX2Rpc2spXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcXG4tXFx0cGxpc3RfZm9yX2VhY2hfZW50cnkoc2ksIFxcdTAwMjZzd2FwX2F2YWlsX2hlYWQsIGF2YWlsX2xpc3QpIHtcXG4rXFx0cGVyY3B1X2Rvd25fcmVhZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4rXFx0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xcbiBcXHRcXHRpZiAoc2ktXFx1MDAzZWJkZXYpIHtcXG4gXFx0XFx0XFx0YmxrY2dfc2NoZWR1bGVfdGhyb3R0bGUoc2ktXFx1MDAzZWJkZXYtXFx1MDAzZWJkX2Rpc2ssIHRydWUpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbiBcXHR9XFxuLVxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xcbitcXHRwZXJjcHVfdXBfcmVhZChcXHUwMDI2c3dhcG9uX3J3c2VtKTtcXG4gfVxcbiAjZW5kaWZcXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQzOjQ2LjA5MTA2MDUwOVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjczNTY3NTU0NjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInN3YXBfYWxsb2NfZW50cnlcIixcbiAgICBcInN3YXBfcXVldWVfYWRkXCIsXG4gICAgXCJzd2FwX3F1ZXVlX2RlbFwiLFxuICAgIFwic3dhcF9xdWV1ZV9nZXRfZGV2aWNlXCIsXG4gICAgXCJzd2FwX2RldmljZV9lbmFibGVcIixcbiAgICBcInN3YXBfZGV2aWNlX2Rpc2FibGVcIixcbiAgICBcInN3YXBfZGV2aWNlX2ludXNlX2FkZFwiLFxuICAgIFwic3dhcF9kZXZpY2VfaW51c2Vfc3ViXCIsXG4gICAgXCJhZGRfdG9fYXZhaWxfbGlzdFwiLFxuICAgIFwiZGVsX2Zyb21fYXZhaWxfbGlzdFwiLFxuICAgIFwic3dhcF9xdWV1ZV9tYXNrXCIsXG4gICAgXCJzd2FwX3F1ZXVlX3VubWFza1wiLFxuICAgIFwiY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVwbGFjZXMgdGhlIHBsaXN0LWJhc2VkIHN3YXAgZGV2aWNlIHF1ZXVlIHdpdGggYSBjdXN0b20gcm91bmQtcm9iaW4gcXVldWUsIGludHJvZHVjaW5nIG5ldyBjb3JlIGxvZ2ljIGZvciBzd2FwIGFsbG9jYXRpb24gYW5kIGRldmljZSBtYW5hZ2VtZW50LiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gdGhlIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG5ldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0XG4gICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksXG4gICBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDlmMzQ5MzY1ZTBlYjFmZTIxMjhhODQ4NGJiNGNhNjUxZjFkYmQyYTJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEp1bCAxNCAwMDo0Mzo0NCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxpc3QuaCBiL2luY2x1ZGUvbGludXgvcGxpc3QuaFxuaW5kZXggMTZjZjQzNTViNWMxMzEuLjczZDM1OWMxYTA1MzZhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9wbGlzdC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BsaXN0LmhcbkBAIC0xMzIsOCArMTMyLDYgQEAgc3RhdGljIGlubGluZSB2b2lkIHBsaXN0X25vZGVfaW5pdChzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgaW50IHByaW8pXG4gZXh0ZXJuIHZvaWQgcGxpc3RfYWRkKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XG4gZXh0ZXJuIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCk7XG4gXG4tZXh0ZXJuIHZvaWQgcGxpc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpO1xuLVxuIC8qKlxuICAqIHBsaXN0X2Zvcl9lYWNoIC0gaXRlcmF0ZSBvdmVyIHRoZSBwbGlzdFxuICAqIEBwb3M6XHR0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlclxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmhcbmluZGV4IDY5NmVkMDE3MDljMmJhLi4wNDc2NzU0MDk3MmI4MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTE5NCw2ICsxOTQsMjIgQEAgc3RydWN0IHN3YXBfZXh0ZW50IHtcbiBcdCgob2Zmc2V0b2YodW5pb24gc3dhcF9oZWFkZXIsIG1hZ2ljLm1hZ2ljKSAtIFxcXG4gXHQgIG9mZnNldG9mKHVuaW9uIHN3YXBfaGVhZGVyLCBpbmZvLmJhZHBhZ2VzKSkgLyBzaXplb2YoaW50KSlcbiBcbisvKlxuKyAqIFN3YXAgZGV2aWNlIGZsYWdzLCBleGNlcHQgdGhlIG9uZXMgZG9jdW1lbnRlZCBiZWxvdywgYWxsIGFyZSBpbW11dGFibGVcbisgKiBhZnRlciBleHBvc2VkIGJ5IHN3YXBfZGV2aWNlX2VuYWJsZSwgYW5kIHVudGlsIHRoZSBkZXZpY2UgaXMgZnJlZWQgYWdhaW5cbisgKiAoU1dQX1VTRUQgdW5zZXQpLiBUaGUgZXhjZXB0aW9ucyBhcmUgYWxsIHByb3RlY3RlZCBieSBzd2Fwb25fcndzZW06XG4rICogLSBTV1BfVVNFRDogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIHRoZSBkZXZpY2UgaXMgaW51c2UuIE9uY2VcbisgKiAgIHNldCwgd29uJ3QgYmUgY2xlYXJlZCB1bmxlc3MgYWxsIHJlZmVyZW5jZSB0byB0aGlzIGRldmljZSBpcyBmcmVlZCBhbmRcbisgKiAgIHN3YXBvZmYgZmluaXNoZWQuXG4rICogLSBTV1BfV1JJVEVPSzogUHJvdGVjdGVkIGJ5IGJvdGggc3dhcG9uX3J3c2VtIGFuZCBzd2FwX2F2YWlsX2xvY2ssIGNsZWFyaW5nXG4rICogICB0aGlzIGZsYWcgYWxzbyB3YWl0cyBmb3IgYWxsIGN1cnJlbnQgY2x1c3RlciBsb2NrIHVzZXJzIHRvIGV4aXQgc29cbisgKiAgIGNoZWNraW5nIHRoaXMgZmxhZyB3aGlsZSBob2xkaW5nIGFueSBvZiB0aGVzZSBsb2NrcyBlbnN1cmVzIHRoZSBkZXZpY2VcbisgKiAgIGlzIHNhZmUgdG8gdXNlIGF0IHRoZSBtb21lbnQuIE5vdGU6IGNsZWFyaW5nIHRoaXMgZmxhZyBkb2Vzbid0IGFmZmVjdFxuKyAqICAgcGVuZGluZyBJTyBvciBhc3luYyByZXF1ZXN0cywgaXQgb25seSBwcmV2ZW50cyBmdXJ0aGVyIGVudHJ5IGFsbG9jYXRpb25cbisgKiAgIG9yIG5ldyBhc3luYyByZXF1ZXN0IChlLmcuIGRpc2NhcmQpIGZyb20gaW5pdGlhdGluZy5cbisgKiAtIFNXUF9ISUJFUk5BVElPTjogUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbS4gSW5kaWNhdGVzIGlmIHRoZSBkZXZpY2VcbisgKiAgIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uXG4rICovXG4gZW51bSB7XG4gXHRTV1BfVVNFRFx0PSAoMSBcdTAwM2NcdTAwM2MgMCksXHQvKiBpcyBzbG90IGluIHN3YXBfaW5mb1tdIHVzZWQ/ICovXG4gXHRTV1BfV1JJVEVPS1x0PSAoMSBcdTAwM2NcdTAwM2MgMSksXHQvKiBvayB0byB3cml0ZSB0byB0aGlzIHN3YXA/XHQqL1xuQEAgLTIzMCwxMCArMjQ2LDE3IEBAIGVudW0ge1xuICNlbmRpZlxuIFxuIC8qXG4tICogV2Uga2VlcCB1c2luZyBzYW1lIGNsdXN0ZXIgZm9yIHJvdGF0aW9uYWwgZGV2aWNlIHNvIElPIHdpbGwgYmUgc2VxdWVudGlhbC5cbi0gKiBUaGUgcHVycG9zZSBpcyB0byBvcHRpbWl6ZSBTV0FQIHRocm91Z2hwdXQgb24gdGhlc2UgZGV2aWNlLlxuKyAqIFdlIGFzc2lnbiBhIGNsdXN0ZXIgdG8gZWFjaCBDUFUsIHNvIGVhY2ggQ1BVIGNhbiBhbGxvY2F0ZSBzd2FwIGVudHJ5IGZyb21cbisgKiBpdHMgb3duIGNsdXN0ZXIgYW5kIHN3YXBvdXQgc2VxdWVudGlhbGx5LiBUaGUgcHVycG9zZSBpcyB0byBvcHRpbWl6ZSBzd2Fwb3V0XG4rICogdGhyb3VnaHB1dC5cbiAgKi9cbitzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIge1xuK1x0bG9jYWxfbG9ja190IGxvY2s7IC8qIFByb3RlY3QgdGhlIHBlcmNwdV9jbHVzdGVyIGFib3ZlICovXG4rXHR1bnNpZ25lZCBpbnQgbmV4dFtTV0FQX05SX09SREVSU107IC8qIExpa2VseSBuZXh0IGFsbG9jYXRpb24gb2Zmc2V0ICovXG4rfTtcbitcbiBzdHJ1Y3Qgc3dhcF9zZXF1ZW50aWFsX2NsdXN0ZXIge1xuK1x0c3BpbmxvY2tfdCBsb2NrOyAvKiBTZXJpYWxpemUgdXNhZ2Ugb2YgZ2xvYmFsIGNsdXN0ZXIgKi9cbiBcdHVuc2lnbmVkIGludCBuZXh0W1NXQVBfTlJfT1JERVJTXTsgLyogTGlrZWx5IG5leHQgYWxsb2NhdGlvbiBvZmZzZXQgKi9cbiB9O1xuIFxuQEAgLTI0NCw3ICsyNjcsNiBAQCBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCB7XG4gXHRzdHJ1Y3QgcGVyY3B1X3JlZiB1c2VycztcdC8qIGluZGljYXRlIGFuZCBrZWVwIHN3YXAgZGV2aWNlIHZhbGlkLiAqL1xuIFx0dW5zaWduZWQgbG9uZ1x0ZmxhZ3M7XHRcdC8qIFNXUF9VU0VEIGV0Yzogc2VlIGFib3ZlICovXG4gXHRzaWduZWQgc2hvcnRcdHByaW87XHRcdC8qIHN3YXAgcHJpb3JpdHkgb2YgdGhpcyB0eXBlICovXG4tXHRzdHJ1Y3QgcGxpc3Rfbm9kZSBsaXN0O1x0XHQvKiBlbnRyeSBpbiBzd2FwX2FjdGl2ZV9oZWFkICovXG4gXHRzaWduZWQgY2hhclx0dHlwZTtcdFx0Lyogc3RyYW5nZSBuYW1lIGZvciBhbiBpbmRleCAqL1xuIFx0dW5zaWduZWQgaW50XHRtYXg7XHRcdC8qIHNpemUgb2YgdGhpcyBzd2FwIGRldmljZSAqL1xuIFx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm87IC8qIGNsdXN0ZXIgaW5mby4gT25seSBmb3IgU1NEICovXG5AQCAtMjU2LDI2ICsyNzgsMjAgQEAgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3Qge1xuIFx0XHRcdFx0XHQvKiBsaXN0IG9mIGNsdXN0ZXIgdGhhdCBhcmUgZnJhZ21lbnRlZCBvciBjb250ZW50ZWQgKi9cbiBcdHVuc2lnbmVkIGludCBwYWdlcztcdFx0LyogdG90YWwgb2YgdXNhYmxlIHBhZ2VzIG9mIHN3YXAgKi9cbiBcdGF0b21pY19sb25nX3QgaW51c2VfcGFnZXM7XHQvKiBudW1iZXIgb2YgdGhvc2UgY3VycmVudGx5IGluIHVzZSAqL1xuK1x0c3RydWN0IHBlcmNwdV9jbHVzdGVyXHRfX3BlcmNwdSAqcGVyY3B1X2NsdXN0ZXI7IC8qIHBlciBjcHUncyBzd2FwIGxvY2F0aW9uICovXG4gXHRzdHJ1Y3Qgc3dhcF9zZXF1ZW50aWFsX2NsdXN0ZXIgKmdsb2JhbF9jbHVzdGVyOyAvKiBVc2Ugb25lIGdsb2JhbCBjbHVzdGVyIGZvciByb3RhdGluZyBkZXZpY2UgKi9cbi1cdHNwaW5sb2NrX3QgZ2xvYmFsX2NsdXN0ZXJfbG9jaztcdC8qIFNlcmlhbGl6ZSB1c2FnZSBvZiBnbG9iYWwgY2x1c3RlciAqL1xuIFx0c3RydWN0IHJiX3Jvb3Qgc3dhcF9leHRlbnRfcm9vdDsvKiByb290IG9mIHRoZSBzd2FwIGV4dGVudCByYnRyZWUgKi9cbiBcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XHQvKiBzd2FwIGRldmljZSBvciBiZGV2IG9mIHN3YXAgZmlsZSAqL1xuIFx0c3RydWN0IGZpbGUgKnN3YXBfZmlsZTtcdFx0Lyogc2VsZG9tIHJlZmVyZW5jZWQgKi9cbiBcdHN0cnVjdCBjb21wbGV0aW9uIGNvbXA7XHRcdC8qIHNlbGRvbSByZWZlcmVuY2VkICovXG4gXHRzcGlubG9ja190IGxvY2s7XHRcdC8qXG4tXHRcdFx0XHRcdCAqIHByb3RlY3QgbWFwIHNjYW4gcmVsYXRlZCBmaWVsZHMgbGlrZVxuLVx0XHRcdFx0XHQgKiBpbnVzZV9wYWdlcyBhbmQgYWxsIGNsdXN0ZXIgbGlzdHMuXG4tXHRcdFx0XHRcdCAqIE90aGVyIGZpZWxkcyBhcmUgb25seSBjaGFuZ2VkXG4tXHRcdFx0XHRcdCAqIGF0IHN3YXBvbi9zd2Fwb2ZmLCBzbyBhcmUgcHJvdGVjdGVkXG4tXHRcdFx0XHRcdCAqIGJ5IHN3YXBfbG9jay4gY2hhbmdpbmcgZmxhZ3MgbmVlZFxuLVx0XHRcdFx0XHQgKiBob2xkIHRoaXMgbG9jayBhbmQgc3dhcF9sb2NrLiBJZlxuLVx0XHRcdFx0XHQgKiBib3RoIGxvY2tzIG5lZWQgaG9sZCwgaG9sZCBzd2FwX2xvY2tcbi1cdFx0XHRcdFx0ICogZmlyc3QuXG4rXHRcdFx0XHRcdCAqIFByb3RlY3QgY2x1c3RlciBsaXN0cy4gT3RoZXIgZmllbGRzXG4rXHRcdFx0XHRcdCAqIGFyZSBvbmx5IGNoYW5nZWQgYXQgc3dhcG9uL3N3YXBvZmYsXG4rXHRcdFx0XHRcdCAqIHNvIGFyZSBwcm90ZWN0ZWQgYnkgc3dhcG9uX3J3c2VtLlxuIFx0XHRcdFx0XHQgKi9cbiBcdHN0cnVjdCB3b3JrX3N0cnVjdCBkaXNjYXJkX3dvcms7IC8qIGRpc2NhcmQgd29ya2VyICovXG4gXHRzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVjbGFpbV93b3JrOyAvKiByZWNsYWltIHdvcmtlciAqL1xuIFx0c3RydWN0IGxpc3RfaGVhZCBkaXNjYXJkX2NsdXN0ZXJzOyAvKiBkaXNjYXJkIGNsdXN0ZXJzIGxpc3QgKi9cbi1cdHN0cnVjdCBwbGlzdF9ub2RlIGF2YWlsX2xpc3Q7ICAgLyogZW50cnkgaW4gc3dhcF9hdmFpbF9oZWFkICovXG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IHBhZ2Vfc3dhcF9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmRpZmYgLS1naXQgYS9saWIvcGxpc3QuYyBiL2xpYi9wbGlzdC5jXG5pbmRleCBhNWJlZjM4YWRkNDMxZC4uYjA1YWU3ZmZlYTg3ZTggMTAwNjQ0XG4tLS0gYS9saWIvcGxpc3QuY1xuKysrIGIvbGliL3BsaXN0LmNcbkBAIC0xNDIsNTggKzE0Miw2IEBAIHZvaWQgcGxpc3RfZGVsKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZClcbiBcdHBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7XG4gfVxuIFxuLS8qKlxuLSAqIHBsaXN0X3JlcXVldWUgLSBSZXF1ZXVlIEBub2RlIGF0IGVuZCBvZiBzYW1lLXByaW8gZW50cmllcy5cbi0gKlxuLSAqIFRoaXMgaXMgZXNzZW50aWFsbHkgYW4gb3B0aW1pemVkIHBsaXN0X2RlbCgpIGZvbGxvd2VkIGJ5XG4tICogcGxpc3RfYWRkKCkuICBJdCBtb3ZlcyBhbiBlbnRyeSBhbHJlYWR5IGluIHRoZSBwbGlzdCB0b1xuLSAqIGFmdGVyIGFueSBvdGhlciBzYW1lLXByaW9yaXR5IGVudHJpZXMuXG4tICpcbi0gKiBAbm9kZTpcdFx1MDAyNnN0cnVjdCBwbGlzdF9ub2RlIHBvaW50ZXIgLSBlbnRyeSB0byBiZSBtb3ZlZFxuLSAqIEBoZWFkOlx0XHUwMDI2c3RydWN0IHBsaXN0X2hlYWQgcG9pbnRlciAtIGxpc3QgaGVhZFxuLSAqL1xuLXZvaWQgcGxpc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpXG4te1xuLVx0c3RydWN0IHBsaXN0X25vZGUgKml0ZXI7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkICpub2RlX25leHQgPSBcdTAwMjZoZWFkLVx1MDAzZW5vZGVfbGlzdDtcbi1cbi1cdHBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7XG4tXHRCVUdfT04ocGxpc3RfaGVhZF9lbXB0eShoZWFkKSk7XG4tXHRCVUdfT04ocGxpc3Rfbm9kZV9lbXB0eShub2RlKSk7XG4tXG4tXHRpZiAobm9kZSA9PSBwbGlzdF9sYXN0KGhlYWQpKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRpdGVyID0gcGxpc3RfbmV4dChub2RlKTtcbi1cbi1cdGlmIChub2RlLVx1MDAzZXByaW8gIT0gaXRlci1cdTAwM2VwcmlvKVxuLVx0XHRyZXR1cm47XG4tXG4tXHRwbGlzdF9kZWwobm9kZSwgaGVhZCk7XG4tXG4tXHQvKlxuLVx0ICogQWZ0ZXIgcGxpc3RfZGVsKCksIGl0ZXIgaXMgdGhlIHJlcGxhY2VtZW50IG9mIHRoZSBub2RlLiAgSWYgdGhlIG5vZGVcbi1cdCAqIHdhcyBvbiBwcmlvX2xpc3QsIHRha2Ugc2hvcnRjdXQgdG8gZmluZCBub2RlX25leHQgaW5zdGVhZCBvZiBsb29waW5nLlxuLVx0ICovXG4tXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2aXRlci1cdTAwM2VwcmlvX2xpc3QpKSB7XG4tXHRcdGl0ZXIgPSBsaXN0X2VudHJ5KGl0ZXItXHUwMDNlcHJpb19saXN0Lm5leHQsIHN0cnVjdCBwbGlzdF9ub2RlLFxuLVx0XHRcdFx0ICBwcmlvX2xpc3QpO1xuLVx0XHRub2RlX25leHQgPSBcdTAwMjZpdGVyLVx1MDAzZW5vZGVfbGlzdDtcbi1cdFx0Z290byBxdWV1ZTtcbi1cdH1cbi1cbi1cdHBsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlKGl0ZXIsIGhlYWQpIHtcbi1cdFx0aWYgKG5vZGUtXHUwMDNlcHJpbyAhPSBpdGVyLVx1MDAzZXByaW8pIHtcbi1cdFx0XHRub2RlX25leHQgPSBcdTAwMjZpdGVyLVx1MDAzZW5vZGVfbGlzdDtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuLVx0fVxuLXF1ZXVlOlxuLVx0bGlzdF9hZGRfdGFpbChcdTAwMjZub2RlLVx1MDAzZW5vZGVfbGlzdCwgbm9kZV9uZXh0KTtcbi1cbi1cdHBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7XG4tfVxuLVxuICNpZmRlZiBDT05GSUdfREVCVUdfUExJU1RcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvY2xvY2suaFx1MDAzZVxuQEAgLTIzMSwxNCArMTc5LDYgQEAgc3RhdGljIHZvaWQgX19pbml0IHBsaXN0X3Rlc3RfY2hlY2soaW50IG5yX2V4cGVjdClcbiBcdEJVR19PTihwcmlvX3Bvcy1cdTAwM2VwcmlvX2xpc3QubmV4dCAhPSBcdTAwMjZmaXJzdC1cdTAwM2VwcmlvX2xpc3QpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBfX2luaXQgcGxpc3RfdGVzdF9yZXF1ZXVlKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlKVxuLXtcbi1cdHBsaXN0X3JlcXVldWUobm9kZSwgXHUwMDI2dGVzdF9oZWFkKTtcbi1cbi1cdGlmIChub2RlICE9IHBsaXN0X2xhc3QoXHUwMDI2dGVzdF9oZWFkKSlcbi1cdFx0QlVHX09OKG5vZGUtXHUwMDNlcHJpbyA9PSBwbGlzdF9uZXh0KG5vZGUpLVx1MDAzZXByaW8pO1xuLX1cbi1cbiBzdGF0aWMgaW50ICBfX2luaXQgcGxpc3RfdGVzdCh2b2lkKVxuIHtcbiBcdGludCBucl9leHBlY3QgPSAwLCBpLCBsb29wO1xuQEAgLTI2MiwxMCArMjAyLDYgQEAgc3RhdGljIGludCAgX19pbml0IHBsaXN0X3Rlc3Qodm9pZClcbiBcdFx0XHRucl9leHBlY3QtLTtcbiBcdFx0fVxuIFx0XHRwbGlzdF90ZXN0X2NoZWNrKG5yX2V4cGVjdCk7XG4tXHRcdGlmICghcGxpc3Rfbm9kZV9lbXB0eSh0ZXN0X25vZGUgKyBpKSkge1xuLVx0XHRcdHBsaXN0X3Rlc3RfcmVxdWV1ZSh0ZXN0X25vZGUgKyBpKTtcbi1cdFx0XHRwbGlzdF90ZXN0X2NoZWNrKG5yX2V4cGVjdCk7XG4tXHRcdH1cbiBcdH1cbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUodGVzdF9ub2RlKTsgaSsrKSB7XG5kaWZmIC0tZ2l0IGEvbW0vc3dhcC5oIGIvbW0vc3dhcC5oXG5pbmRleCBiNTFhZDMwNzFhNzMwOC4uMDhhNzgyZjNkNWFjZDIgMTAwNjQ0XG4tLS0gYS9tbS9zd2FwLmhcbisrKyBiL21tL3N3YXAuaFxuQEAgLTkxLDE2ICs5MSwxNiBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzd3BfY2x1c3Rlcl9vZmZzZXQoc3dwX2VudHJ5X3QgZW50cnkpXG4gICovXG4gc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqX19zd2FwX3R5cGVfdG9faW5mbyhpbnQgdHlwZSlcbiB7XG4tXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4tXG4tXHRzaSA9IFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqL1xuLVx0Vk1fV0FSTl9PTl9PTkNFKHBlcmNwdV9yZWZfaXNfemVybyhcdTAwMjZzaS1cdTAwM2V1c2VycykpOyAvKiByYWNlIHdpdGggc3dhcG9mZiAqL1xuLVx0cmV0dXJuIHNpO1xuK1x0cmV0dXJuIFJFQURfT05DRShzd2FwX2luZm9bdHlwZV0pOyAvKiByY3VfZGVyZWZlcmVuY2UoKSAqL1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpfX3N3YXBfZW50cnlfdG9faW5mbyhzd3BfZW50cnlfdCBlbnRyeSlcbiB7XG4tXHRyZXR1cm4gX19zd2FwX3R5cGVfdG9faW5mbyhzd3BfdHlwZShlbnRyeSkpO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuK1xuK1x0c2kgPSBfX3N3YXBfdHlwZV90b19pbmZvKHN3cF90eXBlKGVudHJ5KSk7IC8qIHJjdV9kZXJlZmVyZW5jZSgpICovXG4rXHRWTV9XQVJOX09OX09OQ0UocGVyY3B1X3JlZl9pc196ZXJvKFx1MDAyNnNpLVx1MDAzZXVzZXJzKSk7IC8qIHJhY2Ugd2l0aCBzd2Fwb2ZmICovXG4rXHRyZXR1cm4gc2k7XG4gfVxuIFxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmNcbmluZGV4IDc3NWMzODU0OTBhNWZhLi5mOTM4NjMzMDlhNWE1MCAxMDA2NDRcbi0tLSBhL21tL3N3YXBmaWxlLmNcbisrKyBiL21tL3N3YXBmaWxlLmNcbkBAIC00MSw3ICs0MSw2IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGxldGlvbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3VzcGVuZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvenN3YXAuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BsaXN0LmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2Nhc20vdGxiZmx1c2guaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2xlYWZvcHMuaFx1MDAzZVxuQEAgLTQ5LDMxICs0OCwzOCBAQFxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gI2luY2x1ZGUgXCJzd2FwLmhcIlxuIFxuLXN0YXRpYyB2b2lkIHN3YXBfcmFuZ2VfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuLVx0XHRcdCAgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpO1xuK3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2ludXNlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKTtcbiBzdGF0aWMgYm9vbCBmb2xpb19zd2FwY2FjaGVfZnJlZWFibGUoc3RydWN0IGZvbGlvICpmb2xpbyk7XG4gc3RhdGljIHZvaWQgbW92ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbiBcdFx0XHQgZW51bSBzd2FwX2NsdXN0ZXJfZmxhZ3MgbmV3X2ZsYWdzKTtcbitzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpO1xuIFxuIC8qXG4tICogUHJvdGVjdHMgdGhlIHN3YXBfaW5mbyBhcnJheSwgYW5kIHRoZSBTV1BfVVNFRCBmbGFnLiBzd2FwX2luZm8gY29udGFpbnNcbi0gKiBsYXppbHkgYWxsb2NhdGVkIFx1MDAyNiBmcmVlZCBzd2FwIGRldmljZSBpbmZvIHN0cnV0cywgYW5kIFNXUF9VU0VEIGluZGljYXRlc1xuLSAqIHdoaWNoIGRldmljZSBpcyB1c2VkLCB+U1dQX1VTRUQgZGV2aWNlcyBhbmQgY2FuIGJlIHJldXNlZC5cbi0gKlxuLSAqIEFsc28gcHJvdGVjdHMgc3dhcF9hY3RpdmVfaGVhZCB0b3RhbF9zd2FwX3BhZ2VzLCBhbmQgdGhlIFNXUF9XUklURU9LIGZsYWcuXG4rICogU2VyaWFsaXplcyBzd2Fwb24vc3dhcG9mZiAod3JpdGVycykgYW5kIHByb3RlY3RzIHRoZSBzd2FwX2luZm9cbisgKiBhcnJheSwgbnJfc3dhcGZpbGVzLCB0b3RhbF9zd2FwX3BhZ2VzLCBhbmQgcGFydCBvZiBzd2FwIGRldmljZVxuKyAqIGluZm8gY29udGVudCAoc2VlIGNvbW1lbnQgb2Ygc3dhcF9pbmZvX3N0cnVjdCkuICBSZWFkZXJzXG4rICogKGFsbG9jYXRpb24sIC9wcm9jL3N3YXBzLCBldGMuKSB0YWtlIHBlcmNwdV9kb3duX3JlYWQoKSB3aGljaFxuKyAqIGlzIGNoZWFwIGFzIHRoZSBob3QgcGF0aC5cbisgKi9cbitERUZJTkVfU1RBVElDX1BFUkNQVV9SV1NFTShzd2Fwb25fcndzZW0pO1xuKy8qXG4rICogc3dhcF9pbmZvIGNvbnRhaW5zIGxhemlseSBhbGxvY2F0ZWQgc3dhcCBkZXZpY2UgaW5mbyBzdHJ1Y3RzLCBhbmRcbisgKiBTV1BfVVNFRCBpbmRpY2F0ZXMgd2hpY2ggZGV2aWNlIGlzIHVzZWQsIH5TV1BfVVNFRCBkZXZpY2VzIGNhbiBiZVxuKyAqIHJldXNlZC4gUHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbSwgYnV0IHJlYWRpbmcgY291bGQgYmUgbG9ja2xlc3MuXG4gICovXG4tc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spO1xuK3N0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2luZm9bTUFYX1NXQVBGSUxFU107XG4gc3RhdGljIHVuc2lnbmVkIGludCBucl9zd2FwZmlsZXM7XG4tYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xuK2xvbmcgdG90YWxfc3dhcF9wYWdlcztcbitcbiAvKlxuICAqIFNvbWUgbW9kdWxlcyB1c2Ugc3dhcHBhYmxlIG9iamVjdHMgYW5kIG1heSB0cnkgdG8gc3dhcCB0aGVtIG91dCB1bmRlclxuICAqIG1lbW9yeSBwcmVzc3VyZSAodmlhIHRoZSBzaHJpbmtlcikuIEJlZm9yZSBkb2luZyBzbywgdGhleSBtYXkgd2lzaCB0b1xuICAqIGNoZWNrIHRvIHNlZSBpZiBhbnkgc3dhcCBzcGFjZSBpcyBhdmFpbGFibGUuXG4gICovXG4rYXRvbWljX2xvbmdfdCBucl9zd2FwX3BhZ2VzO1xuIEVYUE9SVF9TWU1CT0xfR1BMKG5yX3N3YXBfcGFnZXMpO1xuLS8qIHByb3RlY3RlZCB3aXRoIHN3YXBfbG9jay4gcmVhZGluZyBpbiB2bV9zd2FwX2Z1bGwoKSBkb2Vzbid0IG5lZWQgbG9jayAqL1xuLWxvbmcgdG90YWxfc3dhcF9wYWdlcztcbiAjZGVmaW5lIERFRl9TV0FQX1BSSU8gIC0xXG4gdW5zaWduZWQgbG9uZyBzd2FwZmlsZV9tYXhpbXVtX3NpemU7XG4gI2lmZGVmIENPTkZJR19NSUdSQVRJT05cbkBAIC04Myw1MiArODksNDIgQEAgYm9vbCBzd2FwX21pZ3JhdGlvbl9hZF9zdXBwb3J0ZWQ7XG4gc3RhdGljIGNvbnN0IGNoYXIgQmFkX2ZpbGVbXSA9IFwiQmFkIHN3YXAgZmlsZSBlbnRyeSBcIjtcbiBzdGF0aWMgY29uc3QgY2hhciBCYWRfb2Zmc2V0W10gPSBcIkJhZCBzd2FwIG9mZnNldCBlbnRyeSBcIjtcbiBcbi0vKlxuLSAqIGFsbCBhY3RpdmUgc3dhcF9pbmZvX3N0cnVjdHNcbi0gKiBwcm90ZWN0ZWQgd2l0aCBzd2FwX2xvY2ssIGFuZCBvcmRlcmVkIGJ5IHByaW9yaXR5LlxuLSAqL1xuLXN0YXRpYyBQTElTVF9IRUFEKHN3YXBfYWN0aXZlX2hlYWQpO1xuK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKl9fc3dhcF9pdGVyKGludCAqaSwgdW5zaWduZWQgbG9uZyBmbGFnKVxuK3tcbitcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdHdoaWxlICgqaSBcdTAwM2MgbnJfc3dhcGZpbGVzKSB7XG4rXHRcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IF9fc3dhcF90eXBlX3RvX2luZm8oKmkpO1xuK1xuK1x0XHRWTV9XQVJOX09OKCFzaSk7XG4rXHRcdCgqaSkrKztcbitcdFx0aWYgKGZsYWcgXHUwMDI2XHUwMDI2ICEoKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBmbGFnKSA9PSBmbGFnKSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0cmV0dXJuIHNpO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKyNkZWZpbmUgX19mb3JfZWFjaF9zd2FwKHNpLCBmbGFnKVx0XHRcdFxcXG4rXHRmb3IgKGludCBfX2kgPSAwOyAoKHNpKSA9IF9fc3dhcF9pdGVyKFx1MDAyNl9faSwgZmxhZykpOylcbiBcbiAvKlxuLSAqIGFsbCBhdmFpbGFibGUgKGFjdGl2ZSwgbm90IGZ1bGwpIHN3YXBfaW5mb19zdHJ1Y3RzXG4tICogcHJvdGVjdGVkIHdpdGggc3dhcF9hdmFpbF9sb2NrLCBvcmRlcmVkIGJ5IHByaW9yaXR5LlxuLSAqIFRoaXMgaXMgdXNlZCBieSBmb2xpb19hbGxvY19zd2FwKCkgaW5zdGVhZCBvZiBzd2FwX2FjdGl2ZV9oZWFkXG4tICogYmVjYXVzZSBzd2FwX2FjdGl2ZV9oZWFkIGluY2x1ZGVzIGFsbCBzd2FwX2luZm9fc3RydWN0cyxcbi0gKiBidXQgZm9saW9fYWxsb2Nfc3dhcCgpIGRvZXNuJ3QgbmVlZCB0byBsb29rIGF0IGZ1bGwgb25lcy5cbi0gKiBUaGlzIHVzZXMgaXRzIG93biBsb2NrIGluc3RlYWQgb2Ygc3dhcF9sb2NrIGJlY2F1c2Ugd2hlbiBhXG4tICogc3dhcF9pbmZvX3N0cnVjdCBjaGFuZ2VzIGJldHdlZW4gbm90LWZ1bGwvZnVsbCwgaXQgbmVlZHMgdG9cbi0gKiBhZGQvcmVtb3ZlIGl0c2VsZiB0by9mcm9tIHRoaXMgbGlzdCwgYnV0IHRoZSBzd2FwX2luZm9fc3RydWN0LVx1MDAzZWxvY2tcbi0gKiBpcyBoZWxkIGFuZCB0aGUgbG9ja2luZyBvcmRlciByZXF1aXJlcyBzd2FwX2xvY2sgdG8gYmUgdGFrZW5cbi0gKiBiZWZvcmUgYW55IHN3YXBfaW5mb19zdHJ1Y3QtXHUwMDNlbG9jay5cbisgKiBmb3JfZWFjaF9zd2FwIC0gaXRlcmF0ZSB0aHJvdWdoIGFsbCBhbGxvY2F0ZWQgYW5kIGludXNlIHN3YXAgZGV2aWNlc1xuKyAqIEBzaTogdGhlIGl0ZXJhdG9yXG4rICpcbisgKiBDb250ZXh0OiBUaGUgY2FsbGVyIG11c3QgaG9sZCBzd2Fwb25fcndzZW0uIFRoZSBsb2NrIG1heSBiZSBkcm9wcGVkIGR1cmluZ1xuKyAqIHRoZSBsb29wIGJvZHkgYnV0IG11c3QgYmUgcmUtYWNxdWlyZWQgYmVmb3JlIHRoZSBuZXh0IGl0ZXJhdGlvbi5cbiAgKi9cbi1zdGF0aWMgUExJU1RfSEVBRChzd2FwX2F2YWlsX2hlYWQpO1xuLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9hdmFpbF9sb2NrKTtcbi1cbi1zdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9pbmZvW01BWF9TV0FQRklMRVNdO1xuKyNkZWZpbmUgZm9yX2VhY2hfc3dhcChzaSkgX19mb3JfZWFjaF9zd2FwKHNpLCBTV1BfVVNFRClcbisjZGVmaW5lIGZvcl9lYWNoX2F2YWlsX3N3YXAoc2kpIF9fZm9yX2VhY2hfc3dhcChzaSwgU1dQX1VTRUQgfCBTV1BfV1JJVEVPSylcbiBcbiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnN3YXBfdGFibGVfY2FjaGVwO1xuIFxuLS8qIFByb3RlY3RzIHNpLVx1MDAzZXN3YXBfZmlsZSBmb3IgL3Byb2Mvc3dhcHMgdXNhZ2UgKi9cbi1zdGF0aWMgREVGSU5FX01VVEVYKHN3YXBvbl9tdXRleCk7XG4tXG4gc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHByb2NfcG9sbF93YWl0KTtcbiAvKiBBY3Rpdml0eSBjb3VudGVyIHRvIGluZGljYXRlIHRoYXQgYSBzd2Fwb24gb3Igc3dhcG9mZiBoYXMgb2NjdXJyZWQgKi9cbiBzdGF0aWMgYXRvbWljX3QgcHJvY19wb2xsX2V2ZW50ID0gQVRPTUlDX0lOSVQoMCk7XG4gXG4gYXRvbWljX3QgbnJfcm90YXRlX3N3YXAgPSBBVE9NSUNfSU5JVCgwKTtcbiBcbi1zdHJ1Y3QgcGVyY3B1X3N3YXBfY2x1c3RlciB7XG4tXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lbU1dBUF9OUl9PUkRFUlNdO1xuLVx0dW5zaWduZWQgbG9uZyBvZmZzZXRbU1dBUF9OUl9PUkRFUlNdO1xuLVx0bG9jYWxfbG9ja190IGxvY2s7XG4tfTtcbi1cbi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcmNwdV9zd2FwX2NsdXN0ZXIsIHBlcmNwdV9zd2FwX2NsdXN0ZXIpID0ge1xuLVx0LnNpID0geyBOVUxMIH0sXG4tXHQub2Zmc2V0ID0geyBTV0FQX0VOVFJZX0lOVkFMSUQgfSxcbi1cdC5sb2NrID0gSU5JVF9MT0NBTF9MT0NLKCksXG4tfTtcbi1cbiAvKiBNYXkgcmV0dXJuIE5VTEwgb24gaW52YWxpZCB0eXBlLCBjYWxsZXIgbXVzdCBjaGVjayBmb3IgTlVMTCByZXR1cm4gKi9cbiBzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfdHlwZV90b19pbmZvKGludCB0eXBlKVxuIHtcbkBAIC0xNDMsMTggKzEzOSwzNTAgQEAgc3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX2VudHJ5X3RvX2luZm8oc3dwX2VudHJ5X3QgZW50cnkpXG4gXHRyZXR1cm4gc3dhcF90eXBlX3RvX2luZm8oc3dwX3R5cGUoZW50cnkpKTtcbiB9XG4gXG4rLypcbisgKiBBbGwgYXZhaWxhYmxlIHN3YXBfaW5mb19zdHJ1Y3RzIGFyZSBncm91cGVkIGJ5IHByaW9yaXR5IHJpbmdzLCB0aGUgcmluZ3NcbisgKiBhcmUgb3JkZXJlZCBpbiBhIHF1ZXVlIGJ5IHByaW9yaXR5IChsb3dlciBwcmlvIHZhbHVlID0gaGlnaGVyIHByaW9yaXR5KS5cbisgKiBUaGUgYWxsb2NhdG9yIGl0ZXJhdGVzIGFuZCByb3RhdGVzIGRldmljZXMgd2l0aGluIGVhY2ggcHJpb3JpdHkgcmluZy5cbisgKiBXaGVuIGFsbCBkZXZpY2VzIGluIGEgcmluZyBhcmUgaXRlcmF0ZWQsIGl0IGdvZXMgdG8gdGhlIG5leHQgbG93ZXJcbisgKiBwcmlvcml0eSByaW5nLlxuKyAqL1xuK3N0cnVjdCBzd2FwX3ByaW9fcmluZyB7XG4rXHRpbnQgcHJpbztcbitcdHVuc2lnbmVkIGludCBzaXplO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKmRldltdIF9fY291bnRlZF9ieShzaXplKTtcbit9O1xuK1xuKy8qXG4rICogVGhlIHJpbmcgaXMgcHJvdGVjdGVkIGJ5IHN3YXBvbl9yd3NlbSBzbyB1cGRhdGluZyBpdCBpcyBjb3N0bHkuIFRvIG1ha2VcbisgKiB0aGUgYWxsb2NhdG9yIGFuZCBvdGhlciB1c2VycyBza2lwIGZ1bGwgZGV2aWNlcyBmYXN0ZXIsIHRoZSBsb3dlc3QgYml0IG9mXG4rICogYSBkZXZpY2UgcG9pbnRlciBpcyB1c2VkIHRvIG1hcmsgaXQgZGlzYWJsZWQgKHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlKS5cbisgKiBUaGlzIHJlbGllcyBvbiBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCBiZWluZyBzdWZmaWNpZW50bHlcbisgKiBhbGlnbmVkIChndWFyYW50ZWVkIGJ5IGttYWxsb2MpLlxuKyAqL1xuKyNkZWZpbmUgU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZUXHQwXG4rI2RlZmluZSBTV0FQX0RFVklDRV9NQVNLRURfQklUXHRcdEJJVChTV0FQX0RFVklDRV9NQVNLRURfU0hJRlQpXG4rXG4rLypcbisgKiBTZXJpYWxpemVzIHF1ZXVlIGNvbnRlbnQgbXV0YXRpb25zIGFuZCBrZWVwcyBTV0FQX1VTQUdFX09GRkxJU1RfQklUXG4rICogY29uc2lzdGVudCB3aXRoIHRoZSBtYXNrZWQgc3RhdGUgb2YgZWFjaCBkZXZpY2UgcG9pbnRlci5cbisgKi9cbitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1xuKy8qXG4rICogU3dhcCBxdWV1ZSBpcyBwcm90ZWN0ZWQgYnkgYm90aCBzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrIGFuZCBzd2Fwb25fcndzZW0uXG4rICogT25seSBzd2Fwb24vc3dhcG9mZiB3aWxsIHRha2UgdGhlIHdyaXRlIGxvY2ssIGFuZCBtb2RpZnkgdGhlIHF1ZXVlIGxlbmd0aFxuKyAqIG9yIGFueSByaW5nJ3MgbGVuZ3RoLiBzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrIHByb3RlY3RzIHRoZSBjb250ZW50IHNvXG4rICogZGV2aWNlcyBjYW4gYmUgbWFza2VkIGVhc2lseSB3aXRob3V0IHRha2luZyB0aGUgd3JpdGVsb2NrLCB3aGljaCBpcyBoZWF2eS5cbisgKi9cbitzdGF0aWMgc3RydWN0IHN3YXBfcHJpb19yaW5nICoqc3dhcF9xdWV1ZTtcbitzdGF0aWMgdW5zaWduZWQgaW50IHN3YXBfcXVldWVfbGVuO1xuK1xuKy8qXG4rICogRWFjaCBDUFUgaGFzIGl0cyByZWFkIGl0ZXJhdG9yLCBzbyB0aGUgcXVldWUgaXRzZWxmIHdpbGwgcmVtYWluIHJlYWRcbisgKiBvbmx5IGFuZCB0aGUgQ1BVIHNpZGUgcmVhZGVyIHJvdGF0ZXMgYnkgaXRlcmF0aW5nIHRoZSBkZXZpY2VzXG4rICogcGVyaW9kaWNhbGx5IHVzaW5nIHRoZSBjb3VudGVyLlxuKyAqL1xuKyNkZWZpbmUgU1dBUF9ST1VORF9ST0JJTl9RVU9UQSBTV0FQRklMRV9DTFVTVEVSXG4rc3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciB7XG4rXHRpbnQgb2Zmc2V0O1xuK1x0bG9uZyBycl9jb3VudGVyO1xuK307XG4rXG4rc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIHtcbitcdGxvY2FsX2xvY2tfdCBsb2NrO1xuK1x0c3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciByaVtdO1xuK307XG4rXG4rc3RhdGljIF9fcGVyY3B1IHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciAqc3dhcF9xdWV1ZV9yZWFkZXJzO1xuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBzd2FwX2RldmljZV9tYXNrZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuK3tcbitcdHJldHVybiAodW5zaWduZWQgbG9uZylzaSBcdTAwMjYgU1dBUF9ERVZJQ0VfTUFTS0VEX0JJVDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4re1xuK1x0cmV0dXJuIChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqKSgodW5zaWduZWQgbG9uZylzaSBcdTAwMjYgflNXQVBfREVWSUNFX01BU0tFRF9CSVQpO1xuK31cbitcbitzdGF0aWMgc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpzd2FwX3F1ZXVlX3ByZWFsbG9jX3JlYWRlcnMoaW50IG5yX3JpbmdzLCBnZnBfdCBnZnApXG4re1xuK1x0c3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpyZWFkZXJzO1xuK1xuK1x0aWYgKCFucl9yaW5ncylcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRyZWFkZXJzID0gX19hbGxvY19wZXJjcHVfZ2ZwKHN0cnVjdF9zaXplKHJlYWRlcnMsIHJpLCBucl9yaW5ncyksXG4rXHRcdFx0XHQgICAgIF9fYWxpZ25vZl9fKCpyZWFkZXJzKSwgZ2ZwKTtcbitcdHJldHVybiByZWFkZXJzO1xuK31cbitcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnMpXG4re1xuK1x0aW50IHJpbmdfaWR4LCBjcHU7XG4rXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7XG4rXG4rXHRmcmVlX3BlcmNwdShzd2FwX3F1ZXVlX3JlYWRlcnMpO1xuK1x0c3dhcF9xdWV1ZV9yZWFkZXJzID0gcmVhZGVycztcbitcdGlmICghcmVhZGVycylcbitcdFx0cmV0dXJuO1xuK1xuK1x0LyogRGlzdHJpYnV0ZSBlYWNoIENQVSdzIHN3YXAgSU8gZmFpcmx5IGFjcm9zcyBkZXZpY2VzLiAqL1xuK1x0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuK1x0XHRsb2NhbF9sb2NrX2luaXQoXHUwMDI2cGVyX2NwdV9wdHIocmVhZGVycywgY3B1KS1cdTAwM2Vsb2NrKTtcbitcbitcdFx0Zm9yIChyaW5nX2lkeCA9IDA7IHJpbmdfaWR4IFx1MDAzYyBzd2FwX3F1ZXVlX2xlbjsgcmluZ19pZHgrKykge1xuK1x0XHRcdHJpbmcgPSBzd2FwX3F1ZXVlW3JpbmdfaWR4XTtcbitcdFx0XHRwZXJfY3B1X3B0cihyZWFkZXJzLCBjcHUpLVx1MDAzZXJpW3JpbmdfaWR4XS5vZmZzZXQgPVxuK1x0XHRcdFx0ICAgIGNwdSAlIHJpbmctXHUwMDNlc2l6ZTtcbitcdFx0fVxuK1x0fVxuK31cbitcbitzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnN3YXBfcXVldWVfZ2V0X2RldmljZShsb25nIG5yX2FsbG9jLCBpbnQgbnJfaXRlcilcbit7XG4rXHRib29sIHJvdGF0ZSA9IGZhbHNlO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuK1x0c3RydWN0IHN3YXBfcmluZ19pdGVyYXRvciAqcmk7XG4rXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmc7XG4rXHR1bnNpZ25lZCBpbnQgcXVldWVfaWR4O1xuK1xuK1x0aWYgKCFzd2FwX3F1ZXVlX2xlbilcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4rXG4rXHRxdWV1ZV9pZHggPSAwO1xuK1x0d2hpbGUgKG5yX2l0ZXIgXHUwMDNlPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF0tXHUwMDNlc2l6ZSkge1xuK1x0XHRucl9pdGVyIC09IHN3YXBfcXVldWVbcXVldWVfaWR4XS1cdTAwM2VzaXplO1xuK1x0XHRpZiAoKytxdWV1ZV9pZHggXHUwMDNlPSBzd2FwX3F1ZXVlX2xlbilcbitcdFx0XHRyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTtcbitcdH1cbitcbitcdHJpbmcgPSBzd2FwX3F1ZXVlW3F1ZXVlX2lkeF07XG4rXHRsb2NhbF9sb2NrKFx1MDAyNnN3YXBfcXVldWVfcmVhZGVycy1cdTAwM2Vsb2NrKTtcbitcdHJpID0gdGhpc19jcHVfcHRyKFx1MDAyNnN3YXBfcXVldWVfcmVhZGVycy1cdTAwM2VyaVtxdWV1ZV9pZHhdKTtcbitcdC8qIFJvdGF0ZSB3aGlsZSBpdGVyYXRpbmcgdGhlIHJpbmcsIGp1c3Qgbm90IG9uIHRoZSBmaXJzdCB0cnkgKi9cbitcdGlmIChucl9pdGVyKVxuK1x0XHRyb3RhdGUgPSB0cnVlO1xuK1x0ZWxzZSBpZiAocmktXHUwMDNlcnJfY291bnRlciBcdTAwM2MgbnJfYWxsb2MpXG4rXHRcdHJvdGF0ZSA9IHRydWU7XG4rXHRlbHNlIGlmIChyaS1cdTAwM2VvZmZzZXQgXHUwMDNlPSByaW5nLVx1MDAzZXNpemUpXG4rXHRcdHJvdGF0ZSA9IHRydWU7XG4rXHRpZiAocm90YXRlKSB7XG4rXHRcdHJpLVx1MDAzZW9mZnNldCsrO1xuK1x0XHRyaS1cdTAwM2VvZmZzZXQgJT0gcmluZy1cdTAwM2VzaXplO1xuK1x0XHRyaS1cdTAwM2Vycl9jb3VudGVyID0gU1dBUF9ST1VORF9ST0JJTl9RVU9UQTtcbitcdH1cbitcdHJpLVx1MDAzZXJyX2NvdW50ZXIgLT0gbnJfYWxsb2M7XG4rXHRzaSA9IFJFQURfT05DRShyaW5nLVx1MDAzZWRldltyaS1cdTAwM2VvZmZzZXRdKTtcbitcdGxvY2FsX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3JlYWRlcnMtXHUwMDNlbG9jayk7XG4rXG4rXHRpZiAoc3dhcF9kZXZpY2VfbWFza2VkKHNpKSlcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVCVVNZKTtcbitcbitcdHNpID0gc3dhcF9kZXZpY2VfdW5tYXNrX3B0cihzaSk7XG4rXHRyZXR1cm4gc2k7XG4rfVxuK1xuK3N0YXRpYyBib29sIHN3YXBfcXVldWVfZmluZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0ICAgIHVuc2lnbmVkIGludCAqcmluZ19pZHgsIHVuc2lnbmVkIGludCAqZGV2X2lkeClcbit7XG4rXHR1bnNpZ25lZCBpbnQgaSwgajtcbitcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqcmluZztcbitcbitcdGxvY2tkZXBfYXNzZXJ0KGxvY2tkZXBfaXNfaGVsZChcdTAwMjZzd2Fwb25fcndzZW0pIHx8XG4rXHRcdCAgICAgICBsb2NrZGVwX2lzX2hlbGQoXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jaykpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2Mgc3dhcF9xdWV1ZV9sZW47IGkrKykge1xuK1x0XHRyaW5nID0gc3dhcF9xdWV1ZVtpXTtcbitcdFx0aWYgKHJpbmctXHUwMDNlcHJpbyAhPSBzaS1cdTAwM2VwcmlvKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyByaW5nLVx1MDAzZXNpemU7IGorKykge1xuK1x0XHRcdGlmIChzd2FwX2RldmljZV91bm1hc2tfcHRyKFJFQURfT05DRShyaW5nLVx1MDAzZWRldltqXSkpICE9IHNpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0KnJpbmdfaWR4ID0gaTtcbitcdFx0XHQqZGV2X2lkeCA9IGo7XG4rXHRcdFx0cmV0dXJuIHRydWU7XG4rXHRcdH1cbitcdH1cbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgc3dhcF9xdWV1ZV9tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbit7XG4rXHR1bnNpZ25lZCBpbnQgcmluZ19pZHgsIGRldl9pZHg7XG4rXG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1x0aWYgKHN3YXBfcXVldWVfZmluZChzaSwgXHUwMDI2cmluZ19pZHgsIFx1MDAyNmRldl9pZHgpKVxuK1x0XHRfX3NldF9iaXQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZULFxuK1x0XHRcdCAgKHVuc2lnbmVkIGxvbmcgKilcdTAwMjZzd2FwX3F1ZXVlW3JpbmdfaWR4XS1cdTAwM2VkZXZbZGV2X2lkeF0pO1xuK31cbitcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX3VubWFzayhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4re1xuK1x0dW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4O1xuK1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcdGlmIChzd2FwX3F1ZXVlX2ZpbmQoc2ksIFx1MDAyNnJpbmdfaWR4LCBcdTAwMjZkZXZfaWR4KSlcbitcdFx0X19jbGVhcl9iaXQoU1dBUF9ERVZJQ0VfTUFTS0VEX1NISUZULFxuK1x0XHRcdCAgICAodW5zaWduZWQgbG9uZyAqKVx1MDAyNnN3YXBfcXVldWVbcmluZ19pZHhdLVx1MDAzZWRldltkZXZfaWR4XSk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgc3dhcF9xdWV1ZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuK3tcbitcdHN0cnVjdCBzd2FwX3ByaW9fcmluZyAqKm5ld19xdWV1ZSA9IE5VTEwsICoqb2xkX3F1ZXVlID0gTlVMTDtcbitcdHN0cnVjdCBzd2FwX3F1ZXVlX3JlYWRlciBfX3BlcmNwdSAqbmV3X3JlYWRlcnMgPSBOVUxMO1xuK1x0c3RydWN0IHN3YXBfcHJpb19yaW5nICpyaW5nLCAqbmV3X3JpbmcgPSBOVUxMLCAqb2xkX3JpbmcgPSBOVUxMO1xuK1x0aW50IHByaW8gPSBzaS1cdTAwM2VwcmlvO1xuK1x0aW50IGksIHBvcywgZXJyID0gLUVOT01FTTtcbitcdGdmcF90IGdmcDtcbitcbitcdC8qIFN3YXAgbm90IHVzYWJsZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyBzd2FwLCBqdXN0IHJlY2xhaW0gY2FjaGUuICovXG4rXHRnZnAgPSBHRlBfTk9JTyB8IF9fR0ZQX0hJR0g7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXG4rXHRmb3IgKHBvcyA9IDA7IHBvcyBcdTAwM2Mgc3dhcF9xdWV1ZV9sZW47IHBvcysrKSB7XG4rXHRcdGlmIChzd2FwX3F1ZXVlW3Bvc10tXHUwMDNlcHJpbyA9PSBwcmlvKVxuK1x0XHRcdGdvdG8gYWRkX3RvX3Jpbmc7XG4rXHRcdGlmIChzd2FwX3F1ZXVlW3Bvc10tXHUwMDNlcHJpbyBcdTAwM2MgcHJpbylcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdC8qIE5vIHJpbmcgYXQgdGhpcyBwcmlvcml0eTogaW5zZXJ0IGEgbmV3IG9uZSBhdCBwb3MuICovXG4rXHRuZXdfcmVhZGVycyA9IHN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhzd2FwX3F1ZXVlX2xlbiArIDEsIGdmcCk7XG4rXHRpZiAoIW5ld19yZWFkZXJzKVxuK1x0XHRnb3RvIGZhaWxlZDtcbitcdG5ld19xdWV1ZSA9IGttYWxsb2NfYXJyYXkoc3dhcF9xdWV1ZV9sZW4gKyAxLCBzaXplb2YoKnN3YXBfcXVldWUpLCBnZnApO1xuK1x0aWYgKCFuZXdfcXVldWUpXG4rXHRcdGdvdG8gZmFpbGVkO1xuK1x0bmV3X3JpbmcgPSBrbWFsbG9jKHN0cnVjdF9zaXplKG5ld19yaW5nLCBkZXYsIDEpLCBnZnApO1xuK1x0aWYgKCFuZXdfcmluZylcbitcdFx0Z290byBmYWlsZWQ7XG4rXHRpZiAoIWdldF9zd2FwX2RldmljZV9pbmZvKHNpKSlcbitcdFx0Z290byBmYWlsZWQ7XG4rXG4rXHRuZXdfcmluZy1cdTAwM2VwcmlvID0gcHJpbztcbitcdG5ld19yaW5nLVx1MDAzZXNpemUgPSAxO1xuK1x0bmV3X3JpbmctXHUwMDNlZGV2WzBdID0gc2k7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwb3M7IGkrKylcbitcdFx0bmV3X3F1ZXVlW2ldID0gc3dhcF9xdWV1ZVtpXTtcbitcdG5ld19xdWV1ZVtwb3NdID0gbmV3X3Jpbmc7XG4rXHRmb3IgKGkgPSBwb3M7IGkgXHUwMDNjIHN3YXBfcXVldWVfbGVuOyBpKyspXG4rXHRcdG5ld19xdWV1ZVtpICsgMV0gPSBzd2FwX3F1ZXVlW2ldO1xuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1x0b2xkX3F1ZXVlID0gc3dhcF9xdWV1ZTtcbitcdHN3YXBfcXVldWUgPSBuZXdfcXVldWU7XG4rXHRzd2FwX3F1ZXVlX2xlbisrO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4rXHRrZnJlZShvbGRfcXVldWUpO1xuK1xuK1x0c3dhcF9xdWV1ZV9pbnN0YWxsX3JlYWRlcnMobmV3X3JlYWRlcnMpO1xuK1x0cmV0dXJuIDA7XG4rXG4rYWRkX3RvX3Jpbmc6XG4rXHRyaW5nID0gc3dhcF9xdWV1ZVtwb3NdO1xuK1x0bmV3X3JpbmcgPSBrbWFsbG9jKHN0cnVjdF9zaXplKHJpbmcsIGRldiwgcmluZy1cdTAwM2VzaXplICsgMSksIGdmcCk7XG4rXHRpZiAoIW5ld19yaW5nKVxuK1x0XHRnb3RvIGZhaWxlZDtcbitcdGlmICghZ2V0X3N3YXBfZGV2aWNlX2luZm8oc2kpKVxuK1x0XHRnb3RvIGZhaWxlZDtcbitcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcdG1lbWNweShuZXdfcmluZywgcmluZywgc3RydWN0X3NpemUocmluZywgZGV2LCByaW5nLVx1MDAzZXNpemUpKTtcbitcdG5ld19yaW5nLVx1MDAzZXNpemUrKztcbitcdG5ld19yaW5nLVx1MDAzZWRldltuZXdfcmluZy1cdTAwM2VzaXplIC0gMV0gPSBzaTtcbitcdG9sZF9yaW5nID0gc3dhcF9xdWV1ZVtwb3NdO1xuK1x0c3dhcF9xdWV1ZVtwb3NdID0gbmV3X3Jpbmc7XG4rXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcdGtmcmVlKG9sZF9yaW5nKTtcbitcdHJldHVybiAwO1xuK1xuK2ZhaWxlZDpcbitcdGZyZWVfcGVyY3B1KG5ld19yZWFkZXJzKTtcbitcdGtmcmVlKG5ld19xdWV1ZSk7XG4rXHRrZnJlZShuZXdfcmluZyk7XG4rXHRyZXR1cm4gZXJyO1xuK31cbitcbitzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2RlbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4re1xuK1x0Z2ZwX3QgZ2ZwO1xuK1x0dW5zaWduZWQgaW50IHJpbmdfaWR4LCBkZXZfaWR4O1xuK1x0c3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpuZXdfcmVhZGVycyA9IE5VTEw7XG4rXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKnJpbmcsICpuZXdfcmluZyA9IE5VTEwsICpvbGRfcmluZyA9IE5VTEw7XG4rXHRzdHJ1Y3Qgc3dhcF9wcmlvX3JpbmcgKipuZXdfcXVldWUgPSBOVUxMLCAqKm9sZF9xdWV1ZSA9IE5VTEw7XG4rXG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRpZiAoIXN3YXBfcXVldWVfZmluZChzaSwgXHUwMDI2cmluZ19pZHgsIFx1MDAyNmRldl9pZHgpKSB7XG4rXHRcdFdBUk5fT04oMSk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBUbyBzaHJpbmsgbWVtb3J5IHVzYWdlLCBwcmUtYWxsb2NhdGUgbmV3IHNtYWxsZXIgZGF0YSBiZWZvcmVcbitcdCAqIGxvY2tpbmcuIEZhaWx1cmUgaXMgZmluZSwgc3dhcG9mZiB3aWxsIHJlbGVhc2UgdGhlbSBhbnl3YXkuXG4rXHQgKi9cbitcdGdmcCA9IEdGUF9OT0lPIHwgX19HRlBfSElHSDtcbitcdHJpbmcgPSBzd2FwX3F1ZXVlW3JpbmdfaWR4XTtcbitcdGlmIChyaW5nLVx1MDAzZXNpemUgXHUwMDNlIDEpXG4rXHRcdG5ld19yaW5nID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXHUwMDNlc2l6ZSAtIDEpLCBnZnApO1xuK1x0aWYgKHJpbmctXHUwMDNlc2l6ZSA9PSAxIFx1MDAyNlx1MDAyNiBzd2FwX3F1ZXVlX2xlbiBcdTAwM2UgMSkge1xuK1x0XHRuZXdfcmVhZGVycyA9IHN3YXBfcXVldWVfcHJlYWxsb2NfcmVhZGVycyhcbitcdFx0XHRcdFx0c3dhcF9xdWV1ZV9sZW4gLSAxLCBnZnApO1xuK1x0XHRuZXdfcXVldWUgPSBrbWFsbG9jKHNpemVvZigqc3dhcF9xdWV1ZSkgKlxuK1x0XHRcdFx0ICAgIChzd2FwX3F1ZXVlX2xlbiAtIDEpLCBnZnApO1xuK1x0fVxuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1x0aWYgKHJpbmctXHUwMDNlc2l6ZSBcdTAwM2UgMSkge1xuK1x0XHQvKiBTaGlmdCB0cmFpbGluZyBkZXZpY2VzIGxlZnQgdG8gZmlsbCB0aGUgZ2FwLiAqL1xuK1x0XHR3aGlsZSAoKytkZXZfaWR4IFx1MDAzYyByaW5nLVx1MDAzZXNpemUpXG4rXHRcdFx0cmluZy1cdTAwM2VkZXZbZGV2X2lkeCAtIDFdID1cbitcdFx0XHRcdHJpbmctXHUwMDNlZGV2W2Rldl9pZHhdO1xuK1x0XHRyaW5nLVx1MDAzZXNpemUtLTtcbitcdFx0aWYgKG5ld19yaW5nKSB7XG4rXHRcdFx0bWVtY3B5KG5ld19yaW5nLCByaW5nLFxuK1x0XHRcdCAgICAgICBzdHJ1Y3Rfc2l6ZShyaW5nLCBkZXYsIHJpbmctXHUwMDNlc2l6ZSkpO1xuK1x0XHRcdG9sZF9yaW5nID0gcmluZztcbitcdFx0XHRzd2FwX3F1ZXVlW3JpbmdfaWR4XSA9IG5ld19yaW5nO1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBMYXN0IGRldmljZSBpbiB0aGlzIHJpbmc6IHJlbW92ZSB0aGUgcmluZy4gKi9cbitcdFx0b2xkX3JpbmcgPSByaW5nO1xuK1x0XHRzd2FwX3F1ZXVlX2xlbi0tO1xuK1x0XHR3aGlsZSAoKytyaW5nX2lkeCBcdTAwM2M9IHN3YXBfcXVldWVfbGVuKVxuK1x0XHRcdHN3YXBfcXVldWVbcmluZ19pZHggLSAxXSA9XG4rXHRcdFx0XHRzd2FwX3F1ZXVlW3JpbmdfaWR4XTtcbitcdFx0aWYgKG5ld19xdWV1ZSkge1xuK1x0XHRcdG1lbWNweShuZXdfcXVldWUsIHN3YXBfcXVldWUsXG4rXHRcdFx0ICAgICAgIHNpemVvZigqc3dhcF9xdWV1ZSkgKiBzd2FwX3F1ZXVlX2xlbik7XG4rXHRcdFx0b2xkX3F1ZXVlID0gc3dhcF9xdWV1ZTtcbitcdFx0XHRzd2FwX3F1ZXVlID0gbmV3X3F1ZXVlO1xuK1x0XHR9IGVsc2UgaWYgKCFzd2FwX3F1ZXVlX2xlbikge1xuK1x0XHRcdG9sZF9xdWV1ZSA9IHN3YXBfcXVldWU7XG4rXHRcdFx0c3dhcF9xdWV1ZSA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKG5ld19yZWFkZXJzIHx8ICFzd2FwX3F1ZXVlX2xlbilcbitcdFx0XHRzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhuZXdfcmVhZGVycyk7XG4rXHR9XG4rXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcbitcdGtmcmVlKG9sZF9yaW5nKTtcbitcdGtmcmVlKG9sZF9xdWV1ZSk7XG4rXHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuK31cbitcbiAvKlxuICAqIFVzZSB0aGUgc2Vjb25kIGhpZ2hlc3QgYml0IG9mIGludXNlX3BhZ2VzIGNvdW50ZXIgYXMgdGhlIGluZGljYXRvclxuLSAqIGlmIG9uZSBzd2FwIGRldmljZSBpcyBvbiB0aGUgYXZhaWxhYmxlIHBsaXN0LCBzbyB0aGUgYXRvbWljIGNhblxuKyAqIGlmIG9uZSBzd2FwIGRldmljZSBpcyB1bmF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiwgc28gdGhlIGF0b21pYyBjYW5cbiAgKiBzdGlsbCBiZSB1cGRhdGVkIGFyaXRobWV0aWNhbGx5IHdoaWxlIGhhdmluZyBzcGVjaWFsIGRhdGEgZW1iZWRkZWQuXG4gICpcbiAgKiBpbnVzZV9wYWdlcyBjb3VudGVyIGlzIHRoZSBvbmx5IHRoaW5nIGluZGljYXRpbmcgaWYgYSBkZXZpY2Ugc2hvdWxkXG4tICogYmUgb24gYXZhaWxfbGlzdHMgb3Igbm90IChleGNlcHQgc3dhcG9uIC8gc3dhcG9mZikuIEJ5IGVtYmVkZGluZyB0aGVcbi0gKiBvZmYtbGlzdCBiaXQgaW4gdGhlIGF0b21pYyBjb3VudGVyLCB1cGRhdGVzIG5vIGxvbmdlciBuZWVkIGFueSBsb2NrXG4tICogdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxuKyAqIGJlIGluIHRoZSBhdmFpbGFibGUgcXVldWUgb3Igbm90IChleGNlcHQgc3dhcG9uIC8gc3dhcG9mZikuIEJ5XG4rICogZW1iZWRkaW5nIHRoZSBvZmYtbGlzdCBiaXQgaW4gdGhlIGF0b21pYyBjb3VudGVyLCB1cGRhdGVzIG5vIGxvbmdlclxuKyAqIG5lZWQgYW55IGxvY2sgdG8gY2hlY2sgdGhlIGxpc3Qgc3RhdHVzLlxuICAqXG4tICogVGhpcyBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGRldmljZSBpcyBub3Qgb24gdGhlIHBsaXN0IGFuZCBub3Rcbi0gKiB1c2FibGUsIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGUgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdC5cbisgKiBUaGlzIGJpdCB3aWxsIGJlIHNldCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBpbiB0aGUgYXZhaWxhYmxlIHF1ZXVlXG4rICogYW5kIG5vdCB1c2FibGUsIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBxdWV1ZS5cbiAgKi9cbiAjZGVmaW5lIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgKDFVTCBcdTAwM2NcdTAwM2MgKEJJVFNfUEVSX1RZUEUoYXRvbWljX3QpIC0gMikpXG4gI2RlZmluZSBTV0FQX1VTQUdFX0NPVU5URVJfTUFTSyAoflNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpXG5AQCAtMTYzLDYgKzQ5MSwyNiBAQCBzdGF0aWMgbG9uZyBzd2FwX3VzYWdlX2luX3BhZ2VzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdHJldHVybiBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKSBcdTAwMjYgU1dBUF9VU0FHRV9DT1VOVEVSX01BU0s7XG4gfVxuIFxuKy8qXG4rICogU2VyaWFsaXplIHRoZSBhbGxvY2F0aW9uIG9uIHNpbmdsZSBDUFUgb3IgZ2xvYmFsbHkgdG8gYXZvaWRcbisgKiBmcmFnbWVudGF0aW9uIGFuZCBtYWtlIHRoZSB3b3JrZmxvdyBlYXNpZXIgdG8gZm9sbG93LlxuKyAqL1xuK3N0YXRpYyB2b2lkIHN3YXBfYWxsb2NfbG9ja19kZXZpY2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuK3tcbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpXG4rXHRcdGxvY2FsX2xvY2soXHUwMDI2c2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbG9jayk7XG4rXHRlbHNlXG4rXHRcdHNwaW5fbG9jayhcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlci1cdTAwM2Vsb2NrKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgc3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbit7XG4rXHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuK1x0XHRsb2NhbF91bmxvY2soXHUwMDI2c2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXItXHUwMDNlbG9jayk7XG4rXHRlbHNlXG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZWxvY2spO1xuK31cbitcbiAvKiBSZWNsYWltIHRoZSBzd2FwIGVudHJ5IGFueXdheSBpZiBwb3NzaWJsZSAqL1xuICNkZWZpbmUgVFRSU19BTllXQVlcdFx0MHgxXG4gLypcbkBAIC01MzMsOSArODgxLDEwIEBAIHN3YXBfY2x1c3Rlcl9wb3B1bGF0ZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHQgKiBPbmx5IGNsdXN0ZXIgaXNvbGF0aW9uIGZyb20gdGhlIGFsbG9jYXRvciBkb2VzIHRhYmxlIGFsbG9jYXRpb24uXG4gXHQgKiBTd2FwIGFsbG9jYXRvciB1c2VzIHBlcmNwdSBjbHVzdGVycyBhbmQgaG9sZHMgdGhlIGxvY2FsIGxvY2suXG4gXHQgKi9cbi1cdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2dGhpc19jcHVfcHRyKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIpLVx1MDAzZWxvY2spO1xuLVx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbi1cdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpXG4rXHRcdGxvY2tkZXBfYXNzZXJ0X2hlbGQodGhpc19jcHVfcHRyKFx1MDAyNnNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyLVx1MDAzZWxvY2spKTtcbitcdGVsc2VcbitcdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlci1cdTAwM2Vsb2NrKTtcbiBcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXG4gXHRpZiAoIXN3YXBfY2x1c3Rlcl9hbGxvY190YWJsZShjaSwgX19HRlBfSElHSCB8IF9fR0ZQX05PTUVNQUxMT0MgfFxuQEAgLTU0OCw5ICs4OTcsNyBAQCBzd2FwX2NsdXN0ZXJfcG9wdWxhdGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0ICogdGhlIHBvdGVudGlhbCByZWN1cnNpdmUgYWxsb2NhdGlvbiBpcyBsaW1pdGVkLlxuIFx0ICovXG4gXHRzcGluX3VubG9jayhcdTAwMjZjaS1cdTAwM2Vsb2NrKTtcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4rXHRzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc2kpO1xuIFxuIFx0cmV0ID0gc3dhcF9jbHVzdGVyX2FsbG9jX3RhYmxlKGNpLCBfX0dGUF9ISUdIIHwgX19HRlBfTk9NRU1BTExPQyB8XG4gXHRcdFx0XHRcdCAgIEdGUF9LRVJORUwpO1xuQEAgLTU2Myw5ICs5MTAsNyBAQCBzd2FwX2NsdXN0ZXJfcG9wdWxhdGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0ICogY291bGQgaGFwcGVuIHdpdGggaWdub3JpbmcgdGhlIHBlcmNwdSBjbHVzdGVyIGlzIGZyYWdtZW50YXRpb24sXG4gXHQgKiB3aGljaCBpcyBhY2NlcHRhYmxlIHNpbmNlIHRoaXMgZmFsbGJhY2sgYW5kIHJhY2UgaXMgcmFyZS5cbiBcdCAqL1xuLVx0bG9jYWxfbG9jayhcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spO1xuLVx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSlcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuK1x0c3dhcF9hbGxvY19sb2NrX2RldmljZShzaSk7XG4gXHRzcGluX2xvY2soXHUwMDI2Y2ktXHUwMDNlbG9jayk7XG4gXG4gXHRpZiAocmV0KSB7XG5AQCAtNjcxLDcgKzEwMTYsNyBAQCBzdGF0aWMgYm9vbCBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiBcdFx0Y2kgPSBsaXN0X2ZpcnN0X2VudHJ5KFx1MDAyNnNpLVx1MDAzZWRpc2NhcmRfY2x1c3RlcnMsIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbywgbGlzdCk7XG4gXHRcdC8qXG4gXHRcdCAqIERlbGV0ZSB0aGUgY2x1c3RlciBmcm9tIGxpc3QgdG8gcHJlcGFyZSBmb3IgZGlzY2FyZCwgYnV0IGtlZXBcbi1cdFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHBlcmNwdV9zd2FwX2NsdXN0ZXIgY291bGQgYmVcbitcdFx0ICogdGhlIENMVVNURVJfRkxBR19ESVNDQVJEIGZsYWcsIHRoZXJlIGNvdWxkIGJlIHBlcmNwdV9jbHVzdGVyXG4gXHRcdCAqIHBvaW50aW5nIHRvIGl0LCBvciByYW4gaW50byBieSByZWxvY2F0ZV9jbHVzdGVyLlxuIFx0XHQgKi9cbiBcdFx0bGlzdF9kZWwoXHUwMDI2Y2ktXHUwMDNlbGlzdCk7XG5AQCAtOTU1LDcgKzEzMDAsNyBAQCBzdGF0aWMgYm9vbCBfX3N3YXBfY2x1c3Rlcl9hbGxvY19lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdGlmIChjbHVzdGVyX2lzX2VtcHR5KGNpKSlcbiBcdFx0Y2ktXHUwMDNlb3JkZXIgPSBvcmRlcjtcbiBcdGNpLVx1MDAzZWNvdW50ICs9IG5yX3BhZ2VzO1xuLVx0c3dhcF9yYW5nZV9hbGxvYyhzaSwgbnJfcGFnZXMpO1xuK1x0c3dhcF9kZXZpY2VfaW51c2VfYWRkKHNpLCBucl9wYWdlcyk7XG4gXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG5AQCAtMTAwMywxMiArMTM0OCwxMCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBvdXQ6XG4gXHRyZWxvY2F0ZV9jbHVzdGVyKHNpLCBjaSk7XG4gXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpIHtcbi1cdFx0dGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5vZmZzZXRbb3JkZXJdLCBuZXh0KTtcbi1cdFx0dGhpc19jcHVfd3JpdGUocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0sIHNpKTtcbi1cdH0gZWxzZSB7XG4rXHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKVxuK1x0XHR0aGlzX2NwdV93cml0ZShzaS1cdTAwM2VwZXJjcHVfY2x1c3Rlci1cdTAwM2VuZXh0W29yZGVyXSwgbmV4dCk7XG4rXHRlbHNlXG4gXHRcdHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZW5leHRbb3JkZXJdID0gbmV4dDtcbi1cdH1cbiBcdHJldHVybiBmb3VuZDtcbiB9XG4gXG5AQCAtMTEwMywxMyArMTQ0NiwxNCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiAhKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfQkxLREVWKSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4tXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKSB7XG4tXHRcdC8qIFNlcmlhbGl6ZSBIREQgU1dBUCBhbGxvY2F0aW9uIGZvciBlYWNoIGRldmljZS4gKi9cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuK3Jlc3RhcnQ6XG4rXHRzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHNpKTtcbitcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpXG4rXHRcdG9mZnNldCA9IF9fdGhpc19jcHVfcmVhZChzaS1cdTAwM2VwZXJjcHVfY2x1c3Rlci1cdTAwM2VuZXh0W29yZGVyXSk7XG4rXHRlbHNlXG4gXHRcdG9mZnNldCA9IHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyLVx1MDAzZW5leHRbb3JkZXJdO1xuLVx0XHRpZiAob2Zmc2V0ID09IFNXQVBfRU5UUllfSU5WQUxJRClcbi1cdFx0XHRnb3RvIG5ld19jbHVzdGVyO1xuIFxuK1x0aWYgKG9mZnNldCAhPSBTV0FQX0VOVFJZX0lOVkFMSUQpIHtcbiBcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfbG9jayhzaSwgb2Zmc2V0KTtcbiBcdFx0LyogQ2x1c3RlciBjb3VsZCBoYXZlIGJlZW4gdXNlZCBieSBhbm90aGVyIG9yZGVyICovXG4gXHRcdGlmIChjbHVzdGVyX2lzX3VzYWJsZShjaSwgb3JkZXIpKSB7XG5AQCAtMTEyMyw3ICsxNDY3LDYgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHRnb3RvIGRvbmU7XG4gXHR9XG4gXG4tbmV3X2NsdXN0ZXI6XG4gXHQvKlxuIFx0ICogSWYgdGhlIGRldmljZSBuZWVkIGRpc2NhcmQsIHByZWZlciBuZXcgY2x1c3RlciBvdmVyIG5vbmZ1bGxcbiBcdCAqIHRvIHNwcmVhZCBvdXQgdGhlIHdyaXRlcy5cbkBAIC0xMTMyLDYgKzE0NzUsMTIgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0Zm91bmQgPSBhbGxvY19zd2FwX3NjYW5fbGlzdChzaSwgXHUwMDI2c2ktXHUwMDNlZnJlZV9jbHVzdGVycywgZm9saW8sIGZhbHNlKTtcbiBcdFx0aWYgKGZvdW5kKVxuIFx0XHRcdGdvdG8gZG9uZTtcbitcbitcdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNnNpLVx1MDAzZWRpc2NhcmRfY2x1c3RlcnMpKSB7XG4rXHRcdFx0c3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTtcbitcdFx0XHRzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHNpKTtcbitcdFx0XHRnb3RvIHJlc3RhcnQ7XG4rXHRcdH1cbiBcdH1cbiBcbiBcdGlmIChvcmRlciBcdTAwM2MgUE1EX09SREVSKSB7XG5AQCAtMTE4MCw4ICsxNTI5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdFx0XHRnb3RvIGRvbmU7XG4gXHR9XG4gZG9uZTpcbi1cdGlmICghKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyX2xvY2spO1xuK1x0c3dhcF9hbGxvY191bmxvY2tfZGV2aWNlKHNpKTtcbiBcbiBcdHJldHVybiBmb3VuZDtcbiB9XG5AQCAtMTE5MSw1NCArMTUzOSw0NCBAQCBzdGF0aWMgdm9pZCBkZWxfZnJvbV9hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb2ZmKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgcGFnZXM7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbitcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiBcbi1cdGlmIChzd2Fwb2ZmKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZvcmNlZnVsbHkgcmVtb3ZlIGl0LiBDbGVhciB0aGUgU1dQX1dSSVRFT0sgZmxhZ3MgZm9yXG4tXHRcdCAqIHN3YXBvZmYgaGVyZSBzbyBpdCdzIHN5bmNocm9uaXplZCBieSBib3RoIHNpLVx1MDAzZWxvY2sgYW5kXG4tXHRcdCAqIHN3YXBfYXZhaWxfbG9jaywgdG8gZW5zdXJlIHRoZSByZXN1bHQgY2FuIGJlIHNlZW4gYnlcbi1cdFx0ICogYWRkX3RvX2F2YWlsX2xpc3QuXG4tXHRcdCAqL1xuLVx0XHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuLVx0XHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfV1JJVEVPSztcbi1cdFx0YXRvbWljX2xvbmdfb3IoU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCwgXHUwMDI2c2ktXHUwMDNlaW51c2VfcGFnZXMpO1xuLVx0fSBlbHNlIHtcbi1cdFx0Lypcbi1cdFx0ICogSWYgbm90IGNhbGxlZCBieSBzd2Fwb2ZmLCB0YWtlIGl0IG9mZi1saXN0IG9ubHkgaWYgaXQnc1xuLVx0XHQgKiBmdWxsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQgKHN0cmljdGx5XG4tXHRcdCAqIHNpLVx1MDAzZWludXNlX3BhZ2VzID09IHBhZ2VzKSwgYW55IGNvbmN1cnJlbnQgc2xvdCBmcmVlaW5nLFxuLVx0XHQgKiBvciBkZXZpY2UgYWxyZWFkeSByZW1vdmVkIGZyb20gcGxpc3QgYnkgc29tZW9uZSBlbHNlXG4tXHRcdCAqIHdpbGwgbWFrZSB0aGlzIHJldHVybiBmYWxzZS5cbi1cdFx0ICovXG4rXHQvKlxuK1x0ICogRm9yY2UgcmVtb3ZlIGl0IG9ubHkgZm9yIHN3YXBvZmYuIEVsc2UsIHRha2UgaXQgb2ZmLWxpc3Qgb25seSBpZlxuK1x0ICogaXQncyBmdWxsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQgKHN0cmljdGx5XG4rXHQgKiBzaS1cdTAwM2VpbnVzZV9wYWdlcyA9PSBwYWdlcyksIHNvIGNvbmN1cnJlbnQgc2xvdCBmcmVlaW5nLCBvclxuK1x0ICogY29uY3VycmVudCBsaXN0IHJlbW92YWwgd2lsbCBtYWtlIHRoZSBjbXB4Y2hnIGZhaWwgYW5kIHNraXBcbitcdCAqIHRoZSByZW1vdmFsLlxuK1x0ICovXG4rXHRpZiAoIXN3YXBvZmYpIHtcbiBcdFx0cGFnZXMgPSBzaS1cdTAwM2VwYWdlcztcbiBcdFx0aWYgKCFhdG9taWNfbG9uZ190cnlfY21weGNoZyhcdTAwMjZzaS1cdTAwM2VpbnVzZV9wYWdlcywgXHUwMDI2cGFnZXMsXG4gXHRcdFx0XHRcdCAgICAgcGFnZXMgfCBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSlcbiBcdFx0XHRnb3RvIHNraXA7XG4rXHR9IGVsc2Uge1xuK1x0XHRhdG9taWNfbG9uZ19vcihTV0FQX1VTQUdFX09GRkxJU1RfQklULCBcdTAwMjZzaS1cdTAwM2VpbnVzZV9wYWdlcyk7XG4gXHR9XG4gXG4tXHRwbGlzdF9kZWwoXHUwMDI2c2ktXHUwMDNlYXZhaWxfbGlzdCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcbi1cbitcdHN3YXBfcXVldWVfbWFzayhzaSk7XG4gc2tpcDpcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbiB9XG4gXG4gLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHRoaXMgaGVscGVyLiAqL1xuLXN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgYm9vbCBzd2Fwb24pXG4rc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIHtcbiBcdGxvbmcgdmFsO1xuIFx0dW5zaWduZWQgbG9uZyBwYWdlcztcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuIFxuLVx0LyogQ29ycmVzcG9uZGluZyB0byBTV1BfV1JJVEVPSyBjbGVhcmluZyBpbiBkZWxfZnJvbV9hdmFpbF9saXN0ICovXG4tXHRpZiAoc3dhcG9uKSB7XG4tXHRcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4tXHRcdHNpLVx1MDAzZWZsYWdzIHw9IFNXUF9XUklURU9LO1xuLVx0fSBlbHNlIHtcbi1cdFx0aWYgKCEoUkVBRF9PTkNFKHNpLVx1MDAzZWZsYWdzKSBcdTAwMjYgU1dQX1dSSVRFT0spKVxuLVx0XHRcdGdvdG8gc2tpcDtcbi1cdH1cbitcdC8qXG4rXHQgKiBNYXJrIHRoZSBkZXZpY2UgYXMgYXZhaWwgaWYgU1dQX1dSSVRFT0sgaXMgc2V0LiBTd2Fwb2ZmIGNsZWFyc1xuK1x0ICogU1dQX1dSSVRFT0sgZmlyc3QsIHNvIGNoZWNrIHRoYXQgZmlyc3Qgc28gdGhlIGRldmljZSB3b24ndCBiZVxuK1x0ICogcmUtYWRkZWQgYWZ0ZXIgc3dhcG9mZiBzdGFydGVkLlxuK1x0ICovXG4rXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spKVxuK1x0XHRnb3RvIHNraXA7XG4gXG4gXHRpZiAoIShhdG9taWNfbG9uZ19yZWFkKFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKSBcdTAwMjYgU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCkpXG4gXHRcdGdvdG8gc2tpcDtcbkBAIC0xMjQ2LDkgKzE1ODQsMTAgQEAgc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbilcbiBcdHZhbCA9IGF0b21pY19sb25nX2ZldGNoX2FuZF9yZWxheGVkKH5TV0FQX1VTQUdFX09GRkxJU1RfQklULCBcdTAwMjZzaS1cdTAwM2VpbnVzZV9wYWdlcyk7XG4gXG4gXHQvKlxuLVx0ICogV2hlbiBkZXZpY2UgaXMgZnVsbCBhbmQgZGV2aWNlIGlzIG9uIHRoZSBwbGlzdCwgb25seSBvbmUgdXBkYXRlciB3aWxsXG4tXHQgKiBzZWUgKGludXNlX3BhZ2VzID09IHNpLVx1MDAzZXBhZ2VzKSBhbmQgd2lsbCBjYWxsIGRlbF9mcm9tX2F2YWlsX2xpc3QuIElmXG4tXHQgKiB0aGF0IHVwZGF0ZXIgaGFwcGVuIHRvIGJlIGhlcmUsIGp1c3Qgc2tpcCBhZGRpbmcuXG4rXHQgKiBXaGVuIGRldmljZSBpcyBmdWxsIGFuZCBtYXJrZWQgYXMgYXZhaWxhYmxlLCBvbmUgcmVhZGVyIHdpbGwgc2VlXG4rXHQgKiAoaW51c2VfcGFnZXMgPT0gc2ktXHUwMDNlcGFnZXMpIGFuZCBzaG91bGQgbWFyayBpdCBhcyB1bmF2YWlsYWJsZSBhbmRcbitcdCAqIHNldCBTV0FQX1VTQUdFX09GRkxJU1RfQklULiBJZiB0aGF0IHVwZGF0ZXIgaGFwcGVucyB0byBiZSBoZXJlLCBqdXN0XG4rXHQgKiBza2lwIHRoZSByZXN0LlxuIFx0ICovXG4gXHRwYWdlcyA9IHNpLVx1MDAzZXBhZ2VzO1xuIFx0aWYgKHZhbCA9PSBwYWdlcykge1xuQEAgLTEyNTgsNjAgKzE1OTcsNDIgQEAgc3RhdGljIHZvaWQgYWRkX3RvX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvbilcbiBcdFx0XHRnb3RvIHNraXA7XG4gXHR9XG4gXG4tXHRwbGlzdF9hZGQoXHUwMDI2c2ktXHUwMDNlYXZhaWxfbGlzdCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcbi1cbitcdHN3YXBfcXVldWVfdW5tYXNrKHNpKTtcbiBza2lwOlxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuIH1cbiBcbiAvKlxuLSAqIHN3YXBfdXNhZ2VfYWRkIC8gc3dhcF91c2FnZV9zdWIgb2YgZWFjaCBzbG90IGFyZSBzZXJpYWxpemVkIGJ5IGNpLVx1MDAzZWxvY2tcbi0gKiB3aXRoaW4gZWFjaCBjbHVzdGVyLCBzbyB0aGUgdG90YWwgY29udHJpYnV0aW9uIHRvIHRoZSBnbG9iYWwgY291bnRlciBzaG91bGRcbi0gKiBhbHdheXMgYmUgcG9zaXRpdmUgYW5kIGNhbm5vdCBleGNlZWQgdGhlIHRvdGFsIG51bWJlciBvZiB1c2FibGUgc2xvdHMuXG4rICogc3dhcF9kZXZpY2VfaW51c2VfYWRkIC8gc3dhcF9kZXZpY2VfaW51c2Vfc3ViIGFyZSBjYWxsZWQgd2l0aGluIGNsdXN0ZXJcbisgKiB1cGRhdGUgY3JpdGljYWwgc2VjdGlvbnMgYW5kIHNlcmlhbGl6ZWQgYnkgY2ktXHUwMDNlbG9jayB3aXRoaW4gZWFjaCBjbHVzdGVyLFxuKyAqIHNvIHRoZSB0b3RhbCBjb250cmlidXRpb24gdG8gdGhlIGdsb2JhbCBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmVcbisgKiBhbmQgY2Fubm90IGV4Y2VlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHVzYWJsZSBzbG90cy5cbiAgKi9cbi1zdGF0aWMgYm9vbCBzd2FwX3VzYWdlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuK3N0YXRpYyB2b2lkIHN3YXBfZGV2aWNlX2ludXNlX2FkZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuIHtcbi1cdGxvbmcgdmFsID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbitcdGxvbmcgaW51c2VfcGFnZXM7XG4gXG4gXHQvKlxuIFx0ICogSWYgZGV2aWNlIGlzIGZ1bGwsIGFuZCBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGlzIG5vdCBzZXQsXG4tXHQgKiByZW1vdmUgaXQgZnJvbSB0aGUgcGxpc3QuXG4tXHQgKi9cbi1cdGlmICh1bmxpa2VseSh2YWwgPT0gc2ktXHUwMDNlcGFnZXMpKSB7XG4tXHRcdGRlbF9mcm9tX2F2YWlsX2xpc3Qoc2ksIGZhbHNlKTtcbi1cdFx0cmV0dXJuIHRydWU7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuLVxuLXN0YXRpYyB2b2lkIHN3YXBfdXNhZ2Vfc3ViKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4te1xuLVx0bG9uZyB2YWwgPSBhdG9taWNfbG9uZ19zdWJfcmV0dXJuX3JlbGF4ZWQobnJfZW50cmllcywgXHUwMDI2c2ktXHUwMDNlaW51c2VfcGFnZXMpO1xuLVxuLVx0Lypcbi1cdCAqIElmIGRldmljZSBpcyBub3QgZnVsbCwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgc2V0LFxuLVx0ICogYWRkIGl0IHRvIHRoZSBwbGlzdC5cbitcdCAqIG1hcmsgaXQgdW5hdmFpbGFibGUuXG4gXHQgKi9cbi1cdGlmICh1bmxpa2VseSh2YWwgXHUwMDI2IFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQpKVxuLVx0XHRhZGRfdG9fYXZhaWxfbGlzdChzaSwgZmFsc2UpO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2FsbG9jKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbi1cdFx0XHQgICAgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuLXtcbi1cdGlmIChzd2FwX3VzYWdlX2FkZChzaSwgbnJfZW50cmllcykpIHtcbitcdGludXNlX3BhZ2VzID0gYXRvbWljX2xvbmdfYWRkX3JldHVybl9yZWxheGVkKG5yX2VudHJpZXMsIFx1MDAyNnNpLVx1MDAzZWludXNlX3BhZ2VzKTtcbitcdGlmICh1bmxpa2VseShpbnVzZV9wYWdlcyA9PSBzaS1cdTAwM2VwYWdlcykpIHtcbiBcdFx0aWYgKHZtX3N3YXBfZnVsbCgpKVxuIFx0XHRcdHNjaGVkdWxlX3dvcmsoXHUwMDI2c2ktXHUwMDNlcmVjbGFpbV93b3JrKTtcbitcdFx0ZGVsX2Zyb21fYXZhaWxfbGlzdChzaSwgZmFsc2UpO1xuIFx0fVxuK1xuIFx0YXRvbWljX2xvbmdfc3ViKG5yX2VudHJpZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcbi1cdFx0XHQgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpXG4rc3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2Vfc3ViKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxuIHtcbiBcdHVuc2lnbmVkIGxvbmcgZW5kID0gb2Zmc2V0ICsgbnJfZW50cmllcyAtIDE7XG4gXHR2b2lkICgqc3dhcF9zbG90X2ZyZWVfbm90aWZ5KShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpO1xuK1x0bG9uZyBpbnVzZV9wYWdlcztcbiBcdHVuc2lnbmVkIGludCBpO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfZW50cmllczsgaSsrKVxuQEAgLTEzMzUsNyArMTY1NiwxNCBAQCBzdGF0aWMgdm9pZCBzd2FwX3JhbmdlX2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcbiBcdCAqL1xuIFx0c21wX3dtYigpO1xuIFx0YXRvbWljX2xvbmdfYWRkKG5yX2VudHJpZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuLVx0c3dhcF91c2FnZV9zdWIoc2ksIG5yX2VudHJpZXMpO1xuK1xuK1x0LypcbitcdCAqIElmIGRldmljZSBpcyBub3QgZnVsbCwgYW5kIFNXQVBfVVNBR0VfT0ZGTElTVF9CSVQgaXMgc2V0LFxuK1x0ICogYWRkIGl0IGJhY2sgdG8gdGhlIGF2YWlsYWJsZSBxdWV1ZS5cbitcdCAqL1xuK1x0aW51c2VfcGFnZXMgPSBhdG9taWNfbG9uZ19zdWJfcmV0dXJuX3JlbGF4ZWQobnJfZW50cmllcywgXHUwMDI2c2ktXHUwMDNlaW51c2VfcGFnZXMpO1xuK1x0aWYgKHVubGlrZWx5KGludXNlX3BhZ2VzIFx1MDAyNiBTV0FQX1VTQUdFX09GRkxJU1RfQklUKSlcbitcdFx0YWRkX3RvX2F2YWlsX2xpc3Qoc2kpO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG5AQCAtMTM0NSwxMTMgKzE2NzMsNDkgQEAgc3RhdGljIGJvb2wgZ2V0X3N3YXBfZGV2aWNlX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIFx0LypcbiBcdCAqIEd1YXJhbnRlZSB0aGUgc2ktXHUwMDNldXNlcnMgYXJlIGNoZWNrZWQgYmVmb3JlIGFjY2Vzc2luZyBvdGhlclxuIFx0ICogZmllbGRzIG9mIHN3YXBfaW5mb19zdHJ1Y3QsIGFuZCBzaS1cdTAwM2VmbGFncyAoU1dQX1dSSVRFT0spIGlzXG4tXHQgKiB1cCB0byBkYXRlZC5cbitcdCAqIHVwIHRvIGRhdGUuXG4gXHQgKlxuLVx0ICogUGFpcmVkIHdpdGggdGhlIHNwaW5fdW5sb2NrKCkgYWZ0ZXIgc2V0dXBfc3dhcF9pbmZvKCkgaW5cbi1cdCAqIGVuYWJsZV9zd2FwX2luZm8oKSwgYW5kIHNtcF93bWIoKSBpbiBzd2Fwb2ZmLlxuK1x0ICogUGFpcmVkIHdpdGggcGVyY3B1X3VwX3dyaXRlKCkgaW4gc3dhcF9kZXZpY2VfZW5hYmxlKCksIGFuZFxuK1x0ICogc21wX3dtYigpIGFmdGVyIGNsZWFyaW5nIFNXUF9XUklURU9LIGluIHN3YXBvZmYuXG4gXHQgKi9cbiBcdHNtcF9ybWIoKTtcbiBcdHJldHVybiB0cnVlO1xuIH1cbiBcbi0vKlxuLSAqIEZhc3QgcGF0aCB0cnkgdG8gZ2V0IHN3YXAgZW50cmllcyB3aXRoIHNwZWNpZmllZCBvcmRlciBmcm9tIGN1cnJlbnRcbi0gKiBDUFUncyBzd2FwIGVudHJ5IHBvb2wgKGEgY2x1c3RlcikuXG4tICovXG4tc3RhdGljIGJvb2wgc3dhcF9hbGxvY19mYXN0KHN0cnVjdCBmb2xpbyAqZm9saW8pXG4rc3RhdGljIGludCBzd2FwX2FsbG9jX2VudHJ5KHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuLVx0dW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuLVx0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaTtcbitcdGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4tXHR1bnNpZ25lZCBpbnQgb2Zmc2V0O1xuLVxuLVx0Lypcbi1cdCAqIE9uY2UgYWxsb2NhdGVkLCBzd2FwX2luZm9fc3RydWN0IHdpbGwgbmV2ZXIgYmUgY29tcGxldGVseSBmcmVlZCxcbi1cdCAqIHNvIGNoZWNraW5nIGl0J3MgbGl2ZW5lc3MgYnkgZ2V0X3N3YXBfZGV2aWNlX2luZm8gaXMgZW5vdWdoLlxuLVx0ICovXG4tXHRzaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVtvcmRlcl0pO1xuLVx0b2Zmc2V0ID0gdGhpc19jcHVfcmVhZChwZXJjcHVfc3dhcF9jbHVzdGVyLm9mZnNldFtvcmRlcl0pO1xuLVx0aWYgKCFzaSB8fCAhb2Zmc2V0IHx8ICFnZXRfc3dhcF9kZXZpY2VfaW5mbyhzaSkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XG4tXHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIG9yZGVyKSkge1xuLVx0XHRpZiAoY2x1c3Rlcl9pc19lbXB0eShjaSkpXG4tXHRcdFx0b2Zmc2V0ID0gY2x1c3Rlcl9vZmZzZXQoc2ksIGNpKTtcbi1cdFx0YWxsb2Nfc3dhcF9zY2FuX2NsdXN0ZXIoc2ksIGNpLCBmb2xpbywgb2Zmc2V0KTtcbi1cdH0gZWxzZSB7XG4tXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0fVxuK1x0aW50IG5yX2l0ZXIsIHJldDtcbitcbitcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdGZvciAobnJfaXRlciA9IDA7OyBucl9pdGVyKyspIHtcbitcdFx0c2kgPSBzd2FwX3F1ZXVlX2dldF9kZXZpY2UobnJfcGFnZXMsIG5yX2l0ZXIpO1xuK1x0XHRpZiAoSVNfRVJSKHNpKSkge1xuK1x0XHRcdHJldCA9IFBUUl9FUlIoc2kpO1xuK1x0XHRcdGlmIChyZXQgPT0gLUVCVVNZKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdFx0Y2x1c3Rlcl9hbGxvY19zd2FwX2VudHJ5KHNpLCBmb2xpbyk7XG4gXG4tXHRwdXRfc3dhcF9kZXZpY2Uoc2kpO1xuLVx0cmV0dXJuIGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbi19XG4tXG4tLyogUm90YXRlIHRoZSBkZXZpY2UgYW5kIHN3aXRjaCB0byBhIG5ldyBjbHVzdGVyICovXG4tc3RhdGljIHZvaWQgc3dhcF9hbGxvY19zbG93KHN0cnVjdCBmb2xpbyAqZm9saW8pXG4te1xuLVx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCAqbmV4dDtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuLXN0YXJ0X292ZXI6XG4tXHRwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNpLCBuZXh0LCBcdTAwMjZzd2FwX2F2YWlsX2hlYWQsIGF2YWlsX2xpc3QpIHtcbi1cdFx0LyogUm90YXRlIHRoZSBkZXZpY2UgYW5kIHN3aXRjaCB0byBhIG5ldyBjbHVzdGVyICovXG4tXHRcdHBsaXN0X3JlcXVldWUoXHUwMDI2c2ktXHUwMDNlYXZhaWxfbGlzdCwgXHUwMDI2c3dhcF9hdmFpbF9oZWFkKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9hdmFpbF9sb2NrKTtcbi1cdFx0aWYgKGdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkge1xuLVx0XHRcdGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzaSwgZm9saW8pO1xuLVx0XHRcdHB1dF9zd2FwX2RldmljZShzaSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbi1cdFx0XHRcdHJldHVybjtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4tXHRcdFx0XHRyZXR1cm47XG4rXHRcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbitcdFx0XHRyZXQgPSAwO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuIFx0XHQvKlxuLVx0XHQgKiBpZiB3ZSBnb3QgaGVyZSwgaXQncyBsaWtlbHkgdGhhdCBzaSB3YXMgYWxtb3N0IGZ1bGwgYmVmb3JlLFxuLVx0XHQgKiBtdWx0aXBsZSBjYWxsZXJzIHByb2JhYmx5IGFsbCB0cmllZCB0byBnZXQgYSBwYWdlIGZyb20gdGhlXG4tXHRcdCAqIHNhbWUgc2kgYW5kIGl0IGZpbGxlZCB1cCBiZWZvcmUgd2UgY291bGQgZ2V0IG9uZTsgb3IsIHRoZSBzaVxuLVx0XHQgKiBmaWxsZWQgdXAgYmV0d2VlbiB1cyBkcm9wcGluZyBzd2FwX2F2YWlsX2xvY2suXG4tXHRcdCAqIFNpbmNlIHdlIGRyb3BwZWQgdGhlIHN3YXBfYXZhaWxfbG9jaywgdGhlIHN3YXBfYXZhaWxfbGlzdFxuLVx0XHQgKiBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkOyBzbyBpZiBuZXh0IGlzIHN0aWxsIGluIHRoZVxuLVx0XHQgKiBzd2FwX2F2YWlsX2hlYWQgbGlzdCB0aGVuIHRyeSBpdCwgb3RoZXJ3aXNlIHN0YXJ0IG92ZXIgaWYgd2Vcbi1cdFx0ICogaGF2ZSBub3QgZ290dGVuIGFueSBzbG90cy5cbitcdFx0ICogRm9yIGxhcmdlIGFsbG9jYXRpb24sIHJldHVybiBlcnJvciBkaXJlY3RseSB0byBpbmZvcm0gdGhlXG4rXHRcdCAqIGNhbGxlciB0byBzcGxpdCBpdCBpbnN0ZWFkIG9mIGZhbGxiYWNrIHRvIG90aGVyIGRldmljZXMuXG4gXHRcdCAqL1xuLVx0XHRpZiAocGxpc3Rfbm9kZV9lbXB0eShcdTAwMjZuZXh0LVx1MDAzZWF2YWlsX2xpc3QpKVxuLVx0XHRcdGdvdG8gc3RhcnRfb3Zlcjtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4tfVxuLVxuLS8qXG4tICogRGlzY2FyZCBwZW5kaW5nIGNsdXN0ZXJzIGluIGEgc3luY2hyb25pemVkIHdheSB3aGVuIHVuZGVyIGhpZ2ggcHJlc3N1cmUuXG4tICogUmV0dXJuOiB0cnVlIGlmIGFueSBjbHVzdGVyIGlzIGRpc2NhcmRlZC5cbi0gKi9cbi1zdGF0aWMgYm9vbCBzd2FwX3N5bmNfZGlzY2FyZCh2b2lkKVxuLXtcbi1cdGJvb2wgcmV0ID0gZmFsc2U7XG4tXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksICpuZXh0O1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tc3RhcnRfb3Zlcjpcbi1cdHBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2ksIG5leHQsIFx1MDAyNnN3YXBfYWN0aXZlX2hlYWQsIGxpc3QpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0aWYgKGdldF9zd2FwX2RldmljZV9pbmZvKHNpKSkge1xuLVx0XHRcdGlmIChzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1BBR0VfRElTQ0FSRClcbi1cdFx0XHRcdHJldCA9IHN3YXBfZG9fc2NoZWR1bGVkX2Rpc2NhcmQoc2kpO1xuLVx0XHRcdHB1dF9zd2FwX2RldmljZShzaSk7XG4rXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xuK1x0XHRcdHJldCA9IC1FMkJJRztcbitcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRpZiAocmV0KVxuLVx0XHRcdHJldHVybiB0cnVlO1xuLVxuLVx0XHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0aWYgKHBsaXN0X25vZGVfZW1wdHkoXHUwMDI2bmV4dC1cdTAwM2VsaXN0KSlcbi1cdFx0XHRnb3RvIHN0YXJ0X292ZXI7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuIFxuLVx0cmV0dXJuIGZhbHNlO1xuK1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyBpbnQgc3dhcF9leHRlbmRfdGFibGVfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuQEAgLTE3MzUsNiArMTk5OSw3IEBAIGludCBmb2xpb19hbGxvY19zd2FwKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0dW5zaWduZWQgaW50IG9yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0dW5zaWduZWQgaW50IHNpemUgPSAxIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGludCByZXQ7XG4gXG4gXHRWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X3VwdG9kYXRlKGZvbGlvKSwgZm9saW8pO1xuQEAgLTE3NTcsMjMgKzIwMjIsMTQgQEAgaW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFx0fVxuIFx0fVxuIFxuLWFnYWluOlxuLVx0bG9jYWxfbG9jayhcdTAwMjZwZXJjcHVfc3dhcF9jbHVzdGVyLmxvY2spO1xuLVx0aWYgKCFzd2FwX2FsbG9jX2Zhc3QoZm9saW8pKVxuLVx0XHRzd2FwX2FsbG9jX3Nsb3coZm9saW8pO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4tXG4tXHRpZiAoIW9yZGVyIFx1MDAyNlx1MDAyNiB1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkge1xuLVx0XHRpZiAoc3dhcF9zeW5jX2Rpc2NhcmQoKSlcbi1cdFx0XHRnb3RvIGFnYWluO1xuLVx0fVxuK1x0cmV0ID0gc3dhcF9hbGxvY19lbnRyeShmb2xpbyk7XG4gXG4gXHQvKiBOZWVkIHRvIGNhbGwgdGhpcyBldmVuIGlmIGFsbG9jYXRpb24gZmFpbGVkLCBmb3IgTUVNQ0dfU1dBUF9GQUlMLiAqL1xuIFx0aWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwKGZvbGlvKSkpXG4gXHRcdHN3YXBfY2FjaGVfZGVsX2ZvbGlvKGZvbGlvKTtcbiBcbiBcdGlmICh1bmxpa2VseSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSlcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4rXHRcdHJldHVybiByZXQgPyByZXQgOiAtRU5PTUVNO1xuIFxuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTE5NDgsNyArMjIwNCw3IEBAIHZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiBcdGlmIChiYXRjaF9pZClcbiBcdFx0bWVtX2Nncm91cF91bmNoYXJnZV9zd2FwKGJhdGNoX2lkLCBjaV9vZmYgLSBiYXRjaF9vZmYpO1xuIFxuLVx0c3dhcF9yYW5nZV9mcmVlKHNpLCBjaV9oZWFkICsgY2lfc3RhcnQsIG5yX3BhZ2VzKTtcbitcdHN3YXBfZGV2aWNlX2ludXNlX3N1YihzaSwgY2lfaGVhZCArIGNpX3N0YXJ0LCBucl9wYWdlcyk7XG4gXHRzd2FwX2NsdXN0ZXJfYXNzZXJ0X2VtcHR5KGNpLCBjaV9zdGFydCwgbnJfcGFnZXMsIGZhbHNlKTtcbiBcbiBcdGlmICghY2ktXHUwMDNlY291bnQpXG5AQCAtMjE1MCwzMSArMjQwNiwxNCBAQCB2b2lkIHN3YXBfcHV0X2VudHJpZXNfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5LCBpbnQgbnIpXG4gICovXG4gc3dwX2VudHJ5X3Qgc3dhcF9hbGxvY19oaWJlcm5hdGlvbl9zbG90KGludCB0eXBlKVxuIHtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwY3Bfc2ksICpzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuLVx0dW5zaWduZWQgbG9uZyBwY3Bfb2Zmc2V0LCBvZmZzZXQgPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XG4tXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XG4rXHR1bnNpZ25lZCBsb25nIG9mZnNldCA9IFNXQVBfRU5UUllfSU5WQUxJRDtcbiBcdHN3cF9lbnRyeV90IGVudHJ5ID0gezB9O1xuIFxuIFx0aWYgKCFzaSlcbiBcdFx0Z290byBmYWlsO1xuIFxuLVx0Lypcbi1cdCAqIFRyeSB0aGUgbG9jYWwgY2x1c3RlciBmaXJzdCBpZiBpdCBtYXRjaGVzIHRoZSBkZXZpY2UuIElmXG4tXHQgKiBub3QsIHRyeSBncmFiIGEgbmV3IGNsdXN0ZXIgYW5kIG92ZXJyaWRlIGxvY2FsIGNsdXN0ZXIuXG4tXHQgKi9cbi1cdGxvY2FsX2xvY2soXHUwMDI2cGVyY3B1X3N3YXBfY2x1c3Rlci5sb2NrKTtcbi1cdHBjcF9zaSA9IHRoaXNfY3B1X3JlYWQocGVyY3B1X3N3YXBfY2x1c3Rlci5zaVswXSk7XG4tXHRwY3Bfb2Zmc2V0ID0gdGhpc19jcHVfcmVhZChwZXJjcHVfc3dhcF9jbHVzdGVyLm9mZnNldFswXSk7XG4tXHRpZiAocGNwX3NpID09IHNpIFx1MDAyNlx1MDAyNiBwY3Bfb2Zmc2V0KSB7XG4tXHRcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIHBjcF9vZmZzZXQpO1xuLVx0XHRpZiAoY2x1c3Rlcl9pc191c2FibGUoY2ksIDApKVxuLVx0XHRcdG9mZnNldCA9IGFsbG9jX3N3YXBfc2Nhbl9jbHVzdGVyKHNpLCBjaSwgTlVMTCwgcGNwX29mZnNldCk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdH1cbi1cdGlmICghb2Zmc2V0KVxuLVx0XHRvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpO1xuLVx0bG9jYWxfdW5sb2NrKFx1MDAyNnBlcmNwdV9zd2FwX2NsdXN0ZXIubG9jayk7XG4rXHRvZmZzZXQgPSBjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnkoc2ksIE5VTEwpO1xuIFx0aWYgKG9mZnNldClcbiBcdFx0ZW50cnkgPSBzd3BfZW50cnkoc2ktXHUwMDNldHlwZSwgb2Zmc2V0KTtcbiBcbkBAIC0yMjA1LDI2ICsyNDQ0LDE4IEBAIHZvaWQgc3dhcF9mcmVlX2hpYmVybmF0aW9uX3Nsb3Qoc3dwX2VudHJ5X3QgZW50cnkpXG4gXG4gc3RhdGljIGludCBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuIHtcbi1cdGludCB0eXBlO1xuLVxuLVx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZzd2FwX2xvY2spO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuIFxuIFx0aWYgKCFkZXZpY2UpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlKyspIHtcbi1cdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTtcbi1cbi1cdFx0aWYgKCEoc2lzLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfV1JJVEVPSykpXG4tXHRcdFx0Y29udGludWU7XG4tXG4tXHRcdGlmIChkZXZpY2UgPT0gc2lzLVx1MDAzZWJkZXYtXHUwMDNlYmRfZGV2KSB7XG4tXHRcdFx0c3RydWN0IHN3YXBfZXh0ZW50ICpzZSA9IGZpcnN0X3NlKHNpcyk7XG4tXG4tXHRcdFx0aWYgKHNlLVx1MDAzZXN0YXJ0X2Jsb2NrID09IG9mZnNldClcbi1cdFx0XHRcdHJldHVybiB0eXBlO1xuK1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xuK1x0XHRpZiAoZGV2aWNlID09IHNpLVx1MDAzZWJkZXYtXHUwMDNlYmRfZGV2KSB7XG4rXHRcdFx0aWYgKGZpcnN0X3NlKHNpKS1cdTAwM2VzdGFydF9ibG9jayA9PSBvZmZzZXQpXG4rXHRcdFx0XHRyZXR1cm4gc2ktXHUwMDNldHlwZTtcbiBcdFx0fVxuIFx0fVxuK1xuIFx0cmV0dXJuIC1FTk9ERVY7XG4gfVxuIFxuQEAgLTIyNDcsMjEgKzI0NzgsMTggQEAgc3RhdGljIGludCBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuICAqL1xuIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuIHtcbi1cdGludCB0eXBlO1xuK1x0aW50IHJldDtcbiBcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVxuLVx0dHlwZSA9IF9fZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2aWNlLCBvZmZzZXQpO1xuLVx0aWYgKHR5cGUgXHUwMDNjIDApIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0cmV0dXJuIHR5cGU7XG4tXHR9XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0cmV0ID0gX19maW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZpY2UsIG9mZnNldCk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRnb3RvIG91dDtcbiBcbi1cdHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XG4rXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHJldCk7XG4gXHRpZiAoV0FSTl9PTl9PTkNFKCFzaSkpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0cmV0dXJuIC1FTk9ERVY7XG4rXHRcdHJldCA9IC1FTk9ERVY7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0LypcbkBAIC0yMjcwLDE0ICsyNDk4LDE1IEBAIGludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxuIFx0ICogdGhlIHNhbWUgc2Vzc2lvbi5cbiBcdCAqL1xuIFx0aWYgKFdBUk5fT05fT05DRShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX0hJQkVSTkFUSU9OKSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRyZXR1cm4gLUVCVVNZO1xuK1x0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0c2ktXHUwMDNlZmxhZ3MgfD0gU1dQX0hJQkVSTkFUSU9OO1xuIFxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdHJldHVybiB0eXBlO1xuK291dDpcbitcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gLyoqXG5AQCAtMjI5NCwxNCArMjUyMywxMSBAQCB2b2lkIHVucGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShpbnQgdHlwZSlcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuLVx0aWYgKCFzaSkge1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRyZXR1cm47XG4tXHR9XG4tXHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfSElCRVJOQVRJT047XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0aWYgKHNpKVxuK1x0XHRzaS1cdTAwM2VmbGFncyBcdTAwMjY9IH5TV1BfSElCRVJOQVRJT047XG4rXHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gXG4gLyoqXG5AQCAtMjMyNiwyOSArMjU1MiwyNiBAQCBpbnQgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpXG4ge1xuIFx0aW50IHR5cGU7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdHR5cGUgPSBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldmljZSwgb2Zmc2V0KTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFxuIFx0cmV0dXJuIHR5cGU7XG4gfVxuIFxuIGludCBmaW5kX2ZpcnN0X3N3YXAoZGV2X3QgKmRldmljZSlcbiB7XG4tXHRpbnQgdHlwZTtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlKyspIHtcbi1cdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTtcbitcdGludCByZXQgPSAtRU5PREVWO1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuIFxuLVx0XHRpZiAoIShzaXMtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0KmRldmljZSA9IHNpcy1cdTAwM2ViZGV2LVx1MDAzZWJkX2Rldjtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdFx0cmV0dXJuIHR5cGU7XG4rXHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRmb3JfZWFjaF9hdmFpbF9zd2FwKHNpKSB7XG4rXHRcdCpkZXZpY2UgPSBzaS1cdTAwM2ViZGV2LVx1MDAzZWJkX2RldjtcbitcdFx0cmV0ID0gc2ktXHUwMDNldHlwZTtcbitcdFx0YnJlYWs7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0cmV0dXJuIC1FTk9ERVY7XG4rXHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gLypcbkBAIC0yMzc2LDcgKzI1OTksNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXG4ge1xuIFx0dW5zaWduZWQgaW50IG4gPSAwO1xuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRpZiAoKHVuc2lnbmVkIGludCl0eXBlIFx1MDAzYyBucl9zd2FwZmlsZXMpIHtcbiBcdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mb1t0eXBlXTtcbiBcbkBAIC0yMzg4LDcgKzI2MTEsNyBAQCB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQgdHlwZSwgaW50IGZyZWUpXG4gXHRcdH1cbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2lzLVx1MDAzZWxvY2spO1xuIFx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV91cF9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRyZXR1cm4gbjtcbiB9XG4gI2VuZGlmIC8qIENPTkZJR19ISUJFUk5BVElPTiAqL1xuQEAgLTI3MDAsMTAgKzI5MjMsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX25leHRfdG9fdW51c2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxuIFx0dW5zaWduZWQgbG9uZyBzd3BfdGI7XG4gXG4gXHQvKlxuLVx0ICogTm8gbmVlZCBmb3Igc3dhcF9sb2NrIGhlcmU6IHdlJ3JlIGp1c3QgbG9va2luZ1xuK1x0ICogTm8gbmVlZCBmb3Igc3dhcG9uX3J3c2VtIGhlcmU6IHdlJ3JlIGp1c3QgbG9va2luZ1xuIFx0ICogZm9yIHdoZXRoZXIgYW4gZW50cnkgaXMgaW4gdXNlLCBub3QgbW9kaWZ5aW5nIGl0OyBmYWxzZVxuIFx0ICogaGl0cyBhcmUgb2theSwgYW5kIHN5c19zd2Fwb2ZmKCkgaGFzIGFscmVhZHkgcHJldmVudGVkIG5ld1xuLVx0ICogYWxsb2NhdGlvbnMgZnJvbSB0aGlzIGFyZWEgKHdoaWxlIGhvbGRpbmcgc3dhcF9sb2NrKS5cbitcdCAqIGFsbG9jYXRpb25zIGZyb20gdGhpcyBhcmVhICh3aGlsZSBob2xkaW5nIHN3YXBvbl9yd3NlbSkuXG4gXHQgKi9cbiBcdGZvciAoaSA9IHByZXYgKyAxOyBpIFx1MDAzYyBzaS1cdTAwM2VtYXg7IGkrKykge1xuIFx0XHRzd3BfdGIgPSBzd2FwX3RhYmxlX2dldChfX3N3YXBfb2Zmc2V0X3RvX2NsdXN0ZXIoc2ksIGkpLFxuQEAgLTI4MTYsNyArMzAzOSw3IEBAIHN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKVxuIHN1Y2Nlc3M6XG4gXHQvKlxuIFx0ICogTWFrZSBzdXJlIHRoYXQgZnVydGhlciBjbGVhbnVwcyBhZnRlciB0cnlfdG9fdW51c2UoKSByZXR1cm5zIGhhcHBlblxuLVx0ICogYWZ0ZXIgc3dhcF9yYW5nZV9mcmVlKCkgcmVkdWNlcyBzaS1cdTAwM2VpbnVzZV9wYWdlcyB0byAwLlxuK1x0ICogYWZ0ZXIgc3dhcF9kZXZpY2VfaW51c2Vfc3ViKCkgcmVkdWNlcyBzaS1cdTAwM2VpbnVzZV9wYWdlcyB0byAwLlxuIFx0ICovXG4gXHRzbXBfbWIoKTtcbiBcdHJldHVybiAwO1xuQEAgLTI4MjQsMTggKzMwNDcsMjAgQEAgc3RhdGljIGludCB0cnlfdG9fdW51c2UodW5zaWduZWQgaW50IHR5cGUpXG4gXG4gLypcbiAgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgdHJ5X3RvX3VudXNlLCBpZiBubyBzd2FwIGlzIG5vdyBpbiB1c2UsIHdlIGtub3dcbi0gKiB3ZSBjYW4gZW1wdHkgdGhlIG1tbGlzdC4gIHN3YXBfbG9jayBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuXG4tICogTm90ZSB0aGF0IG1tbGlzdF9sb2NrIG5lc3RzIGluc2lkZSBzd2FwX2xvY2ssIGFuZCBhbiBtbSBtdXN0IGJlXG4rICogd2UgY2FuIGVtcHR5IHRoZSBtbWxpc3QuIHN3YXBvbl9yd3NlbSBtdXN0IGJlIGhlbGQgb24gZW50cnkgYW5kIGV4aXQuXG4rICogTm90ZSB0aGF0IG1tbGlzdF9sb2NrIG5lc3RzIGluc2lkZSBzd2Fwb25fcndzZW0sIGFuZCBhbiBtbSBtdXN0IGJlXG4gICogYWRkZWQgdG8gdGhlIG1tbGlzdCBqdXN0IGFmdGVyIHBhZ2VfZHVwbGljYXRlIC0gYmVmb3JlIHdvdWxkIGJlIHJhY3kuXG4gICovXG4gc3RhdGljIHZvaWQgZHJhaW5fbW1saXN0KHZvaWQpXG4ge1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpO1xuIFx0c3RydWN0IGxpc3RfaGVhZCAqcCwgKm5leHQ7XG4tXHR1bnNpZ25lZCBpbnQgdHlwZTtcbiBcbi1cdGZvciAodHlwZSA9IDA7IHR5cGUgXHUwMDNjIG5yX3N3YXBmaWxlczsgdHlwZSsrKVxuLVx0XHRpZiAoc3dhcF91c2FnZV9pbl9wYWdlcyhzd2FwX2luZm9bdHlwZV0pKVxuK1x0Zm9yX2VhY2hfc3dhcChzaSkge1xuK1x0XHRpZiAoc3dhcF91c2FnZV9pbl9wYWdlcyhzaSkpXG4gXHRcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0c3Bpbl9sb2NrKFx1MDAyNm1tbGlzdF9sb2NrKTtcbiBcdGxpc3RfZm9yX2VhY2hfc2FmZShwLCBuZXh0LCBcdTAwMjZpbml0X21tLm1tbGlzdClcbiBcdFx0bGlzdF9kZWxfaW5pdChwKTtcbkBAIC0yOTY4LDU4ICszMTkzLDY1IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG4gXHRyZXR1cm4gZ2VuZXJpY19zd2FwZmlsZV9hY3RpdmF0ZShzaXMsIHN3YXBfZmlsZSwgc3Bhbik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9lbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbi17XG4tXHRhdG9taWNfbG9uZ19hZGQoc2ktXHUwMDNlcGFnZXMsIFx1MDAyNm5yX3N3YXBfcGFnZXMpO1xuLVx0dG90YWxfc3dhcF9wYWdlcyArPSBzaS1cdTAwM2VwYWdlcztcbi1cbi1cdGFzc2VydF9zcGluX2xvY2tlZChcdTAwMjZzd2FwX2xvY2spO1xuLVxuLVx0cGxpc3RfYWRkKFx1MDAyNnNpLVx1MDAzZWxpc3QsIFx1MDAyNnN3YXBfYWN0aXZlX2hlYWQpO1xuLVxuLVx0LyogQWRkIGJhY2sgdG8gYXZhaWxhYmxlIGxpc3QgKi9cbi1cdGFkZF90b19hdmFpbF9saXN0KHNpLCB0cnVlKTtcbi19XG4tXG4gLypcbi0gKiBDYWxsZWQgYWZ0ZXIgdGhlIHN3YXAgZGV2aWNlIGlzIHJlYWR5LCByZXN1cnJlY3QgaXRzIHBlcmNwdSByZWYsIGl0J3Mgbm93XG4tICogc2FmZSB0byByZWZlcmVuY2UgaXQuIEFkZCBpdCB0byB0aGUgbGlzdCB0byBleHBvc2UgaXQgdG8gdGhlIGFsbG9jYXRvci5cbisgKiBDYWxsZWQgYWZ0ZXIgdGhlIHN3YXAgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIHVzZWQuIE1hcmtpbmcgaXQgd3JpdGFibGUgYW5kXG4rICogZXhwb3NpbmcgaXQgdG8gdGhlIGFsbG9jYXRvci4gUmVzdXJyZWN0IGl0cyBwZXJjcHUgcmVmIGlmIGl0IHdhcyBkZWFkIGJlZm9yZS5cbiAgKi9cbi1zdGF0aWMgdm9pZCBlbmFibGVfc3dhcF9pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbitzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9lbmFibGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuIHtcbi1cdHBlcmNwdV9yZWZfcmVzdXJyZWN0KFx1MDAyNnNpLVx1MDAzZXVzZXJzKTtcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuLVx0X2VuYWJsZV9zd2FwX2luZm8oc2kpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLX1cbitcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRzcGluX2xvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4rXHRzaS1cdTAwM2VmbGFncyB8PSBTV1BfV1JJVEVPSztcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfcXVldWVfdXBkYXRlX2xvY2spO1xuK1x0YXRvbWljX2xvbmdfYWRkKHNpLVx1MDAzZXBhZ2VzLCBcdTAwMjZucl9zd2FwX3BhZ2VzKTtcbitcdHRvdGFsX3N3YXBfcGFnZXMgKz0gc2ktXHUwMDNlcGFnZXM7XG4rXHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcbi1zdGF0aWMgdm9pZCByZWluc2VydF9zd2FwX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxuLXtcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnNpLVx1MDAzZWxvY2spO1xuLVx0X2VuYWJsZV9zd2FwX2luZm8oc2kpO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ktXHUwMDNlbG9jayk7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0YWRkX3RvX2F2YWlsX2xpc3Qoc2kpO1xuIH1cbiBcbi0vKlxuLSAqIENhbGxlZCBhZnRlciBjbGVhcmluZyBTV1BfV1JJVEVPSywgZW5zdXJlcyBjbHVzdGVyX2FsbG9jX3JhbmdlXG4tICogc2VlIHRoZSB1cGRhdGVkIGZsYWdzLCBzbyB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgYWxsb2NhdGlvbnMuXG4tICovXG4tc3RhdGljIHZvaWQgd2FpdF9mb3JfYWxsb2NhdGlvbihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4rc3RhdGljIGludCBzd2FwX2RldmljZV9kaXNhYmxlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcbiB7XG4gXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcbiBcdHVuc2lnbmVkIGxvbmcgZW5kID0gQUxJR04oc2ktXHUwMDNlbWF4LCBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2k7XG4gXG4tXHRCVUdfT04oc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKTtcbitcdC8qXG4rXHQgKiBJZiBTV1BfV1JJVEVPSyBpcyBub3Qgc2V0OiBhbm90aGVyIHByb2Nlc3MgYWxyZWFkeSBkaXNhYmxpbmcgaXQuXG4rXHQgKiBJZiBTV1BfSElCRVJOQVRJT04gaXMgc2V0OiB0aGUgZGV2aWNlIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24uXG4rXHQgKi9cbitcdHBlcmNwdV9kb3duX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1dSSVRFT0spIHx8XG4rXHQgICAgc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9ISUJFUk5BVElPTikge1xuK1x0XHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcdH1cbitcbitcdGlmIChzZWN1cml0eV92bV9lbm91Z2hfbWVtb3J5X21tKGN1cnJlbnQtXHUwMDNlbW0sIHNpLVx1MDAzZXBhZ2VzKSkge1xuK1x0XHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXHR9XG4rXHR2bV91bmFjY3RfbWVtb3J5KHNpLVx1MDAzZXBhZ2VzKTtcbitcbitcdHNwaW5fbG9jayhcdTAwMjZzd2FwX3F1ZXVlX3VwZGF0ZV9sb2NrKTtcbitcdHNpLVx1MDAzZWZsYWdzIFx1MDAyNj0gflNXUF9XUklURU9LO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9xdWV1ZV91cGRhdGVfbG9jayk7XG4rXHR0b3RhbF9zd2FwX3BhZ2VzIC09IHNpLVx1MDAzZXBhZ2VzO1xuK1x0YXRvbWljX2xvbmdfc3ViKHNpLVx1MDAzZXBhZ2VzLCBcdTAwMjZucl9zd2FwX3BhZ2VzKTtcbitcdGRlbF9mcm9tX2F2YWlsX2xpc3Qoc2ksIHRydWUpO1xuK1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXG4rXHQvKlxuK1x0ICogU3dhcCBhbGxvY2F0b3IgZG9lc24ndCB0b3VjaCBzaSBsb2NrLCBzbyBsb29waW5nIHRocm91Z2ggYWxsXG4rXHQgKiBjaSBsb2NrcyBlbnN1cmVzIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMgc2VlcyB0aGVcbitcdCAqIHVwZGF0ZWQgZmxhZ3MsIGFuZCBubyBtb3JlIGFsbG9jYXRpb25zIHdpbGwgb2NjdXIuXG4rXHQgKi9cbiBcdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IFx1MDAzYyBlbmQ7IG9mZnNldCArPSBTV0FQRklMRV9DTFVTVEVSKSB7XG4gXHRcdGNpID0gc3dhcF9jbHVzdGVyX2xvY2soc2ksIG9mZnNldCk7XG4gXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuIFx0fVxuK1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXG5AQCAtMzA0MywyOCArMzI3NSw2IEBAIHN0YXRpYyB2b2lkIGZyZWVfc3dhcF9jbHVzdGVyX2luZm8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXG4gXHRrdmZyZWUoY2x1c3Rlcl9pbmZvKTtcbiB9XG4gXG4tLypcbi0gKiBDYWxsZWQgYWZ0ZXIgc3dhcCBkZXZpY2UncyByZWZlcmVuY2UgY291bnQgaXMgZGVhZCwgc29cbi0gKiBuZWl0aGVyIHNjYW4gbm9yIGFsbG9jYXRpb24gd2lsbCB1c2UgaXQuXG4tICovXG4tc3RhdGljIHZvaWQgZmx1c2hfcGVyY3B1X3N3YXBfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXG4te1xuLVx0aW50IGNwdSwgaTtcbi1cdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICoqcGNwX3NpO1xuLVxuLVx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuLVx0XHRwY3Bfc2kgPSBwZXJfY3B1X3B0cihwZXJjcHVfc3dhcF9jbHVzdGVyLnNpLCBjcHUpO1xuLVx0XHQvKlxuLVx0XHQgKiBJbnZhbGlkYXRlIHRoZSBwZXJjcHUgc3dhcCBjbHVzdGVyIGNhY2hlLCBzaS1cdTAwM2V1c2Vyc1xuLVx0XHQgKiBpcyBkZWFkLCBzbyBubyBuZXcgdXNlciB3aWxsIHBvaW50IHRvIGl0LCBqdXN0IGZsdXNoXG4tXHRcdCAqIGFueSBleGlzdGluZyB1c2VyLlxuLVx0XHQgKi9cbi1cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU1dBUF9OUl9PUkRFUlM7IGkrKylcbi1cdFx0XHRjbXB4Y2hnKFx1MDAyNnBjcF9zaVtpXSwgc2ksIE5VTEwpO1xuLVx0fVxuLX1cbi1cbi1cbiBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4ge1xuIFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnAgPSBOVUxMO1xuQEAgLTMwODYsNDQgKzMyOTYsMjIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFx0XHRyZXR1cm4gUFRSX0VSUih2aWN0aW0pO1xuIFxuIFx0bWFwcGluZyA9IHZpY3RpbS1cdTAwM2VmX21hcHBpbmc7XG4tXHRzcGluX2xvY2soXHUwMDI2c3dhcF9sb2NrKTtcbi1cdHBsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIFx1MDAyNnN3YXBfYWN0aXZlX2hlYWQsIGxpc3QpIHtcbi1cdFx0aWYgKHAtXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSB7XG4tXHRcdFx0aWYgKHAtXHUwMDNlc3dhcF9maWxlLVx1MDAzZWZfbWFwcGluZyA9PSBtYXBwaW5nKSB7XG4tXHRcdFx0XHRmb3VuZCA9IDE7XG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHR9XG4rXHRwZXJjcHVfZG93bl9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4rXHRmb3JfZWFjaF9hdmFpbF9zd2FwKHApIHtcbitcdFx0aWYgKHAtXHUwMDNlc3dhcF9maWxlLVx1MDAzZWZfbWFwcGluZyA9PSBtYXBwaW5nKSB7XG4rXHRcdFx0Zm91bmQgPSAxO1xuK1x0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXHR9XG4tXHRpZiAoIWZvdW5kKSB7XG4tXHRcdGVyciA9IC1FSU5WQUw7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4tXHRcdGdvdG8gb3V0X2RwdXQ7XG4tXHR9XG4tXG4tXHQvKiBSZWZ1c2Ugc3dhcG9mZiB3aGlsZSB0aGUgZGV2aWNlIGlzIHBpbm5lZCBmb3IgaGliZXJuYXRpb24gKi9cbi1cdGlmIChwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfSElCRVJOQVRJT04pIHtcbi1cdFx0ZXJyID0gLUVCVVNZO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuLVx0fVxuK1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdGZpbHBfY2xvc2UodmljdGltLCBOVUxMKTtcbiBcbi1cdGlmICghc2VjdXJpdHlfdm1fZW5vdWdoX21lbW9yeV9tbShjdXJyZW50LVx1MDAzZW1tLCBwLVx1MDAzZXBhZ2VzKSlcbi1cdFx0dm1fdW5hY2N0X21lbW9yeShwLVx1MDAzZXBhZ2VzKTtcbi1cdGVsc2Uge1xuLVx0XHRlcnIgPSAtRU5PTUVNO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuLVx0fVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnAtXHUwMDNlbG9jayk7XG4tXHRkZWxfZnJvbV9hdmFpbF9saXN0KHAsIHRydWUpO1xuLVx0cGxpc3RfZGVsKFx1MDAyNnAtXHUwMDNlbGlzdCwgXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCk7XG4tXHRhdG9taWNfbG9uZ19zdWIocC1cdTAwM2VwYWdlcywgXHUwMDI2bnJfc3dhcF9wYWdlcyk7XG4tXHR0b3RhbF9zd2FwX3BhZ2VzIC09IHAtXHUwMDNlcGFnZXM7XG4tXHRzcGluX3VubG9jayhcdTAwMjZwLVx1MDAzZWxvY2spO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdGlmICghZm91bmQpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0d2FpdF9mb3JfYWxsb2NhdGlvbihwKTtcbitcdGVyciA9IHN3YXBfZGV2aWNlX2Rpc2FibGUocCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuIFxuIFx0c2V0X2N1cnJlbnRfb29tX29yaWdpbigpO1xuIFx0ZXJyID0gdHJ5X3RvX3VudXNlKHAtXHUwMDNldHlwZSk7XG5AQCAtMzEzMSwxMCArMzMxOSwxMyBAQCBTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpXG4gXG4gXHRpZiAoZXJyKSB7XG4gXHRcdC8qIHJlLWluc2VydCBzd2FwIHNwYWNlIGJhY2sgaW50byBzd2FwX2xpc3QgKi9cbi1cdFx0cmVpbnNlcnRfc3dhcF9pbmZvKHApO1xuLVx0XHRnb3RvIG91dF9kcHV0O1xuK1x0XHRzd2FwX2RldmljZV9lbmFibGUocCk7XG4rXHRcdHJldHVybiBlcnI7XG4gXHR9XG4gXG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0c3dhcF9xdWV1ZV9kZWwocCk7XG4rXG4gXHQvKlxuIFx0ICogV2FpdCBmb3Igc3dhcCBvcGVyYXRpb25zIHByb3RlY3RlZCBieSBnZXQvcHV0X3N3YXBfZGV2aWNlKClcbiBcdCAqIHRvIGNvbXBsZXRlLiAgQmVjYXVzZSBvZiBzeW5jaHJvbml6ZV9yY3UoKSBoZXJlLCBhbGwgc3dhcFxuQEAgLTMxNDksMTUgKzMzNDAsMTIgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFxuIFx0Zmx1c2hfd29yayhcdTAwMjZwLVx1MDAzZWRpc2NhcmRfd29yayk7XG4gXHRmbHVzaF93b3JrKFx1MDAyNnAtXHUwMDNlcmVjbGFpbV93b3JrKTtcbi1cdGZsdXNoX3BlcmNwdV9zd2FwX2NsdXN0ZXIocCk7XG4gXG4gXHRkZXN0cm95X3N3YXBfZXh0ZW50cyhwLCBwLVx1MDAzZXN3YXBfZmlsZSk7XG4gXG4gXHRpZiAoIShwLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfU09MSURTVEFURSkpXG4gXHRcdGF0b21pY19kZWMoXHUwMDI2bnJfcm90YXRlX3N3YXApO1xuIFxuLVx0bXV0ZXhfbG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4gXHRzcGluX2xvY2soXHUwMDI2cC1cdTAwM2Vsb2NrKTtcbiBcdGRyYWluX21tbGlzdCgpO1xuIFxuQEAgLTMxNjgsMTAgKzMzNTYsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFx0cC1cdTAwM2VtYXggPSAwO1xuIFx0cC1cdTAwM2VjbHVzdGVyX2luZm8gPSBOVUxMO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2cC1cdTAwM2Vsb2NrKTtcbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcdGFyY2hfc3dhcF9pbnZhbGlkYXRlX2FyZWEocC1cdTAwM2V0eXBlKTtcbiBcdHpzd2FwX3N3YXBvZmYocC1cdTAwM2V0eXBlKTtcbi1cdG11dGV4X3VubG9jayhcdTAwMjZzd2Fwb25fbXV0ZXgpO1xuK1x0ZnJlZV9wZXJjcHUocC1cdTAwM2VwZXJjcHVfY2x1c3Rlcik7XG4rXHRwLVx1MDAzZXBlcmNwdV9jbHVzdGVyID0gTlVMTDtcbiBcdGtmcmVlKHAtXHUwMDNlZ2xvYmFsX2NsdXN0ZXIpO1xuIFx0cC1cdTAwM2VnbG9iYWxfY2x1c3RlciA9IE5VTEw7XG4gXHRmcmVlX3N3YXBfY2x1c3Rlcl9pbmZvKGNsdXN0ZXJfaW5mbywgbWF4cGFnZXMpO1xuQEAgLTMxODcsMTggKzMzNzYsMTkgQEAgU1lTQ0FMTF9ERUZJTkUxKHN3YXBvZmYsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlKVxuIFx0ICogQ2xlYXIgdGhlIFNXUF9VU0VEIGZsYWcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgZnJlZWQgc28gdGhhdCBzd2Fwb25cbiBcdCAqIGNhbiByZXVzZSB0aGlzIHN3YXBfaW5mbyBpbiBhbGxvY19zd2FwX2luZm8oKSBzYWZlbHkuICBJdCBpcyBvayB0b1xuIFx0ICogbm90IGhvbGQgcC1cdTAwM2Vsb2NrIGFmdGVyIHdlIGNsZWFyZWQgaXRzIFNXUF9XUklURU9LLlxuK1x0ICpcbitcdCAqIFRoZSB3cml0ZSBsb2NrIGVuc3VyZXMgdGhlIGZsYWcgY2xlYXIgaXMgdmlzaWJsZSB0byBsb2NrbGVzc1xuK1x0ICogcmVhZGVycyBvZiBzd2FwX3R5cGVfdG9faW5mbygpIGJlZm9yZSBhbGxvY19zd2FwX2luZm8oKSByZXVzZXNcbitcdCAqIHRoaXMgc2xvdC5cbiBcdCAqL1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0cC1cdTAwM2VmbGFncyA9IDA7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXG4tXHRlcnIgPSAwO1xuIFx0YXRvbWljX2luYyhcdTAwMjZwcm9jX3BvbGxfZXZlbnQpO1xuIFx0d2FrZV91cF9pbnRlcnJ1cHRpYmxlKFx1MDAyNnByb2NfcG9sbF93YWl0KTtcbiBcbi1vdXRfZHB1dDpcbi1cdGZpbHBfY2xvc2UodmljdGltLCBOVUxMKTtcbi1cdHJldHVybiBlcnI7XG4rXHRyZXR1cm4gMDtcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19QUk9DX0ZTXG5AQCAtMzIxNiwyMCArMzQwNiwxOCBAQCBzdGF0aWMgX19wb2xsX3Qgc3dhcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdClcbiBcdHJldHVybiBFUE9MTElOIHwgRVBPTExSRE5PUk07XG4gfVxuIFxuLS8qIGl0ZXJhdG9yICovXG4gc3RhdGljIHZvaWQgKnN3YXBfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzd2FwLCBsb2ZmX3QgKnBvcylcbiB7XG4gXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2k7XG4tXHRpbnQgdHlwZTtcbiBcdGxvZmZfdCBsID0gKnBvcztcbiBcbi1cdG11dGV4X2xvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbitcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiBcbiBcdGlmICghbClcbiBcdFx0cmV0dXJuIFNFUV9TVEFSVF9UT0tFTjtcbiBcbi1cdGZvciAodHlwZSA9IDA7IChzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpKTsgdHlwZSsrKSB7XG4tXHRcdGlmICghKHNpLVx1MDAzZXN3YXBfZmlsZSkpXG4rXHRmb3JfZWFjaF9zd2FwKHNpKSB7XG4rXHRcdGlmICghc2ktXHUwMDNlc3dhcF9maWxlKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRpZiAoIS0tbClcbiBcdFx0XHRyZXR1cm4gc2k7XG5AQCAtMzI1MCw3ICszNDM4LDcgQEAgc3RhdGljIHZvaWQgKnN3YXBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuIFxuIFx0KysoKnBvcyk7XG4gXHRmb3IgKDsgKHNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSkpOyB0eXBlKyspIHtcbi1cdFx0aWYgKCEoc2ktXHUwMDNlc3dhcF9maWxlKSlcbitcdFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9VU0VEKSB8fCAhKHNpLVx1MDAzZXN3YXBfZmlsZSkpXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdHJldHVybiBzaTtcbiBcdH1cbkBAIC0zMjYwLDcgKzM0NDgsNyBAQCBzdGF0aWMgdm9pZCAqc3dhcF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXG4gXG4gc3RhdGljIHZvaWQgc3dhcF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdilcbiB7XG4tXHRtdXRleF91bmxvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbitcdHBlcmNwdV91cF9yZWFkKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgc3dhcF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdilcbkBAIC0zMzUzLDEzICszNTQxLDEzIEBAIHN0YXRpYyBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqYWxsb2Nfc3dhcF9pbmZvKHZvaWQpXG4gXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuIFx0fVxuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlKyspIHtcbiBcdFx0aWYgKCEoc3dhcF9pbmZvW3R5cGVdLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfVVNFRCkpXG4gXHRcdFx0YnJlYWs7XG4gXHR9XG4gXHRpZiAodHlwZSBcdTAwM2U9IE1BWF9TV0FQRklMRVMpIHtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdFx0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNnN3YXBvbl9yd3NlbSk7XG4gXHRcdHBlcmNwdV9yZWZfZXhpdChcdTAwMjZwLVx1MDAzZXVzZXJzKTtcbiBcdFx0a3ZmcmVlKHApO1xuIFx0XHRyZXR1cm4gRVJSX1BUUigtRVBFUk0pO1xuQEAgLTMzODEsMTAgKzM1NjksOCBAQCBzdGF0aWMgc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKmFsbG9jX3N3YXBfaW5mbyh2b2lkKVxuIFx0XHQgKi9cbiBcdH1cbiBcdHAtXHUwMDNlc3dhcF9leHRlbnRfcm9vdCA9IFJCX1JPT1Q7XG4tXHRwbGlzdF9ub2RlX2luaXQoXHUwMDI2cC1cdTAwM2VsaXN0LCAwKTtcbi1cdHBsaXN0X25vZGVfaW5pdChcdTAwMjZwLVx1MDAzZWF2YWlsX2xpc3QsIDApO1xuIFx0cC1cdTAwM2VmbGFncyA9IFNXUF9VU0VEO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0aWYgKGRlZmVyKSB7XG4gXHRcdHBlcmNwdV9yZWZfZXhpdChcdTAwMjZkZWZlci1cdTAwM2V1c2Vycyk7XG4gXHRcdGt2ZnJlZShkZWZlcik7XG5AQCAtMzQ1Myw5ICszNjM5LDggQEAgX193ZWFrIHVuc2lnbmVkIGxvbmcgYXJjaF9tYXhfc3dhcGZpbGVfc2l6ZSh2b2lkKVxuIFx0cmV0dXJuIGdlbmVyaWNfbWF4X3N3YXBmaWxlX3NpemUoKTtcbiB9XG4gXG4tc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9zd2FwX2hlYWRlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4tXHRcdFx0XHRcdHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbi1cdFx0XHRcdFx0c3RydWN0IGlub2RlICppbm9kZSlcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcbitcdFx0XHRcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4ge1xuIFx0aW50IGk7XG4gXHR1bnNpZ25lZCBsb25nIG1heHBhZ2VzO1xuQEAgLTM1MjIsNyArMzcwNyw3IEBAIHN0YXRpYyBpbnQgc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcbiB7XG4gXHR1bnNpZ25lZCBsb25nIG5yX2NsdXN0ZXJzID0gRElWX1JPVU5EX1VQKG1heHBhZ2VzLCBTV0FQRklMRV9DTFVTVEVSKTtcbiBcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2x1c3Rlcl9pbmZvO1xuLVx0aW50IGVyciA9IC1FTk9NRU07XG4rXHRpbnQgY3B1LCBlcnIgPSAtRU5PTUVNO1xuIFx0dW5zaWduZWQgbG9uZyBpO1xuIFxuIFx0Y2x1c3Rlcl9pbmZvID0ga3Z6YWxsb2Nfb2JqcygqY2x1c3Rlcl9pbmZvLCBucl9jbHVzdGVycyk7XG5AQCAtMzUzMiwxMyArMzcxNywyNiBAQCBzdGF0aWMgaW50IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9jbHVzdGVyczsgaSsrKVxuIFx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZjbHVzdGVyX2luZm9baV0ubG9jayk7XG4gXG4tXHRpZiAoIShzaS1cdTAwM2VmbGFncyBcdTAwMjYgU1dQX1NPTElEU1RBVEUpKSB7XG4rXHRpZiAoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9TT0xJRFNUQVRFKSB7XG4rXHRcdHNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBwZXJjcHVfY2x1c3Rlcik7XG4rXHRcdGlmICghc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXIpXG4rXHRcdFx0Z290byBlcnI7XG4rXG4rXHRcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbitcdFx0XHRzdHJ1Y3QgcGVyY3B1X2NsdXN0ZXIgKmNsdXN0ZXI7XG4rXG4rXHRcdFx0Y2x1c3RlciA9IHBlcl9jcHVfcHRyKHNpLVx1MDAzZXBlcmNwdV9jbHVzdGVyLCBjcHUpO1xuK1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFNXQVBfTlJfT1JERVJTOyBpKyspXG4rXHRcdFx0XHRjbHVzdGVyLVx1MDAzZW5leHRbaV0gPSBTV0FQX0VOVFJZX0lOVkFMSUQ7XG4rXHRcdFx0bG9jYWxfbG9ja19pbml0KFx1MDAyNmNsdXN0ZXItXHUwMDNlbG9jayk7XG4rXHRcdH1cbitcdH0gZWxzZSB7XG4gXHRcdHNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyID0ga21hbGxvY19vYmooKnNpLVx1MDAzZWdsb2JhbF9jbHVzdGVyKTtcbiBcdFx0aWYgKCFzaS1cdTAwM2VnbG9iYWxfY2x1c3RlcilcbiBcdFx0XHRnb3RvIGVycjtcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU1dBUF9OUl9PUkRFUlM7IGkrKylcbiBcdFx0XHRzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlci1cdTAwM2VuZXh0W2ldID0gU1dBUF9FTlRSWV9JTlZBTElEO1xuLVx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZzaS1cdTAwM2VnbG9iYWxfY2x1c3Rlcl9sb2NrKTtcbitcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXItXHUwMDNlbG9jayk7XG4gXHR9XG4gXG4gXHQvKlxuQEAgLTM2MjEsNyArMzgxOSw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHQvKlxuIFx0ICogQWxsb2NhdGUgb3IgcmV1c2UgZXhpc3RpbmcgIVNXUF9VU0VEIHN3YXBfaW5mby4gVGhlIHJldHVybmVkXG4gXHQgKiBzaSB3aWxsIHN0YXkgaW4gYSBkeWluZyBzdGF0dXMsIHNvIG5vdGhpbmcgd2lsbCBhY2Nlc3MgaXRzIGNvbnRlbnRcbi1cdCAqIHVudGlsIGVuYWJsZV9zd2FwX2luZm8gcmVzdXJyZWN0cyBpdHMgcGVyY3B1IHJlZiBhbmQgZXhwb3NlIGl0LlxuK1x0ICogdW50aWwgc3dhcF9kZXZpY2VfZW5hYmxlIHJlc3VycmVjdHMgaXRzIHBlcmNwdSByZWYgYW5kIGV4cG9zZSBpdC5cbiBcdCAqL1xuIFx0c2kgPSBhbGxvY19zd2FwX2luZm8oKTtcbiBcdGlmIChJU19FUlIoc2kpKVxuQEAgLTM2NzksNyArMzg3Nyw3IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHR9XG4gXHRzd2FwX2hlYWRlciA9IGttYXBfbG9jYWxfZm9saW8oZm9saW8sIDApO1xuIFxuLVx0bWF4cGFnZXMgPSByZWFkX3N3YXBfaGVhZGVyKHNpLCBzd2FwX2hlYWRlciwgaW5vZGUpO1xuK1x0bWF4cGFnZXMgPSByZWFkX3N3YXBfaGVhZGVyKHN3YXBfaGVhZGVyLCBpbm9kZSk7XG4gXHRpZiAodW5saWtlbHkoIW1heHBhZ2VzKSkge1xuIFx0XHRlcnJvciA9IC1FSU5WQUw7XG4gXHRcdGdvdG8gYmFkX3N3YXBfdW5sb2NrX2lub2RlO1xuQEAgLTM3MDAsMTEgKzM4OTgsNiBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFxuIFx0bWF4cGFnZXMgPSBzaS1cdTAwM2VtYXg7XG4gXG4tXHQvKiBTZXQgdXAgdGhlIHN3YXAgY2x1c3RlciBpbmZvICovXG4tXHRlcnJvciA9IHNldHVwX3N3YXBfY2x1c3RlcnNfaW5mbyhzaSwgc3dhcF9oZWFkZXIsIG1heHBhZ2VzKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0Z290byBiYWRfc3dhcF91bmxvY2tfaW5vZGU7XG4tXG4gXHRpZiAoc2ktXHUwMDNlYmRldiBcdTAwMjZcdTAwMjYgYmRldl9zdGFibGVfd3JpdGVzKHNpLVx1MDAzZWJkZXYpKVxuIFx0XHRzaS1cdTAwM2VmbGFncyB8PSBTV1BfU1RBQkxFX1dSSVRFUztcbiBcbkBAIC0zNzE4LDYgKzM5MTEsMTUgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0aW5jZWRfbnJfcm90YXRlX3N3YXAgPSB0cnVlO1xuIFx0fVxuIFxuK1x0LypcbitcdCAqIFNldCB1cCB0aGUgc3dhcCBjbHVzdGVyIGluZm8uIFRoaXMgbXVzdCBydW4gYWZ0ZXIgU1dQX1NPTElEU1RBVEVcbitcdCAqIGlzIGRldGVybWluZWQgYWJvdmUsIGFzIGl0IGRlY2lkZXMgd2hldGhlciB0byBhbGxvY2F0ZSB0aGUgcGVyLUNQVVxuK1x0ICogY2x1c3RlciAoc29saWQgc3RhdGUpIG9yIHRoZSBnbG9iYWwgY2x1c3RlciAocm90YXRpb25hbCkuXG4rXHQgKi9cbitcdGVycm9yID0gc2V0dXBfc3dhcF9jbHVzdGVyc19pbmZvKHNpLCBzd2FwX2hlYWRlciwgbWF4cGFnZXMpO1xuK1x0aWYgKGVycm9yKVxuK1x0XHRnb3RvIGJhZF9zd2FwX3VubG9ja19pbm9kZTtcbitcbiBcdGlmICgoc3dhcF9mbGFncyBcdTAwMjYgU1dBUF9GTEFHX0RJU0NBUkQpIFx1MDAyNlx1MDAyNlxuIFx0ICAgIHNpLVx1MDAzZWJkZXYgXHUwMDI2XHUwMDI2IGJkZXZfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzaS1cdTAwM2ViZGV2KSkge1xuIFx0XHQvKlxuQEAgLTM3NjQsMjIgKzM5NjYsMjIgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0Z290byBmcmVlX3N3YXBfenN3YXA7XG4gXHR9XG4gXG4tXHRtdXRleF9sb2NrKFx1MDAyNnN3YXBvbl9tdXRleCk7XG4gXHRwcmlvID0gREVGX1NXQVBfUFJJTztcbiBcdGlmIChzd2FwX2ZsYWdzIFx1MDAyNiBTV0FQX0ZMQUdfUFJFRkVSKVxuIFx0XHRwcmlvID0gc3dhcF9mbGFncyBcdTAwMjYgU1dBUF9GTEFHX1BSSU9fTUFTSztcbiBcbi1cdC8qXG4tXHQgKiBUaGUgcGxpc3QgcHJpbyBpcyBuZWdhdGVkIGJlY2F1c2UgcGxpc3Qgb3JkZXJpbmcgaXNcbi1cdCAqIGxvdy10by1oaWdoLCB3aGlsZSBzd2FwIG9yZGVyaW5nIGlzIGhpZ2gtdG8tbG93XG4tXHQgKi9cbiBcdHNpLVx1MDAzZXByaW8gPSBwcmlvO1xuLVx0c2ktXHUwMDNlbGlzdC5wcmlvID0gLXNpLVx1MDAzZXByaW87XG4tXHRzaS1cdTAwM2VhdmFpbF9saXN0LnByaW8gPSAtc2ktXHUwMDNlcHJpbztcbiBcdHNpLVx1MDAzZXN3YXBfZmlsZSA9IHN3YXBfZmlsZTtcbiBcbiBcdC8qIFNldHMgU1dQX1dSSVRFT0ssIHJlc3VycmVjdCB0aGUgcGVyY3B1IHJlZiwgZXhwb3NlIHRoZSBzd2FwIGRldmljZSAqL1xuLVx0ZW5hYmxlX3N3YXBfaW5mbyhzaSk7XG4rXHRwZXJjcHVfcmVmX3Jlc3VycmVjdChcdTAwMjZzaS1cdTAwM2V1c2Vycyk7XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0ZXJyb3IgPSBzd2FwX3F1ZXVlX2FkZChzaSk7XG4rXHRwZXJjcHVfdXBfd3JpdGUoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdGlmIChlcnJvcilcbitcdFx0Z290byBmcmVlX3N3YXBfenN3YXA7XG4rXG4rXHRzd2FwX2RldmljZV9lbmFibGUoc2kpO1xuIFxuIFx0cHJfaW5mbyhcIkFkZGluZyAldWsgc3dhcCBvbiAlcy4gIFByaW9yaXR5OiVkIGV4dGVudHM6JWQgYWNyb3NzOiVsbHVrICVzJXMlcyVzXFxuXCIsXG4gXHRcdEsoc2ktXHUwMDNlcGFnZXMpLCBuYW1lLVx1MDAzZW5hbWUsIHNpLVx1MDAzZXByaW8sIG5yX2V4dGVudHMsXG5AQCAtMzc4OSw3ICszOTkxLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBcdFx0KHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfQVJFQV9ESVNDQVJEKSA/IFwic1wiIDogXCJcIixcbiBcdFx0KHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfUEFHRV9ESVNDQVJEKSA/IFwiY1wiIDogXCJcIik7XG4gXG4tXHRtdXRleF91bmxvY2soXHUwMDI2c3dhcG9uX211dGV4KTtcbiBcdGF0b21pY19pbmMoXHUwMDI2cHJvY19wb2xsX2V2ZW50KTtcbiBcdHdha2VfdXBfaW50ZXJydXB0aWJsZShcdTAwMjZwcm9jX3BvbGxfd2FpdCk7XG4gXG5AQCAtMzgwMCw2ICs0MDAxLDggQEAgU1lTQ0FMTF9ERUZJTkUyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncylcbiBiYWRfc3dhcF91bmxvY2tfaW5vZGU6XG4gXHRpbm9kZV91bmxvY2soaW5vZGUpO1xuIGJhZF9zd2FwOlxuK1x0ZnJlZV9wZXJjcHUoc2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXIpO1xuK1x0c2ktXHUwMDNlcGVyY3B1X2NsdXN0ZXIgPSBOVUxMO1xuIFx0a2ZyZWUoc2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXIpO1xuIFx0c2ktXHUwMDNlZ2xvYmFsX2NsdXN0ZXIgPSBOVUxMO1xuIFx0aW5vZGUgPSBOVUxMO1xuQEAgLTM4MTAsOSArNDAxMyw5IEBAIFNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXG4gXHQgKiBDbGVhciB0aGUgU1dQX1VTRUQgZmxhZyBhZnRlciBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCBzb1xuIFx0ICogYWxsb2Nfc3dhcF9pbmZvIGNhbiByZXVzZSB0aGlzIHNpIHNhZmVseS5cbiBcdCAqL1xuLVx0c3Bpbl9sb2NrKFx1MDAyNnN3YXBfbG9jayk7XG4rXHRwZXJjcHVfZG93bl93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0c2ktXHUwMDNlZmxhZ3MgPSAwO1xuLVx0c3Bpbl91bmxvY2soXHUwMDI2c3dhcF9sb2NrKTtcbitcdHBlcmNwdV91cF93cml0ZShcdTAwMjZzd2Fwb25fcndzZW0pO1xuIFx0aWYgKGluY2VkX25yX3JvdGF0ZV9zd2FwKVxuIFx0XHRhdG9taWNfZGVjKFx1MDAyNm5yX3JvdGF0ZV9zd2FwKTtcbiBcdGlmIChzd2FwX2ZpbGUpXG5AQCAtMzgyNywxOSArNDAzMCwxNyBAQCBTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKVxuIFxuIHZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbClcbiB7XG4tXHR1bnNpZ25lZCBpbnQgdHlwZTtcbitcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaTtcbiBcdHVuc2lnbmVkIGxvbmcgbnJfdG9fYmVfdW51c2VkID0gMDtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2xvY2spO1xuLVx0Zm9yICh0eXBlID0gMDsgdHlwZSBcdTAwM2MgbnJfc3dhcGZpbGVzOyB0eXBlKyspIHtcbi1cdFx0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF9pbmZvW3R5cGVdO1xuLVxuLVx0XHRpZiAoKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfVVNFRCkgXHUwMDI2XHUwMDI2ICEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbitcdHBlcmNwdV9kb3duX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbitcdGZvcl9lYWNoX3N3YXAoc2kpIHtcbitcdFx0aWYgKCEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbiBcdFx0XHRucl90b19iZV91bnVzZWQgKz0gc3dhcF91c2FnZV9pbl9wYWdlcyhzaSk7XG4gXHR9XG4gXHR2YWwtXHUwMDNlZnJlZXN3YXAgPSBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNm5yX3N3YXBfcGFnZXMpICsgbnJfdG9fYmVfdW51c2VkO1xuIFx0dmFsLVx1MDAzZXRvdGFsc3dhcCA9IHRvdGFsX3N3YXBfcGFnZXMgKyBucl90b19iZV91bnVzZWQ7XG4tXHRzcGluX3VubG9jayhcdTAwMjZzd2FwX2xvY2spO1xuK1x0cGVyY3B1X3VwX3JlYWQoXHUwMDI2c3dhcG9uX3J3c2VtKTtcbiB9XG4gXG4gLypcbkBAIC0zODc5LDcgKzQwODAsNyBAQCBpbnQgc3dhcF9kdXBfZW50cnlfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5KVxuICNpZiBkZWZpbmVkKENPTkZJR19NRU1DRykgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX0JMS19DR1JPVVApXG4gc3RhdGljIGJvb2wgX19oYXNfdXNhYmxlX3N3YXAodm9pZClcbiB7XG4tXHRyZXR1cm4gIXBsaXN0X2hlYWRfZW1wdHkoXHUwMDI2c3dhcF9hY3RpdmVfaGVhZCk7XG4rXHRyZXR1cm4gUkVBRF9PTkNFKHRvdGFsX3N3YXBfcGFnZXMpIFx1MDAzZSAwO1xuIH1cbiBcbiB2b2lkIF9fZm9saW9fdGhyb3R0bGVfc3dhcHJhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZ2ZwX3QgZ2ZwKVxuQEAgLTM5MDIsMTQgKzQxMDMsMTQgQEAgdm9pZCBfX2ZvbGlvX3Rocm90dGxlX3N3YXByYXRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGdmcF90IGdmcClcbiBcdGlmIChjdXJyZW50LVx1MDAzZXRocm90dGxlX2Rpc2spXG4gXHRcdHJldHVybjtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzd2FwX2F2YWlsX2xvY2spO1xuLVx0cGxpc3RfZm9yX2VhY2hfZW50cnkoc2ksIFx1MDAyNnN3YXBfYXZhaWxfaGVhZCwgYXZhaWxfbGlzdCkge1xuK1x0cGVyY3B1X2Rvd25fcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuK1x0Zm9yX2VhY2hfYXZhaWxfc3dhcChzaSkge1xuIFx0XHRpZiAoc2ktXHUwMDNlYmRldikge1xuIFx0XHRcdGJsa2NnX3NjaGVkdWxlX3Rocm90dGxlKHNpLVx1MDAzZWJkZXYtXHUwMDNlYmRfZGlzaywgdHJ1ZSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbiBcdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnN3YXBfYXZhaWxfbG9jayk7XG4rXHRwZXJjcHVfdXBfcmVhZChcdTAwMjZzd2Fwb25fcndzZW0pO1xuIH1cbiAjZW5kaWZcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQzOjQ2LjA5MTA2MjI1OVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg1NTQ3Mzc1NjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgU3dhcCBTdWJzeXN0ZW0gUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCB0aGlzIHBhdGNoIOKAkyBhIHByZXR0eSBzaWduaWZpY2FudCBvbmUsIGl0IGxvb2tzIGxpa2Ug4oCTIHRoYXQncyBmdW5kYW1lbnRhbGx5IGNoYW5naW5nIHRoZSBMaW51eCBrZXJuZWwncyBzd2FwIHN1YnN5c3RlbS4gSXQncyByZXBsYWNpbmcgdGhlIGN1cnJlbnQgYHBsaXN0YC1iYXNlZCBxdWV1ZSBmb3Igc3dhcCBkZXZpY2VzIHdpdGggYSBjdXN0b20gcm91bmQtcm9iaW4gaW1wbGVtZW50YXRpb24uICBJbW1lZGlhdGVseSwgSSBjYW4gdGVsbCB0aGlzIGlzIGdvaW5nIHRvIHRvdWNoIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHdoaWNoIGlzIGFsd2F5cyBhIHJlZCBmbGFnIGZvciBwb3RlbnRpYWwgaXNzdWVzLiBUaGUgZmFjdCB0aGF0IGl0J3MgcmV3cml0aW5nIHNvIG11Y2ggb2YgYG1tL3N3YXBmaWxlLmNgIOKAkyBhbmQgdGhlbiB0b3VjaGluZyBhbGwgdGhvc2Ugb3RoZXIgaGVhZGVyIGFuZCBzdXBwb3J0aW5nIGZpbGVzIOKAkyAgYGluY2x1ZGUvbGludXgvc3dhcC5oYCwgYGluY2x1ZGUvbGludXgvcGxpc3QuaGAsIGBsaWIvcGxpc3QuY2AsIGFuZCBgbW0vc3dhcC5oYCDigJMgdGVsbHMgbWUgdGhpcyBpc24ndCBqdXN0IGEgbWlub3IgdHdlYWsuICBJdCdzIGEgZ2VudWluZSBhcmNoaXRlY3R1cmFsIGNoYW5nZS4gIFJlbW92aW5nIGBwbGlzdF9yZXF1ZXVlYCBpcyBhIGNsdWUsIHRvby5cblxuVGhpcyBpbnRyb2R1Y3Rpb24gb2YgbmV3IHN0cnVjdHVyZXMgbGlrZSBgc3dhcF9xdWV1ZV9yZWFkZXJzYCwgYHN3YXBfcXVldWVgLCBgc3dhcF9xdWV1ZV9sZW5gLCBgc3dhcF9wcmlvX3JpbmdgLCBhbG9uZyB3aXRoIHRoZSB1c2Ugb2YgYHN3YXBvbl9yd3NlbWAgdG8gcmVwbGFjZSB0aGUgb2xkIGxvY2tpbmcgbWVjaGFuaXNtcywgaW5kaWNhdGVzIGEgcmUtdGhpbmtpbmcgb2YgaG93IHN3YXAgc3BhY2UgaXMgYWxsb2NhdGVkIGFuZCBtYW5hZ2VkLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UsIGEgKm1ham9yKiBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgdmVyeSBjb3JlIG9mIHN3YXAgYWxsb2NhdGlvbiBsb2dpYy5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiVGhpcyBuZWVkcyBzb21lIHNlcmlvdXMgZnV6emluZy5cIiAgR2l2ZW4gdGhlIHBvdGVudGlhbCBmb3IgbWVtb3J5IGNvcnJ1cHRpb24sIHJhY2UgY29uZGl0aW9ucywgb3IgdW5leHBlY3RlZCBiZWhhdmlvciB3aGVuIGludGVyYWN0aW5nIHdpdGggb3RoZXIga2VybmVsIHN1YnN5c3RlbXMsIEkgd2FudCB0byB6ZXJvIGluIG9uIHRoZSBrZXkgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkLiAgTGV0J3Mgc2VlOlxuXG4qICAgYHN3YXBfYWxsb2NfZW50cnlgIChhbmQgaXRzIHJlcGxhY2VtZW50cyBvZiBgc3dhcF9hbGxvY19mYXN0YCBhbmQgYHN3YXBfYWxsb2Nfc2xvd2ApIOKAkyBUaGlzIGlzIG15IHByaW1hcnkgYXJlYSBvZiBpbnRlcmVzdCwgaXQncyB3aGVyZSB0aGUgc3dhcCBlbnRyeSBhbGxvY2F0aW9uIGFjdHVhbGx5IGhhcHBlbnMuXG4qICAgYGZvbGlvX2FsbG9jX3N3YXBgIOKAkyBhbm90aGVyIGNyaXRpY2FsIGVudHJ5IHBvaW50LlxuKiAgIFRoZSBxdWV1ZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zOiBgc3dhcF9xdWV1ZV9hZGRgLCBgc3dhcF9xdWV1ZV9kZWxgLCBgc3dhcF9xdWV1ZV9nZXRfZGV2aWNlYCAtIHRoZXNlIGFyZSB0aGUgcG9pbnRzIG9mIGludGVyYWN0aW9ucyB3aXRoIHRoZSBuZXcgc3RydWN0dXJlcy5cbiogICBgc3dhcF9kZXZpY2VfZW5hYmxlYCwgYHN3YXBfZGV2aWNlX2Rpc2FibGVgIC0gdGhlIHBvaW50cyBvZiBkZXZpY2UgY2hhbmdlIGFyZSBkZWZpbml0ZWx5IHdvcnRoIGNoZWNraW5nLlxuKiAgIGBzeXNfc3dhcG9uYCwgYHN5c19zd2Fwb2ZmYCDigJMgVGhlIHVzZXItc3BhY2UgaW50ZXJmYWNlIGlzIGFsd2F5cyBhIGdvb2QgdGFyZ2V0LlxuKiAgIFRoZSBgc3dhcF9kZXZpY2VfaW51c2VfKmAgZnVuY3Rpb25zIOKAkyB0aGVzZSBhcmUgbGlrZWx5IHRoZSBwbGFjZSB3aGVyZSB0aGUgb2xkIGxvY2tpbmcgd2FzLCB0aGlzIGlzIGFsc28gY3J1Y2lhbC5cbiogICBgYWRkX3RvX2F2YWlsX2xpc3RgLCBgZGVsX2Zyb21fYXZhaWxfbGlzdGAg4oCTIHRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIGxvb2sgYXQgdGhlIG5ldyBsaXN0IG1hbmlwdWxhdGlvbi5cbiogICBUaGUgbmV3IHF1ZXVlIG1hc2sgZnVuY3Rpb25zIGBzd2FwX3F1ZXVlX21hc2tgLCBgc3dhcF9xdWV1ZV91bm1hc2tgXG4qICAgYGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeWBcblxuQWxyaWdodCwgSSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgYW55IHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYXMgd2VsbC4gU2luY2UgdGhpcyBpcyBpbiBgbW0vc3dhcGZpbGUuY2AsIGl0J3MgYWxtb3N0IGNlcnRhaW5seSBjb250cm9sbGVkIGJ5IGBDT05GSUdfU1dBUGAuIEkgc2hvdWxkIGNoZWNrIHRoZSBgbW0vTWFrZWZpbGVgIHRvIGNvbmZpcm0sIGJ1dCB0aGF0J3MgYSBnaXZlbi4gSSBhbSBlYWdlciB0byBnZXQgc3RhcnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU4NjEsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQwMDo0Mzo1NC42NDU4MDIyN1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1ODQxNjI3OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzd2FwZmlsZS5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL01ha2VmaWxlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTc2PWVuZGlmXFxubW0vTWFrZWZpbGUtNzctXFxubW0vTWFrZWZpbGU6Nzg6b2JqLSQoQ09ORklHX1NXQVApXFx0Kz0gcGFnZV9pby5vIHN3YXBfc3RhdGUubyBzd2FwZmlsZS5vXFxubW0vTWFrZWZpbGUtNzktb2JqLSQoQ09ORklHX1pTV0FQKVxcdCs9IHpzd2FwLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMDA6NDM6NTQuNzA0MjI2MDk5WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjMxMjc2NTI0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlIFN3YXAgQ29uZmlndXJhdGlvbiBEZXBlbmRlbmN5KipcblxuQWxyaWdodCwgaXQncyBjbGVhciB0aGF0IGBDT05GSUdfU1dBUGAgaXMgYSBwcmVyZXF1aXNpdGUgaGVyZS4gVGhhdCdzIHRoZSBiYXNlbGluZS4gTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29yZSBsb2dpYyB0aGlzIGNoYW5nZSBpcyB0b3VjaGluZy4gVGhlIG1vc3QgcmVsZXZhbnQgZnVuY3Rpb25zIHNlZW0gdG8gYmUgY2VudGVyZWQgYXJvdW5kIHF1ZXVpbmcsIGRldmljZSBtYW5hZ2VtZW50LCBhbmQgYWxsb2NhdGlvbi4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgYHN3YXBfcXVldWVfYWRkYCwgYHN3YXBfcXVldWVfZGVsYCwgYHN3YXBfcXVldWVfZ2V0X2RldmljZWAsIGBzd2FwX2RldmljZV9lbmFibGVgLCBgc3dhcF9kZXZpY2VfZGlzYWJsZWAsIGBzd2FwX2FsbG9jX2VudHJ5YCwgYHN3YXBfZGV2aWNlX2ludXNlX2FkZGAsIGBzd2FwX2RldmljZV9pbnVzZV9zdWJgLCBgYWRkX3RvX2F2YWlsX2xpc3RgLCBgZGVsX2Zyb21fYXZhaWxfbGlzdGAsIGBzd2FwX3F1ZXVlX21hc2tgLCBhbmQgYHN3YXBfcXVldWVfdW5tYXNrYC4gVGhlc2UgYWxsIHNlZW0gdG8gcmVzaWRlIHdpdGhpbiBgbW0vc3dhcGZpbGUuY2AsIHdoaWNoIG1ha2VzIHNlbnNlLlxuXG5JdCBsb29rcyBsaWtlIHRoZSBjaGFuZ2UgaW50ZXJhY3RzIHdpdGggYENPTkZJR19ISUJFUk5BVElPTmAgdG9vLCBhbHNvIGluIGBtbS9zd2FwZmlsZS5jYCwgYW5kIHRoYXQncyBicmluZ2luZyBpbiBmdW5jdGlvbnMgbGlrZSBgcGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZWAsIGB1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGVgLCBgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGVgLCBgZmluZF9maXJzdF9zd2FwYCwgYW5kIGBjb3VudF9zd2FwX3BhZ2VzYC4gV2hpbGUgaGliZXJuYXRpb24gaXMgaW52b2x2ZWQsIGl0IGFwcGVhcnMgdGhlIGNlbnRyYWwgZm9jdXMgaXMgcmVhbGx5IHRoZSBtZWNoYW5pY3Mgb2Ygc3dhcCBhbGxvY2F0aW9uIGl0c2VsZi4gVGhpcyByZWluZm9yY2VzIG15IGluaXRpYWwgaHVuY2ggYWJvdXQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyBpbnZvbHZlZCwgSSBuZWVkIHRvIGZvY3VzIG9uIHRoaXMgcGFydCB0byBwcm9jZWVkLiBMZXQncyBnZXQgZG93biB0byBzcGVjaWZpY3MsIEkgbmVlZCB0byBwdWxsIHVwIHRoaXMgbGlzdCBvZiBmdW5jdGlvbnMgYWdhaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3MDU5LCJPdXRwdXRUb2tlbnMiOjU2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQ0OjAxLjAxNjk5NDIzMVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTIyOTM4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKHN0YXRpYyApPyhpbnR8dm9pZHxib29sfHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IFxcXFwqKSBbYS16QS1aMC05X10rXFxcXChcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vc3dhcGZpbGUuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwZmlsZS5jLTUwLVxcbm1tL3N3YXBmaWxlLmM6NTE6c3RhdGljIHZvaWQgc3dhcF9kZXZpY2VfaW51c2VfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTUyLVxcdFxcdFxcdFxcdCAgdW5zaWduZWQgaW50IG5yX2VudHJpZXMpO1xcbm1tL3N3YXBmaWxlLmM6NTM6c3RhdGljIGJvb2wgZm9saW9fc3dhcGNhY2hlX2ZyZWVhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbm1tL3N3YXBmaWxlLmM6NTQ6c3RhdGljIHZvaWQgbW92ZV9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTU1LVxcdFxcdFxcdCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbm1tL3N3YXBmaWxlLmMtNTYtXFx0XFx0XFx0IGVudW0gc3dhcF9jbHVzdGVyX2ZsYWdzIG5ld19mbGFncyk7XFxubW0vc3dhcGZpbGUuYzo1NzpzdGF0aWMgYm9vbCBnZXRfc3dhcF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpO1xcbm1tL3N3YXBmaWxlLmMtNTgtXFxuLS1cXG5tbS9zd2FwZmlsZS5jPTIwOD1zdGF0aWMgc3RydWN0IHN3YXBfcXVldWVfcmVhZGVyIF9fcGVyY3B1ICpzd2FwX3F1ZXVlX3ByZWFsbG9jX3JlYWRlcnMoaW50IG5yX3JpbmdzLCBnZnBfdCBnZnApXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTIxOS1cXG5tbS9zd2FwZmlsZS5jOjIyMDpzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2luc3RhbGxfcmVhZGVycyhzdHJ1Y3Qgc3dhcF9xdWV1ZV9yZWFkZXIgX19wZXJjcHUgKnJlYWRlcnMpXFxubW0vc3dhcGZpbGUuYy0yMjEte1xcbi0tXFxubW0vc3dhcGZpbGUuYz0yNDI9c3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzd2FwX3F1ZXVlX2dldF9kZXZpY2UobG9uZyBucl9hbGxvYywgaW50IG5yX2l0ZXIpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI4NS1cXG5tbS9zd2FwZmlsZS5jOjI4NjpzdGF0aWMgYm9vbCBzd2FwX3F1ZXVlX2ZpbmQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMjg3LVxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgKnJpbmdfaWR4LCB1bnNpZ25lZCBpbnQgKmRldl9pZHgpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMwOS1cXG5tbS9zd2FwZmlsZS5jOjMxMDpzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX21hc2soc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbm1tL3N3YXBmaWxlLmMtMzExLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzE5LVxcbm1tL3N3YXBmaWxlLmM6MzIwOnN0YXRpYyB2b2lkIHN3YXBfcXVldWVfdW5tYXNrKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTMyMS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMyOS1cXG5tbS9zd2FwZmlsZS5jOjMzMDpzdGF0aWMgaW50IHN3YXBfcXVldWVfYWRkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTMzMS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwNS1cXG5tbS9zd2FwZmlsZS5jOjQwNjpzdGF0aWMgdm9pZCBzd2FwX3F1ZXVlX2RlbChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxubW0vc3dhcGZpbGUuYy00MDcte1xcbi0tXFxubW0vc3dhcGZpbGUuYz00ODk9c3RhdGljIGxvbmcgc3dhcF91c2FnZV9pbl9wYWdlcyhzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQ5Ny0gKi9cXG5tbS9zd2FwZmlsZS5jOjQ5ODpzdGF0aWMgdm9pZCBzd2FwX2FsbG9jX2xvY2tfZGV2aWNlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTQ5OS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTUwNS1cXG5tbS9zd2FwZmlsZS5jOjUwNjpzdGF0aWMgdm9pZCBzd2FwX2FsbG9jX3VubG9ja19kZXZpY2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbm1tL3N3YXBmaWxlLmMtNTA3LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtNTIzLVxcbm1tL3N3YXBmaWxlLmM6NTI0OnN0YXRpYyBib29sIHN3YXBfb25seV9oYXNfY2FjaGUoc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwZmlsZS5jLTUyNS1cXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IG5yX3BhZ2VzKVxcbi0tXFxubW0vc3dhcGZpbGUuYy01NDUtICovXFxubW0vc3dhcGZpbGUuYzo1NDY6c3RhdGljIGludCBfX3RyeV90b19yZWNsYWltX3N3YXAoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtNTQ3LVxcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBmbGFncylcXG4tLVxcbm1tL3N3YXBmaWxlLmM9NjE2PXN0YXRpYyBpbmxpbmUgc3RydWN0IHN3YXBfZXh0ZW50ICpuZXh0X3NlKHN0cnVjdCBzd2FwX2V4dGVudCAqc2UpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTYyNS0gKi9cXG5tbS9zd2FwZmlsZS5jOjYyNjpzdGF0aWMgaW50IGRpc2NhcmRfc3dhcChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxubW0vc3dhcGZpbGUuYy02Mjcte1xcbi0tXFxubW0vc3dhcGZpbGUuYz02Nzk9c2VjdG9yX3Qgc3dhcF9mb2xpb19zZWN0b3Ioc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBmaWxlLmMtNjk1LSAqL1xcbm1tL3N3YXBmaWxlLmM6Njk2OnN0YXRpYyB2b2lkIGRpc2NhcmRfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTY5Ny1cXHRcXHRcXHRcXHQgcGdvZmZfdCBzdGFydF9wYWdlLCBwZ29mZl90IG5yX3BhZ2VzKVxcbi0tXFxubW0vc3dhcGZpbGUuYz03NTU9c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2x1c3Rlcl9vZmZzZXQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbi0tXFxubW0vc3dhcGZpbGUuYy03NjAtXFxubW0vc3dhcGZpbGUuYzo3NjE6c3RhdGljIHZvaWQgc3dhcF9jbHVzdGVyX2ZyZWVfdGFibGVfZm9saW9fcmN1X2NiKHN0cnVjdCByY3VfaGVhZCAqaGVhZClcXG5tbS9zd2FwZmlsZS5jLTc2Mi17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTc2OC1cXG5tbS9zd2FwZmlsZS5jOjc2OTpzdGF0aWMgdm9pZCBzd2FwX2NsdXN0ZXJfZnJlZV90YWJsZShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxcbm1tL3N3YXBmaWxlLmMtNzcwLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtNzk2LVxcbm1tL3N3YXBmaWxlLmM6Nzk3OnN0YXRpYyBpbnQgc3dhcF9jbHVzdGVyX2FsbG9jX3RhYmxlKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIGdmcF90IGdmcClcXG5tbS9zd2FwZmlsZS5jLTc5OC17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTg0NS0gKi9cXG5tbS9zd2FwZmlsZS5jOjg0NjpzdGF0aWMgdm9pZCBzd2FwX2NsdXN0ZXJfYXNzZXJ0X2VtcHR5KHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxubW0vc3dhcGZpbGUuYy04NDctXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgaW50IGNpX29mZiwgdW5zaWduZWQgaW50IG5yLFxcbi0tXFxubW0vc3dhcGZpbGUuYz04NzU9c3dhcF9jbHVzdGVyX3BvcHVsYXRlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmMtOTIzLVxcbm1tL3N3YXBmaWxlLmM6OTI0OnN0YXRpYyB2b2lkIG1vdmVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxubW0vc3dhcGZpbGUuYy05MjUtXFx0XFx0XFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTk0Mi0vKiBBZGQgYSBjbHVzdGVyIHRvIGRpc2NhcmQgbGlzdCBhbmQgc2NoZWR1bGUgaXQgdG8gZG8gZGlzY2FyZCAqL1xcbm1tL3N3YXBmaWxlLmM6OTQzOnN0YXRpYyB2b2lkIHN3YXBfY2x1c3Rlcl9zY2hlZHVsZV9kaXNjYXJkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTk0NC1cXHRcXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxcbi0tXFxubW0vc3dhcGZpbGUuYy05NTAtXFxubW0vc3dhcGZpbGUuYzo5NTE6c3RhdGljIHZvaWQgX19mcmVlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpKVxcbm1tL3N3YXBmaWxlLmMtOTUyLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9OTY4PXN0YXRpYyBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmlzb2xhdGVfbG9ja19jbHVzdGVyKFxcbi0tXFxubW0vc3dhcGZpbGUuYy0xMDA3LSAqL1xcbm1tL3N3YXBmaWxlLmM6MTAwODpzdGF0aWMgYm9vbCBzd2FwX2RvX3NjaGVkdWxlZF9kaXNjYXJkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTEwMDkte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0xMDQyLVxcbm1tL3N3YXBmaWxlLmM6MTA0MzpzdGF0aWMgdm9pZCBzd2FwX2Rpc2NhcmRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxubW0vc3dhcGZpbGUuYy0xMDQ0LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTA1MS1cXG5tbS9zd2FwZmlsZS5jOjEwNTI6c3RhdGljIHZvaWQgc3dhcF91c2Vyc19yZWZfZnJlZShzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmKVxcbm1tL3N3YXBmaWxlLmMtMTA1My17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTEwNjMtICovXFxubW0vc3dhcGZpbGUuYzoxMDY0OnN0YXRpYyB2b2lkIGZyZWVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXFxubW0vc3dhcGZpbGUuYy0xMDY1LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTA4Ny0gKi9cXG5tbS9zd2FwZmlsZS5jOjEwODg6c3RhdGljIHZvaWQgcGFydGlhbF9mcmVlX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTA4OS1cXHRcXHRcXHRcXHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSlcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTEwMy0gKi9cXG5tbS9zd2FwZmlsZS5jOjExMDQ6c3RhdGljIHZvaWQgcmVsb2NhdGVfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxubW0vc3dhcGZpbGUuYy0xMTA1LVxcdFxcdFxcdCAgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSlcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTEzMS0gKi9cXG5tbS9zd2FwZmlsZS5jOjExMzI6c3RhdGljIGludCBzd2FwX2NsdXN0ZXJfc2V0dXBfYmFkX3Nsb3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTEzMy1cXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjbHVzdGVyX2luZm8sXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTExODEtICovXFxubW0vc3dhcGZpbGUuYzoxMTgyOnN0YXRpYyBib29sIGNsdXN0ZXJfcmVjbGFpbV9yYW5nZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxubW0vc3dhcGZpbGUuYy0xMTgzLVxcdFxcdFxcdFxcdCAgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTIyOC1cXG5tbS9zd2FwZmlsZS5jOjEyMjk6c3RhdGljIGJvb2wgY2x1c3Rlcl9zY2FuX3JhbmdlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTEyMzAtXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTEyNTUtXFxubW0vc3dhcGZpbGUuYzoxMjU2OnN0YXRpYyBib29sIF9fc3dhcF9jbHVzdGVyX2FsbG9jX2VudHJpZXMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTI1Ny1cXHRcXHRcXHRcXHRcXHQgc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MTM1OD1zdGF0aWMgdW5zaWduZWQgaW50IGFsbG9jX3N3YXBfc2Nhbl9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTM3OS1cXG5tbS9zd2FwZmlsZS5jOjEzODA6c3RhdGljIHZvaWQgc3dhcF9yZWNsYWltX2Z1bGxfY2x1c3RlcnMoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIGZvcmNlKVxcbm1tL3N3YXBmaWxlLmMtMTM4MS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE0MjEtXFxubW0vc3dhcGZpbGUuYzoxNDIyOnN0YXRpYyB2b2lkIHN3YXBfcmVjbGFpbV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG5tbS9zd2FwZmlsZS5jLTE0MjMte1xcbi0tXFxubW0vc3dhcGZpbGUuYz0xNDM1PXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE1MzctLyogU1dBUF9VU0FHRV9PRkZMSVNUX0JJVCBjYW4gb25seSBiZSBzZXQgYnkgdGhpcyBoZWxwZXIuICovXFxubW0vc3dhcGZpbGUuYzoxNTM4OnN0YXRpYyB2b2lkIGRlbF9mcm9tX2F2YWlsX2xpc3Qoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBib29sIHN3YXBvZmYpXFxubW0vc3dhcGZpbGUuYy0xNTM5LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTU2NS0vKiBTV0FQX1VTQUdFX09GRkxJU1RfQklUIGNhbiBvbmx5IGJlIGNsZWFyZWQgYnkgdGhpcyBoZWxwZXIuICovXFxubW0vc3dhcGZpbGUuYzoxNTY2OnN0YXRpYyB2b2lkIGFkZF90b19hdmFpbF9saXN0KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSlcXG5tbS9zd2FwZmlsZS5jLTE1Njcte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0xNjEwLSAqL1xcbm1tL3N3YXBmaWxlLmM6MTYxMTpzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9hZGQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTYxMi1cXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGludCBucl9lbnRyaWVzKVxcbi0tXFxubW0vc3dhcGZpbGUuYy0xNjI5LVxcbm1tL3N3YXBmaWxlLmM6MTYzMDpzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9pbnVzZV9zdWIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCxcXG5tbS9zd2FwZmlsZS5jLTE2MzEtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgbnJfZW50cmllcylcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTY2OC1cXG5tbS9zd2FwZmlsZS5jOjE2Njk6c3RhdGljIGJvb2wgZ2V0X3N3YXBfZGV2aWNlX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbm1tL3N3YXBmaWxlLmMtMTY3MC17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE2ODQtXFxubW0vc3dhcGZpbGUuYzoxNjg1OnN0YXRpYyBpbnQgc3dhcF9hbGxvY19lbnRyeShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbm1tL3N3YXBmaWxlLmMtMTY4Ni17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE3MjAtXFxubW0vc3dhcGZpbGUuYzoxNzIxOnN0YXRpYyBpbnQgc3dhcF9leHRlbmRfdGFibGVfYWxsb2Moc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTcyMi1cXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbi0tXFxubW0vc3dhcGZpbGUuYy0xNzU2LVxcbm1tL3N3YXBmaWxlLmM6MTc1NzppbnQgc3dhcF9yZXRyeV90YWJsZV9hbGxvYyhzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwKVxcbm1tL3N3YXBmaWxlLmMtMTc1OC17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTE3NzQtXFxubW0vc3dhcGZpbGUuYzoxNzc1OnN0YXRpYyB2b2lkIHN3YXBfZXh0ZW5kX3RhYmxlX3RyeV9mcmVlKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kpXFxubW0vc3dhcGZpbGUuYy0xNzc2LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTc5NC0vKiBEZWNyZWFzZSB0aGUgc3dhcCBjb3VudCBvZiBvbmUgc2xvdCwgd2l0aG91dCBmcmVlaW5nIGl0ICovXFxubW0vc3dhcGZpbGUuYzoxNzk1OnN0YXRpYyB2b2lkIF9fc3dhcF9jbHVzdGVyX3B1dF9lbnRyeShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXBmaWxlLmMtMTc5Ni1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGNpX29mZilcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTg0NS0gKi9cXG5tbS9zd2FwZmlsZS5jOjE4NDY6c3RhdGljIHZvaWQgc3dhcF9wdXRfZW50cmllc19jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTE4NDctXFx0XFx0XFx0XFx0ICAgICBwZ29mZl90IG9mZnNldCwgaW50IG5yLFxcbi0tXFxubW0vc3dhcGZpbGUuYy0xOTAyLS8qIEluY3JlYXNlIHRoZSBzd2FwIGNvdW50IG9mIG9uZSBzbG90LiAqL1xcbm1tL3N3YXBmaWxlLmM6MTkwMzpzdGF0aWMgaW50IF9fc3dhcF9jbHVzdGVyX2R1cF9lbnRyeShzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXBmaWxlLmMtMTkwNC1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGNpX29mZilcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTk1Mi0gKi9cXG5tbS9zd2FwZmlsZS5jOjE5NTM6c3RhdGljIGludCBzd2FwX2R1cF9lbnRyaWVzX2NsdXN0ZXIoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMTk1NC1cXHRcXHRcXHRcXHQgICAgcGdvZmZfdCBvZmZzZXQsIGludCBucilcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMTk5Ny0gKi9cXG5tbS9zd2FwZmlsZS5jOjE5OTg6aW50IGZvbGlvX2FsbG9jX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS9zd2FwZmlsZS5jLTE5OTkte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yMDUzLSAqL1xcbm1tL3N3YXBmaWxlLmM6MjA1NDppbnQgZm9saW9fZHVwX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnBhZ2UpXFxubW0vc3dhcGZpbGUuYy0yMDU1LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjA3OS0gKi9cXG5tbS9zd2FwZmlsZS5jOjIwODA6dm9pZCBmb2xpb19wdXRfc3dhcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSlcXG5tbS9zd2FwZmlsZS5jLTIwODEte1xcbi0tXFxubW0vc3dhcGZpbGUuYz0yMTM0PXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpnZXRfc3dhcF9kZXZpY2Uoc3dwX2VudHJ5X3QgZW50cnkpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTIxNjQtICovXFxubW0vc3dhcGZpbGUuYzoyMTY1OnZvaWQgX19zd2FwX2NsdXN0ZXJfZnJlZV9lbnRyaWVzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSxcXG5tbS9zd2FwZmlsZS5jLTIxNjYtXFx0XFx0XFx0XFx0IHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTIyMTUtXFxubW0vc3dhcGZpbGUuYzoyMjE2OmludCBfX3N3YXBfY291bnQoc3dwX2VudHJ5X3QgZW50cnkpXFxubW0vc3dhcGZpbGUuYy0yMjE3LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjIyOC0gKi9cXG5tbS9zd2FwZmlsZS5jOjIyMjk6Ym9vbCBzd2FwX2VudHJ5X3N3YXBwZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzd3BfZW50cnlfdCBlbnRyeSlcXG5tbS9zd2FwZmlsZS5jLTIyMzAte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yMjQ1LSAqL1xcbm1tL3N3YXBmaWxlLmM6MjI0NjppbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSlcXG5tbS9zd2FwZmlsZS5jLTIyNDcte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yMjc4LSAqL1xcbm1tL3N3YXBmaWxlLmM6MjI3OTpzdGF0aWMgYm9vbCBmb2xpb19tYXliZV9zd2FwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxubW0vc3dhcGZpbGUuYy0yMjgwLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjMwNy1cXG5tbS9zd2FwZmlsZS5jOjIzMDg6c3RhdGljIGJvb2wgZm9saW9fc3dhcGNhY2hlX2ZyZWVhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxubW0vc3dhcGZpbGUuYy0yMzA5LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjM0Ni0gKi9cXG5tbS9zd2FwZmlsZS5jOjIzNDc6Ym9vbCBmb2xpb19mcmVlX3N3YXAoc3RydWN0IGZvbGlvICpmb2xpbylcXG5tbS9zd2FwZmlsZS5jLTIzNDgte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yMzcxLSAqL1xcbm1tL3N3YXBmaWxlLmM6MjM3Mjp2b2lkIHN3YXBfcHV0X2VudHJpZXNfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5LCBpbnQgbnIpXFxubW0vc3dhcGZpbGUuYy0yMzczLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MjQwNz1zd3BfZW50cnlfdCBzd2FwX2FsbG9jX2hpYmVybmF0aW9uX3Nsb3QoaW50IHR5cGUpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI0MjktICovXFxubW0vc3dhcGZpbGUuYzoyNDMwOnZvaWQgc3dhcF9mcmVlX2hpYmVybmF0aW9uX3Nsb3Qoc3dwX2VudHJ5X3QgZW50cnkpXFxubW0vc3dhcGZpbGUuYy0yNDMxLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjQ0NC1cXG5tbS9zd2FwZmlsZS5jOjI0NDU6c3RhdGljIGludCBfX2ZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbm1tL3N3YXBmaWxlLmMtMjQ0Ni17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI0NzgtICovXFxubW0vc3dhcGZpbGUuYzoyNDc5OmludCBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KVxcbm1tL3N3YXBmaWxlLmMtMjQ4MC17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI1MjEtICovXFxubW0vc3dhcGZpbGUuYzoyNTIyOnZvaWQgdW5waW5faGliZXJuYXRpb25fc3dhcF90eXBlKGludCB0eXBlKVxcbm1tL3N3YXBmaWxlLmMtMjUyMy17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI1NTAtICovXFxubW0vc3dhcGZpbGUuYzoyNTUxOmludCBmaW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldClcXG5tbS9zd2FwZmlsZS5jLTI1NTIte1xcbi0tXFxubW0vc3dhcGZpbGUuYy0yNTYxLVxcbm1tL3N3YXBmaWxlLmM6MjU2MjppbnQgZmluZF9maXJzdF9zd2FwKGRldl90ICpkZXZpY2UpXFxubW0vc3dhcGZpbGUuYy0yNTYzLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MjYxOT1zdGF0aWMgaW5saW5lIGludCBwdGVfc2FtZV9hc19zd3AocHRlX3QgcHRlLCBwdGVfdCBzd3BfcHRlKVxcbi0tXFxubW0vc3dhcGZpbGUuYy0yNjI4LSAqL1xcbm1tL3N3YXBmaWxlLmM6MjYyOTpzdGF0aWMgaW50IHVudXNlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcXG5tbS9zd2FwZmlsZS5jLTI2MzAtXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjc0MS1cXG5tbS9zd2FwZmlsZS5jOjI3NDI6c3RhdGljIGludCB1bnVzZV9wdGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxubW0vc3dhcGZpbGUuYy0yNzQzLVxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXFxuLS1cXG5tbS9zd2FwZmlsZS5jPTI4NTA9c3RhdGljIGlubGluZSBpbnQgdW51c2VfcDRkX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ2RfdCAqcGdkLFxcbi0tXFxubW0vc3dhcGZpbGUuYy0yODY5LVxcbm1tL3N3YXBmaWxlLmM6Mjg3MDpzdGF0aWMgaW50IHVudXNlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgaW50IHR5cGUpXFxubW0vc3dhcGZpbGUuYy0yODcxLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMjg5MC1cXG5tbS9zd2FwZmlsZS5jOjI4OTE6c3RhdGljIGludCB1bnVzZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgaW50IHR5cGUpXFxubW0vc3dhcGZpbGUuYy0yODkyLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MjkxOT1zdGF0aWMgdW5zaWduZWQgaW50IGZpbmRfbmV4dF90b191bnVzZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTI5NDUtXFxubW0vc3dhcGZpbGUuYzoyOTQ2OnN0YXRpYyBpbnQgdHJ5X3RvX3VudXNlKHVuc2lnbmVkIGludCB0eXBlKVxcbm1tL3N3YXBmaWxlLmMtMjk0Ny17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMwNTMtICovXFxubW0vc3dhcGZpbGUuYzozMDU0OnN0YXRpYyB2b2lkIGRyYWluX21tbGlzdCh2b2lkKVxcbm1tL3N3YXBmaWxlLmMtMzA1NS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMwNzItICovXFxubW0vc3dhcGZpbGUuYzozMDczOnN0YXRpYyB2b2lkIGRlc3Ryb3lfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXFxubW0vc3dhcGZpbGUuYy0zMDc0LVxcdFxcdFxcdFxcdCBzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlKVxcbi0tXFxubW0vc3dhcGZpbGUuYz0zMTM4PUVYUE9SVF9TWU1CT0xfR1BMKGFkZF9zd2FwX2V4dGVudCk7XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMxNjYtICovXFxubW0vc3dhcGZpbGUuYzozMTY3OnN0YXRpYyBpbnQgc2V0dXBfc3dhcF9leHRlbnRzKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXFxubW0vc3dhcGZpbGUuYy0zMTY4LVxcdFxcdFxcdCAgICAgIHN0cnVjdCBmaWxlICpzd2FwX2ZpbGUsIHNlY3Rvcl90ICpzcGFuKVxcbi0tXFxubW0vc3dhcGZpbGUuYy0zMTk5LSAqL1xcbm1tL3N3YXBmaWxlLmM6MzIwMDpzdGF0aWMgdm9pZCBzd2FwX2RldmljZV9lbmFibGUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKVxcbm1tL3N3YXBmaWxlLmMtMzIwMS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTMyMTItXFxubW0vc3dhcGZpbGUuYzozMjEzOnN0YXRpYyBpbnQgc3dhcF9kZXZpY2VfZGlzYWJsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpXFxubW0vc3dhcGZpbGUuYy0zMjE0LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzI1Ni1cXG5tbS9zd2FwZmlsZS5jOjMyNTc6c3RhdGljIHZvaWQgZnJlZV9zd2FwX2NsdXN0ZXJfaW5mbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNsdXN0ZXJfaW5mbyxcXG5tbS9zd2FwZmlsZS5jLTMyNTgtXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBtYXhwYWdlcylcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MzQyOT1zdGF0aWMgdm9pZCAqc3dhcF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTM0NDgtXFxubW0vc3dhcGZpbGUuYzozNDQ5OnN0YXRpYyB2b2lkIHN3YXBfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnN3YXAsIHZvaWQgKnYpXFxubW0vc3dhcGZpbGUuYy0zNDUwLXtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzQ1My1cXG5tbS9zd2FwZmlsZS5jOjM0NTQ6c3RhdGljIGludCBzd2FwX3Nob3coc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KVxcbm1tL3N3YXBmaWxlLmMtMzQ1NS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jPTM0ODE9c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzd2Fwc19vcCA9IHtcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzQ4Ny1cXG5tbS9zd2FwZmlsZS5jOjM0ODg6c3RhdGljIGludCBzd2Fwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbm1tL3N3YXBmaWxlLmMtMzQ4OS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jPTM1Mjg9c3RhdGljIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICphbGxvY19zd2FwX2luZm8odm9pZClcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzU4NC1cXG5tbS9zd2FwZmlsZS5jOjM1ODU6c3RhdGljIGludCBjbGFpbV9zd2FwZmlsZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxubW0vc3dhcGZpbGUuYy0zNTg2LXtcXG4tLVxcbm1tL3N3YXBmaWxlLmM9MzY0Mj1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3N3YXBfaGVhZGVyKHVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcixcXG4tLVxcbm1tL3N3YXBmaWxlLmMtMzcwMy1cXG5tbS9zd2FwZmlsZS5jOjM3MDQ6c3RhdGljIGludCBzZXR1cF9zd2FwX2NsdXN0ZXJzX2luZm8oc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLFxcbm1tL3N3YXBmaWxlLmMtMzcwNS1cXHRcXHRcXHRcXHQgICAgdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyLFxcbi0tXFxubW0vc3dhcGZpbGUuYz0zNzk3PVNZU0NBTExfREVGSU5FMihzd2Fwb24sIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWxmaWxlLCBpbnQsIHN3YXBfZmxhZ3MpXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwMzAtXFxubW0vc3dhcGZpbGUuYzo0MDMxOnZvaWQgc2lfc3dhcGluZm8oc3RydWN0IHN5c2luZm8gKnZhbClcXG5tbS9zd2FwZmlsZS5jLTQwMzIte1xcbi0tXFxubW0vc3dhcGZpbGUuYy00MDU5LSAqL1xcbm1tL3N3YXBmaWxlLmM6NDA2MDppbnQgc3dhcF9kdXBfZW50cnlfZGlyZWN0KHN3cF9lbnRyeV90IGVudHJ5KVxcbm1tL3N3YXBmaWxlLmMtNDA2MS17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwODAtI2lmIGRlZmluZWQoQ09ORklHX01FTUNHKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19CTEtfQ0dST1VQKVxcbm1tL3N3YXBmaWxlLmM6NDA4MTpzdGF0aWMgYm9vbCBfX2hhc191c2FibGVfc3dhcCh2b2lkKVxcbm1tL3N3YXBmaWxlLmMtNDA4Mi17XFxuLS1cXG5tbS9zd2FwZmlsZS5jLTQwODUtXFxubW0vc3dhcGZpbGUuYzo0MDg2OnZvaWQgX19mb2xpb190aHJvdHRsZV9zd2FwcmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBnZnBfdCBnZnApXFxubW0vc3dhcGZpbGUuYy00MDg3LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMDA6NDQ6MDEuMDc4MjI4NDZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMjI4MTkyNzI3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciBUaGlzIFN3YXAgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgc2NhbiBoYXMgaGlnaGxpZ2h0ZWQgYSBoYW5kZnVsIG9mIGZ1bmN0aW9ucyBhcyBwb3RlbnRpYWwgaG90c3BvdHMgaW4gdGhpcyBzd2FwIGltcGxlbWVudGF0aW9uLiBHaXZlbiB0aGUgYXJjaGl0ZWN0dXJhbCBjaGFuZ2UgZGVzY3JpYmVkIOKAkyBtb3ZpbmcgZnJvbSBhIGBwbGlzdGAgdG8gYSByb3VuZC1yb2JpbiBxdWV1ZSDigJMgSSBuZWVkIHRvIHBpbnBvaW50IHRoZSBhcmVhcyB3aGVyZSB0aGlzIG5ldyBsb2dpYyBpcyBpbnRyb2R1Y2VkIGFuZCBpbnRlcmFjdHMgd2l0aCB0aGUgZXhpc3Rpbmcgc3dhcCBmcmFtZXdvcmsuXG5cbkknbSB6ZXJvaW5nIGluIG9uIGEgZmV3IGtleSBmdW5jdGlvbnM6IGBzd2FwX2FsbG9jX2VudHJ5YCBsb29rcyBsaWtlIHRoZSBuZXcgY29yZSBmb3IgYWxsb2NhdGlvbiwgcmVwbGFjaW5nIHNvbWUgb2YgdGhlIG9sZGVyIGxvZ2ljLiBJJ20gYWxzbyBwdXR0aW5nIGEgcGluIG9uIGBzd2FwX3F1ZXVlX2FkZGAsIGBzd2FwX3F1ZXVlX2RlbGAsIGBzd2FwX3F1ZXVlX2dldF9kZXZpY2VgLCBgc3dhcF9kZXZpY2VfZW5hYmxlYCwgYW5kIGBzd2FwX2RldmljZV9kaXNhYmxlYCBhcyB0aGVzZSBzZWVtIHRvIGJlIHRoZSBwcmltYXJ5IGludGVyYWN0aW9ucyB3aXRoIHRoZSBuZXcgcXVldWUgbWVjaGFuaXNtLiBUaGUgaW4tdXNlIGNvdW50ZXJzLCBgc3dhcF9kZXZpY2VfaW51c2VfYWRkYCBhbmQgYHN3YXBfZGV2aWNlX2ludXNlX3N1YmAsIGFyZSBjcnVjaWFsIGZvciBlbnN1cmluZyBjb3JyZWN0bmVzcyBhcyB3ZWxsIGFzIHRoZSBsaXN0IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgYGFkZF90b19hdmFpbF9saXN0YCwgYGRlbF9mcm9tX2F2YWlsX2xpc3RgLCBgc3dhcF9xdWV1ZV9tYXNrYCwgYHN3YXBfcXVldWVfdW5tYXNrYCBhbmQgYGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeWAgYXJlIGFsc28gZXNzZW50aWFsLlxuXG5JJ20gZmlsdGVyaW5nIG91dCBgZm9saW9fYWxsb2Nfc3dhcGAsIGFzIGludGVyZXN0aW5nIGFzIGl0IG1heSBiZSwgYmVjYXVzZSBJIHN1c3BlY3QgaXQgaXMgYSBtb3JlIGdlbmVyaWMgaG90IHBhdGgsIHdoaWNoLCB3aGlsZSBpbXBvcnRhbnQgZm9yIHBlcmZvcm1hbmNlLCB3b24ndCBuZWNlc3NhcmlseSBleHBvc2UgdGhlIGNvcmUgbG9naWMgY2hhbmdlcyBJJ20gYWZ0ZXIuIGBzd2FwX2FsbG9jX2VudHJ5YCBsb29rcyBsaWtlIGEgYmV0dGVyIHRhcmdldC5cblxuTm93LCBsZXQncyBjb25maXJtIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIGBDT05GSUdfU1dBUGAgc2VlbXMgdG8gYmUgdGhlIG1haW4gZHJpdmVyLiBJJ20gcXVpY2tseSB2ZXJpZnlpbmcgdGhhdCBgbW0vc3dhcGZpbGUuY2AgaXMgY29tcGlsZWQgd2hlbiB0aGF0J3MgZW5hYmxlZC4gWWVwLCB0aGF0IGNvbmZpcm1zIGl0LlxuXG5UaGVyZWZvcmUsIGZvciB0aGlzIGZ1enppbmcgZWZmb3J0LCBJJ20gZ29pbmcgdG8gc2V0IGBXb3J0aEZ1enppbmdgIHRvIGB0cnVlYCBnaXZlbiB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UgYW5kIGl0cyBpbXBhY3Qgb24gY29yZSBrZXJuZWwgc3dhcCBsb2dpYy4gVGhlIGBGb2N1c1N5bWJvbHNgIGFyZTpcblxuKiAgIGBzd2FwX2FsbG9jX2VudHJ5YFxuKiAgIGBzd2FwX3F1ZXVlX2FkZGBcbiogICBgc3dhcF9xdWV1ZV9kZWxgXG4qICAgYHN3YXBfcXVldWVfZ2V0X2RldmljZWBcbiogICBgc3dhcF9kZXZpY2VfZW5hYmxlYFxuKiAgIGBzd2FwX2RldmljZV9kaXNhYmxlYFxuKiAgIGBzd2FwX2RldmljZV9pbnVzZV9hZGRgXG4qICAgYHN3YXBfZGV2aWNlX2ludXNlX3N1YmBcbiogICBgYWRkX3RvX2F2YWlsX2xpc3RgXG4qICAgYGRlbF9mcm9tX2F2YWlsX2xpc3RgXG4qICAgYHN3YXBfcXVldWVfbWFza2BcbiogICBgc3dhcF9xdWV1ZV91bm1hc2tgXG4qICAgYGNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeWBcblxuQW5kIEknbGwgZW5hYmxlIG9ubHkgYFNXQVBgIHRvIGJ1aWxkIHRoZSBrZXJuZWwgaW1hZ2UuXG5NeSByZWFzb25pbmcgaXMgdGhhdCB0aGUgaW50cm9kdWN0aW9uIG9mIGEgbmV3IHJvdW5kLXJvYmluIHF1ZXVlLCBhbmQgaXRzIGFzc29jaWF0ZWQgbWFuYWdlbWVudCBmdW5jdGlvbnMsIGludHJvZHVjZXMgbmV3IGNvZGUgdGhhdCBuZWVkcyBjYXJlZnVsIGZ1enppbmcuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIHN1YnRsZSBidWdzIGluIHRoZSBrZXJuZWwncyBtZW1vcnkgbWFuYWdlbWVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzM4MDUsIk91dHB1dFRva2VucyI6MTk5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTc4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDAwOjQ0OjEzLjM2MDE1Nzk2OVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODc2NTI4MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzd2FwX2FsbG9jX2VudHJ5XCIsXG4gICAgXCJzd2FwX3F1ZXVlX2FkZFwiLFxuICAgIFwic3dhcF9xdWV1ZV9kZWxcIixcbiAgICBcInN3YXBfcXVldWVfZ2V0X2RldmljZVwiLFxuICAgIFwic3dhcF9kZXZpY2VfZW5hYmxlXCIsXG4gICAgXCJzd2FwX2RldmljZV9kaXNhYmxlXCIsXG4gICAgXCJzd2FwX2RldmljZV9pbnVzZV9hZGRcIixcbiAgICBcInN3YXBfZGV2aWNlX2ludXNlX3N1YlwiLFxuICAgIFwiYWRkX3RvX2F2YWlsX2xpc3RcIixcbiAgICBcImRlbF9mcm9tX2F2YWlsX2xpc3RcIixcbiAgICBcInN3YXBfcXVldWVfbWFza1wiLFxuICAgIFwic3dhcF9xdWV1ZV91bm1hc2tcIixcbiAgICBcImNsdXN0ZXJfYWxsb2Nfc3dhcF9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlcGxhY2VzIHRoZSBwbGlzdC1iYXNlZCBzd2FwIGRldmljZSBxdWV1ZSB3aXRoIGEgY3VzdG9tIHJvdW5kLXJvYmluIHF1ZXVlLCBpbnRyb2R1Y2luZyBuZXcgY29yZSBsb2dpYyBmb3Igc3dhcCBhbGxvY2F0aW9uIGFuZCBkZXZpY2UgbWFuYWdlbWVudC4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic3dhcF9hbGxvY19lbnRyeVwiLFxuICAgIFwic3dhcF9xdWV1ZV9hZGRcIixcbiAgICBcInN3YXBfcXVldWVfZGVsXCIsXG4gICAgXCJzd2FwX3F1ZXVlX2dldF9kZXZpY2VcIixcbiAgICBcInN3YXBfZGV2aWNlX2VuYWJsZVwiLFxuICAgIFwic3dhcF9kZXZpY2VfZGlzYWJsZVwiLFxuICAgIFwic3dhcF9kZXZpY2VfaW51c2VfYWRkXCIsXG4gICAgXCJzd2FwX2RldmljZV9pbnVzZV9zdWJcIixcbiAgICBcImFkZF90b19hdmFpbF9saXN0XCIsXG4gICAgXCJkZWxfZnJvbV9hdmFpbF9saXN0XCIsXG4gICAgXCJzd2FwX3F1ZXVlX21hc2tcIixcbiAgICBcInN3YXBfcXVldWVfdW5tYXNrXCIsXG4gICAgXCJjbHVzdGVyX2FsbG9jX3N3YXBfZW50cnlcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXBsYWNlcyB0aGUgcGxpc3QtYmFzZWQgc3dhcCBkZXZpY2UgcXVldWUgd2l0aCBhIGN1c3RvbSByb3VuZC1yb2JpbiBxdWV1ZSwgaW50cm9kdWNpbmcgbmV3IGNvcmUgbG9naWMgZm9yIHN3YXAgYWxsb2NhdGlvbiBhbmQgZGV2aWNlIG1hbmFnZW1lbnQuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[1] Phase: Succeeded StartedAt: 2026-07-14 00:44:24 +0000 UTC FinishedAt: 2026-07-14 00:44:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-14 00:44:24 +0000 UTC FinishedAt: 2026-07-14 00:44:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2] Phase: Succeeded StartedAt: 2026-07-14 00:44:24 +0000 UTC FinishedAt: 2026-07-14 05:18:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-14 00:44:24 +0000 UTC FinishedAt: 2026-07-14 05:18:34 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-14 00:44:24 +0000 UTC FinishedAt: 2026-07-14 00:44:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-14 00:44:24 +0000 UTC FinishedAt: 2026-07-14 00:44:30 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-convert-artifact-3646538711/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-14 00:44:34 +0000 UTC FinishedAt: 2026-07-14 01:16:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-14 00:44:34 +0000 UTC FinishedAt: 2026-07-14 01:16:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*a2c153d6-e3ae-4eb5-917e-80123c78efea,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-convert-artifact-3646538711/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "bfe781a4-bed3-4a05-9989-c69b1c2e84d9", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-531776557/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-14 00:44:34 +0000 UTC FinishedAt: 2026-07-14 01:16:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*a2c153d6-e3ae-4eb5-917e-80123c78efea,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-convert-artifact-3646538711/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "bfe781a4-bed3-4a05-9989-c69b1c2e84d9", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-531776557/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-14 01:16:33 +0000 UTC FinishedAt: 2026-07-14 01:16:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-14 01:16:33 +0000 UTC FinishedAt: 2026-07-14 01:16:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-14 01:16:33 +0000 UTC FinishedAt: 2026-07-14 01:16:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-14 01:16:33 +0000 UTC FinishedAt: 2026-07-14 01:16:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-convert-artifact-1174087942/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-14 01:16:53 +0000 UTC FinishedAt: 2026-07-14 01:19:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-14 01:16:53 +0000 UTC FinishedAt: 2026-07-14 01:19:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*bfe781a4-bed3-4a05-9989-c69b1c2e84d9,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-531776557/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-14 01:19:26 +0000 UTC FinishedAt: 2026-07-14 01:19:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-14 01:19:26 +0000 UTC FinishedAt: 2026-07-14 01:19:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-14 01:19:26 +0000 UTC FinishedAt: 2026-07-14 02:09:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-14 01:19:26 +0000 UTC FinishedAt: 2026-07-14 02:09:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*a2c153d6-e3ae-4eb5-917e-80123c78efea,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-convert-artifact-1174087942/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "55788a02-5d0e-4adc-875f-b950279fcdc7", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-4287266634/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-14 01:19:26 +0000 UTC FinishedAt: 2026-07-14 02:09:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*a2c153d6-e3ae-4eb5-917e-80123c78efea,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-convert-artifact-1174087942/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "55788a02-5d0e-4adc-875f-b950279fcdc7", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-4287266634/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-14 02:09:39 +0000 UTC FinishedAt: 2026-07-14 02:09:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-14 02:09:39 +0000 UTC FinishedAt: 2026-07-14 02:09:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-14 02:09:39 +0000 UTC FinishedAt: 2026-07-14 02:12:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-14 02:09:39 +0000 UTC FinishedAt: 2026-07-14 02:12:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*55788a02-5d0e-4adc-875f-b950279fcdc7,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-4287266634/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-14 02:12:14 +0000 UTC FinishedAt: 2026-07-14 05:18:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-14 02:12:14 +0000 UTC FinishedAt: 2026-07-14 05:18:34 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*bfe781a4-bed3-4a05-9989-c69b1c2e84d9,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*55788a02-5d0e-4adc-875f-b950279fcdc7,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-531776557/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-4287266634/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-14 02:12:14 +0000 UTC FinishedAt: 2026-07-14 02:12:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-14 02:12:14 +0000 UTC FinishedAt: 2026-07-14 02:12:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-convert-artifact-3648746443/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-14 02:12:14 +0000 UTC FinishedAt: 2026-07-14 02:12:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-14 02:12:14 +0000 UTC FinishedAt: 2026-07-14 02:12:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-14 02:12:14 +0000 UTC FinishedAt: 2026-07-14 02:12:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-14 02:12:24 +0000 UTC FinishedAt: 2026-07-14 05:18:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow55khq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["swap_alloc_entry","swap_queue_add","swap_queue_del","swap_queue_get_device","swap_device_enable","swap_device_disable","swap_device_inuse_add","swap_device_inuse_sub","add_to_avail_list","del_from_avail_list","swap_queue_mask","swap_queue_unmask","cluster_alloc_swap_entry"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"bdc38bfc1262e3d1432afadd2aa2ffd83d139dbb","config_name":"upstream-apparmor-kasan.config","enable_configs":["SWAP"],"series_id":"cb6a7ff2-fc06-4fbf-89b5-abfa28da9c4c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-14 02:12:24 +0000 UTC FinishedAt: 2026-07-14 05:18:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*bfe781a4-bed3-4a05-9989-c69b1c2e84d9,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*55788a02-5d0e-4adc-875f-b950279fcdc7,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-531776557/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-build-action-4287266634/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow55khq/series-workflow55khq-convert-artifact-3648746443/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}