Name: series-workflowgr58t Phase: Succeeded StartedAt: 2026-07-06 12:49:45 +0000 UTC FinishedAt: 2026-07-06 17:08:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[0] Phase: Succeeded StartedAt: 2026-07-06 12:49:45 +0000 UTC FinishedAt: 2026-07-06 12:59:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[0].run-triage Phase: Succeeded StartedAt: 2026-07-06 12:49:45 +0000 UTC FinishedAt: 2026-07-06 12:59:24 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "bb4e90e91ba19b598cbdd9a2161b893b86a3f637", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "INET", "IPV6" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "bb4e90e91ba19b598cbdd9a2161b893b86a3f637", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "INET", "IPV6" ], "series_id": "3eacd087-8dee-4e0e-8e6c-b3c9edba36e1" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "net" ], "focus_symbols": [ "bpf_ksock_create", "bpf_ksock_bind", "bpf_ksock_connect", "bpf_ksock_send", "bpf_ksock_acquire", "bpf_ksock_release", "__sys_connect_socket" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDEyOjU4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0lORVQmIzM0OywKICAgICYjMzQ7SVBWNiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9rc29ja19jcmVhdGUmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX2JpbmQmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX2Nvbm5lY3QmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX3NlbmQmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX2FjcXVpcmUmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX3JlbGVhc2UmIzM0OywKICAgICYjMzQ7X19zeXNfY29ubmVjdF9zb2NrZXQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgZmVhdHVyZSBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGtlcm5lbCBzb2NrZXRzIChgYnBmX2tzb2NrYCkuIFRoaXMgYWRkcyBuZXcgQlBGIGtmdW5jcyAoYGJwZl9rc29ja19jcmVhdGVgLCBgYnBmX2tzb2NrX2JpbmRgLCBgYnBmX2tzb2NrX2Nvbm5lY3RgLCBgYnBmX2tzb2NrX3NlbmRgLCBldGMuKSB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBjb3JlIG5ldHdvcmtpbmcgc3RhY2suIEZ1enppbmcgdGhlc2Uga2Z1bmNzIGlzIGltcG9ydGFudCB0byBlbnN1cmUgbWVtb3J5IHNhZmV0eSBhbmQgY29ycmVjdCBiZWhhdmlvciBvZiB0aGUgbmV3IGZlYXR1cmUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMTI6NTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2YzA0NGEzYjNhZTJmODFkYWVkMGNjOTBiOWM0MDg0OWNkNjMxM2ViXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBKdWwgNiAxMjo1ODo1NCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL3N5c2N0bC9uZXQucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxuaW5kZXggZTU4NmUxN2ZjN2E1ODIuLjhiY2RjMWJmZDcxMTM4IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxuQEAgLTEyOCw2ICYjNDM7MTI4LDE4IEBAIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlamVjdCB1bnByaXZpbGVnZWQgSklUIHJlcXVlc3RzIG9uY2UgaXQgaGFzXG4gYmVlbiBzdXJwYXNzZWQuIGJwZl9qaXRfbGltaXQgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwgbGltaXRcbiBpbiBieXRlcy5cbiBcbiYjNDM7YnBmX2tzb2NrX21heFxuJiM0MzstLS0tLS0tLS0tLS0tXG4mIzQzO1xuJiM0MztNYXhpbXVtIG51bWJlciBvZiBCUEYga2VybmVsIHNvY2tldHMgdGhhdCBtYXkgZXhpc3QgaW4gZWFjaCBuZXR3b3JrIG5hbWVzcGFjZS5cbiYjNDM7VGhpcyBob3N0LXdpZGUgc2V0dGluZyBpcyBleHBvc2VkIGluIHRoZSBpbml0aWFsIG5ldHdvcmsgbmFtZXNwYWNlIGFuZCBhcHBsaWVzXG4mIzQzO3RoZSBzYW1lIGxpbWl0IGluZGVwZW5kZW50bHkgdG8gZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuIFNvY2tldHMgYXdhaXRpbmdcbiYjNDM7ZGVmZXJyZWQgUkNVIGFuZCB3b3JrcXVldWUgY2xlYW51cCByZW1haW4gY291bnRlZCB1bnRpbCB0aGUgdW5kZXJseWluZyBzb2NrZXRcbiYjNDM7aGFzIGJlZW4gcmVsZWFzZWQuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyBjcmVhdGlvbiBvZiBCUEYga2VybmVsIHNvY2tldHMgaW5cbiYjNDM7ZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuXG4mIzQzO1xuJiM0MztEZWZhdWx0OiAxMDI0XG4mIzQzO1xuIGRldl93ZWlnaHRcbiAtLS0tLS0tLS0tXG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGZfa3NvY2suaCBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMDQ4NWI4ZWRkYzFmMjBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmhcbkBAIC0wLDAgJiM0MzsxLDUwIEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2lmbmRlZiBfQlBGX0tTT0NLX0hcbiYjNDM7I2RlZmluZSBfQlBGX0tTT0NLX0hcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQlBGX0tTT0NLX01BWF9ERUZBVUxUIDEwMjRcbiYjNDM7XG4mIzQzO2V4dGVybiBpbnQgc3lzY3RsX2JwZl9rc29ja19tYXg7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAtIEJQRiBrZXJuZWwgc29ja2V0IGNyZWF0aW9uIHBhcmFtZXRlcnNcbiYjNDM7ICogQGZhbWlseTpcdEFkZHJlc3MgZmFtaWx5OiBBRl9JTkVUIG9yIEFGX0lORVQ2LlxuJiM0MzsgKiBAdHlwZTpcdFNvY2tldCB0eXBlOiBvbmx5IFNPQ0tfREdSQU0gc3VwcG9ydGVkIGZvciBub3cuXG4mIzQzOyAqIEBwcm90b2NvbDpcdFByb3RvY29sIG51bWJlciAoZS5nLiBJUFBST1RPX1VEUCksIG9yIDAgZm9yIHRoZSBkZWZhdWx0IHByb3RvY29sXG4mIzQzOyAqXHRcdG9mIHRoZSBnaXZlbiB0eXBlLlxuJiM0MzsgKiBAcmVzZXJ2ZWQ6XHRNdXN0IGJlIHplcm8uIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyB7XG4mIzQzO1x0X191OCBmYW1pbHk7XG4mIzQzO1x0X191OCB0eXBlO1xuJiM0MztcdF9fdTggcHJvdG9jb2w7XG4mIzQzO1x0X191OCByZXNlcnZlZDtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAtIEJQRiBrZXJuZWwgc29ja2V0IGFkZHJlc3MgcGFyYW1ldGVyc1xuJiM0MzsgKiBAZmFtaWx5Olx0QWRkcmVzcyBmYW1pbHk6IEFGX0lORVQgb3IgQUZfSU5FVDYuXG4mIzQzOyAqIEByZXNlcnZlZDpcdE11c3QgYmUgemVyby4gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4mIzQzOyAqIEBwb3J0Olx0UG9ydCBpbiBob3N0IGJ5dGUgb3JkZXIuXG4mIzQzOyAqIEBzY29wZV9pZDpcdElQdjYgc2NvcGUgSUQgZm9yIHNjb3BlZCBBRl9JTkVUNiBhZGRyZXNzZXMsIG9yIHplcm8uXG4mIzQzOyAqXHRcdE11c3QgYmUgemVybyB3aGVuIGZhbWlseT1BRl9JTkVULlxuJiM0MzsgKiBAaXB2NF9hZGRyOlx0SVB2NCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVULlxuJiM0MzsgKiBAaXB2Nl9hZGRyOlx0SVB2NiBhZGRyZXNzICgxNiBieXRlcywgbmV0d29yayBieXRlIG9yZGVyKS4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVUNi5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHtcbiYjNDM7XHRfX3U4IGZhbWlseTtcbiYjNDM7XHRfX3U4IHJlc2VydmVkO1xuJiM0MztcdF9fdTE2IHBvcnQ7XG4mIzQzO1x0X191MzIgc2NvcGVfaWQ7XG4mIzQzO1xuJiM0MztcdHVuaW9uIHtcbiYjNDM7XHRcdF9fYmUzMiBpcHY0X2FkZHI7XG4mIzQzO1x0XHRfX3UzMiBpcHY2X2FkZHJbNF07IC8qIGluNl9hZGRyOyBuZXR3b3JrIG9yZGVyICovXG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBfQlBGX0tTT0NLX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuaW5kZXggMmE4ZDdiMTRmMWQxMTkuLjQ4ZjFlYjgxOTNkZWExIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuQEAgLTQ2MSw2ICYjNDM7NDYxLDggQEAgZXh0ZXJuIHN0cnVjdCBmaWxlICpfX3N5c19zb2NrZXRfZmlsZShpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTtcbiBleHRlcm4gaW50IF9fc3lzX2JpbmQoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1bXlhZGRyLCBpbnQgYWRkcmxlbik7XG4gZXh0ZXJuIGludCBfX3N5c19iaW5kX3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcyxcbiBcdFx0XHQgICAgIGludCBhZGRybGVuKTtcbiYjNDM7ZXh0ZXJuIGludCBfX3N5c19jb25uZWN0X3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcixcbiYjNDM7XHRcdFx0XHRpbnQgYWRkcmxlbiwgaW50IGZsYWdzKTtcbiBleHRlcm4gaW50IF9fc3lzX2Nvbm5lY3RfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsXG4gXHRcdFx0ICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKTtcbiBleHRlcm4gaW50IF9fc3lzX2Nvbm5lY3QoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1c2VydmFkZHIsXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uNTJmNmE4OTU0NmU0NmEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTQ0MjQsNiAmIzQzOzQ0MjQsOSBAQCBCVEZfSUQoc3RydWN0LCB0YXNrX3N0cnVjdClcbiAjaWZkZWYgQ09ORklHX0NSWVBUT1xuIEJURl9JRChzdHJ1Y3QsIGJwZl9jcnlwdG9fY3R4KVxuICNlbmRpZlxuJiM0MzsjaWZkZWYgQ09ORklHX0lORVRcbiYjNDM7QlRGX0lEKHN0cnVjdCwgYnBmX2tzb2NrKVxuJiM0MzsjZW5kaWZcbiBCVEZfU0VUX0VORChyY3VfcHJvdGVjdGVkX3R5cGVzKVxuIFxuIHN0YXRpYyBib29sIHJjdV9wcm90ZWN0ZWRfb2JqZWN0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZClcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9NYWtlZmlsZSBiL25ldC9jb3JlL01ha2VmaWxlXG5pbmRleCBiM2ZkY2I0ZTM1NWZhNi4uYTkyOTViNzg1OTAxMDkgMTAwNjQ0XG4tLS0gYS9uZXQvY29yZS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvTWFrZWZpbGVcbkBAIC00NCw2ICYjNDM7NDQsOSBAQCBvYmotJChDT05GSUdfRkFJTE9WRVIpICYjNDM7PSBmYWlsb3Zlci5vXG4gb2JqLSQoQ09ORklHX05FVF9TT0NLX01TRykgJiM0Mzs9IHNrbXNnLm9cbiBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBzb2NrX21hcC5vXG4gb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnBmX3NrX3N0b3JhZ2Uub1xuJiM0MztpZm5lcSAoJChDT05GSUdfSU5FVCksKVxuJiM0MztvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBicGZfa3NvY2sub1xuJiM0MztlbmRpZlxuIG9iai0kKENPTkZJR19PRilcdCYjNDM7PSBvZl9uZXQub1xuIG9iai0kKENPTkZJR19ORVRfVEVTVCkgJiM0Mzs9IG5ldF90ZXN0Lm9cbiBvYmotJChDT05GSUdfTkVUX0RFVk1FTSkgJiM0Mzs9IGRldm1lbS5vXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvYnBmX2tzb2NrLmMgYi9uZXQvY29yZS9icGZfa3NvY2suY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi44YmRlNzM0YmM5MTdkM1xuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvYnBmX2tzb2NrLmNcbkBAIC0wLDAgJiM0MzsxLDUxNiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZl9rc29jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jYWNoZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2hhc2guaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2luNi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xpc3RfYmwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9uZXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9yZWZjb3VudC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdXBkYXRlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc29ja2V0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdW5hbGlnbmVkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaXAuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXQvaXB2Ni5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY25ldC9uZXRfbmFtZXNwYWNlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbmV0L25ldG5zL2dlbmVyaWMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXQvc29jay5oXHUwMDNlXG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogc3RydWN0IGJwZl9rc29jayAtIHJlZmNvdW50ZWQgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dFxuJiM0MzsgKiBAc29jazpcdFRoZSB1bmRlcmx5aW5nIGtlcm5lbCBzb2NrZXQuXG4mIzQzOyAqIEB1c2FnZTpcdFJlZmVyZW5jZSBjb3VudGVyLlxuJiM0MzsgKiBAcndvcms6XHRSQ1Ugd29yayBmb3IgZGVmZXJyZWQgY2xlYW51cCAoc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgYnBmX2tzb2NrIHtcbiYjNDM7XHRzdHJ1Y3Qgc29ja2V0ICpzb2NrO1xuJiM0MztcdHJlZmNvdW50X3QgdXNhZ2U7XG4mIzQzO1x0c3RydWN0IHJjdV93b3JrIHJ3b3JrO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkIHtcbiYjNDM7XHRzdHJ1Y3QgaGxpc3RfYmxfbm9kZSBub2RlO1xuJiM0MztcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQlBGX0tTT0NLX1NFTkRfR1VBUkRfSEFTSF9CSVRTIDZcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQge1xuJiM0MztcdHN0cnVjdCBobGlzdF9ibF9oZWFkIGhlYWQ7XG4mIzQzO30gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDtcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0XG4mIzQzO1x0YnBmX2tzb2NrX3NlbmRfYnVja2V0c1sxIFx1MDAzY1x1MDAzYyBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFNdO1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKlxuJiM0MzticGZfa3NvY2tfc2VuZF9idWNrZXQoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuJiM0Mzt7XG4mIzQzO1x0dTMyIGJ1Y2tldF9pZHggPSBoYXNoX3B0cih0YXNrLCBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gXHUwMDI2YnBmX2tzb2NrX3NlbmRfYnVja2V0c1tidWNrZXRfaWR4XTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgYnBmX2tzb2NrX3NlbmRfZW50ZXIoc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICpndWFyZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9ndWFyZCAqZW50cnk7XG4mIzQzO1x0c3RydWN0IGhsaXN0X2JsX25vZGUgKnBvcztcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0ICpidWNrZXQ7XG4mIzQzO1xuJiM0MztcdGJ1Y2tldCA9IGJwZl9rc29ja19zZW5kX2J1Y2tldChjdXJyZW50KTtcbiYjNDM7XHRobGlzdF9ibF9sb2NrKFx1MDAyNmJ1Y2tldC1cdTAwM2VoZWFkKTtcbiYjNDM7XHRobGlzdF9ibF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCBcdTAwMjZidWNrZXQtXHUwMDNlaGVhZCwgbm9kZSkge1xuJiM0MztcdFx0aWYgKGVudHJ5LVx1MDAzZXRhc2sgPT0gY3VycmVudCkge1xuJiM0MztcdFx0XHRobGlzdF9ibF91bmxvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRndWFyZC1cdTAwM2V0YXNrID0gY3VycmVudDtcbiYjNDM7XHRJTklUX0hMSVNUX0JMX05PREUoXHUwMDI2Z3VhcmQtXHUwMDNlbm9kZSk7XG4mIzQzO1x0aGxpc3RfYmxfYWRkX2hlYWQoXHUwMDI2Z3VhcmQtXHUwMDNlbm9kZSwgXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuJiM0MztcdGhsaXN0X2JsX3VubG9jayhcdTAwMjZidWNrZXQtXHUwMDNlaGVhZCk7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGJwZl9rc29ja19zZW5kX2V4aXQoc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICpndWFyZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKmJ1Y2tldDtcbiYjNDM7XG4mIzQzO1x0YnVja2V0ID0gYnBmX2tzb2NrX3NlbmRfYnVja2V0KGd1YXJkLVx1MDAzZXRhc2spO1xuJiM0MztcdGhsaXN0X2JsX2xvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuJiM0MztcdGhsaXN0X2JsX2RlbChcdTAwMjZndWFyZC1cdTAwM2Vub2RlKTtcbiYjNDM7XHRobGlzdF9ibF91bmxvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2tzb2NrX25ldCB7XG4mIzQzO1x0YXRvbWljX3QgY291bnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IGJwZl9rc29ja19uZXRfaWQ7XG4mIzQzO2ludCBzeXNjdGxfYnBmX2tzb2NrX21heCBfX3JlYWRfbW9zdGx5ID0gQlBGX0tTT0NLX01BWF9ERUZBVUxUO1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBicGZfa3NvY2tfbmV0ICpicGZfa3NvY2tfcGVybmV0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBuZXRfZ2VuZXJpYyhuZXQsIGJwZl9rc29ja19uZXRfaWQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGJwZl9rc29ja19uZXRfb3BzID0ge1xuJiM0MztcdC5pZCA9IFx1MDAyNmJwZl9rc29ja19uZXRfaWQsXG4mIzQzO1x0LnNpemUgPSBzaXplb2Yoc3RydWN0IGJwZl9rc29ja19uZXQpLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgYnBmX2tzb2NrX25ldF90cnlfY2hhcmdlKHN0cnVjdCBuZXQgKm5ldClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfbmV0ICprbiA9IGJwZl9rc29ja19wZXJuZXQobmV0KTtcbiYjNDM7XHRpbnQgY291bnQgPSBhdG9taWNfcmVhZChcdTAwMjZrbi1cdTAwM2Vjb3VudCk7XG4mIzQzO1x0aW50IG1heDtcbiYjNDM7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0bWF4ID0gUkVBRF9PTkNFKHN5c2N0bF9icGZfa3NvY2tfbWF4KTtcbiYjNDM7XHRcdGlmIChjb3VudCBcdTAwM2U9IG1heClcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH0gd2hpbGUgKCFhdG9taWNfdHJ5X2NtcHhjaGcoXHUwMDI2a24tXHUwMDNlY291bnQsIFx1MDAyNmNvdW50LCBjb3VudCAmIzQzOyAxKSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBicGZfa3NvY2tfbmV0X3VuY2hhcmdlKHN0cnVjdCBuZXQgKm5ldClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfbmV0ICprbiA9IGJwZl9rc29ja19wZXJuZXQobmV0KTtcbiYjNDM7XG4mIzQzO1x0V0FSTl9PTl9PTkNFKGF0b21pY19kZWNfcmV0dXJuKFx1MDAyNmtuLVx1MDAzZWNvdW50KSBcdTAwM2MgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGtzb2NrX3JlbGVhc2Vfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrICprcyA9XG4mIzQzO1x0XHRjb250YWluZXJfb2YodG9fcmN1X3dvcmsod29yayksIHN0cnVjdCBicGZfa3NvY2ssIHJ3b3JrKTtcbiYjNDM7XHRzdHJ1Y3QgbmV0ICpuZXQgPSBnZXRfbmV0KHNvY2tfbmV0KGtzLVx1MDAzZXNvY2stXHUwMDNlc2spKTtcbiYjNDM7XG4mIzQzO1x0c29ja19yZWxlYXNlKGtzLVx1MDAzZXNvY2spO1xuJiM0MztcdGJwZl9rc29ja19uZXRfdW5jaGFyZ2UobmV0KTtcbiYjNDM7XHRwdXRfbmV0KG5ldCk7XG4mIzQzO1x0a2ZyZWUoa3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJwZl9rc29ja19nZXRfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcbiYjNDM7XHRcdFx0ICAgICAgdTMyIG9wdHNfX3N6LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIG9wdHNfY29weTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFvcHRzIHx8IG9wdHNfX3N6ICE9IHNpemVvZigqb3B0cykpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0LyogS2Z1bmMgbWVtb3J5IGFyZ3VtZW50cyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgbmF0dXJhbGx5IGFsaWduZWQuICovXG4mIzQzO1x0bWVtY3B5KFx1MDAyNm9wdHNfY29weSwgb3B0cywgc2l6ZW9mKG9wdHNfY29weSkpO1xuJiM0MztcbiYjNDM7XHRpZiAob3B0c19jb3B5LnJlc2VydmVkKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAob3B0c19jb3B5LmZhbWlseSkge1xuJiM0MztcdGNhc2UgQUZfSU5FVDoge1xuJiM0MztcdFx0c3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyO1xuJiM0MztcbiYjNDM7XHRcdGlmIChvcHRzX2NvcHkuc2NvcGVfaWQpXG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRcdCphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4pe1xuJiM0MztcdFx0XHQuc2luX2ZhbWlseSA9IEFGX0lORVQsXG4mIzQzO1x0XHRcdC5zaW5fcG9ydCA9IGh0b25zKG9wdHNfY29weS5wb3J0KSxcbiYjNDM7XHRcdFx0LnNpbl9hZGRyLnNfYWRkciA9IG9wdHNfY29weS5pcHY0X2FkZHIsXG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0cmV0dXJuIHNpemVvZigqYWRkcjQpO1xuJiM0MztcdH1cbiYjNDM7I2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpXG4mIzQzO1x0Y2FzZSBBRl9JTkVUNjoge1xuJiM0MztcdFx0c3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7XG4mIzQzO1xuJiM0MztcdFx0KmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYpe1xuJiM0MztcdFx0XHQuc2luNl9mYW1pbHkgPSBBRl9JTkVUNixcbiYjNDM7XHRcdFx0LnNpbjZfcG9ydCA9IGh0b25zKG9wdHNfY29weS5wb3J0KSxcbiYjNDM7XHRcdFx0LnNpbjZfc2NvcGVfaWQgPSBvcHRzX2NvcHkuc2NvcGVfaWQsXG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0bWVtY3B5KFx1MDAyNmFkZHI2LVx1MDAzZXNpbjZfYWRkciwgb3B0c19jb3B5LmlwdjZfYWRkcixcbiYjNDM7XHRcdCAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7XG4mIzQzO1x0XHRyZXR1cm4gc2l6ZW9mKCphZGRyNik7XG4mIzQzO1x0fVxuJiM0MzsjZW5kaWZcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0cmV0dXJuIC1FQUZOT1NVUFBPUlQ7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRhc2sgd29yayBjYW4gcnVuIGZyb20gZG9fZXhpdCgpIGFmdGVyIGV4aXRfbnNwcm94eV9uYW1lc3BhY2VzKClcbiYjNDM7XHQgKiBjbGVhcmVkIGN1cnJlbnQtXHUwMDNlbnNwcm94eSwgd2hpbGUgY3VycmVudCBpcyBzdGlsbCBub3QgYSBrdGhyZWFkLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldHVybiAhKGN1cnJlbnQtXHUwMDNlZmxhZ3MgXHUwMDI2IFBGX0tUSFJFQUQpIFx1MDAyNlx1MDAyNiBjdXJyZW50LVx1MDAzZW5zcHJveHk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO19fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfa3NvY2tfY3JlYXRlKCkgLSBDcmVhdGUgYSBCUEYga2VybmVsIHNvY2tldC5cbiYjNDM7ICpcbiYjNDM7ICogQWxsb2NhdGVzIGFuZCBjcmVhdGVzIGEga2VybmVsIHNvY2tldC5cbiYjNDM7ICogVGhlIHNvY2tldCBpcyBjaGFyZ2VkIGFnYWluc3QgdGhlIGFjdGl2ZSBuZXR3b3JrIG5hbWVzcGFjZSYjMzk7cyBCUEYga2VybmVsXG4mIzQzOyAqIHNvY2tldCBxdW90YS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHJldHVybmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3JcbiYjNDM7ICogZnJlZWQgd2l0aCBicGZfa3NvY2tfcmVsZWFzZSgpLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCAoc29ja19jcmVhdGUpLCBzbyBpdCBjYW4gb25seSBiZSB1c2VkXG4mIzQzOyAqIGluIHNsZWVwYWJsZSBCUEYgcHJvZ3JhbXMgKFNZU0NBTEwpLlxuJiM0MzsgKiBJdCBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBCUEYgd29ya3F1ZXVlIGNhbGxiYWNrIGJlY2F1c2UgdGhhdCBjYWxsYmFja1xuJiM0MzsgKiBkb2VzIG5vdCByZXRhaW4gdGhlIGludm9raW5nIHRhc2smIzM5O3MgbmFtZXNwYWNlIG9yIHNlY3VyaXR5IGNvbnRleHQuXG4mIzQzOyAqXG4mIzQzOyAqIEBvcHRzOlx0UG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIHdpdGggc29ja2V0IHBhcmFtZXRlcnMuXG4mIzQzOyAqIEBvcHRzX19zejpcdFNpemUgb2YgdGhlIG9wdHMgc3RydWN0LlxuJiM0MzsgKiBAZXJyX191bmluaXQ6XHRJbnRlZ2VyIHRvIHN0b3JlIGVycm9yIGNvZGUgd2hlbiBOVUxMIGlzIHJldHVybmVkLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqXG4mIzQzO2JwZl9rc29ja19jcmVhdGUoY29uc3Qgc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6LFxuJiM0MztcdFx0IGludCAqZXJyX191bmluaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIG9wdHNfY29weTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcbiYjNDM7XHRzdHJ1Y3QgbmV0ICpuZXQ7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBzb2NrX2NyZWF0ZSgpIGRlcml2ZXMgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBjcmVkZW50aWFscywgYW5kIGNncm91cFxuJiM0MztcdCAqIGZyb20gY3VycmVudC4gS2VybmVsIHRocmVhZHMsIGluY2x1ZGluZyBCUEYgd29ya3F1ZXVlIGNhbGxiYWNrcywgZG9cbiYjNDM7XHQgKiBub3QgY2FycnkgdGhlIGNvbnRleHQgb2YgdGhlIHRhc2sgdGhhdCBpbnZva2VkIHRoZSBCUEYgcHJvZ3JhbS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSkge1xuJiM0MztcdFx0ZXJyID0gLUVPUE5PVFNVUFA7XG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIW9wdHMgfHwgb3B0c19fc3ogIT0gc2l6ZW9mKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpKSB7XG4mIzQzO1x0XHRlcnIgPSAtRUlOVkFMO1xuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0b3B0c19jb3B5ID0gKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpe1xuJiM0MztcdFx0LmZhbWlseSA9IFJFQURfT05DRShvcHRzLVx1MDAzZWZhbWlseSksXG4mIzQzO1x0XHQudHlwZSA9IFJFQURfT05DRShvcHRzLVx1MDAzZXR5cGUpLFxuJiM0MztcdFx0LnByb3RvY29sID0gUkVBRF9PTkNFKG9wdHMtXHUwMDNlcHJvdG9jb2wpLFxuJiM0MztcdFx0LnJlc2VydmVkID0gUkVBRF9PTkNFKG9wdHMtXHUwMDNlcmVzZXJ2ZWQpLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdGlmIChvcHRzX2NvcHkucmVzZXJ2ZWQpIHtcbiYjNDM7XHRcdGVyciA9IC1FSU5WQUw7XG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAob3B0c19jb3B5LmZhbWlseSAhPSBBRl9JTkVUIFx1MDAyNlx1MDAyNiBvcHRzX2NvcHkuZmFtaWx5ICE9IEFGX0lORVQ2KSB7XG4mIzQzO1x0XHRlcnIgPSAtRUFGTk9TVVBQT1JUO1xuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG9wdHNfY29weS50eXBlICE9IFNPQ0tfREdSQU0pIHtcbiYjNDM7XHRcdGVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7XG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAob3B0c19jb3B5LnByb3RvY29sICE9IElQUFJPVE9fVURQIFx1MDAyNlx1MDAyNiBvcHRzX2NvcHkucHJvdG9jb2wgIT0gMCkge1xuJiM0MztcdFx0ZXJyID0gLUVQUk9UT05PU1VQUE9SVDtcbiYjNDM7XHRcdGdvdG8gZXJyX291dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzID0ga3phbGxvY19vYmooKmtzKTtcbiYjNDM7XHRpZiAoIWtzKSB7XG4mIzQzO1x0XHRlcnIgPSAtRU5PTUVNO1xuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bmV0ID0gY3VycmVudC1cdTAwM2Vuc3Byb3h5LVx1MDAzZW5ldF9ucztcbiYjNDM7XHRpZiAoIWJwZl9rc29ja19uZXRfdHJ5X2NoYXJnZShuZXQpKSB7XG4mIzQzO1x0XHRlcnIgPSAtRU5PU1BDO1xuJiM0MztcdFx0Z290byBlcnJfZnJlZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVXNlIHRoZSBub3JtYWwgY3VycmVudC10YXNrIHNvY2tldCBwYXRoIHNvIExTTS9jZ3JvdXAgcG9saWN5LFxuJiM0MztcdCAqIHNvY2tldCBsYWJlbHMsIGFuZCB0aGUgYWN0aXZlIG5ldG5zIHJlZmVyZW5jZSBtYXRjaCBhIHNvY2tldCgyKVxuJiM0MztcdCAqIGNyZWF0ZWQgYnkgdGhlIEJQRiBwcm9ncmFtJiMzOTtzIGNhbGxlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRlcnIgPSBzb2NrX2NyZWF0ZShvcHRzX2NvcHkuZmFtaWx5LCBvcHRzX2NvcHkudHlwZSwgb3B0c19jb3B5LnByb3RvY29sLFxuJiM0MztcdFx0XHQgIFx1MDAyNmtzLVx1MDAzZXNvY2spO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRnb3RvIGVycl91bmNoYXJnZTtcbiYjNDM7XG4mIzQzO1x0a3MtXHUwMDNlc29jay1cdTAwM2Vzay1cdTAwM2Vza19yY3ZidWYgPSBTT0NLX01JTl9SQ1ZCVUY7XG4mIzQzO1x0a3MtXHUwMDNlc29jay1cdTAwM2Vzay1cdTAwM2Vza191c2VybG9ja3MgfD0gU09DS19SQ1ZCVUZfTE9DSztcbiYjNDM7XG4mIzQzO1x0cmVmY291bnRfc2V0KFx1MDAyNmtzLVx1MDAzZXVzYWdlLCAxKTtcbiYjNDM7XHRwdXRfdW5hbGlnbmVkKDAsIGVycl9fdW5pbml0KTtcbiYjNDM7XHRyZXR1cm4ga3M7XG4mIzQzO1xuJiM0MztlcnJfdW5jaGFyZ2U6XG4mIzQzO1x0YnBmX2tzb2NrX25ldF91bmNoYXJnZShuZXQpO1xuJiM0MztlcnJfZnJlZTpcbiYjNDM7XHRrZnJlZShrcyk7XG4mIzQzO2Vycl9vdXQ6XG4mIzQzO1x0cHV0X3VuYWxpZ25lZChlcnIsIGVycl9fdW5pbml0KTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9rc29ja19iaW5kKCkgLSBCaW5kIGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNzLlxuJiM0MzsgKiBAa3M6XHRcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LlxuJiM0MzsgKiBAb3B0czpcdFBvaW50ZXIgdG8gc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgd2l0aCBsb2NhbCBhZGRyZXNzLlxuJiM0MzsgKiBAb3B0c19fc3o6XHRTaXplIG9mIHRoZSBvcHRzIHN0cnVjdC5cbiYjNDM7ICpcbiYjNDM7ICogQmluZHMgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQuXG4mIzQzOyAqIFRoaXMgaXMgb3B0aW9uYWw7IGlmIG5vdCBjYWxsZWQsIHRoZSBrZXJuZWwgd2lsbCBhdXRvLWFzc2lnbi5cbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgd2hpbGUgYmluZGluZyB0aGUgc29ja2V0LCBzbyBpdCBjYW4gb25seSBiZSB1c2VkIGluXG4mIzQzOyAqIHNsZWVwYWJsZSBCUEYgcHJvZ3JhbXMgKFNZU0NBTEwpLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXG4mIzQzO1x0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcbiYjNDM7XHRcdFx0ICAgICAgIHUzMiBvcHRzX19zeilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHIgPSB7fTtcbiYjNDM7XHRpbnQgYWRkcmxlbjtcbiYjNDM7XG4mIzQzO1x0aWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1xuJiM0MztcdGFkZHJsZW4gPSBicGZfa3NvY2tfZ2V0X2FkZHIob3B0cywgb3B0c19fc3osIFx1MDAyNmFkZHIpO1xuJiM0MztcdGlmIChhZGRybGVuIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGFkZHJsZW47XG4mIzQzO1xuJiM0MztcdHJldHVybiBfX3N5c19iaW5kX3NvY2tldChrcy1cdTAwM2Vzb2NrLCBcdTAwMjZhZGRyLCBhZGRybGVuKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9rc29ja19jb25uZWN0KCkgLSBDb25uZWN0IGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSByZW1vdGUgYWRkcmVzcy5cbiYjNDM7ICogQGtzOlx0XHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dC5cbiYjNDM7ICogQG9wdHM6XHRQb2ludGVyIHRvIHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHdpdGggcmVtb3RlIGFkZHJlc3MuXG4mIzQzOyAqIEBvcHRzX19zejpcdFNpemUgb2YgdGhlIG9wdHMgc3RydWN0LlxuJiM0MzsgKlxuJiM0MzsgKiBDb25uZWN0cyB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGFkZHJlc3MgYW5kIHBvcnQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIHdoaWxlIGNvbm5lY3RpbmcgdGhlIHNvY2tldCwgc28gaXQgY2FuIG9ubHkgYmUgdXNlZFxuJiM0MzsgKiBpbiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19jb25uZWN0KHN0cnVjdCBicGZfa3NvY2sgKmtzLFxuJiM0MztcdFx0XHRcdCAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsXG4mIzQzO1x0XHRcdFx0ICB1MzIgb3B0c19fc3opXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyID0ge307XG4mIzQzO1x0aW50IGFkZHJsZW47XG4mIzQzO1xuJiM0MztcdGlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRhZGRybGVuID0gYnBmX2tzb2NrX2dldF9hZGRyKG9wdHMsIG9wdHNfX3N6LCBcdTAwMjZhZGRyKTtcbiYjNDM7XHRpZiAoYWRkcmxlbiBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiBhZGRybGVuO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoa3MtXHUwMDNlc29jaywgXHUwMDI2YWRkciwgYWRkcmxlbiwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfa3NvY2tfYWNxdWlyZSgpIC0gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byBhIEJQRiBrZXJuZWwgc29ja2V0LlxuJiM0MzsgKiBAa3M6XHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byBhY3F1aXJlLiBNdXN0IGJlIGFcbiYjNDM7ICpcdHRydXN0ZWQgcG9pbnRlciAoZS5nLiBSQ1UtcHJvdGVjdGVkIGtwdHIgZnJvbSBhIG1hcCkuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBhY3F1aXJlZCBjb250ZXh0IG11c3QgZWl0aGVyIGJlIHN0b3JlZCBpbiBhIG1hcCBhcyBhIGtwdHIsIG9yXG4mIzQzOyAqIGZyZWVkIHdpdGggYnBmX2tzb2NrX3JlbGVhc2UoKS5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHN0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19hY3F1aXJlKHN0cnVjdCBicGZfa3NvY2sgKmtzKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFyZWZjb3VudF9pbmNfbm90X3plcm8oXHUwMDI2a3MtXHUwMDNldXNhZ2UpKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0cmV0dXJuIGtzO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2tzb2NrX3JlbGVhc2UoKSAtIFJlbGVhc2UgYSBCUEYga2VybmVsIHNvY2tldC5cbiYjNDM7ICogQGtzOlx0VGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQgdG8gcmVsZWFzZS5cbiYjNDM7ICpcbiYjNDM7ICogV2hlbiB0aGUgZmluYWwgcmVmZXJlbmNlIGlzIHJlbGVhc2VkLCB0aGUgc29ja2V0IGlzIGNsZWFuZWQgdXAgdmlhXG4mIzQzOyAqIHF1ZXVlX3JjdV93b3JrKCkgKHNpbmNlIHNvY2tfcmVsZWFzZSBtYXkgc2xlZXApLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcylcbiYjNDM7e1xuJiM0MztcdGlmIChyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2a3MtXHUwMDNldXNhZ2UpKSB7XG4mIzQzO1x0XHRJTklUX1JDVV9XT1JLKFx1MDAyNmtzLVx1MDAzZXJ3b3JrLCBrc29ja19yZWxlYXNlX3dvcmtfZm4pO1xuJiM0MztcdFx0cXVldWVfcmN1X3dvcmsoc3lzdGVtX2RmbF93cSwgXHUwMDI2a3MtXHUwMDNlcndvcmspO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfa3NvY2tfcmVsZWFzZV9kdG9yKHZvaWQgKmtzKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuJiM0Mzt9XG4mIzQzO0NGSV9OT1NFQUwoYnBmX2tzb2NrX3JlbGVhc2VfZHRvcik7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2tzb2NrX3NlbmQoKSAtIFNlbmQgZGF0YSB0aHJvdWdoIGEgQlBGIGtlcm5lbCBzb2NrZXQuXG4mIzQzOyAqIEBrczpcdFx0VGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQuIE11c3QgYmUgYW4gYWNxdWlyZWQgcmVmZXJlbmNlLlxuJiM0MzsgKiBAZGF0YTpcdFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gc2VuZC5cbiYjNDM7ICogQGRhdGFfX3N6Olx0U2l6ZSBvZiB0aGUgZGF0YSB0byBzZW5kIChtYXggNjU1MzUgYnl0ZXMpLlxuJiM0MzsgKlxuJiM0MzsgKiBTZW5kcyBkYXRhIG9uIGEgY29ubmVjdGVkIHNvY2tldCwgYmVzdC1lZmZvcnQgYW5kIG5vbmJsb2NraW5nLiBUaGlzIG1heSBzbGVlcFxuJiM0MzsgKiAoa2VybmVsX3NlbmRtc2cpLCBzbyBpdCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBzbGVlcGFibGUgQlBGIHByb2dyYW1zLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IE51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19zZW5kKHN0cnVjdCBicGZfa3NvY2sgKmtzLCBjb25zdCB2b2lkICpkYXRhLFxuJiM0MztcdFx0XHQgICAgICAgdTMyIGRhdGFfX3N6KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkIGd1YXJkO1xuJiM0MztcdHN0cnVjdCBtc2doZHIgbXNnID0ge1xuJiM0MztcdFx0Lm1zZ19mbGFncyA9IE1TR19ET05UV0FJVCxcbiYjNDM7XHR9O1xuJiM0MztcdHN0cnVjdCBrdmVjIGlvdiA9IHtcbiYjNDM7XHRcdC5pb3ZfYmFzZSA9ICh2b2lkICopZGF0YSxcbiYjNDM7XHRcdC5pb3ZfbGVuID0gZGF0YV9fc3osXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0LyogRWFybHkgY2hlY2sgZm9yIFVEUC4gRXhhY3QgbGltaXRzIGVuZm9yY2VkIGJ5IGtlcm5lbF9zZW5kbXNnKCkuICovXG4mIzQzO1x0aWYgKGRhdGFfX3N6IFx1MDAzZSBJUF9NQVhfTVRVKVxuJiM0MztcdFx0cmV0dXJuIC1FTVNHU0laRTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFicGZfa3NvY2tfc2VuZF9lbnRlcihcdTAwMjZndWFyZCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBrZXJuZWxfc2VuZG1zZyhrcy1cdTAwM2Vzb2NrLCBcdTAwMjZtc2csIFx1MDAyNmlvdiwgMSwgZGF0YV9fc3opO1xuJiM0MztcdGJwZl9rc29ja19zZW5kX2V4aXQoXHUwMDI2Z3VhcmQpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuJiM0MztcbiYjNDM7QlRGX0tGVU5DU19TVEFSVChrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfY3JlYXRlLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9TTEVFUEFCTEUpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfYmluZCwgS0ZfU0xFRVBBQkxFKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2Nvbm5lY3QsIEtGX1NMRUVQQUJMRSlcbiYjNDM7QlRGX0tGVU5DU19FTkQoa3NvY2tfaW5pdF9rZnVuY19idGZfaWRzKVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGtzb2NrX2luaXRfa2Z1bmNfc2V0ID0ge1xuJiM0MztcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuJiM0MztcdC5zZXQgPSBcdTAwMjZrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMsXG4mIzQzO307XG4mIzQzO1xuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGtzb2NrX2tmdW5jX2J0Zl9pZHMpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfcmVsZWFzZSwgS0ZfUkVMRUFTRSlcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19hY3F1aXJlLCBLRl9BQ1FVSVJFIHwgS0ZfUkNVIHwgS0ZfUkVUX05VTEwpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfc2VuZCwgS0ZfU0xFRVBBQkxFKVxuJiM0MztCVEZfS0ZVTkNTX0VORChrc29ja19rZnVuY19idGZfaWRzKVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBicGZfa3NvY2tfa2Z1bmNfZmlsdGVyKGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdTMyIGtmdW5jX2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFidGZfaWRfc2V0OF9jb250YWlucyhcdTAwMjZrc29ja19rZnVuY19idGZfaWRzLCBrZnVuY19pZCkgfHxcbiYjNDM7XHQgICAgcHJvZy1cdTAwM2V0eXBlID09IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCB8fFxuJiM0MztcdCAgICBwcm9nLVx1MDAzZXR5cGUgPT0gQlBGX1BST0dfVFlQRV9MU00pXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIC1FQUNDRVM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBrc29ja19rZnVuY19zZXQgPSB7XG4mIzQzO1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4mIzQzO1x0LnNldCA9IFx1MDAyNmtzb2NrX2tmdW5jX2J0Zl9pZHMsXG4mIzQzO1x0LmZpbHRlciA9IGJwZl9rc29ja19rZnVuY19maWx0ZXIsXG4mIzQzO307XG4mIzQzO1xuJiM0MztCVEZfSURfTElTVChicGZfa3NvY2tfZHRvcl9pZHMpXG4mIzQzO0JURl9JRChzdHJ1Y3QsIGJwZl9rc29jaylcbiYjNDM7QlRGX0lEKGZ1bmMsIGJwZl9rc29ja19yZWxlYXNlX2R0b3IpXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBicGZfa3NvY2tfa2Z1bmNfaW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgYnRmX2lkX2R0b3Jfa2Z1bmMgYnBmX2tzb2NrX2R0b3JzW10gPSB7XG4mIzQzO1x0XHR7XG4mIzQzO1x0XHRcdC5idGZfaWQgPSBicGZfa3NvY2tfZHRvcl9pZHNbMF0sXG4mIzQzO1x0XHRcdC5rZnVuY19idGZfaWQgPSBicGZfa3NvY2tfZHRvcl9pZHNbMV0sXG4mIzQzO1x0XHR9LFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoXHUwMDI2YnBmX2tzb2NrX25ldF9vcHMpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcbiYjNDM7XHRcdFx0XHRcdFx1MDAyNmtzb2NrX2luaXRfa2Z1bmNfc2V0KTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHR1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoXHUwMDI2YnBmX2tzb2NrX25ldF9vcHMpO1xuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuJiM0MztcdFx0XHRcdFx0XHUwMDI2a3NvY2tfa2Z1bmNfc2V0KTtcbiYjNDM7XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xTTSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBcdTAwMjZrc29ja19rZnVuY19zZXQpO1xuJiM0MztcdHJldHVybiByZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGJwZl9rc29ja19kdG9ycyxcbiYjNDM7XHRcdFx0XHRcdFx0IEFSUkFZX1NJWkUoYnBmX2tzb2NrX2R0b3JzKSxcbiYjNDM7XHRcdFx0XHRcdFx0IFRISVNfTU9EVUxFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfa3NvY2tfa2Z1bmNfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMgYi9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuY1xuaW5kZXggYjUwODYxOGJmYzEyMzkuLmQyMjFhMTgwYzg3NzA1IDEwMDY0NFxuLS0tIGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jXG5AQCAtNyw2ICYjNDM7Nyw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsdGVyLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnBmX2tzb2NrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3lzY3RsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuQEAgLTUyNSw2ICYjNDM7NTI2LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5ldF9jb3JlX3RhYmxlW10gPSB7XG4gXHRcdC5leHRyYTFcdFx0PSBTWVNDVExfTE9OR19PTkUsXG4gXHRcdC5leHRyYTJcdFx0PSBcdTAwMjZicGZfaml0X2xpbWl0X21heCxcbiBcdH0sXG4mIzQzOyNlbmRpZlxuJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NZU0NBTEwpIFx1MDAyNlx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19JTkVUKVxuJiM0MztcdHtcbiYjNDM7XHRcdC5wcm9jbmFtZVx0PSBcJiMzNDticGZfa3NvY2tfbWF4XCYjMzQ7LFxuJiM0MztcdFx0LmRhdGFcdFx0PSBcdTAwMjZzeXNjdGxfYnBmX2tzb2NrX21heCxcbiYjNDM7XHRcdC5tYXhsZW5cdFx0PSBzaXplb2YoaW50KSxcbiYjNDM7XHRcdC5tb2RlXHRcdD0gMDY0NCxcbiYjNDM7XHRcdC5wcm9jX2hhbmRsZXJcdD0gcHJvY19kb2ludHZlY19taW5tYXgsXG4mIzQzO1x0XHQuZXh0cmExXHRcdD0gU1lTQ1RMX1pFUk8sXG4mIzQzO1x0fSxcbiAjZW5kaWZcbiBcdHtcbiBcdFx0LnByb2NuYW1lXHQ9IFwmIzM0O25ldGRldl90c3RhbXBfcHJlcXVldWVcJiMzNDssXG5kaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jXG5pbmRleCA2M2M2OWEwZmE3NGUxZS4uYzc0MjdkZDRkZDUyM2QgMTAwNjQ0XG4tLS0gYS9uZXQvc29ja2V0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zb2NrZXQuY1xuQEAgLTIxMTUsMjcgJiM0MzsyMTE1LDMxIEBAIFNZU0NBTExfREVGSU5FMyhhY2NlcHQsIGludCwgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgdXBlZXJfc29ja2FkZHIsXG4gICpcdGluY2x1ZGUgdGhlIC1FSU5QUk9HUkVTUyBzdGF0dXMgZm9yIHN1Y2ggc29ja2V0cy5cbiAgKi9cbiBcbiYjNDM7aW50IF9fc3lzX2Nvbm5lY3Rfc29ja2V0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxuJiM0MztcdFx0XHQgaW50IGFkZHJsZW4sIGludCBmbGFncylcbiYjNDM7e1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIFJFQURfT05DRShzb2NrLVx1MDAzZW9wcyktXHUwMDNlY29ubmVjdChzb2NrLFxuJiM0MztcdFx0XHRcdCAgICAoc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKilhZGRyZXNzLFxuJiM0MztcdFx0XHRcdCAgICBhZGRybGVuLCBmbGFncyk7XG4mIzQzO31cbiYjNDM7XG4gaW50IF9fc3lzX2Nvbm5lY3RfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHJlc3MsXG4gXHRcdCAgICAgICBpbnQgYWRkcmxlbiwgaW50IGZpbGVfZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHNvY2tldCAqc29jaztcbi1cdGludCBlcnI7XG4gXG4gXHRzb2NrID0gc29ja19mcm9tX2ZpbGUoZmlsZSk7XG4tXHRpZiAoIXNvY2spIHtcbi1cdFx0ZXJyID0gLUVOT1RTT0NLO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGVyciA9XG4tXHQgICAgc2VjdXJpdHlfc29ja2V0X2Nvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsIGFkZHJsZW4pO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFzb2NrKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9UU09DSztcbiBcbi1cdGVyciA9IFJFQURfT05DRShzb2NrLVx1MDAzZW9wcyktXHUwMDNlY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKilhZGRyZXNzLFxuLVx0XHRcdFx0XHQgICAgYWRkcmxlbiwgc29jay1cdTAwM2VmaWxlLVx1MDAzZWZfZmxhZ3MgfCBmaWxlX2ZsYWdzKTtcbi1vdXQ6XG4tXHRyZXR1cm4gZXJyO1xuJiM0MztcdHJldHVybiBfX3N5c19jb25uZWN0X3NvY2tldChzb2NrLCBhZGRyZXNzLCBhZGRybGVuLFxuJiM0MztcdFx0XHRcdCAgICBzb2NrLVx1MDAzZWZpbGUtXHUwMDNlZl9mbGFncyB8IGZpbGVfZmxhZ3MpO1xuIH1cbiBcbiBpbnQgX19zeXNfY29ubmVjdChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzZXJ2YWRkciwgaW50IGFkZHJsZW4pXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOGIxNGZkOThkNDEwZWRcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcbkBAIC0wLDAgJiM0MzsxLDIzOSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NhcnBhL2luZXQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dGVzdF9wcm9ncy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O25ldHdvcmtfaGVscGVycy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzb2NrX2Jhc2ljLnNrZWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc29ja19yZWN1cnNpb24uc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIE5TX1RFU1QgXCYjMzQ7a3NvY2tfYmFzaWNfbnNcJiMzNDtcbiYjNDM7I2RlZmluZSBOU19MU01fUkVDVVJTSU9OX1RFU1QgXCYjMzQ7a3NvY2tfbHNtX3JlY3Vyc2lvbl9uc1wmIzM0O1xuJiM0MzsjZGVmaW5lIExPT1BCQUNLX0lQIFwmIzM0OzEyNy4wLjAuMVwmIzM0O1xuJiM0MzsjZGVmaW5lIFJFQ1ZfUE9SVCA3Nzc3XG4mIzQzOyNkZWZpbmUgUkVDVl9USU1FT1VUX1NFQyA1XG4mIzQzO1xuJiM0MztzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYge1xuJiM0MztcdGNvbnN0IGNoYXIgKm5ldG5zO1xuJiM0MztcdGJvb2wgbmV0bnNfY3JlYXRlZDtcbiYjNDM7XHRzdHJ1Y3QgbnN0b2tlbiAqbnN0b2tlbjtcbiYjNDM7XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjtcbiYjNDM7XHRpbnQgcmZkO1xuJiM0MztcdGNoYXIgYnVmWzMyXTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGtzb2NrX3Rlc3RfZW52X3NldHVwKHN0cnVjdCBrc29ja190ZXN0X2VudiAqZW52LCBjb25zdCBjaGFyICpuZXRucylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aW1ldmFsIHR2O1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdG1lbXNldChlbnYsIDAsIHNpemVvZigqZW52KSk7XG4mIzQzO1x0ZW52LVx1MDAzZW5ldG5zID0gbmV0bnM7XG4mIzQzO1x0ZW52LVx1MDAzZXJmZCA9IC0xO1xuJiM0MztcbiYjNDM7XHRTWVMoZmFpbCwgXCYjMzQ7aXAgbmV0bnMgYWRkICVzXCYjMzQ7LCBuZXRucyk7XG4mIzQzO1x0ZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQgPSB0cnVlO1xuJiM0MztcdFNZUyhmYWlsLCBcJiMzNDtpcCAtbmV0ICVzIGxpbmsgc2V0IGxvIHVwXCYjMzQ7LCBuZXRucyk7XG4mIzQzO1xuJiM0MztcdGVudi1cdTAwM2Vuc3Rva2VuID0gb3Blbl9uZXRucyhuZXRucyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGVudi1cdTAwM2Vuc3Rva2VuLCBcJiMzNDtvcGVuX25ldG5zXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0ZW52LVx1MDAzZXJmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZW52LVx1MDAzZXJmZCwgXCYjMzQ7cmVjZWl2ZXIgc29ja2V0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0ZW52LVx1MDAzZWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7XG4mIzQzO1x0ZW52LVx1MDAzZWFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTtcbiYjNDM7XHRlbnYtXHUwMDNlYWRkci5zaW5fcG9ydCA9IGh0b25zKFJFQ1ZfUE9SVCk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJpbmQoZW52LVx1MDAzZXJmZCwgKHN0cnVjdCBzb2NrYWRkciAqKVx1MDAyNmVudi1cdTAwM2VhZGRyLCBzaXplb2YoZW52LVx1MDAzZWFkZHIpKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2JpbmQgcmVjZWl2ZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHR0di50dl9zZWMgPSBSRUNWX1RJTUVPVVRfU0VDO1xuJiM0MztcdHR2LnR2X3VzZWMgPSAwO1xuJiM0MztcdGVyciA9IHNldHNvY2tvcHQoZW52LVx1MDAzZXJmZCwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sIFx1MDAyNnR2LCBzaXplb2YodHYpKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldCByY3Z0aW1lb1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0MztcbiYjNDM7ZmFpbDpcbiYjNDM7XHRpZiAoZW52LVx1MDAzZXJmZCBcdTAwM2U9IDApIHtcbiYjNDM7XHRcdGNsb3NlKGVudi1cdTAwM2VyZmQpO1xuJiM0MztcdFx0ZW52LVx1MDAzZXJmZCA9IC0xO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoZW52LVx1MDAzZW5zdG9rZW4pIHtcbiYjNDM7XHRcdGNsb3NlX25ldG5zKGVudi1cdTAwM2Vuc3Rva2VuKTtcbiYjNDM7XHRcdGVudi1cdTAwM2Vuc3Rva2VuID0gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGVudi1cdTAwM2VuZXRuc19jcmVhdGVkKSB7XG4mIzQzO1x0XHRTWVNfTk9GQUlMKFwmIzM0O2lwIG5ldG5zIGRlbCAlcyBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjFcJiMzNDssIG5ldG5zKTtcbiYjNDM7XHRcdGVudi1cdTAwM2VuZXRuc19jcmVhdGVkID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQga3NvY2tfdGVzdF9lbnZfY2xlYW51cChzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudilcbiYjNDM7e1xuJiM0MztcdGlmIChlbnYtXHUwMDNlcmZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGVudi1cdTAwM2VyZmQpO1xuJiM0MztcdGlmIChlbnYtXHUwMDNlbnN0b2tlbilcbiYjNDM7XHRcdGNsb3NlX25ldG5zKGVudi1cdTAwM2Vuc3Rva2VuKTtcbiYjNDM7XHRpZiAoZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQpIHtcbiYjNDM7XHRcdFNZU19OT0ZBSUwoXCYjMzQ7aXAgbmV0bnMgZGVsICVzIFx1MDAzZS9kZXYvbnVsbCAyXHUwMDNlXHUwMDI2MVwmIzM0OywgZW52LVx1MDAzZW5ldG5zKTtcbiYjNDM7XHRcdGVudi1cdTAwM2VuZXRuc19jcmVhdGVkID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBrc29ja19hc3NlcnRfcmVjdihzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudiwgY29uc3QgY2hhciAqZGF0YSxcbiYjNDM7XHRcdFx0ICAgICAgc2l6ZV90IGRhdGFfc3opXG4mIzQzO3tcbiYjNDM7XHRzc2l6ZV90IG47XG4mIzQzO1xuJiM0MztcdG1lbXNldChlbnYtXHUwMDNlYnVmLCAwLCBzaXplb2YoZW52LVx1MDAzZWJ1ZikpO1xuJiM0MztcdG4gPSByZWN2ZnJvbShlbnYtXHUwMDNlcmZkLCBlbnYtXHUwMDNlYnVmLCBzaXplb2YoZW52LVx1MDAzZWJ1ZiksIDAsIE5VTEwsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKG4sIGRhdGFfc3osIFwmIzM0O3JlY3Zmcm9tIGxlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0QVNTRVJUX01FTUVRKGVudi1cdTAwM2VidWYsIGRhdGEsIGRhdGFfc3osIFwmIzM0O3BheWxvYWQgbWF0Y2hcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBrc29ja19zZXR1cF9jdHgoc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nLCBfX2JlMzIgKmlwdjRfcmVtb3RlLFxuJiM0MztcdFx0XHQgICAgX191MTYgKnJlbW90ZV9wb3J0KVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuJiM0MztcdGludCBlcnIsIHBmZDtcbiYjNDM7XG4mIzQzO1x0KmlwdjRfcmVtb3RlID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTtcbiYjNDM7XHQqcmVtb3RlX3BvcnQgPSBSRUNWX1BPUlQ7XG4mIzQzO1xuJiM0MztcdHBmZCA9IGJwZl9wcm9ncmFtX19mZChwcm9nKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChwZmQsIFwmIzM0O2tzb2NrX3NldHVwIGZkXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwZmQsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7a3NvY2tfc2V0dXAgcnVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhvcHRzLnJldHZhbCwgXCYjMzQ7a3NvY2tfc2V0dXAgcmV0dmFsXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9rc29ja19iYXNpYyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuJiM0MztcdHN0cnVjdCBrc29ja190ZXN0X2VudiBlbnY7XG4mIzQzO1x0c3RydWN0IGtzb2NrX2Jhc2ljICpza2VsO1xuJiM0MztcdGludCBlcnIsIHBmZDtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGtzb2NrX2Jhc2ljX19vcGVuKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O3NrZWwgb3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IGtzb2NrX2Jhc2ljX19sb2FkKHNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2tlbCBsb2FkXCYjMzQ7KSkge1xuJiM0MztcdFx0a3NvY2tfYmFzaWNfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIWtzb2NrX3Rlc3RfZW52X3NldHVwKFx1MDAyNmVudiwgTlNfVEVTVCkpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgMTogUnVuIHRoZSBzZXR1cCBTWVNDQUxMIHByb2cgdG8gY3JlYXRlIGtzb2NrICovXG4mIzQzO1x0aWYgKCFrc29ja19zZXR1cF9jdHgoc2tlbC1cdTAwM2Vwcm9ncy5rc29ja19zZXR1cCxcbiYjNDM7XHRcdFx0ICAgICBcdTAwMjZza2VsLVx1MDAzZWJzcy1cdTAwM2VpcHY0X3JlbW90ZSxcbiYjNDM7XHRcdFx0ICAgICBcdTAwMjZza2VsLVx1MDAzZWJzcy1cdTAwM2VyZW1vdGVfcG9ydCkpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgMjogUnVuIHRoZSBzZW5kIFNZU0NBTEwgcHJvZyAqL1xuJiM0MztcdHBmZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLmtzb2NrX3NlbmQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKHBmZCwgXCYjMzQ7a3NvY2tfc2VuZCBmZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocGZkLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2tzb2NrX3NlbmQgcnVuXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShvcHRzLnJldHZhbCxcbiYjNDM7XHRcdCAgICAgICBzaXplb2Yoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSksIFwmIzM0O3NlbmRtc2cgYnl0ZXNcJiMzNDspKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBTdGVwIDM6IFJlY2VpdmUgYW5kIHZlcmlmeSB0aGUgZGF0YSAqL1xuJiM0MztcdGtzb2NrX2Fzc2VydF9yZWN2KFx1MDAyNmVudiwgc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSxcbiYjNDM7XHRcdFx0ICBzaXplb2Yoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSkpO1xuJiM0MztcbiYjNDM7ZmFpbDpcbiYjNDM7XHRrc29ja190ZXN0X2Vudl9jbGVhbnVwKFx1MDAyNmVudik7XG4mIzQzO1x0a3NvY2tfYmFzaWNfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9rc29ja19sc21fcmVjdXJzaW9uKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgZW52O1xuJiM0MztcdHN0cnVjdCBrc29ja19yZWN1cnNpb24gKnNrZWw7XG4mIzQzO1x0Y2hhciB0cmlnZ2VyID0gJiMzOTt4JiMzOTs7XG4mIzQzO1x0aW50IHRmZCA9IC0xO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1x0c3NpemVfdCBuO1xuJiM0MztcbiYjNDM7XHRza2VsID0ga3NvY2tfcmVjdXJzaW9uX19vcGVuKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O3NrZWwgb3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IGtzb2NrX3JlY3Vyc2lvbl9fbG9hZChza2VsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NrZWwgbG9hZFwmIzM0OykpIHtcbiYjNDM7XHRcdGtzb2NrX3JlY3Vyc2lvbl9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoXHUwMDI2ZW52LCBOU19MU01fUkVDVVJTSU9OX1RFU1QpKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBTdGVwIDE6IFJ1biB0aGUgc2V0dXAgU1lTQ0FMTCBwcm9nIHRvIGNyZWF0ZSB0aGUga3NvY2sgKi9cbiYjNDM7XHRpZiAoIWtzb2NrX3NldHVwX2N0eChza2VsLVx1MDAzZXByb2dzLmtzb2NrX3NldHVwLFxuJiM0MztcdFx0XHQgICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZWlwdjRfcmVtb3RlLFxuJiM0MztcdFx0XHQgICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlbW90ZV9wb3J0KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0LyogU3RlcCAyOiBBdHRhY2ggTFNNIHByb2cgYW5kIHRyaWdnZXIgc29ja2V0X3NlbmRtc2cgZnJvbSB1c2Vyc3BhY2UgKi9cbiYjNDM7XHRza2VsLVx1MDAzZWxpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnID1cbiYjNDM7XHRcdGJwZl9wcm9ncmFtX19hdHRhY2hfbHNtKHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfc29ja2V0X3NlbmRtc2cpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLVx1MDAzZWxpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnLFxuJiM0MztcdFx0XHQgICBcJiMzNDthdHRhY2ggc29ja2V0X3NlbmRtc2cgbHNtXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0dGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRCh0ZmQsIFwmIzM0O3RyaWdnZXIgc29ja2V0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X3BpZCA9IGdldHBpZCgpO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRyaWdnZXJfc2VuZCA9IDE7XG4mIzQzO1x0biA9IHNlbmR0byh0ZmQsIFx1MDAyNnRyaWdnZXIsIHNpemVvZih0cmlnZ2VyKSwgMCxcbiYjNDM7XHRcdCAgIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZlbnYuYWRkciwgc2l6ZW9mKGVudi5hZGRyKSk7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X3BpZCA9IDA7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldHJpZ2dlcl9zZW5kID0gMDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShuLCBzaXplb2YodHJpZ2dlciksIFwmIzM0O3RyaWdnZXIgc2VuZHRvXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0LyogU3RlcCAzOiBUaGUgbmVzdGVkIGJwZl9rc29ja19zZW5kKCkgbXVzdCBoaXQgdGhlIHJlY3Vyc2lvbiBndWFyZCAqL1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY19jb3VudCwgMixcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtzb2NrZXRfc2VuZG1zZyByZWN1cnNpb24gY291bnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlZGF0YS1cdTAwM2VyZWNfa2Z1bmNfcmV0c1swXSwgLUVCVVNZLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3JlY3Vyc2l2ZSBzZW5kIHN0YXR1c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXJlY19rZnVuY19yZXRzWzFdLFxuJiM0MztcdFx0ICAgICAgIHNpemVvZihza2VsLVx1MDAzZWRhdGEtXHUwMDNlc2VuZF9kYXRhKSwgXCYjMzQ7b3V0ZXIgc2VuZCBieXRlc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdGtzb2NrX2Fzc2VydF9yZWN2KFx1MDAyNmVudiwgc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSxcbiYjNDM7XHRcdFx0ICBzaXplb2Yoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSkpO1xuJiM0MztcbiYjNDM7ZmFpbDpcbiYjNDM7XHRpZiAodGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKHRmZCk7XG4mIzQzO1x0a3NvY2tfdGVzdF9lbnZfY2xlYW51cChcdTAwMjZlbnYpO1xuJiM0MztcdGtzb2NrX3JlY3Vyc2lvbl9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3F1b3RhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja19xdW90YS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmM4NmQ5YjBhOTUxM2U4XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja19xdW90YS5jXG5AQCAtMCwwICYjNDM7MSwxMzkgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dGVzdF9wcm9ncy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O25ldHdvcmtfaGVscGVycy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3N5c2N0bF9oZWxwZXJzLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NvY2tfcXVvdGEuc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIE5TX05FVF9RVU9UQV9URVNUMSBcJiMzNDtrc29ja19uZXRfcXVvdGFfbnMxXCYjMzQ7XG4mIzQzOyNkZWZpbmUgTlNfTkVUX1FVT1RBX1RFU1QyIFwmIzM0O2tzb2NrX25ldF9xdW90YV9uczJcJiMzNDtcbiYjNDM7I2RlZmluZSBLU09DS19NQVhfU1lTQ1RMIFwmIzM0Oy9wcm9jL3N5cy9uZXQvY29yZS9icGZfa3NvY2tfbWF4XCYjMzQ7XG4mIzQzOyNkZWZpbmUgS1NPQ0tfUVVPVEFfTlNfU0xPVFMgM1xuJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TMV9PRkZTRVQgMFxuJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQgS1NPQ0tfUVVPVEFfTlNfU0xPVFNcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQga3NvY2tfcnVuX3Byb2coc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHByb2cpLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHRyZXR1cm4gb3B0cy5yZXR2YWw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX3U2NCBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChzdHJ1Y3Qga3NvY2tfcXVvdGEgKnNrZWwpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gX19hdG9taWNfbG9hZF9uKFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3JlbGVhc2VfY29tcGxldGVkLFxuJiM0MztcdFx0XHQgICAgICAgX19BVE9NSUNfQUNRVUlSRSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQga3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhzdHJ1Y3Qga3NvY2tfcXVvdGEgKnNrZWwsIGludCBzbG90X29mZnNldClcbiYjNDM7e1xuJiM0MztcdF9fdTY0IGNvbXBsZXRlZDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRjb21wbGV0ZWQgPSBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKTtcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9zbG90X29mZnNldCA9IHNsb3Rfb2Zmc2V0O1xuJiM0MztcdGVyciA9IGtzb2NrX3J1bl9wcm9nKHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfcXVvdGFfcmVsZWFzZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtrc29ja19xdW90YV9yZWxlYXNlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGtzb2NrX3F1b3RhX3JlbGVhc2VfY29tcGxldGVkKHNrZWwpIC0gY29tcGxldGVkIFx1MDAzY1xuJiM0MztcdCAgICAgICBza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9yZWxlYXNlZClcbiYjNDM7XHRcdHVzbGVlcCgxMDAwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3JlbGVhc2VkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBrc29ja19leHBlY3RfcXVvdGEoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgc2xvdF9vZmZzZXQsXG4mIzQzO1x0XHRcdCAgICAgICBjb25zdCBjaGFyICpuYW1lKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNlcXVvdGFfc2xvdF9vZmZzZXQgPSBzbG90X29mZnNldDtcbiYjNDM7XHRlcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLVx1MDAzZXByb2dzLmtzb2NrX3F1b3RhX2NyZWF0ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBuYW1lKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9jcmVhdGVkLCAyLCBuYW1lKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRyZXR1cm4gQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX2VyciwgLUVOT1NQQywgbmFtZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHJlY29yZF9jdXJyZW50X25zKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCwgaW50IHRhcmdldClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzdGF0IHN0O1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IHN0YXQoXCYjMzQ7L3Byb2Mvc2VsZi9ucy9uZXRcJiMzNDssIFx1MDAyNnN0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3N0YXQgbmV0bnNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9uZXRuc19pbnVtW3RhcmdldF0gPSAoX191MzIpc3Quc3RfaW5vO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2tzb2NrX25ldF9xdW90YSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBvbGRfbWF4WzE2XSA9IHt9O1xuJiM0MztcdHN0cnVjdCBuZXRuc19vYmogKm5ldG5zMSA9IE5VTEwsICpuZXRuczIgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBrc29ja19xdW90YSAqc2tlbDtcbiYjNDM7XHRpbnQgcmVsZWFzZWQ7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBrc29ja19xdW90YV9fb3Blbl9hbmRfbG9hZCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtrc29jayBxdW90YSBza2VsZXRvblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZW50ZXIgPVxuJiM0MztcdFx0YnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLVx1MDAzZXByb2dzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlcik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtXHUwMDNlbGlua3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyLFxuJiM0MztcdFx0XHQgICBcJiMzNDthdHRhY2gga3NvY2sgcmVsZWFzZSB3b3JrIGVudHJ5XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdHNrZWwtXHUwMDNlbGlua3Mua3NvY2tfcmVsZWFzZV93b3JrX2V4aXQgPVxuJiM0MztcdFx0YnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLVx1MDAzZXByb2dzLmtzb2NrX3JlbGVhc2Vfd29ya19leGl0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCxcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7YXR0YWNoIGtzb2NrIHJlbGVhc2Ugd29yayBleGl0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoc3lzY3RsX3NldF9vcl9mYWlsKEtTT0NLX01BWF9TWVNDVEwsIG9sZF9tYXgsIFwmIzM0OzJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdG5ldG5zMSA9IG5ldG5zX25ldyhOU19ORVRfUVVPVEFfVEVTVDEsIHRydWUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihuZXRuczEsIFwmIzM0O2NyZWF0ZSBmaXJzdCBuZXRuc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIXJlY29yZF9jdXJyZW50X25zKHNrZWwsIDApKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICgha3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMV9PRkZTRVQsXG4mIzQzO1x0XHRcdFx0XCYjMzQ7Zmlyc3QgbmV0bnMgcXVvdGFcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBob3N0LXdpZGUgc2V0dGluZyBncmFudHMgdGhlIGZ1bGwgYWxsb3dhbmNlIHRvIGVhY2ggbmV0bnMuICovXG4mIzQzO1x0bmV0bnMyID0gbmV0bnNfbmV3KE5TX05FVF9RVU9UQV9URVNUMiwgdHJ1ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMiwgXCYjMzQ7Y3JlYXRlIHNlY29uZCBuZXRuc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIXJlY29yZF9jdXJyZW50X25zKHNrZWwsIDEpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICgha3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQsXG4mIzQzO1x0XHRcdFx0XCYjMzQ7c2Vjb25kIG5ldG5zIHF1b3RhXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRyZWxlYXNlZCA9IGtzb2NrX3JlbGVhc2VfcXVvdGFfc2xvdHMoc2tlbCwgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEocmVsZWFzZWQsIDIsIFwmIzM0O3NlY29uZCBuZXRucyBxdW90YSByZWxlYXNlZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0LyogQm90aCByZWxlYXNlZCBzbG90cyBtdXN0IGJlY29tZSBhdmFpbGFibGUgYWdhaW4uICovXG4mIzQzO1x0a3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQsIFwmIzM0O3JlY292ZXJlZCBxdW90YVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0a3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTtcbiYjNDM7XHRrc29ja19yZWxlYXNlX3F1b3RhX3Nsb3RzKHNrZWwsIEtTT0NLX1FVT1RBX05TMV9PRkZTRVQpO1xuJiM0MztcdG5ldG5zX2ZyZWUobmV0bnMyKTtcbiYjNDM7XHRuZXRuc19mcmVlKG5ldG5zMSk7XG4mIzQzO1x0aWYgKG9sZF9tYXhbMF0pXG4mIzQzO1x0XHRzeXNjdGxfc2V0X29yX2ZhaWwoS1NPQ0tfTUFYX1NZU0NUTCwgTlVMTCwgb2xkX21heCk7XG4mIzQzO1x0a3NvY2tfcXVvdGFfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja193cS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xODRiMTM0ZjM4MjM3MFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuY1xuQEAgLTAsMCAmIzQzOzEsMzQgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3Rlc3RfcHJvZ3MuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc29ja193cS5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9rc29ja193cSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuJiM0MztcdHN0cnVjdCBrc29ja193cSAqc2tlbDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRza2VsID0ga3NvY2tfd3FfX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7a3NvY2tfd3Egb3BlbiBhbmQgbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfd3Ffc3RhcnQpLFxuJiM0MztcdFx0XHRcdCAgICAgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtydW4ga3NvY2tfd3Ffc3RhcnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0sob3B0cy5yZXR2YWwsIFwmIzM0O2tzb2NrX3dxX3N0YXJ0IHJldHZhbFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFfX2F0b21pY19sb2FkX24oXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNlY2FsbGJhY2tfZG9uZSwgX19BVE9NSUNfQUNRVUlSRSkpXG4mIzQzO1x0XHR1c2xlZXAoMTAwMCk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjcmVhdGVfZXJyLCAtRU9QTk9UU1VQUCxcbiYjNDM7XHRcdCAgXCYjMzQ7d29ya3F1ZXVlIGNyZWF0ZSByZWplY3RlZFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0a3NvY2tfd3FfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfYmFzaWMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjE4OWIwZmMxNTc3MDExXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfYmFzaWMuY1xuQEAgLTAsMCAmIzQzOzEsMzcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1saW51eC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfZW5kaWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX3RyYWNpbmdfbmV0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NvY2tfY29tbW9uLmhcJiMzNDtcbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQga3NvY2tfc2V0dXAodm9pZCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQga3NvY2tfc2VuZCh2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29jayAqa3M7XG4mIzQzO1x0aW50IHNlbmQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0diA9IGtzb2NrX2N0eF92YWx1ZV9sb29rdXAoKTtcbiYjNDM7XHRpZiAoIXYpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0a3MgPSBicGZfa3B0cl94Y2hnKFx1MDAyNnYtXHUwMDNlY3R4LCBOVUxMKTtcbiYjNDM7XHRpZiAoIWtzKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdHNlbmQgPSBicGZfa3NvY2tfc2VuZChrcywgc2VuZF9kYXRhLCBzaXplb2Yoc2VuZF9kYXRhKSk7XG4mIzQzO1x0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuJiM0MztcdHJldHVybiBzZW5kO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIF9fbGljZW5zZVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uN2NmNjQzMTliOTAxNDVcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19jb21tb24uaFxuQEAgLTAsMCAmIzQzOzEsMTEwIEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX0tTT0NLX0NPTU1PTl9IXG4mIzQzOyNkZWZpbmUgX0tTT0NLX0NPTU1PTl9IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtlcnJuby5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBTT0NLX1NUUkVBTVx0MVxuJiM0MzsjZGVmaW5lIFNPQ0tfREdSQU1cdDJcbiYjNDM7I2RlZmluZSBJUFBST1RPX1RDUFx0NlxuJiM0MzsjZGVmaW5lIElQUFJPVE9fVURQXHQxN1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2NyZWF0ZShjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzICpvcHRzLFxuJiM0MztcdFx0XHRcdCAgIHUzMiBvcHRzX19zeiwgaW50ICplcnJfX3VuaW5pdCkgX19rc3ltO1xuJiM0MztpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXG4mIzQzO1x0XHQgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6KSBfX2tzeW07XG4mIzQzO2ludCBicGZfa3NvY2tfY29ubmVjdChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcbiYjNDM7XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzICpvcHRzLCB1MzIgb3B0c19fc3opIF9fa3N5bTtcbiYjNDM7c3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2FjcXVpcmUoc3RydWN0IGJwZl9rc29jayAqa3MpIF9fa3N5bTtcbiYjNDM7dm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcykgX19rc3ltO1xuJiM0MztpbnQgYnBmX2tzb2NrX3NlbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXG4mIzQzO1x0XHQgICBjb25zdCB2b2lkICpkYXRhLCB1MzIgZGF0YV9fc3opIF9fa3N5bTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSB7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29jayBfX2twdHIgKiBjdHg7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuJiM0MztcdF9fdHlwZShrZXksIGludCk7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO30gX19rc29ja19jdHhfbWFwIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSAqa3NvY2tfY3R4X3ZhbHVlX2xvb2t1cCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0dTMyIGtleSA9IDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNl9fa3NvY2tfY3R4X21hcCwgXHUwMDI2a2V5KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQga3NvY2tfY3R4X2luc2VydChzdHJ1Y3QgYnBmX2tzb2NrICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgbG9jYWwsICp2O1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2sgKm9sZDtcbiYjNDM7XHR1MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRsb2NhbC5jdHggPSBOVUxMO1xuJiM0MztcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0oXHUwMDI2X19rc29ja19jdHhfbWFwLCBcdTAwMjZrZXksIFx1MDAyNmxvY2FsLCAwKTtcbiYjNDM7XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRicGZfa3NvY2tfcmVsZWFzZShjdHgpO1xuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHYgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNl9fa3NvY2tfY3R4X21hcCwgXHUwMDI2a2V5KTtcbiYjNDM7XHRpZiAoIXYpIHtcbiYjNDM7XHRcdGJwZl9rc29ja19yZWxlYXNlKGN0eCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG9sZCA9IGJwZl9rcHRyX3hjaGcoXHUwMDI2di1cdTAwM2VjdHgsIGN0eCk7XG4mIzQzO1x0aWYgKG9sZCkge1xuJiM0MztcdFx0YnBmX2tzb2NrX3JlbGVhc2Uob2xkKTtcbiYjNDM7XHRcdHJldHVybiAtRUVYSVNUO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIEdsb2JhbHMgZm9yIHBhc3NpbmcgY29uZmlnIGZyb20gdXNlcnNwYWNlICovXG4mIzQzO19fYmUzMiBpcHY0X3JlbW90ZTtcbiYjNDM7X191MTYgcmVtb3RlX3BvcnQ7XG4mIzQzO1xuJiM0MztjaGFyIHNlbmRfZGF0YVszMl0gPSBcJiMzNDtoZWxsbyBmcm9tIGJwZiBrc29ja1wmIzM0OztcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGRvX2tzb2NrX3NldHVwKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XG4mIzQzO1x0c3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgYWRkcl9vcHRzID0ge307XG4mIzQzO1x0c3RydWN0IGJwZl9rc29jayAqa3M7XG4mIzQzO1x0aW50IGVyciA9IDA7XG4mIzQzO1xuJiM0MztcdGNyZWF0ZV9vcHRzLmZhbWlseSA9IEFGX0lORVQ7XG4mIzQzO1x0Y3JlYXRlX29wdHMudHlwZSA9IFNPQ0tfREdSQU07XG4mIzQzO1x0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcbiYjNDM7XG4mIzQzO1x0a3MgPSBicGZfa3NvY2tfY3JlYXRlKFx1MDAyNmNyZWF0ZV9vcHRzLCBzaXplb2YoY3JlYXRlX29wdHMpLCBcdTAwMjZlcnIpO1xuJiM0MztcdGlmICgha3MpXG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcbiYjNDM7XHRhZGRyX29wdHMuZmFtaWx5ID0gQUZfSU5FVDtcbiYjNDM7XHRhZGRyX29wdHMucG9ydCA9IHJlbW90ZV9wb3J0O1xuJiM0MztcdGFkZHJfb3B0cy5pcHY0X2FkZHIgPSBpcHY0X3JlbW90ZTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gYnBmX2tzb2NrX2Nvbm5lY3Qoa3MsIFx1MDAyNmFkZHJfb3B0cywgc2l6ZW9mKGFkZHJfb3B0cykpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRlcnIgPSBrc29ja19jdHhfaW5zZXJ0KGtzKTtcbiYjNDM7XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVFWElTVClcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBfS1NPQ0tfQ09NTU9OX0ggKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19xdW90YS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjkxODU0ZWEzMzNjMTIxXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuY1xuQEAgLTAsMCAmIzQzOzEsMTY3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl90cmFjaW5nX25ldC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzb2NrX2NvbW1vbi5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TX1NMT1RTIDNcbiYjNDM7I2RlZmluZSBLU09DS19RVU9UQV9ORVROUyAyXG4mIzQzOyNkZWZpbmUgS1NPQ0tfUVVPVEFfU0xPVFMgKEtTT0NLX1FVT1RBX05TX1NMT1RTICogS1NPQ0tfUVVPVEFfTkVUTlMpXG4mIzQzO1xuJiM0MztzdHJ1Y3Qga3NvY2tfcXVvdGFfdmFsdWUge1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCB1MzIpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IGtzb2NrX3F1b3RhX3ZhbHVlKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIEtTT0NLX1FVT1RBX1NMT1RTKTtcbiYjNDM7fSBxdW90YV9tYXAgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCB1NjQpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgdTgpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgS1NPQ0tfUVVPVEFfU0xPVFMpO1xuJiM0Mzt9IHJlbGVhc2Vfd29ya2VycyBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7dTMyIHF1b3RhX2NyZWF0ZWQ7XG4mIzQzO3UzMiBxdW90YV9yZWxlYXNlZDtcbiYjNDM7dTMyIHF1b3RhX3Nsb3Rfb2Zmc2V0O1xuJiM0Mzt1MzIgdGFyZ2V0X25ldG5zX2ludW1bS1NPQ0tfUVVPVEFfTkVUTlNdO1xuJiM0Mzt1NjQgcXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQ7XG4mIzQzO2ludCBxdW90YV9lcnI7XG4mIzQzO1xuJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2xcbiYjNDM7a3NvY2tfcXVvdGFfY3JlYXRlX29uZSh1MzIgaSxcbiYjNDM7XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzICpjcmVhdGVfb3B0cylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrICprcywgKm9sZDtcbiYjNDM7XHRpbnQgZXJyID0gMDtcbiYjNDM7XG4mIzQzO1x0aSAmIzQzOz0gcXVvdGFfc2xvdF9vZmZzZXQ7XG4mIzQzO1x0aWYgKGkgXHUwMDNlPSBLU09DS19RVU9UQV9TTE9UUykge1xuJiM0MztcdFx0cXVvdGFfZXJyID0gLUVSQU5HRTtcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YmFycmllcl92YXIoZXJyKTtcbiYjNDM7XHRrcyA9IGJwZl9rc29ja19jcmVhdGUoY3JlYXRlX29wdHMsIHNpemVvZigqY3JlYXRlX29wdHMpLCBcdTAwMjZlcnIpO1xuJiM0MztcdGlmICgha3MpIHtcbiYjNDM7XHRcdHF1b3RhX2VyciA9IGVycjtcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0diA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cXVvdGFfbWFwLCBcdTAwMjZpKTtcbiYjNDM7XHRpZiAoIXYpIHtcbiYjNDM7XHRcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcbiYjNDM7XHRcdHF1b3RhX2VyciA9IC1FTk9FTlQ7XG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG9sZCA9IGJwZl9rcHRyX3hjaGcoXHUwMDI2di1cdTAwM2VjdHgsIGtzKTtcbiYjNDM7XHRpZiAob2xkKVxuJiM0MztcdFx0YnBmX2tzb2NrX3JlbGVhc2Uob2xkKTtcbiYjNDM7XHRxdW90YV9jcmVhdGVkJiM0MzsmIzQzOztcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBrc29ja19xdW90YV9yZWxlYXNlX29uZSh1MzIgaSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcbiYjNDM7XG4mIzQzO1x0aSAmIzQzOz0gcXVvdGFfc2xvdF9vZmZzZXQ7XG4mIzQzO1x0aWYgKGkgXHUwMDNlPSBLU09DS19RVU9UQV9TTE9UUylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0diA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cXVvdGFfbWFwLCBcdTAwMjZpKTtcbiYjNDM7XHRpZiAoIXYpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGtzID0gYnBmX2twdHJfeGNoZyhcdTAwMjZ2LVx1MDAzZWN0eCwgTlVMTCk7XG4mIzQzO1x0aWYgKGtzKSB7XG4mIzQzO1x0XHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4mIzQzO1x0XHRxdW90YV9yZWxlYXNlZCYjNDM7JiM0Mzs7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IGtzb2NrX3F1b3RhX2NyZWF0ZSh2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XG4mIzQzO1xuJiM0MztcdGNyZWF0ZV9vcHRzLmZhbWlseSA9IEFGX0lORVQ7XG4mIzQzO1x0Y3JlYXRlX29wdHMudHlwZSA9IFNPQ0tfREdSQU07XG4mIzQzO1x0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcbiYjNDM7XHRxdW90YV9jcmVhdGVkID0gMDtcbiYjNDM7XHRxdW90YV9lcnIgPSAwO1xuJiM0MztcbiYjNDM7XHRpZiAoa3NvY2tfcXVvdGFfY3JlYXRlX29uZSgwLCBcdTAwMjZjcmVhdGVfb3B0cykpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAoa3NvY2tfcXVvdGFfY3JlYXRlX29uZSgxLCBcdTAwMjZjcmVhdGVfb3B0cykpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRrc29ja19xdW90YV9jcmVhdGVfb25lKDIsIFx1MDAyNmNyZWF0ZV9vcHRzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQga3NvY2tfcXVvdGFfcmVsZWFzZSh2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRxdW90YV9yZWxlYXNlZCA9IDA7XG4mIzQzO1x0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMCk7XG4mIzQzO1x0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMSk7XG4mIzQzO1x0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMik7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7ZmVudHJ5L2tzb2NrX3JlbGVhc2Vfd29ya19mblwmIzM0OylcbiYjNDM7aW50IEJQRl9QUk9HKGtzb2NrX3JlbGVhc2Vfd29ya19lbnRlciwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJjdV93b3JrICpyd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcmN1X3dvcmssIHdvcmspO1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2sgKmtzID0gY29udGFpbmVyX29mKHJ3b3JrLCBzdHJ1Y3QgYnBmX2tzb2NrLCByd29yayk7XG4mIzQzO1x0dTY0IHBpZF90Z2lkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCk7XG4mIzQzO1x0c3RydWN0IG5ldCAqbmV0O1xuJiM0MztcdHUzMiBpbnVtO1xuJiM0MztcdHU4IHRyYWNrZWQgPSAxO1xuJiM0MztcbiYjNDM7XHQvKiBrc29ja19yZWxlYXNlX3dvcmtfZm4oKSBmcmVlcyBrcyBiZWZvcmUgdGhlIGZleGl0IHByb2dyYW0gcnVucy4gKi9cbiYjNDM7XHRuZXQgPSBCUEZfQ09SRV9SRUFEKGtzLCBzb2NrLCBzaywgX19za19jb21tb24uc2tjX25ldC5uZXQpO1xuJiM0MztcdGlmICghbmV0KVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGludW0gPSBCUEZfQ09SRV9SRUFEKG5ldCwgbnMuaW51bSk7XG4mIzQzO1x0aWYgKGludW0gIT0gdGFyZ2V0X25ldG5zX2ludW1bMF0gXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGludW0gIT0gdGFyZ2V0X25ldG5zX2ludW1bMV0pXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0YnBmX21hcF91cGRhdGVfZWxlbShcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFx1MDAyNnBpZF90Z2lkLCBcdTAwMjZ0cmFja2VkLCBCUEZfQU5ZKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O2ZleGl0L2tzb2NrX3JlbGVhc2Vfd29ya19mblwmIzM0OylcbiYjNDM7aW50IEJQRl9QUk9HKGtzb2NrX3JlbGVhc2Vfd29ya19leGl0LCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4mIzQzO3tcbiYjNDM7XHR1NjQgcGlkX3RnaWQgPSBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQoKTtcbiYjNDM7XHR1OCAqdHJhY2tlZDtcbiYjNDM7XG4mIzQzO1x0dHJhY2tlZCA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cmVsZWFzZV93b3JrZXJzLCBcdTAwMjZwaWRfdGdpZCk7XG4mIzQzO1x0aWYgKCF0cmFja2VkKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0YnBmX21hcF9kZWxldGVfZWxlbShcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFx1MDAyNnBpZF90Z2lkKTtcbiYjNDM7XG4mIzQzO1x0LyogVGhlIHdvcmtlciBoYXMgcmVsZWFzZWQgdGhlIHNvY2tldCBhbmQgcmV0dXJuZWQgaXRzIHF1b3RhIGNoYXJnZS4gKi9cbiYjNDM7XHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcdTAwMjZxdW90YV9yZWxlYXNlX2NvbXBsZXRlZCwgMSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIF9fbGljZW5zZVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJmNTIwMDk0M2UzNmFcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19yZWN1cnNpb24uY1xuQEAgLTAsMCAmIzQzOzEsNjkgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1saW51eC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfZW5kaWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX3RyYWNpbmdfbmV0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NvY2tfY29tbW9uLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltO1xuJiM0Mzt2b2lkIGJwZl9yY3VfcmVhZF91bmxvY2sodm9pZCkgX19rc3ltO1xuJiM0MztcbiYjNDM7aW50IHRhcmdldF9waWQ7XG4mIzQzO2ludCB0cmlnZ2VyX3NlbmQ7XG4mIzQzO1xuJiM0Mzt1bnNpZ25lZCBpbnQgcmVjX2NvdW50O1xuJiM0MztpbnQgcmVjX2tmdW5jX3JldHNbXSA9IHsgLTEsIC0xIH07XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IGtzb2NrX3NldHVwKHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBkb19rc29ja19zZXR1cCgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7bHNtLnMvc29ja2V0X3NlbmRtc2dcJiMzNDspXG4mIzQzO2ludCBCUEZfUFJPRyhrc29ja19zb2NrZXRfc2VuZG1zZywgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuJiM0MztcdCAgICAgaW50IHNpemUsIGludCByZXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29jayAqa3MsICp0bXA7XG4mIzQzO1x0dTMyIHBpZCA9IGJwZl9nZXRfY3VycmVudF9waWRfdGdpZCgpIFx1MDAzZVx1MDAzZSAzMjtcbiYjNDM7XHRpbnQga2Z1bmNfcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAocmV0IHx8ICF0cmlnZ2VyX3NlbmQgfHwgcGlkICE9IHRhcmdldF9waWQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2ID0ga3NvY2tfY3R4X3ZhbHVlX2xvb2t1cCgpO1xuJiM0MztcdGlmICghdikge1xuJiM0MztcdFx0a2Z1bmNfcmV0ID0gLUVOT0VOVDtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a3MgPSBOVUxMO1xuJiM0MztcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0dG1wID0gdi1cdTAwM2VjdHg7XG4mIzQzO1x0aWYgKHRtcClcbiYjNDM7XHRcdGtzID0gYnBmX2tzb2NrX2FjcXVpcmUodG1wKTtcbiYjNDM7XHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1xuJiM0MztcdGlmICgha3MpIHtcbiYjNDM7XHRcdGtmdW5jX3JldCA9IC1FTk9FTlQ7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtmdW5jX3JldCA9IGJwZl9rc29ja19zZW5kKGtzLCBzZW5kX2RhdGEsIHNpemVvZihzZW5kX2RhdGEpKTtcbiYjNDM7XHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmVjX2tmdW5jX3JldHNbcmVjX2NvdW50IFx1MDAyNiAxXSA9IGtmdW5jX3JldDtcbiYjNDM7XHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcdTAwMjZyZWNfY291bnQsIDEpO1xuJiM0MztcbiYjNDM7XHRpZiAoa2Z1bmNfcmV0ICE9IC1FQlVTWSlcbiYjNDM7XHRcdHRyaWdnZXJfc2VuZCA9IDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3dxLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTZhMTg3M2QxMzJlZGVcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jXG5AQCAtMCwwICYjNDM7MSw2MiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bWxpbnV4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl90cmFjaW5nX25ldC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Vycm5vLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NvY2tfY29tbW9uLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0cnVjdCBrc29ja193cV92YWx1ZSB7XG4mIzQzO1x0c3RydWN0IGJwZl93cSB3b3JrO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuJiM0MztcdF9fdHlwZShrZXksIHUzMik7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qga3NvY2tfd3FfdmFsdWUpO1xuJiM0Mzt9IHdvcmtfbWFwIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztpbnQgY3JlYXRlX2VycjtcbiYjNDM7dTMyIGNhbGxiYWNrX2RvbmU7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGtzb2NrX3dxX2NhbGxiYWNrKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBvcHRzID0ge1xuJiM0MztcdFx0LmZhbWlseSA9IEFGX0lORVQsXG4mIzQzO1x0XHQudHlwZSA9IFNPQ0tfREdSQU0sXG4mIzQzO1x0XHQucHJvdG9jb2wgPSBJUFBST1RPX1VEUCxcbiYjNDM7XHR9O1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xuJiM0MztcdGludCBlcnIgPSAwO1xuJiM0MztcbiYjNDM7XHRrcyA9IGJwZl9rc29ja19jcmVhdGUoXHUwMDI2b3B0cywgc2l6ZW9mKG9wdHMpLCBcdTAwMjZlcnIpO1xuJiM0MztcdGlmIChrcylcbiYjNDM7XHRcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcbiYjNDM7XHRjcmVhdGVfZXJyID0gZXJyO1xuJiM0MztcdF9fc3luY19mZXRjaF9hbmRfYWRkKFx1MDAyNmNhbGxiYWNrX2RvbmUsIDEpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IGtzb2NrX3dxX3N0YXJ0KHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBrc29ja193cV92YWx1ZSAqdmFsdWU7XG4mIzQzO1x0dTMyIGtleSA9IDA7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0dmFsdWUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndvcmtfbWFwLCBcdTAwMjZrZXkpO1xuJiM0MztcdGlmICghdmFsdWUpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRlcnIgPSBicGZfd3FfaW5pdChcdTAwMjZ2YWx1ZS1cdTAwM2V3b3JrLCBcdTAwMjZ3b3JrX21hcCwgMCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0ZXJyID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZ2YWx1ZS1cdTAwM2V3b3JrLCBrc29ja193cV9jYWxsYmFjaywgMCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0cmV0dXJuIGJwZl93cV9zdGFydChcdTAwMjZ2YWx1ZS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7Y2hhciBfX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMTI6NTg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7SU5FVCYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2tzb2NrX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYmluZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfY29ubmVjdCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfc2VuZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYWNxdWlyZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfcmVsZWFzZSYjMzQ7LAogICAgJiMzNDtfX3N5c19jb25uZWN0X3NvY2tldCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNmMwNDRhM2IzYWUyZjgxZGFlZDBjYzkwYjljNDA4NDljZDYzMTNlYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gSnVsIDYgMTI6NTg6NTQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL3N5c2N0bC9uZXQucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdAppbmRleCBlNTg2ZTE3ZmM3YTU4Mi4uOGJjZGMxYmZkNzExMzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvc3lzY3RsL25ldC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdApAQCAtMTI4LDYgJiM0MzsxMjgsMTggQEAgY29tcGlsZXIgaW4gb3JkZXIgdG8gcmVqZWN0IHVucHJpdmlsZWdlZCBKSVQgcmVxdWVzdHMgb25jZSBpdCBoYXMKIGJlZW4gc3VycGFzc2VkLiBicGZfaml0X2xpbWl0IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2xvYmFsIGxpbWl0CiBpbiBieXRlcy4KIAomIzQzO2JwZl9rc29ja19tYXgKJiM0MzstLS0tLS0tLS0tLS0tCiYjNDM7CiYjNDM7TWF4aW11bSBudW1iZXIgb2YgQlBGIGtlcm5lbCBzb2NrZXRzIHRoYXQgbWF5IGV4aXN0IGluIGVhY2ggbmV0d29yayBuYW1lc3BhY2UuCiYjNDM7VGhpcyBob3N0LXdpZGUgc2V0dGluZyBpcyBleHBvc2VkIGluIHRoZSBpbml0aWFsIG5ldHdvcmsgbmFtZXNwYWNlIGFuZCBhcHBsaWVzCiYjNDM7dGhlIHNhbWUgbGltaXQgaW5kZXBlbmRlbnRseSB0byBldmVyeSBuZXR3b3JrIG5hbWVzcGFjZS4gU29ja2V0cyBhd2FpdGluZwomIzQzO2RlZmVycmVkIFJDVSBhbmQgd29ya3F1ZXVlIGNsZWFudXAgcmVtYWluIGNvdW50ZWQgdW50aWwgdGhlIHVuZGVybHlpbmcgc29ja2V0CiYjNDM7aGFzIGJlZW4gcmVsZWFzZWQuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyBjcmVhdGlvbiBvZiBCUEYga2VybmVsIHNvY2tldHMgaW4KJiM0MztldmVyeSBuZXR3b3JrIG5hbWVzcGFjZS4KJiM0MzsKJiM0MztEZWZhdWx0OiAxMDI0CiYjNDM7CiBkZXZfd2VpZ2h0CiAtLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmggYi9pbmNsdWRlL2xpbnV4L2JwZl9rc29jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4wNDg1YjhlZGRjMWYyMAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmgKQEAgLTAsMCAmIzQzOzEsNTAgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqLwomIzQzOwomIzQzOyNpZm5kZWYgX0JQRl9LU09DS19ICiYjNDM7I2RlZmluZSBfQlBGX0tTT0NLX0gKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdHlwZXMuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIEJQRl9LU09DS19NQVhfREVGQVVMVCAxMDI0CiYjNDM7CiYjNDM7ZXh0ZXJuIGludCBzeXNjdGxfYnBmX2tzb2NrX21heDsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIC0gQlBGIGtlcm5lbCBzb2NrZXQgY3JlYXRpb24gcGFyYW1ldGVycwomIzQzOyAqIEBmYW1pbHk6CUFkZHJlc3MgZmFtaWx5OiBBRl9JTkVUIG9yIEFGX0lORVQ2LgomIzQzOyAqIEB0eXBlOglTb2NrZXQgdHlwZTogb25seSBTT0NLX0RHUkFNIHN1cHBvcnRlZCBmb3Igbm93LgomIzQzOyAqIEBwcm90b2NvbDoJUHJvdG9jb2wgbnVtYmVyIChlLmcuIElQUFJPVE9fVURQKSwgb3IgMCBmb3IgdGhlIGRlZmF1bHQgcHJvdG9jb2wKJiM0MzsgKgkJb2YgdGhlIGdpdmVuIHR5cGUuCiYjNDM7ICogQHJlc2VydmVkOglNdXN0IGJlIHplcm8uIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgomIzQzOyAqLwomIzQzO3N0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgewomIzQzOwlfX3U4IGZhbWlseTsKJiM0MzsJX191OCB0eXBlOwomIzQzOwlfX3U4IHByb3RvY29sOwomIzQzOwlfX3U4IHJlc2VydmVkOwomIzQzO307CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgLSBCUEYga2VybmVsIHNvY2tldCBhZGRyZXNzIHBhcmFtZXRlcnMKJiM0MzsgKiBAZmFtaWx5OglBZGRyZXNzIGZhbWlseTogQUZfSU5FVCBvciBBRl9JTkVUNi4KJiM0MzsgKiBAcmVzZXJ2ZWQ6CU11c3QgYmUgemVyby4gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCiYjNDM7ICogQHBvcnQ6CVBvcnQgaW4gaG9zdCBieXRlIG9yZGVyLgomIzQzOyAqIEBzY29wZV9pZDoJSVB2NiBzY29wZSBJRCBmb3Igc2NvcGVkIEFGX0lORVQ2IGFkZHJlc3Nlcywgb3IgemVyby4KJiM0MzsgKgkJTXVzdCBiZSB6ZXJvIHdoZW4gZmFtaWx5PUFGX0lORVQuCiYjNDM7ICogQGlwdjRfYWRkcjoJSVB2NCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVULgomIzQzOyAqIEBpcHY2X2FkZHI6CUlQdjYgYWRkcmVzcyAoMTYgYnl0ZXMsIG5ldHdvcmsgYnl0ZSBvcmRlcikuIFVzZWQgd2hlbiBmYW1pbHk9QUZfSU5FVDYuCiYjNDM7ICovCiYjNDM7c3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgewomIzQzOwlfX3U4IGZhbWlseTsKJiM0MzsJX191OCByZXNlcnZlZDsKJiM0MzsJX191MTYgcG9ydDsKJiM0MzsJX191MzIgc2NvcGVfaWQ7CiYjNDM7CiYjNDM7CXVuaW9uIHsKJiM0MzsJCV9fYmUzMiBpcHY0X2FkZHI7CiYjNDM7CQlfX3UzMiBpcHY2X2FkZHJbNF07IC8qIGluNl9hZGRyOyBuZXR3b3JrIG9yZGVyICovCiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MzsjZW5kaWYgLyogX0JQRl9LU09DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCAyYThkN2IxNGYxZDExOS4uNDhmMWViODE5M2RlYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ja2V0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaApAQCAtNDYxLDYgJiM0Mzs0NjEsOCBAQCBleHRlcm4gc3RydWN0IGZpbGUgKl9fc3lzX3NvY2tldF9maWxlKGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpOwogZXh0ZXJuIGludCBfX3N5c19iaW5kKGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdW15YWRkciwgaW50IGFkZHJsZW4pOwogZXh0ZXJuIGludCBfX3N5c19iaW5kX3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcywKIAkJCSAgICAgaW50IGFkZHJsZW4pOwomIzQzO2V4dGVybiBpbnQgX19zeXNfY29ubmVjdF9zb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsCiYjNDM7CQkJCWludCBhZGRybGVuLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCBfX3N5c19jb25uZWN0X2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLAogCQkJICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKTsKIGV4dGVybiBpbnQgX19zeXNfY29ubmVjdChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzZXJ2YWRkciwKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuYwppbmRleCAyNWFlYTQyNzFjZDA4OS4uNTJmNmE4OTU0NmU0NmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTQ0MjQsNiAmIzQzOzQ0MjQsOSBAQCBCVEZfSUQoc3RydWN0LCB0YXNrX3N0cnVjdCkKICNpZmRlZiBDT05GSUdfQ1JZUFRPCiBCVEZfSUQoc3RydWN0LCBicGZfY3J5cHRvX2N0eCkKICNlbmRpZgomIzQzOyNpZmRlZiBDT05GSUdfSU5FVAomIzQzO0JURl9JRChzdHJ1Y3QsIGJwZl9rc29jaykKJiM0MzsjZW5kaWYKIEJURl9TRVRfRU5EKHJjdV9wcm90ZWN0ZWRfdHlwZXMpCiAKIHN0YXRpYyBib29sIHJjdV9wcm90ZWN0ZWRfb2JqZWN0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL01ha2VmaWxlIGIvbmV0L2NvcmUvTWFrZWZpbGUKaW5kZXggYjNmZGNiNGUzNTVmYTYuLmE5Mjk1Yjc4NTkwMTA5IDEwMDY0NAotLS0gYS9uZXQvY29yZS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9uZXQvY29yZS9NYWtlZmlsZQpAQCAtNDQsNiAmIzQzOzQ0LDkgQEAgb2JqLSQoQ09ORklHX0ZBSUxPVkVSKSAmIzQzOz0gZmFpbG92ZXIubwogb2JqLSQoQ09ORklHX05FVF9TT0NLX01TRykgJiM0Mzs9IHNrbXNnLm8KIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IHNvY2tfbWFwLm8KIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJwZl9za19zdG9yYWdlLm8KJiM0MztpZm5lcSAoJChDT05GSUdfSU5FVCksKQomIzQzO29iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJwZl9rc29jay5vCiYjNDM7ZW5kaWYKIG9iai0kKENPTkZJR19PRikJJiM0Mzs9IG9mX25ldC5vCiBvYmotJChDT05GSUdfTkVUX1RFU1QpICYjNDM7PSBuZXRfdGVzdC5vCiBvYmotJChDT05GSUdfTkVUX0RFVk1FTSkgJiM0Mzs9IGRldm1lbS5vCmRpZmYgLS1naXQgYS9uZXQvY29yZS9icGZfa3NvY2suYyBiL25ldC9jb3JlL2JwZl9rc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi44YmRlNzM0YmM5MTdkMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9jb3JlL2JwZl9rc29jay5jCkBAIC0wLDAgJiM0MzsxLDUxNiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGZfa3NvY2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zl9pZHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY2FjaGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaGFzaC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pbjYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbGlzdF9ibC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9uZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcmVmY291bnQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcmN1cGRhdGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2NoZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdW5hbGlnbmVkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3dvcmtxdWV1ZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pcC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvaXB2Ni5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvbmV0X25hbWVzcGFjZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvbmV0bnMvZ2VuZXJpYy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvc29jay5oJmd0OwomIzQzOwomIzQzOy8qKgomIzQzOyAqIHN0cnVjdCBicGZfa3NvY2sgLSByZWZjb3VudGVkIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQKJiM0MzsgKiBAc29jazoJVGhlIHVuZGVybHlpbmcga2VybmVsIHNvY2tldC4KJiM0MzsgKiBAdXNhZ2U6CVJlZmVyZW5jZSBjb3VudGVyLgomIzQzOyAqIEByd29yazoJUkNVIHdvcmsgZm9yIGRlZmVycmVkIGNsZWFudXAgKHNvY2tfcmVsZWFzZSBtYXkgc2xlZXApLgomIzQzOyAqLwomIzQzO3N0cnVjdCBicGZfa3NvY2sgewomIzQzOwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwomIzQzOwlyZWZjb3VudF90IHVzYWdlOwomIzQzOwlzdHJ1Y3QgcmN1X3dvcmsgcndvcms7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgewomIzQzOwlzdHJ1Y3QgaGxpc3RfYmxfbm9kZSBub2RlOwomIzQzOwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiYjNDM7fTsKJiM0MzsKJiM0MzsjZGVmaW5lIEJQRl9LU09DS19TRU5EX0dVQVJEX0hBU0hfQklUUyA2CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCB7CiYjNDM7CXN0cnVjdCBobGlzdF9ibF9oZWFkIGhlYWQ7CiYjNDM7fSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0CiYjNDM7CWJwZl9rc29ja19zZW5kX2J1Y2tldHNbMSAmbHQ7Jmx0OyBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFNdOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0ICoKJiM0MzticGZfa3NvY2tfc2VuZF9idWNrZXQoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQomIzQzO3sKJiM0MzsJdTMyIGJ1Y2tldF9pZHggPSBoYXNoX3B0cih0YXNrLCBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFMpOwomIzQzOwomIzQzOwlyZXR1cm4gJmFtcDticGZfa3NvY2tfc2VuZF9idWNrZXRzW2J1Y2tldF9pZHhdOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBicGZfa3NvY2tfc2VuZF9lbnRlcihzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmd1YXJkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICplbnRyeTsKJiM0MzsJc3RydWN0IGhsaXN0X2JsX25vZGUgKnBvczsKJiM0MzsJc3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCAqYnVja2V0OwomIzQzOwomIzQzOwlidWNrZXQgPSBicGZfa3NvY2tfc2VuZF9idWNrZXQoY3VycmVudCk7CiYjNDM7CWhsaXN0X2JsX2xvY2soJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzOwlobGlzdF9ibF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCAmYW1wO2J1Y2tldC0mZ3Q7aGVhZCwgbm9kZSkgewomIzQzOwkJaWYgKGVudHJ5LSZndDt0YXNrID09IGN1cnJlbnQpIHsKJiM0MzsJCQlobGlzdF9ibF91bmxvY2soJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlndWFyZC0mZ3Q7dGFzayA9IGN1cnJlbnQ7CiYjNDM7CUlOSVRfSExJU1RfQkxfTk9ERSgmYW1wO2d1YXJkLSZndDtub2RlKTsKJiM0MzsJaGxpc3RfYmxfYWRkX2hlYWQoJmFtcDtndWFyZC0mZ3Q7bm9kZSwgJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzOwlobGlzdF9ibF91bmxvY2soJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX2tzb2NrX3NlbmRfZXhpdChzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmd1YXJkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCAqYnVja2V0OwomIzQzOwomIzQzOwlidWNrZXQgPSBicGZfa3NvY2tfc2VuZF9idWNrZXQoZ3VhcmQtJmd0O3Rhc2spOwomIzQzOwlobGlzdF9ibF9sb2NrKCZhbXA7YnVja2V0LSZndDtoZWFkKTsKJiM0MzsJaGxpc3RfYmxfZGVsKCZhbXA7Z3VhcmQtJmd0O25vZGUpOwomIzQzOwlobGlzdF9ibF91bmxvY2soJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2tzb2NrX25ldCB7CiYjNDM7CWF0b21pY190IGNvdW50OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGludCBicGZfa3NvY2tfbmV0X2lkOwomIzQzO2ludCBzeXNjdGxfYnBmX2tzb2NrX21heCBfX3JlYWRfbW9zdGx5ID0gQlBGX0tTT0NLX01BWF9ERUZBVUxUOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX25ldCAqYnBmX2tzb2NrX3Blcm5ldChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQpCiYjNDM7ewomIzQzOwlyZXR1cm4gbmV0X2dlbmVyaWMobmV0LCBicGZfa3NvY2tfbmV0X2lkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBicGZfa3NvY2tfbmV0X29wcyA9IHsKJiM0MzsJLmlkID0gJmFtcDticGZfa3NvY2tfbmV0X2lkLAomIzQzOwkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnBmX2tzb2NrX25ldCksCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2Uoc3RydWN0IG5ldCAqbmV0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19uZXQgKmtuID0gYnBmX2tzb2NrX3Blcm5ldChuZXQpOwomIzQzOwlpbnQgY291bnQgPSBhdG9taWNfcmVhZCgmYW1wO2tuLSZndDtjb3VudCk7CiYjNDM7CWludCBtYXg7CiYjNDM7CiYjNDM7CWRvIHsKJiM0MzsJCW1heCA9IFJFQURfT05DRShzeXNjdGxfYnBmX2tzb2NrX21heCk7CiYjNDM7CQlpZiAoY291bnQgJmd0Oz0gbWF4KQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfSB3aGlsZSAoIWF0b21pY190cnlfY21weGNoZygmYW1wO2tuLSZndDtjb3VudCwgJmFtcDtjb3VudCwgY291bnQgJiM0MzsgMSkpOwomIzQzOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX2tzb2NrX25ldF91bmNoYXJnZShzdHJ1Y3QgbmV0ICpuZXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2tzb2NrX25ldCAqa24gPSBicGZfa3NvY2tfcGVybmV0KG5ldCk7CiYjNDM7CiYjNDM7CVdBUk5fT05fT05DRShhdG9taWNfZGVjX3JldHVybigmYW1wO2tuLSZndDtjb3VudCkgJmx0OyAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQga3NvY2tfcmVsZWFzZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgKmtzID0KJiM0MzsJCWNvbnRhaW5lcl9vZih0b19yY3Vfd29yayh3b3JrKSwgc3RydWN0IGJwZl9rc29jaywgcndvcmspOwomIzQzOwlzdHJ1Y3QgbmV0ICpuZXQgPSBnZXRfbmV0KHNvY2tfbmV0KGtzLSZndDtzb2NrLSZndDtzaykpOwomIzQzOwomIzQzOwlzb2NrX3JlbGVhc2Uoa3MtJmd0O3NvY2spOwomIzQzOwlicGZfa3NvY2tfbmV0X3VuY2hhcmdlKG5ldCk7CiYjNDM7CXB1dF9uZXQobmV0KTsKJiM0MzsJa2ZyZWUoa3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9rc29ja19nZXRfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywKJiM0MzsJCQkgICAgICB1MzIgb3B0c19fc3osIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgb3B0c19jb3B5OwomIzQzOwomIzQzOwlpZiAoIW9wdHMgfHwgb3B0c19fc3ogIT0gc2l6ZW9mKCpvcHRzKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwkvKiBLZnVuYyBtZW1vcnkgYXJndW1lbnRzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBuYXR1cmFsbHkgYWxpZ25lZC4gKi8KJiM0MzsJbWVtY3B5KCZhbXA7b3B0c19jb3B5LCBvcHRzLCBzaXplb2Yob3B0c19jb3B5KSk7CiYjNDM7CiYjNDM7CWlmIChvcHRzX2NvcHkucmVzZXJ2ZWQpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJc3dpdGNoIChvcHRzX2NvcHkuZmFtaWx5KSB7CiYjNDM7CWNhc2UgQUZfSU5FVDogewomIzQzOwkJc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOwomIzQzOwomIzQzOwkJaWYgKG9wdHNfY29weS5zY29wZV9pZCkKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJCSphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4pewomIzQzOwkJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKJiM0MzsJCQkuc2luX3BvcnQgPSBodG9ucyhvcHRzX2NvcHkucG9ydCksCiYjNDM7CQkJLnNpbl9hZGRyLnNfYWRkciA9IG9wdHNfY29weS5pcHY0X2FkZHIsCiYjNDM7CQl9OwomIzQzOwkJcmV0dXJuIHNpemVvZigqYWRkcjQpOwomIzQzOwl9CiYjNDM7I2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiYjNDM7CWNhc2UgQUZfSU5FVDY6IHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyOwomIzQzOwomIzQzOwkJKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYpewomIzQzOwkJCS5zaW42X2ZhbWlseSA9IEFGX0lORVQ2LAomIzQzOwkJCS5zaW42X3BvcnQgPSBodG9ucyhvcHRzX2NvcHkucG9ydCksCiYjNDM7CQkJLnNpbjZfc2NvcGVfaWQgPSBvcHRzX2NvcHkuc2NvcGVfaWQsCiYjNDM7CQl9OwomIzQzOwkJbWVtY3B5KCZhbXA7YWRkcjYtJmd0O3NpbjZfYWRkciwgb3B0c19jb3B5LmlwdjZfYWRkciwKJiM0MzsJCSAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiYjNDM7CQlyZXR1cm4gc2l6ZW9mKCphZGRyNik7CiYjNDM7CX0KJiM0MzsjZW5kaWYKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCXJldHVybiAtRUFGTk9TVVBQT1JUOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQodm9pZCkKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIFRhc2sgd29yayBjYW4gcnVuIGZyb20gZG9fZXhpdCgpIGFmdGVyIGV4aXRfbnNwcm94eV9uYW1lc3BhY2VzKCkKJiM0MzsJICogY2xlYXJlZCBjdXJyZW50LSZndDtuc3Byb3h5LCB3aGlsZSBjdXJyZW50IGlzIHN0aWxsIG5vdCBhIGt0aHJlYWQuCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gIShjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9LVEhSRUFEKSAmYW1wOyZhbXA7IGN1cnJlbnQtJmd0O25zcHJveHk7CiYjNDM7fQomIzQzOwomIzQzO19fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfa3NvY2tfY3JlYXRlKCkgLSBDcmVhdGUgYSBCUEYga2VybmVsIHNvY2tldC4KJiM0MzsgKgomIzQzOyAqIEFsbG9jYXRlcyBhbmQgY3JlYXRlcyBhIGtlcm5lbCBzb2NrZXQuCiYjNDM7ICogVGhlIHNvY2tldCBpcyBjaGFyZ2VkIGFnYWluc3QgdGhlIGFjdGl2ZSBuZXR3b3JrIG5hbWVzcGFjZSYjMzk7cyBCUEYga2VybmVsCiYjNDM7ICogc29ja2V0IHF1b3RhLgomIzQzOyAqCiYjNDM7ICogVGhlIHJldHVybmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3IKJiM0MzsgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCAoc29ja19jcmVhdGUpLCBzbyBpdCBjYW4gb25seSBiZSB1c2VkCiYjNDM7ICogaW4gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuCiYjNDM7ICogSXQgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgQlBGIHdvcmtxdWV1ZSBjYWxsYmFjayBiZWNhdXNlIHRoYXQgY2FsbGJhY2sKJiM0MzsgKiBkb2VzIG5vdCByZXRhaW4gdGhlIGludm9raW5nIHRhc2smIzM5O3MgbmFtZXNwYWNlIG9yIHNlY3VyaXR5IGNvbnRleHQuCiYjNDM7ICoKJiM0MzsgKiBAb3B0czoJUG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIHdpdGggc29ja2V0IHBhcmFtZXRlcnMuCiYjNDM7ICogQG9wdHNfX3N6OglTaXplIG9mIHRoZSBvcHRzIHN0cnVjdC4KJiM0MzsgKiBAZXJyX191bmluaXQ6CUludGVnZXIgdG8gc3RvcmUgZXJyb3IgY29kZSB3aGVuIE5VTEwgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqCiYjNDM7YnBmX2tzb2NrX2NyZWF0ZShjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzICpvcHRzLCB1MzIgb3B0c19fc3osCiYjNDM7CQkgaW50ICplcnJfX3VuaW5pdCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgb3B0c19jb3B5OwomIzQzOwlzdHJ1Y3QgYnBmX2tzb2NrICprczsKJiM0MzsJc3RydWN0IG5ldCAqbmV0OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBzb2NrX2NyZWF0ZSgpIGRlcml2ZXMgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBjcmVkZW50aWFscywgYW5kIGNncm91cAomIzQzOwkgKiBmcm9tIGN1cnJlbnQuIEtlcm5lbCB0aHJlYWRzLCBpbmNsdWRpbmcgQlBGIHdvcmtxdWV1ZSBjYWxsYmFja3MsIGRvCiYjNDM7CSAqIG5vdCBjYXJyeSB0aGUgY29udGV4dCBvZiB0aGUgdGFzayB0aGF0IGludm9rZWQgdGhlIEJQRiBwcm9ncmFtLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpIHsKJiM0MzsJCWVyciA9IC1FT1BOT1RTVVBQOwomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghb3B0cyB8fCBvcHRzX19zeiAhPSBzaXplb2Yoc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cykpIHsKJiM0MzsJCWVyciA9IC1FSU5WQUw7CiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJb3B0c19jb3B5ID0gKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpewomIzQzOwkJLmZhbWlseSA9IFJFQURfT05DRShvcHRzLSZndDtmYW1pbHkpLAomIzQzOwkJLnR5cGUgPSBSRUFEX09OQ0Uob3B0cy0mZ3Q7dHlwZSksCiYjNDM7CQkucHJvdG9jb2wgPSBSRUFEX09OQ0Uob3B0cy0mZ3Q7cHJvdG9jb2wpLAomIzQzOwkJLnJlc2VydmVkID0gUkVBRF9PTkNFKG9wdHMtJmd0O3Jlc2VydmVkKSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJaWYgKG9wdHNfY29weS5yZXNlcnZlZCkgewomIzQzOwkJZXJyID0gLUVJTlZBTDsKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAob3B0c19jb3B5LmZhbWlseSAhPSBBRl9JTkVUICZhbXA7JmFtcDsgb3B0c19jb3B5LmZhbWlseSAhPSBBRl9JTkVUNikgewomIzQzOwkJZXJyID0gLUVBRk5PU1VQUE9SVDsKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAob3B0c19jb3B5LnR5cGUgIT0gU09DS19ER1JBTSkgewomIzQzOwkJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAob3B0c19jb3B5LnByb3RvY29sICE9IElQUFJPVE9fVURQICZhbXA7JmFtcDsgb3B0c19jb3B5LnByb3RvY29sICE9IDApIHsKJiM0MzsJCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3MgPSBremFsbG9jX29iaigqa3MpOwomIzQzOwlpZiAoIWtzKSB7CiYjNDM7CQllcnIgPSAtRU5PTUVNOwomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5ldCA9IGN1cnJlbnQtJmd0O25zcHJveHktJmd0O25ldF9uczsKJiM0MzsJaWYgKCFicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2UobmV0KSkgewomIzQzOwkJZXJyID0gLUVOT1NQQzsKJiM0MzsJCWdvdG8gZXJyX2ZyZWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVXNlIHRoZSBub3JtYWwgY3VycmVudC10YXNrIHNvY2tldCBwYXRoIHNvIExTTS9jZ3JvdXAgcG9saWN5LAomIzQzOwkgKiBzb2NrZXQgbGFiZWxzLCBhbmQgdGhlIGFjdGl2ZSBuZXRucyByZWZlcmVuY2UgbWF0Y2ggYSBzb2NrZXQoMikKJiM0MzsJICogY3JlYXRlZCBieSB0aGUgQlBGIHByb2dyYW0mIzM5O3MgY2FsbGVyLgomIzQzOwkgKi8KJiM0MzsJZXJyID0gc29ja19jcmVhdGUob3B0c19jb3B5LmZhbWlseSwgb3B0c19jb3B5LnR5cGUsIG9wdHNfY29weS5wcm90b2NvbCwKJiM0MzsJCQkgICZhbXA7a3MtJmd0O3NvY2spOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJZ290byBlcnJfdW5jaGFyZ2U7CiYjNDM7CiYjNDM7CWtzLSZndDtzb2NrLSZndDtzay0mZ3Q7c2tfcmN2YnVmID0gU09DS19NSU5fUkNWQlVGOwomIzQzOwlrcy0mZ3Q7c29jay0mZ3Q7c2stJmd0O3NrX3VzZXJsb2NrcyB8PSBTT0NLX1JDVkJVRl9MT0NLOwomIzQzOwomIzQzOwlyZWZjb3VudF9zZXQoJmFtcDtrcy0mZ3Q7dXNhZ2UsIDEpOwomIzQzOwlwdXRfdW5hbGlnbmVkKDAsIGVycl9fdW5pbml0KTsKJiM0MzsJcmV0dXJuIGtzOwomIzQzOwomIzQzO2Vycl91bmNoYXJnZToKJiM0MzsJYnBmX2tzb2NrX25ldF91bmNoYXJnZShuZXQpOwomIzQzO2Vycl9mcmVlOgomIzQzOwlrZnJlZShrcyk7CiYjNDM7ZXJyX291dDoKJiM0MzsJcHV0X3VuYWxpZ25lZChlcnIsIGVycl9fdW5pbml0KTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9rc29ja19iaW5kKCkgLSBCaW5kIGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNzLgomIzQzOyAqIEBrczoJCVRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LgomIzQzOyAqIEBvcHRzOglQb2ludGVyIHRvIHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHdpdGggbG9jYWwgYWRkcmVzcy4KJiM0MzsgKiBAb3B0c19fc3o6CVNpemUgb2YgdGhlIG9wdHMgc3RydWN0LgomIzQzOyAqCiYjNDM7ICogQmluZHMgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQuCiYjNDM7ICogVGhpcyBpcyBvcHRpb25hbDsgaWYgbm90IGNhbGxlZCwgdGhlIGtlcm5lbCB3aWxsIGF1dG8tYXNzaWduLgomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgd2hpbGUgYmluZGluZyB0aGUgc29ja2V0LCBzbyBpdCBjYW4gb25seSBiZSB1c2VkIGluCiYjNDM7ICogc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19iaW5kKHN0cnVjdCBicGZfa3NvY2sgKmtzLAomIzQzOwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywKJiM0MzsJCQkgICAgICAgdTMyIG9wdHNfX3N6KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9OwomIzQzOwlpbnQgYWRkcmxlbjsKJiM0MzsKJiM0MzsJaWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CWFkZHJsZW4gPSBicGZfa3NvY2tfZ2V0X2FkZHIob3B0cywgb3B0c19fc3osICZhbXA7YWRkcik7CiYjNDM7CWlmIChhZGRybGVuICZsdDsgMCkKJiM0MzsJCXJldHVybiBhZGRybGVuOwomIzQzOwomIzQzOwlyZXR1cm4gX19zeXNfYmluZF9zb2NrZXQoa3MtJmd0O3NvY2ssICZhbXA7YWRkciwgYWRkcmxlbik7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9rc29ja19jb25uZWN0KCkgLSBDb25uZWN0IGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSByZW1vdGUgYWRkcmVzcy4KJiM0MzsgKiBAa3M6CQlUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dC4KJiM0MzsgKiBAb3B0czoJUG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyB3aXRoIHJlbW90ZSBhZGRyZXNzLgomIzQzOyAqIEBvcHRzX19zejoJU2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuCiYjNDM7ICoKJiM0MzsgKiBDb25uZWN0cyB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGFkZHJlc3MgYW5kIHBvcnQuCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCB3aGlsZSBjb25uZWN0aW5nIHRoZSBzb2NrZXQsIHNvIGl0IGNhbiBvbmx5IGJlIHVzZWQKJiM0MzsgKiBpbiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2tzb2NrX2Nvbm5lY3Qoc3RydWN0IGJwZl9rc29jayAqa3MsCiYjNDM7CQkJCSAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsCiYjNDM7CQkJCSAgdTMyIG9wdHNfX3N6KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9OwomIzQzOwlpbnQgYWRkcmxlbjsKJiM0MzsKJiM0MzsJaWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CWFkZHJsZW4gPSBicGZfa3NvY2tfZ2V0X2FkZHIob3B0cywgb3B0c19fc3osICZhbXA7YWRkcik7CiYjNDM7CWlmIChhZGRybGVuICZsdDsgMCkKJiM0MzsJCXJldHVybiBhZGRybGVuOwomIzQzOwomIzQzOwlyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoa3MtJmd0O3NvY2ssICZhbXA7YWRkciwgYWRkcmxlbiwgMCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9rc29ja19hY3F1aXJlKCkgLSBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIGEgQlBGIGtlcm5lbCBzb2NrZXQuCiYjNDM7ICogQGtzOglUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byBhY3F1aXJlLiBNdXN0IGJlIGEKJiM0MzsgKgl0cnVzdGVkIHBvaW50ZXIgKGUuZy4gUkNVLXByb3RlY3RlZCBrcHRyIGZyb20gYSBtYXApLgomIzQzOyAqCiYjNDM7ICogVGhlIGFjcXVpcmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3IKJiM0MzsgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2FjcXVpcmUoc3RydWN0IGJwZl9rc29jayAqa3MpCiYjNDM7ewomIzQzOwlpZiAoIXJlZmNvdW50X2luY19ub3RfemVybygmYW1wO2tzLSZndDt1c2FnZSkpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJcmV0dXJuIGtzOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfa3NvY2tfcmVsZWFzZSgpIC0gUmVsZWFzZSBhIEJQRiBrZXJuZWwgc29ja2V0LgomIzQzOyAqIEBrczoJVGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQgdG8gcmVsZWFzZS4KJiM0MzsgKgomIzQzOyAqIFdoZW4gdGhlIGZpbmFsIHJlZmVyZW5jZSBpcyByZWxlYXNlZCwgdGhlIHNvY2tldCBpcyBjbGVhbmVkIHVwIHZpYQomIzQzOyAqIHF1ZXVlX3JjdV93b3JrKCkgKHNpbmNlIHNvY2tfcmVsZWFzZSBtYXkgc2xlZXApLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2tzb2NrX3JlbGVhc2Uoc3RydWN0IGJwZl9rc29jayAqa3MpCiYjNDM7ewomIzQzOwlpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KCZhbXA7a3MtJmd0O3VzYWdlKSkgewomIzQzOwkJSU5JVF9SQ1VfV09SSygmYW1wO2tzLSZndDtyd29yaywga3NvY2tfcmVsZWFzZV93b3JrX2ZuKTsKJiM0MzsJCXF1ZXVlX3JjdV93b3JrKHN5c3RlbV9kZmxfd3EsICZhbXA7a3MtJmd0O3J3b3JrKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9rc29ja19yZWxlYXNlX2R0b3Iodm9pZCAqa3MpCiYjNDM7ewomIzQzOwlicGZfa3NvY2tfcmVsZWFzZShrcyk7CiYjNDM7fQomIzQzO0NGSV9OT1NFQUwoYnBmX2tzb2NrX3JlbGVhc2VfZHRvcik7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2tzb2NrX3NlbmQoKSAtIFNlbmQgZGF0YSB0aHJvdWdoIGEgQlBGIGtlcm5lbCBzb2NrZXQuCiYjNDM7ICogQGtzOgkJVGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQuIE11c3QgYmUgYW4gYWNxdWlyZWQgcmVmZXJlbmNlLgomIzQzOyAqIEBkYXRhOglQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHNlbmQuCiYjNDM7ICogQGRhdGFfX3N6OglTaXplIG9mIHRoZSBkYXRhIHRvIHNlbmQgKG1heCA2NTUzNSBieXRlcykuCiYjNDM7ICoKJiM0MzsgKiBTZW5kcyBkYXRhIG9uIGEgY29ubmVjdGVkIHNvY2tldCwgYmVzdC1lZmZvcnQgYW5kIG5vbmJsb2NraW5nLiBUaGlzIG1heSBzbGVlcAomIzQzOyAqIChrZXJuZWxfc2VuZG1zZyksIHNvIGl0IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHNsZWVwYWJsZSBCUEYgcHJvZ3JhbXMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IE51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIGludCBicGZfa3NvY2tfc2VuZChzdHJ1Y3QgYnBmX2tzb2NrICprcywgY29uc3Qgdm9pZCAqZGF0YSwKJiM0MzsJCQkgICAgICAgdTMyIGRhdGFfX3N6KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkIGd1YXJkOwomIzQzOwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKJiM0MzsJCS5tc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVQsCiYjNDM7CX07CiYjNDM7CXN0cnVjdCBrdmVjIGlvdiA9IHsKJiM0MzsJCS5pb3ZfYmFzZSA9ICh2b2lkICopZGF0YSwKJiM0MzsJCS5pb3ZfbGVuID0gZGF0YV9fc3osCiYjNDM7CX07CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKQomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwomIzQzOwkvKiBFYXJseSBjaGVjayBmb3IgVURQLiBFeGFjdCBsaW1pdHMgZW5mb3JjZWQgYnkga2VybmVsX3NlbmRtc2coKS4gKi8KJiM0MzsJaWYgKGRhdGFfX3N6ICZndDsgSVBfTUFYX01UVSkKJiM0MzsJCXJldHVybiAtRU1TR1NJWkU7CiYjNDM7CiYjNDM7CWlmICghYnBmX2tzb2NrX3NlbmRfZW50ZXIoJmFtcDtndWFyZCkpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwomIzQzOwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhrcy0mZ3Q7c29jaywgJmFtcDttc2csICZhbXA7aW92LCAxLCBkYXRhX19zeik7CiYjNDM7CWJwZl9rc29ja19zZW5kX2V4aXQoJmFtcDtndWFyZCk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiYjNDM7CiYjNDM7QlRGX0tGVU5DU19TVEFSVChrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19jcmVhdGUsIEtGX0FDUVVJUkUgfCBLRl9SRVRfTlVMTCB8IEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2JpbmQsIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2Nvbm5lY3QsIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfS0ZVTkNTX0VORChrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMpCiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGtzb2NrX2luaXRfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIgPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldCA9ICZhbXA7a3NvY2tfaW5pdF9rZnVuY19idGZfaWRzLAomIzQzO307CiYjNDM7CiYjNDM7QlRGX0tGVU5DU19TVEFSVChrc29ja19rZnVuY19idGZfaWRzKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfcmVsZWFzZSwgS0ZfUkVMRUFTRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2FjcXVpcmUsIEtGX0FDUVVJUkUgfCBLRl9SQ1UgfCBLRl9SRVRfTlVMTCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX3NlbmQsIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfS0ZVTkNTX0VORChrc29ja19rZnVuY19idGZfaWRzKQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnBmX2tzb2NrX2tmdW5jX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHUzMiBrZnVuY19pZCkKJiM0Mzt7CiYjNDM7CWlmICghYnRmX2lkX3NldDhfY29udGFpbnMoJmFtcDtrc29ja19rZnVuY19idGZfaWRzLCBrZnVuY19pZCkgfHwKJiM0MzsJICAgIHByb2ctJmd0O3R5cGUgPT0gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHx8CiYjNDM7CSAgICBwcm9nLSZndDt0eXBlID09IEJQRl9QUk9HX1RZUEVfTFNNKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiAtRUFDQ0VTOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQga3NvY2tfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIgPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldCA9ICZhbXA7a3NvY2tfa2Z1bmNfYnRmX2lkcywKJiM0MzsJLmZpbHRlciA9IGJwZl9rc29ja19rZnVuY19maWx0ZXIsCiYjNDM7fTsKJiM0MzsKJiM0MztCVEZfSURfTElTVChicGZfa3NvY2tfZHRvcl9pZHMpCiYjNDM7QlRGX0lEKHN0cnVjdCwgYnBmX2tzb2NrKQomIzQzO0JURl9JRChmdW5jLCBicGZfa3NvY2tfcmVsZWFzZV9kdG9yKQomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl9rc29ja19rZnVuY19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwljb25zdCBzdHJ1Y3QgYnRmX2lkX2R0b3Jfa2Z1bmMgYnBmX2tzb2NrX2R0b3JzW10gPSB7CiYjNDM7CQl7CiYjNDM7CQkJLmJ0Zl9pZCA9IGJwZl9rc29ja19kdG9yX2lkc1swXSwKJiM0MzsJCQkua2Z1bmNfYnRmX2lkID0gYnBmX2tzb2NrX2R0b3JfaWRzWzFdLAomIzQzOwkJfSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmYW1wO2JwZl9rc29ja19uZXRfb3BzKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLAomIzQzOwkJCQkJJmFtcDtrc29ja19pbml0X2tmdW5jX3NldCk7CiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmYW1wO2JwZl9rc29ja19uZXRfb3BzKTsKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsCiYjNDM7CQkJCQkmYW1wO2tzb2NrX2tmdW5jX3NldCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTFNNLAomIzQzOwkJCQkJICAgICAgICZhbXA7a3NvY2tfa2Z1bmNfc2V0KTsKJiM0MzsJcmV0dXJuIHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoYnBmX2tzb2NrX2R0b3JzLAomIzQzOwkJCQkJCSBBUlJBWV9TSVpFKGJwZl9rc29ja19kdG9ycyksCiYjNDM7CQkJCQkJIFRISVNfTU9EVUxFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfa3NvY2tfa2Z1bmNfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCmluZGV4IGI1MDg2MThiZmMxMjM5Li5kMjIxYTE4MGM4NzcwNSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMKQEAgLTcsNiAmIzQzOzcsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9maWx0ZXIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmX2tzb2NrLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zeXNjdGwuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKQEAgLTUyNSw2ICYjNDM7NTI2LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5ldF9jb3JlX3RhYmxlW10gPSB7CiAJCS5leHRyYTEJCT0gU1lTQ1RMX0xPTkdfT05FLAogCQkuZXh0cmEyCQk9ICZhbXA7YnBmX2ppdF9saW1pdF9tYXgsCiAJfSwKJiM0MzsjZW5kaWYKJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NZU0NBTEwpICZhbXA7JmFtcDsgSVNfRU5BQkxFRChDT05GSUdfSU5FVCkKJiM0MzsJewomIzQzOwkJLnByb2NuYW1lCT0gJiMzNDticGZfa3NvY2tfbWF4JiMzNDssCiYjNDM7CQkuZGF0YQkJPSAmYW1wO3N5c2N0bF9icGZfa3NvY2tfbWF4LAomIzQzOwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKJiM0MzsJCS5tb2RlCQk9IDA2NDQsCiYjNDM7CQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCiYjNDM7CQkuZXh0cmExCQk9IFNZU0NUTF9aRVJPLAomIzQzOwl9LAogI2VuZGlmCiAJewogCQkucHJvY25hbWUJPSAmIzM0O25ldGRldl90c3RhbXBfcHJlcXVldWUmIzM0OywKZGlmZiAtLWdpdCBhL25ldC9zb2NrZXQuYyBiL25ldC9zb2NrZXQuYwppbmRleCA2M2M2OWEwZmE3NGUxZS4uYzc0MjdkZDRkZDUyM2QgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvc29ja2V0LmMKQEAgLTIxMTUsMjcgJiM0MzsyMTE1LDMxIEBAIFNZU0NBTExfREVGSU5FMyhhY2NlcHQsIGludCwgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgdXBlZXJfc29ja2FkZHIsCiAgKglpbmNsdWRlIHRoZSAtRUlOUFJPR1JFU1Mgc3RhdHVzIGZvciBzdWNoIHNvY2tldHMuCiAgKi8KIAomIzQzO2ludCBfX3N5c19jb25uZWN0X3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcywKJiM0MzsJCQkgaW50IGFkZHJsZW4sIGludCBmbGFncykKJiM0Mzt7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CiYjNDM7CXJldHVybiBSRUFEX09OQ0Uoc29jay0mZ3Q7b3BzKS0mZ3Q7Y29ubmVjdChzb2NrLAomIzQzOwkJCQkgICAgKHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICopYWRkcmVzcywKJiM0MzsJCQkJICAgIGFkZHJsZW4sIGZsYWdzKTsKJiM0Mzt9CiYjNDM7CiBpbnQgX19zeXNfY29ubmVjdF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcywKIAkJICAgICAgIGludCBhZGRybGVuLCBpbnQgZmlsZV9mbGFncykKIHsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwotCWludCBlcnI7CiAKIAlzb2NrID0gc29ja19mcm9tX2ZpbGUoZmlsZSk7Ci0JaWYgKCFzb2NrKSB7Ci0JCWVyciA9IC1FTk9UU09DSzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXJyID0KLQkgICAgc2VjdXJpdHlfc29ja2V0X2Nvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsIGFkZHJsZW4pOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwomIzQzOwlpZiAoIXNvY2spCiYjNDM7CQlyZXR1cm4gLUVOT1RTT0NLOwogCi0JZXJyID0gUkVBRF9PTkNFKHNvY2stJmd0O29wcyktJmd0O2Nvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICopYWRkcmVzcywKLQkJCQkJICAgIGFkZHJsZW4sIHNvY2stJmd0O2ZpbGUtJmd0O2ZfZmxhZ3MgfCBmaWxlX2ZsYWdzKTsKLW91dDoKLQlyZXR1cm4gZXJyOwomIzQzOwlyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoc29jaywgYWRkcmVzcywgYWRkcmxlbiwKJiM0MzsJCQkJICAgIHNvY2stJmd0O2ZpbGUtJmd0O2ZfZmxhZ3MgfCBmaWxlX2ZsYWdzKTsKIH0KIAogaW50IF9fc3lzX2Nvbm5lY3QoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1c2VydmFkZHIsIGludCBhZGRybGVuKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjhiMTRmZDk4ZDQxMGVkCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYwpAQCAtMCwwICYjNDM7MSwyMzkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7YXJwYS9pbmV0LmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt0ZXN0X3Byb2dzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7bmV0d29ya19oZWxwZXJzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7a3NvY2tfYmFzaWMuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX3JlY3Vyc2lvbi5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgTlNfVEVTVCAmIzM0O2tzb2NrX2Jhc2ljX25zJiMzNDsKJiM0MzsjZGVmaW5lIE5TX0xTTV9SRUNVUlNJT05fVEVTVCAmIzM0O2tzb2NrX2xzbV9yZWN1cnNpb25fbnMmIzM0OwomIzQzOyNkZWZpbmUgTE9PUEJBQ0tfSVAgJiMzNDsxMjcuMC4wLjEmIzM0OwomIzQzOyNkZWZpbmUgUkVDVl9QT1JUIDc3NzcKJiM0MzsjZGVmaW5lIFJFQ1ZfVElNRU9VVF9TRUMgNQomIzQzOwomIzQzO3N0cnVjdCBrc29ja190ZXN0X2VudiB7CiYjNDM7CWNvbnN0IGNoYXIgKm5ldG5zOwomIzQzOwlib29sIG5ldG5zX2NyZWF0ZWQ7CiYjNDM7CXN0cnVjdCBuc3Rva2VuICpuc3Rva2VuOwomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKJiM0MzsJaW50IHJmZDsKJiM0MzsJY2hhciBidWZbMzJdOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga3NvY2tfdGVzdF9lbnZfc2V0dXAoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYsIGNvbnN0IGNoYXIgKm5ldG5zKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWV2YWwgdHY7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CW1lbXNldChlbnYsIDAsIHNpemVvZigqZW52KSk7CiYjNDM7CWVudi0mZ3Q7bmV0bnMgPSBuZXRuczsKJiM0MzsJZW52LSZndDtyZmQgPSAtMTsKJiM0MzsKJiM0MzsJU1lTKGZhaWwsICYjMzQ7aXAgbmV0bnMgYWRkICVzJiMzNDssIG5ldG5zKTsKJiM0MzsJZW52LSZndDtuZXRuc19jcmVhdGVkID0gdHJ1ZTsKJiM0MzsJU1lTKGZhaWwsICYjMzQ7aXAgLW5ldCAlcyBsaW5rIHNldCBsbyB1cCYjMzQ7LCBuZXRucyk7CiYjNDM7CiYjNDM7CWVudi0mZ3Q7bnN0b2tlbiA9IG9wZW5fbmV0bnMobmV0bnMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZW52LSZndDtuc3Rva2VuLCAmIzM0O29wZW5fbmV0bnMmIzM0OykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CWVudi0mZ3Q7cmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZW52LSZndDtyZmQsICYjMzQ7cmVjZWl2ZXIgc29ja2V0JiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwllbnYtJmd0O2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CiYjNDM7CWVudi0mZ3Q7YWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoTE9PUEJBQ0tfSVApOwomIzQzOwllbnYtJmd0O2FkZHIuc2luX3BvcnQgPSBodG9ucyhSRUNWX1BPUlQpOwomIzQzOwomIzQzOwllcnIgPSBiaW5kKGVudi0mZ3Q7cmZkLCAoc3RydWN0IHNvY2thZGRyICopJmFtcDtlbnYtJmd0O2FkZHIsIHNpemVvZihlbnYtJmd0O2FkZHIpKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2JpbmQgcmVjZWl2ZXImIzM0OykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CXR2LnR2X3NlYyA9IFJFQ1ZfVElNRU9VVF9TRUM7CiYjNDM7CXR2LnR2X3VzZWMgPSAwOwomIzQzOwllcnIgPSBzZXRzb2Nrb3B0KGVudi0mZ3Q7cmZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJmFtcDt0diwgc2l6ZW9mKHR2KSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXQgcmN2dGltZW8mIzM0OykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzOwomIzQzO2ZhaWw6CiYjNDM7CWlmIChlbnYtJmd0O3JmZCAmZ3Q7PSAwKSB7CiYjNDM7CQljbG9zZShlbnYtJmd0O3JmZCk7CiYjNDM7CQllbnYtJmd0O3JmZCA9IC0xOwomIzQzOwl9CiYjNDM7CWlmIChlbnYtJmd0O25zdG9rZW4pIHsKJiM0MzsJCWNsb3NlX25ldG5zKGVudi0mZ3Q7bnN0b2tlbik7CiYjNDM7CQllbnYtJmd0O25zdG9rZW4gPSBOVUxMOwomIzQzOwl9CiYjNDM7CWlmIChlbnYtJmd0O25ldG5zX2NyZWF0ZWQpIHsKJiM0MzsJCVNZU19OT0ZBSUwoJiMzNDtpcCBuZXRucyBkZWwgJXMgJmd0Oy9kZXYvbnVsbCAyJmd0OyZhbXA7MSYjMzQ7LCBuZXRucyk7CiYjNDM7CQllbnYtJmd0O25ldG5zX2NyZWF0ZWQgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGtzb2NrX3Rlc3RfZW52X2NsZWFudXAoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYpCiYjNDM7ewomIzQzOwlpZiAoZW52LSZndDtyZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGVudi0mZ3Q7cmZkKTsKJiM0MzsJaWYgKGVudi0mZ3Q7bnN0b2tlbikKJiM0MzsJCWNsb3NlX25ldG5zKGVudi0mZ3Q7bnN0b2tlbik7CiYjNDM7CWlmIChlbnYtJmd0O25ldG5zX2NyZWF0ZWQpIHsKJiM0MzsJCVNZU19OT0ZBSUwoJiMzNDtpcCBuZXRucyBkZWwgJXMgJmd0Oy9kZXYvbnVsbCAyJmd0OyZhbXA7MSYjMzQ7LCBlbnYtJmd0O25ldG5zKTsKJiM0MzsJCWVudi0mZ3Q7bmV0bnNfY3JlYXRlZCA9IGZhbHNlOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGtzb2NrX2Fzc2VydF9yZWN2KHN0cnVjdCBrc29ja190ZXN0X2VudiAqZW52LCBjb25zdCBjaGFyICpkYXRhLAomIzQzOwkJCSAgICAgIHNpemVfdCBkYXRhX3N6KQomIzQzO3sKJiM0MzsJc3NpemVfdCBuOwomIzQzOwomIzQzOwltZW1zZXQoZW52LSZndDtidWYsIDAsIHNpemVvZihlbnYtJmd0O2J1ZikpOwomIzQzOwluID0gcmVjdmZyb20oZW52LSZndDtyZmQsIGVudi0mZ3Q7YnVmLCBzaXplb2YoZW52LSZndDtidWYpLCAwLCBOVUxMLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEobiwgZGF0YV9zeiwgJiMzNDtyZWN2ZnJvbSBsZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CUFTU0VSVF9NRU1FUShlbnYtJmd0O2J1ZiwgZGF0YSwgZGF0YV9zeiwgJiMzNDtwYXlsb2FkIG1hdGNoJiMzNDspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBrc29ja19zZXR1cF9jdHgoc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nLCBfX2JlMzIgKmlwdjRfcmVtb3RlLAomIzQzOwkJCSAgICBfX3UxNiAqcmVtb3RlX3BvcnQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7CiYjNDM7CWludCBlcnIsIHBmZDsKJiM0MzsKJiM0MzsJKmlwdjRfcmVtb3RlID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTsKJiM0MzsJKnJlbW90ZV9wb3J0ID0gUkVDVl9QT1JUOwomIzQzOwomIzQzOwlwZmQgPSBicGZfcHJvZ3JhbV9fZmQocHJvZyk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKHBmZCwgJiMzNDtrc29ja19zZXR1cCBmZCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwZmQsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtrc29ja19zZXR1cCBydW4mIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWlmICghQVNTRVJUX09LKG9wdHMucmV0dmFsLCAmIzM0O2tzb2NrX3NldHVwIHJldHZhbCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9rc29ja19iYXNpYyh2b2lkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpOwomIzQzOwlzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgZW52OwomIzQzOwlzdHJ1Y3Qga3NvY2tfYmFzaWMgKnNrZWw7CiYjNDM7CWludCBlcnIsIHBmZDsKJiM0MzsKJiM0MzsJc2tlbCA9IGtzb2NrX2Jhc2ljX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3NrZWwgb3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZXJyID0ga3NvY2tfYmFzaWNfX2xvYWQoc2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtza2VsIGxvYWQmIzM0OykpIHsKJiM0MzsJCWtzb2NrX2Jhc2ljX19kZXN0cm95KHNrZWwpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoJmFtcDtlbnYsIE5TX1RFU1QpKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBTdGVwIDE6IFJ1biB0aGUgc2V0dXAgU1lTQ0FMTCBwcm9nIHRvIGNyZWF0ZSBrc29jayAqLwomIzQzOwlpZiAoIWtzb2NrX3NldHVwX2N0eChza2VsLSZndDtwcm9ncy5rc29ja19zZXR1cCwKJiM0MzsJCQkgICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDtpcHY0X3JlbW90ZSwKJiM0MzsJCQkgICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDtyZW1vdGVfcG9ydCkpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMjogUnVuIHRoZSBzZW5kIFNZU0NBTEwgcHJvZyAqLwomIzQzOwlwZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mua3NvY2tfc2VuZCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKHBmZCwgJiMzNDtrc29ja19zZW5kIGZkJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHBmZCwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2tzb2NrX3NlbmQgcnVuJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwlpZiAoIUFTU0VSVF9FUShvcHRzLnJldHZhbCwKJiM0MzsJCSAgICAgICBzaXplb2Yoc2tlbC0mZ3Q7ZGF0YS0mZ3Q7c2VuZF9kYXRhKSwgJiMzNDtzZW5kbXNnIGJ5dGVzJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBTdGVwIDM6IFJlY2VpdmUgYW5kIHZlcmlmeSB0aGUgZGF0YSAqLwomIzQzOwlrc29ja19hc3NlcnRfcmVjdigmYW1wO2Vudiwgc2tlbC0mZ3Q7ZGF0YS0mZ3Q7c2VuZF9kYXRhLAomIzQzOwkJCSAgc2l6ZW9mKHNrZWwtJmd0O2RhdGEtJmd0O3NlbmRfZGF0YSkpOwomIzQzOwomIzQzO2ZhaWw6CiYjNDM7CWtzb2NrX3Rlc3RfZW52X2NsZWFudXAoJmFtcDtlbnYpOwomIzQzOwlrc29ja19iYXNpY19fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2tzb2NrX2xzbV9yZWN1cnNpb24odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrc29ja190ZXN0X2VudiBlbnY7CiYjNDM7CXN0cnVjdCBrc29ja19yZWN1cnNpb24gKnNrZWw7CiYjNDM7CWNoYXIgdHJpZ2dlciA9ICYjMzk7eCYjMzk7OwomIzQzOwlpbnQgdGZkID0gLTE7CiYjNDM7CWludCBlcnI7CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsKJiM0MzsJc2tlbCA9IGtzb2NrX3JlY3Vyc2lvbl9fb3BlbigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtza2VsIG9wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IGtzb2NrX3JlY3Vyc2lvbl9fbG9hZChza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NrZWwgbG9hZCYjMzQ7KSkgewomIzQzOwkJa3NvY2tfcmVjdXJzaW9uX19kZXN0cm95KHNrZWwpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoJmFtcDtlbnYsIE5TX0xTTV9SRUNVUlNJT05fVEVTVCkpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMTogUnVuIHRoZSBzZXR1cCBTWVNDQUxMIHByb2cgdG8gY3JlYXRlIHRoZSBrc29jayAqLwomIzQzOwlpZiAoIWtzb2NrX3NldHVwX2N0eChza2VsLSZndDtwcm9ncy5rc29ja19zZXR1cCwKJiM0MzsJCQkgICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDtpcHY0X3JlbW90ZSwKJiM0MzsJCQkgICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDtyZW1vdGVfcG9ydCkpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMjogQXR0YWNoIExTTSBwcm9nIGFuZCB0cmlnZ2VyIHNvY2tldF9zZW5kbXNnIGZyb20gdXNlcnNwYWNlICovCiYjNDM7CXNrZWwtJmd0O2xpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnID0KJiM0MzsJCWJwZl9wcm9ncmFtX19hdHRhY2hfbHNtKHNrZWwtJmd0O3Byb2dzLmtzb2NrX3NvY2tldF9zZW5kbXNnKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtJmd0O2xpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnLAomIzQzOwkJCSAgICYjMzQ7YXR0YWNoIHNvY2tldF9zZW5kbXNnIGxzbSYjMzQ7KSkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJdGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQodGZkLCAmIzM0O3RyaWdnZXIgc29ja2V0JiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3RhcmdldF9waWQgPSBnZXRwaWQoKTsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0cmlnZ2VyX3NlbmQgPSAxOwomIzQzOwluID0gc2VuZHRvKHRmZCwgJmFtcDt0cmlnZ2VyLCBzaXplb2YodHJpZ2dlciksIDAsCiYjNDM7CQkgICAoc3RydWN0IHNvY2thZGRyICopJmFtcDtlbnYuYWRkciwgc2l6ZW9mKGVudi5hZGRyKSk7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGFyZ2V0X3BpZCA9IDA7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dHJpZ2dlcl9zZW5kID0gMDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEobiwgc2l6ZW9mKHRyaWdnZXIpLCAmIzM0O3RyaWdnZXIgc2VuZHRvJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBTdGVwIDM6IFRoZSBuZXN0ZWQgYnBmX2tzb2NrX3NlbmQoKSBtdXN0IGhpdCB0aGUgcmVjdXJzaW9uIGd1YXJkICovCiYjNDM7CWlmICghQVNTRVJUX0VRKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjX2NvdW50LCAyLAomIzQzOwkJICAgICAgICYjMzQ7c29ja2V0X3NlbmRtc2cgcmVjdXJzaW9uIGNvdW50JiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtkYXRhLSZndDtyZWNfa2Z1bmNfcmV0c1swXSwgLUVCVVNZLAomIzQzOwkJICAgICAgICYjMzQ7cmVjdXJzaXZlIHNlbmQgc3RhdHVzJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtkYXRhLSZndDtyZWNfa2Z1bmNfcmV0c1sxXSwKJiM0MzsJCSAgICAgICBzaXplb2Yoc2tlbC0mZ3Q7ZGF0YS0mZ3Q7c2VuZF9kYXRhKSwgJiMzNDtvdXRlciBzZW5kIGJ5dGVzJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwlrc29ja19hc3NlcnRfcmVjdigmYW1wO2Vudiwgc2tlbC0mZ3Q7ZGF0YS0mZ3Q7c2VuZF9kYXRhLAomIzQzOwkJCSAgc2l6ZW9mKHNrZWwtJmd0O2RhdGEtJmd0O3NlbmRfZGF0YSkpOwomIzQzOwomIzQzO2ZhaWw6CiYjNDM7CWlmICh0ZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHRmZCk7CiYjNDM7CWtzb2NrX3Rlc3RfZW52X2NsZWFudXAoJmFtcDtlbnYpOwomIzQzOwlrc29ja19yZWN1cnNpb25fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3F1b3RhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmM4NmQ5YjBhOTUxM2U4Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuYwpAQCAtMCwwICYjNDM7MSwxMzkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3Rlc3RfcHJvZ3MuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtuZXR3b3JrX2hlbHBlcnMuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtzeXNjdGxfaGVscGVycy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX3F1b3RhLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBOU19ORVRfUVVPVEFfVEVTVDEgJiMzNDtrc29ja19uZXRfcXVvdGFfbnMxJiMzNDsKJiM0MzsjZGVmaW5lIE5TX05FVF9RVU9UQV9URVNUMiAmIzM0O2tzb2NrX25ldF9xdW90YV9uczImIzM0OwomIzQzOyNkZWZpbmUgS1NPQ0tfTUFYX1NZU0NUTCAmIzM0Oy9wcm9jL3N5cy9uZXQvY29yZS9icGZfa3NvY2tfbWF4JiMzNDsKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TX1NMT1RTIDMKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TMV9PRkZTRVQgMAomIzQzOyNkZWZpbmUgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCBLU09DS19RVU9UQV9OU19TTE9UUwomIzQzOwomIzQzO3N0YXRpYyBpbnQga3NvY2tfcnVuX3Byb2coc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChwcm9nKSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CXJldHVybiBvcHRzLnJldHZhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIF9fdTY0IGtzb2NrX3F1b3RhX3JlbGVhc2VfY29tcGxldGVkKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX2F0b21pY19sb2FkX24oJmFtcDtza2VsLSZndDtic3MtJmd0O3F1b3RhX3JlbGVhc2VfY29tcGxldGVkLAomIzQzOwkJCSAgICAgICBfX0FUT01JQ19BQ1FVSVJFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBrc29ja19yZWxlYXNlX3F1b3RhX3Nsb3RzKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCwgaW50IHNsb3Rfb2Zmc2V0KQomIzQzO3sKJiM0MzsJX191NjQgY29tcGxldGVkOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwljb21wbGV0ZWQgPSBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKTsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtxdW90YV9zbG90X29mZnNldCA9IHNsb3Rfb2Zmc2V0OwomIzQzOwllcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLSZndDtwcm9ncy5rc29ja19xdW90YV9yZWxlYXNlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2tzb2NrX3F1b3RhX3JlbGVhc2UmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXdoaWxlIChrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKSAtIGNvbXBsZXRlZCAmbHQ7CiYjNDM7CSAgICAgICBza2VsLSZndDtic3MtJmd0O3F1b3RhX3JlbGVhc2VkKQomIzQzOwkJdXNsZWVwKDEwMDApOwomIzQzOwomIzQzOwlyZXR1cm4gc2tlbC0mZ3Q7YnNzLSZndDtxdW90YV9yZWxlYXNlZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga3NvY2tfZXhwZWN0X3F1b3RhKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCwgaW50IHNsb3Rfb2Zmc2V0LAomIzQzOwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtxdW90YV9zbG90X29mZnNldCA9IHNsb3Rfb2Zmc2V0OwomIzQzOwllcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLSZndDtwcm9ncy5rc29ja19xdW90YV9jcmVhdGUpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsIG5hbWUpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3F1b3RhX2NyZWF0ZWQsIDIsIG5hbWUpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlyZXR1cm4gQVNTRVJUX0VRKHNrZWwtJmd0O2Jzcy0mZ3Q7cXVvdGFfZXJyLCAtRU5PU1BDLCBuYW1lKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgcmVjb3JkX2N1cnJlbnRfbnMoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgdGFyZ2V0KQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IHN0YXQoJiMzNDsvcHJvYy9zZWxmL25zL25ldCYjMzQ7LCAmYW1wO3N0KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3N0YXQgbmV0bnMmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGFyZ2V0X25ldG5zX2ludW1bdGFyZ2V0XSA9IChfX3UzMilzdC5zdF9pbm87CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2tzb2NrX25ldF9xdW90YSh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBvbGRfbWF4WzE2XSA9IHt9OwomIzQzOwlzdHJ1Y3QgbmV0bnNfb2JqICpuZXRuczEgPSBOVUxMLCAqbmV0bnMyID0gTlVMTDsKJiM0MzsJc3RydWN0IGtzb2NrX3F1b3RhICpza2VsOwomIzQzOwlpbnQgcmVsZWFzZWQ7CiYjNDM7CiYjNDM7CXNrZWwgPSBrc29ja19xdW90YV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtrc29jayBxdW90YSBza2VsZXRvbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJc2tlbC0mZ3Q7bGlua3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyID0KJiM0MzsJCWJwZl9wcm9ncmFtX19hdHRhY2hfdHJhY2Uoc2tlbC0mZ3Q7cHJvZ3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtJmd0O2xpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlciwKJiM0MzsJCQkgICAmIzM0O2F0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZW50cnkmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJc2tlbC0mZ3Q7bGlua3Mua3NvY2tfcmVsZWFzZV93b3JrX2V4aXQgPQomIzQzOwkJYnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLSZndDtwcm9ncy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLSZndDtsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCwKJiM0MzsJCQkgICAmIzM0O2F0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZXhpdCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoc3lzY3RsX3NldF9vcl9mYWlsKEtTT0NLX01BWF9TWVNDVEwsIG9sZF9tYXgsICYjMzQ7MiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwluZXRuczEgPSBuZXRuc19uZXcoTlNfTkVUX1FVT1RBX1RFU1QxLCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMSwgJiMzNDtjcmVhdGUgZmlyc3QgbmV0bnMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFyZWNvcmRfY3VycmVudF9ucyhza2VsLCAwKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIWtzb2NrX2V4cGVjdF9xdW90YShza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VULAomIzQzOwkJCQkmIzM0O2ZpcnN0IG5ldG5zIHF1b3RhJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIFRoZSBob3N0LXdpZGUgc2V0dGluZyBncmFudHMgdGhlIGZ1bGwgYWxsb3dhbmNlIHRvIGVhY2ggbmV0bnMuICovCiYjNDM7CW5ldG5zMiA9IG5ldG5zX25ldyhOU19ORVRfUVVPVEFfVEVTVDIsIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobmV0bnMyLCAmIzM0O2NyZWF0ZSBzZWNvbmQgbmV0bnMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFyZWNvcmRfY3VycmVudF9ucyhza2VsLCAxKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIWtzb2NrX2V4cGVjdF9xdW90YShza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VULAomIzQzOwkJCQkmIzM0O3NlY29uZCBuZXRucyBxdW90YSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlyZWxlYXNlZCA9IGtzb2NrX3JlbGVhc2VfcXVvdGFfc2xvdHMoc2tlbCwgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJlbGVhc2VkLCAyLCAmIzM0O3NlY29uZCBuZXRucyBxdW90YSByZWxlYXNlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBCb3RoIHJlbGVhc2VkIHNsb3RzIG11c3QgYmVjb21lIGF2YWlsYWJsZSBhZ2Fpbi4gKi8KJiM0MzsJa3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQsICYjMzQ7cmVjb3ZlcmVkIHF1b3RhJiMzNDspOwomIzQzOwomIzQzO291dDoKJiM0MzsJa3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTsKJiM0MzsJa3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VUKTsKJiM0MzsJbmV0bnNfZnJlZShuZXRuczIpOwomIzQzOwluZXRuc19mcmVlKG5ldG5zMSk7CiYjNDM7CWlmIChvbGRfbWF4WzBdKQomIzQzOwkJc3lzY3RsX3NldF9vcl9mYWlsKEtTT0NLX01BWF9TWVNDVEwsIE5VTEwsIG9sZF9tYXgpOwomIzQzOwlrc29ja19xdW90YV9fZGVzdHJveShza2VsKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja193cS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uMTg0YjEzNGYzODIzNzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja193cS5jCkBAIC0wLDAgJiM0MzsxLDM0IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dGVzdF9wcm9ncy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX3dxLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2tzb2NrX3dxKHZvaWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7CiYjNDM7CXN0cnVjdCBrc29ja193cSAqc2tlbDsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJc2tlbCA9IGtzb2NrX3dxX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O2tzb2NrX3dxIG9wZW4gYW5kIGxvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLmtzb2NrX3dxX3N0YXJ0KSwKJiM0MzsJCQkJICAgICAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuIGtzb2NrX3dxX3N0YXJ0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LKG9wdHMucmV0dmFsLCAmIzM0O2tzb2NrX3dxX3N0YXJ0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwl3aGlsZSAoIV9fYXRvbWljX2xvYWRfbigmYW1wO3NrZWwtJmd0O2Jzcy0mZ3Q7Y2FsbGJhY2tfZG9uZSwgX19BVE9NSUNfQUNRVUlSRSkpCiYjNDM7CQl1c2xlZXAoMTAwMCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O2NyZWF0ZV9lcnIsIC1FT1BOT1RTVVBQLAomIzQzOwkJICAmIzM0O3dvcmtxdWV1ZSBjcmVhdGUgcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlrc29ja193cV9fZGVzdHJveShza2VsKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfYmFzaWMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xODliMGZjMTU3NzAxMQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jCkBAIC0wLDAgJiM0MzsxLDM3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfZW5kaWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfdHJhY2luZ19uZXQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc29ja19jb21tb24uaCYjMzQ7CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBrc29ja19zZXR1cCh2b2lkICpjdHgpCiYjNDM7ewomIzQzOwlyZXR1cm4gZG9fa3NvY2tfc2V0dXAoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBrc29ja19zZW5kKHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSAqdjsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqa3M7CiYjNDM7CWludCBzZW5kID0gLTE7CiYjNDM7CiYjNDM7CXYgPSBrc29ja19jdHhfdmFsdWVfbG9va3VwKCk7CiYjNDM7CWlmICghdikKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwomIzQzOwlrcyA9IGJwZl9rcHRyX3hjaGcoJmFtcDt2LSZndDtjdHgsIE5VTEwpOwomIzQzOwlpZiAoIWtzKQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CXNlbmQgPSBicGZfa3NvY2tfc2VuZChrcywgc2VuZF9kYXRhLCBzaXplb2Yoc2VuZF9kYXRhKSk7CiYjNDM7CWJwZl9rc29ja19yZWxlYXNlKGtzKTsKJiM0MzsJcmV0dXJuIHNlbmQ7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdjZjY0MzE5YjkwMTQ1Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2NvbW1vbi5oCkBAIC0wLDAgJiM0MzsxLDExMCBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqLwomIzQzOwomIzQzOyNpZm5kZWYgX0tTT0NLX0NPTU1PTl9ICiYjNDM7I2RlZmluZSBfS1NPQ0tfQ09NTU9OX0gKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Vycm5vLmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBTT0NLX1NUUkVBTQkxCiYjNDM7I2RlZmluZSBTT0NLX0RHUkFNCTIKJiM0MzsjZGVmaW5lIElQUFJPVE9fVENQCTYKJiM0MzsjZGVmaW5lIElQUFJPVE9fVURQCTE3CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2NyZWF0ZShjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzICpvcHRzLAomIzQzOwkJCQkgICB1MzIgb3B0c19fc3osIGludCAqZXJyX191bmluaXQpIF9fa3N5bTsKJiM0MztpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsCiYjNDM7CQkgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6KSBfX2tzeW07CiYjNDM7aW50IGJwZl9rc29ja19jb25uZWN0KHN0cnVjdCBicGZfa3NvY2sgKmtzLAomIzQzOwkJICAgICAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsIHUzMiBvcHRzX19zeikgX19rc3ltOwomIzQzO3N0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19hY3F1aXJlKHN0cnVjdCBicGZfa3NvY2sgKmtzKSBfX2tzeW07CiYjNDM7dm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcykgX19rc3ltOwomIzQzO2ludCBicGZfa3NvY2tfc2VuZChzdHJ1Y3QgYnBmX2tzb2NrICprcywKJiM0MzsJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBkYXRhX19zeikgX19rc3ltOwomIzQzOwomIzQzO3N0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSB7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4OwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdHlwZShrZXksIGludCk7CiYjNDM7CV9fdHlwZSh2YWx1ZSwgc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0Mzt9IF9fa3NvY2tfY3R4X21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSAqa3NvY2tfY3R4X3ZhbHVlX2xvb2t1cCh2b2lkKQomIzQzO3sKJiM0MzsJdTMyIGtleSA9IDA7CiYjNDM7CiYjNDM7CXJldHVybiBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7X19rc29ja19jdHhfbWFwLCAmYW1wO2tleSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IGtzb2NrX2N0eF9pbnNlcnQoc3RydWN0IGJwZl9rc29jayAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlIGxvY2FsLCAqdjsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqb2xkOwomIzQzOwl1MzIga2V5ID0gMDsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJbG9jYWwuY3R4ID0gTlVMTDsKJiM0MzsJZXJyID0gYnBmX21hcF91cGRhdGVfZWxlbSgmYW1wO19fa3NvY2tfY3R4X21hcCwgJmFtcDtrZXksICZhbXA7bG9jYWwsIDApOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlicGZfa3NvY2tfcmVsZWFzZShjdHgpOwomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwl2ID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO19fa3NvY2tfY3R4X21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIXYpIHsKJiM0MzsJCWJwZl9rc29ja19yZWxlYXNlKGN0eCk7CiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJfQomIzQzOwomIzQzOwlvbGQgPSBicGZfa3B0cl94Y2hnKCZhbXA7di0mZ3Q7Y3R4LCBjdHgpOwomIzQzOwlpZiAob2xkKSB7CiYjNDM7CQlicGZfa3NvY2tfcmVsZWFzZShvbGQpOwomIzQzOwkJcmV0dXJuIC1FRVhJU1Q7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIEdsb2JhbHMgZm9yIHBhc3NpbmcgY29uZmlnIGZyb20gdXNlcnNwYWNlICovCiYjNDM7X19iZTMyIGlwdjRfcmVtb3RlOwomIzQzO19fdTE2IHJlbW90ZV9wb3J0OwomIzQzOwomIzQzO2NoYXIgc2VuZF9kYXRhWzMyXSA9ICYjMzQ7aGVsbG8gZnJvbSBicGYga3NvY2smIzM0OzsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBkb19rc29ja19zZXR1cCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBjcmVhdGVfb3B0cyA9IHt9OwomIzQzOwlzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyBhZGRyX29wdHMgPSB7fTsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqa3M7CiYjNDM7CWludCBlcnIgPSAwOwomIzQzOwomIzQzOwljcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUOwomIzQzOwljcmVhdGVfb3B0cy50eXBlID0gU09DS19ER1JBTTsKJiM0MzsJY3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKJiM0MzsKJiM0MzsJa3MgPSBicGZfa3NvY2tfY3JlYXRlKCZhbXA7Y3JlYXRlX29wdHMsIHNpemVvZihjcmVhdGVfb3B0cyksICZhbXA7ZXJyKTsKJiM0MzsJaWYgKCFrcykKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CiYjNDM7CWFkZHJfb3B0cy5mYW1pbHkgPSBBRl9JTkVUOwomIzQzOwlhZGRyX29wdHMucG9ydCA9IHJlbW90ZV9wb3J0OwomIzQzOwlhZGRyX29wdHMuaXB2NF9hZGRyID0gaXB2NF9yZW1vdGU7CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9rc29ja19jb25uZWN0KGtzLCAmYW1wO2FkZHJfb3B0cywgc2l6ZW9mKGFkZHJfb3B0cykpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlicGZfa3NvY2tfcmVsZWFzZShrcyk7CiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IGtzb2NrX2N0eF9pbnNlcnQoa3MpOwomIzQzOwlpZiAoZXJyICZhbXA7JmFtcDsgZXJyICE9IC1FRVhJU1QpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7I2VuZGlmIC8qIF9LU09DS19DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3F1b3RhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uOTE4NTRlYTMzM2MxMjEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuYwpAQCAtMCwwICYjNDM7MSwxNjcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfY29yZV9yZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl90cmFjaW5nX25ldC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX2NvbW1vbi5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TX1NMT1RTIDMKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05FVE5TIDIKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX1NMT1RTIChLU09DS19RVU9UQV9OU19TTE9UUyAqIEtTT0NLX1FVT1RBX05FVE5TKQomIzQzOwomIzQzO3N0cnVjdCBrc29ja19xdW90YV92YWx1ZSB7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4OwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdHlwZShrZXksIHUzMik7CiYjNDM7CV9fdHlwZSh2YWx1ZSwgc3RydWN0IGtzb2NrX3F1b3RhX3ZhbHVlKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCBLU09DS19RVU9UQV9TTE9UUyk7CiYjNDM7fSBxdW90YV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTsKJiM0MzsJX190eXBlKGtleSwgdTY0KTsKJiM0MzsJX190eXBlKHZhbHVlLCB1OCk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgS1NPQ0tfUVVPVEFfU0xPVFMpOwomIzQzO30gcmVsZWFzZV93b3JrZXJzIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO3UzMiBxdW90YV9jcmVhdGVkOwomIzQzO3UzMiBxdW90YV9yZWxlYXNlZDsKJiM0Mzt1MzIgcXVvdGFfc2xvdF9vZmZzZXQ7CiYjNDM7dTMyIHRhcmdldF9uZXRuc19pbnVtW0tTT0NLX1FVT1RBX05FVE5TXTsKJiM0Mzt1NjQgcXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQ7CiYjNDM7aW50IHF1b3RhX2VycjsKJiM0MzsKJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wKJiM0Mztrc29ja19xdW90YV9jcmVhdGVfb25lKHUzMiBpLAomIzQzOwkJICAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKmNyZWF0ZV9vcHRzKQomIzQzO3sKJiM0MzsJc3RydWN0IGtzb2NrX3F1b3RhX3ZhbHVlICp2OwomIzQzOwlzdHJ1Y3QgYnBmX2tzb2NrICprcywgKm9sZDsKJiM0MzsJaW50IGVyciA9IDA7CiYjNDM7CiYjNDM7CWkgJiM0Mzs9IHF1b3RhX3Nsb3Rfb2Zmc2V0OwomIzQzOwlpZiAoaSAmZ3Q7PSBLU09DS19RVU9UQV9TTE9UUykgewomIzQzOwkJcXVvdGFfZXJyID0gLUVSQU5HRTsKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWJhcnJpZXJfdmFyKGVycik7CiYjNDM7CWtzID0gYnBmX2tzb2NrX2NyZWF0ZShjcmVhdGVfb3B0cywgc2l6ZW9mKCpjcmVhdGVfb3B0cyksICZhbXA7ZXJyKTsKJiM0MzsJaWYgKCFrcykgewomIzQzOwkJcXVvdGFfZXJyID0gZXJyOwomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJdiA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDtxdW90YV9tYXAsICZhbXA7aSk7CiYjNDM7CWlmICghdikgewomIzQzOwkJYnBmX2tzb2NrX3JlbGVhc2Uoa3MpOwomIzQzOwkJcXVvdGFfZXJyID0gLUVOT0VOVDsKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CW9sZCA9IGJwZl9rcHRyX3hjaGcoJmFtcDt2LSZndDtjdHgsIGtzKTsKJiM0MzsJaWYgKG9sZCkKJiM0MzsJCWJwZl9rc29ja19yZWxlYXNlKG9sZCk7CiYjNDM7CXF1b3RhX2NyZWF0ZWQmIzQzOyYjNDM7OwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBrc29ja19xdW90YV9yZWxlYXNlX29uZSh1MzIgaSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqa3M7CiYjNDM7CiYjNDM7CWkgJiM0Mzs9IHF1b3RhX3Nsb3Rfb2Zmc2V0OwomIzQzOwlpZiAoaSAmZ3Q7PSBLU09DS19RVU9UQV9TTE9UUykKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJdiA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDtxdW90YV9tYXAsICZhbXA7aSk7CiYjNDM7CWlmICghdikKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJa3MgPSBicGZfa3B0cl94Y2hnKCZhbXA7di0mZ3Q7Y3R4LCBOVUxMKTsKJiM0MzsJaWYgKGtzKSB7CiYjNDM7CQlicGZfa3NvY2tfcmVsZWFzZShrcyk7CiYjNDM7CQlxdW90YV9yZWxlYXNlZCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBrc29ja19xdW90YV9jcmVhdGUodm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBjcmVhdGVfb3B0cyA9IHt9OwomIzQzOwomIzQzOwljcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUOwomIzQzOwljcmVhdGVfb3B0cy50eXBlID0gU09DS19ER1JBTTsKJiM0MzsJY3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKJiM0MzsJcXVvdGFfY3JlYXRlZCA9IDA7CiYjNDM7CXF1b3RhX2VyciA9IDA7CiYjNDM7CiYjNDM7CWlmIChrc29ja19xdW90YV9jcmVhdGVfb25lKDAsICZhbXA7Y3JlYXRlX29wdHMpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmIChrc29ja19xdW90YV9jcmVhdGVfb25lKDEsICZhbXA7Y3JlYXRlX29wdHMpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWtzb2NrX3F1b3RhX2NyZWF0ZV9vbmUoMiwgJmFtcDtjcmVhdGVfb3B0cyk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IGtzb2NrX3F1b3RhX3JlbGVhc2Uodm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJcXVvdGFfcmVsZWFzZWQgPSAwOwomIzQzOwlrc29ja19xdW90YV9yZWxlYXNlX29uZSgwKTsKJiM0MzsJa3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMSk7CiYjNDM7CWtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKDIpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7ZmVudHJ5L2tzb2NrX3JlbGVhc2Vfd29ya19mbiYjMzQ7KQomIzQzO2ludCBCUEZfUFJPRyhrc29ja19yZWxlYXNlX3dvcmtfZW50ZXIsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCByY3Vfd29yayAqcndvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJjdV93b3JrLCB3b3JrKTsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqa3MgPSBjb250YWluZXJfb2YocndvcmssIHN0cnVjdCBicGZfa3NvY2ssIHJ3b3JrKTsKJiM0MzsJdTY0IHBpZF90Z2lkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCk7CiYjNDM7CXN0cnVjdCBuZXQgKm5ldDsKJiM0MzsJdTMyIGludW07CiYjNDM7CXU4IHRyYWNrZWQgPSAxOwomIzQzOwomIzQzOwkvKiBrc29ja19yZWxlYXNlX3dvcmtfZm4oKSBmcmVlcyBrcyBiZWZvcmUgdGhlIGZleGl0IHByb2dyYW0gcnVucy4gKi8KJiM0MzsJbmV0ID0gQlBGX0NPUkVfUkVBRChrcywgc29jaywgc2ssIF9fc2tfY29tbW9uLnNrY19uZXQubmV0KTsKJiM0MzsJaWYgKCFuZXQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJaW51bSA9IEJQRl9DT1JFX1JFQUQobmV0LCBucy5pbnVtKTsKJiM0MzsJaWYgKGludW0gIT0gdGFyZ2V0X25ldG5zX2ludW1bMF0gJmFtcDsmYW1wOwomIzQzOwkgICAgaW51bSAhPSB0YXJnZXRfbmV0bnNfaW51bVsxXSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlicGZfbWFwX3VwZGF0ZV9lbGVtKCZhbXA7cmVsZWFzZV93b3JrZXJzLCAmYW1wO3BpZF90Z2lkLCAmYW1wO3RyYWNrZWQsIEJQRl9BTlkpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7ZmV4aXQva3NvY2tfcmVsZWFzZV93b3JrX2ZuJiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKGtzb2NrX3JlbGVhc2Vfd29ya19leGl0LCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiYjNDM7ewomIzQzOwl1NjQgcGlkX3RnaWQgPSBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQoKTsKJiM0MzsJdTggKnRyYWNrZWQ7CiYjNDM7CiYjNDM7CXRyYWNrZWQgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7cmVsZWFzZV93b3JrZXJzLCAmYW1wO3BpZF90Z2lkKTsKJiM0MzsJaWYgKCF0cmFja2VkKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWJwZl9tYXBfZGVsZXRlX2VsZW0oJmFtcDtyZWxlYXNlX3dvcmtlcnMsICZhbXA7cGlkX3RnaWQpOwomIzQzOwomIzQzOwkvKiBUaGUgd29ya2VyIGhhcyByZWxlYXNlZCB0aGUgc29ja2V0IGFuZCByZXR1cm5lZCBpdHMgcXVvdGEgY2hhcmdlLiAqLwomIzQzOwlfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmYW1wO3F1b3RhX3JlbGVhc2VfY29tcGxldGVkLCAxKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUyZjUyMDA5NDNlMzZhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3JlY3Vyc2lvbi5jCkBAIC0wLDAgJiM0MzsxLDY5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfZW5kaWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfdHJhY2luZ19uZXQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc29ja19jb21tb24uaCYjMzQ7CiYjNDM7CiYjNDM7dm9pZCBicGZfcmN1X3JlYWRfbG9jayh2b2lkKSBfX2tzeW07CiYjNDM7dm9pZCBicGZfcmN1X3JlYWRfdW5sb2NrKHZvaWQpIF9fa3N5bTsKJiM0MzsKJiM0MztpbnQgdGFyZ2V0X3BpZDsKJiM0MztpbnQgdHJpZ2dlcl9zZW5kOwomIzQzOwomIzQzO3Vuc2lnbmVkIGludCByZWNfY291bnQ7CiYjNDM7aW50IHJlY19rZnVuY19yZXRzW10gPSB7IC0xLCAtMSB9OwomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQga3NvY2tfc2V0dXAodm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJcmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2xzbS5zL3NvY2tldF9zZW5kbXNnJiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKGtzb2NrX3NvY2tldF9zZW5kbXNnLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiYjNDM7CSAgICAgaW50IHNpemUsIGludCByZXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgKmtzLCAqdG1wOwomIzQzOwl1MzIgcGlkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCkgJmd0OyZndDsgMzI7CiYjNDM7CWludCBrZnVuY19yZXQ7CiYjNDM7CiYjNDM7CWlmIChyZXQgfHwgIXRyaWdnZXJfc2VuZCB8fCBwaWQgIT0gdGFyZ2V0X3BpZCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXYgPSBrc29ja19jdHhfdmFsdWVfbG9va3VwKCk7CiYjNDM7CWlmICghdikgewomIzQzOwkJa2Z1bmNfcmV0ID0gLUVOT0VOVDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzID0gTlVMTDsKJiM0MzsJYnBmX3JjdV9yZWFkX2xvY2soKTsKJiM0MzsJdG1wID0gdi0mZ3Q7Y3R4OwomIzQzOwlpZiAodG1wKQomIzQzOwkJa3MgPSBicGZfa3NvY2tfYWNxdWlyZSh0bXApOwomIzQzOwlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CiYjNDM7CWlmICgha3MpIHsKJiM0MzsJCWtmdW5jX3JldCA9IC1FTk9FTlQ7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlrZnVuY19yZXQgPSBicGZfa3NvY2tfc2VuZChrcywgc2VuZF9kYXRhLCBzaXplb2Yoc2VuZF9kYXRhKSk7CiYjNDM7CWJwZl9rc29ja19yZWxlYXNlKGtzKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJlY19rZnVuY19yZXRzW3JlY19jb3VudCAmYW1wOyAxXSA9IGtmdW5jX3JldDsKJiM0MzsJX19zeW5jX2ZldGNoX2FuZF9hZGQoJmFtcDtyZWNfY291bnQsIDEpOwomIzQzOwomIzQzOwlpZiAoa2Z1bmNfcmV0ICE9IC1FQlVTWSkKJiM0MzsJCXRyaWdnZXJfc2VuZCA9IDA7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfd3EuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xNmExODczZDEzMmVkZQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jCkBAIC0wLDAgJiM0MzsxLDYyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfdHJhY2luZ19uZXQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtlcnJuby5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX2NvbW1vbi5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3Qga3NvY2tfd3FfdmFsdWUgewomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qga3NvY2tfd3FfdmFsdWUpOwomIzQzO30gd29ya19tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7aW50IGNyZWF0ZV9lcnI7CiYjNDM7dTMyIGNhbGxiYWNrX2RvbmU7CiYjNDM7CiYjNDM7c3RhdGljIGludCBrc29ja193cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgb3B0cyA9IHsKJiM0MzsJCS5mYW1pbHkgPSBBRl9JTkVULAomIzQzOwkJLnR5cGUgPSBTT0NLX0RHUkFNLAomIzQzOwkJLnByb3RvY29sID0gSVBQUk9UT19VRFAsCiYjNDM7CX07CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgKmtzOwomIzQzOwlpbnQgZXJyID0gMDsKJiM0MzsKJiM0MzsJa3MgPSBicGZfa3NvY2tfY3JlYXRlKCZhbXA7b3B0cywgc2l6ZW9mKG9wdHMpLCAmYW1wO2Vycik7CiYjNDM7CWlmIChrcykKJiM0MzsJCWJwZl9rc29ja19yZWxlYXNlKGtzKTsKJiM0MzsJY3JlYXRlX2VyciA9IGVycjsKJiM0MzsJX19zeW5jX2ZldGNoX2FuZF9hZGQoJmFtcDtjYWxsYmFja19kb25lLCAxKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQga3NvY2tfd3Ffc3RhcnQodm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGtzb2NrX3dxX3ZhbHVlICp2YWx1ZTsKJiM0MzsJdTMyIGtleSA9IDA7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CXZhbHVlID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dvcmtfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghdmFsdWUpCiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJZXJyID0gYnBmX3dxX2luaXQoJmFtcDt2YWx1ZS0mZ3Q7d29yaywgJmFtcDt3b3JrX21hcCwgMCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwllcnIgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7dmFsdWUtJmd0O3dvcmssIGtzb2NrX3dxX2NhbGxiYWNrLCAwKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CXJldHVybiBicGZfd3Ffc3RhcnQoJmFtcDt2YWx1ZS0mZ3Q7d29yaywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDEyOjU4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMzI1CgkJCQkJCQlvdXRwdXQ6IDIxNwoJCQkJCQkJdGhvdWdodHM6IDExODIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBOZXcgYGJwZl9rc29ja2AgRmVhdHVyZSBmb3IgRnV6emluZyoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IHRoaXMgbmV3IHBhdGNoIGludHJvZHVjaW5nIGBicGZfa3NvY2tgLCB3aGljaCBsZXRzIEJQRiBwcm9ncmFtcyBjcmVhdGUsIGJpbmQsIGNvbm5lY3QsIGFuZCBzZW5kIGRhdGEgdGhyb3VnaCBrZXJuZWwgc29ja2V0cy4gVGhhdCYjMzk7cyBkZWZpbml0ZWx5IGNvcmUga2VybmVsIGxvZ2ljLCBzcGVjaWZpY2FsbHkgdGhlIEJQRiBzdWJzeXN0ZW0gYW5kIG5ldHdvcmtpbmcsIHNjcmVhbWluZyBmb3IgZnV6emluZy4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBkaWZmIHRvIGlkZW50aWZ5IHRoZSBrZXkgc3ltYm9scyBhbmQgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuCgpGaXJzdCwgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIGNvbmZpZ3MuIFRoZSBgbmV0L2NvcmUvTWFrZWZpbGVgIGFkZHMgYGJwZl9rc29jay5vYCB1bmRlciB0aGUgY29uZGl0aW9uczogYGlmbmVxICgkKENPTkZJR19JTkVUKSwpYCBhbmQgYG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJwZl9rc29jay5vYC4gU28sIHdlICpkZWZpbml0ZWx5KiBuZWVkIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX0lORVRgIHRvIGJlIGVuYWJsZWQuCgpOb3csIGxldCYjMzk7cyBpZGVudGlmeSB0aG9zZSBmb2N1cyBzeW1ib2xzLiBMb29raW5nIGF0IGBuZXQvY29yZS9icGZfa3NvY2suY2AsIHdlIHNlZSB0aGUgbmV3IGZ1bmN0aW9ucyBhcmU6IGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19hY3F1aXJlYCwgYGJwZl9rc29ja19yZWxlYXNlYCwgYGJwZl9rc29ja19yZWxlYXNlX2R0b3JgLCBhbmQgYGJwZl9rc29ja19zZW5kYC4gVGhlc2UgYXJlIGV4cG9zZWQgYXMgQlBGIGtmdW5jcywgc28gZnV6emluZyB0aGVtIGlzIGhpZ2ggcHJpb3JpdHkuIFRoZXJlIGFyZSBhIGZldyBzdXBwb3J0aW5nIGZ1bmN0aW9ucyBhcyB3ZWxsLCBsZXQmIzM5O3Mga2VlcCB0cmFjayBvZiB0aG9zZSBpbiBjYXNlIHRoZXkmIzM5O3JlIHJlbGV2YW50OiBgYnBmX2tzb2NrX25ldF90cnlfY2hhcmdlYCwgYGJwZl9rc29ja19uZXRfdW5jaGFyZ2VgLCBga3NvY2tfcmVsZWFzZV93b3JrX2ZuYCwgYGJwZl9rc29ja19nZXRfYWRkcmAsIGBicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0YCwgYGJwZl9rc29ja19zZW5kX2VudGVyYCwgYW5kIGBicGZfa3NvY2tfc2VuZF9leGl0YC4gQnV0IHRoZSBtYWluIGVudHJ5IHBvaW50cyBmb3IgZnV6emluZyBhcmUgZGVmaW5pdGVseSB0aG9zZSBrZnVuY3MuCgpEb3VibGUtY2hlY2tpbmcgY29uZmlncywgd2UmIzM5O3ZlIGdvdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19JTkVUYCBhcyB0aGUgYmlnIG9uZXMuIEFuZCBnbGFuY2luZyBhdCBgYnBmX2tzb2NrX2dldF9hZGRyYCwgSSBzZWUgYENPTkZJR19JUFY2YCBpcyBhbHNvIHVzZWQuCgpPa2F5LCBsZXQmIzM5O3MgcmVmaW5lIHRoYXQgZm9jdXMgc3ltYm9sIGxpc3QuIEl0IHNlZW1zIGxpa2UgdGhlIGNvcmUgb25lcyBhcmU6IGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19zZW5kYCwgYGJwZl9rc29ja19hY3F1aXJlYCwgYW5kIGBicGZfa3NvY2tfcmVsZWFzZWAuIEFuZCBgYnBmX2tzb2NrX3JlbGVhc2VfZHRvcmAgYW5kIGBicGZfa3NvY2tfZ2V0X2FkZHJgIHNlZW0gaW1wb3J0YW50IHRvby4gSSBtaWdodCBuZWVkIHRvIGNvbnNpZGVyIGBrc29ja19yZWxlYXNlX3dvcmtfZm5gIGxhdGVyLCBhcyBpdCBpcyBhIGtlcm5lbCB3b3JrcXVldWUsIHdoaWNoIHRlbmRzIHRvIGJlIGludGVyZXN0aW5nIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLgoKTGV0JiMzOTtzIHF1aWNrbHkgY2hlY2sgYG5ldC9zb2NrZXQuY2AgdG8gc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRoZXJlLiBZZXAsIHdlJiMzOTt2ZSBnb3QgYF9fc3lzX2Nvbm5lY3Rfc29ja2V0YCBiZWluZyB1c2VkLiBUaGF0JiMzOTtzIGEgbmV3IGZ1bmN0aW9uLCBzbyBsZXQmIzM5O3MgYWRkIHRoYXQgdG8gdGhlIGZvY3VzIHN5bWJvbHMuCgpGaW5hbCByZWZpbmVkIGxpc3Q6IGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19zZW5kYCwgYGJwZl9rc29ja19hY3F1aXJlYCwgYGJwZl9rc29ja19yZWxlYXNlYCwgYW5kIGBfX3N5c19jb25uZWN0X3NvY2tldGAuCgpSaWdodCwgbGV0JiMzOTtzIHZlcmlmeSB0aGUgY29uZmlnczogYENPTkZJR19CUEZfU1lTQ0FMTGAsIGBDT05GSUdfSU5FVGAsIGBDT05GSUdfSVBWNmAuCgpOb3csIHRoZSBpbnN0cnVjdGlvbnMgc2F5IHRvIGF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBjb25maWdzIGFuZCBvbmx5IGxpc3QgdGhvc2Ugc3BlY2lmaWMgdG8gdGhlIG1vZGlmaWVkIGNvZGUuIFRoZXkgYWxzbyB3YW50IHVzIHRvIGRyb3AgdGhlIGBDT05GSUdfYCBwcmVmaXguIGBCUEZfU1lTQ0FMTGAsIGBJTkVUYCwgYW5kIGBJUFY2YCBhcmUga2luZGEgZ2VuZXJpYywgYnV0IHRoZXkgYXJlICpzcGVjaWZpY2FsbHkqIHJlcXVpcmVkIGhlcmUuIFNvLCBsb29raW5nIGF0IHRoZSBNYWtlZmlsZSwgYEJQRl9TWVNDQUxMYCBhbmQgYElORVRgIGFyZSB0aGUgZXhhY3QgY29uZGl0aW9ucy4gU28gdGhvc2UgYXJlIHRoZSBvbmVzIHRvIGluY2x1ZGUuCgpTbywgZnV6emluZyB0aGVzZSBrZnVuY3MgaXMgY3JpdGljYWwsIGFzIHRoZXkmIzM5O3JlIGRpcmVjdGx5IGludGVyZmFjaW5nIEJQRiB3aXRoIHRoZSBuZXR3b3JraW5nIHN0YWNrLiBUaGV5IG5lZWQgdG8gYmUgcmlnb3JvdXNseSB0ZXN0ZWQgZm9yIG1lbW9yeSBzYWZldHkgYW5kIGNvcnJlY3Qgb3BlcmF0aW9uLgoKTGV0JiMzOTtzIGZvcm1hdCB0aGF0IHRvb2wgY2FsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAxMjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7SU5FVCYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2tzb2NrX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYmluZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfY29ubmVjdCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfc2VuZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYWNxdWlyZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfcmVsZWFzZSYjMzQ7LAogICAgJiMzNDtfX3N5c19jb25uZWN0X3NvY2tldCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7SU5FVCYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2tzb2NrX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYmluZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfY29ubmVjdCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfc2VuZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYWNxdWlyZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfcmVsZWFzZSYjMzQ7LAogICAgJiMzNDtfX3N5c19jb25uZWN0X3NvY2tldCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDEyOjU4OjU1LjQ1NTg4MDAzMloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MzUzMjkwNjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJJTkVUXCIsXG4gICAgXCJJUFY2XCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX2tzb2NrX2NyZWF0ZVwiLFxuICAgIFwiYnBmX2tzb2NrX2JpbmRcIixcbiAgICBcImJwZl9rc29ja19jb25uZWN0XCIsXG4gICAgXCJicGZfa3NvY2tfc2VuZFwiLFxuICAgIFwiYnBmX2tzb2NrX2FjcXVpcmVcIixcbiAgICBcImJwZl9rc29ja19yZWxlYXNlXCIsXG4gICAgXCJfX3N5c19jb25uZWN0X3NvY2tldFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGZlYXR1cmUgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBrZXJuZWwgc29ja2V0cyAoYGJwZl9rc29ja2ApLiBUaGlzIGFkZHMgbmV3IEJQRiBrZnVuY3MgKGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19zZW5kYCwgZXRjLikgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgY29yZSBuZXR3b3JraW5nIHN0YWNrLiBGdXp6aW5nIHRoZXNlIGtmdW5jcyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIG1lbW9yeSBzYWZldHkgYW5kIGNvcnJlY3QgYmVoYXZpb3Igb2YgdGhlIG5ldyBmZWF0dXJlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQxMjo1ODo1NS40NTU4ODg2MTJaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUzODQxODY5OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDZjMDQ0YTNiM2FlMmY4MWRhZWQwY2M5MGI5YzQwODQ5Y2Q2MzEzZWJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBKdWwgNiAxMjo1ODo1NCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL3N5c2N0bC9uZXQucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxcbmluZGV4IGU1ODZlMTdmYzdhNTgyLi44YmNkYzFiZmQ3MTEzOCAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL3N5c2N0bC9uZXQucnN0XFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxcbkBAIC0xMjgsNiArMTI4LDE4IEBAIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlamVjdCB1bnByaXZpbGVnZWQgSklUIHJlcXVlc3RzIG9uY2UgaXQgaGFzXFxuIGJlZW4gc3VycGFzc2VkLiBicGZfaml0X2xpbWl0IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2xvYmFsIGxpbWl0XFxuIGluIGJ5dGVzLlxcbiBcXG4rYnBmX2tzb2NrX21heFxcbistLS0tLS0tLS0tLS0tXFxuK1xcbitNYXhpbXVtIG51bWJlciBvZiBCUEYga2VybmVsIHNvY2tldHMgdGhhdCBtYXkgZXhpc3QgaW4gZWFjaCBuZXR3b3JrIG5hbWVzcGFjZS5cXG4rVGhpcyBob3N0LXdpZGUgc2V0dGluZyBpcyBleHBvc2VkIGluIHRoZSBpbml0aWFsIG5ldHdvcmsgbmFtZXNwYWNlIGFuZCBhcHBsaWVzXFxuK3RoZSBzYW1lIGxpbWl0IGluZGVwZW5kZW50bHkgdG8gZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuIFNvY2tldHMgYXdhaXRpbmdcXG4rZGVmZXJyZWQgUkNVIGFuZCB3b3JrcXVldWUgY2xlYW51cCByZW1haW4gY291bnRlZCB1bnRpbCB0aGUgdW5kZXJseWluZyBzb2NrZXRcXG4raGFzIGJlZW4gcmVsZWFzZWQuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyBjcmVhdGlvbiBvZiBCUEYga2VybmVsIHNvY2tldHMgaW5cXG4rZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuXFxuK1xcbitEZWZhdWx0OiAxMDI0XFxuK1xcbiBkZXZfd2VpZ2h0XFxuIC0tLS0tLS0tLS1cXG4gXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmggYi9pbmNsdWRlL2xpbnV4L2JwZl9rc29jay5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMDQ4NWI4ZWRkYzFmMjBcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvaW5jbHVkZS9saW51eC9icGZfa3NvY2suaFxcbkBAIC0wLDAgKzEsNTAgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXFxuK1xcbisjaWZuZGVmIF9CUEZfS1NPQ0tfSFxcbisjZGVmaW5lIF9CUEZfS1NPQ0tfSFxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIEJQRl9LU09DS19NQVhfREVGQVVMVCAxMDI0XFxuK1xcbitleHRlcm4gaW50IHN5c2N0bF9icGZfa3NvY2tfbWF4O1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgLSBCUEYga2VybmVsIHNvY2tldCBjcmVhdGlvbiBwYXJhbWV0ZXJzXFxuKyAqIEBmYW1pbHk6XFx0QWRkcmVzcyBmYW1pbHk6IEFGX0lORVQgb3IgQUZfSU5FVDYuXFxuKyAqIEB0eXBlOlxcdFNvY2tldCB0eXBlOiBvbmx5IFNPQ0tfREdSQU0gc3VwcG9ydGVkIGZvciBub3cuXFxuKyAqIEBwcm90b2NvbDpcXHRQcm90b2NvbCBudW1iZXIgKGUuZy4gSVBQUk9UT19VRFApLCBvciAwIGZvciB0aGUgZGVmYXVsdCBwcm90b2NvbFxcbisgKlxcdFxcdG9mIHRoZSBnaXZlbiB0eXBlLlxcbisgKiBAcmVzZXJ2ZWQ6XFx0TXVzdCBiZSB6ZXJvLiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cXG4rICovXFxuK3N0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMge1xcbitcXHRfX3U4IGZhbWlseTtcXG4rXFx0X191OCB0eXBlO1xcbitcXHRfX3U4IHByb3RvY29sO1xcbitcXHRfX3U4IHJlc2VydmVkO1xcbit9O1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIC0gQlBGIGtlcm5lbCBzb2NrZXQgYWRkcmVzcyBwYXJhbWV0ZXJzXFxuKyAqIEBmYW1pbHk6XFx0QWRkcmVzcyBmYW1pbHk6IEFGX0lORVQgb3IgQUZfSU5FVDYuXFxuKyAqIEByZXNlcnZlZDpcXHRNdXN0IGJlIHplcm8uIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxcbisgKiBAcG9ydDpcXHRQb3J0IGluIGhvc3QgYnl0ZSBvcmRlci5cXG4rICogQHNjb3BlX2lkOlxcdElQdjYgc2NvcGUgSUQgZm9yIHNjb3BlZCBBRl9JTkVUNiBhZGRyZXNzZXMsIG9yIHplcm8uXFxuKyAqXFx0XFx0TXVzdCBiZSB6ZXJvIHdoZW4gZmFtaWx5PUFGX0lORVQuXFxuKyAqIEBpcHY0X2FkZHI6XFx0SVB2NCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVULlxcbisgKiBAaXB2Nl9hZGRyOlxcdElQdjYgYWRkcmVzcyAoMTYgYnl0ZXMsIG5ldHdvcmsgYnl0ZSBvcmRlcikuIFVzZWQgd2hlbiBmYW1pbHk9QUZfSU5FVDYuXFxuKyAqL1xcbitzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyB7XFxuK1xcdF9fdTggZmFtaWx5O1xcbitcXHRfX3U4IHJlc2VydmVkO1xcbitcXHRfX3UxNiBwb3J0O1xcbitcXHRfX3UzMiBzY29wZV9pZDtcXG4rXFxuK1xcdHVuaW9uIHtcXG4rXFx0XFx0X19iZTMyIGlwdjRfYWRkcjtcXG4rXFx0XFx0X191MzIgaXB2Nl9hZGRyWzRdOyAvKiBpbjZfYWRkcjsgbmV0d29yayBvcmRlciAqL1xcbitcXHR9O1xcbit9O1xcbitcXG4rI2VuZGlmIC8qIF9CUEZfS1NPQ0tfSCAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxcbmluZGV4IDJhOGQ3YjE0ZjFkMTE5Li40OGYxZWI4MTkzZGVhMSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxcbkBAIC00NjEsNiArNDYxLDggQEAgZXh0ZXJuIHN0cnVjdCBmaWxlICpfX3N5c19zb2NrZXRfZmlsZShpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTtcXG4gZXh0ZXJuIGludCBfX3N5c19iaW5kKGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdW15YWRkciwgaW50IGFkZHJsZW4pO1xcbiBleHRlcm4gaW50IF9fc3lzX2JpbmRfc29ja2V0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxcbiBcXHRcXHRcXHQgICAgIGludCBhZGRybGVuKTtcXG4rZXh0ZXJuIGludCBfX3N5c19jb25uZWN0X3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcixcXG4rXFx0XFx0XFx0XFx0aW50IGFkZHJsZW4sIGludCBmbGFncyk7XFxuIGV4dGVybiBpbnQgX19zeXNfY29ubmVjdF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcixcXG4gXFx0XFx0XFx0ICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKTtcXG4gZXh0ZXJuIGludCBfX3N5c19jb25uZWN0KGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdXNlcnZhZGRyLFxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uNTJmNmE4OTU0NmU0NmEgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXFxuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuQEAgLTQ0MjQsNiArNDQyNCw5IEBAIEJURl9JRChzdHJ1Y3QsIHRhc2tfc3RydWN0KVxcbiAjaWZkZWYgQ09ORklHX0NSWVBUT1xcbiBCVEZfSUQoc3RydWN0LCBicGZfY3J5cHRvX2N0eClcXG4gI2VuZGlmXFxuKyNpZmRlZiBDT05GSUdfSU5FVFxcbitCVEZfSUQoc3RydWN0LCBicGZfa3NvY2spXFxuKyNlbmRpZlxcbiBCVEZfU0VUX0VORChyY3VfcHJvdGVjdGVkX3R5cGVzKVxcbiBcXG4gc3RhdGljIGJvb2wgcmN1X3Byb3RlY3RlZF9vYmplY3QoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9NYWtlZmlsZSBiL25ldC9jb3JlL01ha2VmaWxlXFxuaW5kZXggYjNmZGNiNGUzNTVmYTYuLmE5Mjk1Yjc4NTkwMTA5IDEwMDY0NFxcbi0tLSBhL25ldC9jb3JlL01ha2VmaWxlXFxuKysrIGIvbmV0L2NvcmUvTWFrZWZpbGVcXG5AQCAtNDQsNiArNDQsOSBAQCBvYmotJChDT05GSUdfRkFJTE9WRVIpICs9IGZhaWxvdmVyLm9cXG4gb2JqLSQoQ09ORklHX05FVF9TT0NLX01TRykgKz0gc2ttc2cub1xcbiBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IHNvY2tfbWFwLm9cXG4gb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBicGZfc2tfc3RvcmFnZS5vXFxuK2lmbmVxICgkKENPTkZJR19JTkVUKSwpXFxuK29iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX2tzb2NrLm9cXG4rZW5kaWZcXG4gb2JqLSQoQ09ORklHX09GKVxcdCs9IG9mX25ldC5vXFxuIG9iai0kKENPTkZJR19ORVRfVEVTVCkgKz0gbmV0X3Rlc3Qub1xcbiBvYmotJChDT05GSUdfTkVUX0RFVk1FTSkgKz0gZGV2bWVtLm9cXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvYnBmX2tzb2NrLmMgYi9uZXQvY29yZS9icGZfa3NvY2suY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjhiZGU3MzRiYzkxN2QzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL25ldC9jb3JlL2JwZl9rc29jay5jXFxuQEAgLTAsMCArMSw1MTYgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGZfa3NvY2suaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvY2FjaGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2hhc2guaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2luLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbjYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2xpc3RfYmwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25ldC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcmVmY291bnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdXBkYXRlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc29ja2V0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC91bmFsaWduZWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvaXAuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY25ldC9pcHY2LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NuZXQvbmV0X25hbWVzcGFjZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbmV0L25ldG5zL2dlbmVyaWMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY25ldC9zb2NrLmhcXHUwMDNlXFxuK1xcbisvKipcXG4rICogc3RydWN0IGJwZl9rc29jayAtIHJlZmNvdW50ZWQgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dFxcbisgKiBAc29jazpcXHRUaGUgdW5kZXJseWluZyBrZXJuZWwgc29ja2V0LlxcbisgKiBAdXNhZ2U6XFx0UmVmZXJlbmNlIGNvdW50ZXIuXFxuKyAqIEByd29yazpcXHRSQ1Ugd29yayBmb3IgZGVmZXJyZWQgY2xlYW51cCAoc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXFxuKyAqL1xcbitzdHJ1Y3QgYnBmX2tzb2NrIHtcXG4rXFx0c3RydWN0IHNvY2tldCAqc29jaztcXG4rXFx0cmVmY291bnRfdCB1c2FnZTtcXG4rXFx0c3RydWN0IHJjdV93b3JrIHJ3b3JrO1xcbit9O1xcbitcXG4rc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkIHtcXG4rXFx0c3RydWN0IGhsaXN0X2JsX25vZGUgbm9kZTtcXG4rXFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xcbit9O1xcbitcXG4rI2RlZmluZSBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFMgNlxcbitcXG4rc3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCB7XFxuK1xcdHN0cnVjdCBobGlzdF9ibF9oZWFkIGhlYWQ7XFxuK30gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0XFxuK1xcdGJwZl9rc29ja19zZW5kX2J1Y2tldHNbMSBcXHUwMDNjXFx1MDAzYyBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFNdO1xcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKlxcbiticGZfa3NvY2tfc2VuZF9idWNrZXQoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxcbit7XFxuK1xcdHUzMiBidWNrZXRfaWR4ID0gaGFzaF9wdHIodGFzaywgQlBGX0tTT0NLX1NFTkRfR1VBUkRfSEFTSF9CSVRTKTtcXG4rXFxuK1xcdHJldHVybiBcXHUwMDI2YnBmX2tzb2NrX3NlbmRfYnVja2V0c1tidWNrZXRfaWR4XTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgYnBmX2tzb2NrX3NlbmRfZW50ZXIoc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICpndWFyZClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmVudHJ5O1xcbitcXHRzdHJ1Y3QgaGxpc3RfYmxfbm9kZSAqcG9zO1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0ICpidWNrZXQ7XFxuK1xcbitcXHRidWNrZXQgPSBicGZfa3NvY2tfc2VuZF9idWNrZXQoY3VycmVudCk7XFxuK1xcdGhsaXN0X2JsX2xvY2soXFx1MDAyNmJ1Y2tldC1cXHUwMDNlaGVhZCk7XFxuK1xcdGhsaXN0X2JsX2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBwb3MsIFxcdTAwMjZidWNrZXQtXFx1MDAzZWhlYWQsIG5vZGUpIHtcXG4rXFx0XFx0aWYgKGVudHJ5LVxcdTAwM2V0YXNrID09IGN1cnJlbnQpIHtcXG4rXFx0XFx0XFx0aGxpc3RfYmxfdW5sb2NrKFxcdTAwMjZidWNrZXQtXFx1MDAzZWhlYWQpO1xcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0Z3VhcmQtXFx1MDAzZXRhc2sgPSBjdXJyZW50O1xcbitcXHRJTklUX0hMSVNUX0JMX05PREUoXFx1MDAyNmd1YXJkLVxcdTAwM2Vub2RlKTtcXG4rXFx0aGxpc3RfYmxfYWRkX2hlYWQoXFx1MDAyNmd1YXJkLVxcdTAwM2Vub2RlLCBcXHUwMDI2YnVja2V0LVxcdTAwM2VoZWFkKTtcXG4rXFx0aGxpc3RfYmxfdW5sb2NrKFxcdTAwMjZidWNrZXQtXFx1MDAzZWhlYWQpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgYnBmX2tzb2NrX3NlbmRfZXhpdChzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmd1YXJkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKmJ1Y2tldDtcXG4rXFxuK1xcdGJ1Y2tldCA9IGJwZl9rc29ja19zZW5kX2J1Y2tldChndWFyZC1cXHUwMDNldGFzayk7XFxuK1xcdGhsaXN0X2JsX2xvY2soXFx1MDAyNmJ1Y2tldC1cXHUwMDNlaGVhZCk7XFxuK1xcdGhsaXN0X2JsX2RlbChcXHUwMDI2Z3VhcmQtXFx1MDAzZW5vZGUpO1xcbitcXHRobGlzdF9ibF91bmxvY2soXFx1MDAyNmJ1Y2tldC1cXHUwMDNlaGVhZCk7XFxuK31cXG4rXFxuK3N0cnVjdCBicGZfa3NvY2tfbmV0IHtcXG4rXFx0YXRvbWljX3QgY291bnQ7XFxuK307XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgaW50IGJwZl9rc29ja19uZXRfaWQ7XFxuK2ludCBzeXNjdGxfYnBmX2tzb2NrX21heCBfX3JlYWRfbW9zdGx5ID0gQlBGX0tTT0NLX01BWF9ERUZBVUxUO1xcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfa3NvY2tfbmV0ICpicGZfa3NvY2tfcGVybmV0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldClcXG4re1xcbitcXHRyZXR1cm4gbmV0X2dlbmVyaWMobmV0LCBicGZfa3NvY2tfbmV0X2lkKTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBicGZfa3NvY2tfbmV0X29wcyA9IHtcXG4rXFx0LmlkID0gXFx1MDAyNmJwZl9rc29ja19uZXRfaWQsXFxuK1xcdC5zaXplID0gc2l6ZW9mKHN0cnVjdCBicGZfa3NvY2tfbmV0KSxcXG4rfTtcXG4rXFxuK3N0YXRpYyBib29sIGJwZl9rc29ja19uZXRfdHJ5X2NoYXJnZShzdHJ1Y3QgbmV0ICpuZXQpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9rc29ja19uZXQgKmtuID0gYnBmX2tzb2NrX3Blcm5ldChuZXQpO1xcbitcXHRpbnQgY291bnQgPSBhdG9taWNfcmVhZChcXHUwMDI2a24tXFx1MDAzZWNvdW50KTtcXG4rXFx0aW50IG1heDtcXG4rXFxuK1xcdGRvIHtcXG4rXFx0XFx0bWF4ID0gUkVBRF9PTkNFKHN5c2N0bF9icGZfa3NvY2tfbWF4KTtcXG4rXFx0XFx0aWYgKGNvdW50IFxcdTAwM2U9IG1heClcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9IHdoaWxlICghYXRvbWljX3RyeV9jbXB4Y2hnKFxcdTAwMjZrbi1cXHUwMDNlY291bnQsIFxcdTAwMjZjb3VudCwgY291bnQgKyAxKSk7XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgYnBmX2tzb2NrX25ldF91bmNoYXJnZShzdHJ1Y3QgbmV0ICpuZXQpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9rc29ja19uZXQgKmtuID0gYnBmX2tzb2NrX3Blcm5ldChuZXQpO1xcbitcXG4rXFx0V0FSTl9PTl9PTkNFKGF0b21pY19kZWNfcmV0dXJuKFxcdTAwMjZrbi1cXHUwMDNlY291bnQpIFxcdTAwM2MgMCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGtzb2NrX3JlbGVhc2Vfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9rc29jayAqa3MgPVxcbitcXHRcXHRjb250YWluZXJfb2YodG9fcmN1X3dvcmsod29yayksIHN0cnVjdCBicGZfa3NvY2ssIHJ3b3JrKTtcXG4rXFx0c3RydWN0IG5ldCAqbmV0ID0gZ2V0X25ldChzb2NrX25ldChrcy1cXHUwMDNlc29jay1cXHUwMDNlc2spKTtcXG4rXFxuK1xcdHNvY2tfcmVsZWFzZShrcy1cXHUwMDNlc29jayk7XFxuK1xcdGJwZl9rc29ja19uZXRfdW5jaGFyZ2UobmV0KTtcXG4rXFx0cHV0X25ldChuZXQpO1xcbitcXHRrZnJlZShrcyk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgYnBmX2tzb2NrX2dldF9hZGRyKGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzICpvcHRzLFxcbitcXHRcXHRcXHQgICAgICB1MzIgb3B0c19fc3osIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIG9wdHNfY29weTtcXG4rXFxuK1xcdGlmICghb3B0cyB8fCBvcHRzX19zeiAhPSBzaXplb2YoKm9wdHMpKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdC8qIEtmdW5jIG1lbW9yeSBhcmd1bWVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIG5hdHVyYWxseSBhbGlnbmVkLiAqL1xcbitcXHRtZW1jcHkoXFx1MDAyNm9wdHNfY29weSwgb3B0cywgc2l6ZW9mKG9wdHNfY29weSkpO1xcbitcXG4rXFx0aWYgKG9wdHNfY29weS5yZXNlcnZlZClcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRzd2l0Y2ggKG9wdHNfY29weS5mYW1pbHkpIHtcXG4rXFx0Y2FzZSBBRl9JTkVUOiB7XFxuK1xcdFxcdHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjQgPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcjtcXG4rXFxuK1xcdFxcdGlmIChvcHRzX2NvcHkuc2NvcGVfaWQpXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0XFx0KmFkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbil7XFxuK1xcdFxcdFxcdC5zaW5fZmFtaWx5ID0gQUZfSU5FVCxcXG4rXFx0XFx0XFx0LnNpbl9wb3J0ID0gaHRvbnMob3B0c19jb3B5LnBvcnQpLFxcbitcXHRcXHRcXHQuc2luX2FkZHIuc19hZGRyID0gb3B0c19jb3B5LmlwdjRfYWRkcixcXG4rXFx0XFx0fTtcXG4rXFx0XFx0cmV0dXJuIHNpemVvZigqYWRkcjQpO1xcbitcXHR9XFxuKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KVxcbitcXHRjYXNlIEFGX0lORVQ2OiB7XFxuK1xcdFxcdHN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyO1xcbitcXG4rXFx0XFx0KmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYpe1xcbitcXHRcXHRcXHQuc2luNl9mYW1pbHkgPSBBRl9JTkVUNixcXG4rXFx0XFx0XFx0LnNpbjZfcG9ydCA9IGh0b25zKG9wdHNfY29weS5wb3J0KSxcXG4rXFx0XFx0XFx0LnNpbjZfc2NvcGVfaWQgPSBvcHRzX2NvcHkuc2NvcGVfaWQsXFxuK1xcdFxcdH07XFxuK1xcdFxcdG1lbWNweShcXHUwMDI2YWRkcjYtXFx1MDAzZXNpbjZfYWRkciwgb3B0c19jb3B5LmlwdjZfYWRkcixcXG4rXFx0XFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTtcXG4rXFx0XFx0cmV0dXJuIHNpemVvZigqYWRkcjYpO1xcbitcXHR9XFxuKyNlbmRpZlxcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXR1cm4gLUVBRk5PU1VQUE9SVDtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KHZvaWQpXFxuK3tcXG4rXFx0LypcXG4rXFx0ICogVGFzayB3b3JrIGNhbiBydW4gZnJvbSBkb19leGl0KCkgYWZ0ZXIgZXhpdF9uc3Byb3h5X25hbWVzcGFjZXMoKVxcbitcXHQgKiBjbGVhcmVkIGN1cnJlbnQtXFx1MDAzZW5zcHJveHksIHdoaWxlIGN1cnJlbnQgaXMgc3RpbGwgbm90IGEga3RocmVhZC5cXG4rXFx0ICovXFxuK1xcdHJldHVybiAhKGN1cnJlbnQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUEZfS1RIUkVBRCkgXFx1MDAyNlxcdTAwMjYgY3VycmVudC1cXHUwMDNlbnNwcm94eTtcXG4rfVxcbitcXG4rX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19jcmVhdGUoKSAtIENyZWF0ZSBhIEJQRiBrZXJuZWwgc29ja2V0LlxcbisgKlxcbisgKiBBbGxvY2F0ZXMgYW5kIGNyZWF0ZXMgYSBrZXJuZWwgc29ja2V0LlxcbisgKiBUaGUgc29ja2V0IGlzIGNoYXJnZWQgYWdhaW5zdCB0aGUgYWN0aXZlIG5ldHdvcmsgbmFtZXNwYWNlJ3MgQlBGIGtlcm5lbFxcbisgKiBzb2NrZXQgcXVvdGEuXFxuKyAqXFxuKyAqIFRoZSByZXR1cm5lZCBjb250ZXh0IG11c3QgZWl0aGVyIGJlIHN0b3JlZCBpbiBhIG1hcCBhcyBhIGtwdHIsIG9yXFxuKyAqIGZyZWVkIHdpdGggYnBmX2tzb2NrX3JlbGVhc2UoKS5cXG4rICpcXG4rICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgKHNvY2tfY3JlYXRlKSwgc28gaXQgY2FuIG9ubHkgYmUgdXNlZFxcbisgKiBpbiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS5cXG4rICogSXQgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgQlBGIHdvcmtxdWV1ZSBjYWxsYmFjayBiZWNhdXNlIHRoYXQgY2FsbGJhY2tcXG4rICogZG9lcyBub3QgcmV0YWluIHRoZSBpbnZva2luZyB0YXNrJ3MgbmFtZXNwYWNlIG9yIHNlY3VyaXR5IGNvbnRleHQuXFxuKyAqXFxuKyAqIEBvcHRzOlxcdFBvaW50ZXIgdG8gc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyB3aXRoIHNvY2tldCBwYXJhbWV0ZXJzLlxcbisgKiBAb3B0c19fc3o6XFx0U2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuXFxuKyAqIEBlcnJfX3VuaW5pdDpcXHRJbnRlZ2VyIHRvIHN0b3JlIGVycm9yIGNvZGUgd2hlbiBOVUxMIGlzIHJldHVybmVkLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqXFxuK2JwZl9rc29ja19jcmVhdGUoY29uc3Qgc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6LFxcbitcXHRcXHQgaW50ICplcnJfX3VuaW5pdClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIG9wdHNfY29weTtcXG4rXFx0c3RydWN0IGJwZl9rc29jayAqa3M7XFxuK1xcdHN0cnVjdCBuZXQgKm5ldDtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIHNvY2tfY3JlYXRlKCkgZGVyaXZlcyB0aGUgbmV0d29yayBuYW1lc3BhY2UsIGNyZWRlbnRpYWxzLCBhbmQgY2dyb3VwXFxuK1xcdCAqIGZyb20gY3VycmVudC4gS2VybmVsIHRocmVhZHMsIGluY2x1ZGluZyBCUEYgd29ya3F1ZXVlIGNhbGxiYWNrcywgZG9cXG4rXFx0ICogbm90IGNhcnJ5IHRoZSBjb250ZXh0IG9mIHRoZSB0YXNrIHRoYXQgaW52b2tlZCB0aGUgQlBGIHByb2dyYW0uXFxuK1xcdCAqL1xcbitcXHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSkge1xcbitcXHRcXHRlcnIgPSAtRU9QTk9UU1VQUDtcXG4rXFx0XFx0Z290byBlcnJfb3V0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIW9wdHMgfHwgb3B0c19fc3ogIT0gc2l6ZW9mKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpKSB7XFxuK1xcdFxcdGVyciA9IC1FSU5WQUw7XFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0fVxcbitcXG4rXFx0b3B0c19jb3B5ID0gKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpe1xcbitcXHRcXHQuZmFtaWx5ID0gUkVBRF9PTkNFKG9wdHMtXFx1MDAzZWZhbWlseSksXFxuK1xcdFxcdC50eXBlID0gUkVBRF9PTkNFKG9wdHMtXFx1MDAzZXR5cGUpLFxcbitcXHRcXHQucHJvdG9jb2wgPSBSRUFEX09OQ0Uob3B0cy1cXHUwMDNlcHJvdG9jb2wpLFxcbitcXHRcXHQucmVzZXJ2ZWQgPSBSRUFEX09OQ0Uob3B0cy1cXHUwMDNlcmVzZXJ2ZWQpLFxcbitcXHR9O1xcbitcXG4rXFx0aWYgKG9wdHNfY29weS5yZXNlcnZlZCkge1xcbitcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChvcHRzX2NvcHkuZmFtaWx5ICE9IEFGX0lORVQgXFx1MDAyNlxcdTAwMjYgb3B0c19jb3B5LmZhbWlseSAhPSBBRl9JTkVUNikge1xcbitcXHRcXHRlcnIgPSAtRUFGTk9TVVBQT1JUO1xcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChvcHRzX2NvcHkudHlwZSAhPSBTT0NLX0RHUkFNKSB7XFxuK1xcdFxcdGVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7XFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKG9wdHNfY29weS5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCBcXHUwMDI2XFx1MDAyNiBvcHRzX2NvcHkucHJvdG9jb2wgIT0gMCkge1xcbitcXHRcXHRlcnIgPSAtRVBST1RPTk9TVVBQT1JUO1xcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGtzID0ga3phbGxvY19vYmooKmtzKTtcXG4rXFx0aWYgKCFrcykge1xcbitcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdG5ldCA9IGN1cnJlbnQtXFx1MDAzZW5zcHJveHktXFx1MDAzZW5ldF9ucztcXG4rXFx0aWYgKCFicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2UobmV0KSkge1xcbitcXHRcXHRlcnIgPSAtRU5PU1BDO1xcbitcXHRcXHRnb3RvIGVycl9mcmVlO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVc2UgdGhlIG5vcm1hbCBjdXJyZW50LXRhc2sgc29ja2V0IHBhdGggc28gTFNNL2Nncm91cCBwb2xpY3ksXFxuK1xcdCAqIHNvY2tldCBsYWJlbHMsIGFuZCB0aGUgYWN0aXZlIG5ldG5zIHJlZmVyZW5jZSBtYXRjaCBhIHNvY2tldCgyKVxcbitcXHQgKiBjcmVhdGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSdzIGNhbGxlci5cXG4rXFx0ICovXFxuK1xcdGVyciA9IHNvY2tfY3JlYXRlKG9wdHNfY29weS5mYW1pbHksIG9wdHNfY29weS50eXBlLCBvcHRzX2NvcHkucHJvdG9jb2wsXFxuK1xcdFxcdFxcdCAgXFx1MDAyNmtzLVxcdTAwM2Vzb2NrKTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0Z290byBlcnJfdW5jaGFyZ2U7XFxuK1xcbitcXHRrcy1cXHUwMDNlc29jay1cXHUwMDNlc2stXFx1MDAzZXNrX3JjdmJ1ZiA9IFNPQ0tfTUlOX1JDVkJVRjtcXG4rXFx0a3MtXFx1MDAzZXNvY2stXFx1MDAzZXNrLVxcdTAwM2Vza191c2VybG9ja3MgfD0gU09DS19SQ1ZCVUZfTE9DSztcXG4rXFxuK1xcdHJlZmNvdW50X3NldChcXHUwMDI2a3MtXFx1MDAzZXVzYWdlLCAxKTtcXG4rXFx0cHV0X3VuYWxpZ25lZCgwLCBlcnJfX3VuaW5pdCk7XFxuK1xcdHJldHVybiBrcztcXG4rXFxuK2Vycl91bmNoYXJnZTpcXG4rXFx0YnBmX2tzb2NrX25ldF91bmNoYXJnZShuZXQpO1xcbitlcnJfZnJlZTpcXG4rXFx0a2ZyZWUoa3MpO1xcbitlcnJfb3V0OlxcbitcXHRwdXRfdW5hbGlnbmVkKGVyciwgZXJyX191bmluaXQpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19iaW5kKCkgLSBCaW5kIGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNzLlxcbisgKiBAa3M6XFx0XFx0VGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQuXFxuKyAqIEBvcHRzOlxcdFBvaW50ZXIgdG8gc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgd2l0aCBsb2NhbCBhZGRyZXNzLlxcbisgKiBAb3B0c19fc3o6XFx0U2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuXFxuKyAqXFxuKyAqIEJpbmRzIHRoZSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBhZGRyZXNzIGFuZCBwb3J0LlxcbisgKiBUaGlzIGlzIG9wdGlvbmFsOyBpZiBub3QgY2FsbGVkLCB0aGUga2VybmVsIHdpbGwgYXV0by1hc3NpZ24uXFxuKyAqXFxuKyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIHdoaWxlIGJpbmRpbmcgdGhlIHNvY2tldCwgc28gaXQgY2FuIG9ubHkgYmUgdXNlZCBpblxcbisgKiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19iaW5kKHN0cnVjdCBicGZfa3NvY2sgKmtzLFxcbitcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsXFxuK1xcdFxcdFxcdCAgICAgICB1MzIgb3B0c19fc3opXFxuK3tcXG4rXFx0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9O1xcbitcXHRpbnQgYWRkcmxlbjtcXG4rXFxuK1xcdGlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHRhZGRybGVuID0gYnBmX2tzb2NrX2dldF9hZGRyKG9wdHMsIG9wdHNfX3N6LCBcXHUwMDI2YWRkcik7XFxuK1xcdGlmIChhZGRybGVuIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIGFkZHJsZW47XFxuK1xcbitcXHRyZXR1cm4gX19zeXNfYmluZF9zb2NrZXQoa3MtXFx1MDAzZXNvY2ssIFxcdTAwMjZhZGRyLCBhZGRybGVuKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19jb25uZWN0KCkgLSBDb25uZWN0IGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSByZW1vdGUgYWRkcmVzcy5cXG4rICogQGtzOlxcdFxcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LlxcbisgKiBAb3B0czpcXHRQb2ludGVyIHRvIHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHdpdGggcmVtb3RlIGFkZHJlc3MuXFxuKyAqIEBvcHRzX19zejpcXHRTaXplIG9mIHRoZSBvcHRzIHN0cnVjdC5cXG4rICpcXG4rICogQ29ubmVjdHMgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBhZGRyZXNzIGFuZCBwb3J0LlxcbisgKlxcbisgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCB3aGlsZSBjb25uZWN0aW5nIHRoZSBzb2NrZXQsIHNvIGl0IGNhbiBvbmx5IGJlIHVzZWRcXG4rICogaW4gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfa3NvY2tfY29ubmVjdChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcXG4rXFx0XFx0XFx0XFx0ICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcXG4rXFx0XFx0XFx0XFx0ICB1MzIgb3B0c19fc3opXFxuK3tcXG4rXFx0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9O1xcbitcXHRpbnQgYWRkcmxlbjtcXG4rXFxuK1xcdGlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHRhZGRybGVuID0gYnBmX2tzb2NrX2dldF9hZGRyKG9wdHMsIG9wdHNfX3N6LCBcXHUwMDI2YWRkcik7XFxuK1xcdGlmIChhZGRybGVuIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIGFkZHJsZW47XFxuK1xcbitcXHRyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoa3MtXFx1MDAzZXNvY2ssIFxcdTAwMjZhZGRyLCBhZGRybGVuLCAwKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19hY3F1aXJlKCkgLSBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIGEgQlBGIGtlcm5lbCBzb2NrZXQuXFxuKyAqIEBrczpcXHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byBhY3F1aXJlLiBNdXN0IGJlIGFcXG4rICpcXHR0cnVzdGVkIHBvaW50ZXIgKGUuZy4gUkNVLXByb3RlY3RlZCBrcHRyIGZyb20gYSBtYXApLlxcbisgKlxcbisgKiBUaGUgYWNxdWlyZWQgY29udGV4dCBtdXN0IGVpdGhlciBiZSBzdG9yZWQgaW4gYSBtYXAgYXMgYSBrcHRyLCBvclxcbisgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYnBmX2tzb2NrICpicGZfa3NvY2tfYWNxdWlyZShzdHJ1Y3QgYnBmX2tzb2NrICprcylcXG4re1xcbitcXHRpZiAoIXJlZmNvdW50X2luY19ub3RfemVybyhcXHUwMDI2a3MtXFx1MDAzZXVzYWdlKSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiBrcztcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19yZWxlYXNlKCkgLSBSZWxlYXNlIGEgQlBGIGtlcm5lbCBzb2NrZXQuXFxuKyAqIEBrczpcXHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byByZWxlYXNlLlxcbisgKlxcbisgKiBXaGVuIHRoZSBmaW5hbCByZWZlcmVuY2UgaXMgcmVsZWFzZWQsIHRoZSBzb2NrZXQgaXMgY2xlYW5lZCB1cCB2aWFcXG4rICogcXVldWVfcmN1X3dvcmsoKSAoc2luY2Ugc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9rc29ja19yZWxlYXNlKHN0cnVjdCBicGZfa3NvY2sgKmtzKVxcbit7XFxuK1xcdGlmIChyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXFx1MDAyNmtzLVxcdTAwM2V1c2FnZSkpIHtcXG4rXFx0XFx0SU5JVF9SQ1VfV09SSyhcXHUwMDI2a3MtXFx1MDAzZXJ3b3JrLCBrc29ja19yZWxlYXNlX3dvcmtfZm4pO1xcbitcXHRcXHRxdWV1ZV9yY3Vfd29yayhzeXN0ZW1fZGZsX3dxLCBcXHUwMDI2a3MtXFx1MDAzZXJ3b3JrKTtcXG4rXFx0fVxcbit9XFxuK1xcbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9rc29ja19yZWxlYXNlX2R0b3Iodm9pZCAqa3MpXFxuK3tcXG4rXFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xcbit9XFxuK0NGSV9OT1NFQUwoYnBmX2tzb2NrX3JlbGVhc2VfZHRvcik7XFxuK1xcbisvKipcXG4rICogYnBmX2tzb2NrX3NlbmQoKSAtIFNlbmQgZGF0YSB0aHJvdWdoIGEgQlBGIGtlcm5lbCBzb2NrZXQuXFxuKyAqIEBrczpcXHRcXHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dC4gTXVzdCBiZSBhbiBhY3F1aXJlZCByZWZlcmVuY2UuXFxuKyAqIEBkYXRhOlxcdFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gc2VuZC5cXG4rICogQGRhdGFfX3N6OlxcdFNpemUgb2YgdGhlIGRhdGEgdG8gc2VuZCAobWF4IDY1NTM1IGJ5dGVzKS5cXG4rICpcXG4rICogU2VuZHMgZGF0YSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQsIGJlc3QtZWZmb3J0IGFuZCBub25ibG9ja2luZy4gVGhpcyBtYXkgc2xlZXBcXG4rICogKGtlcm5lbF9zZW5kbXNnKSwgc28gaXQgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcy5cXG4rICpcXG4rICogUmV0dXJuOiBOdW1iZXIgb2YgYnl0ZXMgc2VudCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfa3NvY2tfc2VuZChzdHJ1Y3QgYnBmX2tzb2NrICprcywgY29uc3Qgdm9pZCAqZGF0YSxcXG4rXFx0XFx0XFx0ICAgICAgIHUzMiBkYXRhX19zeilcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgZ3VhcmQ7XFxuK1xcdHN0cnVjdCBtc2doZHIgbXNnID0ge1xcbitcXHRcXHQubXNnX2ZsYWdzID0gTVNHX0RPTlRXQUlULFxcbitcXHR9O1xcbitcXHRzdHJ1Y3Qga3ZlYyBpb3YgPSB7XFxuK1xcdFxcdC5pb3ZfYmFzZSA9ICh2b2lkICopZGF0YSxcXG4rXFx0XFx0Lmlvdl9sZW4gPSBkYXRhX19zeixcXG4rXFx0fTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHQvKiBFYXJseSBjaGVjayBmb3IgVURQLiBFeGFjdCBsaW1pdHMgZW5mb3JjZWQgYnkga2VybmVsX3NlbmRtc2coKS4gKi9cXG4rXFx0aWYgKGRhdGFfX3N6IFxcdTAwM2UgSVBfTUFYX01UVSlcXG4rXFx0XFx0cmV0dXJuIC1FTVNHU0laRTtcXG4rXFxuK1xcdGlmICghYnBmX2tzb2NrX3NlbmRfZW50ZXIoXFx1MDAyNmd1YXJkKSlcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFxuK1xcdHJldCA9IGtlcm5lbF9zZW5kbXNnKGtzLVxcdTAwM2Vzb2NrLCBcXHUwMDI2bXNnLCBcXHUwMDI2aW92LCAxLCBkYXRhX19zeik7XFxuK1xcdGJwZl9rc29ja19zZW5kX2V4aXQoXFx1MDAyNmd1YXJkKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XFxuK1xcbitCVEZfS0ZVTkNTX1NUQVJUKGtzb2NrX2luaXRfa2Z1bmNfYnRmX2lkcylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19jcmVhdGUsIEtGX0FDUVVJUkUgfCBLRl9SRVRfTlVMTCB8IEtGX1NMRUVQQUJMRSlcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19iaW5kLCBLRl9TTEVFUEFCTEUpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfY29ubmVjdCwgS0ZfU0xFRVBBQkxFKVxcbitCVEZfS0ZVTkNTX0VORChrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMpXFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQga3NvY2tfaW5pdF9rZnVuY19zZXQgPSB7XFxuK1xcdC5vd25lciA9IFRISVNfTU9EVUxFLFxcbitcXHQuc2V0ID0gXFx1MDAyNmtzb2NrX2luaXRfa2Z1bmNfYnRmX2lkcyxcXG4rfTtcXG4rXFxuK0JURl9LRlVOQ1NfU1RBUlQoa3NvY2tfa2Z1bmNfYnRmX2lkcylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19yZWxlYXNlLCBLRl9SRUxFQVNFKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2FjcXVpcmUsIEtGX0FDUVVJUkUgfCBLRl9SQ1UgfCBLRl9SRVRfTlVMTClcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19zZW5kLCBLRl9TTEVFUEFCTEUpXFxuK0JURl9LRlVOQ1NfRU5EKGtzb2NrX2tmdW5jX2J0Zl9pZHMpXFxuK1xcbitzdGF0aWMgaW50IGJwZl9rc29ja19rZnVuY19maWx0ZXIoY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1MzIga2Z1bmNfaWQpXFxuK3tcXG4rXFx0aWYgKCFidGZfaWRfc2V0OF9jb250YWlucyhcXHUwMDI2a3NvY2tfa2Z1bmNfYnRmX2lkcywga2Z1bmNfaWQpIHx8XFxuK1xcdCAgICBwcm9nLVxcdTAwM2V0eXBlID09IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCB8fFxcbitcXHQgICAgcHJvZy1cXHUwMDNldHlwZSA9PSBCUEZfUFJPR19UWVBFX0xTTSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gLUVBQ0NFUztcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGtzb2NrX2tmdW5jX3NldCA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC5zZXQgPSBcXHUwMDI2a3NvY2tfa2Z1bmNfYnRmX2lkcyxcXG4rXFx0LmZpbHRlciA9IGJwZl9rc29ja19rZnVuY19maWx0ZXIsXFxuK307XFxuK1xcbitCVEZfSURfTElTVChicGZfa3NvY2tfZHRvcl9pZHMpXFxuK0JURl9JRChzdHJ1Y3QsIGJwZl9rc29jaylcXG4rQlRGX0lEKGZ1bmMsIGJwZl9rc29ja19yZWxlYXNlX2R0b3IpXFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBicGZfa3NvY2tfa2Z1bmNfaW5pdCh2b2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcdGNvbnN0IHN0cnVjdCBidGZfaWRfZHRvcl9rZnVuYyBicGZfa3NvY2tfZHRvcnNbXSA9IHtcXG4rXFx0XFx0e1xcbitcXHRcXHRcXHQuYnRmX2lkID0gYnBmX2tzb2NrX2R0b3JfaWRzWzBdLFxcbitcXHRcXHRcXHQua2Z1bmNfYnRmX2lkID0gYnBmX2tzb2NrX2R0b3JfaWRzWzFdLFxcbitcXHRcXHR9LFxcbitcXHR9O1xcbitcXG4rXFx0cmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cyhcXHUwMDI2YnBmX2tzb2NrX25ldF9vcHMpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdTAwMjZrc29ja19pbml0X2tmdW5jX3NldCk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0dW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKFxcdTAwMjZicGZfa3NvY2tfbmV0X29wcyk7XFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxcbitcXHRcXHRcXHRcXHRcXHRcXHUwMDI2a3NvY2tfa2Z1bmNfc2V0KTtcXG4rXFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MU00sXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2a3NvY2tfa2Z1bmNfc2V0KTtcXG4rXFx0cmV0dXJuIHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoYnBmX2tzb2NrX2R0b3JzLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgQVJSQVlfU0laRShicGZfa3NvY2tfZHRvcnMpLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgVEhJU19NT0RVTEUpO1xcbit9XFxuK1xcbitsYXRlX2luaXRjYWxsKGJwZl9rc29ja19rZnVuY19pbml0KTtcXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMgYi9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuY1xcbmluZGV4IGI1MDg2MThiZmMxMjM5Li5kMjIxYTE4MGM4NzcwNSAxMDA2NDRcXG4tLS0gYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuY1xcbisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jXFxuQEAgLTcsNiArNyw3IEBAXFxuICAqL1xcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbHRlci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmX2tzb2NrLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc3lzY3RsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGUuaFxcdTAwM2VcXG5AQCAtNTI1LDYgKzUyNiwxNiBAQCBzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBuZXRfY29yZV90YWJsZVtdID0ge1xcbiBcXHRcXHQuZXh0cmExXFx0XFx0PSBTWVNDVExfTE9OR19PTkUsXFxuIFxcdFxcdC5leHRyYTJcXHRcXHQ9IFxcdTAwMjZicGZfaml0X2xpbWl0X21heCxcXG4gXFx0fSxcXG4rI2VuZGlmXFxuKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUEZfU1lTQ0FMTCkgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfSU5FVClcXG4rXFx0e1xcbitcXHRcXHQucHJvY25hbWVcXHQ9IFxcXCJicGZfa3NvY2tfbWF4XFxcIixcXG4rXFx0XFx0LmRhdGFcXHRcXHQ9IFxcdTAwMjZzeXNjdGxfYnBmX2tzb2NrX21heCxcXG4rXFx0XFx0Lm1heGxlblxcdFxcdD0gc2l6ZW9mKGludCksXFxuK1xcdFxcdC5tb2RlXFx0XFx0PSAwNjQ0LFxcbitcXHRcXHQucHJvY19oYW5kbGVyXFx0PSBwcm9jX2RvaW50dmVjX21pbm1heCxcXG4rXFx0XFx0LmV4dHJhMVxcdFxcdD0gU1lTQ1RMX1pFUk8sXFxuK1xcdH0sXFxuICNlbmRpZlxcbiBcXHR7XFxuIFxcdFxcdC5wcm9jbmFtZVxcdD0gXFxcIm5ldGRldl90c3RhbXBfcHJlcXVldWVcXFwiLFxcbmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmNcXG5pbmRleCA2M2M2OWEwZmE3NGUxZS4uYzc0MjdkZDRkZDUyM2QgMTAwNjQ0XFxuLS0tIGEvbmV0L3NvY2tldC5jXFxuKysrIGIvbmV0L3NvY2tldC5jXFxuQEAgLTIxMTUsMjcgKzIxMTUsMzEgQEAgU1lTQ0FMTF9ERUZJTkUzKGFjY2VwdCwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1cGVlcl9zb2NrYWRkcixcXG4gICpcXHRpbmNsdWRlIHRoZSAtRUlOUFJPR1JFU1Mgc3RhdHVzIGZvciBzdWNoIHNvY2tldHMuXFxuICAqL1xcbiBcXG4raW50IF9fc3lzX2Nvbm5lY3Rfc29ja2V0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxcbitcXHRcXHRcXHQgaW50IGFkZHJsZW4sIGludCBmbGFncylcXG4re1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZXJyID0gc2VjdXJpdHlfc29ja2V0X2Nvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsIGFkZHJsZW4pO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0cmV0dXJuIFJFQURfT05DRShzb2NrLVxcdTAwM2VvcHMpLVxcdTAwM2Vjb25uZWN0KHNvY2ssXFxuK1xcdFxcdFxcdFxcdCAgICAoc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKilhZGRyZXNzLFxcbitcXHRcXHRcXHRcXHQgICAgYWRkcmxlbiwgZmxhZ3MpO1xcbit9XFxuK1xcbiBpbnQgX19zeXNfY29ubmVjdF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcyxcXG4gXFx0XFx0ICAgICAgIGludCBhZGRybGVuLCBpbnQgZmlsZV9mbGFncylcXG4ge1xcbiBcXHRzdHJ1Y3Qgc29ja2V0ICpzb2NrO1xcbi1cXHRpbnQgZXJyO1xcbiBcXG4gXFx0c29jayA9IHNvY2tfZnJvbV9maWxlKGZpbGUpO1xcbi1cXHRpZiAoIXNvY2spIHtcXG4tXFx0XFx0ZXJyID0gLUVOT1RTT0NLO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbi1cXG4tXFx0ZXJyID1cXG4tXFx0ICAgIHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTtcXG4tXFx0aWYgKGVycilcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghc29jaylcXG4rXFx0XFx0cmV0dXJuIC1FTk9UU09DSztcXG4gXFxuLVxcdGVyciA9IFJFQURfT05DRShzb2NrLVxcdTAwM2VvcHMpLVxcdTAwM2Vjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqKWFkZHJlc3MsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICBhZGRybGVuLCBzb2NrLVxcdTAwM2VmaWxlLVxcdTAwM2VmX2ZsYWdzIHwgZmlsZV9mbGFncyk7XFxuLW91dDpcXG4tXFx0cmV0dXJuIGVycjtcXG4rXFx0cmV0dXJuIF9fc3lzX2Nvbm5lY3Rfc29ja2V0KHNvY2ssIGFkZHJlc3MsIGFkZHJsZW4sXFxuK1xcdFxcdFxcdFxcdCAgICBzb2NrLVxcdTAwM2VmaWxlLVxcdTAwM2VmX2ZsYWdzIHwgZmlsZV9mbGFncyk7XFxuIH1cXG4gXFxuIGludCBfX3N5c19jb25uZWN0KGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdXNlcnZhZGRyLCBpbnQgYWRkcmxlbilcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi44YjE0ZmQ5OGQ0MTBlZFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29jay5jXFxuQEAgLTAsMCArMSwyMzkgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2FycGEvaW5ldC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcInRlc3RfcHJvZ3MuaFxcXCJcXG4rI2luY2x1ZGUgXFxcIm5ldHdvcmtfaGVscGVycy5oXFxcIlxcbisjaW5jbHVkZSBcXFwia3NvY2tfYmFzaWMuc2tlbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwia3NvY2tfcmVjdXJzaW9uLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgTlNfVEVTVCBcXFwia3NvY2tfYmFzaWNfbnNcXFwiXFxuKyNkZWZpbmUgTlNfTFNNX1JFQ1VSU0lPTl9URVNUIFxcXCJrc29ja19sc21fcmVjdXJzaW9uX25zXFxcIlxcbisjZGVmaW5lIExPT1BCQUNLX0lQIFxcXCIxMjcuMC4wLjFcXFwiXFxuKyNkZWZpbmUgUkVDVl9QT1JUIDc3NzdcXG4rI2RlZmluZSBSRUNWX1RJTUVPVVRfU0VDIDVcXG4rXFxuK3N0cnVjdCBrc29ja190ZXN0X2VudiB7XFxuK1xcdGNvbnN0IGNoYXIgKm5ldG5zO1xcbitcXHRib29sIG5ldG5zX2NyZWF0ZWQ7XFxuK1xcdHN0cnVjdCBuc3Rva2VuICpuc3Rva2VuO1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjtcXG4rXFx0aW50IHJmZDtcXG4rXFx0Y2hhciBidWZbMzJdO1xcbit9O1xcbitcXG4rc3RhdGljIGJvb2wga3NvY2tfdGVzdF9lbnZfc2V0dXAoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYsIGNvbnN0IGNoYXIgKm5ldG5zKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHR2O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0bWVtc2V0KGVudiwgMCwgc2l6ZW9mKCplbnYpKTtcXG4rXFx0ZW52LVxcdTAwM2VuZXRucyA9IG5ldG5zO1xcbitcXHRlbnYtXFx1MDAzZXJmZCA9IC0xO1xcbitcXG4rXFx0U1lTKGZhaWwsIFxcXCJpcCBuZXRucyBhZGQgJXNcXFwiLCBuZXRucyk7XFxuK1xcdGVudi1cXHUwMDNlbmV0bnNfY3JlYXRlZCA9IHRydWU7XFxuK1xcdFNZUyhmYWlsLCBcXFwiaXAgLW5ldCAlcyBsaW5rIHNldCBsbyB1cFxcXCIsIG5ldG5zKTtcXG4rXFxuK1xcdGVudi1cXHUwMDNlbnN0b2tlbiA9IG9wZW5fbmV0bnMobmV0bnMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZW52LVxcdTAwM2Vuc3Rva2VuLCBcXFwib3Blbl9uZXRuc1xcXCIpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHRlbnYtXFx1MDAzZXJmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGVudi1cXHUwMDNlcmZkLCBcXFwicmVjZWl2ZXIgc29ja2V0XFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdGVudi1cXHUwMDNlYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDtcXG4rXFx0ZW52LVxcdTAwM2VhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihMT09QQkFDS19JUCk7XFxuK1xcdGVudi1cXHUwMDNlYWRkci5zaW5fcG9ydCA9IGh0b25zKFJFQ1ZfUE9SVCk7XFxuK1xcbitcXHRlcnIgPSBiaW5kKGVudi1cXHUwMDNlcmZkLCAoc3RydWN0IHNvY2thZGRyICopXFx1MDAyNmVudi1cXHUwMDNlYWRkciwgc2l6ZW9mKGVudi1cXHUwMDNlYWRkcikpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJiaW5kIHJlY2VpdmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdHR2LnR2X3NlYyA9IFJFQ1ZfVElNRU9VVF9TRUM7XFxuK1xcdHR2LnR2X3VzZWMgPSAwO1xcbitcXHRlcnIgPSBzZXRzb2Nrb3B0KGVudi1cXHUwMDNlcmZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgXFx1MDAyNnR2LCBzaXplb2YodHYpKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0IHJjdnRpbWVvXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdHJldHVybiB0cnVlO1xcbitcXG4rZmFpbDpcXG4rXFx0aWYgKGVudi1cXHUwMDNlcmZkIFxcdTAwM2U9IDApIHtcXG4rXFx0XFx0Y2xvc2UoZW52LVxcdTAwM2VyZmQpO1xcbitcXHRcXHRlbnYtXFx1MDAzZXJmZCA9IC0xO1xcbitcXHR9XFxuK1xcdGlmIChlbnYtXFx1MDAzZW5zdG9rZW4pIHtcXG4rXFx0XFx0Y2xvc2VfbmV0bnMoZW52LVxcdTAwM2Vuc3Rva2VuKTtcXG4rXFx0XFx0ZW52LVxcdTAwM2Vuc3Rva2VuID0gTlVMTDtcXG4rXFx0fVxcbitcXHRpZiAoZW52LVxcdTAwM2VuZXRuc19jcmVhdGVkKSB7XFxuK1xcdFxcdFNZU19OT0ZBSUwoXFxcImlwIG5ldG5zIGRlbCAlcyBcXHUwMDNlL2Rldi9udWxsIDJcXHUwMDNlXFx1MDAyNjFcXFwiLCBuZXRucyk7XFxuK1xcdFxcdGVudi1cXHUwMDNlbmV0bnNfY3JlYXRlZCA9IGZhbHNlO1xcbitcXHR9XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQga3NvY2tfdGVzdF9lbnZfY2xlYW51cChzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudilcXG4re1xcbitcXHRpZiAoZW52LVxcdTAwM2VyZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoZW52LVxcdTAwM2VyZmQpO1xcbitcXHRpZiAoZW52LVxcdTAwM2Vuc3Rva2VuKVxcbitcXHRcXHRjbG9zZV9uZXRucyhlbnYtXFx1MDAzZW5zdG9rZW4pO1xcbitcXHRpZiAoZW52LVxcdTAwM2VuZXRuc19jcmVhdGVkKSB7XFxuK1xcdFxcdFNZU19OT0ZBSUwoXFxcImlwIG5ldG5zIGRlbCAlcyBcXHUwMDNlL2Rldi9udWxsIDJcXHUwMDNlXFx1MDAyNjFcXFwiLCBlbnYtXFx1MDAzZW5ldG5zKTtcXG4rXFx0XFx0ZW52LVxcdTAwM2VuZXRuc19jcmVhdGVkID0gZmFsc2U7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQga3NvY2tfYXNzZXJ0X3JlY3Yoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYsIGNvbnN0IGNoYXIgKmRhdGEsXFxuK1xcdFxcdFxcdCAgICAgIHNpemVfdCBkYXRhX3N6KVxcbit7XFxuK1xcdHNzaXplX3QgbjtcXG4rXFxuK1xcdG1lbXNldChlbnYtXFx1MDAzZWJ1ZiwgMCwgc2l6ZW9mKGVudi1cXHUwMDNlYnVmKSk7XFxuK1xcdG4gPSByZWN2ZnJvbShlbnYtXFx1MDAzZXJmZCwgZW52LVxcdTAwM2VidWYsIHNpemVvZihlbnYtXFx1MDAzZWJ1ZiksIDAsIE5VTEwsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShuLCBkYXRhX3N6LCBcXFwicmVjdmZyb20gbGVuXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0QVNTRVJUX01FTUVRKGVudi1cXHUwMDNlYnVmLCBkYXRhLCBkYXRhX3N6LCBcXFwicGF5bG9hZCBtYXRjaFxcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBrc29ja19zZXR1cF9jdHgoc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nLCBfX2JlMzIgKmlwdjRfcmVtb3RlLFxcbitcXHRcXHRcXHQgICAgX191MTYgKnJlbW90ZV9wb3J0KVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzKTtcXG4rXFx0aW50IGVyciwgcGZkO1xcbitcXG4rXFx0KmlwdjRfcmVtb3RlID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTtcXG4rXFx0KnJlbW90ZV9wb3J0ID0gUkVDVl9QT1JUO1xcbitcXG4rXFx0cGZkID0gYnBmX3Byb2dyYW1fX2ZkKHByb2cpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChwZmQsIFxcXCJrc29ja19zZXR1cCBmZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHBmZCwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJrc29ja19zZXR1cCBydW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhvcHRzLnJldHZhbCwgXFxcImtzb2NrX3NldHVwIHJldHZhbFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2tzb2NrX2Jhc2ljKHZvaWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xcbitcXHRzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgZW52O1xcbitcXHRzdHJ1Y3Qga3NvY2tfYmFzaWMgKnNrZWw7XFxuK1xcdGludCBlcnIsIHBmZDtcXG4rXFxuK1xcdHNrZWwgPSBrc29ja19iYXNpY19fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWwgb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRlcnIgPSBrc29ja19iYXNpY19fbG9hZChza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2tlbCBsb2FkXFxcIikpIHtcXG4rXFx0XFx0a3NvY2tfYmFzaWNfX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFrc29ja190ZXN0X2Vudl9zZXR1cChcXHUwMDI2ZW52LCBOU19URVNUKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogU3RlcCAxOiBSdW4gdGhlIHNldHVwIFNZU0NBTEwgcHJvZyB0byBjcmVhdGUga3NvY2sgKi9cXG4rXFx0aWYgKCFrc29ja19zZXR1cF9jdHgoc2tlbC1cXHUwMDNlcHJvZ3Mua3NvY2tfc2V0dXAsXFxuK1xcdFxcdFxcdCAgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlaXB2NF9yZW1vdGUsXFxuK1xcdFxcdFxcdCAgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVtb3RlX3BvcnQpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHQvKiBTdGVwIDI6IFJ1biB0aGUgc2VuZCBTWVNDQUxMIHByb2cgKi9cXG4rXFx0cGZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLmtzb2NrX3NlbmQpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChwZmQsIFxcXCJrc29ja19zZW5kIGZkXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocGZkLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImtzb2NrX3NlbmQgcnVuXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEob3B0cy5yZXR2YWwsXFxuK1xcdFxcdCAgICAgICBzaXplb2Yoc2tlbC1cXHUwMDNlZGF0YS1cXHUwMDNlc2VuZF9kYXRhKSwgXFxcInNlbmRtc2cgYnl0ZXNcXFwiKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogU3RlcCAzOiBSZWNlaXZlIGFuZCB2ZXJpZnkgdGhlIGRhdGEgKi9cXG4rXFx0a3NvY2tfYXNzZXJ0X3JlY3YoXFx1MDAyNmVudiwgc2tlbC1cXHUwMDNlZGF0YS1cXHUwMDNlc2VuZF9kYXRhLFxcbitcXHRcXHRcXHQgIHNpemVvZihza2VsLVxcdTAwM2VkYXRhLVxcdTAwM2VzZW5kX2RhdGEpKTtcXG4rXFxuK2ZhaWw6XFxuK1xcdGtzb2NrX3Rlc3RfZW52X2NsZWFudXAoXFx1MDAyNmVudik7XFxuK1xcdGtzb2NrX2Jhc2ljX19kZXN0cm95KHNrZWwpO1xcbit9XFxuK1xcbit2b2lkIHRlc3Rfa3NvY2tfbHNtX3JlY3Vyc2lvbih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBrc29ja190ZXN0X2VudiBlbnY7XFxuK1xcdHN0cnVjdCBrc29ja19yZWN1cnNpb24gKnNrZWw7XFxuK1xcdGNoYXIgdHJpZ2dlciA9ICd4JztcXG4rXFx0aW50IHRmZCA9IC0xO1xcbitcXHRpbnQgZXJyO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcbitcXHRza2VsID0ga3NvY2tfcmVjdXJzaW9uX19vcGVuKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwic2tlbCBvcGVuXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGVyciA9IGtzb2NrX3JlY3Vyc2lvbl9fbG9hZChza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2tlbCBsb2FkXFxcIikpIHtcXG4rXFx0XFx0a3NvY2tfcmVjdXJzaW9uX19kZXN0cm95KHNrZWwpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoXFx1MDAyNmVudiwgTlNfTFNNX1JFQ1VSU0lPTl9URVNUKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogU3RlcCAxOiBSdW4gdGhlIHNldHVwIFNZU0NBTEwgcHJvZyB0byBjcmVhdGUgdGhlIGtzb2NrICovXFxuK1xcdGlmICgha3NvY2tfc2V0dXBfY3R4KHNrZWwtXFx1MDAzZXByb2dzLmtzb2NrX3NldHVwLFxcbitcXHRcXHRcXHQgICAgIFxcdTAwMjZza2VsLVxcdTAwM2Vic3MtXFx1MDAzZWlwdjRfcmVtb3RlLFxcbitcXHRcXHRcXHQgICAgIFxcdTAwMjZza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlbW90ZV9wb3J0KSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogU3RlcCAyOiBBdHRhY2ggTFNNIHByb2cgYW5kIHRyaWdnZXIgc29ja2V0X3NlbmRtc2cgZnJvbSB1c2Vyc3BhY2UgKi9cXG4rXFx0c2tlbC1cXHUwMDNlbGlua3Mua3NvY2tfc29ja2V0X3NlbmRtc2cgPVxcbitcXHRcXHRicGZfcHJvZ3JhbV9fYXR0YWNoX2xzbShza2VsLVxcdTAwM2Vwcm9ncy5rc29ja19zb2NrZXRfc2VuZG1zZyk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLVxcdTAwM2VsaW5rcy5rc29ja19zb2NrZXRfc2VuZG1zZyxcXG4rXFx0XFx0XFx0ICAgXFxcImF0dGFjaCBzb2NrZXRfc2VuZG1zZyBsc21cXFwiKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0dGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQodGZkLCBcXFwidHJpZ2dlciBzb2NrZXRcXFwiKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0YXJnZXRfcGlkID0gZ2V0cGlkKCk7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldHJpZ2dlcl9zZW5kID0gMTtcXG4rXFx0biA9IHNlbmR0byh0ZmQsIFxcdTAwMjZ0cmlnZ2VyLCBzaXplb2YodHJpZ2dlciksIDAsXFxuK1xcdFxcdCAgIChzdHJ1Y3Qgc29ja2FkZHIgKilcXHUwMDI2ZW52LmFkZHIsIHNpemVvZihlbnYuYWRkcikpO1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRhcmdldF9waWQgPSAwO1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRyaWdnZXJfc2VuZCA9IDA7XFxuK1xcdGlmICghQVNTRVJUX0VRKG4sIHNpemVvZih0cmlnZ2VyKSwgXFxcInRyaWdnZXIgc2VuZHRvXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIFN0ZXAgMzogVGhlIG5lc3RlZCBicGZfa3NvY2tfc2VuZCgpIG11c3QgaGl0IHRoZSByZWN1cnNpb24gZ3VhcmQgKi9cXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNfY291bnQsIDIsXFxuK1xcdFxcdCAgICAgICBcXFwic29ja2V0X3NlbmRtc2cgcmVjdXJzaW9uIGNvdW50XFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlZGF0YS1cXHUwMDNlcmVjX2tmdW5jX3JldHNbMF0sIC1FQlVTWSxcXG4rXFx0XFx0ICAgICAgIFxcXCJyZWN1cnNpdmUgc2VuZCBzdGF0dXNcXFwiKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHRpZiAoIUFTU0VSVF9FUShza2VsLVxcdTAwM2VkYXRhLVxcdTAwM2VyZWNfa2Z1bmNfcmV0c1sxXSxcXG4rXFx0XFx0ICAgICAgIHNpemVvZihza2VsLVxcdTAwM2VkYXRhLVxcdTAwM2VzZW5kX2RhdGEpLCBcXFwib3V0ZXIgc2VuZCBieXRlc1xcXCIpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHRrc29ja19hc3NlcnRfcmVjdihcXHUwMDI2ZW52LCBza2VsLVxcdTAwM2VkYXRhLVxcdTAwM2VzZW5kX2RhdGEsXFxuK1xcdFxcdFxcdCAgc2l6ZW9mKHNrZWwtXFx1MDAzZWRhdGEtXFx1MDAzZXNlbmRfZGF0YSkpO1xcbitcXG4rZmFpbDpcXG4rXFx0aWYgKHRmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZSh0ZmQpO1xcbitcXHRrc29ja190ZXN0X2Vudl9jbGVhbnVwKFxcdTAwMjZlbnYpO1xcbitcXHRrc29ja19yZWN1cnNpb25fX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3F1b3RhLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5jODZkOWIwYTk1MTNlOFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja19xdW90YS5jXFxuQEAgLTAsMCArMSwxMzkgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zdGF0LmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwidGVzdF9wcm9ncy5oXFxcIlxcbisjaW5jbHVkZSBcXFwibmV0d29ya19oZWxwZXJzLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJzeXNjdGxfaGVscGVycy5oXFxcIlxcbisjaW5jbHVkZSBcXFwia3NvY2tfcXVvdGEuc2tlbC5oXFxcIlxcbitcXG4rI2RlZmluZSBOU19ORVRfUVVPVEFfVEVTVDEgXFxcImtzb2NrX25ldF9xdW90YV9uczFcXFwiXFxuKyNkZWZpbmUgTlNfTkVUX1FVT1RBX1RFU1QyIFxcXCJrc29ja19uZXRfcXVvdGFfbnMyXFxcIlxcbisjZGVmaW5lIEtTT0NLX01BWF9TWVNDVEwgXFxcIi9wcm9jL3N5cy9uZXQvY29yZS9icGZfa3NvY2tfbWF4XFxcIlxcbisjZGVmaW5lIEtTT0NLX1FVT1RBX05TX1NMT1RTIDNcXG4rI2RlZmluZSBLU09DS19RVU9UQV9OUzFfT0ZGU0VUIDBcXG4rI2RlZmluZSBLU09DS19RVU9UQV9OUzJfT0ZGU0VUIEtTT0NLX1FVT1RBX05TX1NMT1RTXFxuK1xcbitzdGF0aWMgaW50IGtzb2NrX3J1bl9wcm9nKHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZylcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChwcm9nKSwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHRyZXR1cm4gb3B0cy5yZXR2YWw7XFxuK31cXG4rXFxuK3N0YXRpYyBfX3U2NCBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChzdHJ1Y3Qga3NvY2tfcXVvdGEgKnNrZWwpXFxuK3tcXG4rXFx0cmV0dXJuIF9fYXRvbWljX2xvYWRfbihcXHUwMDI2c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VxdW90YV9yZWxlYXNlX2NvbXBsZXRlZCxcXG4rXFx0XFx0XFx0ICAgICAgIF9fQVRPTUlDX0FDUVVJUkUpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGtzb2NrX3JlbGVhc2VfcXVvdGFfc2xvdHMoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgc2xvdF9vZmZzZXQpXFxuK3tcXG4rXFx0X191NjQgY29tcGxldGVkO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0Y29tcGxldGVkID0ga3NvY2tfcXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQoc2tlbCk7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcXVvdGFfc2xvdF9vZmZzZXQgPSBzbG90X29mZnNldDtcXG4rXFx0ZXJyID0ga3NvY2tfcnVuX3Byb2coc2tlbC1cXHUwMDNlcHJvZ3Mua3NvY2tfcXVvdGFfcmVsZWFzZSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImtzb2NrX3F1b3RhX3JlbGVhc2VcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0d2hpbGUgKGtzb2NrX3F1b3RhX3JlbGVhc2VfY29tcGxldGVkKHNrZWwpIC0gY29tcGxldGVkIFxcdTAwM2NcXG4rXFx0ICAgICAgIHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcXVvdGFfcmVsZWFzZWQpXFxuK1xcdFxcdHVzbGVlcCgxMDAwKTtcXG4rXFxuK1xcdHJldHVybiBza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXF1b3RhX3JlbGVhc2VkO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBrc29ja19leHBlY3RfcXVvdGEoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgc2xvdF9vZmZzZXQsXFxuK1xcdFxcdFxcdCAgICAgICBjb25zdCBjaGFyICpuYW1lKVxcbit7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXF1b3RhX3Nsb3Rfb2Zmc2V0ID0gc2xvdF9vZmZzZXQ7XFxuK1xcdGVyciA9IGtzb2NrX3J1bl9wcm9nKHNrZWwtXFx1MDAzZXByb2dzLmtzb2NrX3F1b3RhX2NyZWF0ZSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgbmFtZSkpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VxdW90YV9jcmVhdGVkLCAyLCBuYW1lKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRyZXR1cm4gQVNTRVJUX0VRKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcXVvdGFfZXJyLCAtRU5PU1BDLCBuYW1lKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgcmVjb3JkX2N1cnJlbnRfbnMoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgdGFyZ2V0KVxcbit7XFxuK1xcdHN0cnVjdCBzdGF0IHN0O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZXJyID0gc3RhdChcXFwiL3Byb2Mvc2VsZi9ucy9uZXRcXFwiLCBcXHUwMDI2c3QpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzdGF0IG5ldG5zXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0YXJnZXRfbmV0bnNfaW51bVt0YXJnZXRdID0gKF9fdTMyKXN0LnN0X2lubztcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3ZvaWQgc2VyaWFsX3Rlc3Rfa3NvY2tfbmV0X3F1b3RhKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciBvbGRfbWF4WzE2XSA9IHt9O1xcbitcXHRzdHJ1Y3QgbmV0bnNfb2JqICpuZXRuczEgPSBOVUxMLCAqbmV0bnMyID0gTlVMTDtcXG4rXFx0c3RydWN0IGtzb2NrX3F1b3RhICpza2VsO1xcbitcXHRpbnQgcmVsZWFzZWQ7XFxuK1xcbitcXHRza2VsID0ga3NvY2tfcXVvdGFfX29wZW5fYW5kX2xvYWQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJrc29jayBxdW90YSBza2VsZXRvblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNrZWwtXFx1MDAzZWxpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlciA9XFxuK1xcdFxcdGJwZl9wcm9ncmFtX19hdHRhY2hfdHJhY2Uoc2tlbC1cXHUwMDNlcHJvZ3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtXFx1MDAzZWxpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlcixcXG4rXFx0XFx0XFx0ICAgXFxcImF0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZW50cnlcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdHNrZWwtXFx1MDAzZWxpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19leGl0ID1cXG4rXFx0XFx0YnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLVxcdTAwM2Vwcm9ncy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLVxcdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCxcXG4rXFx0XFx0XFx0ICAgXFxcImF0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZXhpdFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmIChzeXNjdGxfc2V0X29yX2ZhaWwoS1NPQ0tfTUFYX1NZU0NUTCwgb2xkX21heCwgXFxcIjJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRuZXRuczEgPSBuZXRuc19uZXcoTlNfTkVUX1FVT1RBX1RFU1QxLCB0cnVlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMSwgXFxcImNyZWF0ZSBmaXJzdCBuZXRuc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFyZWNvcmRfY3VycmVudF9ucyhza2VsLCAwKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoIWtzb2NrX2V4cGVjdF9xdW90YShza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VULFxcbitcXHRcXHRcXHRcXHRcXFwiZmlyc3QgbmV0bnMgcXVvdGFcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBUaGUgaG9zdC13aWRlIHNldHRpbmcgZ3JhbnRzIHRoZSBmdWxsIGFsbG93YW5jZSB0byBlYWNoIG5ldG5zLiAqL1xcbitcXHRuZXRuczIgPSBuZXRuc19uZXcoTlNfTkVUX1FVT1RBX1RFU1QyLCB0cnVlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMiwgXFxcImNyZWF0ZSBzZWNvbmQgbmV0bnNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghcmVjb3JkX2N1cnJlbnRfbnMoc2tlbCwgMSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKCFrc29ja19leHBlY3RfcXVvdGEoc2tlbCwgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCxcXG4rXFx0XFx0XFx0XFx0XFxcInNlY29uZCBuZXRucyBxdW90YVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHJlbGVhc2VkID0ga3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEocmVsZWFzZWQsIDIsIFxcXCJzZWNvbmQgbmV0bnMgcXVvdGEgcmVsZWFzZWRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBCb3RoIHJlbGVhc2VkIHNsb3RzIG11c3QgYmVjb21lIGF2YWlsYWJsZSBhZ2Fpbi4gKi9cXG4rXFx0a3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQsIFxcXCJyZWNvdmVyZWQgcXVvdGFcXFwiKTtcXG4rXFxuK291dDpcXG4rXFx0a3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTtcXG4rXFx0a3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VUKTtcXG4rXFx0bmV0bnNfZnJlZShuZXRuczIpO1xcbitcXHRuZXRuc19mcmVlKG5ldG5zMSk7XFxuK1xcdGlmIChvbGRfbWF4WzBdKVxcbitcXHRcXHRzeXNjdGxfc2V0X29yX2ZhaWwoS1NPQ0tfTUFYX1NZU0NUTCwgTlVMTCwgb2xkX21heCk7XFxuK1xcdGtzb2NrX3F1b3RhX19kZXN0cm95KHNrZWwpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3dxLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja193cS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTg0YjEzNGYzODIzNzBcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuY1xcbkBAIC0wLDAgKzEsMzQgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcInRlc3RfcHJvZ3MuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImtzb2NrX3dxLnNrZWwuaFxcXCJcXG4rXFxuK3ZvaWQgdGVzdF9rc29ja193cSh2b2lkKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzKTtcXG4rXFx0c3RydWN0IGtzb2NrX3dxICpza2VsO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0c2tlbCA9IGtzb2NrX3dxX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwia3NvY2tfd3Egb3BlbiBhbmQgbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVxcdTAwM2Vwcm9ncy5rc29ja193cV9zdGFydCksXFxuK1xcdFxcdFxcdFxcdCAgICAgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW4ga3NvY2tfd3Ffc3RhcnRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghQVNTRVJUX09LKG9wdHMucmV0dmFsLCBcXFwia3NvY2tfd3Ffc3RhcnQgcmV0dmFsXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0d2hpbGUgKCFfX2F0b21pY19sb2FkX24oXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlY2FsbGJhY2tfZG9uZSwgX19BVE9NSUNfQUNRVUlSRSkpXFxuK1xcdFxcdHVzbGVlcCgxMDAwKTtcXG4rXFxuK1xcdEFTU0VSVF9FUShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZWNyZWF0ZV9lcnIsIC1FT1BOT1RTVVBQLFxcbitcXHRcXHQgIFxcXCJ3b3JrcXVldWUgY3JlYXRlIHJlamVjdGVkXFxcIik7XFxuK1xcbitvdXQ6XFxuK1xcdGtzb2NrX3dxX19kZXN0cm95KHNrZWwpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2Jhc2ljLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xODliMGZjMTU3NzAxMVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfYmFzaWMuY1xcbkBAIC0wLDAgKzEsMzcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2VuZGlhbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiYnBmX3RyYWNpbmdfbmV0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJrc29ja19jb21tb24uaFxcXCJcXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBrc29ja19zZXR1cCh2b2lkICpjdHgpXFxuK3tcXG4rXFx0cmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBrc29ja19zZW5kKHZvaWQgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xcbitcXHRpbnQgc2VuZCA9IC0xO1xcbitcXG4rXFx0diA9IGtzb2NrX2N0eF92YWx1ZV9sb29rdXAoKTtcXG4rXFx0aWYgKCF2KVxcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFxuK1xcdGtzID0gYnBmX2twdHJfeGNoZyhcXHUwMDI2di1cXHUwMDNlY3R4LCBOVUxMKTtcXG4rXFx0aWYgKCFrcylcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcbitcXHRzZW5kID0gYnBmX2tzb2NrX3NlbmQoa3MsIHNlbmRfZGF0YSwgc2l6ZW9mKHNlbmRfZGF0YSkpO1xcbitcXHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XFxuK1xcdHJldHVybiBzZW5kO1xcbit9XFxuK1xcbitjaGFyIF9fbGljZW5zZVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19jb21tb24uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19jb21tb24uaFxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdjZjY0MzE5YjkwMTQ1XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19jb21tb24uaFxcbkBAIC0wLDAgKzEsMTEwIEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cXG4rXFxuKyNpZm5kZWYgX0tTT0NLX0NPTU1PTl9IXFxuKyNkZWZpbmUgX0tTT0NLX0NPTU1PTl9IXFxuK1xcbisjaW5jbHVkZSBcXFwiZXJybm8uaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGJvb2wuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgU09DS19TVFJFQU1cXHQxXFxuKyNkZWZpbmUgU09DS19ER1JBTVxcdDJcXG4rI2RlZmluZSBJUFBST1RPX1RDUFxcdDZcXG4rI2RlZmluZSBJUFBST1RPX1VEUFxcdDE3XFxuK1xcbitzdHJ1Y3QgYnBmX2tzb2NrICpicGZfa3NvY2tfY3JlYXRlKGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKm9wdHMsXFxuK1xcdFxcdFxcdFxcdCAgIHUzMiBvcHRzX19zeiwgaW50ICplcnJfX3VuaW5pdCkgX19rc3ltO1xcbitpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXFxuK1xcdFxcdCAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzICpvcHRzLCB1MzIgb3B0c19fc3opIF9fa3N5bTtcXG4raW50IGJwZl9rc29ja19jb25uZWN0KHN0cnVjdCBicGZfa3NvY2sgKmtzLFxcbitcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6KSBfX2tzeW07XFxuK3N0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19hY3F1aXJlKHN0cnVjdCBicGZfa3NvY2sgKmtzKSBfX2tzeW07XFxuK3ZvaWQgYnBmX2tzb2NrX3JlbGVhc2Uoc3RydWN0IGJwZl9rc29jayAqa3MpIF9fa3N5bTtcXG4raW50IGJwZl9rc29ja19zZW5kKHN0cnVjdCBicGZfa3NvY2sgKmtzLFxcbitcXHRcXHQgICBjb25zdCB2b2lkICpkYXRhLCB1MzIgZGF0YV9fc3opIF9fa3N5bTtcXG4rXFxuK3N0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSB7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4O1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdHlwZShrZXksIGludCk7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlKTtcXG4rXFx0X191aW50KG1heF9lbnRyaWVzLCAxKTtcXG4rfSBfX2tzb2NrX2N0eF9tYXAgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKmtzb2NrX2N0eF92YWx1ZV9sb29rdXAodm9pZClcXG4re1xcbitcXHR1MzIga2V5ID0gMDtcXG4rXFxuK1xcdHJldHVybiBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZfX2tzb2NrX2N0eF9tYXAsIFxcdTAwMjZrZXkpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBrc29ja19jdHhfaW5zZXJ0KHN0cnVjdCBicGZfa3NvY2sgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgbG9jYWwsICp2O1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrICpvbGQ7XFxuK1xcdHUzMiBrZXkgPSAwO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0bG9jYWwuY3R4ID0gTlVMTDtcXG4rXFx0ZXJyID0gYnBmX21hcF91cGRhdGVfZWxlbShcXHUwMDI2X19rc29ja19jdHhfbWFwLCBcXHUwMDI2a2V5LCBcXHUwMDI2bG9jYWwsIDApO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdGJwZl9rc29ja19yZWxlYXNlKGN0eCk7XFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdHYgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZfX2tzb2NrX2N0eF9tYXAsIFxcdTAwMjZrZXkpO1xcbitcXHRpZiAoIXYpIHtcXG4rXFx0XFx0YnBmX2tzb2NrX3JlbGVhc2UoY3R4KTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4rXFxuK1xcdG9sZCA9IGJwZl9rcHRyX3hjaGcoXFx1MDAyNnYtXFx1MDAzZWN0eCwgY3R4KTtcXG4rXFx0aWYgKG9sZCkge1xcbitcXHRcXHRicGZfa3NvY2tfcmVsZWFzZShvbGQpO1xcbitcXHRcXHRyZXR1cm4gLUVFWElTVDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIEdsb2JhbHMgZm9yIHBhc3NpbmcgY29uZmlnIGZyb20gdXNlcnNwYWNlICovXFxuK19fYmUzMiBpcHY0X3JlbW90ZTtcXG4rX191MTYgcmVtb3RlX3BvcnQ7XFxuK1xcbitjaGFyIHNlbmRfZGF0YVszMl0gPSBcXFwiaGVsbG8gZnJvbSBicGYga3NvY2tcXFwiO1xcbitcXG4rc3RhdGljIGlubGluZSBpbnQgZG9fa3NvY2tfc2V0dXAodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XFxuK1xcdHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIGFkZHJfb3B0cyA9IHt9O1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcXG4rXFx0aW50IGVyciA9IDA7XFxuK1xcbitcXHRjcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUO1xcbitcXHRjcmVhdGVfb3B0cy50eXBlID0gU09DS19ER1JBTTtcXG4rXFx0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcXG4rXFxuK1xcdGtzID0gYnBmX2tzb2NrX2NyZWF0ZShcXHUwMDI2Y3JlYXRlX29wdHMsIHNpemVvZihjcmVhdGVfb3B0cyksIFxcdTAwMjZlcnIpO1xcbitcXHRpZiAoIWtzKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0YWRkcl9vcHRzLmZhbWlseSA9IEFGX0lORVQ7XFxuK1xcdGFkZHJfb3B0cy5wb3J0ID0gcmVtb3RlX3BvcnQ7XFxuK1xcdGFkZHJfb3B0cy5pcHY0X2FkZHIgPSBpcHY0X3JlbW90ZTtcXG4rXFxuK1xcdGVyciA9IGJwZl9rc29ja19jb25uZWN0KGtzLCBcXHUwMDI2YWRkcl9vcHRzLCBzaXplb2YoYWRkcl9vcHRzKSk7XFxuK1xcdGlmIChlcnIpIHtcXG4rXFx0XFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHR9XFxuK1xcbitcXHRlcnIgPSBrc29ja19jdHhfaW5zZXJ0KGtzKTtcXG4rXFx0aWYgKGVyciBcXHUwMDI2XFx1MDAyNiBlcnIgIT0gLUVFWElTVClcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKyNlbmRpZiAvKiBfS1NPQ0tfQ09NTU9OX0ggKi9cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3F1b3RhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjkxODU0ZWEzMzNjMTIxXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19xdW90YS5jXFxuQEAgLTAsMCArMSwxNjcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiYnBmX3RyYWNpbmdfbmV0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJrc29ja19jb21tb24uaFxcXCJcXG4rXFxuKyNkZWZpbmUgS1NPQ0tfUVVPVEFfTlNfU0xPVFMgM1xcbisjZGVmaW5lIEtTT0NLX1FVT1RBX05FVE5TIDJcXG4rI2RlZmluZSBLU09DS19RVU9UQV9TTE9UUyAoS1NPQ0tfUVVPVEFfTlNfU0xPVFMgKiBLU09DS19RVU9UQV9ORVROUylcXG4rXFxuK3N0cnVjdCBrc29ja19xdW90YV92YWx1ZSB7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4O1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdHlwZShrZXksIHUzMik7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IGtzb2NrX3F1b3RhX3ZhbHVlKTtcXG4rXFx0X191aW50KG1heF9lbnRyaWVzLCBLU09DS19RVU9UQV9TTE9UUyk7XFxuK30gcXVvdGFfbWFwIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XFxuK1xcdF9fdHlwZShrZXksIHU2NCk7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgdTgpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIEtTT0NLX1FVT1RBX1NMT1RTKTtcXG4rfSByZWxlYXNlX3dvcmtlcnMgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rdTMyIHF1b3RhX2NyZWF0ZWQ7XFxuK3UzMiBxdW90YV9yZWxlYXNlZDtcXG4rdTMyIHF1b3RhX3Nsb3Rfb2Zmc2V0O1xcbit1MzIgdGFyZ2V0X25ldG5zX2ludW1bS1NPQ0tfUVVPVEFfTkVUTlNdO1xcbit1NjQgcXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQ7XFxuK2ludCBxdW90YV9lcnI7XFxuK1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2xcXG4ra3NvY2tfcXVvdGFfY3JlYXRlX29uZSh1MzIgaSxcXG4rXFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKmNyZWF0ZV9vcHRzKVxcbit7XFxuK1xcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcXG4rXFx0c3RydWN0IGJwZl9rc29jayAqa3MsICpvbGQ7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXG4rXFx0aSArPSBxdW90YV9zbG90X29mZnNldDtcXG4rXFx0aWYgKGkgXFx1MDAzZT0gS1NPQ0tfUVVPVEFfU0xPVFMpIHtcXG4rXFx0XFx0cXVvdGFfZXJyID0gLUVSQU5HRTtcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdGJhcnJpZXJfdmFyKGVycik7XFxuK1xcdGtzID0gYnBmX2tzb2NrX2NyZWF0ZShjcmVhdGVfb3B0cywgc2l6ZW9mKCpjcmVhdGVfb3B0cyksIFxcdTAwMjZlcnIpO1xcbitcXHRpZiAoIWtzKSB7XFxuK1xcdFxcdHF1b3RhX2VyciA9IGVycjtcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdHYgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZxdW90YV9tYXAsIFxcdTAwMjZpKTtcXG4rXFx0aWYgKCF2KSB7XFxuK1xcdFxcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcXG4rXFx0XFx0cXVvdGFfZXJyID0gLUVOT0VOVDtcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdG9sZCA9IGJwZl9rcHRyX3hjaGcoXFx1MDAyNnYtXFx1MDAzZWN0eCwga3MpO1xcbitcXHRpZiAob2xkKVxcbitcXHRcXHRicGZfa3NvY2tfcmVsZWFzZShvbGQpO1xcbitcXHRxdW90YV9jcmVhdGVkKys7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKHUzMiBpKVxcbit7XFxuK1xcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcXG4rXFx0c3RydWN0IGJwZl9rc29jayAqa3M7XFxuK1xcbitcXHRpICs9IHF1b3RhX3Nsb3Rfb2Zmc2V0O1xcbitcXHRpZiAoaSBcXHUwMDNlPSBLU09DS19RVU9UQV9TTE9UUylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0diA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXFx1MDAyNnF1b3RhX21hcCwgXFx1MDAyNmkpO1xcbitcXHRpZiAoIXYpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGtzID0gYnBmX2twdHJfeGNoZyhcXHUwMDI2di1cXHUwMDNlY3R4LCBOVUxMKTtcXG4rXFx0aWYgKGtzKSB7XFxuK1xcdFxcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcXG4rXFx0XFx0cXVvdGFfcmVsZWFzZWQrKztcXG4rXFx0fVxcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQga3NvY2tfcXVvdGFfY3JlYXRlKHZvaWQgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XFxuK1xcbitcXHRjcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUO1xcbitcXHRjcmVhdGVfb3B0cy50eXBlID0gU09DS19ER1JBTTtcXG4rXFx0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcXG4rXFx0cXVvdGFfY3JlYXRlZCA9IDA7XFxuK1xcdHF1b3RhX2VyciA9IDA7XFxuK1xcbitcXHRpZiAoa3NvY2tfcXVvdGFfY3JlYXRlX29uZSgwLCBcXHUwMDI2Y3JlYXRlX29wdHMpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0aWYgKGtzb2NrX3F1b3RhX2NyZWF0ZV9vbmUoMSwgXFx1MDAyNmNyZWF0ZV9vcHRzKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdGtzb2NrX3F1b3RhX2NyZWF0ZV9vbmUoMiwgXFx1MDAyNmNyZWF0ZV9vcHRzKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQga3NvY2tfcXVvdGFfcmVsZWFzZSh2b2lkICpjdHgpXFxuK3tcXG4rXFx0cXVvdGFfcmVsZWFzZWQgPSAwO1xcbitcXHRrc29ja19xdW90YV9yZWxlYXNlX29uZSgwKTtcXG4rXFx0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMSk7XFxuK1xcdGtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKDIpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwiZmVudHJ5L2tzb2NrX3JlbGVhc2Vfd29ya19mblxcXCIpXFxuK2ludCBCUEZfUFJPRyhrc29ja19yZWxlYXNlX3dvcmtfZW50ZXIsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3QgcmN1X3dvcmsgKnJ3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByY3Vfd29yaywgd29yayk7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgKmtzID0gY29udGFpbmVyX29mKHJ3b3JrLCBzdHJ1Y3QgYnBmX2tzb2NrLCByd29yayk7XFxuK1xcdHU2NCBwaWRfdGdpZCA9IGJwZl9nZXRfY3VycmVudF9waWRfdGdpZCgpO1xcbitcXHRzdHJ1Y3QgbmV0ICpuZXQ7XFxuK1xcdHUzMiBpbnVtO1xcbitcXHR1OCB0cmFja2VkID0gMTtcXG4rXFxuK1xcdC8qIGtzb2NrX3JlbGVhc2Vfd29ya19mbigpIGZyZWVzIGtzIGJlZm9yZSB0aGUgZmV4aXQgcHJvZ3JhbSBydW5zLiAqL1xcbitcXHRuZXQgPSBCUEZfQ09SRV9SRUFEKGtzLCBzb2NrLCBzaywgX19za19jb21tb24uc2tjX25ldC5uZXQpO1xcbitcXHRpZiAoIW5ldClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpbnVtID0gQlBGX0NPUkVfUkVBRChuZXQsIG5zLmludW0pO1xcbitcXHRpZiAoaW51bSAhPSB0YXJnZXRfbmV0bnNfaW51bVswXSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgaW51bSAhPSB0YXJnZXRfbmV0bnNfaW51bVsxXSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRicGZfbWFwX3VwZGF0ZV9lbGVtKFxcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFxcdTAwMjZwaWRfdGdpZCwgXFx1MDAyNnRyYWNrZWQsIEJQRl9BTlkpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJmZXhpdC9rc29ja19yZWxlYXNlX3dvcmtfZm5cXFwiKVxcbitpbnQgQlBGX1BST0coa3NvY2tfcmVsZWFzZV93b3JrX2V4aXQsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHR1NjQgcGlkX3RnaWQgPSBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQoKTtcXG4rXFx0dTggKnRyYWNrZWQ7XFxuK1xcbitcXHR0cmFja2VkID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2cmVsZWFzZV93b3JrZXJzLCBcXHUwMDI2cGlkX3RnaWQpO1xcbitcXHRpZiAoIXRyYWNrZWQpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRicGZfbWFwX2RlbGV0ZV9lbGVtKFxcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFxcdTAwMjZwaWRfdGdpZCk7XFxuK1xcbitcXHQvKiBUaGUgd29ya2VyIGhhcyByZWxlYXNlZCB0aGUgc29ja2V0IGFuZCByZXR1cm5lZCBpdHMgcXVvdGEgY2hhcmdlLiAqL1xcbitcXHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcXHUwMDI2cXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQsIDEpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK2NoYXIgX19saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3JlY3Vyc2lvbi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3JlY3Vyc2lvbi5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJmNTIwMDk0M2UzNmFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3JlY3Vyc2lvbi5jXFxuQEAgLTAsMCArMSw2OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXFxuK1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfZW5kaWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZfdHJhY2luZ19uZXQuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImtzb2NrX2NvbW1vbi5oXFxcIlxcbitcXG4rdm9pZCBicGZfcmN1X3JlYWRfbG9jayh2b2lkKSBfX2tzeW07XFxuK3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07XFxuK1xcbitpbnQgdGFyZ2V0X3BpZDtcXG4raW50IHRyaWdnZXJfc2VuZDtcXG4rXFxuK3Vuc2lnbmVkIGludCByZWNfY291bnQ7XFxuK2ludCByZWNfa2Z1bmNfcmV0c1tdID0geyAtMSwgLTEgfTtcXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBrc29ja19zZXR1cCh2b2lkICpjdHgpXFxuK3tcXG4rXFx0cmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7XFxuK31cXG4rXFxuK1NFQyhcXFwibHNtLnMvc29ja2V0X3NlbmRtc2dcXFwiKVxcbitpbnQgQlBGX1BST0coa3NvY2tfc29ja2V0X3NlbmRtc2csIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG4rXFx0ICAgICBpbnQgc2l6ZSwgaW50IHJldClcXG4re1xcbitcXHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgKmtzLCAqdG1wO1xcbitcXHR1MzIgcGlkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCkgXFx1MDAzZVxcdTAwM2UgMzI7XFxuK1xcdGludCBrZnVuY19yZXQ7XFxuK1xcbitcXHRpZiAocmV0IHx8ICF0cmlnZ2VyX3NlbmQgfHwgcGlkICE9IHRhcmdldF9waWQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR2ID0ga3NvY2tfY3R4X3ZhbHVlX2xvb2t1cCgpO1xcbitcXHRpZiAoIXYpIHtcXG4rXFx0XFx0a2Z1bmNfcmV0ID0gLUVOT0VOVDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGtzID0gTlVMTDtcXG4rXFx0YnBmX3JjdV9yZWFkX2xvY2soKTtcXG4rXFx0dG1wID0gdi1cXHUwMDNlY3R4O1xcbitcXHRpZiAodG1wKVxcbitcXHRcXHRrcyA9IGJwZl9rc29ja19hY3F1aXJlKHRtcCk7XFxuK1xcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcXG4rXFxuK1xcdGlmICgha3MpIHtcXG4rXFx0XFx0a2Z1bmNfcmV0ID0gLUVOT0VOVDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGtmdW5jX3JldCA9IGJwZl9rc29ja19zZW5kKGtzLCBzZW5kX2RhdGEsIHNpemVvZihzZW5kX2RhdGEpKTtcXG4rXFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xcbitcXG4rb3V0OlxcbitcXHRyZWNfa2Z1bmNfcmV0c1tyZWNfY291bnQgXFx1MDAyNiAxXSA9IGtmdW5jX3JldDtcXG4rXFx0X19zeW5jX2ZldGNoX2FuZF9hZGQoXFx1MDAyNnJlY19jb3VudCwgMSk7XFxuK1xcbitcXHRpZiAoa2Z1bmNfcmV0ICE9IC1FQlVTWSlcXG4rXFx0XFx0dHJpZ2dlcl9zZW5kID0gMDtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK2NoYXIgX19saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3dxLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfd3EuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjE2YTE4NzNkMTMyZWRlXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jXFxuQEAgLTAsMCArMSw2MiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXFxuK1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJicGZfdHJhY2luZ19uZXQuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImVycm5vLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJrc29ja19jb21tb24uaFxcXCJcXG4rXFxuK3N0cnVjdCBrc29ja193cV92YWx1ZSB7XFxuK1xcdHN0cnVjdCBicGZfd3Egd29yaztcXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xcbitcXHRfX3R5cGUoa2V5LCB1MzIpO1xcbitcXHRfX3R5cGUodmFsdWUsIHN0cnVjdCBrc29ja193cV92YWx1ZSk7XFxuK30gd29ya19tYXAgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4raW50IGNyZWF0ZV9lcnI7XFxuK3UzMiBjYWxsYmFja19kb25lO1xcbitcXG4rc3RhdGljIGludCBrc29ja193cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIG9wdHMgPSB7XFxuK1xcdFxcdC5mYW1pbHkgPSBBRl9JTkVULFxcbitcXHRcXHQudHlwZSA9IFNPQ0tfREdSQU0sXFxuK1xcdFxcdC5wcm90b2NvbCA9IElQUFJPVE9fVURQLFxcbitcXHR9O1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcXG4rXFx0aW50IGVyciA9IDA7XFxuK1xcbitcXHRrcyA9IGJwZl9rc29ja19jcmVhdGUoXFx1MDAyNm9wdHMsIHNpemVvZihvcHRzKSwgXFx1MDAyNmVycik7XFxuK1xcdGlmIChrcylcXG4rXFx0XFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xcbitcXHRjcmVhdGVfZXJyID0gZXJyO1xcbitcXHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcXHUwMDI2Y2FsbGJhY2tfZG9uZSwgMSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQga3NvY2tfd3Ffc3RhcnQodm9pZCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBrc29ja193cV92YWx1ZSAqdmFsdWU7XFxuK1xcdHUzMiBrZXkgPSAwO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0dmFsdWUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZ3b3JrX21hcCwgXFx1MDAyNmtleSk7XFxuK1xcdGlmICghdmFsdWUpXFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRlcnIgPSBicGZfd3FfaW5pdChcXHUwMDI2dmFsdWUtXFx1MDAzZXdvcmssIFxcdTAwMjZ3b3JrX21hcCwgMCk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdGVyciA9IGJwZl93cV9zZXRfY2FsbGJhY2soXFx1MDAyNnZhbHVlLVxcdTAwM2V3b3JrLCBrc29ja193cV9jYWxsYmFjaywgMCk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdHJldHVybiBicGZfd3Ffc3RhcnQoXFx1MDAyNnZhbHVlLVxcdTAwM2V3b3JrLCAwKTtcXG4rfVxcbitcXG4rY2hhciBfX2xpY2Vuc2VbXSBTRUMoXFxcImxpY2Vuc2VcXFwiKSA9IFxcXCJHUExcXFwiO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQxMjo1ODo1NS45OTUyMzg2MDFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE1ODEzOTIzNDI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJJTkVUXCIsXG4gICAgXCJJUFY2XCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX2tzb2NrX2NyZWF0ZVwiLFxuICAgIFwiYnBmX2tzb2NrX2JpbmRcIixcbiAgICBcImJwZl9rc29ja19jb25uZWN0XCIsXG4gICAgXCJicGZfa3NvY2tfc2VuZFwiLFxuICAgIFwiYnBmX2tzb2NrX2FjcXVpcmVcIixcbiAgICBcImJwZl9rc29ja19yZWxlYXNlXCIsXG4gICAgXCJfX3N5c19jb25uZWN0X3NvY2tldFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGZlYXR1cmUgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBrZXJuZWwgc29ja2V0cyAoYGJwZl9rc29ja2ApLiBUaGlzIGFkZHMgbmV3IEJQRiBrZnVuY3MgKGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19zZW5kYCwgZXRjLikgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgY29yZSBuZXR3b3JraW5nIHN0YWNrLiBGdXp6aW5nIHRoZXNlIGtmdW5jcyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIG1lbW9yeSBzYWZldHkgYW5kIGNvcnJlY3QgYmVoYXZpb3Igb2YgdGhlIG5ldyBmZWF0dXJlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG5ldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0XG4gICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksXG4gICBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDZjMDQ0YTNiM2FlMmY4MWRhZWQwY2M5MGI5YzQwODQ5Y2Q2MzEzZWJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEp1bCA2IDEyOjU4OjU0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvc3lzY3RsL25ldC5yc3RcbmluZGV4IGU1ODZlMTdmYzdhNTgyLi44YmNkYzFiZmQ3MTEzOCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvc3lzY3RsL25ldC5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvc3lzY3RsL25ldC5yc3RcbkBAIC0xMjgsNiArMTI4LDE4IEBAIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlamVjdCB1bnByaXZpbGVnZWQgSklUIHJlcXVlc3RzIG9uY2UgaXQgaGFzXG4gYmVlbiBzdXJwYXNzZWQuIGJwZl9qaXRfbGltaXQgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwgbGltaXRcbiBpbiBieXRlcy5cbiBcbiticGZfa3NvY2tfbWF4XG4rLS0tLS0tLS0tLS0tLVxuK1xuK01heGltdW0gbnVtYmVyIG9mIEJQRiBrZXJuZWwgc29ja2V0cyB0aGF0IG1heSBleGlzdCBpbiBlYWNoIG5ldHdvcmsgbmFtZXNwYWNlLlxuK1RoaXMgaG9zdC13aWRlIHNldHRpbmcgaXMgZXhwb3NlZCBpbiB0aGUgaW5pdGlhbCBuZXR3b3JrIG5hbWVzcGFjZSBhbmQgYXBwbGllc1xuK3RoZSBzYW1lIGxpbWl0IGluZGVwZW5kZW50bHkgdG8gZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuIFNvY2tldHMgYXdhaXRpbmdcbitkZWZlcnJlZCBSQ1UgYW5kIHdvcmtxdWV1ZSBjbGVhbnVwIHJlbWFpbiBjb3VudGVkIHVudGlsIHRoZSB1bmRlcmx5aW5nIHNvY2tldFxuK2hhcyBiZWVuIHJlbGVhc2VkLiBBIHZhbHVlIG9mIDAgZGlzYWJsZXMgY3JlYXRpb24gb2YgQlBGIGtlcm5lbCBzb2NrZXRzIGluXG4rZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuXG4rXG4rRGVmYXVsdDogMTAyNFxuK1xuIGRldl93ZWlnaHRcbiAtLS0tLS0tLS0tXG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGZfa3NvY2suaCBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMDQ4NWI4ZWRkYzFmMjBcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmhcbkBAIC0wLDAgKzEsNTAgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuK1xuKyNpZm5kZWYgX0JQRl9LU09DS19IXG4rI2RlZmluZSBfQlBGX0tTT0NLX0hcbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4rXG4rI2RlZmluZSBCUEZfS1NPQ0tfTUFYX0RFRkFVTFQgMTAyNFxuK1xuK2V4dGVybiBpbnQgc3lzY3RsX2JwZl9rc29ja19tYXg7XG4rXG4rLyoqXG4rICogc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAtIEJQRiBrZXJuZWwgc29ja2V0IGNyZWF0aW9uIHBhcmFtZXRlcnNcbisgKiBAZmFtaWx5Olx0QWRkcmVzcyBmYW1pbHk6IEFGX0lORVQgb3IgQUZfSU5FVDYuXG4rICogQHR5cGU6XHRTb2NrZXQgdHlwZTogb25seSBTT0NLX0RHUkFNIHN1cHBvcnRlZCBmb3Igbm93LlxuKyAqIEBwcm90b2NvbDpcdFByb3RvY29sIG51bWJlciAoZS5nLiBJUFBST1RPX1VEUCksIG9yIDAgZm9yIHRoZSBkZWZhdWx0IHByb3RvY29sXG4rICpcdFx0b2YgdGhlIGdpdmVuIHR5cGUuXG4rICogQHJlc2VydmVkOlx0TXVzdCBiZSB6ZXJvLiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbisgKi9cbitzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIHtcbitcdF9fdTggZmFtaWx5O1xuK1x0X191OCB0eXBlO1xuK1x0X191OCBwcm90b2NvbDtcbitcdF9fdTggcmVzZXJ2ZWQ7XG4rfTtcbitcbisvKipcbisgKiBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAtIEJQRiBrZXJuZWwgc29ja2V0IGFkZHJlc3MgcGFyYW1ldGVyc1xuKyAqIEBmYW1pbHk6XHRBZGRyZXNzIGZhbWlseTogQUZfSU5FVCBvciBBRl9JTkVUNi5cbisgKiBAcmVzZXJ2ZWQ6XHRNdXN0IGJlIHplcm8uIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuKyAqIEBwb3J0Olx0UG9ydCBpbiBob3N0IGJ5dGUgb3JkZXIuXG4rICogQHNjb3BlX2lkOlx0SVB2NiBzY29wZSBJRCBmb3Igc2NvcGVkIEFGX0lORVQ2IGFkZHJlc3Nlcywgb3IgemVyby5cbisgKlx0XHRNdXN0IGJlIHplcm8gd2hlbiBmYW1pbHk9QUZfSU5FVC5cbisgKiBAaXB2NF9hZGRyOlx0SVB2NCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVULlxuKyAqIEBpcHY2X2FkZHI6XHRJUHY2IGFkZHJlc3MgKDE2IGJ5dGVzLCBuZXR3b3JrIGJ5dGUgb3JkZXIpLiBVc2VkIHdoZW4gZmFtaWx5PUFGX0lORVQ2LlxuKyAqL1xuK3N0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHtcbitcdF9fdTggZmFtaWx5O1xuK1x0X191OCByZXNlcnZlZDtcbitcdF9fdTE2IHBvcnQ7XG4rXHRfX3UzMiBzY29wZV9pZDtcbitcbitcdHVuaW9uIHtcbitcdFx0X19iZTMyIGlwdjRfYWRkcjtcbitcdFx0X191MzIgaXB2Nl9hZGRyWzRdOyAvKiBpbjZfYWRkcjsgbmV0d29yayBvcmRlciAqL1xuK1x0fTtcbit9O1xuK1xuKyNlbmRpZiAvKiBfQlBGX0tTT0NLX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuaW5kZXggMmE4ZDdiMTRmMWQxMTkuLjQ4ZjFlYjgxOTNkZWExIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuQEAgLTQ2MSw2ICs0NjEsOCBAQCBleHRlcm4gc3RydWN0IGZpbGUgKl9fc3lzX3NvY2tldF9maWxlKGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpO1xuIGV4dGVybiBpbnQgX19zeXNfYmluZChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVteWFkZHIsIGludCBhZGRybGVuKTtcbiBleHRlcm4gaW50IF9fc3lzX2JpbmRfc29ja2V0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxuIFx0XHRcdCAgICAgaW50IGFkZHJsZW4pO1xuK2V4dGVybiBpbnQgX19zeXNfY29ubmVjdF9zb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsXG4rXHRcdFx0XHRpbnQgYWRkcmxlbiwgaW50IGZsYWdzKTtcbiBleHRlcm4gaW50IF9fc3lzX2Nvbm5lY3RfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsXG4gXHRcdFx0ICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKTtcbiBleHRlcm4gaW50IF9fc3lzX2Nvbm5lY3QoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1c2VydmFkZHIsXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uNTJmNmE4OTU0NmU0NmEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTQ0MjQsNiArNDQyNCw5IEBAIEJURl9JRChzdHJ1Y3QsIHRhc2tfc3RydWN0KVxuICNpZmRlZiBDT05GSUdfQ1JZUFRPXG4gQlRGX0lEKHN0cnVjdCwgYnBmX2NyeXB0b19jdHgpXG4gI2VuZGlmXG4rI2lmZGVmIENPTkZJR19JTkVUXG4rQlRGX0lEKHN0cnVjdCwgYnBmX2tzb2NrKVxuKyNlbmRpZlxuIEJURl9TRVRfRU5EKHJjdV9wcm90ZWN0ZWRfdHlwZXMpXG4gXG4gc3RhdGljIGJvb2wgcmN1X3Byb3RlY3RlZF9vYmplY3QoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxuZGlmZiAtLWdpdCBhL25ldC9jb3JlL01ha2VmaWxlIGIvbmV0L2NvcmUvTWFrZWZpbGVcbmluZGV4IGIzZmRjYjRlMzU1ZmE2Li5hOTI5NWI3ODU5MDEwOSAxMDA2NDRcbi0tLSBhL25ldC9jb3JlL01ha2VmaWxlXG4rKysgYi9uZXQvY29yZS9NYWtlZmlsZVxuQEAgLTQ0LDYgKzQ0LDkgQEAgb2JqLSQoQ09ORklHX0ZBSUxPVkVSKSArPSBmYWlsb3Zlci5vXG4gb2JqLSQoQ09ORklHX05FVF9TT0NLX01TRykgKz0gc2ttc2cub1xuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gc29ja19tYXAub1xuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX3NrX3N0b3JhZ2Uub1xuK2lmbmVxICgkKENPTkZJR19JTkVUKSwpXG4rb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBicGZfa3NvY2sub1xuK2VuZGlmXG4gb2JqLSQoQ09ORklHX09GKVx0Kz0gb2ZfbmV0Lm9cbiBvYmotJChDT05GSUdfTkVUX1RFU1QpICs9IG5ldF90ZXN0Lm9cbiBvYmotJChDT05GSUdfTkVUX0RFVk1FTSkgKz0gZGV2bWVtLm9cbmRpZmYgLS1naXQgYS9uZXQvY29yZS9icGZfa3NvY2suYyBiL25ldC9jb3JlL2JwZl9rc29jay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjhiZGU3MzRiYzkxN2QzXG4tLS0gL2Rldi9udWxsXG4rKysgYi9uZXQvY29yZS9icGZfa3NvY2suY1xuQEAgLTAsMCArMSw1MTYgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmX2tzb2NrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NhY2hlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9oYXNoLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaW42LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9saXN0X2JsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9uZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JlZmNvdW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VwZGF0ZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NvY2tldC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdW5hbGlnbmVkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lwLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvaXB2Ni5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbmV0L25ldF9uYW1lc3BhY2UuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY25ldC9uZXRucy9nZW5lcmljLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvc29jay5oXHUwMDNlXG4rXG4rLyoqXG4rICogc3RydWN0IGJwZl9rc29jayAtIHJlZmNvdW50ZWQgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dFxuKyAqIEBzb2NrOlx0VGhlIHVuZGVybHlpbmcga2VybmVsIHNvY2tldC5cbisgKiBAdXNhZ2U6XHRSZWZlcmVuY2UgY291bnRlci5cbisgKiBAcndvcms6XHRSQ1Ugd29yayBmb3IgZGVmZXJyZWQgY2xlYW51cCAoc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXG4rICovXG4rc3RydWN0IGJwZl9rc29jayB7XG4rXHRzdHJ1Y3Qgc29ja2V0ICpzb2NrO1xuK1x0cmVmY291bnRfdCB1c2FnZTtcbitcdHN0cnVjdCByY3Vfd29yayByd29yaztcbit9O1xuK1xuK3N0cnVjdCBicGZfa3NvY2tfc2VuZF9ndWFyZCB7XG4rXHRzdHJ1Y3QgaGxpc3RfYmxfbm9kZSBub2RlO1xuK1x0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xuK307XG4rXG4rI2RlZmluZSBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFMgNlxuK1xuK3N0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQge1xuK1x0c3RydWN0IGhsaXN0X2JsX2hlYWQgaGVhZDtcbit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7XG4rXG4rc3RhdGljIHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXRcbitcdGJwZl9rc29ja19zZW5kX2J1Y2tldHNbMSBcdTAwM2NcdTAwM2MgQlBGX0tTT0NLX1NFTkRfR1VBUkRfSEFTSF9CSVRTXTtcbitcbitzdGF0aWMgc3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCAqXG4rYnBmX2tzb2NrX3NlbmRfYnVja2V0KGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbit7XG4rXHR1MzIgYnVja2V0X2lkeCA9IGhhc2hfcHRyKHRhc2ssIEJQRl9LU09DS19TRU5EX0dVQVJEX0hBU0hfQklUUyk7XG4rXG4rXHRyZXR1cm4gXHUwMDI2YnBmX2tzb2NrX3NlbmRfYnVja2V0c1tidWNrZXRfaWR4XTtcbit9XG4rXG4rc3RhdGljIGJvb2wgYnBmX2tzb2NrX3NlbmRfZW50ZXIoc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICpndWFyZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmVudHJ5O1xuK1x0c3RydWN0IGhsaXN0X2JsX25vZGUgKnBvcztcbitcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKmJ1Y2tldDtcbitcbitcdGJ1Y2tldCA9IGJwZl9rc29ja19zZW5kX2J1Y2tldChjdXJyZW50KTtcbitcdGhsaXN0X2JsX2xvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuK1x0aGxpc3RfYmxfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQsIG5vZGUpIHtcbitcdFx0aWYgKGVudHJ5LVx1MDAzZXRhc2sgPT0gY3VycmVudCkge1xuK1x0XHRcdGhsaXN0X2JsX3VubG9jayhcdTAwMjZidWNrZXQtXHUwMDNlaGVhZCk7XG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRndWFyZC1cdTAwM2V0YXNrID0gY3VycmVudDtcbitcdElOSVRfSExJU1RfQkxfTk9ERShcdTAwMjZndWFyZC1cdTAwM2Vub2RlKTtcbitcdGhsaXN0X2JsX2FkZF9oZWFkKFx1MDAyNmd1YXJkLVx1MDAzZW5vZGUsIFx1MDAyNmJ1Y2tldC1cdTAwM2VoZWFkKTtcbitcdGhsaXN0X2JsX3VubG9jayhcdTAwMjZidWNrZXQtXHUwMDNlaGVhZCk7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgYnBmX2tzb2NrX3NlbmRfZXhpdChzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmd1YXJkKVxuK3tcbitcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKmJ1Y2tldDtcbitcbitcdGJ1Y2tldCA9IGJwZl9rc29ja19zZW5kX2J1Y2tldChndWFyZC1cdTAwM2V0YXNrKTtcbitcdGhsaXN0X2JsX2xvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuK1x0aGxpc3RfYmxfZGVsKFx1MDAyNmd1YXJkLVx1MDAzZW5vZGUpO1xuK1x0aGxpc3RfYmxfdW5sb2NrKFx1MDAyNmJ1Y2tldC1cdTAwM2VoZWFkKTtcbit9XG4rXG4rc3RydWN0IGJwZl9rc29ja19uZXQge1xuK1x0YXRvbWljX3QgY291bnQ7XG4rfTtcbitcbitzdGF0aWMgdW5zaWduZWQgaW50IGJwZl9rc29ja19uZXRfaWQ7XG4raW50IHN5c2N0bF9icGZfa3NvY2tfbWF4IF9fcmVhZF9tb3N0bHkgPSBCUEZfS1NPQ0tfTUFYX0RFRkFVTFQ7XG4rXG4rc3RhdGljIHN0cnVjdCBicGZfa3NvY2tfbmV0ICpicGZfa3NvY2tfcGVybmV0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldClcbit7XG4rXHRyZXR1cm4gbmV0X2dlbmVyaWMobmV0LCBicGZfa3NvY2tfbmV0X2lkKTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBicGZfa3NvY2tfbmV0X29wcyA9IHtcbitcdC5pZCA9IFx1MDAyNmJwZl9rc29ja19uZXRfaWQsXG4rXHQuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnBmX2tzb2NrX25ldCksXG4rfTtcbitcbitzdGF0aWMgYm9vbCBicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2Uoc3RydWN0IG5ldCAqbmV0KVxuK3tcbitcdHN0cnVjdCBicGZfa3NvY2tfbmV0ICprbiA9IGJwZl9rc29ja19wZXJuZXQobmV0KTtcbitcdGludCBjb3VudCA9IGF0b21pY19yZWFkKFx1MDAyNmtuLVx1MDAzZWNvdW50KTtcbitcdGludCBtYXg7XG4rXG4rXHRkbyB7XG4rXHRcdG1heCA9IFJFQURfT05DRShzeXNjdGxfYnBmX2tzb2NrX21heCk7XG4rXHRcdGlmIChjb3VudCBcdTAwM2U9IG1heClcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9IHdoaWxlICghYXRvbWljX3RyeV9jbXB4Y2hnKFx1MDAyNmtuLVx1MDAzZWNvdW50LCBcdTAwMjZjb3VudCwgY291bnQgKyAxKSk7XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgYnBmX2tzb2NrX25ldF91bmNoYXJnZShzdHJ1Y3QgbmV0ICpuZXQpXG4re1xuK1x0c3RydWN0IGJwZl9rc29ja19uZXQgKmtuID0gYnBmX2tzb2NrX3Blcm5ldChuZXQpO1xuK1xuK1x0V0FSTl9PTl9PTkNFKGF0b21pY19kZWNfcmV0dXJuKFx1MDAyNmtuLVx1MDAzZWNvdW50KSBcdTAwM2MgMCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGtzb2NrX3JlbGVhc2Vfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4re1xuK1x0c3RydWN0IGJwZl9rc29jayAqa3MgPVxuK1x0XHRjb250YWluZXJfb2YodG9fcmN1X3dvcmsod29yayksIHN0cnVjdCBicGZfa3NvY2ssIHJ3b3JrKTtcbitcdHN0cnVjdCBuZXQgKm5ldCA9IGdldF9uZXQoc29ja19uZXQoa3MtXHUwMDNlc29jay1cdTAwM2VzaykpO1xuK1xuK1x0c29ja19yZWxlYXNlKGtzLVx1MDAzZXNvY2spO1xuK1x0YnBmX2tzb2NrX25ldF91bmNoYXJnZShuZXQpO1xuK1x0cHV0X25ldChuZXQpO1xuK1x0a2ZyZWUoa3MpO1xuK31cbitcbitzdGF0aWMgaW50IGJwZl9rc29ja19nZXRfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcbitcdFx0XHQgICAgICB1MzIgb3B0c19fc3osIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKVxuK3tcbitcdHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIG9wdHNfY29weTtcbitcbitcdGlmICghb3B0cyB8fCBvcHRzX19zeiAhPSBzaXplb2YoKm9wdHMpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdC8qIEtmdW5jIG1lbW9yeSBhcmd1bWVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIG5hdHVyYWxseSBhbGlnbmVkLiAqL1xuK1x0bWVtY3B5KFx1MDAyNm9wdHNfY29weSwgb3B0cywgc2l6ZW9mKG9wdHNfY29weSkpO1xuK1xuK1x0aWYgKG9wdHNfY29weS5yZXNlcnZlZClcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRzd2l0Y2ggKG9wdHNfY29weS5mYW1pbHkpIHtcbitcdGNhc2UgQUZfSU5FVDoge1xuK1x0XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7XG4rXG4rXHRcdGlmIChvcHRzX2NvcHkuc2NvcGVfaWQpXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRcdCphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4pe1xuK1x0XHRcdC5zaW5fZmFtaWx5ID0gQUZfSU5FVCxcbitcdFx0XHQuc2luX3BvcnQgPSBodG9ucyhvcHRzX2NvcHkucG9ydCksXG4rXHRcdFx0LnNpbl9hZGRyLnNfYWRkciA9IG9wdHNfY29weS5pcHY0X2FkZHIsXG4rXHRcdH07XG4rXHRcdHJldHVybiBzaXplb2YoKmFkZHI0KTtcbitcdH1cbisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNilcbitcdGNhc2UgQUZfSU5FVDY6IHtcbitcdFx0c3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7XG4rXG4rXHRcdCphZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KXtcbitcdFx0XHQuc2luNl9mYW1pbHkgPSBBRl9JTkVUNixcbitcdFx0XHQuc2luNl9wb3J0ID0gaHRvbnMob3B0c19jb3B5LnBvcnQpLFxuK1x0XHRcdC5zaW42X3Njb3BlX2lkID0gb3B0c19jb3B5LnNjb3BlX2lkLFxuK1x0XHR9O1xuK1x0XHRtZW1jcHkoXHUwMDI2YWRkcjYtXHUwMDNlc2luNl9hZGRyLCBvcHRzX2NvcHkuaXB2Nl9hZGRyLFxuK1x0XHQgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpO1xuK1x0XHRyZXR1cm4gc2l6ZW9mKCphZGRyNik7XG4rXHR9XG4rI2VuZGlmXG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gLUVBRk5PU1VQUE9SVDtcbitcdH1cbit9XG4rXG4rc3RhdGljIGJvb2wgYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCh2b2lkKVxuK3tcbitcdC8qXG4rXHQgKiBUYXNrIHdvcmsgY2FuIHJ1biBmcm9tIGRvX2V4aXQoKSBhZnRlciBleGl0X25zcHJveHlfbmFtZXNwYWNlcygpXG4rXHQgKiBjbGVhcmVkIGN1cnJlbnQtXHUwMDNlbnNwcm94eSwgd2hpbGUgY3VycmVudCBpcyBzdGlsbCBub3QgYSBrdGhyZWFkLlxuK1x0ICovXG4rXHRyZXR1cm4gIShjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9LVEhSRUFEKSBcdTAwMjZcdTAwMjYgY3VycmVudC1cdTAwM2Vuc3Byb3h5O1xuK31cbitcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4rXG4rLyoqXG4rICogYnBmX2tzb2NrX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgQlBGIGtlcm5lbCBzb2NrZXQuXG4rICpcbisgKiBBbGxvY2F0ZXMgYW5kIGNyZWF0ZXMgYSBrZXJuZWwgc29ja2V0LlxuKyAqIFRoZSBzb2NrZXQgaXMgY2hhcmdlZCBhZ2FpbnN0IHRoZSBhY3RpdmUgbmV0d29yayBuYW1lc3BhY2UncyBCUEYga2VybmVsXG4rICogc29ja2V0IHF1b3RhLlxuKyAqXG4rICogVGhlIHJldHVybmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3JcbisgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCAoc29ja19jcmVhdGUpLCBzbyBpdCBjYW4gb25seSBiZSB1c2VkXG4rICogaW4gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuXG4rICogSXQgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgQlBGIHdvcmtxdWV1ZSBjYWxsYmFjayBiZWNhdXNlIHRoYXQgY2FsbGJhY2tcbisgKiBkb2VzIG5vdCByZXRhaW4gdGhlIGludm9raW5nIHRhc2sncyBuYW1lc3BhY2Ugb3Igc2VjdXJpdHkgY29udGV4dC5cbisgKlxuKyAqIEBvcHRzOlx0UG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIHdpdGggc29ja2V0IHBhcmFtZXRlcnMuXG4rICogQG9wdHNfX3N6Olx0U2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuXG4rICogQGVycl9fdW5pbml0Olx0SW50ZWdlciB0byBzdG9yZSBlcnJvciBjb2RlIHdoZW4gTlVMTCBpcyByZXR1cm5lZC5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYnBmX2tzb2NrICpcbiticGZfa3NvY2tfY3JlYXRlKGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKm9wdHMsIHUzMiBvcHRzX19zeixcbitcdFx0IGludCAqZXJyX191bmluaXQpXG4re1xuK1x0c3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBvcHRzX2NvcHk7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcbitcdHN0cnVjdCBuZXQgKm5ldDtcbitcdGludCBlcnI7XG4rXG4rXHQvKlxuK1x0ICogc29ja19jcmVhdGUoKSBkZXJpdmVzIHRoZSBuZXR3b3JrIG5hbWVzcGFjZSwgY3JlZGVudGlhbHMsIGFuZCBjZ3JvdXBcbitcdCAqIGZyb20gY3VycmVudC4gS2VybmVsIHRocmVhZHMsIGluY2x1ZGluZyBCUEYgd29ya3F1ZXVlIGNhbGxiYWNrcywgZG9cbitcdCAqIG5vdCBjYXJyeSB0aGUgY29udGV4dCBvZiB0aGUgdGFzayB0aGF0IGludm9rZWQgdGhlIEJQRiBwcm9ncmFtLlxuK1x0ICovXG4rXHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSkge1xuK1x0XHRlcnIgPSAtRU9QTk9UU1VQUDtcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0fVxuK1xuK1x0aWYgKCFvcHRzIHx8IG9wdHNfX3N6ICE9IHNpemVvZihzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzKSkge1xuK1x0XHRlcnIgPSAtRUlOVkFMO1xuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHR9XG4rXG4rXHRvcHRzX2NvcHkgPSAoc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyl7XG4rXHRcdC5mYW1pbHkgPSBSRUFEX09OQ0Uob3B0cy1cdTAwM2VmYW1pbHkpLFxuK1x0XHQudHlwZSA9IFJFQURfT05DRShvcHRzLVx1MDAzZXR5cGUpLFxuK1x0XHQucHJvdG9jb2wgPSBSRUFEX09OQ0Uob3B0cy1cdTAwM2Vwcm90b2NvbCksXG4rXHRcdC5yZXNlcnZlZCA9IFJFQURfT05DRShvcHRzLVx1MDAzZXJlc2VydmVkKSxcbitcdH07XG4rXG4rXHRpZiAob3B0c19jb3B5LnJlc2VydmVkKSB7XG4rXHRcdGVyciA9IC1FSU5WQUw7XG4rXHRcdGdvdG8gZXJyX291dDtcbitcdH1cbitcbitcdGlmIChvcHRzX2NvcHkuZmFtaWx5ICE9IEFGX0lORVQgXHUwMDI2XHUwMDI2IG9wdHNfY29weS5mYW1pbHkgIT0gQUZfSU5FVDYpIHtcbitcdFx0ZXJyID0gLUVBRk5PU1VQUE9SVDtcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0fVxuK1xuK1x0aWYgKG9wdHNfY29weS50eXBlICE9IFNPQ0tfREdSQU0pIHtcbitcdFx0ZXJyID0gLUVQUk9UT05PU1VQUE9SVDtcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0fVxuK1xuK1x0aWYgKG9wdHNfY29weS5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCBcdTAwMjZcdTAwMjYgb3B0c19jb3B5LnByb3RvY29sICE9IDApIHtcbitcdFx0ZXJyID0gLUVQUk9UT05PU1VQUE9SVDtcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0fVxuK1xuK1x0a3MgPSBremFsbG9jX29iaigqa3MpO1xuK1x0aWYgKCFrcykge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHR9XG4rXG4rXHRuZXQgPSBjdXJyZW50LVx1MDAzZW5zcHJveHktXHUwMDNlbmV0X25zO1xuK1x0aWYgKCFicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2UobmV0KSkge1xuK1x0XHRlcnIgPSAtRU5PU1BDO1xuK1x0XHRnb3RvIGVycl9mcmVlO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIFVzZSB0aGUgbm9ybWFsIGN1cnJlbnQtdGFzayBzb2NrZXQgcGF0aCBzbyBMU00vY2dyb3VwIHBvbGljeSxcbitcdCAqIHNvY2tldCBsYWJlbHMsIGFuZCB0aGUgYWN0aXZlIG5ldG5zIHJlZmVyZW5jZSBtYXRjaCBhIHNvY2tldCgyKVxuK1x0ICogY3JlYXRlZCBieSB0aGUgQlBGIHByb2dyYW0ncyBjYWxsZXIuXG4rXHQgKi9cbitcdGVyciA9IHNvY2tfY3JlYXRlKG9wdHNfY29weS5mYW1pbHksIG9wdHNfY29weS50eXBlLCBvcHRzX2NvcHkucHJvdG9jb2wsXG4rXHRcdFx0ICBcdTAwMjZrcy1cdTAwM2Vzb2NrKTtcbitcdGlmIChlcnIpXG4rXHRcdGdvdG8gZXJyX3VuY2hhcmdlO1xuK1xuK1x0a3MtXHUwMDNlc29jay1cdTAwM2Vzay1cdTAwM2Vza19yY3ZidWYgPSBTT0NLX01JTl9SQ1ZCVUY7XG4rXHRrcy1cdTAwM2Vzb2NrLVx1MDAzZXNrLVx1MDAzZXNrX3VzZXJsb2NrcyB8PSBTT0NLX1JDVkJVRl9MT0NLO1xuK1xuK1x0cmVmY291bnRfc2V0KFx1MDAyNmtzLVx1MDAzZXVzYWdlLCAxKTtcbitcdHB1dF91bmFsaWduZWQoMCwgZXJyX191bmluaXQpO1xuK1x0cmV0dXJuIGtzO1xuK1xuK2Vycl91bmNoYXJnZTpcbitcdGJwZl9rc29ja19uZXRfdW5jaGFyZ2UobmV0KTtcbitlcnJfZnJlZTpcbitcdGtmcmVlKGtzKTtcbitlcnJfb3V0OlxuK1x0cHV0X3VuYWxpZ25lZChlcnIsIGVycl9fdW5pbml0KTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKipcbisgKiBicGZfa3NvY2tfYmluZCgpIC0gQmluZCBhIEJQRiBrZXJuZWwgc29ja2V0IHRvIGEgbG9jYWwgYWRkcmVzcy5cbisgKiBAa3M6XHRcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LlxuKyAqIEBvcHRzOlx0UG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyB3aXRoIGxvY2FsIGFkZHJlc3MuXG4rICogQG9wdHNfX3N6Olx0U2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuXG4rICpcbisgKiBCaW5kcyB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYWwgYWRkcmVzcyBhbmQgcG9ydC5cbisgKiBUaGlzIGlzIG9wdGlvbmFsOyBpZiBub3QgY2FsbGVkLCB0aGUga2VybmVsIHdpbGwgYXV0by1hc3NpZ24uXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCB3aGlsZSBiaW5kaW5nIHRoZSBzb2NrZXQsIHNvIGl0IGNhbiBvbmx5IGJlIHVzZWQgaW5cbisgKiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci5cbisgKi9cbitfX2JwZl9rZnVuYyBpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXG4rXHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzICpvcHRzLFxuK1x0XHRcdCAgICAgICB1MzIgb3B0c19fc3opXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9O1xuK1x0aW50IGFkZHJsZW47XG4rXG4rXHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSlcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuK1x0YWRkcmxlbiA9IGJwZl9rc29ja19nZXRfYWRkcihvcHRzLCBvcHRzX19zeiwgXHUwMDI2YWRkcik7XG4rXHRpZiAoYWRkcmxlbiBcdTAwM2MgMClcbitcdFx0cmV0dXJuIGFkZHJsZW47XG4rXG4rXHRyZXR1cm4gX19zeXNfYmluZF9zb2NrZXQoa3MtXHUwMDNlc29jaywgXHUwMDI2YWRkciwgYWRkcmxlbik7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9rc29ja19jb25uZWN0KCkgLSBDb25uZWN0IGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSByZW1vdGUgYWRkcmVzcy5cbisgKiBAa3M6XHRcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LlxuKyAqIEBvcHRzOlx0UG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyB3aXRoIHJlbW90ZSBhZGRyZXNzLlxuKyAqIEBvcHRzX19zejpcdFNpemUgb2YgdGhlIG9wdHMgc3RydWN0LlxuKyAqXG4rICogQ29ubmVjdHMgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBhZGRyZXNzIGFuZCBwb3J0LlxuKyAqXG4rICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgd2hpbGUgY29ubmVjdGluZyB0aGUgc29ja2V0LCBzbyBpdCBjYW4gb25seSBiZSB1c2VkXG4rICogaW4gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuXG4rICovXG4rX19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19jb25uZWN0KHN0cnVjdCBicGZfa3NvY2sgKmtzLFxuK1x0XHRcdFx0ICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcbitcdFx0XHRcdCAgdTMyIG9wdHNfX3N6KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHIgPSB7fTtcbitcdGludCBhZGRybGVuO1xuK1xuK1x0aWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdGFkZHJsZW4gPSBicGZfa3NvY2tfZ2V0X2FkZHIob3B0cywgb3B0c19fc3osIFx1MDAyNmFkZHIpO1xuK1x0aWYgKGFkZHJsZW4gXHUwMDNjIDApXG4rXHRcdHJldHVybiBhZGRybGVuO1xuK1xuK1x0cmV0dXJuIF9fc3lzX2Nvbm5lY3Rfc29ja2V0KGtzLVx1MDAzZXNvY2ssIFx1MDAyNmFkZHIsIGFkZHJsZW4sIDApO1xuK31cbitcbisvKipcbisgKiBicGZfa3NvY2tfYWNxdWlyZSgpIC0gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byBhIEJQRiBrZXJuZWwgc29ja2V0LlxuKyAqIEBrczpcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0IHRvIGFjcXVpcmUuIE11c3QgYmUgYVxuKyAqXHR0cnVzdGVkIHBvaW50ZXIgKGUuZy4gUkNVLXByb3RlY3RlZCBrcHRyIGZyb20gYSBtYXApLlxuKyAqXG4rICogVGhlIGFjcXVpcmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3JcbisgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2FjcXVpcmUoc3RydWN0IGJwZl9rc29jayAqa3MpXG4re1xuK1x0aWYgKCFyZWZjb3VudF9pbmNfbm90X3plcm8oXHUwMDI2a3MtXHUwMDNldXNhZ2UpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiBrcztcbit9XG4rXG4rLyoqXG4rICogYnBmX2tzb2NrX3JlbGVhc2UoKSAtIFJlbGVhc2UgYSBCUEYga2VybmVsIHNvY2tldC5cbisgKiBAa3M6XHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byByZWxlYXNlLlxuKyAqXG4rICogV2hlbiB0aGUgZmluYWwgcmVmZXJlbmNlIGlzIHJlbGVhc2VkLCB0aGUgc29ja2V0IGlzIGNsZWFuZWQgdXAgdmlhXG4rICogcXVldWVfcmN1X3dvcmsoKSAoc2luY2Ugc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXG4rICovXG4rX19icGZfa2Z1bmMgdm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcylcbit7XG4rXHRpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KFx1MDAyNmtzLVx1MDAzZXVzYWdlKSkge1xuK1x0XHRJTklUX1JDVV9XT1JLKFx1MDAyNmtzLVx1MDAzZXJ3b3JrLCBrc29ja19yZWxlYXNlX3dvcmtfZm4pO1xuK1x0XHRxdWV1ZV9yY3Vfd29yayhzeXN0ZW1fZGZsX3dxLCBcdTAwMjZrcy1cdTAwM2Vyd29yayk7XG4rXHR9XG4rfVxuK1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2tzb2NrX3JlbGVhc2VfZHRvcih2b2lkICprcylcbit7XG4rXHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4rfVxuK0NGSV9OT1NFQUwoYnBmX2tzb2NrX3JlbGVhc2VfZHRvcik7XG4rXG4rLyoqXG4rICogYnBmX2tzb2NrX3NlbmQoKSAtIFNlbmQgZGF0YSB0aHJvdWdoIGEgQlBGIGtlcm5lbCBzb2NrZXQuXG4rICogQGtzOlx0XHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dC4gTXVzdCBiZSBhbiBhY3F1aXJlZCByZWZlcmVuY2UuXG4rICogQGRhdGE6XHRQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHNlbmQuXG4rICogQGRhdGFfX3N6Olx0U2l6ZSBvZiB0aGUgZGF0YSB0byBzZW5kIChtYXggNjU1MzUgYnl0ZXMpLlxuKyAqXG4rICogU2VuZHMgZGF0YSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQsIGJlc3QtZWZmb3J0IGFuZCBub25ibG9ja2luZy4gVGhpcyBtYXkgc2xlZXBcbisgKiAoa2VybmVsX3NlbmRtc2cpLCBzbyBpdCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBzbGVlcGFibGUgQlBGIHByb2dyYW1zLlxuKyAqXG4rICogUmV0dXJuOiBOdW1iZXIgb2YgYnl0ZXMgc2VudCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci5cbisgKi9cbitfX2JwZl9rZnVuYyBpbnQgYnBmX2tzb2NrX3NlbmQoc3RydWN0IGJwZl9rc29jayAqa3MsIGNvbnN0IHZvaWQgKmRhdGEsXG4rXHRcdFx0ICAgICAgIHUzMiBkYXRhX19zeilcbit7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgZ3VhcmQ7XG4rXHRzdHJ1Y3QgbXNnaGRyIG1zZyA9IHtcbitcdFx0Lm1zZ19mbGFncyA9IE1TR19ET05UV0FJVCxcbitcdH07XG4rXHRzdHJ1Y3Qga3ZlYyBpb3YgPSB7XG4rXHRcdC5pb3ZfYmFzZSA9ICh2b2lkICopZGF0YSxcbitcdFx0Lmlvdl9sZW4gPSBkYXRhX19zeixcbitcdH07XG4rXHRpbnQgcmV0O1xuK1xuK1x0aWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdC8qIEVhcmx5IGNoZWNrIGZvciBVRFAuIEV4YWN0IGxpbWl0cyBlbmZvcmNlZCBieSBrZXJuZWxfc2VuZG1zZygpLiAqL1xuK1x0aWYgKGRhdGFfX3N6IFx1MDAzZSBJUF9NQVhfTVRVKVxuK1x0XHRyZXR1cm4gLUVNU0dTSVpFO1xuK1xuK1x0aWYgKCFicGZfa3NvY2tfc2VuZF9lbnRlcihcdTAwMjZndWFyZCkpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4rXHRyZXQgPSBrZXJuZWxfc2VuZG1zZyhrcy1cdTAwM2Vzb2NrLCBcdTAwMjZtc2csIFx1MDAyNmlvdiwgMSwgZGF0YV9fc3opO1xuK1x0YnBmX2tzb2NrX3NlbmRfZXhpdChcdTAwMjZndWFyZCk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuK1xuK0JURl9LRlVOQ1NfU1RBUlQoa3NvY2tfaW5pdF9rZnVuY19idGZfaWRzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfY3JlYXRlLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9TTEVFUEFCTEUpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19iaW5kLCBLRl9TTEVFUEFCTEUpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19jb25uZWN0LCBLRl9TTEVFUEFCTEUpXG4rQlRGX0tGVU5DU19FTkQoa3NvY2tfaW5pdF9rZnVuY19idGZfaWRzKVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBrc29ja19pbml0X2tmdW5jX3NldCA9IHtcbitcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuK1x0LnNldCA9IFx1MDAyNmtzb2NrX2luaXRfa2Z1bmNfYnRmX2lkcyxcbit9O1xuK1xuK0JURl9LRlVOQ1NfU1RBUlQoa3NvY2tfa2Z1bmNfYnRmX2lkcylcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX3JlbGVhc2UsIEtGX1JFTEVBU0UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19hY3F1aXJlLCBLRl9BQ1FVSVJFIHwgS0ZfUkNVIHwgS0ZfUkVUX05VTEwpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19zZW5kLCBLRl9TTEVFUEFCTEUpXG4rQlRGX0tGVU5DU19FTkQoa3NvY2tfa2Z1bmNfYnRmX2lkcylcbitcbitzdGF0aWMgaW50IGJwZl9rc29ja19rZnVuY19maWx0ZXIoY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1MzIga2Z1bmNfaWQpXG4re1xuK1x0aWYgKCFidGZfaWRfc2V0OF9jb250YWlucyhcdTAwMjZrc29ja19rZnVuY19idGZfaWRzLCBrZnVuY19pZCkgfHxcbitcdCAgICBwcm9nLVx1MDAzZXR5cGUgPT0gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHx8XG4rXHQgICAgcHJvZy1cdTAwM2V0eXBlID09IEJQRl9QUk9HX1RZUEVfTFNNKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiAtRUFDQ0VTO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQga3NvY2tfa2Z1bmNfc2V0ID0ge1xuK1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4rXHQuc2V0ID0gXHUwMDI2a3NvY2tfa2Z1bmNfYnRmX2lkcyxcbitcdC5maWx0ZXIgPSBicGZfa3NvY2tfa2Z1bmNfZmlsdGVyLFxuK307XG4rXG4rQlRGX0lEX0xJU1QoYnBmX2tzb2NrX2R0b3JfaWRzKVxuK0JURl9JRChzdHJ1Y3QsIGJwZl9rc29jaylcbitCVEZfSUQoZnVuYywgYnBmX2tzb2NrX3JlbGVhc2VfZHRvcilcbitcbitzdGF0aWMgaW50IF9faW5pdCBicGZfa3NvY2tfa2Z1bmNfaW5pdCh2b2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjb25zdCBzdHJ1Y3QgYnRmX2lkX2R0b3Jfa2Z1bmMgYnBmX2tzb2NrX2R0b3JzW10gPSB7XG4rXHRcdHtcbitcdFx0XHQuYnRmX2lkID0gYnBmX2tzb2NrX2R0b3JfaWRzWzBdLFxuK1x0XHRcdC5rZnVuY19idGZfaWQgPSBicGZfa3NvY2tfZHRvcl9pZHNbMV0sXG4rXHRcdH0sXG4rXHR9O1xuK1xuK1x0cmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cyhcdTAwMjZicGZfa3NvY2tfbmV0X29wcyk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXG4rXHRcdFx0XHRcdFx1MDAyNmtzb2NrX2luaXRfa2Z1bmNfc2V0KTtcbitcdGlmIChyZXQpIHtcbitcdFx0dW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKFx1MDAyNmJwZl9rc29ja19uZXRfb3BzKTtcbitcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZrc29ja19rZnVuY19zZXQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MU00sXG4rXHRcdFx0XHRcdCAgICAgICBcdTAwMjZrc29ja19rZnVuY19zZXQpO1xuK1x0cmV0dXJuIHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoYnBmX2tzb2NrX2R0b3JzLFxuK1x0XHRcdFx0XHRcdCBBUlJBWV9TSVpFKGJwZl9rc29ja19kdG9ycyksXG4rXHRcdFx0XHRcdFx0IFRISVNfTU9EVUxFKTtcbit9XG4rXG4rbGF0ZV9pbml0Y2FsbChicGZfa3NvY2tfa2Z1bmNfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMgYi9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuY1xuaW5kZXggYjUwODYxOGJmYzEyMzkuLmQyMjFhMTgwYzg3NzA1IDEwMDY0NFxuLS0tIGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmNcbisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jXG5AQCAtNyw2ICs3LDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWx0ZXIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZl9rc29jay5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3N5c2N0bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbkBAIC01MjUsNiArNTI2LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5ldF9jb3JlX3RhYmxlW10gPSB7XG4gXHRcdC5leHRyYTFcdFx0PSBTWVNDVExfTE9OR19PTkUsXG4gXHRcdC5leHRyYTJcdFx0PSBcdTAwMjZicGZfaml0X2xpbWl0X21heCxcbiBcdH0sXG4rI2VuZGlmXG4rI2lmIElTX0VOQUJMRUQoQ09ORklHX0JQRl9TWVNDQUxMKSBcdTAwMjZcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfSU5FVClcbitcdHtcbitcdFx0LnByb2NuYW1lXHQ9IFwiYnBmX2tzb2NrX21heFwiLFxuK1x0XHQuZGF0YVx0XHQ9IFx1MDAyNnN5c2N0bF9icGZfa3NvY2tfbWF4LFxuK1x0XHQubWF4bGVuXHRcdD0gc2l6ZW9mKGludCksXG4rXHRcdC5tb2RlXHRcdD0gMDY0NCxcbitcdFx0LnByb2NfaGFuZGxlclx0PSBwcm9jX2RvaW50dmVjX21pbm1heCxcbitcdFx0LmV4dHJhMVx0XHQ9IFNZU0NUTF9aRVJPLFxuK1x0fSxcbiAjZW5kaWZcbiBcdHtcbiBcdFx0LnByb2NuYW1lXHQ9IFwibmV0ZGV2X3RzdGFtcF9wcmVxdWV1ZVwiLFxuZGlmZiAtLWdpdCBhL25ldC9zb2NrZXQuYyBiL25ldC9zb2NrZXQuY1xuaW5kZXggNjNjNjlhMGZhNzRlMWUuLmM3NDI3ZGQ0ZGQ1MjNkIDEwMDY0NFxuLS0tIGEvbmV0L3NvY2tldC5jXG4rKysgYi9uZXQvc29ja2V0LmNcbkBAIC0yMTE1LDI3ICsyMTE1LDMxIEBAIFNZU0NBTExfREVGSU5FMyhhY2NlcHQsIGludCwgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgdXBlZXJfc29ja2FkZHIsXG4gICpcdGluY2x1ZGUgdGhlIC1FSU5QUk9HUkVTUyBzdGF0dXMgZm9yIHN1Y2ggc29ja2V0cy5cbiAgKi9cbiBcbitpbnQgX19zeXNfY29ubmVjdF9zb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHJlc3MsXG4rXHRcdFx0IGludCBhZGRybGVuLCBpbnQgZmxhZ3MpXG4re1xuK1x0aW50IGVycjtcbitcbitcdGVyciA9IHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTtcbitcdGlmIChlcnIpXG4rXHRcdHJldHVybiBlcnI7XG4rXG4rXHRyZXR1cm4gUkVBRF9PTkNFKHNvY2stXHUwMDNlb3BzKS1cdTAwM2Vjb25uZWN0KHNvY2ssXG4rXHRcdFx0XHQgICAgKHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICopYWRkcmVzcyxcbitcdFx0XHRcdCAgICBhZGRybGVuLCBmbGFncyk7XG4rfVxuK1xuIGludCBfX3N5c19jb25uZWN0X2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxuIFx0XHQgICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKVxuIHtcbiBcdHN0cnVjdCBzb2NrZXQgKnNvY2s7XG4tXHRpbnQgZXJyO1xuIFxuIFx0c29jayA9IHNvY2tfZnJvbV9maWxlKGZpbGUpO1xuLVx0aWYgKCFzb2NrKSB7XG4tXHRcdGVyciA9IC1FTk9UU09DSztcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4tXHRlcnIgPVxuLVx0ICAgIHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFzb2NrKVxuK1x0XHRyZXR1cm4gLUVOT1RTT0NLO1xuIFxuLVx0ZXJyID0gUkVBRF9PTkNFKHNvY2stXHUwMDNlb3BzKS1cdTAwM2Vjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqKWFkZHJlc3MsXG4tXHRcdFx0XHRcdCAgICBhZGRybGVuLCBzb2NrLVx1MDAzZWZpbGUtXHUwMDNlZl9mbGFncyB8IGZpbGVfZmxhZ3MpO1xuLW91dDpcbi1cdHJldHVybiBlcnI7XG4rXHRyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoc29jaywgYWRkcmVzcywgYWRkcmxlbixcbitcdFx0XHRcdCAgICBzb2NrLVx1MDAzZWZpbGUtXHUwMDNlZl9mbGFncyB8IGZpbGVfZmxhZ3MpO1xuIH1cbiBcbiBpbnQgX19zeXNfY29ubmVjdChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzZXJ2YWRkciwgaW50IGFkZHJsZW4pXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOGIxNGZkOThkNDEwZWRcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcbkBAIC0wLDAgKzEsMjM5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXJwYS9pbmV0LmhcdTAwM2VcbitcbisjaW5jbHVkZSBcInRlc3RfcHJvZ3MuaFwiXG4rI2luY2x1ZGUgXCJuZXR3b3JrX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJrc29ja19iYXNpYy5za2VsLmhcIlxuKyNpbmNsdWRlIFwia3NvY2tfcmVjdXJzaW9uLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBOU19URVNUIFwia3NvY2tfYmFzaWNfbnNcIlxuKyNkZWZpbmUgTlNfTFNNX1JFQ1VSU0lPTl9URVNUIFwia3NvY2tfbHNtX3JlY3Vyc2lvbl9uc1wiXG4rI2RlZmluZSBMT09QQkFDS19JUCBcIjEyNy4wLjAuMVwiXG4rI2RlZmluZSBSRUNWX1BPUlQgNzc3N1xuKyNkZWZpbmUgUkVDVl9USU1FT1VUX1NFQyA1XG4rXG4rc3RydWN0IGtzb2NrX3Rlc3RfZW52IHtcbitcdGNvbnN0IGNoYXIgKm5ldG5zO1xuK1x0Ym9vbCBuZXRuc19jcmVhdGVkO1xuK1x0c3RydWN0IG5zdG9rZW4gKm5zdG9rZW47XG4rXHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjtcbitcdGludCByZmQ7XG4rXHRjaGFyIGJ1ZlszMl07XG4rfTtcbitcbitzdGF0aWMgYm9vbCBrc29ja190ZXN0X2Vudl9zZXR1cChzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudiwgY29uc3QgY2hhciAqbmV0bnMpXG4re1xuK1x0c3RydWN0IHRpbWV2YWwgdHY7XG4rXHRpbnQgZXJyO1xuK1xuK1x0bWVtc2V0KGVudiwgMCwgc2l6ZW9mKCplbnYpKTtcbitcdGVudi1cdTAwM2VuZXRucyA9IG5ldG5zO1xuK1x0ZW52LVx1MDAzZXJmZCA9IC0xO1xuK1xuK1x0U1lTKGZhaWwsIFwiaXAgbmV0bnMgYWRkICVzXCIsIG5ldG5zKTtcbitcdGVudi1cdTAwM2VuZXRuc19jcmVhdGVkID0gdHJ1ZTtcbitcdFNZUyhmYWlsLCBcImlwIC1uZXQgJXMgbGluayBzZXQgbG8gdXBcIiwgbmV0bnMpO1xuK1xuK1x0ZW52LVx1MDAzZW5zdG9rZW4gPSBvcGVuX25ldG5zKG5ldG5zKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihlbnYtXHUwMDNlbnN0b2tlbiwgXCJvcGVuX25ldG5zXCIpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHRlbnYtXHUwMDNlcmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGVudi1cdTAwM2VyZmQsIFwicmVjZWl2ZXIgc29ja2V0XCIpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHRlbnYtXHUwMDNlYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDtcbitcdGVudi1cdTAwM2VhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihMT09QQkFDS19JUCk7XG4rXHRlbnYtXHUwMDNlYWRkci5zaW5fcG9ydCA9IGh0b25zKFJFQ1ZfUE9SVCk7XG4rXG4rXHRlcnIgPSBiaW5kKGVudi1cdTAwM2VyZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZlbnYtXHUwMDNlYWRkciwgc2l6ZW9mKGVudi1cdTAwM2VhZGRyKSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYmluZCByZWNlaXZlclwiKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0dHYudHZfc2VjID0gUkVDVl9USU1FT1VUX1NFQztcbitcdHR2LnR2X3VzZWMgPSAwO1xuK1x0ZXJyID0gc2V0c29ja29wdChlbnYtXHUwMDNlcmZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgXHUwMDI2dHYsIHNpemVvZih0dikpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldCByY3Z0aW1lb1wiKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0cmV0dXJuIHRydWU7XG4rXG4rZmFpbDpcbitcdGlmIChlbnYtXHUwMDNlcmZkIFx1MDAzZT0gMCkge1xuK1x0XHRjbG9zZShlbnYtXHUwMDNlcmZkKTtcbitcdFx0ZW52LVx1MDAzZXJmZCA9IC0xO1xuK1x0fVxuK1x0aWYgKGVudi1cdTAwM2Vuc3Rva2VuKSB7XG4rXHRcdGNsb3NlX25ldG5zKGVudi1cdTAwM2Vuc3Rva2VuKTtcbitcdFx0ZW52LVx1MDAzZW5zdG9rZW4gPSBOVUxMO1xuK1x0fVxuK1x0aWYgKGVudi1cdTAwM2VuZXRuc19jcmVhdGVkKSB7XG4rXHRcdFNZU19OT0ZBSUwoXCJpcCBuZXRucyBkZWwgJXMgXHUwMDNlL2Rldi9udWxsIDJcdTAwM2VcdTAwMjYxXCIsIG5ldG5zKTtcbitcdFx0ZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQgPSBmYWxzZTtcbitcdH1cbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIHZvaWQga3NvY2tfdGVzdF9lbnZfY2xlYW51cChzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudilcbit7XG4rXHRpZiAoZW52LVx1MDAzZXJmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGVudi1cdTAwM2VyZmQpO1xuK1x0aWYgKGVudi1cdTAwM2Vuc3Rva2VuKVxuK1x0XHRjbG9zZV9uZXRucyhlbnYtXHUwMDNlbnN0b2tlbik7XG4rXHRpZiAoZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQpIHtcbitcdFx0U1lTX05PRkFJTChcImlwIG5ldG5zIGRlbCAlcyBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjFcIiwgZW52LVx1MDAzZW5ldG5zKTtcbitcdFx0ZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQgPSBmYWxzZTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQga3NvY2tfYXNzZXJ0X3JlY3Yoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYsIGNvbnN0IGNoYXIgKmRhdGEsXG4rXHRcdFx0ICAgICAgc2l6ZV90IGRhdGFfc3opXG4re1xuK1x0c3NpemVfdCBuO1xuK1xuK1x0bWVtc2V0KGVudi1cdTAwM2VidWYsIDAsIHNpemVvZihlbnYtXHUwMDNlYnVmKSk7XG4rXHRuID0gcmVjdmZyb20oZW52LVx1MDAzZXJmZCwgZW52LVx1MDAzZWJ1Ziwgc2l6ZW9mKGVudi1cdTAwM2VidWYpLCAwLCBOVUxMLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX0VRKG4sIGRhdGFfc3osIFwicmVjdmZyb20gbGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRBU1NFUlRfTUVNRVEoZW52LVx1MDAzZWJ1ZiwgZGF0YSwgZGF0YV9zeiwgXCJwYXlsb2FkIG1hdGNoXCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBrc29ja19zZXR1cF9jdHgoc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nLCBfX2JlMzIgKmlwdjRfcmVtb3RlLFxuK1x0XHRcdCAgICBfX3UxNiAqcmVtb3RlX3BvcnQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuK1x0aW50IGVyciwgcGZkO1xuK1xuK1x0KmlwdjRfcmVtb3RlID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTtcbitcdCpyZW1vdGVfcG9ydCA9IFJFQ1ZfUE9SVDtcbitcbitcdHBmZCA9IGJwZl9wcm9ncmFtX19mZChwcm9nKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKHBmZCwgXCJrc29ja19zZXR1cCBmZFwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwZmQsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImtzb2NrX3NldHVwIHJ1blwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0aWYgKCFBU1NFUlRfT0sob3B0cy5yZXR2YWwsIFwia3NvY2tfc2V0dXAgcmV0dmFsXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rdm9pZCB0ZXN0X2tzb2NrX2Jhc2ljKHZvaWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuK1x0c3RydWN0IGtzb2NrX3Rlc3RfZW52IGVudjtcbitcdHN0cnVjdCBrc29ja19iYXNpYyAqc2tlbDtcbitcdGludCBlcnIsIHBmZDtcbitcbitcdHNrZWwgPSBrc29ja19iYXNpY19fb3BlbigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwic2tlbCBvcGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRlcnIgPSBrc29ja19iYXNpY19fbG9hZChza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJza2VsIGxvYWRcIikpIHtcbitcdFx0a3NvY2tfYmFzaWNfX2Rlc3Ryb3koc2tlbCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdGlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoXHUwMDI2ZW52LCBOU19URVNUKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogU3RlcCAxOiBSdW4gdGhlIHNldHVwIFNZU0NBTEwgcHJvZyB0byBjcmVhdGUga3NvY2sgKi9cbitcdGlmICgha3NvY2tfc2V0dXBfY3R4KHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfc2V0dXAsXG4rXHRcdFx0ICAgICBcdTAwMjZza2VsLVx1MDAzZWJzcy1cdTAwM2VpcHY0X3JlbW90ZSxcbitcdFx0XHQgICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlbW90ZV9wb3J0KSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogU3RlcCAyOiBSdW4gdGhlIHNlbmQgU1lTQ0FMTCBwcm9nICovXG4rXHRwZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5rc29ja19zZW5kKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKHBmZCwgXCJrc29ja19zZW5kIGZkXCIpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHBmZCwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwia3NvY2tfc2VuZCBydW5cIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcdGlmICghQVNTRVJUX0VRKG9wdHMucmV0dmFsLFxuK1x0XHQgICAgICAgc2l6ZW9mKHNrZWwtXHUwMDNlZGF0YS1cdTAwM2VzZW5kX2RhdGEpLCBcInNlbmRtc2cgYnl0ZXNcIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIFN0ZXAgMzogUmVjZWl2ZSBhbmQgdmVyaWZ5IHRoZSBkYXRhICovXG4rXHRrc29ja19hc3NlcnRfcmVjdihcdTAwMjZlbnYsIHNrZWwtXHUwMDNlZGF0YS1cdTAwM2VzZW5kX2RhdGEsXG4rXHRcdFx0ICBzaXplb2Yoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSkpO1xuK1xuK2ZhaWw6XG4rXHRrc29ja190ZXN0X2Vudl9jbGVhbnVwKFx1MDAyNmVudik7XG4rXHRrc29ja19iYXNpY19fZGVzdHJveShza2VsKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2tzb2NrX2xzbV9yZWN1cnNpb24odm9pZClcbit7XG4rXHRzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgZW52O1xuK1x0c3RydWN0IGtzb2NrX3JlY3Vyc2lvbiAqc2tlbDtcbitcdGNoYXIgdHJpZ2dlciA9ICd4JztcbitcdGludCB0ZmQgPSAtMTtcbitcdGludCBlcnI7XG4rXHRzc2l6ZV90IG47XG4rXG4rXHRza2VsID0ga3NvY2tfcmVjdXJzaW9uX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJza2VsIG9wZW5cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IGtzb2NrX3JlY3Vyc2lvbl9fbG9hZChza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJza2VsIGxvYWRcIikpIHtcbitcdFx0a3NvY2tfcmVjdXJzaW9uX19kZXN0cm95KHNrZWwpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRpZiAoIWtzb2NrX3Rlc3RfZW52X3NldHVwKFx1MDAyNmVudiwgTlNfTFNNX1JFQ1VSU0lPTl9URVNUKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogU3RlcCAxOiBSdW4gdGhlIHNldHVwIFNZU0NBTEwgcHJvZyB0byBjcmVhdGUgdGhlIGtzb2NrICovXG4rXHRpZiAoIWtzb2NrX3NldHVwX2N0eChza2VsLVx1MDAzZXByb2dzLmtzb2NrX3NldHVwLFxuK1x0XHRcdCAgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNlaXB2NF9yZW1vdGUsXG4rXHRcdFx0ICAgICBcdTAwMjZza2VsLVx1MDAzZWJzcy1cdTAwM2VyZW1vdGVfcG9ydCkpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIFN0ZXAgMjogQXR0YWNoIExTTSBwcm9nIGFuZCB0cmlnZ2VyIHNvY2tldF9zZW5kbXNnIGZyb20gdXNlcnNwYWNlICovXG4rXHRza2VsLVx1MDAzZWxpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnID1cbitcdFx0YnBmX3Byb2dyYW1fX2F0dGFjaF9sc20oc2tlbC1cdTAwM2Vwcm9ncy5rc29ja19zb2NrZXRfc2VuZG1zZyk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VsaW5rcy5rc29ja19zb2NrZXRfc2VuZG1zZyxcbitcdFx0XHQgICBcImF0dGFjaCBzb2NrZXRfc2VuZG1zZyBsc21cIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdHRmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRCh0ZmQsIFwidHJpZ2dlciBzb2NrZXRcIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9waWQgPSBnZXRwaWQoKTtcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRyaWdnZXJfc2VuZCA9IDE7XG4rXHRuID0gc2VuZHRvKHRmZCwgXHUwMDI2dHJpZ2dlciwgc2l6ZW9mKHRyaWdnZXIpLCAwLFxuK1x0XHQgICAoc3RydWN0IHNvY2thZGRyICopXHUwMDI2ZW52LmFkZHIsIHNpemVvZihlbnYuYWRkcikpO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X3BpZCA9IDA7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0cmlnZ2VyX3NlbmQgPSAwO1xuK1x0aWYgKCFBU1NFUlRfRVEobiwgc2l6ZW9mKHRyaWdnZXIpLCBcInRyaWdnZXIgc2VuZHRvXCIpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBTdGVwIDM6IFRoZSBuZXN0ZWQgYnBmX2tzb2NrX3NlbmQoKSBtdXN0IGhpdCB0aGUgcmVjdXJzaW9uIGd1YXJkICovXG4rXHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNfY291bnQsIDIsXG4rXHRcdCAgICAgICBcInNvY2tldF9zZW5kbXNnIHJlY3Vyc2lvbiBjb3VudFwiKSlcbitcdFx0Z290byBmYWlsO1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXJlY19rZnVuY19yZXRzWzBdLCAtRUJVU1ksXG4rXHRcdCAgICAgICBcInJlY3Vyc2l2ZSBzZW5kIHN0YXR1c1wiKSlcbitcdFx0Z290byBmYWlsO1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXJlY19rZnVuY19yZXRzWzFdLFxuK1x0XHQgICAgICAgc2l6ZW9mKHNrZWwtXHUwMDNlZGF0YS1cdTAwM2VzZW5kX2RhdGEpLCBcIm91dGVyIHNlbmQgYnl0ZXNcIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdGtzb2NrX2Fzc2VydF9yZWN2KFx1MDAyNmVudiwgc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSxcbitcdFx0XHQgIHNpemVvZihza2VsLVx1MDAzZWRhdGEtXHUwMDNlc2VuZF9kYXRhKSk7XG4rXG4rZmFpbDpcbitcdGlmICh0ZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZSh0ZmQpO1xuK1x0a3NvY2tfdGVzdF9lbnZfY2xlYW51cChcdTAwMjZlbnYpO1xuK1x0a3NvY2tfcmVjdXJzaW9uX19kZXN0cm95KHNrZWwpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja19xdW90YS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5jODZkOWIwYTk1MTNlOFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuY1xuQEAgLTAsMCArMSwxMzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJ0ZXN0X3Byb2dzLmhcIlxuKyNpbmNsdWRlIFwibmV0d29ya19oZWxwZXJzLmhcIlxuKyNpbmNsdWRlIFwic3lzY3RsX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJrc29ja19xdW90YS5za2VsLmhcIlxuK1xuKyNkZWZpbmUgTlNfTkVUX1FVT1RBX1RFU1QxIFwia3NvY2tfbmV0X3F1b3RhX25zMVwiXG4rI2RlZmluZSBOU19ORVRfUVVPVEFfVEVTVDIgXCJrc29ja19uZXRfcXVvdGFfbnMyXCJcbisjZGVmaW5lIEtTT0NLX01BWF9TWVNDVEwgXCIvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2tzb2NrX21heFwiXG4rI2RlZmluZSBLU09DS19RVU9UQV9OU19TTE9UUyAzXG4rI2RlZmluZSBLU09DS19RVU9UQV9OUzFfT0ZGU0VUIDBcbisjZGVmaW5lIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQgS1NPQ0tfUVVPVEFfTlNfU0xPVFNcbitcbitzdGF0aWMgaW50IGtzb2NrX3J1bl9wcm9nKHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZylcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQocHJvZyksIFx1MDAyNm9wdHMpO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcdHJldHVybiBvcHRzLnJldHZhbDtcbit9XG4rXG4rc3RhdGljIF9fdTY0IGtzb2NrX3F1b3RhX3JlbGVhc2VfY29tcGxldGVkKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbClcbit7XG4rXHRyZXR1cm4gX19hdG9taWNfbG9hZF9uKFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3JlbGVhc2VfY29tcGxldGVkLFxuK1x0XHRcdCAgICAgICBfX0FUT01JQ19BQ1FVSVJFKTtcbit9XG4rXG4rc3RhdGljIGludCBrc29ja19yZWxlYXNlX3F1b3RhX3Nsb3RzKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCwgaW50IHNsb3Rfb2Zmc2V0KVxuK3tcbitcdF9fdTY0IGNvbXBsZXRlZDtcbitcdGludCBlcnI7XG4rXG4rXHRjb21wbGV0ZWQgPSBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKTtcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3Nsb3Rfb2Zmc2V0ID0gc2xvdF9vZmZzZXQ7XG4rXHRlcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLVx1MDAzZXByb2dzLmtzb2NrX3F1b3RhX3JlbGVhc2UpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImtzb2NrX3F1b3RhX3JlbGVhc2VcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHdoaWxlIChrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKSAtIGNvbXBsZXRlZCBcdTAwM2NcbitcdCAgICAgICBza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9yZWxlYXNlZClcbitcdFx0dXNsZWVwKDEwMDApO1xuK1xuK1x0cmV0dXJuIHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3JlbGVhc2VkO1xuK31cbitcbitzdGF0aWMgYm9vbCBrc29ja19leHBlY3RfcXVvdGEoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgc2xvdF9vZmZzZXQsXG4rXHRcdFx0ICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpXG4re1xuK1x0aW50IGVycjtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3Nsb3Rfb2Zmc2V0ID0gc2xvdF9vZmZzZXQ7XG4rXHRlcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLVx1MDAzZXByb2dzLmtzb2NrX3F1b3RhX2NyZWF0ZSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIG5hbWUpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9jcmVhdGVkLCAyLCBuYW1lKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0cmV0dXJuIEFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9lcnIsIC1FTk9TUEMsIG5hbWUpO1xuK31cbitcbitzdGF0aWMgYm9vbCByZWNvcmRfY3VycmVudF9ucyhzdHJ1Y3Qga3NvY2tfcXVvdGEgKnNrZWwsIGludCB0YXJnZXQpXG4re1xuK1x0c3RydWN0IHN0YXQgc3Q7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gc3RhdChcIi9wcm9jL3NlbGYvbnMvbmV0XCIsIFx1MDAyNnN0KTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzdGF0IG5ldG5zXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0YXJnZXRfbmV0bnNfaW51bVt0YXJnZXRdID0gKF9fdTMyKXN0LnN0X2lubztcbitcdHJldHVybiB0cnVlO1xuK31cbitcbit2b2lkIHNlcmlhbF90ZXN0X2tzb2NrX25ldF9xdW90YSh2b2lkKVxuK3tcbitcdGNoYXIgb2xkX21heFsxNl0gPSB7fTtcbitcdHN0cnVjdCBuZXRuc19vYmogKm5ldG5zMSA9IE5VTEwsICpuZXRuczIgPSBOVUxMO1xuK1x0c3RydWN0IGtzb2NrX3F1b3RhICpza2VsO1xuK1x0aW50IHJlbGVhc2VkO1xuK1xuK1x0c2tlbCA9IGtzb2NrX3F1b3RhX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJrc29jayBxdW90YSBza2VsZXRvblwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZW50ZXIgPVxuK1x0XHRicGZfcHJvZ3JhbV9fYXR0YWNoX3RyYWNlKHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLVx1MDAzZWxpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlcixcbitcdFx0XHQgICBcImF0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZW50cnlcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0c2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCA9XG4rXHRcdGJwZl9wcm9ncmFtX19hdHRhY2hfdHJhY2Uoc2tlbC1cdTAwM2Vwcm9ncy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCxcbitcdFx0XHQgICBcImF0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZXhpdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoc3lzY3RsX3NldF9vcl9mYWlsKEtTT0NLX01BWF9TWVNDVEwsIG9sZF9tYXgsIFwiMlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRuZXRuczEgPSBuZXRuc19uZXcoTlNfTkVUX1FVT1RBX1RFU1QxLCB0cnVlKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihuZXRuczEsIFwiY3JlYXRlIGZpcnN0IG5ldG5zXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghcmVjb3JkX2N1cnJlbnRfbnMoc2tlbCwgMCkpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKCFrc29ja19leHBlY3RfcXVvdGEoc2tlbCwgS1NPQ0tfUVVPVEFfTlMxX09GRlNFVCxcbitcdFx0XHRcdFwiZmlyc3QgbmV0bnMgcXVvdGFcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LyogVGhlIGhvc3Qtd2lkZSBzZXR0aW5nIGdyYW50cyB0aGUgZnVsbCBhbGxvd2FuY2UgdG8gZWFjaCBuZXRucy4gKi9cbitcdG5ldG5zMiA9IG5ldG5zX25ldyhOU19ORVRfUVVPVEFfVEVTVDIsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMiwgXCJjcmVhdGUgc2Vjb25kIG5ldG5zXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghcmVjb3JkX2N1cnJlbnRfbnMoc2tlbCwgMSkpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKCFrc29ja19leHBlY3RfcXVvdGEoc2tlbCwgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCxcbitcdFx0XHRcdFwic2Vjb25kIG5ldG5zIHF1b3RhXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHJlbGVhc2VkID0ga3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTtcbitcdGlmICghQVNTRVJUX0VRKHJlbGVhc2VkLCAyLCBcInNlY29uZCBuZXRucyBxdW90YSByZWxlYXNlZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBCb3RoIHJlbGVhc2VkIHNsb3RzIG11c3QgYmVjb21lIGF2YWlsYWJsZSBhZ2Fpbi4gKi9cbitcdGtzb2NrX2V4cGVjdF9xdW90YShza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VULCBcInJlY292ZXJlZCBxdW90YVwiKTtcbitcbitvdXQ6XG4rXHRrc29ja19yZWxlYXNlX3F1b3RhX3Nsb3RzKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQpO1xuK1x0a3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VUKTtcbitcdG5ldG5zX2ZyZWUobmV0bnMyKTtcbitcdG5ldG5zX2ZyZWUobmV0bnMxKTtcbitcdGlmIChvbGRfbWF4WzBdKVxuK1x0XHRzeXNjdGxfc2V0X29yX2ZhaWwoS1NPQ0tfTUFYX1NZU0NUTCwgTlVMTCwgb2xkX21heCk7XG4rXHRrc29ja19xdW90YV9fZGVzdHJveShza2VsKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3dxLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTg0YjEzNGYzODIzNzBcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3dxLmNcbkBAIC0wLDAgKzEsMzQgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbitcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwidGVzdF9wcm9ncy5oXCJcbisjaW5jbHVkZSBcImtzb2NrX3dxLnNrZWwuaFwiXG4rXG4rdm9pZCB0ZXN0X2tzb2NrX3dxKHZvaWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuK1x0c3RydWN0IGtzb2NrX3dxICpza2VsO1xuK1x0aW50IGVycjtcbitcbitcdHNrZWwgPSBrc29ja193cV9fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwia3NvY2tfd3Egb3BlbiBhbmQgbG9hZFwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5rc29ja193cV9zdGFydCksXG4rXHRcdFx0XHQgICAgIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1biBrc29ja193cV9zdGFydFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9PSyhvcHRzLnJldHZhbCwgXCJrc29ja193cV9zdGFydCByZXR2YWxcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0d2hpbGUgKCFfX2F0b21pY19sb2FkX24oXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNlY2FsbGJhY2tfZG9uZSwgX19BVE9NSUNfQUNRVUlSRSkpXG4rXHRcdHVzbGVlcCgxMDAwKTtcbitcbitcdEFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjcmVhdGVfZXJyLCAtRU9QTk9UU1VQUCxcbitcdFx0ICBcIndvcmtxdWV1ZSBjcmVhdGUgcmVqZWN0ZWRcIik7XG4rXG4rb3V0OlxuK1x0a3NvY2tfd3FfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2Jhc2ljLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTg5YjBmYzE1NzcwMTFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jXG5AQCAtMCwwICsxLDM3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2VuZGlhbi5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfdHJhY2luZ19uZXQuaFwiXG4rI2luY2x1ZGUgXCJrc29ja19jb21tb24uaFwiXG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBrc29ja19zZXR1cCh2b2lkICpjdHgpXG4re1xuK1x0cmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7XG4rfVxuK1xuK1NFQyhcInN5c2NhbGxcIilcbitpbnQga3NvY2tfc2VuZCh2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlICp2O1xuK1x0c3RydWN0IGJwZl9rc29jayAqa3M7XG4rXHRpbnQgc2VuZCA9IC0xO1xuK1xuK1x0diA9IGtzb2NrX2N0eF92YWx1ZV9sb29rdXAoKTtcbitcdGlmICghdilcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXG4rXHRrcyA9IGJwZl9rcHRyX3hjaGcoXHUwMDI2di1cdTAwM2VjdHgsIE5VTEwpO1xuK1x0aWYgKCFrcylcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXG4rXHRzZW5kID0gYnBmX2tzb2NrX3NlbmQoa3MsIHNlbmRfZGF0YSwgc2l6ZW9mKHNlbmRfZGF0YSkpO1xuK1x0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuK1x0cmV0dXJuIHNlbmQ7XG4rfVxuK1xuK2NoYXIgX19saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2NvbW1vbi5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2NvbW1vbi5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdjZjY0MzE5YjkwMTQ1XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmhcbkBAIC0wLDAgKzEsMTEwIEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2lmbmRlZiBfS1NPQ0tfQ09NTU9OX0hcbisjZGVmaW5lIF9LU09DS19DT01NT05fSFxuK1xuKyNpbmNsdWRlIFwiZXJybm8uaFwiXG4rI2luY2x1ZGUgXHUwMDNjc3RkYm9vbC5oXHUwMDNlXG4rXG4rI2RlZmluZSBTT0NLX1NUUkVBTVx0MVxuKyNkZWZpbmUgU09DS19ER1JBTVx0MlxuKyNkZWZpbmUgSVBQUk9UT19UQ1BcdDZcbisjZGVmaW5lIElQUFJPVE9fVURQXHQxN1xuK1xuK3N0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19jcmVhdGUoY29uc3Qgc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAqb3B0cyxcbitcdFx0XHRcdCAgIHUzMiBvcHRzX19zeiwgaW50ICplcnJfX3VuaW5pdCkgX19rc3ltO1xuK2ludCBicGZfa3NvY2tfYmluZChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcbitcdFx0ICAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsIHUzMiBvcHRzX19zeikgX19rc3ltO1xuK2ludCBicGZfa3NvY2tfY29ubmVjdChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcbitcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsIHUzMiBvcHRzX19zeikgX19rc3ltO1xuK3N0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19hY3F1aXJlKHN0cnVjdCBicGZfa3NvY2sgKmtzKSBfX2tzeW07XG4rdm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcykgX19rc3ltO1xuK2ludCBicGZfa3NvY2tfc2VuZChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcbitcdFx0ICAgY29uc3Qgdm9pZCAqZGF0YSwgdTMyIGRhdGFfX3N6KSBfX2tzeW07XG4rXG4rc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlIHtcbitcdHN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4O1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X190eXBlKGtleSwgaW50KTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlKTtcbitcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4rfSBfX2tzb2NrX2N0eF9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKmtzb2NrX2N0eF92YWx1ZV9sb29rdXAodm9pZClcbit7XG4rXHR1MzIga2V5ID0gMDtcbitcbitcdHJldHVybiBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNl9fa3NvY2tfY3R4X21hcCwgXHUwMDI2a2V5KTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQga3NvY2tfY3R4X2luc2VydChzdHJ1Y3QgYnBmX2tzb2NrICpjdHgpXG4re1xuK1x0c3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlIGxvY2FsLCAqdjtcbitcdHN0cnVjdCBicGZfa3NvY2sgKm9sZDtcbitcdHUzMiBrZXkgPSAwO1xuK1x0aW50IGVycjtcbitcbitcdGxvY2FsLmN0eCA9IE5VTEw7XG4rXHRlcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKFx1MDAyNl9fa3NvY2tfY3R4X21hcCwgXHUwMDI2a2V5LCBcdTAwMjZsb2NhbCwgMCk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdGJwZl9rc29ja19yZWxlYXNlKGN0eCk7XG4rXHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHR2ID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZfX2tzb2NrX2N0eF9tYXAsIFx1MDAyNmtleSk7XG4rXHRpZiAoIXYpIHtcbitcdFx0YnBmX2tzb2NrX3JlbGVhc2UoY3R4KTtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4rXG4rXHRvbGQgPSBicGZfa3B0cl94Y2hnKFx1MDAyNnYtXHUwMDNlY3R4LCBjdHgpO1xuK1x0aWYgKG9sZCkge1xuK1x0XHRicGZfa3NvY2tfcmVsZWFzZShvbGQpO1xuK1x0XHRyZXR1cm4gLUVFWElTVDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKiBHbG9iYWxzIGZvciBwYXNzaW5nIGNvbmZpZyBmcm9tIHVzZXJzcGFjZSAqL1xuK19fYmUzMiBpcHY0X3JlbW90ZTtcbitfX3UxNiByZW1vdGVfcG9ydDtcbitcbitjaGFyIHNlbmRfZGF0YVszMl0gPSBcImhlbGxvIGZyb20gYnBmIGtzb2NrXCI7XG4rXG4rc3RhdGljIGlubGluZSBpbnQgZG9fa3NvY2tfc2V0dXAodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyBhZGRyX29wdHMgPSB7fTtcbitcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xuK1x0aW50IGVyciA9IDA7XG4rXG4rXHRjcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUO1xuK1x0Y3JlYXRlX29wdHMudHlwZSA9IFNPQ0tfREdSQU07XG4rXHRjcmVhdGVfb3B0cy5wcm90b2NvbCA9IElQUFJPVE9fVURQO1xuK1xuK1x0a3MgPSBicGZfa3NvY2tfY3JlYXRlKFx1MDAyNmNyZWF0ZV9vcHRzLCBzaXplb2YoY3JlYXRlX29wdHMpLCBcdTAwMjZlcnIpO1xuK1x0aWYgKCFrcylcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdGFkZHJfb3B0cy5mYW1pbHkgPSBBRl9JTkVUO1xuK1x0YWRkcl9vcHRzLnBvcnQgPSByZW1vdGVfcG9ydDtcbitcdGFkZHJfb3B0cy5pcHY0X2FkZHIgPSBpcHY0X3JlbW90ZTtcbitcbitcdGVyciA9IGJwZl9rc29ja19jb25uZWN0KGtzLCBcdTAwMjZhZGRyX29wdHMsIHNpemVvZihhZGRyX29wdHMpKTtcbitcdGlmIChlcnIpIHtcbitcdFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuK1x0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuK1x0ZXJyID0ga3NvY2tfY3R4X2luc2VydChrcyk7XG4rXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVFWElTVClcbitcdFx0cmV0dXJuIGVycjtcbitcdHJldHVybiAwO1xuK31cbitcbisjZW5kaWYgLyogX0tTT0NLX0NPTU1PTl9IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3F1b3RhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi45MTg1NGVhMzMzYzEyMVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3F1b3RhLmNcbkBAIC0wLDAgKzEsMTY3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfdHJhY2luZ19uZXQuaFwiXG4rI2luY2x1ZGUgXCJrc29ja19jb21tb24uaFwiXG4rXG4rI2RlZmluZSBLU09DS19RVU9UQV9OU19TTE9UUyAzXG4rI2RlZmluZSBLU09DS19RVU9UQV9ORVROUyAyXG4rI2RlZmluZSBLU09DS19RVU9UQV9TTE9UUyAoS1NPQ0tfUVVPVEFfTlNfU0xPVFMgKiBLU09DS19RVU9UQV9ORVROUylcbitcbitzdHJ1Y3Qga3NvY2tfcXVvdGFfdmFsdWUge1xuK1x0c3RydWN0IGJwZl9rc29jayBfX2twdHIgKiBjdHg7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3R5cGUoa2V5LCB1MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qga3NvY2tfcXVvdGFfdmFsdWUpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCBLU09DS19RVU9UQV9TTE9UUyk7XG4rfSBxdW90YV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XG4rXHRfX3R5cGUoa2V5LCB1NjQpO1xuK1x0X190eXBlKHZhbHVlLCB1OCk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIEtTT0NLX1FVT1RBX1NMT1RTKTtcbit9IHJlbGVhc2Vfd29ya2VycyBTRUMoXCIubWFwc1wiKTtcbitcbit1MzIgcXVvdGFfY3JlYXRlZDtcbit1MzIgcXVvdGFfcmVsZWFzZWQ7XG4rdTMyIHF1b3RhX3Nsb3Rfb2Zmc2V0O1xuK3UzMiB0YXJnZXRfbmV0bnNfaW51bVtLU09DS19RVU9UQV9ORVROU107XG4rdTY0IHF1b3RhX3JlbGVhc2VfY29tcGxldGVkO1xuK2ludCBxdW90YV9lcnI7XG4rXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sXG4ra3NvY2tfcXVvdGFfY3JlYXRlX29uZSh1MzIgaSxcbitcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKmNyZWF0ZV9vcHRzKVxuK3tcbitcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcbitcdHN0cnVjdCBicGZfa3NvY2sgKmtzLCAqb2xkO1xuK1x0aW50IGVyciA9IDA7XG4rXG4rXHRpICs9IHF1b3RhX3Nsb3Rfb2Zmc2V0O1xuK1x0aWYgKGkgXHUwMDNlPSBLU09DS19RVU9UQV9TTE9UUykge1xuK1x0XHRxdW90YV9lcnIgPSAtRVJBTkdFO1xuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcdH1cbitcbitcdGJhcnJpZXJfdmFyKGVycik7XG4rXHRrcyA9IGJwZl9rc29ja19jcmVhdGUoY3JlYXRlX29wdHMsIHNpemVvZigqY3JlYXRlX29wdHMpLCBcdTAwMjZlcnIpO1xuK1x0aWYgKCFrcykge1xuK1x0XHRxdW90YV9lcnIgPSBlcnI7XG4rXHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1xuK1x0diA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cXVvdGFfbWFwLCBcdTAwMjZpKTtcbitcdGlmICghdikge1xuK1x0XHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4rXHRcdHF1b3RhX2VyciA9IC1FTk9FTlQ7XG4rXHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1xuK1x0b2xkID0gYnBmX2twdHJfeGNoZyhcdTAwMjZ2LVx1MDAzZWN0eCwga3MpO1xuK1x0aWYgKG9sZClcbitcdFx0YnBmX2tzb2NrX3JlbGVhc2Uob2xkKTtcbitcdHF1b3RhX2NyZWF0ZWQrKztcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKHUzMiBpKVxuK3tcbitcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcbitcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xuK1xuK1x0aSArPSBxdW90YV9zbG90X29mZnNldDtcbitcdGlmIChpIFx1MDAzZT0gS1NPQ0tfUVVPVEFfU0xPVFMpXG4rXHRcdHJldHVybjtcbitcbitcdHYgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNnF1b3RhX21hcCwgXHUwMDI2aSk7XG4rXHRpZiAoIXYpXG4rXHRcdHJldHVybjtcbitcbitcdGtzID0gYnBmX2twdHJfeGNoZyhcdTAwMjZ2LVx1MDAzZWN0eCwgTlVMTCk7XG4rXHRpZiAoa3MpIHtcbitcdFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuK1x0XHRxdW90YV9yZWxlYXNlZCsrO1xuK1x0fVxuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IGtzb2NrX3F1b3RhX2NyZWF0ZSh2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBjcmVhdGVfb3B0cyA9IHt9O1xuK1xuK1x0Y3JlYXRlX29wdHMuZmFtaWx5ID0gQUZfSU5FVDtcbitcdGNyZWF0ZV9vcHRzLnR5cGUgPSBTT0NLX0RHUkFNO1xuK1x0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcbitcdHF1b3RhX2NyZWF0ZWQgPSAwO1xuK1x0cXVvdGFfZXJyID0gMDtcbitcbitcdGlmIChrc29ja19xdW90YV9jcmVhdGVfb25lKDAsIFx1MDAyNmNyZWF0ZV9vcHRzKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRpZiAoa3NvY2tfcXVvdGFfY3JlYXRlX29uZSgxLCBcdTAwMjZjcmVhdGVfb3B0cykpXG4rXHRcdHJldHVybiAwO1xuK1x0a3NvY2tfcXVvdGFfY3JlYXRlX29uZSgyLCBcdTAwMjZjcmVhdGVfb3B0cyk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBrc29ja19xdW90YV9yZWxlYXNlKHZvaWQgKmN0eClcbit7XG4rXHRxdW90YV9yZWxlYXNlZCA9IDA7XG4rXHRrc29ja19xdW90YV9yZWxlYXNlX29uZSgwKTtcbitcdGtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKDEpO1xuK1x0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMik7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwiZmVudHJ5L2tzb2NrX3JlbGVhc2Vfd29ya19mblwiKVxuK2ludCBCUEZfUFJPRyhrc29ja19yZWxlYXNlX3dvcmtfZW50ZXIsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3QgcmN1X3dvcmsgKnJ3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByY3Vfd29yaywgd29yayk7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrICprcyA9IGNvbnRhaW5lcl9vZihyd29yaywgc3RydWN0IGJwZl9rc29jaywgcndvcmspO1xuK1x0dTY0IHBpZF90Z2lkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCk7XG4rXHRzdHJ1Y3QgbmV0ICpuZXQ7XG4rXHR1MzIgaW51bTtcbitcdHU4IHRyYWNrZWQgPSAxO1xuK1xuK1x0Lyoga3NvY2tfcmVsZWFzZV93b3JrX2ZuKCkgZnJlZXMga3MgYmVmb3JlIHRoZSBmZXhpdCBwcm9ncmFtIHJ1bnMuICovXG4rXHRuZXQgPSBCUEZfQ09SRV9SRUFEKGtzLCBzb2NrLCBzaywgX19za19jb21tb24uc2tjX25ldC5uZXQpO1xuK1x0aWYgKCFuZXQpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0aW51bSA9IEJQRl9DT1JFX1JFQUQobmV0LCBucy5pbnVtKTtcbitcdGlmIChpbnVtICE9IHRhcmdldF9uZXRuc19pbnVtWzBdIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGludW0gIT0gdGFyZ2V0X25ldG5zX2ludW1bMV0pXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0YnBmX21hcF91cGRhdGVfZWxlbShcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFx1MDAyNnBpZF90Z2lkLCBcdTAwMjZ0cmFja2VkLCBCUEZfQU5ZKTtcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJmZXhpdC9rc29ja19yZWxlYXNlX3dvcmtfZm5cIilcbitpbnQgQlBGX1BST0coa3NvY2tfcmVsZWFzZV93b3JrX2V4aXQsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHR1NjQgcGlkX3RnaWQgPSBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQoKTtcbitcdHU4ICp0cmFja2VkO1xuK1xuK1x0dHJhY2tlZCA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cmVsZWFzZV93b3JrZXJzLCBcdTAwMjZwaWRfdGdpZCk7XG4rXHRpZiAoIXRyYWNrZWQpXG4rXHRcdHJldHVybiAwO1xuK1x0YnBmX21hcF9kZWxldGVfZWxlbShcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFx1MDAyNnBpZF90Z2lkKTtcbitcbitcdC8qIFRoZSB3b3JrZXIgaGFzIHJlbGVhc2VkIHRoZSBzb2NrZXQgYW5kIHJldHVybmVkIGl0cyBxdW90YSBjaGFyZ2UuICovXG4rXHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcdTAwMjZxdW90YV9yZWxlYXNlX2NvbXBsZXRlZCwgMSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rY2hhciBfX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJmNTIwMDk0M2UzNmFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19yZWN1cnNpb24uY1xuQEAgLTAsMCArMSw2OSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuK1xuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9lbmRpYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmX3RyYWNpbmdfbmV0LmhcIlxuKyNpbmNsdWRlIFwia3NvY2tfY29tbW9uLmhcIlxuK1xuK3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltO1xuK3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07XG4rXG4raW50IHRhcmdldF9waWQ7XG4raW50IHRyaWdnZXJfc2VuZDtcbitcbit1bnNpZ25lZCBpbnQgcmVjX2NvdW50O1xuK2ludCByZWNfa2Z1bmNfcmV0c1tdID0geyAtMSwgLTEgfTtcbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IGtzb2NrX3NldHVwKHZvaWQgKmN0eClcbit7XG4rXHRyZXR1cm4gZG9fa3NvY2tfc2V0dXAoKTtcbit9XG4rXG4rU0VDKFwibHNtLnMvc29ja2V0X3NlbmRtc2dcIilcbitpbnQgQlBGX1BST0coa3NvY2tfc29ja2V0X3NlbmRtc2csIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcbitcdCAgICAgaW50IHNpemUsIGludCByZXQpXG4re1xuK1x0c3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlICp2O1xuK1x0c3RydWN0IGJwZl9rc29jayAqa3MsICp0bXA7XG4rXHR1MzIgcGlkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCkgXHUwMDNlXHUwMDNlIDMyO1xuK1x0aW50IGtmdW5jX3JldDtcbitcbitcdGlmIChyZXQgfHwgIXRyaWdnZXJfc2VuZCB8fCBwaWQgIT0gdGFyZ2V0X3BpZClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHYgPSBrc29ja19jdHhfdmFsdWVfbG9va3VwKCk7XG4rXHRpZiAoIXYpIHtcbitcdFx0a2Z1bmNfcmV0ID0gLUVOT0VOVDtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRrcyA9IE5VTEw7XG4rXHRicGZfcmN1X3JlYWRfbG9jaygpO1xuK1x0dG1wID0gdi1cdTAwM2VjdHg7XG4rXHRpZiAodG1wKVxuK1x0XHRrcyA9IGJwZl9rc29ja19hY3F1aXJlKHRtcCk7XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rXG4rXHRpZiAoIWtzKSB7XG4rXHRcdGtmdW5jX3JldCA9IC1FTk9FTlQ7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0a2Z1bmNfcmV0ID0gYnBmX2tzb2NrX3NlbmQoa3MsIHNlbmRfZGF0YSwgc2l6ZW9mKHNlbmRfZGF0YSkpO1xuK1x0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuK1xuK291dDpcbitcdHJlY19rZnVuY19yZXRzW3JlY19jb3VudCBcdTAwMjYgMV0gPSBrZnVuY19yZXQ7XG4rXHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcdTAwMjZyZWNfY291bnQsIDEpO1xuK1xuK1x0aWYgKGtmdW5jX3JldCAhPSAtRUJVU1kpXG4rXHRcdHRyaWdnZXJfc2VuZCA9IDA7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitjaGFyIF9fbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3dxLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTZhMTg3M2QxMzJlZGVcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jXG5AQCAtMCwwICsxLDYyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFwiYnBmX3RyYWNpbmdfbmV0LmhcIlxuKyNpbmNsdWRlIFwiZXJybm8uaFwiXG4rI2luY2x1ZGUgXCJrc29ja19jb21tb24uaFwiXG4rXG4rc3RydWN0IGtzb2NrX3dxX3ZhbHVlIHtcbitcdHN0cnVjdCBicGZfd3Egd29yaztcbit9O1xuK1xuK3N0cnVjdCB7XG4rXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbitcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4rXHRfX3R5cGUoa2V5LCB1MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qga3NvY2tfd3FfdmFsdWUpO1xuK30gd29ya19tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4raW50IGNyZWF0ZV9lcnI7XG4rdTMyIGNhbGxiYWNrX2RvbmU7XG4rXG4rc3RhdGljIGludCBrc29ja193cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbit7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIG9wdHMgPSB7XG4rXHRcdC5mYW1pbHkgPSBBRl9JTkVULFxuK1x0XHQudHlwZSA9IFNPQ0tfREdSQU0sXG4rXHRcdC5wcm90b2NvbCA9IElQUFJPVE9fVURQLFxuK1x0fTtcbitcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xuK1x0aW50IGVyciA9IDA7XG4rXG4rXHRrcyA9IGJwZl9rc29ja19jcmVhdGUoXHUwMDI2b3B0cywgc2l6ZW9mKG9wdHMpLCBcdTAwMjZlcnIpO1xuK1x0aWYgKGtzKVxuK1x0XHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4rXHRjcmVhdGVfZXJyID0gZXJyO1xuK1x0X19zeW5jX2ZldGNoX2FuZF9hZGQoXHUwMDI2Y2FsbGJhY2tfZG9uZSwgMSk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBrc29ja193cV9zdGFydCh2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0IGtzb2NrX3dxX3ZhbHVlICp2YWx1ZTtcbitcdHUzMiBrZXkgPSAwO1xuK1x0aW50IGVycjtcbitcbitcdHZhbHVlID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3b3JrX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghdmFsdWUpXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1x0ZXJyID0gYnBmX3dxX2luaXQoXHUwMDI2dmFsdWUtXHUwMDNld29yaywgXHUwMDI2d29ya19tYXAsIDApO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcdGVyciA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2dmFsdWUtXHUwMDNld29yaywga3NvY2tfd3FfY2FsbGJhY2ssIDApO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcdHJldHVybiBicGZfd3Ffc3RhcnQoXHUwMDI2dmFsdWUtXHUwMDNld29yaywgMCk7XG4rfVxuK1xuK2NoYXIgX19saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQxMjo1ODo1NS45OTUyNDA3NDFaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTczMDcyMDIxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE5ldyBgYnBmX2tzb2NrYCBGZWF0dXJlIGZvciBGdXp6aW5nKipcblxuT2theSwgc28gd2UndmUgZ290IHRoaXMgbmV3IHBhdGNoIGludHJvZHVjaW5nIGBicGZfa3NvY2tgLCB3aGljaCBsZXRzIEJQRiBwcm9ncmFtcyBjcmVhdGUsIGJpbmQsIGNvbm5lY3QsIGFuZCBzZW5kIGRhdGEgdGhyb3VnaCBrZXJuZWwgc29ja2V0cy4gVGhhdCdzIGRlZmluaXRlbHkgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSB0aGUgQlBGIHN1YnN5c3RlbSBhbmQgbmV0d29ya2luZywgc2NyZWFtaW5nIGZvciBmdXp6aW5nLiBMZXQncyBkaWcgaW50byB0aGUgZGlmZiB0byBpZGVudGlmeSB0aGUga2V5IHN5bWJvbHMgYW5kIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLlxuXG5GaXJzdCwgbGV0J3MgbG9vayBhdCB0aGUgY29uZmlncy4gVGhlIGBuZXQvY29yZS9NYWtlZmlsZWAgYWRkcyBgYnBmX2tzb2NrLm9gIHVuZGVyIHRoZSBjb25kaXRpb25zOiBgaWZuZXEgKCQoQ09ORklHX0lORVQpLClgIGFuZCBgb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBicGZfa3NvY2sub2AuIFNvLCB3ZSAqZGVmaW5pdGVseSogbmVlZCBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19JTkVUYCB0byBiZSBlbmFibGVkLlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRob3NlIGZvY3VzIHN5bWJvbHMuIExvb2tpbmcgYXQgYG5ldC9jb3JlL2JwZl9rc29jay5jYCwgd2Ugc2VlIHRoZSBuZXcgZnVuY3Rpb25zIGFyZTogYGJwZl9rc29ja19jcmVhdGVgLCBgYnBmX2tzb2NrX2JpbmRgLCBgYnBmX2tzb2NrX2Nvbm5lY3RgLCBgYnBmX2tzb2NrX2FjcXVpcmVgLCBgYnBmX2tzb2NrX3JlbGVhc2VgLCBgYnBmX2tzb2NrX3JlbGVhc2VfZHRvcmAsIGFuZCBgYnBmX2tzb2NrX3NlbmRgLiBUaGVzZSBhcmUgZXhwb3NlZCBhcyBCUEYga2Z1bmNzLCBzbyBmdXp6aW5nIHRoZW0gaXMgaGlnaCBwcmlvcml0eS4gVGhlcmUgYXJlIGEgZmV3IHN1cHBvcnRpbmcgZnVuY3Rpb25zIGFzIHdlbGwsIGxldCdzIGtlZXAgdHJhY2sgb2YgdGhvc2UgaW4gY2FzZSB0aGV5J3JlIHJlbGV2YW50OiBgYnBmX2tzb2NrX25ldF90cnlfY2hhcmdlYCwgYGJwZl9rc29ja19uZXRfdW5jaGFyZ2VgLCBga3NvY2tfcmVsZWFzZV93b3JrX2ZuYCwgYGJwZl9rc29ja19nZXRfYWRkcmAsIGBicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0YCwgYGJwZl9rc29ja19zZW5kX2VudGVyYCwgYW5kIGBicGZfa3NvY2tfc2VuZF9leGl0YC4gQnV0IHRoZSBtYWluIGVudHJ5IHBvaW50cyBmb3IgZnV6emluZyBhcmUgZGVmaW5pdGVseSB0aG9zZSBrZnVuY3MuXG5cbkRvdWJsZS1jaGVja2luZyBjb25maWdzLCB3ZSd2ZSBnb3QgYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kIGBDT05GSUdfSU5FVGAgYXMgdGhlIGJpZyBvbmVzLiBBbmQgZ2xhbmNpbmcgYXQgYGJwZl9rc29ja19nZXRfYWRkcmAsIEkgc2VlIGBDT05GSUdfSVBWNmAgaXMgYWxzbyB1c2VkLlxuXG5Pa2F5LCBsZXQncyByZWZpbmUgdGhhdCBmb2N1cyBzeW1ib2wgbGlzdC4gSXQgc2VlbXMgbGlrZSB0aGUgY29yZSBvbmVzIGFyZTogYGJwZl9rc29ja19jcmVhdGVgLCBgYnBmX2tzb2NrX2JpbmRgLCBgYnBmX2tzb2NrX2Nvbm5lY3RgLCBgYnBmX2tzb2NrX3NlbmRgLCBgYnBmX2tzb2NrX2FjcXVpcmVgLCBhbmQgYGJwZl9rc29ja19yZWxlYXNlYC4gQW5kIGBicGZfa3NvY2tfcmVsZWFzZV9kdG9yYCBhbmQgYGJwZl9rc29ja19nZXRfYWRkcmAgc2VlbSBpbXBvcnRhbnQgdG9vLiBJIG1pZ2h0IG5lZWQgdG8gY29uc2lkZXIgYGtzb2NrX3JlbGVhc2Vfd29ya19mbmAgbGF0ZXIsIGFzIGl0IGlzIGEga2VybmVsIHdvcmtxdWV1ZSwgd2hpY2ggdGVuZHMgdG8gYmUgaW50ZXJlc3RpbmcgZnJvbSBhIGZ1enppbmcgcGVyc3BlY3RpdmUuXG5cbkxldCdzIHF1aWNrbHkgY2hlY2sgYG5ldC9zb2NrZXQuY2AgdG8gc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRoZXJlLiBZZXAsIHdlJ3ZlIGdvdCBgX19zeXNfY29ubmVjdF9zb2NrZXRgIGJlaW5nIHVzZWQuIFRoYXQncyBhIG5ldyBmdW5jdGlvbiwgc28gbGV0J3MgYWRkIHRoYXQgdG8gdGhlIGZvY3VzIHN5bWJvbHMuXG5cbkZpbmFsIHJlZmluZWQgbGlzdDogYGJwZl9rc29ja19jcmVhdGVgLCBgYnBmX2tzb2NrX2JpbmRgLCBgYnBmX2tzb2NrX2Nvbm5lY3RgLCBgYnBmX2tzb2NrX3NlbmRgLCBgYnBmX2tzb2NrX2FjcXVpcmVgLCBgYnBmX2tzb2NrX3JlbGVhc2VgLCBhbmQgYF9fc3lzX2Nvbm5lY3Rfc29ja2V0YC5cblxuUmlnaHQsIGxldCdzIHZlcmlmeSB0aGUgY29uZmlnczogYENPTkZJR19CUEZfU1lTQ0FMTGAsIGBDT05GSUdfSU5FVGAsIGBDT05GSUdfSVBWNmAuXG5cbk5vdywgdGhlIGluc3RydWN0aW9ucyBzYXkgdG8gYXZvaWQgbGlzdGluZyBnZW5lcmljIGNvbmZpZ3MgYW5kIG9ubHkgbGlzdCB0aG9zZSBzcGVjaWZpYyB0byB0aGUgbW9kaWZpZWQgY29kZS4gVGhleSBhbHNvIHdhbnQgdXMgdG8gZHJvcCB0aGUgYENPTkZJR19gIHByZWZpeC4gYEJQRl9TWVNDQUxMYCwgYElORVRgLCBhbmQgYElQVjZgIGFyZSBraW5kYSBnZW5lcmljLCBidXQgdGhleSBhcmUgKnNwZWNpZmljYWxseSogcmVxdWlyZWQgaGVyZS4gU28sIGxvb2tpbmcgYXQgdGhlIE1ha2VmaWxlLCBgQlBGX1NZU0NBTExgIGFuZCBgSU5FVGAgYXJlIHRoZSBleGFjdCBjb25kaXRpb25zLiBTbyB0aG9zZSBhcmUgdGhlIG9uZXMgdG8gaW5jbHVkZS5cblxuU28sIGZ1enppbmcgdGhlc2Uga2Z1bmNzIGlzIGNyaXRpY2FsLCBhcyB0aGV5J3JlIGRpcmVjdGx5IGludGVyZmFjaW5nIEJQRiB3aXRoIHRoZSBuZXR3b3JraW5nIHN0YWNrLiBUaGV5IG5lZWQgdG8gYmUgcmlnb3JvdXNseSB0ZXN0ZWQgZm9yIG1lbW9yeSBzYWZldHkgYW5kIGNvcnJlY3Qgb3BlcmF0aW9uLlxuXG5MZXQncyBmb3JtYXQgdGhhdCB0b29sIGNhbGwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMzI1LCJPdXRwdXRUb2tlbnMiOjIxNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExODIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQxMjo1OToxMS43MjU5NjMwNDRaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgzMTk0ODYzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiSU5FVFwiLFxuICAgIFwiSVBWNlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9rc29ja19jcmVhdGVcIixcbiAgICBcImJwZl9rc29ja19iaW5kXCIsXG4gICAgXCJicGZfa3NvY2tfY29ubmVjdFwiLFxuICAgIFwiYnBmX2tzb2NrX3NlbmRcIixcbiAgICBcImJwZl9rc29ja19hY3F1aXJlXCIsXG4gICAgXCJicGZfa3NvY2tfcmVsZWFzZVwiLFxuICAgIFwiX19zeXNfY29ubmVjdF9zb2NrZXRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiSU5FVFwiLFxuICAgIFwiSVBWNlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9rc29ja19jcmVhdGVcIixcbiAgICBcImJwZl9rc29ja19iaW5kXCIsXG4gICAgXCJicGZfa3NvY2tfY29ubmVjdFwiLFxuICAgIFwiYnBmX2tzb2NrX3NlbmRcIixcbiAgICBcImJwZl9rc29ja19hY3F1aXJlXCIsXG4gICAgXCJicGZfa3NvY2tfcmVsZWFzZVwiLFxuICAgIFwiX19zeXNfY29ubmVjdF9zb2NrZXRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowgr58t[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-06 12:49:45 +0000 UTC FinishedAt: 2026-07-06 12:59:14 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "bb4e90e91ba19b598cbdd9a2161b893b86a3f637", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "INET", "IPV6" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "bb4e90e91ba19b598cbdd9a2161b893b86a3f637", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "INET", "IPV6" ], "series_id": "3eacd087-8dee-4e0e-8e6c-b3c9edba36e1" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "net" ], "focus_symbols": [ "bpf_ksock_create", "bpf_ksock_bind", "bpf_ksock_connect", "bpf_ksock_send", "bpf_ksock_acquire", "bpf_ksock_release", "__sys_connect_socket" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDEyOjU4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0lORVQmIzM0OywKICAgICYjMzQ7SVBWNiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9rc29ja19jcmVhdGUmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX2JpbmQmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX2Nvbm5lY3QmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX3NlbmQmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX2FjcXVpcmUmIzM0OywKICAgICYjMzQ7YnBmX2tzb2NrX3JlbGVhc2UmIzM0OywKICAgICYjMzQ7X19zeXNfY29ubmVjdF9zb2NrZXQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYgZmVhdHVyZSBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGtlcm5lbCBzb2NrZXRzIChgYnBmX2tzb2NrYCkuIFRoaXMgYWRkcyBuZXcgQlBGIGtmdW5jcyAoYGJwZl9rc29ja19jcmVhdGVgLCBgYnBmX2tzb2NrX2JpbmRgLCBgYnBmX2tzb2NrX2Nvbm5lY3RgLCBgYnBmX2tzb2NrX3NlbmRgLCBldGMuKSB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBjb3JlIG5ldHdvcmtpbmcgc3RhY2suIEZ1enppbmcgdGhlc2Uga2Z1bmNzIGlzIGltcG9ydGFudCB0byBlbnN1cmUgbWVtb3J5IHNhZmV0eSBhbmQgY29ycmVjdCBiZWhhdmlvciBvZiB0aGUgbmV3IGZlYXR1cmUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMTI6NTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2YzA0NGEzYjNhZTJmODFkYWVkMGNjOTBiOWM0MDg0OWNkNjMxM2ViXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBKdWwgNiAxMjo1ODo1NCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL3N5c2N0bC9uZXQucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxuaW5kZXggZTU4NmUxN2ZjN2E1ODIuLjhiY2RjMWJmZDcxMTM4IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxuQEAgLTEyOCw2ICYjNDM7MTI4LDE4IEBAIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlamVjdCB1bnByaXZpbGVnZWQgSklUIHJlcXVlc3RzIG9uY2UgaXQgaGFzXG4gYmVlbiBzdXJwYXNzZWQuIGJwZl9qaXRfbGltaXQgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwgbGltaXRcbiBpbiBieXRlcy5cbiBcbiYjNDM7YnBmX2tzb2NrX21heFxuJiM0MzstLS0tLS0tLS0tLS0tXG4mIzQzO1xuJiM0MztNYXhpbXVtIG51bWJlciBvZiBCUEYga2VybmVsIHNvY2tldHMgdGhhdCBtYXkgZXhpc3QgaW4gZWFjaCBuZXR3b3JrIG5hbWVzcGFjZS5cbiYjNDM7VGhpcyBob3N0LXdpZGUgc2V0dGluZyBpcyBleHBvc2VkIGluIHRoZSBpbml0aWFsIG5ldHdvcmsgbmFtZXNwYWNlIGFuZCBhcHBsaWVzXG4mIzQzO3RoZSBzYW1lIGxpbWl0IGluZGVwZW5kZW50bHkgdG8gZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuIFNvY2tldHMgYXdhaXRpbmdcbiYjNDM7ZGVmZXJyZWQgUkNVIGFuZCB3b3JrcXVldWUgY2xlYW51cCByZW1haW4gY291bnRlZCB1bnRpbCB0aGUgdW5kZXJseWluZyBzb2NrZXRcbiYjNDM7aGFzIGJlZW4gcmVsZWFzZWQuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyBjcmVhdGlvbiBvZiBCUEYga2VybmVsIHNvY2tldHMgaW5cbiYjNDM7ZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuXG4mIzQzO1xuJiM0MztEZWZhdWx0OiAxMDI0XG4mIzQzO1xuIGRldl93ZWlnaHRcbiAtLS0tLS0tLS0tXG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGZfa3NvY2suaCBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMDQ4NWI4ZWRkYzFmMjBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmhcbkBAIC0wLDAgJiM0MzsxLDUwIEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2lmbmRlZiBfQlBGX0tTT0NLX0hcbiYjNDM7I2RlZmluZSBfQlBGX0tTT0NLX0hcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQlBGX0tTT0NLX01BWF9ERUZBVUxUIDEwMjRcbiYjNDM7XG4mIzQzO2V4dGVybiBpbnQgc3lzY3RsX2JwZl9rc29ja19tYXg7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAtIEJQRiBrZXJuZWwgc29ja2V0IGNyZWF0aW9uIHBhcmFtZXRlcnNcbiYjNDM7ICogQGZhbWlseTpcdEFkZHJlc3MgZmFtaWx5OiBBRl9JTkVUIG9yIEFGX0lORVQ2LlxuJiM0MzsgKiBAdHlwZTpcdFNvY2tldCB0eXBlOiBvbmx5IFNPQ0tfREdSQU0gc3VwcG9ydGVkIGZvciBub3cuXG4mIzQzOyAqIEBwcm90b2NvbDpcdFByb3RvY29sIG51bWJlciAoZS5nLiBJUFBST1RPX1VEUCksIG9yIDAgZm9yIHRoZSBkZWZhdWx0IHByb3RvY29sXG4mIzQzOyAqXHRcdG9mIHRoZSBnaXZlbiB0eXBlLlxuJiM0MzsgKiBAcmVzZXJ2ZWQ6XHRNdXN0IGJlIHplcm8uIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyB7XG4mIzQzO1x0X191OCBmYW1pbHk7XG4mIzQzO1x0X191OCB0eXBlO1xuJiM0MztcdF9fdTggcHJvdG9jb2w7XG4mIzQzO1x0X191OCByZXNlcnZlZDtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAtIEJQRiBrZXJuZWwgc29ja2V0IGFkZHJlc3MgcGFyYW1ldGVyc1xuJiM0MzsgKiBAZmFtaWx5Olx0QWRkcmVzcyBmYW1pbHk6IEFGX0lORVQgb3IgQUZfSU5FVDYuXG4mIzQzOyAqIEByZXNlcnZlZDpcdE11c3QgYmUgemVyby4gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4mIzQzOyAqIEBwb3J0Olx0UG9ydCBpbiBob3N0IGJ5dGUgb3JkZXIuXG4mIzQzOyAqIEBzY29wZV9pZDpcdElQdjYgc2NvcGUgSUQgZm9yIHNjb3BlZCBBRl9JTkVUNiBhZGRyZXNzZXMsIG9yIHplcm8uXG4mIzQzOyAqXHRcdE11c3QgYmUgemVybyB3aGVuIGZhbWlseT1BRl9JTkVULlxuJiM0MzsgKiBAaXB2NF9hZGRyOlx0SVB2NCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVULlxuJiM0MzsgKiBAaXB2Nl9hZGRyOlx0SVB2NiBhZGRyZXNzICgxNiBieXRlcywgbmV0d29yayBieXRlIG9yZGVyKS4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVUNi5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHtcbiYjNDM7XHRfX3U4IGZhbWlseTtcbiYjNDM7XHRfX3U4IHJlc2VydmVkO1xuJiM0MztcdF9fdTE2IHBvcnQ7XG4mIzQzO1x0X191MzIgc2NvcGVfaWQ7XG4mIzQzO1xuJiM0MztcdHVuaW9uIHtcbiYjNDM7XHRcdF9fYmUzMiBpcHY0X2FkZHI7XG4mIzQzO1x0XHRfX3UzMiBpcHY2X2FkZHJbNF07IC8qIGluNl9hZGRyOyBuZXR3b3JrIG9yZGVyICovXG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBfQlBGX0tTT0NLX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuaW5kZXggMmE4ZDdiMTRmMWQxMTkuLjQ4ZjFlYjgxOTNkZWExIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuQEAgLTQ2MSw2ICYjNDM7NDYxLDggQEAgZXh0ZXJuIHN0cnVjdCBmaWxlICpfX3N5c19zb2NrZXRfZmlsZShpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTtcbiBleHRlcm4gaW50IF9fc3lzX2JpbmQoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1bXlhZGRyLCBpbnQgYWRkcmxlbik7XG4gZXh0ZXJuIGludCBfX3N5c19iaW5kX3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcyxcbiBcdFx0XHQgICAgIGludCBhZGRybGVuKTtcbiYjNDM7ZXh0ZXJuIGludCBfX3N5c19jb25uZWN0X3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcixcbiYjNDM7XHRcdFx0XHRpbnQgYWRkcmxlbiwgaW50IGZsYWdzKTtcbiBleHRlcm4gaW50IF9fc3lzX2Nvbm5lY3RfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsXG4gXHRcdFx0ICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKTtcbiBleHRlcm4gaW50IF9fc3lzX2Nvbm5lY3QoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1c2VydmFkZHIsXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uNTJmNmE4OTU0NmU0NmEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTQ0MjQsNiAmIzQzOzQ0MjQsOSBAQCBCVEZfSUQoc3RydWN0LCB0YXNrX3N0cnVjdClcbiAjaWZkZWYgQ09ORklHX0NSWVBUT1xuIEJURl9JRChzdHJ1Y3QsIGJwZl9jcnlwdG9fY3R4KVxuICNlbmRpZlxuJiM0MzsjaWZkZWYgQ09ORklHX0lORVRcbiYjNDM7QlRGX0lEKHN0cnVjdCwgYnBmX2tzb2NrKVxuJiM0MzsjZW5kaWZcbiBCVEZfU0VUX0VORChyY3VfcHJvdGVjdGVkX3R5cGVzKVxuIFxuIHN0YXRpYyBib29sIHJjdV9wcm90ZWN0ZWRfb2JqZWN0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZClcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9NYWtlZmlsZSBiL25ldC9jb3JlL01ha2VmaWxlXG5pbmRleCBiM2ZkY2I0ZTM1NWZhNi4uYTkyOTViNzg1OTAxMDkgMTAwNjQ0XG4tLS0gYS9uZXQvY29yZS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvTWFrZWZpbGVcbkBAIC00NCw2ICYjNDM7NDQsOSBAQCBvYmotJChDT05GSUdfRkFJTE9WRVIpICYjNDM7PSBmYWlsb3Zlci5vXG4gb2JqLSQoQ09ORklHX05FVF9TT0NLX01TRykgJiM0Mzs9IHNrbXNnLm9cbiBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBzb2NrX21hcC5vXG4gb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnBmX3NrX3N0b3JhZ2Uub1xuJiM0MztpZm5lcSAoJChDT05GSUdfSU5FVCksKVxuJiM0MztvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBicGZfa3NvY2sub1xuJiM0MztlbmRpZlxuIG9iai0kKENPTkZJR19PRilcdCYjNDM7PSBvZl9uZXQub1xuIG9iai0kKENPTkZJR19ORVRfVEVTVCkgJiM0Mzs9IG5ldF90ZXN0Lm9cbiBvYmotJChDT05GSUdfTkVUX0RFVk1FTSkgJiM0Mzs9IGRldm1lbS5vXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvYnBmX2tzb2NrLmMgYi9uZXQvY29yZS9icGZfa3NvY2suY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi44YmRlNzM0YmM5MTdkM1xuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvYnBmX2tzb2NrLmNcbkBAIC0wLDAgJiM0MzsxLDUxNiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZl9rc29jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jYWNoZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2hhc2guaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9pbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2luNi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2xpc3RfYmwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9uZXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9yZWZjb3VudC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdXBkYXRlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc29ja2V0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdW5hbGlnbmVkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaXAuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXQvaXB2Ni5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY25ldC9uZXRfbmFtZXNwYWNlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbmV0L25ldG5zL2dlbmVyaWMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXQvc29jay5oXHUwMDNlXG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogc3RydWN0IGJwZl9rc29jayAtIHJlZmNvdW50ZWQgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dFxuJiM0MzsgKiBAc29jazpcdFRoZSB1bmRlcmx5aW5nIGtlcm5lbCBzb2NrZXQuXG4mIzQzOyAqIEB1c2FnZTpcdFJlZmVyZW5jZSBjb3VudGVyLlxuJiM0MzsgKiBAcndvcms6XHRSQ1Ugd29yayBmb3IgZGVmZXJyZWQgY2xlYW51cCAoc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgYnBmX2tzb2NrIHtcbiYjNDM7XHRzdHJ1Y3Qgc29ja2V0ICpzb2NrO1xuJiM0MztcdHJlZmNvdW50X3QgdXNhZ2U7XG4mIzQzO1x0c3RydWN0IHJjdV93b3JrIHJ3b3JrO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkIHtcbiYjNDM7XHRzdHJ1Y3QgaGxpc3RfYmxfbm9kZSBub2RlO1xuJiM0MztcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQlBGX0tTT0NLX1NFTkRfR1VBUkRfSEFTSF9CSVRTIDZcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQge1xuJiM0MztcdHN0cnVjdCBobGlzdF9ibF9oZWFkIGhlYWQ7XG4mIzQzO30gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDtcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0XG4mIzQzO1x0YnBmX2tzb2NrX3NlbmRfYnVja2V0c1sxIFx1MDAzY1x1MDAzYyBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFNdO1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKlxuJiM0MzticGZfa3NvY2tfc2VuZF9idWNrZXQoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuJiM0Mzt7XG4mIzQzO1x0dTMyIGJ1Y2tldF9pZHggPSBoYXNoX3B0cih0YXNrLCBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gXHUwMDI2YnBmX2tzb2NrX3NlbmRfYnVja2V0c1tidWNrZXRfaWR4XTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgYnBmX2tzb2NrX3NlbmRfZW50ZXIoc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICpndWFyZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9ndWFyZCAqZW50cnk7XG4mIzQzO1x0c3RydWN0IGhsaXN0X2JsX25vZGUgKnBvcztcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0ICpidWNrZXQ7XG4mIzQzO1xuJiM0MztcdGJ1Y2tldCA9IGJwZl9rc29ja19zZW5kX2J1Y2tldChjdXJyZW50KTtcbiYjNDM7XHRobGlzdF9ibF9sb2NrKFx1MDAyNmJ1Y2tldC1cdTAwM2VoZWFkKTtcbiYjNDM7XHRobGlzdF9ibF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCBcdTAwMjZidWNrZXQtXHUwMDNlaGVhZCwgbm9kZSkge1xuJiM0MztcdFx0aWYgKGVudHJ5LVx1MDAzZXRhc2sgPT0gY3VycmVudCkge1xuJiM0MztcdFx0XHRobGlzdF9ibF91bmxvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRndWFyZC1cdTAwM2V0YXNrID0gY3VycmVudDtcbiYjNDM7XHRJTklUX0hMSVNUX0JMX05PREUoXHUwMDI2Z3VhcmQtXHUwMDNlbm9kZSk7XG4mIzQzO1x0aGxpc3RfYmxfYWRkX2hlYWQoXHUwMDI2Z3VhcmQtXHUwMDNlbm9kZSwgXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuJiM0MztcdGhsaXN0X2JsX3VubG9jayhcdTAwMjZidWNrZXQtXHUwMDNlaGVhZCk7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGJwZl9rc29ja19zZW5kX2V4aXQoc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICpndWFyZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKmJ1Y2tldDtcbiYjNDM7XG4mIzQzO1x0YnVja2V0ID0gYnBmX2tzb2NrX3NlbmRfYnVja2V0KGd1YXJkLVx1MDAzZXRhc2spO1xuJiM0MztcdGhsaXN0X2JsX2xvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuJiM0MztcdGhsaXN0X2JsX2RlbChcdTAwMjZndWFyZC1cdTAwM2Vub2RlKTtcbiYjNDM7XHRobGlzdF9ibF91bmxvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2tzb2NrX25ldCB7XG4mIzQzO1x0YXRvbWljX3QgY291bnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IGJwZl9rc29ja19uZXRfaWQ7XG4mIzQzO2ludCBzeXNjdGxfYnBmX2tzb2NrX21heCBfX3JlYWRfbW9zdGx5ID0gQlBGX0tTT0NLX01BWF9ERUZBVUxUO1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBicGZfa3NvY2tfbmV0ICpicGZfa3NvY2tfcGVybmV0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBuZXRfZ2VuZXJpYyhuZXQsIGJwZl9rc29ja19uZXRfaWQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGJwZl9rc29ja19uZXRfb3BzID0ge1xuJiM0MztcdC5pZCA9IFx1MDAyNmJwZl9rc29ja19uZXRfaWQsXG4mIzQzO1x0LnNpemUgPSBzaXplb2Yoc3RydWN0IGJwZl9rc29ja19uZXQpLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgYnBmX2tzb2NrX25ldF90cnlfY2hhcmdlKHN0cnVjdCBuZXQgKm5ldClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfbmV0ICprbiA9IGJwZl9rc29ja19wZXJuZXQobmV0KTtcbiYjNDM7XHRpbnQgY291bnQgPSBhdG9taWNfcmVhZChcdTAwMjZrbi1cdTAwM2Vjb3VudCk7XG4mIzQzO1x0aW50IG1heDtcbiYjNDM7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0bWF4ID0gUkVBRF9PTkNFKHN5c2N0bF9icGZfa3NvY2tfbWF4KTtcbiYjNDM7XHRcdGlmIChjb3VudCBcdTAwM2U9IG1heClcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH0gd2hpbGUgKCFhdG9taWNfdHJ5X2NtcHhjaGcoXHUwMDI2a24tXHUwMDNlY291bnQsIFx1MDAyNmNvdW50LCBjb3VudCAmIzQzOyAxKSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBicGZfa3NvY2tfbmV0X3VuY2hhcmdlKHN0cnVjdCBuZXQgKm5ldClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfbmV0ICprbiA9IGJwZl9rc29ja19wZXJuZXQobmV0KTtcbiYjNDM7XG4mIzQzO1x0V0FSTl9PTl9PTkNFKGF0b21pY19kZWNfcmV0dXJuKFx1MDAyNmtuLVx1MDAzZWNvdW50KSBcdTAwM2MgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGtzb2NrX3JlbGVhc2Vfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrICprcyA9XG4mIzQzO1x0XHRjb250YWluZXJfb2YodG9fcmN1X3dvcmsod29yayksIHN0cnVjdCBicGZfa3NvY2ssIHJ3b3JrKTtcbiYjNDM7XHRzdHJ1Y3QgbmV0ICpuZXQgPSBnZXRfbmV0KHNvY2tfbmV0KGtzLVx1MDAzZXNvY2stXHUwMDNlc2spKTtcbiYjNDM7XG4mIzQzO1x0c29ja19yZWxlYXNlKGtzLVx1MDAzZXNvY2spO1xuJiM0MztcdGJwZl9rc29ja19uZXRfdW5jaGFyZ2UobmV0KTtcbiYjNDM7XHRwdXRfbmV0KG5ldCk7XG4mIzQzO1x0a2ZyZWUoa3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJwZl9rc29ja19nZXRfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcbiYjNDM7XHRcdFx0ICAgICAgdTMyIG9wdHNfX3N6LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIG9wdHNfY29weTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFvcHRzIHx8IG9wdHNfX3N6ICE9IHNpemVvZigqb3B0cykpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0LyogS2Z1bmMgbWVtb3J5IGFyZ3VtZW50cyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgbmF0dXJhbGx5IGFsaWduZWQuICovXG4mIzQzO1x0bWVtY3B5KFx1MDAyNm9wdHNfY29weSwgb3B0cywgc2l6ZW9mKG9wdHNfY29weSkpO1xuJiM0MztcbiYjNDM7XHRpZiAob3B0c19jb3B5LnJlc2VydmVkKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAob3B0c19jb3B5LmZhbWlseSkge1xuJiM0MztcdGNhc2UgQUZfSU5FVDoge1xuJiM0MztcdFx0c3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyO1xuJiM0MztcbiYjNDM7XHRcdGlmIChvcHRzX2NvcHkuc2NvcGVfaWQpXG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRcdCphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4pe1xuJiM0MztcdFx0XHQuc2luX2ZhbWlseSA9IEFGX0lORVQsXG4mIzQzO1x0XHRcdC5zaW5fcG9ydCA9IGh0b25zKG9wdHNfY29weS5wb3J0KSxcbiYjNDM7XHRcdFx0LnNpbl9hZGRyLnNfYWRkciA9IG9wdHNfY29weS5pcHY0X2FkZHIsXG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0cmV0dXJuIHNpemVvZigqYWRkcjQpO1xuJiM0MztcdH1cbiYjNDM7I2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpXG4mIzQzO1x0Y2FzZSBBRl9JTkVUNjoge1xuJiM0MztcdFx0c3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7XG4mIzQzO1xuJiM0MztcdFx0KmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYpe1xuJiM0MztcdFx0XHQuc2luNl9mYW1pbHkgPSBBRl9JTkVUNixcbiYjNDM7XHRcdFx0LnNpbjZfcG9ydCA9IGh0b25zKG9wdHNfY29weS5wb3J0KSxcbiYjNDM7XHRcdFx0LnNpbjZfc2NvcGVfaWQgPSBvcHRzX2NvcHkuc2NvcGVfaWQsXG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0bWVtY3B5KFx1MDAyNmFkZHI2LVx1MDAzZXNpbjZfYWRkciwgb3B0c19jb3B5LmlwdjZfYWRkcixcbiYjNDM7XHRcdCAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7XG4mIzQzO1x0XHRyZXR1cm4gc2l6ZW9mKCphZGRyNik7XG4mIzQzO1x0fVxuJiM0MzsjZW5kaWZcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0cmV0dXJuIC1FQUZOT1NVUFBPUlQ7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRhc2sgd29yayBjYW4gcnVuIGZyb20gZG9fZXhpdCgpIGFmdGVyIGV4aXRfbnNwcm94eV9uYW1lc3BhY2VzKClcbiYjNDM7XHQgKiBjbGVhcmVkIGN1cnJlbnQtXHUwMDNlbnNwcm94eSwgd2hpbGUgY3VycmVudCBpcyBzdGlsbCBub3QgYSBrdGhyZWFkLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldHVybiAhKGN1cnJlbnQtXHUwMDNlZmxhZ3MgXHUwMDI2IFBGX0tUSFJFQUQpIFx1MDAyNlx1MDAyNiBjdXJyZW50LVx1MDAzZW5zcHJveHk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO19fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfa3NvY2tfY3JlYXRlKCkgLSBDcmVhdGUgYSBCUEYga2VybmVsIHNvY2tldC5cbiYjNDM7ICpcbiYjNDM7ICogQWxsb2NhdGVzIGFuZCBjcmVhdGVzIGEga2VybmVsIHNvY2tldC5cbiYjNDM7ICogVGhlIHNvY2tldCBpcyBjaGFyZ2VkIGFnYWluc3QgdGhlIGFjdGl2ZSBuZXR3b3JrIG5hbWVzcGFjZSYjMzk7cyBCUEYga2VybmVsXG4mIzQzOyAqIHNvY2tldCBxdW90YS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHJldHVybmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3JcbiYjNDM7ICogZnJlZWQgd2l0aCBicGZfa3NvY2tfcmVsZWFzZSgpLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCAoc29ja19jcmVhdGUpLCBzbyBpdCBjYW4gb25seSBiZSB1c2VkXG4mIzQzOyAqIGluIHNsZWVwYWJsZSBCUEYgcHJvZ3JhbXMgKFNZU0NBTEwpLlxuJiM0MzsgKiBJdCBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBCUEYgd29ya3F1ZXVlIGNhbGxiYWNrIGJlY2F1c2UgdGhhdCBjYWxsYmFja1xuJiM0MzsgKiBkb2VzIG5vdCByZXRhaW4gdGhlIGludm9raW5nIHRhc2smIzM5O3MgbmFtZXNwYWNlIG9yIHNlY3VyaXR5IGNvbnRleHQuXG4mIzQzOyAqXG4mIzQzOyAqIEBvcHRzOlx0UG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIHdpdGggc29ja2V0IHBhcmFtZXRlcnMuXG4mIzQzOyAqIEBvcHRzX19zejpcdFNpemUgb2YgdGhlIG9wdHMgc3RydWN0LlxuJiM0MzsgKiBAZXJyX191bmluaXQ6XHRJbnRlZ2VyIHRvIHN0b3JlIGVycm9yIGNvZGUgd2hlbiBOVUxMIGlzIHJldHVybmVkLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqXG4mIzQzO2JwZl9rc29ja19jcmVhdGUoY29uc3Qgc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6LFxuJiM0MztcdFx0IGludCAqZXJyX191bmluaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIG9wdHNfY29weTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcbiYjNDM7XHRzdHJ1Y3QgbmV0ICpuZXQ7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBzb2NrX2NyZWF0ZSgpIGRlcml2ZXMgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBjcmVkZW50aWFscywgYW5kIGNncm91cFxuJiM0MztcdCAqIGZyb20gY3VycmVudC4gS2VybmVsIHRocmVhZHMsIGluY2x1ZGluZyBCUEYgd29ya3F1ZXVlIGNhbGxiYWNrcywgZG9cbiYjNDM7XHQgKiBub3QgY2FycnkgdGhlIGNvbnRleHQgb2YgdGhlIHRhc2sgdGhhdCBpbnZva2VkIHRoZSBCUEYgcHJvZ3JhbS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSkge1xuJiM0MztcdFx0ZXJyID0gLUVPUE5PVFNVUFA7XG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIW9wdHMgfHwgb3B0c19fc3ogIT0gc2l6ZW9mKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpKSB7XG4mIzQzO1x0XHRlcnIgPSAtRUlOVkFMO1xuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0b3B0c19jb3B5ID0gKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpe1xuJiM0MztcdFx0LmZhbWlseSA9IFJFQURfT05DRShvcHRzLVx1MDAzZWZhbWlseSksXG4mIzQzO1x0XHQudHlwZSA9IFJFQURfT05DRShvcHRzLVx1MDAzZXR5cGUpLFxuJiM0MztcdFx0LnByb3RvY29sID0gUkVBRF9PTkNFKG9wdHMtXHUwMDNlcHJvdG9jb2wpLFxuJiM0MztcdFx0LnJlc2VydmVkID0gUkVBRF9PTkNFKG9wdHMtXHUwMDNlcmVzZXJ2ZWQpLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdGlmIChvcHRzX2NvcHkucmVzZXJ2ZWQpIHtcbiYjNDM7XHRcdGVyciA9IC1FSU5WQUw7XG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAob3B0c19jb3B5LmZhbWlseSAhPSBBRl9JTkVUIFx1MDAyNlx1MDAyNiBvcHRzX2NvcHkuZmFtaWx5ICE9IEFGX0lORVQ2KSB7XG4mIzQzO1x0XHRlcnIgPSAtRUFGTk9TVVBQT1JUO1xuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG9wdHNfY29weS50eXBlICE9IFNPQ0tfREdSQU0pIHtcbiYjNDM7XHRcdGVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7XG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAob3B0c19jb3B5LnByb3RvY29sICE9IElQUFJPVE9fVURQIFx1MDAyNlx1MDAyNiBvcHRzX2NvcHkucHJvdG9jb2wgIT0gMCkge1xuJiM0MztcdFx0ZXJyID0gLUVQUk9UT05PU1VQUE9SVDtcbiYjNDM7XHRcdGdvdG8gZXJyX291dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzID0ga3phbGxvY19vYmooKmtzKTtcbiYjNDM7XHRpZiAoIWtzKSB7XG4mIzQzO1x0XHRlcnIgPSAtRU5PTUVNO1xuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bmV0ID0gY3VycmVudC1cdTAwM2Vuc3Byb3h5LVx1MDAzZW5ldF9ucztcbiYjNDM7XHRpZiAoIWJwZl9rc29ja19uZXRfdHJ5X2NoYXJnZShuZXQpKSB7XG4mIzQzO1x0XHRlcnIgPSAtRU5PU1BDO1xuJiM0MztcdFx0Z290byBlcnJfZnJlZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVXNlIHRoZSBub3JtYWwgY3VycmVudC10YXNrIHNvY2tldCBwYXRoIHNvIExTTS9jZ3JvdXAgcG9saWN5LFxuJiM0MztcdCAqIHNvY2tldCBsYWJlbHMsIGFuZCB0aGUgYWN0aXZlIG5ldG5zIHJlZmVyZW5jZSBtYXRjaCBhIHNvY2tldCgyKVxuJiM0MztcdCAqIGNyZWF0ZWQgYnkgdGhlIEJQRiBwcm9ncmFtJiMzOTtzIGNhbGxlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRlcnIgPSBzb2NrX2NyZWF0ZShvcHRzX2NvcHkuZmFtaWx5LCBvcHRzX2NvcHkudHlwZSwgb3B0c19jb3B5LnByb3RvY29sLFxuJiM0MztcdFx0XHQgIFx1MDAyNmtzLVx1MDAzZXNvY2spO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRnb3RvIGVycl91bmNoYXJnZTtcbiYjNDM7XG4mIzQzO1x0a3MtXHUwMDNlc29jay1cdTAwM2Vzay1cdTAwM2Vza19yY3ZidWYgPSBTT0NLX01JTl9SQ1ZCVUY7XG4mIzQzO1x0a3MtXHUwMDNlc29jay1cdTAwM2Vzay1cdTAwM2Vza191c2VybG9ja3MgfD0gU09DS19SQ1ZCVUZfTE9DSztcbiYjNDM7XG4mIzQzO1x0cmVmY291bnRfc2V0KFx1MDAyNmtzLVx1MDAzZXVzYWdlLCAxKTtcbiYjNDM7XHRwdXRfdW5hbGlnbmVkKDAsIGVycl9fdW5pbml0KTtcbiYjNDM7XHRyZXR1cm4ga3M7XG4mIzQzO1xuJiM0MztlcnJfdW5jaGFyZ2U6XG4mIzQzO1x0YnBmX2tzb2NrX25ldF91bmNoYXJnZShuZXQpO1xuJiM0MztlcnJfZnJlZTpcbiYjNDM7XHRrZnJlZShrcyk7XG4mIzQzO2Vycl9vdXQ6XG4mIzQzO1x0cHV0X3VuYWxpZ25lZChlcnIsIGVycl9fdW5pbml0KTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9rc29ja19iaW5kKCkgLSBCaW5kIGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNzLlxuJiM0MzsgKiBAa3M6XHRcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LlxuJiM0MzsgKiBAb3B0czpcdFBvaW50ZXIgdG8gc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgd2l0aCBsb2NhbCBhZGRyZXNzLlxuJiM0MzsgKiBAb3B0c19fc3o6XHRTaXplIG9mIHRoZSBvcHRzIHN0cnVjdC5cbiYjNDM7ICpcbiYjNDM7ICogQmluZHMgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQuXG4mIzQzOyAqIFRoaXMgaXMgb3B0aW9uYWw7IGlmIG5vdCBjYWxsZWQsIHRoZSBrZXJuZWwgd2lsbCBhdXRvLWFzc2lnbi5cbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgd2hpbGUgYmluZGluZyB0aGUgc29ja2V0LCBzbyBpdCBjYW4gb25seSBiZSB1c2VkIGluXG4mIzQzOyAqIHNsZWVwYWJsZSBCUEYgcHJvZ3JhbXMgKFNZU0NBTEwpLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXG4mIzQzO1x0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcbiYjNDM7XHRcdFx0ICAgICAgIHUzMiBvcHRzX19zeilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHIgPSB7fTtcbiYjNDM7XHRpbnQgYWRkcmxlbjtcbiYjNDM7XG4mIzQzO1x0aWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1xuJiM0MztcdGFkZHJsZW4gPSBicGZfa3NvY2tfZ2V0X2FkZHIob3B0cywgb3B0c19fc3osIFx1MDAyNmFkZHIpO1xuJiM0MztcdGlmIChhZGRybGVuIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGFkZHJsZW47XG4mIzQzO1xuJiM0MztcdHJldHVybiBfX3N5c19iaW5kX3NvY2tldChrcy1cdTAwM2Vzb2NrLCBcdTAwMjZhZGRyLCBhZGRybGVuKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9rc29ja19jb25uZWN0KCkgLSBDb25uZWN0IGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSByZW1vdGUgYWRkcmVzcy5cbiYjNDM7ICogQGtzOlx0XHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dC5cbiYjNDM7ICogQG9wdHM6XHRQb2ludGVyIHRvIHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHdpdGggcmVtb3RlIGFkZHJlc3MuXG4mIzQzOyAqIEBvcHRzX19zejpcdFNpemUgb2YgdGhlIG9wdHMgc3RydWN0LlxuJiM0MzsgKlxuJiM0MzsgKiBDb25uZWN0cyB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGFkZHJlc3MgYW5kIHBvcnQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIHdoaWxlIGNvbm5lY3RpbmcgdGhlIHNvY2tldCwgc28gaXQgY2FuIG9ubHkgYmUgdXNlZFxuJiM0MzsgKiBpbiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19jb25uZWN0KHN0cnVjdCBicGZfa3NvY2sgKmtzLFxuJiM0MztcdFx0XHRcdCAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsXG4mIzQzO1x0XHRcdFx0ICB1MzIgb3B0c19fc3opXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyID0ge307XG4mIzQzO1x0aW50IGFkZHJsZW47XG4mIzQzO1xuJiM0MztcdGlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRhZGRybGVuID0gYnBmX2tzb2NrX2dldF9hZGRyKG9wdHMsIG9wdHNfX3N6LCBcdTAwMjZhZGRyKTtcbiYjNDM7XHRpZiAoYWRkcmxlbiBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiBhZGRybGVuO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoa3MtXHUwMDNlc29jaywgXHUwMDI2YWRkciwgYWRkcmxlbiwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfa3NvY2tfYWNxdWlyZSgpIC0gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byBhIEJQRiBrZXJuZWwgc29ja2V0LlxuJiM0MzsgKiBAa3M6XHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byBhY3F1aXJlLiBNdXN0IGJlIGFcbiYjNDM7ICpcdHRydXN0ZWQgcG9pbnRlciAoZS5nLiBSQ1UtcHJvdGVjdGVkIGtwdHIgZnJvbSBhIG1hcCkuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBhY3F1aXJlZCBjb250ZXh0IG11c3QgZWl0aGVyIGJlIHN0b3JlZCBpbiBhIG1hcCBhcyBhIGtwdHIsIG9yXG4mIzQzOyAqIGZyZWVkIHdpdGggYnBmX2tzb2NrX3JlbGVhc2UoKS5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHN0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19hY3F1aXJlKHN0cnVjdCBicGZfa3NvY2sgKmtzKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFyZWZjb3VudF9pbmNfbm90X3plcm8oXHUwMDI2a3MtXHUwMDNldXNhZ2UpKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0cmV0dXJuIGtzO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2tzb2NrX3JlbGVhc2UoKSAtIFJlbGVhc2UgYSBCUEYga2VybmVsIHNvY2tldC5cbiYjNDM7ICogQGtzOlx0VGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQgdG8gcmVsZWFzZS5cbiYjNDM7ICpcbiYjNDM7ICogV2hlbiB0aGUgZmluYWwgcmVmZXJlbmNlIGlzIHJlbGVhc2VkLCB0aGUgc29ja2V0IGlzIGNsZWFuZWQgdXAgdmlhXG4mIzQzOyAqIHF1ZXVlX3JjdV93b3JrKCkgKHNpbmNlIHNvY2tfcmVsZWFzZSBtYXkgc2xlZXApLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcylcbiYjNDM7e1xuJiM0MztcdGlmIChyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2a3MtXHUwMDNldXNhZ2UpKSB7XG4mIzQzO1x0XHRJTklUX1JDVV9XT1JLKFx1MDAyNmtzLVx1MDAzZXJ3b3JrLCBrc29ja19yZWxlYXNlX3dvcmtfZm4pO1xuJiM0MztcdFx0cXVldWVfcmN1X3dvcmsoc3lzdGVtX2RmbF93cSwgXHUwMDI2a3MtXHUwMDNlcndvcmspO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfa3NvY2tfcmVsZWFzZV9kdG9yKHZvaWQgKmtzKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuJiM0Mzt9XG4mIzQzO0NGSV9OT1NFQUwoYnBmX2tzb2NrX3JlbGVhc2VfZHRvcik7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2tzb2NrX3NlbmQoKSAtIFNlbmQgZGF0YSB0aHJvdWdoIGEgQlBGIGtlcm5lbCBzb2NrZXQuXG4mIzQzOyAqIEBrczpcdFx0VGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQuIE11c3QgYmUgYW4gYWNxdWlyZWQgcmVmZXJlbmNlLlxuJiM0MzsgKiBAZGF0YTpcdFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gc2VuZC5cbiYjNDM7ICogQGRhdGFfX3N6Olx0U2l6ZSBvZiB0aGUgZGF0YSB0byBzZW5kIChtYXggNjU1MzUgYnl0ZXMpLlxuJiM0MzsgKlxuJiM0MzsgKiBTZW5kcyBkYXRhIG9uIGEgY29ubmVjdGVkIHNvY2tldCwgYmVzdC1lZmZvcnQgYW5kIG5vbmJsb2NraW5nLiBUaGlzIG1heSBzbGVlcFxuJiM0MzsgKiAoa2VybmVsX3NlbmRtc2cpLCBzbyBpdCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBzbGVlcGFibGUgQlBGIHByb2dyYW1zLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IE51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLlxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19zZW5kKHN0cnVjdCBicGZfa3NvY2sgKmtzLCBjb25zdCB2b2lkICpkYXRhLFxuJiM0MztcdFx0XHQgICAgICAgdTMyIGRhdGFfX3N6KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkIGd1YXJkO1xuJiM0MztcdHN0cnVjdCBtc2doZHIgbXNnID0ge1xuJiM0MztcdFx0Lm1zZ19mbGFncyA9IE1TR19ET05UV0FJVCxcbiYjNDM7XHR9O1xuJiM0MztcdHN0cnVjdCBrdmVjIGlvdiA9IHtcbiYjNDM7XHRcdC5pb3ZfYmFzZSA9ICh2b2lkICopZGF0YSxcbiYjNDM7XHRcdC5pb3ZfbGVuID0gZGF0YV9fc3osXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0LyogRWFybHkgY2hlY2sgZm9yIFVEUC4gRXhhY3QgbGltaXRzIGVuZm9yY2VkIGJ5IGtlcm5lbF9zZW5kbXNnKCkuICovXG4mIzQzO1x0aWYgKGRhdGFfX3N6IFx1MDAzZSBJUF9NQVhfTVRVKVxuJiM0MztcdFx0cmV0dXJuIC1FTVNHU0laRTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFicGZfa3NvY2tfc2VuZF9lbnRlcihcdTAwMjZndWFyZCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBrZXJuZWxfc2VuZG1zZyhrcy1cdTAwM2Vzb2NrLCBcdTAwMjZtc2csIFx1MDAyNmlvdiwgMSwgZGF0YV9fc3opO1xuJiM0MztcdGJwZl9rc29ja19zZW5kX2V4aXQoXHUwMDI2Z3VhcmQpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuJiM0MztcbiYjNDM7QlRGX0tGVU5DU19TVEFSVChrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfY3JlYXRlLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9TTEVFUEFCTEUpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfYmluZCwgS0ZfU0xFRVBBQkxFKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2Nvbm5lY3QsIEtGX1NMRUVQQUJMRSlcbiYjNDM7QlRGX0tGVU5DU19FTkQoa3NvY2tfaW5pdF9rZnVuY19idGZfaWRzKVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGtzb2NrX2luaXRfa2Z1bmNfc2V0ID0ge1xuJiM0MztcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuJiM0MztcdC5zZXQgPSBcdTAwMjZrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMsXG4mIzQzO307XG4mIzQzO1xuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGtzb2NrX2tmdW5jX2J0Zl9pZHMpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfcmVsZWFzZSwgS0ZfUkVMRUFTRSlcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19hY3F1aXJlLCBLRl9BQ1FVSVJFIHwgS0ZfUkNVIHwgS0ZfUkVUX05VTEwpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfc2VuZCwgS0ZfU0xFRVBBQkxFKVxuJiM0MztCVEZfS0ZVTkNTX0VORChrc29ja19rZnVuY19idGZfaWRzKVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBicGZfa3NvY2tfa2Z1bmNfZmlsdGVyKGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdTMyIGtmdW5jX2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFidGZfaWRfc2V0OF9jb250YWlucyhcdTAwMjZrc29ja19rZnVuY19idGZfaWRzLCBrZnVuY19pZCkgfHxcbiYjNDM7XHQgICAgcHJvZy1cdTAwM2V0eXBlID09IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCB8fFxuJiM0MztcdCAgICBwcm9nLVx1MDAzZXR5cGUgPT0gQlBGX1BST0dfVFlQRV9MU00pXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIC1FQUNDRVM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBrc29ja19rZnVuY19zZXQgPSB7XG4mIzQzO1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4mIzQzO1x0LnNldCA9IFx1MDAyNmtzb2NrX2tmdW5jX2J0Zl9pZHMsXG4mIzQzO1x0LmZpbHRlciA9IGJwZl9rc29ja19rZnVuY19maWx0ZXIsXG4mIzQzO307XG4mIzQzO1xuJiM0MztCVEZfSURfTElTVChicGZfa3NvY2tfZHRvcl9pZHMpXG4mIzQzO0JURl9JRChzdHJ1Y3QsIGJwZl9rc29jaylcbiYjNDM7QlRGX0lEKGZ1bmMsIGJwZl9rc29ja19yZWxlYXNlX2R0b3IpXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBicGZfa3NvY2tfa2Z1bmNfaW5pdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgYnRmX2lkX2R0b3Jfa2Z1bmMgYnBmX2tzb2NrX2R0b3JzW10gPSB7XG4mIzQzO1x0XHR7XG4mIzQzO1x0XHRcdC5idGZfaWQgPSBicGZfa3NvY2tfZHRvcl9pZHNbMF0sXG4mIzQzO1x0XHRcdC5rZnVuY19idGZfaWQgPSBicGZfa3NvY2tfZHRvcl9pZHNbMV0sXG4mIzQzO1x0XHR9LFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoXHUwMDI2YnBmX2tzb2NrX25ldF9vcHMpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcbiYjNDM7XHRcdFx0XHRcdFx1MDAyNmtzb2NrX2luaXRfa2Z1bmNfc2V0KTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHR1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoXHUwMDI2YnBmX2tzb2NrX25ldF9vcHMpO1xuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuJiM0MztcdFx0XHRcdFx0XHUwMDI2a3NvY2tfa2Z1bmNfc2V0KTtcbiYjNDM7XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xTTSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBcdTAwMjZrc29ja19rZnVuY19zZXQpO1xuJiM0MztcdHJldHVybiByZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGJwZl9rc29ja19kdG9ycyxcbiYjNDM7XHRcdFx0XHRcdFx0IEFSUkFZX1NJWkUoYnBmX2tzb2NrX2R0b3JzKSxcbiYjNDM7XHRcdFx0XHRcdFx0IFRISVNfTU9EVUxFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfa3NvY2tfa2Z1bmNfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMgYi9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuY1xuaW5kZXggYjUwODYxOGJmYzEyMzkuLmQyMjFhMTgwYzg3NzA1IDEwMDY0NFxuLS0tIGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jXG5AQCAtNyw2ICYjNDM7Nyw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsdGVyLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnBmX2tzb2NrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc3lzY3RsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuQEAgLTUyNSw2ICYjNDM7NTI2LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5ldF9jb3JlX3RhYmxlW10gPSB7XG4gXHRcdC5leHRyYTFcdFx0PSBTWVNDVExfTE9OR19PTkUsXG4gXHRcdC5leHRyYTJcdFx0PSBcdTAwMjZicGZfaml0X2xpbWl0X21heCxcbiBcdH0sXG4mIzQzOyNlbmRpZlxuJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NZU0NBTEwpIFx1MDAyNlx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19JTkVUKVxuJiM0MztcdHtcbiYjNDM7XHRcdC5wcm9jbmFtZVx0PSBcJiMzNDticGZfa3NvY2tfbWF4XCYjMzQ7LFxuJiM0MztcdFx0LmRhdGFcdFx0PSBcdTAwMjZzeXNjdGxfYnBmX2tzb2NrX21heCxcbiYjNDM7XHRcdC5tYXhsZW5cdFx0PSBzaXplb2YoaW50KSxcbiYjNDM7XHRcdC5tb2RlXHRcdD0gMDY0NCxcbiYjNDM7XHRcdC5wcm9jX2hhbmRsZXJcdD0gcHJvY19kb2ludHZlY19taW5tYXgsXG4mIzQzO1x0XHQuZXh0cmExXHRcdD0gU1lTQ1RMX1pFUk8sXG4mIzQzO1x0fSxcbiAjZW5kaWZcbiBcdHtcbiBcdFx0LnByb2NuYW1lXHQ9IFwmIzM0O25ldGRldl90c3RhbXBfcHJlcXVldWVcJiMzNDssXG5kaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jXG5pbmRleCA2M2M2OWEwZmE3NGUxZS4uYzc0MjdkZDRkZDUyM2QgMTAwNjQ0XG4tLS0gYS9uZXQvc29ja2V0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zb2NrZXQuY1xuQEAgLTIxMTUsMjcgJiM0MzsyMTE1LDMxIEBAIFNZU0NBTExfREVGSU5FMyhhY2NlcHQsIGludCwgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgdXBlZXJfc29ja2FkZHIsXG4gICpcdGluY2x1ZGUgdGhlIC1FSU5QUk9HUkVTUyBzdGF0dXMgZm9yIHN1Y2ggc29ja2V0cy5cbiAgKi9cbiBcbiYjNDM7aW50IF9fc3lzX2Nvbm5lY3Rfc29ja2V0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxuJiM0MztcdFx0XHQgaW50IGFkZHJsZW4sIGludCBmbGFncylcbiYjNDM7e1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIFJFQURfT05DRShzb2NrLVx1MDAzZW9wcyktXHUwMDNlY29ubmVjdChzb2NrLFxuJiM0MztcdFx0XHRcdCAgICAoc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKilhZGRyZXNzLFxuJiM0MztcdFx0XHRcdCAgICBhZGRybGVuLCBmbGFncyk7XG4mIzQzO31cbiYjNDM7XG4gaW50IF9fc3lzX2Nvbm5lY3RfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHJlc3MsXG4gXHRcdCAgICAgICBpbnQgYWRkcmxlbiwgaW50IGZpbGVfZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHNvY2tldCAqc29jaztcbi1cdGludCBlcnI7XG4gXG4gXHRzb2NrID0gc29ja19mcm9tX2ZpbGUoZmlsZSk7XG4tXHRpZiAoIXNvY2spIHtcbi1cdFx0ZXJyID0gLUVOT1RTT0NLO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGVyciA9XG4tXHQgICAgc2VjdXJpdHlfc29ja2V0X2Nvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsIGFkZHJsZW4pO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFzb2NrKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9UU09DSztcbiBcbi1cdGVyciA9IFJFQURfT05DRShzb2NrLVx1MDAzZW9wcyktXHUwMDNlY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKilhZGRyZXNzLFxuLVx0XHRcdFx0XHQgICAgYWRkcmxlbiwgc29jay1cdTAwM2VmaWxlLVx1MDAzZWZfZmxhZ3MgfCBmaWxlX2ZsYWdzKTtcbi1vdXQ6XG4tXHRyZXR1cm4gZXJyO1xuJiM0MztcdHJldHVybiBfX3N5c19jb25uZWN0X3NvY2tldChzb2NrLCBhZGRyZXNzLCBhZGRybGVuLFxuJiM0MztcdFx0XHRcdCAgICBzb2NrLVx1MDAzZWZpbGUtXHUwMDNlZl9mbGFncyB8IGZpbGVfZmxhZ3MpO1xuIH1cbiBcbiBpbnQgX19zeXNfY29ubmVjdChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzZXJ2YWRkciwgaW50IGFkZHJsZW4pXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOGIxNGZkOThkNDEwZWRcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcbkBAIC0wLDAgJiM0MzsxLDIzOSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NhcnBhL2luZXQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dGVzdF9wcm9ncy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O25ldHdvcmtfaGVscGVycy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzb2NrX2Jhc2ljLnNrZWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc29ja19yZWN1cnNpb24uc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIE5TX1RFU1QgXCYjMzQ7a3NvY2tfYmFzaWNfbnNcJiMzNDtcbiYjNDM7I2RlZmluZSBOU19MU01fUkVDVVJTSU9OX1RFU1QgXCYjMzQ7a3NvY2tfbHNtX3JlY3Vyc2lvbl9uc1wmIzM0O1xuJiM0MzsjZGVmaW5lIExPT1BCQUNLX0lQIFwmIzM0OzEyNy4wLjAuMVwmIzM0O1xuJiM0MzsjZGVmaW5lIFJFQ1ZfUE9SVCA3Nzc3XG4mIzQzOyNkZWZpbmUgUkVDVl9USU1FT1VUX1NFQyA1XG4mIzQzO1xuJiM0MztzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYge1xuJiM0MztcdGNvbnN0IGNoYXIgKm5ldG5zO1xuJiM0MztcdGJvb2wgbmV0bnNfY3JlYXRlZDtcbiYjNDM7XHRzdHJ1Y3QgbnN0b2tlbiAqbnN0b2tlbjtcbiYjNDM7XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjtcbiYjNDM7XHRpbnQgcmZkO1xuJiM0MztcdGNoYXIgYnVmWzMyXTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGtzb2NrX3Rlc3RfZW52X3NldHVwKHN0cnVjdCBrc29ja190ZXN0X2VudiAqZW52LCBjb25zdCBjaGFyICpuZXRucylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aW1ldmFsIHR2O1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdG1lbXNldChlbnYsIDAsIHNpemVvZigqZW52KSk7XG4mIzQzO1x0ZW52LVx1MDAzZW5ldG5zID0gbmV0bnM7XG4mIzQzO1x0ZW52LVx1MDAzZXJmZCA9IC0xO1xuJiM0MztcbiYjNDM7XHRTWVMoZmFpbCwgXCYjMzQ7aXAgbmV0bnMgYWRkICVzXCYjMzQ7LCBuZXRucyk7XG4mIzQzO1x0ZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQgPSB0cnVlO1xuJiM0MztcdFNZUyhmYWlsLCBcJiMzNDtpcCAtbmV0ICVzIGxpbmsgc2V0IGxvIHVwXCYjMzQ7LCBuZXRucyk7XG4mIzQzO1xuJiM0MztcdGVudi1cdTAwM2Vuc3Rva2VuID0gb3Blbl9uZXRucyhuZXRucyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGVudi1cdTAwM2Vuc3Rva2VuLCBcJiMzNDtvcGVuX25ldG5zXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0ZW52LVx1MDAzZXJmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZW52LVx1MDAzZXJmZCwgXCYjMzQ7cmVjZWl2ZXIgc29ja2V0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0ZW52LVx1MDAzZWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7XG4mIzQzO1x0ZW52LVx1MDAzZWFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTtcbiYjNDM7XHRlbnYtXHUwMDNlYWRkci5zaW5fcG9ydCA9IGh0b25zKFJFQ1ZfUE9SVCk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJpbmQoZW52LVx1MDAzZXJmZCwgKHN0cnVjdCBzb2NrYWRkciAqKVx1MDAyNmVudi1cdTAwM2VhZGRyLCBzaXplb2YoZW52LVx1MDAzZWFkZHIpKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2JpbmQgcmVjZWl2ZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHR0di50dl9zZWMgPSBSRUNWX1RJTUVPVVRfU0VDO1xuJiM0MztcdHR2LnR2X3VzZWMgPSAwO1xuJiM0MztcdGVyciA9IHNldHNvY2tvcHQoZW52LVx1MDAzZXJmZCwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sIFx1MDAyNnR2LCBzaXplb2YodHYpKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldCByY3Z0aW1lb1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0MztcbiYjNDM7ZmFpbDpcbiYjNDM7XHRpZiAoZW52LVx1MDAzZXJmZCBcdTAwM2U9IDApIHtcbiYjNDM7XHRcdGNsb3NlKGVudi1cdTAwM2VyZmQpO1xuJiM0MztcdFx0ZW52LVx1MDAzZXJmZCA9IC0xO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoZW52LVx1MDAzZW5zdG9rZW4pIHtcbiYjNDM7XHRcdGNsb3NlX25ldG5zKGVudi1cdTAwM2Vuc3Rva2VuKTtcbiYjNDM7XHRcdGVudi1cdTAwM2Vuc3Rva2VuID0gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGVudi1cdTAwM2VuZXRuc19jcmVhdGVkKSB7XG4mIzQzO1x0XHRTWVNfTk9GQUlMKFwmIzM0O2lwIG5ldG5zIGRlbCAlcyBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjFcJiMzNDssIG5ldG5zKTtcbiYjNDM7XHRcdGVudi1cdTAwM2VuZXRuc19jcmVhdGVkID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQga3NvY2tfdGVzdF9lbnZfY2xlYW51cChzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudilcbiYjNDM7e1xuJiM0MztcdGlmIChlbnYtXHUwMDNlcmZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGVudi1cdTAwM2VyZmQpO1xuJiM0MztcdGlmIChlbnYtXHUwMDNlbnN0b2tlbilcbiYjNDM7XHRcdGNsb3NlX25ldG5zKGVudi1cdTAwM2Vuc3Rva2VuKTtcbiYjNDM7XHRpZiAoZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQpIHtcbiYjNDM7XHRcdFNZU19OT0ZBSUwoXCYjMzQ7aXAgbmV0bnMgZGVsICVzIFx1MDAzZS9kZXYvbnVsbCAyXHUwMDNlXHUwMDI2MVwmIzM0OywgZW52LVx1MDAzZW5ldG5zKTtcbiYjNDM7XHRcdGVudi1cdTAwM2VuZXRuc19jcmVhdGVkID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBrc29ja19hc3NlcnRfcmVjdihzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudiwgY29uc3QgY2hhciAqZGF0YSxcbiYjNDM7XHRcdFx0ICAgICAgc2l6ZV90IGRhdGFfc3opXG4mIzQzO3tcbiYjNDM7XHRzc2l6ZV90IG47XG4mIzQzO1xuJiM0MztcdG1lbXNldChlbnYtXHUwMDNlYnVmLCAwLCBzaXplb2YoZW52LVx1MDAzZWJ1ZikpO1xuJiM0MztcdG4gPSByZWN2ZnJvbShlbnYtXHUwMDNlcmZkLCBlbnYtXHUwMDNlYnVmLCBzaXplb2YoZW52LVx1MDAzZWJ1ZiksIDAsIE5VTEwsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKG4sIGRhdGFfc3osIFwmIzM0O3JlY3Zmcm9tIGxlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0QVNTRVJUX01FTUVRKGVudi1cdTAwM2VidWYsIGRhdGEsIGRhdGFfc3osIFwmIzM0O3BheWxvYWQgbWF0Y2hcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBrc29ja19zZXR1cF9jdHgoc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nLCBfX2JlMzIgKmlwdjRfcmVtb3RlLFxuJiM0MztcdFx0XHQgICAgX191MTYgKnJlbW90ZV9wb3J0KVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuJiM0MztcdGludCBlcnIsIHBmZDtcbiYjNDM7XG4mIzQzO1x0KmlwdjRfcmVtb3RlID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTtcbiYjNDM7XHQqcmVtb3RlX3BvcnQgPSBSRUNWX1BPUlQ7XG4mIzQzO1xuJiM0MztcdHBmZCA9IGJwZl9wcm9ncmFtX19mZChwcm9nKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChwZmQsIFwmIzM0O2tzb2NrX3NldHVwIGZkXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwZmQsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7a3NvY2tfc2V0dXAgcnVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhvcHRzLnJldHZhbCwgXCYjMzQ7a3NvY2tfc2V0dXAgcmV0dmFsXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9rc29ja19iYXNpYyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuJiM0MztcdHN0cnVjdCBrc29ja190ZXN0X2VudiBlbnY7XG4mIzQzO1x0c3RydWN0IGtzb2NrX2Jhc2ljICpza2VsO1xuJiM0MztcdGludCBlcnIsIHBmZDtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGtzb2NrX2Jhc2ljX19vcGVuKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O3NrZWwgb3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IGtzb2NrX2Jhc2ljX19sb2FkKHNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2tlbCBsb2FkXCYjMzQ7KSkge1xuJiM0MztcdFx0a3NvY2tfYmFzaWNfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIWtzb2NrX3Rlc3RfZW52X3NldHVwKFx1MDAyNmVudiwgTlNfVEVTVCkpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgMTogUnVuIHRoZSBzZXR1cCBTWVNDQUxMIHByb2cgdG8gY3JlYXRlIGtzb2NrICovXG4mIzQzO1x0aWYgKCFrc29ja19zZXR1cF9jdHgoc2tlbC1cdTAwM2Vwcm9ncy5rc29ja19zZXR1cCxcbiYjNDM7XHRcdFx0ICAgICBcdTAwMjZza2VsLVx1MDAzZWJzcy1cdTAwM2VpcHY0X3JlbW90ZSxcbiYjNDM7XHRcdFx0ICAgICBcdTAwMjZza2VsLVx1MDAzZWJzcy1cdTAwM2VyZW1vdGVfcG9ydCkpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgMjogUnVuIHRoZSBzZW5kIFNZU0NBTEwgcHJvZyAqL1xuJiM0MztcdHBmZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLmtzb2NrX3NlbmQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKHBmZCwgXCYjMzQ7a3NvY2tfc2VuZCBmZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocGZkLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2tzb2NrX3NlbmQgcnVuXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShvcHRzLnJldHZhbCxcbiYjNDM7XHRcdCAgICAgICBzaXplb2Yoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSksIFwmIzM0O3NlbmRtc2cgYnl0ZXNcJiMzNDspKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBTdGVwIDM6IFJlY2VpdmUgYW5kIHZlcmlmeSB0aGUgZGF0YSAqL1xuJiM0MztcdGtzb2NrX2Fzc2VydF9yZWN2KFx1MDAyNmVudiwgc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSxcbiYjNDM7XHRcdFx0ICBzaXplb2Yoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSkpO1xuJiM0MztcbiYjNDM7ZmFpbDpcbiYjNDM7XHRrc29ja190ZXN0X2Vudl9jbGVhbnVwKFx1MDAyNmVudik7XG4mIzQzO1x0a3NvY2tfYmFzaWNfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9rc29ja19sc21fcmVjdXJzaW9uKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgZW52O1xuJiM0MztcdHN0cnVjdCBrc29ja19yZWN1cnNpb24gKnNrZWw7XG4mIzQzO1x0Y2hhciB0cmlnZ2VyID0gJiMzOTt4JiMzOTs7XG4mIzQzO1x0aW50IHRmZCA9IC0xO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1x0c3NpemVfdCBuO1xuJiM0MztcbiYjNDM7XHRza2VsID0ga3NvY2tfcmVjdXJzaW9uX19vcGVuKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O3NrZWwgb3BlblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IGtzb2NrX3JlY3Vyc2lvbl9fbG9hZChza2VsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NrZWwgbG9hZFwmIzM0OykpIHtcbiYjNDM7XHRcdGtzb2NrX3JlY3Vyc2lvbl9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoXHUwMDI2ZW52LCBOU19MU01fUkVDVVJTSU9OX1RFU1QpKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBTdGVwIDE6IFJ1biB0aGUgc2V0dXAgU1lTQ0FMTCBwcm9nIHRvIGNyZWF0ZSB0aGUga3NvY2sgKi9cbiYjNDM7XHRpZiAoIWtzb2NrX3NldHVwX2N0eChza2VsLVx1MDAzZXByb2dzLmtzb2NrX3NldHVwLFxuJiM0MztcdFx0XHQgICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZWlwdjRfcmVtb3RlLFxuJiM0MztcdFx0XHQgICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlbW90ZV9wb3J0KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0LyogU3RlcCAyOiBBdHRhY2ggTFNNIHByb2cgYW5kIHRyaWdnZXIgc29ja2V0X3NlbmRtc2cgZnJvbSB1c2Vyc3BhY2UgKi9cbiYjNDM7XHRza2VsLVx1MDAzZWxpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnID1cbiYjNDM7XHRcdGJwZl9wcm9ncmFtX19hdHRhY2hfbHNtKHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfc29ja2V0X3NlbmRtc2cpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLVx1MDAzZWxpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnLFxuJiM0MztcdFx0XHQgICBcJiMzNDthdHRhY2ggc29ja2V0X3NlbmRtc2cgbHNtXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0dGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRCh0ZmQsIFwmIzM0O3RyaWdnZXIgc29ja2V0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X3BpZCA9IGdldHBpZCgpO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRyaWdnZXJfc2VuZCA9IDE7XG4mIzQzO1x0biA9IHNlbmR0byh0ZmQsIFx1MDAyNnRyaWdnZXIsIHNpemVvZih0cmlnZ2VyKSwgMCxcbiYjNDM7XHRcdCAgIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZlbnYuYWRkciwgc2l6ZW9mKGVudi5hZGRyKSk7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X3BpZCA9IDA7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldHJpZ2dlcl9zZW5kID0gMDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShuLCBzaXplb2YodHJpZ2dlciksIFwmIzM0O3RyaWdnZXIgc2VuZHRvXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XG4mIzQzO1x0LyogU3RlcCAzOiBUaGUgbmVzdGVkIGJwZl9rc29ja19zZW5kKCkgbXVzdCBoaXQgdGhlIHJlY3Vyc2lvbiBndWFyZCAqL1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY19jb3VudCwgMixcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtzb2NrZXRfc2VuZG1zZyByZWN1cnNpb24gY291bnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlZGF0YS1cdTAwM2VyZWNfa2Z1bmNfcmV0c1swXSwgLUVCVVNZLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3JlY3Vyc2l2ZSBzZW5kIHN0YXR1c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXJlY19rZnVuY19yZXRzWzFdLFxuJiM0MztcdFx0ICAgICAgIHNpemVvZihza2VsLVx1MDAzZWRhdGEtXHUwMDNlc2VuZF9kYXRhKSwgXCYjMzQ7b3V0ZXIgc2VuZCBieXRlc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdGtzb2NrX2Fzc2VydF9yZWN2KFx1MDAyNmVudiwgc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSxcbiYjNDM7XHRcdFx0ICBzaXplb2Yoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSkpO1xuJiM0MztcbiYjNDM7ZmFpbDpcbiYjNDM7XHRpZiAodGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKHRmZCk7XG4mIzQzO1x0a3NvY2tfdGVzdF9lbnZfY2xlYW51cChcdTAwMjZlbnYpO1xuJiM0MztcdGtzb2NrX3JlY3Vyc2lvbl9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3F1b3RhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja19xdW90YS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmM4NmQ5YjBhOTUxM2U4XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja19xdW90YS5jXG5AQCAtMCwwICYjNDM7MSwxMzkgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dGVzdF9wcm9ncy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O25ldHdvcmtfaGVscGVycy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3N5c2N0bF9oZWxwZXJzLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NvY2tfcXVvdGEuc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIE5TX05FVF9RVU9UQV9URVNUMSBcJiMzNDtrc29ja19uZXRfcXVvdGFfbnMxXCYjMzQ7XG4mIzQzOyNkZWZpbmUgTlNfTkVUX1FVT1RBX1RFU1QyIFwmIzM0O2tzb2NrX25ldF9xdW90YV9uczJcJiMzNDtcbiYjNDM7I2RlZmluZSBLU09DS19NQVhfU1lTQ1RMIFwmIzM0Oy9wcm9jL3N5cy9uZXQvY29yZS9icGZfa3NvY2tfbWF4XCYjMzQ7XG4mIzQzOyNkZWZpbmUgS1NPQ0tfUVVPVEFfTlNfU0xPVFMgM1xuJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TMV9PRkZTRVQgMFxuJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQgS1NPQ0tfUVVPVEFfTlNfU0xPVFNcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQga3NvY2tfcnVuX3Byb2coc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHByb2cpLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHRyZXR1cm4gb3B0cy5yZXR2YWw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX3U2NCBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChzdHJ1Y3Qga3NvY2tfcXVvdGEgKnNrZWwpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gX19hdG9taWNfbG9hZF9uKFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3JlbGVhc2VfY29tcGxldGVkLFxuJiM0MztcdFx0XHQgICAgICAgX19BVE9NSUNfQUNRVUlSRSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQga3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhzdHJ1Y3Qga3NvY2tfcXVvdGEgKnNrZWwsIGludCBzbG90X29mZnNldClcbiYjNDM7e1xuJiM0MztcdF9fdTY0IGNvbXBsZXRlZDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRjb21wbGV0ZWQgPSBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKTtcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9zbG90X29mZnNldCA9IHNsb3Rfb2Zmc2V0O1xuJiM0MztcdGVyciA9IGtzb2NrX3J1bl9wcm9nKHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfcXVvdGFfcmVsZWFzZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtrc29ja19xdW90YV9yZWxlYXNlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGtzb2NrX3F1b3RhX3JlbGVhc2VfY29tcGxldGVkKHNrZWwpIC0gY29tcGxldGVkIFx1MDAzY1xuJiM0MztcdCAgICAgICBza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9yZWxlYXNlZClcbiYjNDM7XHRcdHVzbGVlcCgxMDAwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3JlbGVhc2VkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBrc29ja19leHBlY3RfcXVvdGEoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgc2xvdF9vZmZzZXQsXG4mIzQzO1x0XHRcdCAgICAgICBjb25zdCBjaGFyICpuYW1lKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNlcXVvdGFfc2xvdF9vZmZzZXQgPSBzbG90X29mZnNldDtcbiYjNDM7XHRlcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLVx1MDAzZXByb2dzLmtzb2NrX3F1b3RhX2NyZWF0ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBuYW1lKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9jcmVhdGVkLCAyLCBuYW1lKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRyZXR1cm4gQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX2VyciwgLUVOT1NQQywgbmFtZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHJlY29yZF9jdXJyZW50X25zKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCwgaW50IHRhcmdldClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzdGF0IHN0O1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGVyciA9IHN0YXQoXCYjMzQ7L3Byb2Mvc2VsZi9ucy9uZXRcJiMzNDssIFx1MDAyNnN0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3N0YXQgbmV0bnNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9uZXRuc19pbnVtW3RhcmdldF0gPSAoX191MzIpc3Quc3RfaW5vO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2tzb2NrX25ldF9xdW90YSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBvbGRfbWF4WzE2XSA9IHt9O1xuJiM0MztcdHN0cnVjdCBuZXRuc19vYmogKm5ldG5zMSA9IE5VTEwsICpuZXRuczIgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBrc29ja19xdW90YSAqc2tlbDtcbiYjNDM7XHRpbnQgcmVsZWFzZWQ7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBrc29ja19xdW90YV9fb3Blbl9hbmRfbG9hZCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtrc29jayBxdW90YSBza2VsZXRvblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0c2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZW50ZXIgPVxuJiM0MztcdFx0YnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLVx1MDAzZXByb2dzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlcik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtXHUwMDNlbGlua3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyLFxuJiM0MztcdFx0XHQgICBcJiMzNDthdHRhY2gga3NvY2sgcmVsZWFzZSB3b3JrIGVudHJ5XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdHNrZWwtXHUwMDNlbGlua3Mua3NvY2tfcmVsZWFzZV93b3JrX2V4aXQgPVxuJiM0MztcdFx0YnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLVx1MDAzZXByb2dzLmtzb2NrX3JlbGVhc2Vfd29ya19leGl0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCxcbiYjNDM7XHRcdFx0ICAgXCYjMzQ7YXR0YWNoIGtzb2NrIHJlbGVhc2Ugd29yayBleGl0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoc3lzY3RsX3NldF9vcl9mYWlsKEtTT0NLX01BWF9TWVNDVEwsIG9sZF9tYXgsIFwmIzM0OzJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdG5ldG5zMSA9IG5ldG5zX25ldyhOU19ORVRfUVVPVEFfVEVTVDEsIHRydWUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihuZXRuczEsIFwmIzM0O2NyZWF0ZSBmaXJzdCBuZXRuc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIXJlY29yZF9jdXJyZW50X25zKHNrZWwsIDApKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICgha3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMV9PRkZTRVQsXG4mIzQzO1x0XHRcdFx0XCYjMzQ7Zmlyc3QgbmV0bnMgcXVvdGFcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBob3N0LXdpZGUgc2V0dGluZyBncmFudHMgdGhlIGZ1bGwgYWxsb3dhbmNlIHRvIGVhY2ggbmV0bnMuICovXG4mIzQzO1x0bmV0bnMyID0gbmV0bnNfbmV3KE5TX05FVF9RVU9UQV9URVNUMiwgdHJ1ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMiwgXCYjMzQ7Y3JlYXRlIHNlY29uZCBuZXRuc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIXJlY29yZF9jdXJyZW50X25zKHNrZWwsIDEpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICgha3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQsXG4mIzQzO1x0XHRcdFx0XCYjMzQ7c2Vjb25kIG5ldG5zIHF1b3RhXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRyZWxlYXNlZCA9IGtzb2NrX3JlbGVhc2VfcXVvdGFfc2xvdHMoc2tlbCwgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEocmVsZWFzZWQsIDIsIFwmIzM0O3NlY29uZCBuZXRucyBxdW90YSByZWxlYXNlZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0LyogQm90aCByZWxlYXNlZCBzbG90cyBtdXN0IGJlY29tZSBhdmFpbGFibGUgYWdhaW4uICovXG4mIzQzO1x0a3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQsIFwmIzM0O3JlY292ZXJlZCBxdW90YVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0a3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTtcbiYjNDM7XHRrc29ja19yZWxlYXNlX3F1b3RhX3Nsb3RzKHNrZWwsIEtTT0NLX1FVT1RBX05TMV9PRkZTRVQpO1xuJiM0MztcdG5ldG5zX2ZyZWUobmV0bnMyKTtcbiYjNDM7XHRuZXRuc19mcmVlKG5ldG5zMSk7XG4mIzQzO1x0aWYgKG9sZF9tYXhbMF0pXG4mIzQzO1x0XHRzeXNjdGxfc2V0X29yX2ZhaWwoS1NPQ0tfTUFYX1NZU0NUTCwgTlVMTCwgb2xkX21heCk7XG4mIzQzO1x0a3NvY2tfcXVvdGFfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja193cS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xODRiMTM0ZjM4MjM3MFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuY1xuQEAgLTAsMCAmIzQzOzEsMzQgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3Rlc3RfcHJvZ3MuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc29ja193cS5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9rc29ja193cSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuJiM0MztcdHN0cnVjdCBrc29ja193cSAqc2tlbDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRza2VsID0ga3NvY2tfd3FfX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7a3NvY2tfd3Egb3BlbiBhbmQgbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfd3Ffc3RhcnQpLFxuJiM0MztcdFx0XHRcdCAgICAgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtydW4ga3NvY2tfd3Ffc3RhcnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0sob3B0cy5yZXR2YWwsIFwmIzM0O2tzb2NrX3dxX3N0YXJ0IHJldHZhbFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFfX2F0b21pY19sb2FkX24oXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNlY2FsbGJhY2tfZG9uZSwgX19BVE9NSUNfQUNRVUlSRSkpXG4mIzQzO1x0XHR1c2xlZXAoMTAwMCk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjcmVhdGVfZXJyLCAtRU9QTk9UU1VQUCxcbiYjNDM7XHRcdCAgXCYjMzQ7d29ya3F1ZXVlIGNyZWF0ZSByZWplY3RlZFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0a3NvY2tfd3FfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfYmFzaWMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjE4OWIwZmMxNTc3MDExXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfYmFzaWMuY1xuQEAgLTAsMCAmIzQzOzEsMzcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1saW51eC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfZW5kaWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX3RyYWNpbmdfbmV0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NvY2tfY29tbW9uLmhcJiMzNDtcbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQga3NvY2tfc2V0dXAodm9pZCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQga3NvY2tfc2VuZCh2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29jayAqa3M7XG4mIzQzO1x0aW50IHNlbmQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0diA9IGtzb2NrX2N0eF92YWx1ZV9sb29rdXAoKTtcbiYjNDM7XHRpZiAoIXYpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0a3MgPSBicGZfa3B0cl94Y2hnKFx1MDAyNnYtXHUwMDNlY3R4LCBOVUxMKTtcbiYjNDM7XHRpZiAoIWtzKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdHNlbmQgPSBicGZfa3NvY2tfc2VuZChrcywgc2VuZF9kYXRhLCBzaXplb2Yoc2VuZF9kYXRhKSk7XG4mIzQzO1x0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuJiM0MztcdHJldHVybiBzZW5kO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIF9fbGljZW5zZVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uN2NmNjQzMTliOTAxNDVcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19jb21tb24uaFxuQEAgLTAsMCAmIzQzOzEsMTEwIEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX0tTT0NLX0NPTU1PTl9IXG4mIzQzOyNkZWZpbmUgX0tTT0NLX0NPTU1PTl9IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtlcnJuby5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBTT0NLX1NUUkVBTVx0MVxuJiM0MzsjZGVmaW5lIFNPQ0tfREdSQU1cdDJcbiYjNDM7I2RlZmluZSBJUFBST1RPX1RDUFx0NlxuJiM0MzsjZGVmaW5lIElQUFJPVE9fVURQXHQxN1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2NyZWF0ZShjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzICpvcHRzLFxuJiM0MztcdFx0XHRcdCAgIHUzMiBvcHRzX19zeiwgaW50ICplcnJfX3VuaW5pdCkgX19rc3ltO1xuJiM0MztpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXG4mIzQzO1x0XHQgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6KSBfX2tzeW07XG4mIzQzO2ludCBicGZfa3NvY2tfY29ubmVjdChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcbiYjNDM7XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzICpvcHRzLCB1MzIgb3B0c19fc3opIF9fa3N5bTtcbiYjNDM7c3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2FjcXVpcmUoc3RydWN0IGJwZl9rc29jayAqa3MpIF9fa3N5bTtcbiYjNDM7dm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcykgX19rc3ltO1xuJiM0MztpbnQgYnBmX2tzb2NrX3NlbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXG4mIzQzO1x0XHQgICBjb25zdCB2b2lkICpkYXRhLCB1MzIgZGF0YV9fc3opIF9fa3N5bTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSB7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29jayBfX2twdHIgKiBjdHg7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuJiM0MztcdF9fdHlwZShrZXksIGludCk7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO30gX19rc29ja19jdHhfbWFwIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSAqa3NvY2tfY3R4X3ZhbHVlX2xvb2t1cCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0dTMyIGtleSA9IDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNl9fa3NvY2tfY3R4X21hcCwgXHUwMDI2a2V5KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQga3NvY2tfY3R4X2luc2VydChzdHJ1Y3QgYnBmX2tzb2NrICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgbG9jYWwsICp2O1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2sgKm9sZDtcbiYjNDM7XHR1MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRsb2NhbC5jdHggPSBOVUxMO1xuJiM0MztcdGVyciA9IGJwZl9tYXBfdXBkYXRlX2VsZW0oXHUwMDI2X19rc29ja19jdHhfbWFwLCBcdTAwMjZrZXksIFx1MDAyNmxvY2FsLCAwKTtcbiYjNDM7XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRicGZfa3NvY2tfcmVsZWFzZShjdHgpO1xuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHYgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNl9fa3NvY2tfY3R4X21hcCwgXHUwMDI2a2V5KTtcbiYjNDM7XHRpZiAoIXYpIHtcbiYjNDM7XHRcdGJwZl9rc29ja19yZWxlYXNlKGN0eCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG9sZCA9IGJwZl9rcHRyX3hjaGcoXHUwMDI2di1cdTAwM2VjdHgsIGN0eCk7XG4mIzQzO1x0aWYgKG9sZCkge1xuJiM0MztcdFx0YnBmX2tzb2NrX3JlbGVhc2Uob2xkKTtcbiYjNDM7XHRcdHJldHVybiAtRUVYSVNUO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIEdsb2JhbHMgZm9yIHBhc3NpbmcgY29uZmlnIGZyb20gdXNlcnNwYWNlICovXG4mIzQzO19fYmUzMiBpcHY0X3JlbW90ZTtcbiYjNDM7X191MTYgcmVtb3RlX3BvcnQ7XG4mIzQzO1xuJiM0MztjaGFyIHNlbmRfZGF0YVszMl0gPSBcJiMzNDtoZWxsbyBmcm9tIGJwZiBrc29ja1wmIzM0OztcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGRvX2tzb2NrX3NldHVwKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XG4mIzQzO1x0c3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgYWRkcl9vcHRzID0ge307XG4mIzQzO1x0c3RydWN0IGJwZl9rc29jayAqa3M7XG4mIzQzO1x0aW50IGVyciA9IDA7XG4mIzQzO1xuJiM0MztcdGNyZWF0ZV9vcHRzLmZhbWlseSA9IEFGX0lORVQ7XG4mIzQzO1x0Y3JlYXRlX29wdHMudHlwZSA9IFNPQ0tfREdSQU07XG4mIzQzO1x0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcbiYjNDM7XG4mIzQzO1x0a3MgPSBicGZfa3NvY2tfY3JlYXRlKFx1MDAyNmNyZWF0ZV9vcHRzLCBzaXplb2YoY3JlYXRlX29wdHMpLCBcdTAwMjZlcnIpO1xuJiM0MztcdGlmICgha3MpXG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcbiYjNDM7XHRhZGRyX29wdHMuZmFtaWx5ID0gQUZfSU5FVDtcbiYjNDM7XHRhZGRyX29wdHMucG9ydCA9IHJlbW90ZV9wb3J0O1xuJiM0MztcdGFkZHJfb3B0cy5pcHY0X2FkZHIgPSBpcHY0X3JlbW90ZTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gYnBmX2tzb2NrX2Nvbm5lY3Qoa3MsIFx1MDAyNmFkZHJfb3B0cywgc2l6ZW9mKGFkZHJfb3B0cykpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRlcnIgPSBrc29ja19jdHhfaW5zZXJ0KGtzKTtcbiYjNDM7XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVFWElTVClcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBfS1NPQ0tfQ09NTU9OX0ggKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19xdW90YS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjkxODU0ZWEzMzNjMTIxXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuY1xuQEAgLTAsMCAmIzQzOzEsMTY3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl90cmFjaW5nX25ldC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzb2NrX2NvbW1vbi5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TX1NMT1RTIDNcbiYjNDM7I2RlZmluZSBLU09DS19RVU9UQV9ORVROUyAyXG4mIzQzOyNkZWZpbmUgS1NPQ0tfUVVPVEFfU0xPVFMgKEtTT0NLX1FVT1RBX05TX1NMT1RTICogS1NPQ0tfUVVPVEFfTkVUTlMpXG4mIzQzO1xuJiM0MztzdHJ1Y3Qga3NvY2tfcXVvdGFfdmFsdWUge1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCB1MzIpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IGtzb2NrX3F1b3RhX3ZhbHVlKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIEtTT0NLX1FVT1RBX1NMT1RTKTtcbiYjNDM7fSBxdW90YV9tYXAgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCB1NjQpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgdTgpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgS1NPQ0tfUVVPVEFfU0xPVFMpO1xuJiM0Mzt9IHJlbGVhc2Vfd29ya2VycyBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7dTMyIHF1b3RhX2NyZWF0ZWQ7XG4mIzQzO3UzMiBxdW90YV9yZWxlYXNlZDtcbiYjNDM7dTMyIHF1b3RhX3Nsb3Rfb2Zmc2V0O1xuJiM0Mzt1MzIgdGFyZ2V0X25ldG5zX2ludW1bS1NPQ0tfUVVPVEFfTkVUTlNdO1xuJiM0Mzt1NjQgcXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQ7XG4mIzQzO2ludCBxdW90YV9lcnI7XG4mIzQzO1xuJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2xcbiYjNDM7a3NvY2tfcXVvdGFfY3JlYXRlX29uZSh1MzIgaSxcbiYjNDM7XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzICpjcmVhdGVfb3B0cylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrICprcywgKm9sZDtcbiYjNDM7XHRpbnQgZXJyID0gMDtcbiYjNDM7XG4mIzQzO1x0aSAmIzQzOz0gcXVvdGFfc2xvdF9vZmZzZXQ7XG4mIzQzO1x0aWYgKGkgXHUwMDNlPSBLU09DS19RVU9UQV9TTE9UUykge1xuJiM0MztcdFx0cXVvdGFfZXJyID0gLUVSQU5HRTtcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YmFycmllcl92YXIoZXJyKTtcbiYjNDM7XHRrcyA9IGJwZl9rc29ja19jcmVhdGUoY3JlYXRlX29wdHMsIHNpemVvZigqY3JlYXRlX29wdHMpLCBcdTAwMjZlcnIpO1xuJiM0MztcdGlmICgha3MpIHtcbiYjNDM7XHRcdHF1b3RhX2VyciA9IGVycjtcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0diA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cXVvdGFfbWFwLCBcdTAwMjZpKTtcbiYjNDM7XHRpZiAoIXYpIHtcbiYjNDM7XHRcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcbiYjNDM7XHRcdHF1b3RhX2VyciA9IC1FTk9FTlQ7XG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG9sZCA9IGJwZl9rcHRyX3hjaGcoXHUwMDI2di1cdTAwM2VjdHgsIGtzKTtcbiYjNDM7XHRpZiAob2xkKVxuJiM0MztcdFx0YnBmX2tzb2NrX3JlbGVhc2Uob2xkKTtcbiYjNDM7XHRxdW90YV9jcmVhdGVkJiM0MzsmIzQzOztcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBrc29ja19xdW90YV9yZWxlYXNlX29uZSh1MzIgaSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcbiYjNDM7XG4mIzQzO1x0aSAmIzQzOz0gcXVvdGFfc2xvdF9vZmZzZXQ7XG4mIzQzO1x0aWYgKGkgXHUwMDNlPSBLU09DS19RVU9UQV9TTE9UUylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0diA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cXVvdGFfbWFwLCBcdTAwMjZpKTtcbiYjNDM7XHRpZiAoIXYpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGtzID0gYnBmX2twdHJfeGNoZyhcdTAwMjZ2LVx1MDAzZWN0eCwgTlVMTCk7XG4mIzQzO1x0aWYgKGtzKSB7XG4mIzQzO1x0XHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4mIzQzO1x0XHRxdW90YV9yZWxlYXNlZCYjNDM7JiM0Mzs7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IGtzb2NrX3F1b3RhX2NyZWF0ZSh2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XG4mIzQzO1xuJiM0MztcdGNyZWF0ZV9vcHRzLmZhbWlseSA9IEFGX0lORVQ7XG4mIzQzO1x0Y3JlYXRlX29wdHMudHlwZSA9IFNPQ0tfREdSQU07XG4mIzQzO1x0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcbiYjNDM7XHRxdW90YV9jcmVhdGVkID0gMDtcbiYjNDM7XHRxdW90YV9lcnIgPSAwO1xuJiM0MztcbiYjNDM7XHRpZiAoa3NvY2tfcXVvdGFfY3JlYXRlX29uZSgwLCBcdTAwMjZjcmVhdGVfb3B0cykpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAoa3NvY2tfcXVvdGFfY3JlYXRlX29uZSgxLCBcdTAwMjZjcmVhdGVfb3B0cykpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRrc29ja19xdW90YV9jcmVhdGVfb25lKDIsIFx1MDAyNmNyZWF0ZV9vcHRzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQga3NvY2tfcXVvdGFfcmVsZWFzZSh2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRxdW90YV9yZWxlYXNlZCA9IDA7XG4mIzQzO1x0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMCk7XG4mIzQzO1x0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMSk7XG4mIzQzO1x0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMik7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7ZmVudHJ5L2tzb2NrX3JlbGVhc2Vfd29ya19mblwmIzM0OylcbiYjNDM7aW50IEJQRl9QUk9HKGtzb2NrX3JlbGVhc2Vfd29ya19lbnRlciwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJjdV93b3JrICpyd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcmN1X3dvcmssIHdvcmspO1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2sgKmtzID0gY29udGFpbmVyX29mKHJ3b3JrLCBzdHJ1Y3QgYnBmX2tzb2NrLCByd29yayk7XG4mIzQzO1x0dTY0IHBpZF90Z2lkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCk7XG4mIzQzO1x0c3RydWN0IG5ldCAqbmV0O1xuJiM0MztcdHUzMiBpbnVtO1xuJiM0MztcdHU4IHRyYWNrZWQgPSAxO1xuJiM0MztcbiYjNDM7XHQvKiBrc29ja19yZWxlYXNlX3dvcmtfZm4oKSBmcmVlcyBrcyBiZWZvcmUgdGhlIGZleGl0IHByb2dyYW0gcnVucy4gKi9cbiYjNDM7XHRuZXQgPSBCUEZfQ09SRV9SRUFEKGtzLCBzb2NrLCBzaywgX19za19jb21tb24uc2tjX25ldC5uZXQpO1xuJiM0MztcdGlmICghbmV0KVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGludW0gPSBCUEZfQ09SRV9SRUFEKG5ldCwgbnMuaW51bSk7XG4mIzQzO1x0aWYgKGludW0gIT0gdGFyZ2V0X25ldG5zX2ludW1bMF0gXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGludW0gIT0gdGFyZ2V0X25ldG5zX2ludW1bMV0pXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0YnBmX21hcF91cGRhdGVfZWxlbShcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFx1MDAyNnBpZF90Z2lkLCBcdTAwMjZ0cmFja2VkLCBCUEZfQU5ZKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O2ZleGl0L2tzb2NrX3JlbGVhc2Vfd29ya19mblwmIzM0OylcbiYjNDM7aW50IEJQRl9QUk9HKGtzb2NrX3JlbGVhc2Vfd29ya19leGl0LCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4mIzQzO3tcbiYjNDM7XHR1NjQgcGlkX3RnaWQgPSBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQoKTtcbiYjNDM7XHR1OCAqdHJhY2tlZDtcbiYjNDM7XG4mIzQzO1x0dHJhY2tlZCA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cmVsZWFzZV93b3JrZXJzLCBcdTAwMjZwaWRfdGdpZCk7XG4mIzQzO1x0aWYgKCF0cmFja2VkKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0YnBmX21hcF9kZWxldGVfZWxlbShcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFx1MDAyNnBpZF90Z2lkKTtcbiYjNDM7XG4mIzQzO1x0LyogVGhlIHdvcmtlciBoYXMgcmVsZWFzZWQgdGhlIHNvY2tldCBhbmQgcmV0dXJuZWQgaXRzIHF1b3RhIGNoYXJnZS4gKi9cbiYjNDM7XHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcdTAwMjZxdW90YV9yZWxlYXNlX2NvbXBsZXRlZCwgMSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIF9fbGljZW5zZVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJmNTIwMDk0M2UzNmFcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19yZWN1cnNpb24uY1xuQEAgLTAsMCAmIzQzOzEsNjkgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1saW51eC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfZW5kaWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX3RyYWNpbmdfbmV0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NvY2tfY29tbW9uLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltO1xuJiM0Mzt2b2lkIGJwZl9yY3VfcmVhZF91bmxvY2sodm9pZCkgX19rc3ltO1xuJiM0MztcbiYjNDM7aW50IHRhcmdldF9waWQ7XG4mIzQzO2ludCB0cmlnZ2VyX3NlbmQ7XG4mIzQzO1xuJiM0Mzt1bnNpZ25lZCBpbnQgcmVjX2NvdW50O1xuJiM0MztpbnQgcmVjX2tmdW5jX3JldHNbXSA9IHsgLTEsIC0xIH07XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IGtzb2NrX3NldHVwKHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBkb19rc29ja19zZXR1cCgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7bHNtLnMvc29ja2V0X3NlbmRtc2dcJiMzNDspXG4mIzQzO2ludCBCUEZfUFJPRyhrc29ja19zb2NrZXRfc2VuZG1zZywgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuJiM0MztcdCAgICAgaW50IHNpemUsIGludCByZXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29jayAqa3MsICp0bXA7XG4mIzQzO1x0dTMyIHBpZCA9IGJwZl9nZXRfY3VycmVudF9waWRfdGdpZCgpIFx1MDAzZVx1MDAzZSAzMjtcbiYjNDM7XHRpbnQga2Z1bmNfcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAocmV0IHx8ICF0cmlnZ2VyX3NlbmQgfHwgcGlkICE9IHRhcmdldF9waWQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2ID0ga3NvY2tfY3R4X3ZhbHVlX2xvb2t1cCgpO1xuJiM0MztcdGlmICghdikge1xuJiM0MztcdFx0a2Z1bmNfcmV0ID0gLUVOT0VOVDtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a3MgPSBOVUxMO1xuJiM0MztcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0dG1wID0gdi1cdTAwM2VjdHg7XG4mIzQzO1x0aWYgKHRtcClcbiYjNDM7XHRcdGtzID0gYnBmX2tzb2NrX2FjcXVpcmUodG1wKTtcbiYjNDM7XHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1xuJiM0MztcdGlmICgha3MpIHtcbiYjNDM7XHRcdGtmdW5jX3JldCA9IC1FTk9FTlQ7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtmdW5jX3JldCA9IGJwZl9rc29ja19zZW5kKGtzLCBzZW5kX2RhdGEsIHNpemVvZihzZW5kX2RhdGEpKTtcbiYjNDM7XHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmVjX2tmdW5jX3JldHNbcmVjX2NvdW50IFx1MDAyNiAxXSA9IGtmdW5jX3JldDtcbiYjNDM7XHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcdTAwMjZyZWNfY291bnQsIDEpO1xuJiM0MztcbiYjNDM7XHRpZiAoa2Z1bmNfcmV0ICE9IC1FQlVTWSlcbiYjNDM7XHRcdHRyaWdnZXJfc2VuZCA9IDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3dxLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTZhMTg3M2QxMzJlZGVcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jXG5AQCAtMCwwICYjNDM7MSw2MiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bWxpbnV4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl90cmFjaW5nX25ldC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Vycm5vLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NvY2tfY29tbW9uLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0cnVjdCBrc29ja193cV92YWx1ZSB7XG4mIzQzO1x0c3RydWN0IGJwZl93cSB3b3JrO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuJiM0MztcdF9fdHlwZShrZXksIHUzMik7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qga3NvY2tfd3FfdmFsdWUpO1xuJiM0Mzt9IHdvcmtfbWFwIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztpbnQgY3JlYXRlX2VycjtcbiYjNDM7dTMyIGNhbGxiYWNrX2RvbmU7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGtzb2NrX3dxX2NhbGxiYWNrKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBvcHRzID0ge1xuJiM0MztcdFx0LmZhbWlseSA9IEFGX0lORVQsXG4mIzQzO1x0XHQudHlwZSA9IFNPQ0tfREdSQU0sXG4mIzQzO1x0XHQucHJvdG9jb2wgPSBJUFBST1RPX1VEUCxcbiYjNDM7XHR9O1xuJiM0MztcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xuJiM0MztcdGludCBlcnIgPSAwO1xuJiM0MztcbiYjNDM7XHRrcyA9IGJwZl9rc29ja19jcmVhdGUoXHUwMDI2b3B0cywgc2l6ZW9mKG9wdHMpLCBcdTAwMjZlcnIpO1xuJiM0MztcdGlmIChrcylcbiYjNDM7XHRcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcbiYjNDM7XHRjcmVhdGVfZXJyID0gZXJyO1xuJiM0MztcdF9fc3luY19mZXRjaF9hbmRfYWRkKFx1MDAyNmNhbGxiYWNrX2RvbmUsIDEpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IGtzb2NrX3dxX3N0YXJ0KHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBrc29ja193cV92YWx1ZSAqdmFsdWU7XG4mIzQzO1x0dTMyIGtleSA9IDA7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0dmFsdWUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndvcmtfbWFwLCBcdTAwMjZrZXkpO1xuJiM0MztcdGlmICghdmFsdWUpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRlcnIgPSBicGZfd3FfaW5pdChcdTAwMjZ2YWx1ZS1cdTAwM2V3b3JrLCBcdTAwMjZ3b3JrX21hcCwgMCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0ZXJyID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZ2YWx1ZS1cdTAwM2V3b3JrLCBrc29ja193cV9jYWxsYmFjaywgMCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0cmV0dXJuIGJwZl93cV9zdGFydChcdTAwMjZ2YWx1ZS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7Y2hhciBfX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMTI6NTg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7SU5FVCYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2tzb2NrX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYmluZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfY29ubmVjdCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfc2VuZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYWNxdWlyZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfcmVsZWFzZSYjMzQ7LAogICAgJiMzNDtfX3N5c19jb25uZWN0X3NvY2tldCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNmMwNDRhM2IzYWUyZjgxZGFlZDBjYzkwYjljNDA4NDljZDYzMTNlYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gSnVsIDYgMTI6NTg6NTQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL3N5c2N0bC9uZXQucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdAppbmRleCBlNTg2ZTE3ZmM3YTU4Mi4uOGJjZGMxYmZkNzExMzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvc3lzY3RsL25ldC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdApAQCAtMTI4LDYgJiM0MzsxMjgsMTggQEAgY29tcGlsZXIgaW4gb3JkZXIgdG8gcmVqZWN0IHVucHJpdmlsZWdlZCBKSVQgcmVxdWVzdHMgb25jZSBpdCBoYXMKIGJlZW4gc3VycGFzc2VkLiBicGZfaml0X2xpbWl0IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2xvYmFsIGxpbWl0CiBpbiBieXRlcy4KIAomIzQzO2JwZl9rc29ja19tYXgKJiM0MzstLS0tLS0tLS0tLS0tCiYjNDM7CiYjNDM7TWF4aW11bSBudW1iZXIgb2YgQlBGIGtlcm5lbCBzb2NrZXRzIHRoYXQgbWF5IGV4aXN0IGluIGVhY2ggbmV0d29yayBuYW1lc3BhY2UuCiYjNDM7VGhpcyBob3N0LXdpZGUgc2V0dGluZyBpcyBleHBvc2VkIGluIHRoZSBpbml0aWFsIG5ldHdvcmsgbmFtZXNwYWNlIGFuZCBhcHBsaWVzCiYjNDM7dGhlIHNhbWUgbGltaXQgaW5kZXBlbmRlbnRseSB0byBldmVyeSBuZXR3b3JrIG5hbWVzcGFjZS4gU29ja2V0cyBhd2FpdGluZwomIzQzO2RlZmVycmVkIFJDVSBhbmQgd29ya3F1ZXVlIGNsZWFudXAgcmVtYWluIGNvdW50ZWQgdW50aWwgdGhlIHVuZGVybHlpbmcgc29ja2V0CiYjNDM7aGFzIGJlZW4gcmVsZWFzZWQuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyBjcmVhdGlvbiBvZiBCUEYga2VybmVsIHNvY2tldHMgaW4KJiM0MztldmVyeSBuZXR3b3JrIG5hbWVzcGFjZS4KJiM0MzsKJiM0MztEZWZhdWx0OiAxMDI0CiYjNDM7CiBkZXZfd2VpZ2h0CiAtLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmggYi9pbmNsdWRlL2xpbnV4L2JwZl9rc29jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4wNDg1YjhlZGRjMWYyMAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmgKQEAgLTAsMCAmIzQzOzEsNTAgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqLwomIzQzOwomIzQzOyNpZm5kZWYgX0JQRl9LU09DS19ICiYjNDM7I2RlZmluZSBfQlBGX0tTT0NLX0gKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdHlwZXMuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIEJQRl9LU09DS19NQVhfREVGQVVMVCAxMDI0CiYjNDM7CiYjNDM7ZXh0ZXJuIGludCBzeXNjdGxfYnBmX2tzb2NrX21heDsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIC0gQlBGIGtlcm5lbCBzb2NrZXQgY3JlYXRpb24gcGFyYW1ldGVycwomIzQzOyAqIEBmYW1pbHk6CUFkZHJlc3MgZmFtaWx5OiBBRl9JTkVUIG9yIEFGX0lORVQ2LgomIzQzOyAqIEB0eXBlOglTb2NrZXQgdHlwZTogb25seSBTT0NLX0RHUkFNIHN1cHBvcnRlZCBmb3Igbm93LgomIzQzOyAqIEBwcm90b2NvbDoJUHJvdG9jb2wgbnVtYmVyIChlLmcuIElQUFJPVE9fVURQKSwgb3IgMCBmb3IgdGhlIGRlZmF1bHQgcHJvdG9jb2wKJiM0MzsgKgkJb2YgdGhlIGdpdmVuIHR5cGUuCiYjNDM7ICogQHJlc2VydmVkOglNdXN0IGJlIHplcm8uIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgomIzQzOyAqLwomIzQzO3N0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgewomIzQzOwlfX3U4IGZhbWlseTsKJiM0MzsJX191OCB0eXBlOwomIzQzOwlfX3U4IHByb3RvY29sOwomIzQzOwlfX3U4IHJlc2VydmVkOwomIzQzO307CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgLSBCUEYga2VybmVsIHNvY2tldCBhZGRyZXNzIHBhcmFtZXRlcnMKJiM0MzsgKiBAZmFtaWx5OglBZGRyZXNzIGZhbWlseTogQUZfSU5FVCBvciBBRl9JTkVUNi4KJiM0MzsgKiBAcmVzZXJ2ZWQ6CU11c3QgYmUgemVyby4gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCiYjNDM7ICogQHBvcnQ6CVBvcnQgaW4gaG9zdCBieXRlIG9yZGVyLgomIzQzOyAqIEBzY29wZV9pZDoJSVB2NiBzY29wZSBJRCBmb3Igc2NvcGVkIEFGX0lORVQ2IGFkZHJlc3Nlcywgb3IgemVyby4KJiM0MzsgKgkJTXVzdCBiZSB6ZXJvIHdoZW4gZmFtaWx5PUFGX0lORVQuCiYjNDM7ICogQGlwdjRfYWRkcjoJSVB2NCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVULgomIzQzOyAqIEBpcHY2X2FkZHI6CUlQdjYgYWRkcmVzcyAoMTYgYnl0ZXMsIG5ldHdvcmsgYnl0ZSBvcmRlcikuIFVzZWQgd2hlbiBmYW1pbHk9QUZfSU5FVDYuCiYjNDM7ICovCiYjNDM7c3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgewomIzQzOwlfX3U4IGZhbWlseTsKJiM0MzsJX191OCByZXNlcnZlZDsKJiM0MzsJX191MTYgcG9ydDsKJiM0MzsJX191MzIgc2NvcGVfaWQ7CiYjNDM7CiYjNDM7CXVuaW9uIHsKJiM0MzsJCV9fYmUzMiBpcHY0X2FkZHI7CiYjNDM7CQlfX3UzMiBpcHY2X2FkZHJbNF07IC8qIGluNl9hZGRyOyBuZXR3b3JrIG9yZGVyICovCiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MzsjZW5kaWYgLyogX0JQRl9LU09DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCAyYThkN2IxNGYxZDExOS4uNDhmMWViODE5M2RlYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ja2V0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaApAQCAtNDYxLDYgJiM0Mzs0NjEsOCBAQCBleHRlcm4gc3RydWN0IGZpbGUgKl9fc3lzX3NvY2tldF9maWxlKGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpOwogZXh0ZXJuIGludCBfX3N5c19iaW5kKGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdW15YWRkciwgaW50IGFkZHJsZW4pOwogZXh0ZXJuIGludCBfX3N5c19iaW5kX3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcywKIAkJCSAgICAgaW50IGFkZHJsZW4pOwomIzQzO2V4dGVybiBpbnQgX19zeXNfY29ubmVjdF9zb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsCiYjNDM7CQkJCWludCBhZGRybGVuLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCBfX3N5c19jb25uZWN0X2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLAogCQkJICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKTsKIGV4dGVybiBpbnQgX19zeXNfY29ubmVjdChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzZXJ2YWRkciwKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuYwppbmRleCAyNWFlYTQyNzFjZDA4OS4uNTJmNmE4OTU0NmU0NmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTQ0MjQsNiAmIzQzOzQ0MjQsOSBAQCBCVEZfSUQoc3RydWN0LCB0YXNrX3N0cnVjdCkKICNpZmRlZiBDT05GSUdfQ1JZUFRPCiBCVEZfSUQoc3RydWN0LCBicGZfY3J5cHRvX2N0eCkKICNlbmRpZgomIzQzOyNpZmRlZiBDT05GSUdfSU5FVAomIzQzO0JURl9JRChzdHJ1Y3QsIGJwZl9rc29jaykKJiM0MzsjZW5kaWYKIEJURl9TRVRfRU5EKHJjdV9wcm90ZWN0ZWRfdHlwZXMpCiAKIHN0YXRpYyBib29sIHJjdV9wcm90ZWN0ZWRfb2JqZWN0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL01ha2VmaWxlIGIvbmV0L2NvcmUvTWFrZWZpbGUKaW5kZXggYjNmZGNiNGUzNTVmYTYuLmE5Mjk1Yjc4NTkwMTA5IDEwMDY0NAotLS0gYS9uZXQvY29yZS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9uZXQvY29yZS9NYWtlZmlsZQpAQCAtNDQsNiAmIzQzOzQ0LDkgQEAgb2JqLSQoQ09ORklHX0ZBSUxPVkVSKSAmIzQzOz0gZmFpbG92ZXIubwogb2JqLSQoQ09ORklHX05FVF9TT0NLX01TRykgJiM0Mzs9IHNrbXNnLm8KIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IHNvY2tfbWFwLm8KIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJwZl9za19zdG9yYWdlLm8KJiM0MztpZm5lcSAoJChDT05GSUdfSU5FVCksKQomIzQzO29iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJwZl9rc29jay5vCiYjNDM7ZW5kaWYKIG9iai0kKENPTkZJR19PRikJJiM0Mzs9IG9mX25ldC5vCiBvYmotJChDT05GSUdfTkVUX1RFU1QpICYjNDM7PSBuZXRfdGVzdC5vCiBvYmotJChDT05GSUdfTkVUX0RFVk1FTSkgJiM0Mzs9IGRldm1lbS5vCmRpZmYgLS1naXQgYS9uZXQvY29yZS9icGZfa3NvY2suYyBiL25ldC9jb3JlL2JwZl9rc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi44YmRlNzM0YmM5MTdkMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9jb3JlL2JwZl9rc29jay5jCkBAIC0wLDAgJiM0MzsxLDUxNiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGZfa3NvY2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zl9pZHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY2FjaGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaGFzaC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pbjYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbGlzdF9ibC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9uZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcmVmY291bnQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcmN1cGRhdGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2NoZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdW5hbGlnbmVkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3dvcmtxdWV1ZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9pcC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvaXB2Ni5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvbmV0X25hbWVzcGFjZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvbmV0bnMvZ2VuZXJpYy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvc29jay5oJmd0OwomIzQzOwomIzQzOy8qKgomIzQzOyAqIHN0cnVjdCBicGZfa3NvY2sgLSByZWZjb3VudGVkIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQKJiM0MzsgKiBAc29jazoJVGhlIHVuZGVybHlpbmcga2VybmVsIHNvY2tldC4KJiM0MzsgKiBAdXNhZ2U6CVJlZmVyZW5jZSBjb3VudGVyLgomIzQzOyAqIEByd29yazoJUkNVIHdvcmsgZm9yIGRlZmVycmVkIGNsZWFudXAgKHNvY2tfcmVsZWFzZSBtYXkgc2xlZXApLgomIzQzOyAqLwomIzQzO3N0cnVjdCBicGZfa3NvY2sgewomIzQzOwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwomIzQzOwlyZWZjb3VudF90IHVzYWdlOwomIzQzOwlzdHJ1Y3QgcmN1X3dvcmsgcndvcms7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgewomIzQzOwlzdHJ1Y3QgaGxpc3RfYmxfbm9kZSBub2RlOwomIzQzOwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiYjNDM7fTsKJiM0MzsKJiM0MzsjZGVmaW5lIEJQRl9LU09DS19TRU5EX0dVQVJEX0hBU0hfQklUUyA2CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCB7CiYjNDM7CXN0cnVjdCBobGlzdF9ibF9oZWFkIGhlYWQ7CiYjNDM7fSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0CiYjNDM7CWJwZl9rc29ja19zZW5kX2J1Y2tldHNbMSAmbHQ7Jmx0OyBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFNdOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0ICoKJiM0MzticGZfa3NvY2tfc2VuZF9idWNrZXQoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQomIzQzO3sKJiM0MzsJdTMyIGJ1Y2tldF9pZHggPSBoYXNoX3B0cih0YXNrLCBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFMpOwomIzQzOwomIzQzOwlyZXR1cm4gJmFtcDticGZfa3NvY2tfc2VuZF9idWNrZXRzW2J1Y2tldF9pZHhdOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBicGZfa3NvY2tfc2VuZF9lbnRlcihzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmd1YXJkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICplbnRyeTsKJiM0MzsJc3RydWN0IGhsaXN0X2JsX25vZGUgKnBvczsKJiM0MzsJc3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCAqYnVja2V0OwomIzQzOwomIzQzOwlidWNrZXQgPSBicGZfa3NvY2tfc2VuZF9idWNrZXQoY3VycmVudCk7CiYjNDM7CWhsaXN0X2JsX2xvY2soJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzOwlobGlzdF9ibF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCAmYW1wO2J1Y2tldC0mZ3Q7aGVhZCwgbm9kZSkgewomIzQzOwkJaWYgKGVudHJ5LSZndDt0YXNrID09IGN1cnJlbnQpIHsKJiM0MzsJCQlobGlzdF9ibF91bmxvY2soJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlndWFyZC0mZ3Q7dGFzayA9IGN1cnJlbnQ7CiYjNDM7CUlOSVRfSExJU1RfQkxfTk9ERSgmYW1wO2d1YXJkLSZndDtub2RlKTsKJiM0MzsJaGxpc3RfYmxfYWRkX2hlYWQoJmFtcDtndWFyZC0mZ3Q7bm9kZSwgJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzOwlobGlzdF9ibF91bmxvY2soJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX2tzb2NrX3NlbmRfZXhpdChzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmd1YXJkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCAqYnVja2V0OwomIzQzOwomIzQzOwlidWNrZXQgPSBicGZfa3NvY2tfc2VuZF9idWNrZXQoZ3VhcmQtJmd0O3Rhc2spOwomIzQzOwlobGlzdF9ibF9sb2NrKCZhbXA7YnVja2V0LSZndDtoZWFkKTsKJiM0MzsJaGxpc3RfYmxfZGVsKCZhbXA7Z3VhcmQtJmd0O25vZGUpOwomIzQzOwlobGlzdF9ibF91bmxvY2soJmFtcDtidWNrZXQtJmd0O2hlYWQpOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2tzb2NrX25ldCB7CiYjNDM7CWF0b21pY190IGNvdW50OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGludCBicGZfa3NvY2tfbmV0X2lkOwomIzQzO2ludCBzeXNjdGxfYnBmX2tzb2NrX21heCBfX3JlYWRfbW9zdGx5ID0gQlBGX0tTT0NLX01BWF9ERUZBVUxUOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX25ldCAqYnBmX2tzb2NrX3Blcm5ldChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQpCiYjNDM7ewomIzQzOwlyZXR1cm4gbmV0X2dlbmVyaWMobmV0LCBicGZfa3NvY2tfbmV0X2lkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBicGZfa3NvY2tfbmV0X29wcyA9IHsKJiM0MzsJLmlkID0gJmFtcDticGZfa3NvY2tfbmV0X2lkLAomIzQzOwkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnBmX2tzb2NrX25ldCksCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2Uoc3RydWN0IG5ldCAqbmV0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19uZXQgKmtuID0gYnBmX2tzb2NrX3Blcm5ldChuZXQpOwomIzQzOwlpbnQgY291bnQgPSBhdG9taWNfcmVhZCgmYW1wO2tuLSZndDtjb3VudCk7CiYjNDM7CWludCBtYXg7CiYjNDM7CiYjNDM7CWRvIHsKJiM0MzsJCW1heCA9IFJFQURfT05DRShzeXNjdGxfYnBmX2tzb2NrX21heCk7CiYjNDM7CQlpZiAoY291bnQgJmd0Oz0gbWF4KQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfSB3aGlsZSAoIWF0b21pY190cnlfY21weGNoZygmYW1wO2tuLSZndDtjb3VudCwgJmFtcDtjb3VudCwgY291bnQgJiM0MzsgMSkpOwomIzQzOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX2tzb2NrX25ldF91bmNoYXJnZShzdHJ1Y3QgbmV0ICpuZXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2tzb2NrX25ldCAqa24gPSBicGZfa3NvY2tfcGVybmV0KG5ldCk7CiYjNDM7CiYjNDM7CVdBUk5fT05fT05DRShhdG9taWNfZGVjX3JldHVybigmYW1wO2tuLSZndDtjb3VudCkgJmx0OyAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQga3NvY2tfcmVsZWFzZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgKmtzID0KJiM0MzsJCWNvbnRhaW5lcl9vZih0b19yY3Vfd29yayh3b3JrKSwgc3RydWN0IGJwZl9rc29jaywgcndvcmspOwomIzQzOwlzdHJ1Y3QgbmV0ICpuZXQgPSBnZXRfbmV0KHNvY2tfbmV0KGtzLSZndDtzb2NrLSZndDtzaykpOwomIzQzOwomIzQzOwlzb2NrX3JlbGVhc2Uoa3MtJmd0O3NvY2spOwomIzQzOwlicGZfa3NvY2tfbmV0X3VuY2hhcmdlKG5ldCk7CiYjNDM7CXB1dF9uZXQobmV0KTsKJiM0MzsJa2ZyZWUoa3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9rc29ja19nZXRfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywKJiM0MzsJCQkgICAgICB1MzIgb3B0c19fc3osIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgb3B0c19jb3B5OwomIzQzOwomIzQzOwlpZiAoIW9wdHMgfHwgb3B0c19fc3ogIT0gc2l6ZW9mKCpvcHRzKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwkvKiBLZnVuYyBtZW1vcnkgYXJndW1lbnRzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBuYXR1cmFsbHkgYWxpZ25lZC4gKi8KJiM0MzsJbWVtY3B5KCZhbXA7b3B0c19jb3B5LCBvcHRzLCBzaXplb2Yob3B0c19jb3B5KSk7CiYjNDM7CiYjNDM7CWlmIChvcHRzX2NvcHkucmVzZXJ2ZWQpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJc3dpdGNoIChvcHRzX2NvcHkuZmFtaWx5KSB7CiYjNDM7CWNhc2UgQUZfSU5FVDogewomIzQzOwkJc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOwomIzQzOwomIzQzOwkJaWYgKG9wdHNfY29weS5zY29wZV9pZCkKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJCSphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4pewomIzQzOwkJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKJiM0MzsJCQkuc2luX3BvcnQgPSBodG9ucyhvcHRzX2NvcHkucG9ydCksCiYjNDM7CQkJLnNpbl9hZGRyLnNfYWRkciA9IG9wdHNfY29weS5pcHY0X2FkZHIsCiYjNDM7CQl9OwomIzQzOwkJcmV0dXJuIHNpemVvZigqYWRkcjQpOwomIzQzOwl9CiYjNDM7I2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiYjNDM7CWNhc2UgQUZfSU5FVDY6IHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyOwomIzQzOwomIzQzOwkJKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYpewomIzQzOwkJCS5zaW42X2ZhbWlseSA9IEFGX0lORVQ2LAomIzQzOwkJCS5zaW42X3BvcnQgPSBodG9ucyhvcHRzX2NvcHkucG9ydCksCiYjNDM7CQkJLnNpbjZfc2NvcGVfaWQgPSBvcHRzX2NvcHkuc2NvcGVfaWQsCiYjNDM7CQl9OwomIzQzOwkJbWVtY3B5KCZhbXA7YWRkcjYtJmd0O3NpbjZfYWRkciwgb3B0c19jb3B5LmlwdjZfYWRkciwKJiM0MzsJCSAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiYjNDM7CQlyZXR1cm4gc2l6ZW9mKCphZGRyNik7CiYjNDM7CX0KJiM0MzsjZW5kaWYKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCXJldHVybiAtRUFGTk9TVVBQT1JUOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQodm9pZCkKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIFRhc2sgd29yayBjYW4gcnVuIGZyb20gZG9fZXhpdCgpIGFmdGVyIGV4aXRfbnNwcm94eV9uYW1lc3BhY2VzKCkKJiM0MzsJICogY2xlYXJlZCBjdXJyZW50LSZndDtuc3Byb3h5LCB3aGlsZSBjdXJyZW50IGlzIHN0aWxsIG5vdCBhIGt0aHJlYWQuCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gIShjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9LVEhSRUFEKSAmYW1wOyZhbXA7IGN1cnJlbnQtJmd0O25zcHJveHk7CiYjNDM7fQomIzQzOwomIzQzO19fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfa3NvY2tfY3JlYXRlKCkgLSBDcmVhdGUgYSBCUEYga2VybmVsIHNvY2tldC4KJiM0MzsgKgomIzQzOyAqIEFsbG9jYXRlcyBhbmQgY3JlYXRlcyBhIGtlcm5lbCBzb2NrZXQuCiYjNDM7ICogVGhlIHNvY2tldCBpcyBjaGFyZ2VkIGFnYWluc3QgdGhlIGFjdGl2ZSBuZXR3b3JrIG5hbWVzcGFjZSYjMzk7cyBCUEYga2VybmVsCiYjNDM7ICogc29ja2V0IHF1b3RhLgomIzQzOyAqCiYjNDM7ICogVGhlIHJldHVybmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3IKJiM0MzsgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCAoc29ja19jcmVhdGUpLCBzbyBpdCBjYW4gb25seSBiZSB1c2VkCiYjNDM7ICogaW4gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuCiYjNDM7ICogSXQgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgQlBGIHdvcmtxdWV1ZSBjYWxsYmFjayBiZWNhdXNlIHRoYXQgY2FsbGJhY2sKJiM0MzsgKiBkb2VzIG5vdCByZXRhaW4gdGhlIGludm9raW5nIHRhc2smIzM5O3MgbmFtZXNwYWNlIG9yIHNlY3VyaXR5IGNvbnRleHQuCiYjNDM7ICoKJiM0MzsgKiBAb3B0czoJUG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIHdpdGggc29ja2V0IHBhcmFtZXRlcnMuCiYjNDM7ICogQG9wdHNfX3N6OglTaXplIG9mIHRoZSBvcHRzIHN0cnVjdC4KJiM0MzsgKiBAZXJyX191bmluaXQ6CUludGVnZXIgdG8gc3RvcmUgZXJyb3IgY29kZSB3aGVuIE5VTEwgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqCiYjNDM7YnBmX2tzb2NrX2NyZWF0ZShjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzICpvcHRzLCB1MzIgb3B0c19fc3osCiYjNDM7CQkgaW50ICplcnJfX3VuaW5pdCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgb3B0c19jb3B5OwomIzQzOwlzdHJ1Y3QgYnBmX2tzb2NrICprczsKJiM0MzsJc3RydWN0IG5ldCAqbmV0OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBzb2NrX2NyZWF0ZSgpIGRlcml2ZXMgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBjcmVkZW50aWFscywgYW5kIGNncm91cAomIzQzOwkgKiBmcm9tIGN1cnJlbnQuIEtlcm5lbCB0aHJlYWRzLCBpbmNsdWRpbmcgQlBGIHdvcmtxdWV1ZSBjYWxsYmFja3MsIGRvCiYjNDM7CSAqIG5vdCBjYXJyeSB0aGUgY29udGV4dCBvZiB0aGUgdGFzayB0aGF0IGludm9rZWQgdGhlIEJQRiBwcm9ncmFtLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpIHsKJiM0MzsJCWVyciA9IC1FT1BOT1RTVVBQOwomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghb3B0cyB8fCBvcHRzX19zeiAhPSBzaXplb2Yoc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cykpIHsKJiM0MzsJCWVyciA9IC1FSU5WQUw7CiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJb3B0c19jb3B5ID0gKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpewomIzQzOwkJLmZhbWlseSA9IFJFQURfT05DRShvcHRzLSZndDtmYW1pbHkpLAomIzQzOwkJLnR5cGUgPSBSRUFEX09OQ0Uob3B0cy0mZ3Q7dHlwZSksCiYjNDM7CQkucHJvdG9jb2wgPSBSRUFEX09OQ0Uob3B0cy0mZ3Q7cHJvdG9jb2wpLAomIzQzOwkJLnJlc2VydmVkID0gUkVBRF9PTkNFKG9wdHMtJmd0O3Jlc2VydmVkKSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJaWYgKG9wdHNfY29weS5yZXNlcnZlZCkgewomIzQzOwkJZXJyID0gLUVJTlZBTDsKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAob3B0c19jb3B5LmZhbWlseSAhPSBBRl9JTkVUICZhbXA7JmFtcDsgb3B0c19jb3B5LmZhbWlseSAhPSBBRl9JTkVUNikgewomIzQzOwkJZXJyID0gLUVBRk5PU1VQUE9SVDsKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAob3B0c19jb3B5LnR5cGUgIT0gU09DS19ER1JBTSkgewomIzQzOwkJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAob3B0c19jb3B5LnByb3RvY29sICE9IElQUFJPVE9fVURQICZhbXA7JmFtcDsgb3B0c19jb3B5LnByb3RvY29sICE9IDApIHsKJiM0MzsJCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3MgPSBremFsbG9jX29iaigqa3MpOwomIzQzOwlpZiAoIWtzKSB7CiYjNDM7CQllcnIgPSAtRU5PTUVNOwomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5ldCA9IGN1cnJlbnQtJmd0O25zcHJveHktJmd0O25ldF9uczsKJiM0MzsJaWYgKCFicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2UobmV0KSkgewomIzQzOwkJZXJyID0gLUVOT1NQQzsKJiM0MzsJCWdvdG8gZXJyX2ZyZWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVXNlIHRoZSBub3JtYWwgY3VycmVudC10YXNrIHNvY2tldCBwYXRoIHNvIExTTS9jZ3JvdXAgcG9saWN5LAomIzQzOwkgKiBzb2NrZXQgbGFiZWxzLCBhbmQgdGhlIGFjdGl2ZSBuZXRucyByZWZlcmVuY2UgbWF0Y2ggYSBzb2NrZXQoMikKJiM0MzsJICogY3JlYXRlZCBieSB0aGUgQlBGIHByb2dyYW0mIzM5O3MgY2FsbGVyLgomIzQzOwkgKi8KJiM0MzsJZXJyID0gc29ja19jcmVhdGUob3B0c19jb3B5LmZhbWlseSwgb3B0c19jb3B5LnR5cGUsIG9wdHNfY29weS5wcm90b2NvbCwKJiM0MzsJCQkgICZhbXA7a3MtJmd0O3NvY2spOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJZ290byBlcnJfdW5jaGFyZ2U7CiYjNDM7CiYjNDM7CWtzLSZndDtzb2NrLSZndDtzay0mZ3Q7c2tfcmN2YnVmID0gU09DS19NSU5fUkNWQlVGOwomIzQzOwlrcy0mZ3Q7c29jay0mZ3Q7c2stJmd0O3NrX3VzZXJsb2NrcyB8PSBTT0NLX1JDVkJVRl9MT0NLOwomIzQzOwomIzQzOwlyZWZjb3VudF9zZXQoJmFtcDtrcy0mZ3Q7dXNhZ2UsIDEpOwomIzQzOwlwdXRfdW5hbGlnbmVkKDAsIGVycl9fdW5pbml0KTsKJiM0MzsJcmV0dXJuIGtzOwomIzQzOwomIzQzO2Vycl91bmNoYXJnZToKJiM0MzsJYnBmX2tzb2NrX25ldF91bmNoYXJnZShuZXQpOwomIzQzO2Vycl9mcmVlOgomIzQzOwlrZnJlZShrcyk7CiYjNDM7ZXJyX291dDoKJiM0MzsJcHV0X3VuYWxpZ25lZChlcnIsIGVycl9fdW5pbml0KTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9rc29ja19iaW5kKCkgLSBCaW5kIGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNzLgomIzQzOyAqIEBrczoJCVRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LgomIzQzOyAqIEBvcHRzOglQb2ludGVyIHRvIHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHdpdGggbG9jYWwgYWRkcmVzcy4KJiM0MzsgKiBAb3B0c19fc3o6CVNpemUgb2YgdGhlIG9wdHMgc3RydWN0LgomIzQzOyAqCiYjNDM7ICogQmluZHMgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIGxvY2FsIGFkZHJlc3MgYW5kIHBvcnQuCiYjNDM7ICogVGhpcyBpcyBvcHRpb25hbDsgaWYgbm90IGNhbGxlZCwgdGhlIGtlcm5lbCB3aWxsIGF1dG8tYXNzaWduLgomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgd2hpbGUgYmluZGluZyB0aGUgc29ja2V0LCBzbyBpdCBjYW4gb25seSBiZSB1c2VkIGluCiYjNDM7ICogc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19iaW5kKHN0cnVjdCBicGZfa3NvY2sgKmtzLAomIzQzOwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywKJiM0MzsJCQkgICAgICAgdTMyIG9wdHNfX3N6KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9OwomIzQzOwlpbnQgYWRkcmxlbjsKJiM0MzsKJiM0MzsJaWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CWFkZHJsZW4gPSBicGZfa3NvY2tfZ2V0X2FkZHIob3B0cywgb3B0c19fc3osICZhbXA7YWRkcik7CiYjNDM7CWlmIChhZGRybGVuICZsdDsgMCkKJiM0MzsJCXJldHVybiBhZGRybGVuOwomIzQzOwomIzQzOwlyZXR1cm4gX19zeXNfYmluZF9zb2NrZXQoa3MtJmd0O3NvY2ssICZhbXA7YWRkciwgYWRkcmxlbik7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9rc29ja19jb25uZWN0KCkgLSBDb25uZWN0IGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSByZW1vdGUgYWRkcmVzcy4KJiM0MzsgKiBAa3M6CQlUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dC4KJiM0MzsgKiBAb3B0czoJUG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyB3aXRoIHJlbW90ZSBhZGRyZXNzLgomIzQzOyAqIEBvcHRzX19zejoJU2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuCiYjNDM7ICoKJiM0MzsgKiBDb25uZWN0cyB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGFkZHJlc3MgYW5kIHBvcnQuCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCB3aGlsZSBjb25uZWN0aW5nIHRoZSBzb2NrZXQsIHNvIGl0IGNhbiBvbmx5IGJlIHVzZWQKJiM0MzsgKiBpbiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2tzb2NrX2Nvbm5lY3Qoc3RydWN0IGJwZl9rc29jayAqa3MsCiYjNDM7CQkJCSAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsCiYjNDM7CQkJCSAgdTMyIG9wdHNfX3N6KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9OwomIzQzOwlpbnQgYWRkcmxlbjsKJiM0MzsKJiM0MzsJaWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CWFkZHJsZW4gPSBicGZfa3NvY2tfZ2V0X2FkZHIob3B0cywgb3B0c19fc3osICZhbXA7YWRkcik7CiYjNDM7CWlmIChhZGRybGVuICZsdDsgMCkKJiM0MzsJCXJldHVybiBhZGRybGVuOwomIzQzOwomIzQzOwlyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoa3MtJmd0O3NvY2ssICZhbXA7YWRkciwgYWRkcmxlbiwgMCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9rc29ja19hY3F1aXJlKCkgLSBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIGEgQlBGIGtlcm5lbCBzb2NrZXQuCiYjNDM7ICogQGtzOglUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byBhY3F1aXJlLiBNdXN0IGJlIGEKJiM0MzsgKgl0cnVzdGVkIHBvaW50ZXIgKGUuZy4gUkNVLXByb3RlY3RlZCBrcHRyIGZyb20gYSBtYXApLgomIzQzOyAqCiYjNDM7ICogVGhlIGFjcXVpcmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3IKJiM0MzsgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2FjcXVpcmUoc3RydWN0IGJwZl9rc29jayAqa3MpCiYjNDM7ewomIzQzOwlpZiAoIXJlZmNvdW50X2luY19ub3RfemVybygmYW1wO2tzLSZndDt1c2FnZSkpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJcmV0dXJuIGtzOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfa3NvY2tfcmVsZWFzZSgpIC0gUmVsZWFzZSBhIEJQRiBrZXJuZWwgc29ja2V0LgomIzQzOyAqIEBrczoJVGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQgdG8gcmVsZWFzZS4KJiM0MzsgKgomIzQzOyAqIFdoZW4gdGhlIGZpbmFsIHJlZmVyZW5jZSBpcyByZWxlYXNlZCwgdGhlIHNvY2tldCBpcyBjbGVhbmVkIHVwIHZpYQomIzQzOyAqIHF1ZXVlX3JjdV93b3JrKCkgKHNpbmNlIHNvY2tfcmVsZWFzZSBtYXkgc2xlZXApLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHZvaWQgYnBmX2tzb2NrX3JlbGVhc2Uoc3RydWN0IGJwZl9rc29jayAqa3MpCiYjNDM7ewomIzQzOwlpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KCZhbXA7a3MtJmd0O3VzYWdlKSkgewomIzQzOwkJSU5JVF9SQ1VfV09SSygmYW1wO2tzLSZndDtyd29yaywga3NvY2tfcmVsZWFzZV93b3JrX2ZuKTsKJiM0MzsJCXF1ZXVlX3JjdV93b3JrKHN5c3RlbV9kZmxfd3EsICZhbXA7a3MtJmd0O3J3b3JrKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9rc29ja19yZWxlYXNlX2R0b3Iodm9pZCAqa3MpCiYjNDM7ewomIzQzOwlicGZfa3NvY2tfcmVsZWFzZShrcyk7CiYjNDM7fQomIzQzO0NGSV9OT1NFQUwoYnBmX2tzb2NrX3JlbGVhc2VfZHRvcik7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2tzb2NrX3NlbmQoKSAtIFNlbmQgZGF0YSB0aHJvdWdoIGEgQlBGIGtlcm5lbCBzb2NrZXQuCiYjNDM7ICogQGtzOgkJVGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQuIE11c3QgYmUgYW4gYWNxdWlyZWQgcmVmZXJlbmNlLgomIzQzOyAqIEBkYXRhOglQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHNlbmQuCiYjNDM7ICogQGRhdGFfX3N6OglTaXplIG9mIHRoZSBkYXRhIHRvIHNlbmQgKG1heCA2NTUzNSBieXRlcykuCiYjNDM7ICoKJiM0MzsgKiBTZW5kcyBkYXRhIG9uIGEgY29ubmVjdGVkIHNvY2tldCwgYmVzdC1lZmZvcnQgYW5kIG5vbmJsb2NraW5nLiBUaGlzIG1heSBzbGVlcAomIzQzOyAqIChrZXJuZWxfc2VuZG1zZyksIHNvIGl0IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHNsZWVwYWJsZSBCUEYgcHJvZ3JhbXMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IE51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIGludCBicGZfa3NvY2tfc2VuZChzdHJ1Y3QgYnBmX2tzb2NrICprcywgY29uc3Qgdm9pZCAqZGF0YSwKJiM0MzsJCQkgICAgICAgdTMyIGRhdGFfX3N6KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkIGd1YXJkOwomIzQzOwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKJiM0MzsJCS5tc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVQsCiYjNDM7CX07CiYjNDM7CXN0cnVjdCBrdmVjIGlvdiA9IHsKJiM0MzsJCS5pb3ZfYmFzZSA9ICh2b2lkICopZGF0YSwKJiM0MzsJCS5pb3ZfbGVuID0gZGF0YV9fc3osCiYjNDM7CX07CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKQomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwomIzQzOwkvKiBFYXJseSBjaGVjayBmb3IgVURQLiBFeGFjdCBsaW1pdHMgZW5mb3JjZWQgYnkga2VybmVsX3NlbmRtc2coKS4gKi8KJiM0MzsJaWYgKGRhdGFfX3N6ICZndDsgSVBfTUFYX01UVSkKJiM0MzsJCXJldHVybiAtRU1TR1NJWkU7CiYjNDM7CiYjNDM7CWlmICghYnBmX2tzb2NrX3NlbmRfZW50ZXIoJmFtcDtndWFyZCkpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwomIzQzOwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhrcy0mZ3Q7c29jaywgJmFtcDttc2csICZhbXA7aW92LCAxLCBkYXRhX19zeik7CiYjNDM7CWJwZl9rc29ja19zZW5kX2V4aXQoJmFtcDtndWFyZCk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiYjNDM7CiYjNDM7QlRGX0tGVU5DU19TVEFSVChrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19jcmVhdGUsIEtGX0FDUVVJUkUgfCBLRl9SRVRfTlVMTCB8IEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2JpbmQsIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2Nvbm5lY3QsIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfS0ZVTkNTX0VORChrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMpCiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGtzb2NrX2luaXRfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIgPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldCA9ICZhbXA7a3NvY2tfaW5pdF9rZnVuY19idGZfaWRzLAomIzQzO307CiYjNDM7CiYjNDM7QlRGX0tGVU5DU19TVEFSVChrc29ja19rZnVuY19idGZfaWRzKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfcmVsZWFzZSwgS0ZfUkVMRUFTRSkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2FjcXVpcmUsIEtGX0FDUVVJUkUgfCBLRl9SQ1UgfCBLRl9SRVRfTlVMTCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX3NlbmQsIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfS0ZVTkNTX0VORChrc29ja19rZnVuY19idGZfaWRzKQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnBmX2tzb2NrX2tmdW5jX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHUzMiBrZnVuY19pZCkKJiM0Mzt7CiYjNDM7CWlmICghYnRmX2lkX3NldDhfY29udGFpbnMoJmFtcDtrc29ja19rZnVuY19idGZfaWRzLCBrZnVuY19pZCkgfHwKJiM0MzsJICAgIHByb2ctJmd0O3R5cGUgPT0gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHx8CiYjNDM7CSAgICBwcm9nLSZndDt0eXBlID09IEJQRl9QUk9HX1RZUEVfTFNNKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiAtRUFDQ0VTOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQga3NvY2tfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIgPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldCA9ICZhbXA7a3NvY2tfa2Z1bmNfYnRmX2lkcywKJiM0MzsJLmZpbHRlciA9IGJwZl9rc29ja19rZnVuY19maWx0ZXIsCiYjNDM7fTsKJiM0MzsKJiM0MztCVEZfSURfTElTVChicGZfa3NvY2tfZHRvcl9pZHMpCiYjNDM7QlRGX0lEKHN0cnVjdCwgYnBmX2tzb2NrKQomIzQzO0JURl9JRChmdW5jLCBicGZfa3NvY2tfcmVsZWFzZV9kdG9yKQomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl9rc29ja19rZnVuY19pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwljb25zdCBzdHJ1Y3QgYnRmX2lkX2R0b3Jfa2Z1bmMgYnBmX2tzb2NrX2R0b3JzW10gPSB7CiYjNDM7CQl7CiYjNDM7CQkJLmJ0Zl9pZCA9IGJwZl9rc29ja19kdG9yX2lkc1swXSwKJiM0MzsJCQkua2Z1bmNfYnRmX2lkID0gYnBmX2tzb2NrX2R0b3JfaWRzWzFdLAomIzQzOwkJfSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmYW1wO2JwZl9rc29ja19uZXRfb3BzKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLAomIzQzOwkJCQkJJmFtcDtrc29ja19pbml0X2tmdW5jX3NldCk7CiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmYW1wO2JwZl9rc29ja19uZXRfb3BzKTsKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsCiYjNDM7CQkJCQkmYW1wO2tzb2NrX2tmdW5jX3NldCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTFNNLAomIzQzOwkJCQkJICAgICAgICZhbXA7a3NvY2tfa2Z1bmNfc2V0KTsKJiM0MzsJcmV0dXJuIHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoYnBmX2tzb2NrX2R0b3JzLAomIzQzOwkJCQkJCSBBUlJBWV9TSVpFKGJwZl9rc29ja19kdG9ycyksCiYjNDM7CQkJCQkJIFRISVNfTU9EVUxFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfa3NvY2tfa2Z1bmNfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCmluZGV4IGI1MDg2MThiZmMxMjM5Li5kMjIxYTE4MGM4NzcwNSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMKQEAgLTcsNiAmIzQzOzcsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9maWx0ZXIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmX2tzb2NrLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zeXNjdGwuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKQEAgLTUyNSw2ICYjNDM7NTI2LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5ldF9jb3JlX3RhYmxlW10gPSB7CiAJCS5leHRyYTEJCT0gU1lTQ1RMX0xPTkdfT05FLAogCQkuZXh0cmEyCQk9ICZhbXA7YnBmX2ppdF9saW1pdF9tYXgsCiAJfSwKJiM0MzsjZW5kaWYKJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NZU0NBTEwpICZhbXA7JmFtcDsgSVNfRU5BQkxFRChDT05GSUdfSU5FVCkKJiM0MzsJewomIzQzOwkJLnByb2NuYW1lCT0gJiMzNDticGZfa3NvY2tfbWF4JiMzNDssCiYjNDM7CQkuZGF0YQkJPSAmYW1wO3N5c2N0bF9icGZfa3NvY2tfbWF4LAomIzQzOwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKJiM0MzsJCS5tb2RlCQk9IDA2NDQsCiYjNDM7CQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCiYjNDM7CQkuZXh0cmExCQk9IFNZU0NUTF9aRVJPLAomIzQzOwl9LAogI2VuZGlmCiAJewogCQkucHJvY25hbWUJPSAmIzM0O25ldGRldl90c3RhbXBfcHJlcXVldWUmIzM0OywKZGlmZiAtLWdpdCBhL25ldC9zb2NrZXQuYyBiL25ldC9zb2NrZXQuYwppbmRleCA2M2M2OWEwZmE3NGUxZS4uYzc0MjdkZDRkZDUyM2QgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvc29ja2V0LmMKQEAgLTIxMTUsMjcgJiM0MzsyMTE1LDMxIEBAIFNZU0NBTExfREVGSU5FMyhhY2NlcHQsIGludCwgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgdXBlZXJfc29ja2FkZHIsCiAgKglpbmNsdWRlIHRoZSAtRUlOUFJPR1JFU1Mgc3RhdHVzIGZvciBzdWNoIHNvY2tldHMuCiAgKi8KIAomIzQzO2ludCBfX3N5c19jb25uZWN0X3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcywKJiM0MzsJCQkgaW50IGFkZHJsZW4sIGludCBmbGFncykKJiM0Mzt7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CiYjNDM7CXJldHVybiBSRUFEX09OQ0Uoc29jay0mZ3Q7b3BzKS0mZ3Q7Y29ubmVjdChzb2NrLAomIzQzOwkJCQkgICAgKHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICopYWRkcmVzcywKJiM0MzsJCQkJICAgIGFkZHJsZW4sIGZsYWdzKTsKJiM0Mzt9CiYjNDM7CiBpbnQgX19zeXNfY29ubmVjdF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcywKIAkJICAgICAgIGludCBhZGRybGVuLCBpbnQgZmlsZV9mbGFncykKIHsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwotCWludCBlcnI7CiAKIAlzb2NrID0gc29ja19mcm9tX2ZpbGUoZmlsZSk7Ci0JaWYgKCFzb2NrKSB7Ci0JCWVyciA9IC1FTk9UU09DSzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXJyID0KLQkgICAgc2VjdXJpdHlfc29ja2V0X2Nvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsIGFkZHJsZW4pOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwomIzQzOwlpZiAoIXNvY2spCiYjNDM7CQlyZXR1cm4gLUVOT1RTT0NLOwogCi0JZXJyID0gUkVBRF9PTkNFKHNvY2stJmd0O29wcyktJmd0O2Nvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICopYWRkcmVzcywKLQkJCQkJICAgIGFkZHJsZW4sIHNvY2stJmd0O2ZpbGUtJmd0O2ZfZmxhZ3MgfCBmaWxlX2ZsYWdzKTsKLW91dDoKLQlyZXR1cm4gZXJyOwomIzQzOwlyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoc29jaywgYWRkcmVzcywgYWRkcmxlbiwKJiM0MzsJCQkJICAgIHNvY2stJmd0O2ZpbGUtJmd0O2ZfZmxhZ3MgfCBmaWxlX2ZsYWdzKTsKIH0KIAogaW50IF9fc3lzX2Nvbm5lY3QoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1c2VydmFkZHIsIGludCBhZGRybGVuKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjhiMTRmZDk4ZDQxMGVkCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYwpAQCAtMCwwICYjNDM7MSwyMzkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7YXJwYS9pbmV0LmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt0ZXN0X3Byb2dzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7bmV0d29ya19oZWxwZXJzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7a3NvY2tfYmFzaWMuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX3JlY3Vyc2lvbi5za2VsLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgTlNfVEVTVCAmIzM0O2tzb2NrX2Jhc2ljX25zJiMzNDsKJiM0MzsjZGVmaW5lIE5TX0xTTV9SRUNVUlNJT05fVEVTVCAmIzM0O2tzb2NrX2xzbV9yZWN1cnNpb25fbnMmIzM0OwomIzQzOyNkZWZpbmUgTE9PUEJBQ0tfSVAgJiMzNDsxMjcuMC4wLjEmIzM0OwomIzQzOyNkZWZpbmUgUkVDVl9QT1JUIDc3NzcKJiM0MzsjZGVmaW5lIFJFQ1ZfVElNRU9VVF9TRUMgNQomIzQzOwomIzQzO3N0cnVjdCBrc29ja190ZXN0X2VudiB7CiYjNDM7CWNvbnN0IGNoYXIgKm5ldG5zOwomIzQzOwlib29sIG5ldG5zX2NyZWF0ZWQ7CiYjNDM7CXN0cnVjdCBuc3Rva2VuICpuc3Rva2VuOwomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKJiM0MzsJaW50IHJmZDsKJiM0MzsJY2hhciBidWZbMzJdOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga3NvY2tfdGVzdF9lbnZfc2V0dXAoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYsIGNvbnN0IGNoYXIgKm5ldG5zKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWV2YWwgdHY7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CW1lbXNldChlbnYsIDAsIHNpemVvZigqZW52KSk7CiYjNDM7CWVudi0mZ3Q7bmV0bnMgPSBuZXRuczsKJiM0MzsJZW52LSZndDtyZmQgPSAtMTsKJiM0MzsKJiM0MzsJU1lTKGZhaWwsICYjMzQ7aXAgbmV0bnMgYWRkICVzJiMzNDssIG5ldG5zKTsKJiM0MzsJZW52LSZndDtuZXRuc19jcmVhdGVkID0gdHJ1ZTsKJiM0MzsJU1lTKGZhaWwsICYjMzQ7aXAgLW5ldCAlcyBsaW5rIHNldCBsbyB1cCYjMzQ7LCBuZXRucyk7CiYjNDM7CiYjNDM7CWVudi0mZ3Q7bnN0b2tlbiA9IG9wZW5fbmV0bnMobmV0bnMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZW52LSZndDtuc3Rva2VuLCAmIzM0O29wZW5fbmV0bnMmIzM0OykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CWVudi0mZ3Q7cmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZW52LSZndDtyZmQsICYjMzQ7cmVjZWl2ZXIgc29ja2V0JiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwllbnYtJmd0O2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CiYjNDM7CWVudi0mZ3Q7YWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoTE9PUEJBQ0tfSVApOwomIzQzOwllbnYtJmd0O2FkZHIuc2luX3BvcnQgPSBodG9ucyhSRUNWX1BPUlQpOwomIzQzOwomIzQzOwllcnIgPSBiaW5kKGVudi0mZ3Q7cmZkLCAoc3RydWN0IHNvY2thZGRyICopJmFtcDtlbnYtJmd0O2FkZHIsIHNpemVvZihlbnYtJmd0O2FkZHIpKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2JpbmQgcmVjZWl2ZXImIzM0OykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CXR2LnR2X3NlYyA9IFJFQ1ZfVElNRU9VVF9TRUM7CiYjNDM7CXR2LnR2X3VzZWMgPSAwOwomIzQzOwllcnIgPSBzZXRzb2Nrb3B0KGVudi0mZ3Q7cmZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJmFtcDt0diwgc2l6ZW9mKHR2KSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXQgcmN2dGltZW8mIzM0OykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzOwomIzQzO2ZhaWw6CiYjNDM7CWlmIChlbnYtJmd0O3JmZCAmZ3Q7PSAwKSB7CiYjNDM7CQljbG9zZShlbnYtJmd0O3JmZCk7CiYjNDM7CQllbnYtJmd0O3JmZCA9IC0xOwomIzQzOwl9CiYjNDM7CWlmIChlbnYtJmd0O25zdG9rZW4pIHsKJiM0MzsJCWNsb3NlX25ldG5zKGVudi0mZ3Q7bnN0b2tlbik7CiYjNDM7CQllbnYtJmd0O25zdG9rZW4gPSBOVUxMOwomIzQzOwl9CiYjNDM7CWlmIChlbnYtJmd0O25ldG5zX2NyZWF0ZWQpIHsKJiM0MzsJCVNZU19OT0ZBSUwoJiMzNDtpcCBuZXRucyBkZWwgJXMgJmd0Oy9kZXYvbnVsbCAyJmd0OyZhbXA7MSYjMzQ7LCBuZXRucyk7CiYjNDM7CQllbnYtJmd0O25ldG5zX2NyZWF0ZWQgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGtzb2NrX3Rlc3RfZW52X2NsZWFudXAoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYpCiYjNDM7ewomIzQzOwlpZiAoZW52LSZndDtyZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGVudi0mZ3Q7cmZkKTsKJiM0MzsJaWYgKGVudi0mZ3Q7bnN0b2tlbikKJiM0MzsJCWNsb3NlX25ldG5zKGVudi0mZ3Q7bnN0b2tlbik7CiYjNDM7CWlmIChlbnYtJmd0O25ldG5zX2NyZWF0ZWQpIHsKJiM0MzsJCVNZU19OT0ZBSUwoJiMzNDtpcCBuZXRucyBkZWwgJXMgJmd0Oy9kZXYvbnVsbCAyJmd0OyZhbXA7MSYjMzQ7LCBlbnYtJmd0O25ldG5zKTsKJiM0MzsJCWVudi0mZ3Q7bmV0bnNfY3JlYXRlZCA9IGZhbHNlOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGtzb2NrX2Fzc2VydF9yZWN2KHN0cnVjdCBrc29ja190ZXN0X2VudiAqZW52LCBjb25zdCBjaGFyICpkYXRhLAomIzQzOwkJCSAgICAgIHNpemVfdCBkYXRhX3N6KQomIzQzO3sKJiM0MzsJc3NpemVfdCBuOwomIzQzOwomIzQzOwltZW1zZXQoZW52LSZndDtidWYsIDAsIHNpemVvZihlbnYtJmd0O2J1ZikpOwomIzQzOwluID0gcmVjdmZyb20oZW52LSZndDtyZmQsIGVudi0mZ3Q7YnVmLCBzaXplb2YoZW52LSZndDtidWYpLCAwLCBOVUxMLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEobiwgZGF0YV9zeiwgJiMzNDtyZWN2ZnJvbSBsZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CUFTU0VSVF9NRU1FUShlbnYtJmd0O2J1ZiwgZGF0YSwgZGF0YV9zeiwgJiMzNDtwYXlsb2FkIG1hdGNoJiMzNDspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBrc29ja19zZXR1cF9jdHgoc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nLCBfX2JlMzIgKmlwdjRfcmVtb3RlLAomIzQzOwkJCSAgICBfX3UxNiAqcmVtb3RlX3BvcnQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7CiYjNDM7CWludCBlcnIsIHBmZDsKJiM0MzsKJiM0MzsJKmlwdjRfcmVtb3RlID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTsKJiM0MzsJKnJlbW90ZV9wb3J0ID0gUkVDVl9QT1JUOwomIzQzOwomIzQzOwlwZmQgPSBicGZfcHJvZ3JhbV9fZmQocHJvZyk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKHBmZCwgJiMzNDtrc29ja19zZXR1cCBmZCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwZmQsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtrc29ja19zZXR1cCBydW4mIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWlmICghQVNTRVJUX09LKG9wdHMucmV0dmFsLCAmIzM0O2tzb2NrX3NldHVwIHJldHZhbCYjMzQ7KSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9rc29ja19iYXNpYyh2b2lkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpOwomIzQzOwlzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgZW52OwomIzQzOwlzdHJ1Y3Qga3NvY2tfYmFzaWMgKnNrZWw7CiYjNDM7CWludCBlcnIsIHBmZDsKJiM0MzsKJiM0MzsJc2tlbCA9IGtzb2NrX2Jhc2ljX19vcGVuKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3NrZWwgb3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZXJyID0ga3NvY2tfYmFzaWNfX2xvYWQoc2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtza2VsIGxvYWQmIzM0OykpIHsKJiM0MzsJCWtzb2NrX2Jhc2ljX19kZXN0cm95KHNrZWwpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoJmFtcDtlbnYsIE5TX1RFU1QpKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBTdGVwIDE6IFJ1biB0aGUgc2V0dXAgU1lTQ0FMTCBwcm9nIHRvIGNyZWF0ZSBrc29jayAqLwomIzQzOwlpZiAoIWtzb2NrX3NldHVwX2N0eChza2VsLSZndDtwcm9ncy5rc29ja19zZXR1cCwKJiM0MzsJCQkgICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDtpcHY0X3JlbW90ZSwKJiM0MzsJCQkgICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDtyZW1vdGVfcG9ydCkpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMjogUnVuIHRoZSBzZW5kIFNZU0NBTEwgcHJvZyAqLwomIzQzOwlwZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mua3NvY2tfc2VuZCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKHBmZCwgJiMzNDtrc29ja19zZW5kIGZkJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHBmZCwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2tzb2NrX3NlbmQgcnVuJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwlpZiAoIUFTU0VSVF9FUShvcHRzLnJldHZhbCwKJiM0MzsJCSAgICAgICBzaXplb2Yoc2tlbC0mZ3Q7ZGF0YS0mZ3Q7c2VuZF9kYXRhKSwgJiMzNDtzZW5kbXNnIGJ5dGVzJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBTdGVwIDM6IFJlY2VpdmUgYW5kIHZlcmlmeSB0aGUgZGF0YSAqLwomIzQzOwlrc29ja19hc3NlcnRfcmVjdigmYW1wO2Vudiwgc2tlbC0mZ3Q7ZGF0YS0mZ3Q7c2VuZF9kYXRhLAomIzQzOwkJCSAgc2l6ZW9mKHNrZWwtJmd0O2RhdGEtJmd0O3NlbmRfZGF0YSkpOwomIzQzOwomIzQzO2ZhaWw6CiYjNDM7CWtzb2NrX3Rlc3RfZW52X2NsZWFudXAoJmFtcDtlbnYpOwomIzQzOwlrc29ja19iYXNpY19fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2tzb2NrX2xzbV9yZWN1cnNpb24odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrc29ja190ZXN0X2VudiBlbnY7CiYjNDM7CXN0cnVjdCBrc29ja19yZWN1cnNpb24gKnNrZWw7CiYjNDM7CWNoYXIgdHJpZ2dlciA9ICYjMzk7eCYjMzk7OwomIzQzOwlpbnQgdGZkID0gLTE7CiYjNDM7CWludCBlcnI7CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsKJiM0MzsJc2tlbCA9IGtzb2NrX3JlY3Vyc2lvbl9fb3BlbigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtza2VsIG9wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IGtzb2NrX3JlY3Vyc2lvbl9fbG9hZChza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NrZWwgbG9hZCYjMzQ7KSkgewomIzQzOwkJa3NvY2tfcmVjdXJzaW9uX19kZXN0cm95KHNrZWwpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoJmFtcDtlbnYsIE5TX0xTTV9SRUNVUlNJT05fVEVTVCkpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMTogUnVuIHRoZSBzZXR1cCBTWVNDQUxMIHByb2cgdG8gY3JlYXRlIHRoZSBrc29jayAqLwomIzQzOwlpZiAoIWtzb2NrX3NldHVwX2N0eChza2VsLSZndDtwcm9ncy5rc29ja19zZXR1cCwKJiM0MzsJCQkgICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDtpcHY0X3JlbW90ZSwKJiM0MzsJCQkgICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDtyZW1vdGVfcG9ydCkpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMjogQXR0YWNoIExTTSBwcm9nIGFuZCB0cmlnZ2VyIHNvY2tldF9zZW5kbXNnIGZyb20gdXNlcnNwYWNlICovCiYjNDM7CXNrZWwtJmd0O2xpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnID0KJiM0MzsJCWJwZl9wcm9ncmFtX19hdHRhY2hfbHNtKHNrZWwtJmd0O3Byb2dzLmtzb2NrX3NvY2tldF9zZW5kbXNnKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtJmd0O2xpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnLAomIzQzOwkJCSAgICYjMzQ7YXR0YWNoIHNvY2tldF9zZW5kbXNnIGxzbSYjMzQ7KSkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJdGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQodGZkLCAmIzM0O3RyaWdnZXIgc29ja2V0JiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3RhcmdldF9waWQgPSBnZXRwaWQoKTsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0cmlnZ2VyX3NlbmQgPSAxOwomIzQzOwluID0gc2VuZHRvKHRmZCwgJmFtcDt0cmlnZ2VyLCBzaXplb2YodHJpZ2dlciksIDAsCiYjNDM7CQkgICAoc3RydWN0IHNvY2thZGRyICopJmFtcDtlbnYuYWRkciwgc2l6ZW9mKGVudi5hZGRyKSk7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGFyZ2V0X3BpZCA9IDA7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dHJpZ2dlcl9zZW5kID0gMDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEobiwgc2l6ZW9mKHRyaWdnZXIpLCAmIzM0O3RyaWdnZXIgc2VuZHRvJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBTdGVwIDM6IFRoZSBuZXN0ZWQgYnBmX2tzb2NrX3NlbmQoKSBtdXN0IGhpdCB0aGUgcmVjdXJzaW9uIGd1YXJkICovCiYjNDM7CWlmICghQVNTRVJUX0VRKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjX2NvdW50LCAyLAomIzQzOwkJICAgICAgICYjMzQ7c29ja2V0X3NlbmRtc2cgcmVjdXJzaW9uIGNvdW50JiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtkYXRhLSZndDtyZWNfa2Z1bmNfcmV0c1swXSwgLUVCVVNZLAomIzQzOwkJICAgICAgICYjMzQ7cmVjdXJzaXZlIHNlbmQgc3RhdHVzJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtkYXRhLSZndDtyZWNfa2Z1bmNfcmV0c1sxXSwKJiM0MzsJCSAgICAgICBzaXplb2Yoc2tlbC0mZ3Q7ZGF0YS0mZ3Q7c2VuZF9kYXRhKSwgJiMzNDtvdXRlciBzZW5kIGJ5dGVzJiMzNDspKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwlrc29ja19hc3NlcnRfcmVjdigmYW1wO2Vudiwgc2tlbC0mZ3Q7ZGF0YS0mZ3Q7c2VuZF9kYXRhLAomIzQzOwkJCSAgc2l6ZW9mKHNrZWwtJmd0O2RhdGEtJmd0O3NlbmRfZGF0YSkpOwomIzQzOwomIzQzO2ZhaWw6CiYjNDM7CWlmICh0ZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHRmZCk7CiYjNDM7CWtzb2NrX3Rlc3RfZW52X2NsZWFudXAoJmFtcDtlbnYpOwomIzQzOwlrc29ja19yZWN1cnNpb25fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3F1b3RhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmM4NmQ5YjBhOTUxM2U4Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuYwpAQCAtMCwwICYjNDM7MSwxMzkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3Rlc3RfcHJvZ3MuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtuZXR3b3JrX2hlbHBlcnMuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtzeXNjdGxfaGVscGVycy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX3F1b3RhLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBOU19ORVRfUVVPVEFfVEVTVDEgJiMzNDtrc29ja19uZXRfcXVvdGFfbnMxJiMzNDsKJiM0MzsjZGVmaW5lIE5TX05FVF9RVU9UQV9URVNUMiAmIzM0O2tzb2NrX25ldF9xdW90YV9uczImIzM0OwomIzQzOyNkZWZpbmUgS1NPQ0tfTUFYX1NZU0NUTCAmIzM0Oy9wcm9jL3N5cy9uZXQvY29yZS9icGZfa3NvY2tfbWF4JiMzNDsKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TX1NMT1RTIDMKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TMV9PRkZTRVQgMAomIzQzOyNkZWZpbmUgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCBLU09DS19RVU9UQV9OU19TTE9UUwomIzQzOwomIzQzO3N0YXRpYyBpbnQga3NvY2tfcnVuX3Byb2coc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChwcm9nKSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CXJldHVybiBvcHRzLnJldHZhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIF9fdTY0IGtzb2NrX3F1b3RhX3JlbGVhc2VfY29tcGxldGVkKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCkKJiM0Mzt7CiYjNDM7CXJldHVybiBfX2F0b21pY19sb2FkX24oJmFtcDtza2VsLSZndDtic3MtJmd0O3F1b3RhX3JlbGVhc2VfY29tcGxldGVkLAomIzQzOwkJCSAgICAgICBfX0FUT01JQ19BQ1FVSVJFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBrc29ja19yZWxlYXNlX3F1b3RhX3Nsb3RzKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCwgaW50IHNsb3Rfb2Zmc2V0KQomIzQzO3sKJiM0MzsJX191NjQgY29tcGxldGVkOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwljb21wbGV0ZWQgPSBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKTsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtxdW90YV9zbG90X29mZnNldCA9IHNsb3Rfb2Zmc2V0OwomIzQzOwllcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLSZndDtwcm9ncy5rc29ja19xdW90YV9yZWxlYXNlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2tzb2NrX3F1b3RhX3JlbGVhc2UmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXdoaWxlIChrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKSAtIGNvbXBsZXRlZCAmbHQ7CiYjNDM7CSAgICAgICBza2VsLSZndDtic3MtJmd0O3F1b3RhX3JlbGVhc2VkKQomIzQzOwkJdXNsZWVwKDEwMDApOwomIzQzOwomIzQzOwlyZXR1cm4gc2tlbC0mZ3Q7YnNzLSZndDtxdW90YV9yZWxlYXNlZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga3NvY2tfZXhwZWN0X3F1b3RhKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCwgaW50IHNsb3Rfb2Zmc2V0LAomIzQzOwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtxdW90YV9zbG90X29mZnNldCA9IHNsb3Rfb2Zmc2V0OwomIzQzOwllcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLSZndDtwcm9ncy5rc29ja19xdW90YV9jcmVhdGUpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsIG5hbWUpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3F1b3RhX2NyZWF0ZWQsIDIsIG5hbWUpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlyZXR1cm4gQVNTRVJUX0VRKHNrZWwtJmd0O2Jzcy0mZ3Q7cXVvdGFfZXJyLCAtRU5PU1BDLCBuYW1lKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgcmVjb3JkX2N1cnJlbnRfbnMoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgdGFyZ2V0KQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWVyciA9IHN0YXQoJiMzNDsvcHJvYy9zZWxmL25zL25ldCYjMzQ7LCAmYW1wO3N0KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3N0YXQgbmV0bnMmIzM0OykpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGFyZ2V0X25ldG5zX2ludW1bdGFyZ2V0XSA9IChfX3UzMilzdC5zdF9pbm87CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2tzb2NrX25ldF9xdW90YSh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBvbGRfbWF4WzE2XSA9IHt9OwomIzQzOwlzdHJ1Y3QgbmV0bnNfb2JqICpuZXRuczEgPSBOVUxMLCAqbmV0bnMyID0gTlVMTDsKJiM0MzsJc3RydWN0IGtzb2NrX3F1b3RhICpza2VsOwomIzQzOwlpbnQgcmVsZWFzZWQ7CiYjNDM7CiYjNDM7CXNrZWwgPSBrc29ja19xdW90YV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtrc29jayBxdW90YSBza2VsZXRvbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJc2tlbC0mZ3Q7bGlua3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyID0KJiM0MzsJCWJwZl9wcm9ncmFtX19hdHRhY2hfdHJhY2Uoc2tlbC0mZ3Q7cHJvZ3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtJmd0O2xpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlciwKJiM0MzsJCQkgICAmIzM0O2F0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZW50cnkmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJc2tlbC0mZ3Q7bGlua3Mua3NvY2tfcmVsZWFzZV93b3JrX2V4aXQgPQomIzQzOwkJYnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLSZndDtwcm9ncy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLSZndDtsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCwKJiM0MzsJCQkgICAmIzM0O2F0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZXhpdCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoc3lzY3RsX3NldF9vcl9mYWlsKEtTT0NLX01BWF9TWVNDVEwsIG9sZF9tYXgsICYjMzQ7MiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwluZXRuczEgPSBuZXRuc19uZXcoTlNfTkVUX1FVT1RBX1RFU1QxLCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMSwgJiMzNDtjcmVhdGUgZmlyc3QgbmV0bnMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFyZWNvcmRfY3VycmVudF9ucyhza2VsLCAwKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIWtzb2NrX2V4cGVjdF9xdW90YShza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VULAomIzQzOwkJCQkmIzM0O2ZpcnN0IG5ldG5zIHF1b3RhJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIFRoZSBob3N0LXdpZGUgc2V0dGluZyBncmFudHMgdGhlIGZ1bGwgYWxsb3dhbmNlIHRvIGVhY2ggbmV0bnMuICovCiYjNDM7CW5ldG5zMiA9IG5ldG5zX25ldyhOU19ORVRfUVVPVEFfVEVTVDIsIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobmV0bnMyLCAmIzM0O2NyZWF0ZSBzZWNvbmQgbmV0bnMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFyZWNvcmRfY3VycmVudF9ucyhza2VsLCAxKSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIWtzb2NrX2V4cGVjdF9xdW90YShza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VULAomIzQzOwkJCQkmIzM0O3NlY29uZCBuZXRucyBxdW90YSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlyZWxlYXNlZCA9IGtzb2NrX3JlbGVhc2VfcXVvdGFfc2xvdHMoc2tlbCwgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJlbGVhc2VkLCAyLCAmIzM0O3NlY29uZCBuZXRucyBxdW90YSByZWxlYXNlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBCb3RoIHJlbGVhc2VkIHNsb3RzIG11c3QgYmVjb21lIGF2YWlsYWJsZSBhZ2Fpbi4gKi8KJiM0MzsJa3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQsICYjMzQ7cmVjb3ZlcmVkIHF1b3RhJiMzNDspOwomIzQzOwomIzQzO291dDoKJiM0MzsJa3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTsKJiM0MzsJa3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VUKTsKJiM0MzsJbmV0bnNfZnJlZShuZXRuczIpOwomIzQzOwluZXRuc19mcmVlKG5ldG5zMSk7CiYjNDM7CWlmIChvbGRfbWF4WzBdKQomIzQzOwkJc3lzY3RsX3NldF9vcl9mYWlsKEtTT0NLX01BWF9TWVNDVEwsIE5VTEwsIG9sZF9tYXgpOwomIzQzOwlrc29ja19xdW90YV9fZGVzdHJveShza2VsKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja193cS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uMTg0YjEzNGYzODIzNzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja193cS5jCkBAIC0wLDAgJiM0MzsxLDM0IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dGVzdF9wcm9ncy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX3dxLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2tzb2NrX3dxKHZvaWQpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7CiYjNDM7CXN0cnVjdCBrc29ja193cSAqc2tlbDsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJc2tlbCA9IGtzb2NrX3dxX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O2tzb2NrX3dxIG9wZW4gYW5kIGxvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLmtzb2NrX3dxX3N0YXJ0KSwKJiM0MzsJCQkJICAgICAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuIGtzb2NrX3dxX3N0YXJ0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LKG9wdHMucmV0dmFsLCAmIzM0O2tzb2NrX3dxX3N0YXJ0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwl3aGlsZSAoIV9fYXRvbWljX2xvYWRfbigmYW1wO3NrZWwtJmd0O2Jzcy0mZ3Q7Y2FsbGJhY2tfZG9uZSwgX19BVE9NSUNfQUNRVUlSRSkpCiYjNDM7CQl1c2xlZXAoMTAwMCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O2NyZWF0ZV9lcnIsIC1FT1BOT1RTVVBQLAomIzQzOwkJICAmIzM0O3dvcmtxdWV1ZSBjcmVhdGUgcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlrc29ja193cV9fZGVzdHJveShza2VsKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfYmFzaWMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xODliMGZjMTU3NzAxMQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jCkBAIC0wLDAgJiM0MzsxLDM3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfZW5kaWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfdHJhY2luZ19uZXQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc29ja19jb21tb24uaCYjMzQ7CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBrc29ja19zZXR1cCh2b2lkICpjdHgpCiYjNDM7ewomIzQzOwlyZXR1cm4gZG9fa3NvY2tfc2V0dXAoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBrc29ja19zZW5kKHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSAqdjsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqa3M7CiYjNDM7CWludCBzZW5kID0gLTE7CiYjNDM7CiYjNDM7CXYgPSBrc29ja19jdHhfdmFsdWVfbG9va3VwKCk7CiYjNDM7CWlmICghdikKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwomIzQzOwlrcyA9IGJwZl9rcHRyX3hjaGcoJmFtcDt2LSZndDtjdHgsIE5VTEwpOwomIzQzOwlpZiAoIWtzKQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CXNlbmQgPSBicGZfa3NvY2tfc2VuZChrcywgc2VuZF9kYXRhLCBzaXplb2Yoc2VuZF9kYXRhKSk7CiYjNDM7CWJwZl9rc29ja19yZWxlYXNlKGtzKTsKJiM0MzsJcmV0dXJuIHNlbmQ7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdjZjY0MzE5YjkwMTQ1Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2NvbW1vbi5oCkBAIC0wLDAgJiM0MzsxLDExMCBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqLwomIzQzOwomIzQzOyNpZm5kZWYgX0tTT0NLX0NPTU1PTl9ICiYjNDM7I2RlZmluZSBfS1NPQ0tfQ09NTU9OX0gKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Vycm5vLmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBTT0NLX1NUUkVBTQkxCiYjNDM7I2RlZmluZSBTT0NLX0RHUkFNCTIKJiM0MzsjZGVmaW5lIElQUFJPVE9fVENQCTYKJiM0MzsjZGVmaW5lIElQUFJPVE9fVURQCTE3CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2NyZWF0ZShjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzICpvcHRzLAomIzQzOwkJCQkgICB1MzIgb3B0c19fc3osIGludCAqZXJyX191bmluaXQpIF9fa3N5bTsKJiM0MztpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsCiYjNDM7CQkgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6KSBfX2tzeW07CiYjNDM7aW50IGJwZl9rc29ja19jb25uZWN0KHN0cnVjdCBicGZfa3NvY2sgKmtzLAomIzQzOwkJICAgICAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsIHUzMiBvcHRzX19zeikgX19rc3ltOwomIzQzO3N0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19hY3F1aXJlKHN0cnVjdCBicGZfa3NvY2sgKmtzKSBfX2tzeW07CiYjNDM7dm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcykgX19rc3ltOwomIzQzO2ludCBicGZfa3NvY2tfc2VuZChzdHJ1Y3QgYnBmX2tzb2NrICprcywKJiM0MzsJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBkYXRhX19zeikgX19rc3ltOwomIzQzOwomIzQzO3N0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSB7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4OwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdHlwZShrZXksIGludCk7CiYjNDM7CV9fdHlwZSh2YWx1ZSwgc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0Mzt9IF9fa3NvY2tfY3R4X21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSAqa3NvY2tfY3R4X3ZhbHVlX2xvb2t1cCh2b2lkKQomIzQzO3sKJiM0MzsJdTMyIGtleSA9IDA7CiYjNDM7CiYjNDM7CXJldHVybiBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7X19rc29ja19jdHhfbWFwLCAmYW1wO2tleSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IGtzb2NrX2N0eF9pbnNlcnQoc3RydWN0IGJwZl9rc29jayAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlIGxvY2FsLCAqdjsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqb2xkOwomIzQzOwl1MzIga2V5ID0gMDsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJbG9jYWwuY3R4ID0gTlVMTDsKJiM0MzsJZXJyID0gYnBmX21hcF91cGRhdGVfZWxlbSgmYW1wO19fa3NvY2tfY3R4X21hcCwgJmFtcDtrZXksICZhbXA7bG9jYWwsIDApOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlicGZfa3NvY2tfcmVsZWFzZShjdHgpOwomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwl2ID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO19fa3NvY2tfY3R4X21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIXYpIHsKJiM0MzsJCWJwZl9rc29ja19yZWxlYXNlKGN0eCk7CiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJfQomIzQzOwomIzQzOwlvbGQgPSBicGZfa3B0cl94Y2hnKCZhbXA7di0mZ3Q7Y3R4LCBjdHgpOwomIzQzOwlpZiAob2xkKSB7CiYjNDM7CQlicGZfa3NvY2tfcmVsZWFzZShvbGQpOwomIzQzOwkJcmV0dXJuIC1FRVhJU1Q7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIEdsb2JhbHMgZm9yIHBhc3NpbmcgY29uZmlnIGZyb20gdXNlcnNwYWNlICovCiYjNDM7X19iZTMyIGlwdjRfcmVtb3RlOwomIzQzO19fdTE2IHJlbW90ZV9wb3J0OwomIzQzOwomIzQzO2NoYXIgc2VuZF9kYXRhWzMyXSA9ICYjMzQ7aGVsbG8gZnJvbSBicGYga3NvY2smIzM0OzsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBkb19rc29ja19zZXR1cCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBjcmVhdGVfb3B0cyA9IHt9OwomIzQzOwlzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyBhZGRyX29wdHMgPSB7fTsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqa3M7CiYjNDM7CWludCBlcnIgPSAwOwomIzQzOwomIzQzOwljcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUOwomIzQzOwljcmVhdGVfb3B0cy50eXBlID0gU09DS19ER1JBTTsKJiM0MzsJY3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKJiM0MzsKJiM0MzsJa3MgPSBicGZfa3NvY2tfY3JlYXRlKCZhbXA7Y3JlYXRlX29wdHMsIHNpemVvZihjcmVhdGVfb3B0cyksICZhbXA7ZXJyKTsKJiM0MzsJaWYgKCFrcykKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CiYjNDM7CWFkZHJfb3B0cy5mYW1pbHkgPSBBRl9JTkVUOwomIzQzOwlhZGRyX29wdHMucG9ydCA9IHJlbW90ZV9wb3J0OwomIzQzOwlhZGRyX29wdHMuaXB2NF9hZGRyID0gaXB2NF9yZW1vdGU7CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9rc29ja19jb25uZWN0KGtzLCAmYW1wO2FkZHJfb3B0cywgc2l6ZW9mKGFkZHJfb3B0cykpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlicGZfa3NvY2tfcmVsZWFzZShrcyk7CiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IGtzb2NrX2N0eF9pbnNlcnQoa3MpOwomIzQzOwlpZiAoZXJyICZhbXA7JmFtcDsgZXJyICE9IC1FRVhJU1QpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7I2VuZGlmIC8qIF9LU09DS19DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3F1b3RhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uOTE4NTRlYTMzM2MxMjEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuYwpAQCAtMCwwICYjNDM7MSwxNjcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfY29yZV9yZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl90cmFjaW5nX25ldC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX2NvbW1vbi5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05TX1NMT1RTIDMKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX05FVE5TIDIKJiM0MzsjZGVmaW5lIEtTT0NLX1FVT1RBX1NMT1RTIChLU09DS19RVU9UQV9OU19TTE9UUyAqIEtTT0NLX1FVT1RBX05FVE5TKQomIzQzOwomIzQzO3N0cnVjdCBrc29ja19xdW90YV92YWx1ZSB7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4OwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdHlwZShrZXksIHUzMik7CiYjNDM7CV9fdHlwZSh2YWx1ZSwgc3RydWN0IGtzb2NrX3F1b3RhX3ZhbHVlKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCBLU09DS19RVU9UQV9TTE9UUyk7CiYjNDM7fSBxdW90YV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTsKJiM0MzsJX190eXBlKGtleSwgdTY0KTsKJiM0MzsJX190eXBlKHZhbHVlLCB1OCk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgS1NPQ0tfUVVPVEFfU0xPVFMpOwomIzQzO30gcmVsZWFzZV93b3JrZXJzIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO3UzMiBxdW90YV9jcmVhdGVkOwomIzQzO3UzMiBxdW90YV9yZWxlYXNlZDsKJiM0Mzt1MzIgcXVvdGFfc2xvdF9vZmZzZXQ7CiYjNDM7dTMyIHRhcmdldF9uZXRuc19pbnVtW0tTT0NLX1FVT1RBX05FVE5TXTsKJiM0Mzt1NjQgcXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQ7CiYjNDM7aW50IHF1b3RhX2VycjsKJiM0MzsKJiM0MztzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wKJiM0Mztrc29ja19xdW90YV9jcmVhdGVfb25lKHUzMiBpLAomIzQzOwkJICAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKmNyZWF0ZV9vcHRzKQomIzQzO3sKJiM0MzsJc3RydWN0IGtzb2NrX3F1b3RhX3ZhbHVlICp2OwomIzQzOwlzdHJ1Y3QgYnBmX2tzb2NrICprcywgKm9sZDsKJiM0MzsJaW50IGVyciA9IDA7CiYjNDM7CiYjNDM7CWkgJiM0Mzs9IHF1b3RhX3Nsb3Rfb2Zmc2V0OwomIzQzOwlpZiAoaSAmZ3Q7PSBLU09DS19RVU9UQV9TTE9UUykgewomIzQzOwkJcXVvdGFfZXJyID0gLUVSQU5HRTsKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWJhcnJpZXJfdmFyKGVycik7CiYjNDM7CWtzID0gYnBmX2tzb2NrX2NyZWF0ZShjcmVhdGVfb3B0cywgc2l6ZW9mKCpjcmVhdGVfb3B0cyksICZhbXA7ZXJyKTsKJiM0MzsJaWYgKCFrcykgewomIzQzOwkJcXVvdGFfZXJyID0gZXJyOwomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJdiA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDtxdW90YV9tYXAsICZhbXA7aSk7CiYjNDM7CWlmICghdikgewomIzQzOwkJYnBmX2tzb2NrX3JlbGVhc2Uoa3MpOwomIzQzOwkJcXVvdGFfZXJyID0gLUVOT0VOVDsKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CW9sZCA9IGJwZl9rcHRyX3hjaGcoJmFtcDt2LSZndDtjdHgsIGtzKTsKJiM0MzsJaWYgKG9sZCkKJiM0MzsJCWJwZl9rc29ja19yZWxlYXNlKG9sZCk7CiYjNDM7CXF1b3RhX2NyZWF0ZWQmIzQzOyYjNDM7OwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBrc29ja19xdW90YV9yZWxlYXNlX29uZSh1MzIgaSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqa3M7CiYjNDM7CiYjNDM7CWkgJiM0Mzs9IHF1b3RhX3Nsb3Rfb2Zmc2V0OwomIzQzOwlpZiAoaSAmZ3Q7PSBLU09DS19RVU9UQV9TTE9UUykKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJdiA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDtxdW90YV9tYXAsICZhbXA7aSk7CiYjNDM7CWlmICghdikKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJa3MgPSBicGZfa3B0cl94Y2hnKCZhbXA7di0mZ3Q7Y3R4LCBOVUxMKTsKJiM0MzsJaWYgKGtzKSB7CiYjNDM7CQlicGZfa3NvY2tfcmVsZWFzZShrcyk7CiYjNDM7CQlxdW90YV9yZWxlYXNlZCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBrc29ja19xdW90YV9jcmVhdGUodm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBjcmVhdGVfb3B0cyA9IHt9OwomIzQzOwomIzQzOwljcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUOwomIzQzOwljcmVhdGVfb3B0cy50eXBlID0gU09DS19ER1JBTTsKJiM0MzsJY3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKJiM0MzsJcXVvdGFfY3JlYXRlZCA9IDA7CiYjNDM7CXF1b3RhX2VyciA9IDA7CiYjNDM7CiYjNDM7CWlmIChrc29ja19xdW90YV9jcmVhdGVfb25lKDAsICZhbXA7Y3JlYXRlX29wdHMpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmIChrc29ja19xdW90YV9jcmVhdGVfb25lKDEsICZhbXA7Y3JlYXRlX29wdHMpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWtzb2NrX3F1b3RhX2NyZWF0ZV9vbmUoMiwgJmFtcDtjcmVhdGVfb3B0cyk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IGtzb2NrX3F1b3RhX3JlbGVhc2Uodm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJcXVvdGFfcmVsZWFzZWQgPSAwOwomIzQzOwlrc29ja19xdW90YV9yZWxlYXNlX29uZSgwKTsKJiM0MzsJa3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMSk7CiYjNDM7CWtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKDIpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7ZmVudHJ5L2tzb2NrX3JlbGVhc2Vfd29ya19mbiYjMzQ7KQomIzQzO2ludCBCUEZfUFJPRyhrc29ja19yZWxlYXNlX3dvcmtfZW50ZXIsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCByY3Vfd29yayAqcndvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJjdV93b3JrLCB3b3JrKTsKJiM0MzsJc3RydWN0IGJwZl9rc29jayAqa3MgPSBjb250YWluZXJfb2YocndvcmssIHN0cnVjdCBicGZfa3NvY2ssIHJ3b3JrKTsKJiM0MzsJdTY0IHBpZF90Z2lkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCk7CiYjNDM7CXN0cnVjdCBuZXQgKm5ldDsKJiM0MzsJdTMyIGludW07CiYjNDM7CXU4IHRyYWNrZWQgPSAxOwomIzQzOwomIzQzOwkvKiBrc29ja19yZWxlYXNlX3dvcmtfZm4oKSBmcmVlcyBrcyBiZWZvcmUgdGhlIGZleGl0IHByb2dyYW0gcnVucy4gKi8KJiM0MzsJbmV0ID0gQlBGX0NPUkVfUkVBRChrcywgc29jaywgc2ssIF9fc2tfY29tbW9uLnNrY19uZXQubmV0KTsKJiM0MzsJaWYgKCFuZXQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJaW51bSA9IEJQRl9DT1JFX1JFQUQobmV0LCBucy5pbnVtKTsKJiM0MzsJaWYgKGludW0gIT0gdGFyZ2V0X25ldG5zX2ludW1bMF0gJmFtcDsmYW1wOwomIzQzOwkgICAgaW51bSAhPSB0YXJnZXRfbmV0bnNfaW51bVsxXSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlicGZfbWFwX3VwZGF0ZV9lbGVtKCZhbXA7cmVsZWFzZV93b3JrZXJzLCAmYW1wO3BpZF90Z2lkLCAmYW1wO3RyYWNrZWQsIEJQRl9BTlkpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7ZmV4aXQva3NvY2tfcmVsZWFzZV93b3JrX2ZuJiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKGtzb2NrX3JlbGVhc2Vfd29ya19leGl0LCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiYjNDM7ewomIzQzOwl1NjQgcGlkX3RnaWQgPSBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQoKTsKJiM0MzsJdTggKnRyYWNrZWQ7CiYjNDM7CiYjNDM7CXRyYWNrZWQgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7cmVsZWFzZV93b3JrZXJzLCAmYW1wO3BpZF90Z2lkKTsKJiM0MzsJaWYgKCF0cmFja2VkKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWJwZl9tYXBfZGVsZXRlX2VsZW0oJmFtcDtyZWxlYXNlX3dvcmtlcnMsICZhbXA7cGlkX3RnaWQpOwomIzQzOwomIzQzOwkvKiBUaGUgd29ya2VyIGhhcyByZWxlYXNlZCB0aGUgc29ja2V0IGFuZCByZXR1cm5lZCBpdHMgcXVvdGEgY2hhcmdlLiAqLwomIzQzOwlfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmYW1wO3F1b3RhX3JlbGVhc2VfY29tcGxldGVkLCAxKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjUyZjUyMDA5NDNlMzZhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3JlY3Vyc2lvbi5jCkBAIC0wLDAgJiM0MzsxLDY5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfZW5kaWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfdHJhY2luZ19uZXQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc29ja19jb21tb24uaCYjMzQ7CiYjNDM7CiYjNDM7dm9pZCBicGZfcmN1X3JlYWRfbG9jayh2b2lkKSBfX2tzeW07CiYjNDM7dm9pZCBicGZfcmN1X3JlYWRfdW5sb2NrKHZvaWQpIF9fa3N5bTsKJiM0MzsKJiM0MztpbnQgdGFyZ2V0X3BpZDsKJiM0MztpbnQgdHJpZ2dlcl9zZW5kOwomIzQzOwomIzQzO3Vuc2lnbmVkIGludCByZWNfY291bnQ7CiYjNDM7aW50IHJlY19rZnVuY19yZXRzW10gPSB7IC0xLCAtMSB9OwomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQga3NvY2tfc2V0dXAodm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJcmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2xzbS5zL3NvY2tldF9zZW5kbXNnJiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKGtzb2NrX3NvY2tldF9zZW5kbXNnLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiYjNDM7CSAgICAgaW50IHNpemUsIGludCByZXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgKmtzLCAqdG1wOwomIzQzOwl1MzIgcGlkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCkgJmd0OyZndDsgMzI7CiYjNDM7CWludCBrZnVuY19yZXQ7CiYjNDM7CiYjNDM7CWlmIChyZXQgfHwgIXRyaWdnZXJfc2VuZCB8fCBwaWQgIT0gdGFyZ2V0X3BpZCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXYgPSBrc29ja19jdHhfdmFsdWVfbG9va3VwKCk7CiYjNDM7CWlmICghdikgewomIzQzOwkJa2Z1bmNfcmV0ID0gLUVOT0VOVDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzID0gTlVMTDsKJiM0MzsJYnBmX3JjdV9yZWFkX2xvY2soKTsKJiM0MzsJdG1wID0gdi0mZ3Q7Y3R4OwomIzQzOwlpZiAodG1wKQomIzQzOwkJa3MgPSBicGZfa3NvY2tfYWNxdWlyZSh0bXApOwomIzQzOwlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CiYjNDM7CWlmICgha3MpIHsKJiM0MzsJCWtmdW5jX3JldCA9IC1FTk9FTlQ7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlrZnVuY19yZXQgPSBicGZfa3NvY2tfc2VuZChrcywgc2VuZF9kYXRhLCBzaXplb2Yoc2VuZF9kYXRhKSk7CiYjNDM7CWJwZl9rc29ja19yZWxlYXNlKGtzKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJlY19rZnVuY19yZXRzW3JlY19jb3VudCAmYW1wOyAxXSA9IGtmdW5jX3JldDsKJiM0MzsJX19zeW5jX2ZldGNoX2FuZF9hZGQoJmFtcDtyZWNfY291bnQsIDEpOwomIzQzOwomIzQzOwlpZiAoa2Z1bmNfcmV0ICE9IC1FQlVTWSkKJiM0MzsJCXRyaWdnZXJfc2VuZCA9IDA7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfd3EuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xNmExODczZDEzMmVkZQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jCkBAIC0wLDAgJiM0MzsxLDYyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfdHJhY2luZ19uZXQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtlcnJuby5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzb2NrX2NvbW1vbi5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3Qga3NvY2tfd3FfdmFsdWUgewomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qga3NvY2tfd3FfdmFsdWUpOwomIzQzO30gd29ya19tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7aW50IGNyZWF0ZV9lcnI7CiYjNDM7dTMyIGNhbGxiYWNrX2RvbmU7CiYjNDM7CiYjNDM7c3RhdGljIGludCBrc29ja193cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgb3B0cyA9IHsKJiM0MzsJCS5mYW1pbHkgPSBBRl9JTkVULAomIzQzOwkJLnR5cGUgPSBTT0NLX0RHUkFNLAomIzQzOwkJLnByb3RvY29sID0gSVBQUk9UT19VRFAsCiYjNDM7CX07CiYjNDM7CXN0cnVjdCBicGZfa3NvY2sgKmtzOwomIzQzOwlpbnQgZXJyID0gMDsKJiM0MzsKJiM0MzsJa3MgPSBicGZfa3NvY2tfY3JlYXRlKCZhbXA7b3B0cywgc2l6ZW9mKG9wdHMpLCAmYW1wO2Vycik7CiYjNDM7CWlmIChrcykKJiM0MzsJCWJwZl9rc29ja19yZWxlYXNlKGtzKTsKJiM0MzsJY3JlYXRlX2VyciA9IGVycjsKJiM0MzsJX19zeW5jX2ZldGNoX2FuZF9hZGQoJmFtcDtjYWxsYmFja19kb25lLCAxKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQga3NvY2tfd3Ffc3RhcnQodm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGtzb2NrX3dxX3ZhbHVlICp2YWx1ZTsKJiM0MzsJdTMyIGtleSA9IDA7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CXZhbHVlID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dvcmtfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghdmFsdWUpCiYjNDM7CQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJZXJyID0gYnBmX3dxX2luaXQoJmFtcDt2YWx1ZS0mZ3Q7d29yaywgJmFtcDt3b3JrX21hcCwgMCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwllcnIgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7dmFsdWUtJmd0O3dvcmssIGtzb2NrX3dxX2NhbGxiYWNrLCAwKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CXJldHVybiBicGZfd3Ffc3RhcnQoJmFtcDt2YWx1ZS0mZ3Q7d29yaywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX19saWNlbnNlW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDEyOjU4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMzI1CgkJCQkJCQlvdXRwdXQ6IDIxNwoJCQkJCQkJdGhvdWdodHM6IDExODIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBOZXcgYGJwZl9rc29ja2AgRmVhdHVyZSBmb3IgRnV6emluZyoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgZ290IHRoaXMgbmV3IHBhdGNoIGludHJvZHVjaW5nIGBicGZfa3NvY2tgLCB3aGljaCBsZXRzIEJQRiBwcm9ncmFtcyBjcmVhdGUsIGJpbmQsIGNvbm5lY3QsIGFuZCBzZW5kIGRhdGEgdGhyb3VnaCBrZXJuZWwgc29ja2V0cy4gVGhhdCYjMzk7cyBkZWZpbml0ZWx5IGNvcmUga2VybmVsIGxvZ2ljLCBzcGVjaWZpY2FsbHkgdGhlIEJQRiBzdWJzeXN0ZW0gYW5kIG5ldHdvcmtpbmcsIHNjcmVhbWluZyBmb3IgZnV6emluZy4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBkaWZmIHRvIGlkZW50aWZ5IHRoZSBrZXkgc3ltYm9scyBhbmQgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuCgpGaXJzdCwgbGV0JiMzOTtzIGxvb2sgYXQgdGhlIGNvbmZpZ3MuIFRoZSBgbmV0L2NvcmUvTWFrZWZpbGVgIGFkZHMgYGJwZl9rc29jay5vYCB1bmRlciB0aGUgY29uZGl0aW9uczogYGlmbmVxICgkKENPTkZJR19JTkVUKSwpYCBhbmQgYG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJwZl9rc29jay5vYC4gU28sIHdlICpkZWZpbml0ZWx5KiBuZWVkIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX0lORVRgIHRvIGJlIGVuYWJsZWQuCgpOb3csIGxldCYjMzk7cyBpZGVudGlmeSB0aG9zZSBmb2N1cyBzeW1ib2xzLiBMb29raW5nIGF0IGBuZXQvY29yZS9icGZfa3NvY2suY2AsIHdlIHNlZSB0aGUgbmV3IGZ1bmN0aW9ucyBhcmU6IGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19hY3F1aXJlYCwgYGJwZl9rc29ja19yZWxlYXNlYCwgYGJwZl9rc29ja19yZWxlYXNlX2R0b3JgLCBhbmQgYGJwZl9rc29ja19zZW5kYC4gVGhlc2UgYXJlIGV4cG9zZWQgYXMgQlBGIGtmdW5jcywgc28gZnV6emluZyB0aGVtIGlzIGhpZ2ggcHJpb3JpdHkuIFRoZXJlIGFyZSBhIGZldyBzdXBwb3J0aW5nIGZ1bmN0aW9ucyBhcyB3ZWxsLCBsZXQmIzM5O3Mga2VlcCB0cmFjayBvZiB0aG9zZSBpbiBjYXNlIHRoZXkmIzM5O3JlIHJlbGV2YW50OiBgYnBmX2tzb2NrX25ldF90cnlfY2hhcmdlYCwgYGJwZl9rc29ja19uZXRfdW5jaGFyZ2VgLCBga3NvY2tfcmVsZWFzZV93b3JrX2ZuYCwgYGJwZl9rc29ja19nZXRfYWRkcmAsIGBicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0YCwgYGJwZl9rc29ja19zZW5kX2VudGVyYCwgYW5kIGBicGZfa3NvY2tfc2VuZF9leGl0YC4gQnV0IHRoZSBtYWluIGVudHJ5IHBvaW50cyBmb3IgZnV6emluZyBhcmUgZGVmaW5pdGVseSB0aG9zZSBrZnVuY3MuCgpEb3VibGUtY2hlY2tpbmcgY29uZmlncywgd2UmIzM5O3ZlIGdvdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19JTkVUYCBhcyB0aGUgYmlnIG9uZXMuIEFuZCBnbGFuY2luZyBhdCBgYnBmX2tzb2NrX2dldF9hZGRyYCwgSSBzZWUgYENPTkZJR19JUFY2YCBpcyBhbHNvIHVzZWQuCgpPa2F5LCBsZXQmIzM5O3MgcmVmaW5lIHRoYXQgZm9jdXMgc3ltYm9sIGxpc3QuIEl0IHNlZW1zIGxpa2UgdGhlIGNvcmUgb25lcyBhcmU6IGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19zZW5kYCwgYGJwZl9rc29ja19hY3F1aXJlYCwgYW5kIGBicGZfa3NvY2tfcmVsZWFzZWAuIEFuZCBgYnBmX2tzb2NrX3JlbGVhc2VfZHRvcmAgYW5kIGBicGZfa3NvY2tfZ2V0X2FkZHJgIHNlZW0gaW1wb3J0YW50IHRvby4gSSBtaWdodCBuZWVkIHRvIGNvbnNpZGVyIGBrc29ja19yZWxlYXNlX3dvcmtfZm5gIGxhdGVyLCBhcyBpdCBpcyBhIGtlcm5lbCB3b3JrcXVldWUsIHdoaWNoIHRlbmRzIHRvIGJlIGludGVyZXN0aW5nIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLgoKTGV0JiMzOTtzIHF1aWNrbHkgY2hlY2sgYG5ldC9zb2NrZXQuY2AgdG8gc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRoZXJlLiBZZXAsIHdlJiMzOTt2ZSBnb3QgYF9fc3lzX2Nvbm5lY3Rfc29ja2V0YCBiZWluZyB1c2VkLiBUaGF0JiMzOTtzIGEgbmV3IGZ1bmN0aW9uLCBzbyBsZXQmIzM5O3MgYWRkIHRoYXQgdG8gdGhlIGZvY3VzIHN5bWJvbHMuCgpGaW5hbCByZWZpbmVkIGxpc3Q6IGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19zZW5kYCwgYGJwZl9rc29ja19hY3F1aXJlYCwgYGJwZl9rc29ja19yZWxlYXNlYCwgYW5kIGBfX3N5c19jb25uZWN0X3NvY2tldGAuCgpSaWdodCwgbGV0JiMzOTtzIHZlcmlmeSB0aGUgY29uZmlnczogYENPTkZJR19CUEZfU1lTQ0FMTGAsIGBDT05GSUdfSU5FVGAsIGBDT05GSUdfSVBWNmAuCgpOb3csIHRoZSBpbnN0cnVjdGlvbnMgc2F5IHRvIGF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBjb25maWdzIGFuZCBvbmx5IGxpc3QgdGhvc2Ugc3BlY2lmaWMgdG8gdGhlIG1vZGlmaWVkIGNvZGUuIFRoZXkgYWxzbyB3YW50IHVzIHRvIGRyb3AgdGhlIGBDT05GSUdfYCBwcmVmaXguIGBCUEZfU1lTQ0FMTGAsIGBJTkVUYCwgYW5kIGBJUFY2YCBhcmUga2luZGEgZ2VuZXJpYywgYnV0IHRoZXkgYXJlICpzcGVjaWZpY2FsbHkqIHJlcXVpcmVkIGhlcmUuIFNvLCBsb29raW5nIGF0IHRoZSBNYWtlZmlsZSwgYEJQRl9TWVNDQUxMYCBhbmQgYElORVRgIGFyZSB0aGUgZXhhY3QgY29uZGl0aW9ucy4gU28gdGhvc2UgYXJlIHRoZSBvbmVzIHRvIGluY2x1ZGUuCgpTbywgZnV6emluZyB0aGVzZSBrZnVuY3MgaXMgY3JpdGljYWwsIGFzIHRoZXkmIzM5O3JlIGRpcmVjdGx5IGludGVyZmFjaW5nIEJQRiB3aXRoIHRoZSBuZXR3b3JraW5nIHN0YWNrLiBUaGV5IG5lZWQgdG8gYmUgcmlnb3JvdXNseSB0ZXN0ZWQgZm9yIG1lbW9yeSBzYWZldHkgYW5kIGNvcnJlY3Qgb3BlcmF0aW9uLgoKTGV0JiMzOTtzIGZvcm1hdCB0aGF0IHRvb2wgY2FsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAxMjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7SU5FVCYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2tzb2NrX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYmluZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfY29ubmVjdCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfc2VuZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYWNxdWlyZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfcmVsZWFzZSYjMzQ7LAogICAgJiMzNDtfX3N5c19jb25uZWN0X3NvY2tldCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7SU5FVCYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2tzb2NrX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYmluZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfY29ubmVjdCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfc2VuZCYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfYWNxdWlyZSYjMzQ7LAogICAgJiMzNDticGZfa3NvY2tfcmVsZWFzZSYjMzQ7LAogICAgJiMzNDtfX3N5c19jb25uZWN0X3NvY2tldCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDEyOjU4OjU1LjQ1NTg4MDAzMloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MzUzMjkwNjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJJTkVUXCIsXG4gICAgXCJJUFY2XCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX2tzb2NrX2NyZWF0ZVwiLFxuICAgIFwiYnBmX2tzb2NrX2JpbmRcIixcbiAgICBcImJwZl9rc29ja19jb25uZWN0XCIsXG4gICAgXCJicGZfa3NvY2tfc2VuZFwiLFxuICAgIFwiYnBmX2tzb2NrX2FjcXVpcmVcIixcbiAgICBcImJwZl9rc29ja19yZWxlYXNlXCIsXG4gICAgXCJfX3N5c19jb25uZWN0X3NvY2tldFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGZlYXR1cmUgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBrZXJuZWwgc29ja2V0cyAoYGJwZl9rc29ja2ApLiBUaGlzIGFkZHMgbmV3IEJQRiBrZnVuY3MgKGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19zZW5kYCwgZXRjLikgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgY29yZSBuZXR3b3JraW5nIHN0YWNrLiBGdXp6aW5nIHRoZXNlIGtmdW5jcyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIG1lbW9yeSBzYWZldHkgYW5kIGNvcnJlY3QgYmVoYXZpb3Igb2YgdGhlIG5ldyBmZWF0dXJlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQxMjo1ODo1NS40NTU4ODg2MTJaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUzODQxODY5OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDZjMDQ0YTNiM2FlMmY4MWRhZWQwY2M5MGI5YzQwODQ5Y2Q2MzEzZWJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIE1vbiBKdWwgNiAxMjo1ODo1NCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL3N5c2N0bC9uZXQucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxcbmluZGV4IGU1ODZlMTdmYzdhNTgyLi44YmNkYzFiZmQ3MTEzOCAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL3N5c2N0bC9uZXQucnN0XFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdFxcbkBAIC0xMjgsNiArMTI4LDE4IEBAIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlamVjdCB1bnByaXZpbGVnZWQgSklUIHJlcXVlc3RzIG9uY2UgaXQgaGFzXFxuIGJlZW4gc3VycGFzc2VkLiBicGZfaml0X2xpbWl0IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2xvYmFsIGxpbWl0XFxuIGluIGJ5dGVzLlxcbiBcXG4rYnBmX2tzb2NrX21heFxcbistLS0tLS0tLS0tLS0tXFxuK1xcbitNYXhpbXVtIG51bWJlciBvZiBCUEYga2VybmVsIHNvY2tldHMgdGhhdCBtYXkgZXhpc3QgaW4gZWFjaCBuZXR3b3JrIG5hbWVzcGFjZS5cXG4rVGhpcyBob3N0LXdpZGUgc2V0dGluZyBpcyBleHBvc2VkIGluIHRoZSBpbml0aWFsIG5ldHdvcmsgbmFtZXNwYWNlIGFuZCBhcHBsaWVzXFxuK3RoZSBzYW1lIGxpbWl0IGluZGVwZW5kZW50bHkgdG8gZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuIFNvY2tldHMgYXdhaXRpbmdcXG4rZGVmZXJyZWQgUkNVIGFuZCB3b3JrcXVldWUgY2xlYW51cCByZW1haW4gY291bnRlZCB1bnRpbCB0aGUgdW5kZXJseWluZyBzb2NrZXRcXG4raGFzIGJlZW4gcmVsZWFzZWQuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyBjcmVhdGlvbiBvZiBCUEYga2VybmVsIHNvY2tldHMgaW5cXG4rZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuXFxuK1xcbitEZWZhdWx0OiAxMDI0XFxuK1xcbiBkZXZfd2VpZ2h0XFxuIC0tLS0tLS0tLS1cXG4gXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmggYi9pbmNsdWRlL2xpbnV4L2JwZl9rc29jay5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMDQ4NWI4ZWRkYzFmMjBcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvaW5jbHVkZS9saW51eC9icGZfa3NvY2suaFxcbkBAIC0wLDAgKzEsNTAgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXFxuK1xcbisjaWZuZGVmIF9CUEZfS1NPQ0tfSFxcbisjZGVmaW5lIF9CUEZfS1NPQ0tfSFxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIEJQRl9LU09DS19NQVhfREVGQVVMVCAxMDI0XFxuK1xcbitleHRlcm4gaW50IHN5c2N0bF9icGZfa3NvY2tfbWF4O1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgLSBCUEYga2VybmVsIHNvY2tldCBjcmVhdGlvbiBwYXJhbWV0ZXJzXFxuKyAqIEBmYW1pbHk6XFx0QWRkcmVzcyBmYW1pbHk6IEFGX0lORVQgb3IgQUZfSU5FVDYuXFxuKyAqIEB0eXBlOlxcdFNvY2tldCB0eXBlOiBvbmx5IFNPQ0tfREdSQU0gc3VwcG9ydGVkIGZvciBub3cuXFxuKyAqIEBwcm90b2NvbDpcXHRQcm90b2NvbCBudW1iZXIgKGUuZy4gSVBQUk9UT19VRFApLCBvciAwIGZvciB0aGUgZGVmYXVsdCBwcm90b2NvbFxcbisgKlxcdFxcdG9mIHRoZSBnaXZlbiB0eXBlLlxcbisgKiBAcmVzZXJ2ZWQ6XFx0TXVzdCBiZSB6ZXJvLiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cXG4rICovXFxuK3N0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMge1xcbitcXHRfX3U4IGZhbWlseTtcXG4rXFx0X191OCB0eXBlO1xcbitcXHRfX3U4IHByb3RvY29sO1xcbitcXHRfX3U4IHJlc2VydmVkO1xcbit9O1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIC0gQlBGIGtlcm5lbCBzb2NrZXQgYWRkcmVzcyBwYXJhbWV0ZXJzXFxuKyAqIEBmYW1pbHk6XFx0QWRkcmVzcyBmYW1pbHk6IEFGX0lORVQgb3IgQUZfSU5FVDYuXFxuKyAqIEByZXNlcnZlZDpcXHRNdXN0IGJlIHplcm8uIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxcbisgKiBAcG9ydDpcXHRQb3J0IGluIGhvc3QgYnl0ZSBvcmRlci5cXG4rICogQHNjb3BlX2lkOlxcdElQdjYgc2NvcGUgSUQgZm9yIHNjb3BlZCBBRl9JTkVUNiBhZGRyZXNzZXMsIG9yIHplcm8uXFxuKyAqXFx0XFx0TXVzdCBiZSB6ZXJvIHdoZW4gZmFtaWx5PUFGX0lORVQuXFxuKyAqIEBpcHY0X2FkZHI6XFx0SVB2NCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVULlxcbisgKiBAaXB2Nl9hZGRyOlxcdElQdjYgYWRkcmVzcyAoMTYgYnl0ZXMsIG5ldHdvcmsgYnl0ZSBvcmRlcikuIFVzZWQgd2hlbiBmYW1pbHk9QUZfSU5FVDYuXFxuKyAqL1xcbitzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyB7XFxuK1xcdF9fdTggZmFtaWx5O1xcbitcXHRfX3U4IHJlc2VydmVkO1xcbitcXHRfX3UxNiBwb3J0O1xcbitcXHRfX3UzMiBzY29wZV9pZDtcXG4rXFxuK1xcdHVuaW9uIHtcXG4rXFx0XFx0X19iZTMyIGlwdjRfYWRkcjtcXG4rXFx0XFx0X191MzIgaXB2Nl9hZGRyWzRdOyAvKiBpbjZfYWRkcjsgbmV0d29yayBvcmRlciAqL1xcbitcXHR9O1xcbit9O1xcbitcXG4rI2VuZGlmIC8qIF9CUEZfS1NPQ0tfSCAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxcbmluZGV4IDJhOGQ3YjE0ZjFkMTE5Li40OGYxZWI4MTkzZGVhMSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxcbkBAIC00NjEsNiArNDYxLDggQEAgZXh0ZXJuIHN0cnVjdCBmaWxlICpfX3N5c19zb2NrZXRfZmlsZShpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTtcXG4gZXh0ZXJuIGludCBfX3N5c19iaW5kKGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdW15YWRkciwgaW50IGFkZHJsZW4pO1xcbiBleHRlcm4gaW50IF9fc3lzX2JpbmRfc29ja2V0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxcbiBcXHRcXHRcXHQgICAgIGludCBhZGRybGVuKTtcXG4rZXh0ZXJuIGludCBfX3N5c19jb25uZWN0X3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcixcXG4rXFx0XFx0XFx0XFx0aW50IGFkZHJsZW4sIGludCBmbGFncyk7XFxuIGV4dGVybiBpbnQgX19zeXNfY29ubmVjdF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcixcXG4gXFx0XFx0XFx0ICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKTtcXG4gZXh0ZXJuIGludCBfX3N5c19jb25uZWN0KGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdXNlcnZhZGRyLFxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uNTJmNmE4OTU0NmU0NmEgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXFxuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuQEAgLTQ0MjQsNiArNDQyNCw5IEBAIEJURl9JRChzdHJ1Y3QsIHRhc2tfc3RydWN0KVxcbiAjaWZkZWYgQ09ORklHX0NSWVBUT1xcbiBCVEZfSUQoc3RydWN0LCBicGZfY3J5cHRvX2N0eClcXG4gI2VuZGlmXFxuKyNpZmRlZiBDT05GSUdfSU5FVFxcbitCVEZfSUQoc3RydWN0LCBicGZfa3NvY2spXFxuKyNlbmRpZlxcbiBCVEZfU0VUX0VORChyY3VfcHJvdGVjdGVkX3R5cGVzKVxcbiBcXG4gc3RhdGljIGJvb2wgcmN1X3Byb3RlY3RlZF9vYmplY3QoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9NYWtlZmlsZSBiL25ldC9jb3JlL01ha2VmaWxlXFxuaW5kZXggYjNmZGNiNGUzNTVmYTYuLmE5Mjk1Yjc4NTkwMTA5IDEwMDY0NFxcbi0tLSBhL25ldC9jb3JlL01ha2VmaWxlXFxuKysrIGIvbmV0L2NvcmUvTWFrZWZpbGVcXG5AQCAtNDQsNiArNDQsOSBAQCBvYmotJChDT05GSUdfRkFJTE9WRVIpICs9IGZhaWxvdmVyLm9cXG4gb2JqLSQoQ09ORklHX05FVF9TT0NLX01TRykgKz0gc2ttc2cub1xcbiBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IHNvY2tfbWFwLm9cXG4gb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBicGZfc2tfc3RvcmFnZS5vXFxuK2lmbmVxICgkKENPTkZJR19JTkVUKSwpXFxuK29iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX2tzb2NrLm9cXG4rZW5kaWZcXG4gb2JqLSQoQ09ORklHX09GKVxcdCs9IG9mX25ldC5vXFxuIG9iai0kKENPTkZJR19ORVRfVEVTVCkgKz0gbmV0X3Rlc3Qub1xcbiBvYmotJChDT05GSUdfTkVUX0RFVk1FTSkgKz0gZGV2bWVtLm9cXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvYnBmX2tzb2NrLmMgYi9uZXQvY29yZS9icGZfa3NvY2suY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjhiZGU3MzRiYzkxN2QzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL25ldC9jb3JlL2JwZl9rc29jay5jXFxuQEAgLTAsMCArMSw1MTYgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGZfa3NvY2suaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvY2FjaGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2hhc2guaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2luLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbjYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2xpc3RfYmwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25ldC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcmVmY291bnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdXBkYXRlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc29ja2V0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC91bmFsaWduZWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvaXAuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY25ldC9pcHY2LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NuZXQvbmV0X25hbWVzcGFjZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbmV0L25ldG5zL2dlbmVyaWMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY25ldC9zb2NrLmhcXHUwMDNlXFxuK1xcbisvKipcXG4rICogc3RydWN0IGJwZl9rc29jayAtIHJlZmNvdW50ZWQgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dFxcbisgKiBAc29jazpcXHRUaGUgdW5kZXJseWluZyBrZXJuZWwgc29ja2V0LlxcbisgKiBAdXNhZ2U6XFx0UmVmZXJlbmNlIGNvdW50ZXIuXFxuKyAqIEByd29yazpcXHRSQ1Ugd29yayBmb3IgZGVmZXJyZWQgY2xlYW51cCAoc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXFxuKyAqL1xcbitzdHJ1Y3QgYnBmX2tzb2NrIHtcXG4rXFx0c3RydWN0IHNvY2tldCAqc29jaztcXG4rXFx0cmVmY291bnRfdCB1c2FnZTtcXG4rXFx0c3RydWN0IHJjdV93b3JrIHJ3b3JrO1xcbit9O1xcbitcXG4rc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkIHtcXG4rXFx0c3RydWN0IGhsaXN0X2JsX25vZGUgbm9kZTtcXG4rXFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xcbit9O1xcbitcXG4rI2RlZmluZSBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFMgNlxcbitcXG4rc3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCB7XFxuK1xcdHN0cnVjdCBobGlzdF9ibF9oZWFkIGhlYWQ7XFxuK30gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0XFxuK1xcdGJwZl9rc29ja19zZW5kX2J1Y2tldHNbMSBcXHUwMDNjXFx1MDAzYyBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFNdO1xcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKlxcbiticGZfa3NvY2tfc2VuZF9idWNrZXQoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxcbit7XFxuK1xcdHUzMiBidWNrZXRfaWR4ID0gaGFzaF9wdHIodGFzaywgQlBGX0tTT0NLX1NFTkRfR1VBUkRfSEFTSF9CSVRTKTtcXG4rXFxuK1xcdHJldHVybiBcXHUwMDI2YnBmX2tzb2NrX3NlbmRfYnVja2V0c1tidWNrZXRfaWR4XTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgYnBmX2tzb2NrX3NlbmRfZW50ZXIoc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICpndWFyZClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmVudHJ5O1xcbitcXHRzdHJ1Y3QgaGxpc3RfYmxfbm9kZSAqcG9zO1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfYnVja2V0ICpidWNrZXQ7XFxuK1xcbitcXHRidWNrZXQgPSBicGZfa3NvY2tfc2VuZF9idWNrZXQoY3VycmVudCk7XFxuK1xcdGhsaXN0X2JsX2xvY2soXFx1MDAyNmJ1Y2tldC1cXHUwMDNlaGVhZCk7XFxuK1xcdGhsaXN0X2JsX2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBwb3MsIFxcdTAwMjZidWNrZXQtXFx1MDAzZWhlYWQsIG5vZGUpIHtcXG4rXFx0XFx0aWYgKGVudHJ5LVxcdTAwM2V0YXNrID09IGN1cnJlbnQpIHtcXG4rXFx0XFx0XFx0aGxpc3RfYmxfdW5sb2NrKFxcdTAwMjZidWNrZXQtXFx1MDAzZWhlYWQpO1xcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0Z3VhcmQtXFx1MDAzZXRhc2sgPSBjdXJyZW50O1xcbitcXHRJTklUX0hMSVNUX0JMX05PREUoXFx1MDAyNmd1YXJkLVxcdTAwM2Vub2RlKTtcXG4rXFx0aGxpc3RfYmxfYWRkX2hlYWQoXFx1MDAyNmd1YXJkLVxcdTAwM2Vub2RlLCBcXHUwMDI2YnVja2V0LVxcdTAwM2VoZWFkKTtcXG4rXFx0aGxpc3RfYmxfdW5sb2NrKFxcdTAwMjZidWNrZXQtXFx1MDAzZWhlYWQpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgYnBmX2tzb2NrX3NlbmRfZXhpdChzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmd1YXJkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKmJ1Y2tldDtcXG4rXFxuK1xcdGJ1Y2tldCA9IGJwZl9rc29ja19zZW5kX2J1Y2tldChndWFyZC1cXHUwMDNldGFzayk7XFxuK1xcdGhsaXN0X2JsX2xvY2soXFx1MDAyNmJ1Y2tldC1cXHUwMDNlaGVhZCk7XFxuK1xcdGhsaXN0X2JsX2RlbChcXHUwMDI2Z3VhcmQtXFx1MDAzZW5vZGUpO1xcbitcXHRobGlzdF9ibF91bmxvY2soXFx1MDAyNmJ1Y2tldC1cXHUwMDNlaGVhZCk7XFxuK31cXG4rXFxuK3N0cnVjdCBicGZfa3NvY2tfbmV0IHtcXG4rXFx0YXRvbWljX3QgY291bnQ7XFxuK307XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgaW50IGJwZl9rc29ja19uZXRfaWQ7XFxuK2ludCBzeXNjdGxfYnBmX2tzb2NrX21heCBfX3JlYWRfbW9zdGx5ID0gQlBGX0tTT0NLX01BWF9ERUZBVUxUO1xcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfa3NvY2tfbmV0ICpicGZfa3NvY2tfcGVybmV0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldClcXG4re1xcbitcXHRyZXR1cm4gbmV0X2dlbmVyaWMobmV0LCBicGZfa3NvY2tfbmV0X2lkKTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBicGZfa3NvY2tfbmV0X29wcyA9IHtcXG4rXFx0LmlkID0gXFx1MDAyNmJwZl9rc29ja19uZXRfaWQsXFxuK1xcdC5zaXplID0gc2l6ZW9mKHN0cnVjdCBicGZfa3NvY2tfbmV0KSxcXG4rfTtcXG4rXFxuK3N0YXRpYyBib29sIGJwZl9rc29ja19uZXRfdHJ5X2NoYXJnZShzdHJ1Y3QgbmV0ICpuZXQpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9rc29ja19uZXQgKmtuID0gYnBmX2tzb2NrX3Blcm5ldChuZXQpO1xcbitcXHRpbnQgY291bnQgPSBhdG9taWNfcmVhZChcXHUwMDI2a24tXFx1MDAzZWNvdW50KTtcXG4rXFx0aW50IG1heDtcXG4rXFxuK1xcdGRvIHtcXG4rXFx0XFx0bWF4ID0gUkVBRF9PTkNFKHN5c2N0bF9icGZfa3NvY2tfbWF4KTtcXG4rXFx0XFx0aWYgKGNvdW50IFxcdTAwM2U9IG1heClcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9IHdoaWxlICghYXRvbWljX3RyeV9jbXB4Y2hnKFxcdTAwMjZrbi1cXHUwMDNlY291bnQsIFxcdTAwMjZjb3VudCwgY291bnQgKyAxKSk7XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgYnBmX2tzb2NrX25ldF91bmNoYXJnZShzdHJ1Y3QgbmV0ICpuZXQpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9rc29ja19uZXQgKmtuID0gYnBmX2tzb2NrX3Blcm5ldChuZXQpO1xcbitcXG4rXFx0V0FSTl9PTl9PTkNFKGF0b21pY19kZWNfcmV0dXJuKFxcdTAwMjZrbi1cXHUwMDNlY291bnQpIFxcdTAwM2MgMCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGtzb2NrX3JlbGVhc2Vfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9rc29jayAqa3MgPVxcbitcXHRcXHRjb250YWluZXJfb2YodG9fcmN1X3dvcmsod29yayksIHN0cnVjdCBicGZfa3NvY2ssIHJ3b3JrKTtcXG4rXFx0c3RydWN0IG5ldCAqbmV0ID0gZ2V0X25ldChzb2NrX25ldChrcy1cXHUwMDNlc29jay1cXHUwMDNlc2spKTtcXG4rXFxuK1xcdHNvY2tfcmVsZWFzZShrcy1cXHUwMDNlc29jayk7XFxuK1xcdGJwZl9rc29ja19uZXRfdW5jaGFyZ2UobmV0KTtcXG4rXFx0cHV0X25ldChuZXQpO1xcbitcXHRrZnJlZShrcyk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgYnBmX2tzb2NrX2dldF9hZGRyKGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzICpvcHRzLFxcbitcXHRcXHRcXHQgICAgICB1MzIgb3B0c19fc3osIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIG9wdHNfY29weTtcXG4rXFxuK1xcdGlmICghb3B0cyB8fCBvcHRzX19zeiAhPSBzaXplb2YoKm9wdHMpKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdC8qIEtmdW5jIG1lbW9yeSBhcmd1bWVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIG5hdHVyYWxseSBhbGlnbmVkLiAqL1xcbitcXHRtZW1jcHkoXFx1MDAyNm9wdHNfY29weSwgb3B0cywgc2l6ZW9mKG9wdHNfY29weSkpO1xcbitcXG4rXFx0aWYgKG9wdHNfY29weS5yZXNlcnZlZClcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRzd2l0Y2ggKG9wdHNfY29weS5mYW1pbHkpIHtcXG4rXFx0Y2FzZSBBRl9JTkVUOiB7XFxuK1xcdFxcdHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjQgPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcjtcXG4rXFxuK1xcdFxcdGlmIChvcHRzX2NvcHkuc2NvcGVfaWQpXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0XFx0KmFkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbil7XFxuK1xcdFxcdFxcdC5zaW5fZmFtaWx5ID0gQUZfSU5FVCxcXG4rXFx0XFx0XFx0LnNpbl9wb3J0ID0gaHRvbnMob3B0c19jb3B5LnBvcnQpLFxcbitcXHRcXHRcXHQuc2luX2FkZHIuc19hZGRyID0gb3B0c19jb3B5LmlwdjRfYWRkcixcXG4rXFx0XFx0fTtcXG4rXFx0XFx0cmV0dXJuIHNpemVvZigqYWRkcjQpO1xcbitcXHR9XFxuKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KVxcbitcXHRjYXNlIEFGX0lORVQ2OiB7XFxuK1xcdFxcdHN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyO1xcbitcXG4rXFx0XFx0KmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYpe1xcbitcXHRcXHRcXHQuc2luNl9mYW1pbHkgPSBBRl9JTkVUNixcXG4rXFx0XFx0XFx0LnNpbjZfcG9ydCA9IGh0b25zKG9wdHNfY29weS5wb3J0KSxcXG4rXFx0XFx0XFx0LnNpbjZfc2NvcGVfaWQgPSBvcHRzX2NvcHkuc2NvcGVfaWQsXFxuK1xcdFxcdH07XFxuK1xcdFxcdG1lbWNweShcXHUwMDI2YWRkcjYtXFx1MDAzZXNpbjZfYWRkciwgb3B0c19jb3B5LmlwdjZfYWRkcixcXG4rXFx0XFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTtcXG4rXFx0XFx0cmV0dXJuIHNpemVvZigqYWRkcjYpO1xcbitcXHR9XFxuKyNlbmRpZlxcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXR1cm4gLUVBRk5PU1VQUE9SVDtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KHZvaWQpXFxuK3tcXG4rXFx0LypcXG4rXFx0ICogVGFzayB3b3JrIGNhbiBydW4gZnJvbSBkb19leGl0KCkgYWZ0ZXIgZXhpdF9uc3Byb3h5X25hbWVzcGFjZXMoKVxcbitcXHQgKiBjbGVhcmVkIGN1cnJlbnQtXFx1MDAzZW5zcHJveHksIHdoaWxlIGN1cnJlbnQgaXMgc3RpbGwgbm90IGEga3RocmVhZC5cXG4rXFx0ICovXFxuK1xcdHJldHVybiAhKGN1cnJlbnQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUEZfS1RIUkVBRCkgXFx1MDAyNlxcdTAwMjYgY3VycmVudC1cXHUwMDNlbnNwcm94eTtcXG4rfVxcbitcXG4rX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19jcmVhdGUoKSAtIENyZWF0ZSBhIEJQRiBrZXJuZWwgc29ja2V0LlxcbisgKlxcbisgKiBBbGxvY2F0ZXMgYW5kIGNyZWF0ZXMgYSBrZXJuZWwgc29ja2V0LlxcbisgKiBUaGUgc29ja2V0IGlzIGNoYXJnZWQgYWdhaW5zdCB0aGUgYWN0aXZlIG5ldHdvcmsgbmFtZXNwYWNlJ3MgQlBGIGtlcm5lbFxcbisgKiBzb2NrZXQgcXVvdGEuXFxuKyAqXFxuKyAqIFRoZSByZXR1cm5lZCBjb250ZXh0IG11c3QgZWl0aGVyIGJlIHN0b3JlZCBpbiBhIG1hcCBhcyBhIGtwdHIsIG9yXFxuKyAqIGZyZWVkIHdpdGggYnBmX2tzb2NrX3JlbGVhc2UoKS5cXG4rICpcXG4rICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgKHNvY2tfY3JlYXRlKSwgc28gaXQgY2FuIG9ubHkgYmUgdXNlZFxcbisgKiBpbiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS5cXG4rICogSXQgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgQlBGIHdvcmtxdWV1ZSBjYWxsYmFjayBiZWNhdXNlIHRoYXQgY2FsbGJhY2tcXG4rICogZG9lcyBub3QgcmV0YWluIHRoZSBpbnZva2luZyB0YXNrJ3MgbmFtZXNwYWNlIG9yIHNlY3VyaXR5IGNvbnRleHQuXFxuKyAqXFxuKyAqIEBvcHRzOlxcdFBvaW50ZXIgdG8gc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyB3aXRoIHNvY2tldCBwYXJhbWV0ZXJzLlxcbisgKiBAb3B0c19fc3o6XFx0U2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuXFxuKyAqIEBlcnJfX3VuaW5pdDpcXHRJbnRlZ2VyIHRvIHN0b3JlIGVycm9yIGNvZGUgd2hlbiBOVUxMIGlzIHJldHVybmVkLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqXFxuK2JwZl9rc29ja19jcmVhdGUoY29uc3Qgc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6LFxcbitcXHRcXHQgaW50ICplcnJfX3VuaW5pdClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIG9wdHNfY29weTtcXG4rXFx0c3RydWN0IGJwZl9rc29jayAqa3M7XFxuK1xcdHN0cnVjdCBuZXQgKm5ldDtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIHNvY2tfY3JlYXRlKCkgZGVyaXZlcyB0aGUgbmV0d29yayBuYW1lc3BhY2UsIGNyZWRlbnRpYWxzLCBhbmQgY2dyb3VwXFxuK1xcdCAqIGZyb20gY3VycmVudC4gS2VybmVsIHRocmVhZHMsIGluY2x1ZGluZyBCUEYgd29ya3F1ZXVlIGNhbGxiYWNrcywgZG9cXG4rXFx0ICogbm90IGNhcnJ5IHRoZSBjb250ZXh0IG9mIHRoZSB0YXNrIHRoYXQgaW52b2tlZCB0aGUgQlBGIHByb2dyYW0uXFxuK1xcdCAqL1xcbitcXHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSkge1xcbitcXHRcXHRlcnIgPSAtRU9QTk9UU1VQUDtcXG4rXFx0XFx0Z290byBlcnJfb3V0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIW9wdHMgfHwgb3B0c19fc3ogIT0gc2l6ZW9mKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpKSB7XFxuK1xcdFxcdGVyciA9IC1FSU5WQUw7XFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0fVxcbitcXG4rXFx0b3B0c19jb3B5ID0gKHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMpe1xcbitcXHRcXHQuZmFtaWx5ID0gUkVBRF9PTkNFKG9wdHMtXFx1MDAzZWZhbWlseSksXFxuK1xcdFxcdC50eXBlID0gUkVBRF9PTkNFKG9wdHMtXFx1MDAzZXR5cGUpLFxcbitcXHRcXHQucHJvdG9jb2wgPSBSRUFEX09OQ0Uob3B0cy1cXHUwMDNlcHJvdG9jb2wpLFxcbitcXHRcXHQucmVzZXJ2ZWQgPSBSRUFEX09OQ0Uob3B0cy1cXHUwMDNlcmVzZXJ2ZWQpLFxcbitcXHR9O1xcbitcXG4rXFx0aWYgKG9wdHNfY29weS5yZXNlcnZlZCkge1xcbitcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChvcHRzX2NvcHkuZmFtaWx5ICE9IEFGX0lORVQgXFx1MDAyNlxcdTAwMjYgb3B0c19jb3B5LmZhbWlseSAhPSBBRl9JTkVUNikge1xcbitcXHRcXHRlcnIgPSAtRUFGTk9TVVBQT1JUO1xcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChvcHRzX2NvcHkudHlwZSAhPSBTT0NLX0RHUkFNKSB7XFxuK1xcdFxcdGVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7XFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKG9wdHNfY29weS5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCBcXHUwMDI2XFx1MDAyNiBvcHRzX2NvcHkucHJvdG9jb2wgIT0gMCkge1xcbitcXHRcXHRlcnIgPSAtRVBST1RPTk9TVVBQT1JUO1xcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGtzID0ga3phbGxvY19vYmooKmtzKTtcXG4rXFx0aWYgKCFrcykge1xcbitcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdG5ldCA9IGN1cnJlbnQtXFx1MDAzZW5zcHJveHktXFx1MDAzZW5ldF9ucztcXG4rXFx0aWYgKCFicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2UobmV0KSkge1xcbitcXHRcXHRlcnIgPSAtRU5PU1BDO1xcbitcXHRcXHRnb3RvIGVycl9mcmVlO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVc2UgdGhlIG5vcm1hbCBjdXJyZW50LXRhc2sgc29ja2V0IHBhdGggc28gTFNNL2Nncm91cCBwb2xpY3ksXFxuK1xcdCAqIHNvY2tldCBsYWJlbHMsIGFuZCB0aGUgYWN0aXZlIG5ldG5zIHJlZmVyZW5jZSBtYXRjaCBhIHNvY2tldCgyKVxcbitcXHQgKiBjcmVhdGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSdzIGNhbGxlci5cXG4rXFx0ICovXFxuK1xcdGVyciA9IHNvY2tfY3JlYXRlKG9wdHNfY29weS5mYW1pbHksIG9wdHNfY29weS50eXBlLCBvcHRzX2NvcHkucHJvdG9jb2wsXFxuK1xcdFxcdFxcdCAgXFx1MDAyNmtzLVxcdTAwM2Vzb2NrKTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0Z290byBlcnJfdW5jaGFyZ2U7XFxuK1xcbitcXHRrcy1cXHUwMDNlc29jay1cXHUwMDNlc2stXFx1MDAzZXNrX3JjdmJ1ZiA9IFNPQ0tfTUlOX1JDVkJVRjtcXG4rXFx0a3MtXFx1MDAzZXNvY2stXFx1MDAzZXNrLVxcdTAwM2Vza191c2VybG9ja3MgfD0gU09DS19SQ1ZCVUZfTE9DSztcXG4rXFxuK1xcdHJlZmNvdW50X3NldChcXHUwMDI2a3MtXFx1MDAzZXVzYWdlLCAxKTtcXG4rXFx0cHV0X3VuYWxpZ25lZCgwLCBlcnJfX3VuaW5pdCk7XFxuK1xcdHJldHVybiBrcztcXG4rXFxuK2Vycl91bmNoYXJnZTpcXG4rXFx0YnBmX2tzb2NrX25ldF91bmNoYXJnZShuZXQpO1xcbitlcnJfZnJlZTpcXG4rXFx0a2ZyZWUoa3MpO1xcbitlcnJfb3V0OlxcbitcXHRwdXRfdW5hbGlnbmVkKGVyciwgZXJyX191bmluaXQpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19iaW5kKCkgLSBCaW5kIGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNzLlxcbisgKiBAa3M6XFx0XFx0VGhlIEJQRiBrZXJuZWwgc29ja2V0IGNvbnRleHQuXFxuKyAqIEBvcHRzOlxcdFBvaW50ZXIgdG8gc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgd2l0aCBsb2NhbCBhZGRyZXNzLlxcbisgKiBAb3B0c19fc3o6XFx0U2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuXFxuKyAqXFxuKyAqIEJpbmRzIHRoZSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBhZGRyZXNzIGFuZCBwb3J0LlxcbisgKiBUaGlzIGlzIG9wdGlvbmFsOyBpZiBub3QgY2FsbGVkLCB0aGUga2VybmVsIHdpbGwgYXV0by1hc3NpZ24uXFxuKyAqXFxuKyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIHdoaWxlIGJpbmRpbmcgdGhlIHNvY2tldCwgc28gaXQgY2FuIG9ubHkgYmUgdXNlZCBpblxcbisgKiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19iaW5kKHN0cnVjdCBicGZfa3NvY2sgKmtzLFxcbitcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsXFxuK1xcdFxcdFxcdCAgICAgICB1MzIgb3B0c19fc3opXFxuK3tcXG4rXFx0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9O1xcbitcXHRpbnQgYWRkcmxlbjtcXG4rXFxuK1xcdGlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHRhZGRybGVuID0gYnBmX2tzb2NrX2dldF9hZGRyKG9wdHMsIG9wdHNfX3N6LCBcXHUwMDI2YWRkcik7XFxuK1xcdGlmIChhZGRybGVuIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIGFkZHJsZW47XFxuK1xcbitcXHRyZXR1cm4gX19zeXNfYmluZF9zb2NrZXQoa3MtXFx1MDAzZXNvY2ssIFxcdTAwMjZhZGRyLCBhZGRybGVuKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19jb25uZWN0KCkgLSBDb25uZWN0IGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSByZW1vdGUgYWRkcmVzcy5cXG4rICogQGtzOlxcdFxcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LlxcbisgKiBAb3B0czpcXHRQb2ludGVyIHRvIHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHdpdGggcmVtb3RlIGFkZHJlc3MuXFxuKyAqIEBvcHRzX19zejpcXHRTaXplIG9mIHRoZSBvcHRzIHN0cnVjdC5cXG4rICpcXG4rICogQ29ubmVjdHMgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBhZGRyZXNzIGFuZCBwb3J0LlxcbisgKlxcbisgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCB3aGlsZSBjb25uZWN0aW5nIHRoZSBzb2NrZXQsIHNvIGl0IGNhbiBvbmx5IGJlIHVzZWRcXG4rICogaW4gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfa3NvY2tfY29ubmVjdChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcXG4rXFx0XFx0XFx0XFx0ICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcXG4rXFx0XFx0XFx0XFx0ICB1MzIgb3B0c19fc3opXFxuK3tcXG4rXFx0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9O1xcbitcXHRpbnQgYWRkcmxlbjtcXG4rXFxuK1xcdGlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHRhZGRybGVuID0gYnBmX2tzb2NrX2dldF9hZGRyKG9wdHMsIG9wdHNfX3N6LCBcXHUwMDI2YWRkcik7XFxuK1xcdGlmIChhZGRybGVuIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIGFkZHJsZW47XFxuK1xcbitcXHRyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoa3MtXFx1MDAzZXNvY2ssIFxcdTAwMjZhZGRyLCBhZGRybGVuLCAwKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19hY3F1aXJlKCkgLSBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIGEgQlBGIGtlcm5lbCBzb2NrZXQuXFxuKyAqIEBrczpcXHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byBhY3F1aXJlLiBNdXN0IGJlIGFcXG4rICpcXHR0cnVzdGVkIHBvaW50ZXIgKGUuZy4gUkNVLXByb3RlY3RlZCBrcHRyIGZyb20gYSBtYXApLlxcbisgKlxcbisgKiBUaGUgYWNxdWlyZWQgY29udGV4dCBtdXN0IGVpdGhlciBiZSBzdG9yZWQgaW4gYSBtYXAgYXMgYSBrcHRyLCBvclxcbisgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYnBmX2tzb2NrICpicGZfa3NvY2tfYWNxdWlyZShzdHJ1Y3QgYnBmX2tzb2NrICprcylcXG4re1xcbitcXHRpZiAoIXJlZmNvdW50X2luY19ub3RfemVybyhcXHUwMDI2a3MtXFx1MDAzZXVzYWdlKSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiBrcztcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9rc29ja19yZWxlYXNlKCkgLSBSZWxlYXNlIGEgQlBGIGtlcm5lbCBzb2NrZXQuXFxuKyAqIEBrczpcXHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byByZWxlYXNlLlxcbisgKlxcbisgKiBXaGVuIHRoZSBmaW5hbCByZWZlcmVuY2UgaXMgcmVsZWFzZWQsIHRoZSBzb2NrZXQgaXMgY2xlYW5lZCB1cCB2aWFcXG4rICogcXVldWVfcmN1X3dvcmsoKSAoc2luY2Ugc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9rc29ja19yZWxlYXNlKHN0cnVjdCBicGZfa3NvY2sgKmtzKVxcbit7XFxuK1xcdGlmIChyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXFx1MDAyNmtzLVxcdTAwM2V1c2FnZSkpIHtcXG4rXFx0XFx0SU5JVF9SQ1VfV09SSyhcXHUwMDI2a3MtXFx1MDAzZXJ3b3JrLCBrc29ja19yZWxlYXNlX3dvcmtfZm4pO1xcbitcXHRcXHRxdWV1ZV9yY3Vfd29yayhzeXN0ZW1fZGZsX3dxLCBcXHUwMDI2a3MtXFx1MDAzZXJ3b3JrKTtcXG4rXFx0fVxcbit9XFxuK1xcbitfX2JwZl9rZnVuYyB2b2lkIGJwZl9rc29ja19yZWxlYXNlX2R0b3Iodm9pZCAqa3MpXFxuK3tcXG4rXFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xcbit9XFxuK0NGSV9OT1NFQUwoYnBmX2tzb2NrX3JlbGVhc2VfZHRvcik7XFxuK1xcbisvKipcXG4rICogYnBmX2tzb2NrX3NlbmQoKSAtIFNlbmQgZGF0YSB0aHJvdWdoIGEgQlBGIGtlcm5lbCBzb2NrZXQuXFxuKyAqIEBrczpcXHRcXHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dC4gTXVzdCBiZSBhbiBhY3F1aXJlZCByZWZlcmVuY2UuXFxuKyAqIEBkYXRhOlxcdFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gc2VuZC5cXG4rICogQGRhdGFfX3N6OlxcdFNpemUgb2YgdGhlIGRhdGEgdG8gc2VuZCAobWF4IDY1NTM1IGJ5dGVzKS5cXG4rICpcXG4rICogU2VuZHMgZGF0YSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQsIGJlc3QtZWZmb3J0IGFuZCBub25ibG9ja2luZy4gVGhpcyBtYXkgc2xlZXBcXG4rICogKGtlcm5lbF9zZW5kbXNnKSwgc28gaXQgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcy5cXG4rICpcXG4rICogUmV0dXJuOiBOdW1iZXIgb2YgYnl0ZXMgc2VudCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfa3NvY2tfc2VuZChzdHJ1Y3QgYnBmX2tzb2NrICprcywgY29uc3Qgdm9pZCAqZGF0YSxcXG4rXFx0XFx0XFx0ICAgICAgIHUzMiBkYXRhX19zeilcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgZ3VhcmQ7XFxuK1xcdHN0cnVjdCBtc2doZHIgbXNnID0ge1xcbitcXHRcXHQubXNnX2ZsYWdzID0gTVNHX0RPTlRXQUlULFxcbitcXHR9O1xcbitcXHRzdHJ1Y3Qga3ZlYyBpb3YgPSB7XFxuK1xcdFxcdC5pb3ZfYmFzZSA9ICh2b2lkICopZGF0YSxcXG4rXFx0XFx0Lmlvdl9sZW4gPSBkYXRhX19zeixcXG4rXFx0fTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGlmICghYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCgpKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHQvKiBFYXJseSBjaGVjayBmb3IgVURQLiBFeGFjdCBsaW1pdHMgZW5mb3JjZWQgYnkga2VybmVsX3NlbmRtc2coKS4gKi9cXG4rXFx0aWYgKGRhdGFfX3N6IFxcdTAwM2UgSVBfTUFYX01UVSlcXG4rXFx0XFx0cmV0dXJuIC1FTVNHU0laRTtcXG4rXFxuK1xcdGlmICghYnBmX2tzb2NrX3NlbmRfZW50ZXIoXFx1MDAyNmd1YXJkKSlcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFxuK1xcdHJldCA9IGtlcm5lbF9zZW5kbXNnKGtzLVxcdTAwM2Vzb2NrLCBcXHUwMDI2bXNnLCBcXHUwMDI2aW92LCAxLCBkYXRhX19zeik7XFxuK1xcdGJwZl9rc29ja19zZW5kX2V4aXQoXFx1MDAyNmd1YXJkKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XFxuK1xcbitCVEZfS0ZVTkNTX1NUQVJUKGtzb2NrX2luaXRfa2Z1bmNfYnRmX2lkcylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19jcmVhdGUsIEtGX0FDUVVJUkUgfCBLRl9SRVRfTlVMTCB8IEtGX1NMRUVQQUJMRSlcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19iaW5kLCBLRl9TTEVFUEFCTEUpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfY29ubmVjdCwgS0ZfU0xFRVBBQkxFKVxcbitCVEZfS0ZVTkNTX0VORChrc29ja19pbml0X2tmdW5jX2J0Zl9pZHMpXFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQga3NvY2tfaW5pdF9rZnVuY19zZXQgPSB7XFxuK1xcdC5vd25lciA9IFRISVNfTU9EVUxFLFxcbitcXHQuc2V0ID0gXFx1MDAyNmtzb2NrX2luaXRfa2Z1bmNfYnRmX2lkcyxcXG4rfTtcXG4rXFxuK0JURl9LRlVOQ1NfU1RBUlQoa3NvY2tfa2Z1bmNfYnRmX2lkcylcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19yZWxlYXNlLCBLRl9SRUxFQVNFKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX2FjcXVpcmUsIEtGX0FDUVVJUkUgfCBLRl9SQ1UgfCBLRl9SRVRfTlVMTClcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19zZW5kLCBLRl9TTEVFUEFCTEUpXFxuK0JURl9LRlVOQ1NfRU5EKGtzb2NrX2tmdW5jX2J0Zl9pZHMpXFxuK1xcbitzdGF0aWMgaW50IGJwZl9rc29ja19rZnVuY19maWx0ZXIoY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1MzIga2Z1bmNfaWQpXFxuK3tcXG4rXFx0aWYgKCFidGZfaWRfc2V0OF9jb250YWlucyhcXHUwMDI2a3NvY2tfa2Z1bmNfYnRmX2lkcywga2Z1bmNfaWQpIHx8XFxuK1xcdCAgICBwcm9nLVxcdTAwM2V0eXBlID09IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCB8fFxcbitcXHQgICAgcHJvZy1cXHUwMDNldHlwZSA9PSBCUEZfUFJPR19UWVBFX0xTTSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gLUVBQ0NFUztcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGtzb2NrX2tmdW5jX3NldCA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC5zZXQgPSBcXHUwMDI2a3NvY2tfa2Z1bmNfYnRmX2lkcyxcXG4rXFx0LmZpbHRlciA9IGJwZl9rc29ja19rZnVuY19maWx0ZXIsXFxuK307XFxuK1xcbitCVEZfSURfTElTVChicGZfa3NvY2tfZHRvcl9pZHMpXFxuK0JURl9JRChzdHJ1Y3QsIGJwZl9rc29jaylcXG4rQlRGX0lEKGZ1bmMsIGJwZl9rc29ja19yZWxlYXNlX2R0b3IpXFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBicGZfa3NvY2tfa2Z1bmNfaW5pdCh2b2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcdGNvbnN0IHN0cnVjdCBidGZfaWRfZHRvcl9rZnVuYyBicGZfa3NvY2tfZHRvcnNbXSA9IHtcXG4rXFx0XFx0e1xcbitcXHRcXHRcXHQuYnRmX2lkID0gYnBmX2tzb2NrX2R0b3JfaWRzWzBdLFxcbitcXHRcXHRcXHQua2Z1bmNfYnRmX2lkID0gYnBmX2tzb2NrX2R0b3JfaWRzWzFdLFxcbitcXHRcXHR9LFxcbitcXHR9O1xcbitcXG4rXFx0cmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cyhcXHUwMDI2YnBmX2tzb2NrX25ldF9vcHMpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdTAwMjZrc29ja19pbml0X2tmdW5jX3NldCk7XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0dW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKFxcdTAwMjZicGZfa3NvY2tfbmV0X29wcyk7XFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxcbitcXHRcXHRcXHRcXHRcXHRcXHUwMDI2a3NvY2tfa2Z1bmNfc2V0KTtcXG4rXFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MU00sXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2a3NvY2tfa2Z1bmNfc2V0KTtcXG4rXFx0cmV0dXJuIHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoYnBmX2tzb2NrX2R0b3JzLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgQVJSQVlfU0laRShicGZfa3NvY2tfZHRvcnMpLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgVEhJU19NT0RVTEUpO1xcbit9XFxuK1xcbitsYXRlX2luaXRjYWxsKGJwZl9rc29ja19rZnVuY19pbml0KTtcXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMgYi9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuY1xcbmluZGV4IGI1MDg2MThiZmMxMjM5Li5kMjIxYTE4MGM4NzcwNSAxMDA2NDRcXG4tLS0gYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuY1xcbisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jXFxuQEAgLTcsNiArNyw3IEBAXFxuICAqL1xcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbHRlci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmX2tzb2NrLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc3lzY3RsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGUuaFxcdTAwM2VcXG5AQCAtNTI1LDYgKzUyNiwxNiBAQCBzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBuZXRfY29yZV90YWJsZVtdID0ge1xcbiBcXHRcXHQuZXh0cmExXFx0XFx0PSBTWVNDVExfTE9OR19PTkUsXFxuIFxcdFxcdC5leHRyYTJcXHRcXHQ9IFxcdTAwMjZicGZfaml0X2xpbWl0X21heCxcXG4gXFx0fSxcXG4rI2VuZGlmXFxuKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUEZfU1lTQ0FMTCkgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfSU5FVClcXG4rXFx0e1xcbitcXHRcXHQucHJvY25hbWVcXHQ9IFxcXCJicGZfa3NvY2tfbWF4XFxcIixcXG4rXFx0XFx0LmRhdGFcXHRcXHQ9IFxcdTAwMjZzeXNjdGxfYnBmX2tzb2NrX21heCxcXG4rXFx0XFx0Lm1heGxlblxcdFxcdD0gc2l6ZW9mKGludCksXFxuK1xcdFxcdC5tb2RlXFx0XFx0PSAwNjQ0LFxcbitcXHRcXHQucHJvY19oYW5kbGVyXFx0PSBwcm9jX2RvaW50dmVjX21pbm1heCxcXG4rXFx0XFx0LmV4dHJhMVxcdFxcdD0gU1lTQ1RMX1pFUk8sXFxuK1xcdH0sXFxuICNlbmRpZlxcbiBcXHR7XFxuIFxcdFxcdC5wcm9jbmFtZVxcdD0gXFxcIm5ldGRldl90c3RhbXBfcHJlcXVldWVcXFwiLFxcbmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmNcXG5pbmRleCA2M2M2OWEwZmE3NGUxZS4uYzc0MjdkZDRkZDUyM2QgMTAwNjQ0XFxuLS0tIGEvbmV0L3NvY2tldC5jXFxuKysrIGIvbmV0L3NvY2tldC5jXFxuQEAgLTIxMTUsMjcgKzIxMTUsMzEgQEAgU1lTQ0FMTF9ERUZJTkUzKGFjY2VwdCwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1cGVlcl9zb2NrYWRkcixcXG4gICpcXHRpbmNsdWRlIHRoZSAtRUlOUFJPR1JFU1Mgc3RhdHVzIGZvciBzdWNoIHNvY2tldHMuXFxuICAqL1xcbiBcXG4raW50IF9fc3lzX2Nvbm5lY3Rfc29ja2V0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxcbitcXHRcXHRcXHQgaW50IGFkZHJsZW4sIGludCBmbGFncylcXG4re1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZXJyID0gc2VjdXJpdHlfc29ja2V0X2Nvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsIGFkZHJsZW4pO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0cmV0dXJuIFJFQURfT05DRShzb2NrLVxcdTAwM2VvcHMpLVxcdTAwM2Vjb25uZWN0KHNvY2ssXFxuK1xcdFxcdFxcdFxcdCAgICAoc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKilhZGRyZXNzLFxcbitcXHRcXHRcXHRcXHQgICAgYWRkcmxlbiwgZmxhZ3MpO1xcbit9XFxuK1xcbiBpbnQgX19zeXNfY29ubmVjdF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcmVzcyxcXG4gXFx0XFx0ICAgICAgIGludCBhZGRybGVuLCBpbnQgZmlsZV9mbGFncylcXG4ge1xcbiBcXHRzdHJ1Y3Qgc29ja2V0ICpzb2NrO1xcbi1cXHRpbnQgZXJyO1xcbiBcXG4gXFx0c29jayA9IHNvY2tfZnJvbV9maWxlKGZpbGUpO1xcbi1cXHRpZiAoIXNvY2spIHtcXG4tXFx0XFx0ZXJyID0gLUVOT1RTT0NLO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbi1cXG4tXFx0ZXJyID1cXG4tXFx0ICAgIHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTtcXG4tXFx0aWYgKGVycilcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghc29jaylcXG4rXFx0XFx0cmV0dXJuIC1FTk9UU09DSztcXG4gXFxuLVxcdGVyciA9IFJFQURfT05DRShzb2NrLVxcdTAwM2VvcHMpLVxcdTAwM2Vjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqKWFkZHJlc3MsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICBhZGRybGVuLCBzb2NrLVxcdTAwM2VmaWxlLVxcdTAwM2VmX2ZsYWdzIHwgZmlsZV9mbGFncyk7XFxuLW91dDpcXG4tXFx0cmV0dXJuIGVycjtcXG4rXFx0cmV0dXJuIF9fc3lzX2Nvbm5lY3Rfc29ja2V0KHNvY2ssIGFkZHJlc3MsIGFkZHJsZW4sXFxuK1xcdFxcdFxcdFxcdCAgICBzb2NrLVxcdTAwM2VmaWxlLVxcdTAwM2VmX2ZsYWdzIHwgZmlsZV9mbGFncyk7XFxuIH1cXG4gXFxuIGludCBfX3N5c19jb25uZWN0KGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdXNlcnZhZGRyLCBpbnQgYWRkcmxlbilcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi44YjE0ZmQ5OGQ0MTBlZFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29jay5jXFxuQEAgLTAsMCArMSwyMzkgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2FycGEvaW5ldC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcInRlc3RfcHJvZ3MuaFxcXCJcXG4rI2luY2x1ZGUgXFxcIm5ldHdvcmtfaGVscGVycy5oXFxcIlxcbisjaW5jbHVkZSBcXFwia3NvY2tfYmFzaWMuc2tlbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwia3NvY2tfcmVjdXJzaW9uLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgTlNfVEVTVCBcXFwia3NvY2tfYmFzaWNfbnNcXFwiXFxuKyNkZWZpbmUgTlNfTFNNX1JFQ1VSU0lPTl9URVNUIFxcXCJrc29ja19sc21fcmVjdXJzaW9uX25zXFxcIlxcbisjZGVmaW5lIExPT1BCQUNLX0lQIFxcXCIxMjcuMC4wLjFcXFwiXFxuKyNkZWZpbmUgUkVDVl9QT1JUIDc3NzdcXG4rI2RlZmluZSBSRUNWX1RJTUVPVVRfU0VDIDVcXG4rXFxuK3N0cnVjdCBrc29ja190ZXN0X2VudiB7XFxuK1xcdGNvbnN0IGNoYXIgKm5ldG5zO1xcbitcXHRib29sIG5ldG5zX2NyZWF0ZWQ7XFxuK1xcdHN0cnVjdCBuc3Rva2VuICpuc3Rva2VuO1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjtcXG4rXFx0aW50IHJmZDtcXG4rXFx0Y2hhciBidWZbMzJdO1xcbit9O1xcbitcXG4rc3RhdGljIGJvb2wga3NvY2tfdGVzdF9lbnZfc2V0dXAoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYsIGNvbnN0IGNoYXIgKm5ldG5zKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHR2O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0bWVtc2V0KGVudiwgMCwgc2l6ZW9mKCplbnYpKTtcXG4rXFx0ZW52LVxcdTAwM2VuZXRucyA9IG5ldG5zO1xcbitcXHRlbnYtXFx1MDAzZXJmZCA9IC0xO1xcbitcXG4rXFx0U1lTKGZhaWwsIFxcXCJpcCBuZXRucyBhZGQgJXNcXFwiLCBuZXRucyk7XFxuK1xcdGVudi1cXHUwMDNlbmV0bnNfY3JlYXRlZCA9IHRydWU7XFxuK1xcdFNZUyhmYWlsLCBcXFwiaXAgLW5ldCAlcyBsaW5rIHNldCBsbyB1cFxcXCIsIG5ldG5zKTtcXG4rXFxuK1xcdGVudi1cXHUwMDNlbnN0b2tlbiA9IG9wZW5fbmV0bnMobmV0bnMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZW52LVxcdTAwM2Vuc3Rva2VuLCBcXFwib3Blbl9uZXRuc1xcXCIpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHRlbnYtXFx1MDAzZXJmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGVudi1cXHUwMDNlcmZkLCBcXFwicmVjZWl2ZXIgc29ja2V0XFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdGVudi1cXHUwMDNlYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDtcXG4rXFx0ZW52LVxcdTAwM2VhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihMT09QQkFDS19JUCk7XFxuK1xcdGVudi1cXHUwMDNlYWRkci5zaW5fcG9ydCA9IGh0b25zKFJFQ1ZfUE9SVCk7XFxuK1xcbitcXHRlcnIgPSBiaW5kKGVudi1cXHUwMDNlcmZkLCAoc3RydWN0IHNvY2thZGRyICopXFx1MDAyNmVudi1cXHUwMDNlYWRkciwgc2l6ZW9mKGVudi1cXHUwMDNlYWRkcikpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJiaW5kIHJlY2VpdmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdHR2LnR2X3NlYyA9IFJFQ1ZfVElNRU9VVF9TRUM7XFxuK1xcdHR2LnR2X3VzZWMgPSAwO1xcbitcXHRlcnIgPSBzZXRzb2Nrb3B0KGVudi1cXHUwMDNlcmZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgXFx1MDAyNnR2LCBzaXplb2YodHYpKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0IHJjdnRpbWVvXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdHJldHVybiB0cnVlO1xcbitcXG4rZmFpbDpcXG4rXFx0aWYgKGVudi1cXHUwMDNlcmZkIFxcdTAwM2U9IDApIHtcXG4rXFx0XFx0Y2xvc2UoZW52LVxcdTAwM2VyZmQpO1xcbitcXHRcXHRlbnYtXFx1MDAzZXJmZCA9IC0xO1xcbitcXHR9XFxuK1xcdGlmIChlbnYtXFx1MDAzZW5zdG9rZW4pIHtcXG4rXFx0XFx0Y2xvc2VfbmV0bnMoZW52LVxcdTAwM2Vuc3Rva2VuKTtcXG4rXFx0XFx0ZW52LVxcdTAwM2Vuc3Rva2VuID0gTlVMTDtcXG4rXFx0fVxcbitcXHRpZiAoZW52LVxcdTAwM2VuZXRuc19jcmVhdGVkKSB7XFxuK1xcdFxcdFNZU19OT0ZBSUwoXFxcImlwIG5ldG5zIGRlbCAlcyBcXHUwMDNlL2Rldi9udWxsIDJcXHUwMDNlXFx1MDAyNjFcXFwiLCBuZXRucyk7XFxuK1xcdFxcdGVudi1cXHUwMDNlbmV0bnNfY3JlYXRlZCA9IGZhbHNlO1xcbitcXHR9XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQga3NvY2tfdGVzdF9lbnZfY2xlYW51cChzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudilcXG4re1xcbitcXHRpZiAoZW52LVxcdTAwM2VyZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoZW52LVxcdTAwM2VyZmQpO1xcbitcXHRpZiAoZW52LVxcdTAwM2Vuc3Rva2VuKVxcbitcXHRcXHRjbG9zZV9uZXRucyhlbnYtXFx1MDAzZW5zdG9rZW4pO1xcbitcXHRpZiAoZW52LVxcdTAwM2VuZXRuc19jcmVhdGVkKSB7XFxuK1xcdFxcdFNZU19OT0ZBSUwoXFxcImlwIG5ldG5zIGRlbCAlcyBcXHUwMDNlL2Rldi9udWxsIDJcXHUwMDNlXFx1MDAyNjFcXFwiLCBlbnYtXFx1MDAzZW5ldG5zKTtcXG4rXFx0XFx0ZW52LVxcdTAwM2VuZXRuc19jcmVhdGVkID0gZmFsc2U7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQga3NvY2tfYXNzZXJ0X3JlY3Yoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYsIGNvbnN0IGNoYXIgKmRhdGEsXFxuK1xcdFxcdFxcdCAgICAgIHNpemVfdCBkYXRhX3N6KVxcbit7XFxuK1xcdHNzaXplX3QgbjtcXG4rXFxuK1xcdG1lbXNldChlbnYtXFx1MDAzZWJ1ZiwgMCwgc2l6ZW9mKGVudi1cXHUwMDNlYnVmKSk7XFxuK1xcdG4gPSByZWN2ZnJvbShlbnYtXFx1MDAzZXJmZCwgZW52LVxcdTAwM2VidWYsIHNpemVvZihlbnYtXFx1MDAzZWJ1ZiksIDAsIE5VTEwsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShuLCBkYXRhX3N6LCBcXFwicmVjdmZyb20gbGVuXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0QVNTRVJUX01FTUVRKGVudi1cXHUwMDNlYnVmLCBkYXRhLCBkYXRhX3N6LCBcXFwicGF5bG9hZCBtYXRjaFxcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBrc29ja19zZXR1cF9jdHgoc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nLCBfX2JlMzIgKmlwdjRfcmVtb3RlLFxcbitcXHRcXHRcXHQgICAgX191MTYgKnJlbW90ZV9wb3J0KVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzKTtcXG4rXFx0aW50IGVyciwgcGZkO1xcbitcXG4rXFx0KmlwdjRfcmVtb3RlID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTtcXG4rXFx0KnJlbW90ZV9wb3J0ID0gUkVDVl9QT1JUO1xcbitcXG4rXFx0cGZkID0gYnBmX3Byb2dyYW1fX2ZkKHByb2cpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChwZmQsIFxcXCJrc29ja19zZXR1cCBmZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHBmZCwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJrc29ja19zZXR1cCBydW5cXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhvcHRzLnJldHZhbCwgXFxcImtzb2NrX3NldHVwIHJldHZhbFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2tzb2NrX2Jhc2ljKHZvaWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xcbitcXHRzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgZW52O1xcbitcXHRzdHJ1Y3Qga3NvY2tfYmFzaWMgKnNrZWw7XFxuK1xcdGludCBlcnIsIHBmZDtcXG4rXFxuK1xcdHNrZWwgPSBrc29ja19iYXNpY19fb3BlbigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWwgb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRlcnIgPSBrc29ja19iYXNpY19fbG9hZChza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2tlbCBsb2FkXFxcIikpIHtcXG4rXFx0XFx0a3NvY2tfYmFzaWNfX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFrc29ja190ZXN0X2Vudl9zZXR1cChcXHUwMDI2ZW52LCBOU19URVNUKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogU3RlcCAxOiBSdW4gdGhlIHNldHVwIFNZU0NBTEwgcHJvZyB0byBjcmVhdGUga3NvY2sgKi9cXG4rXFx0aWYgKCFrc29ja19zZXR1cF9jdHgoc2tlbC1cXHUwMDNlcHJvZ3Mua3NvY2tfc2V0dXAsXFxuK1xcdFxcdFxcdCAgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlaXB2NF9yZW1vdGUsXFxuK1xcdFxcdFxcdCAgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVtb3RlX3BvcnQpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHQvKiBTdGVwIDI6IFJ1biB0aGUgc2VuZCBTWVNDQUxMIHByb2cgKi9cXG4rXFx0cGZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLmtzb2NrX3NlbmQpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChwZmQsIFxcXCJrc29ja19zZW5kIGZkXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocGZkLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImtzb2NrX3NlbmQgcnVuXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEob3B0cy5yZXR2YWwsXFxuK1xcdFxcdCAgICAgICBzaXplb2Yoc2tlbC1cXHUwMDNlZGF0YS1cXHUwMDNlc2VuZF9kYXRhKSwgXFxcInNlbmRtc2cgYnl0ZXNcXFwiKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogU3RlcCAzOiBSZWNlaXZlIGFuZCB2ZXJpZnkgdGhlIGRhdGEgKi9cXG4rXFx0a3NvY2tfYXNzZXJ0X3JlY3YoXFx1MDAyNmVudiwgc2tlbC1cXHUwMDNlZGF0YS1cXHUwMDNlc2VuZF9kYXRhLFxcbitcXHRcXHRcXHQgIHNpemVvZihza2VsLVxcdTAwM2VkYXRhLVxcdTAwM2VzZW5kX2RhdGEpKTtcXG4rXFxuK2ZhaWw6XFxuK1xcdGtzb2NrX3Rlc3RfZW52X2NsZWFudXAoXFx1MDAyNmVudik7XFxuK1xcdGtzb2NrX2Jhc2ljX19kZXN0cm95KHNrZWwpO1xcbit9XFxuK1xcbit2b2lkIHRlc3Rfa3NvY2tfbHNtX3JlY3Vyc2lvbih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBrc29ja190ZXN0X2VudiBlbnY7XFxuK1xcdHN0cnVjdCBrc29ja19yZWN1cnNpb24gKnNrZWw7XFxuK1xcdGNoYXIgdHJpZ2dlciA9ICd4JztcXG4rXFx0aW50IHRmZCA9IC0xO1xcbitcXHRpbnQgZXJyO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcbitcXHRza2VsID0ga3NvY2tfcmVjdXJzaW9uX19vcGVuKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwic2tlbCBvcGVuXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGVyciA9IGtzb2NrX3JlY3Vyc2lvbl9fbG9hZChza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2tlbCBsb2FkXFxcIikpIHtcXG4rXFx0XFx0a3NvY2tfcmVjdXJzaW9uX19kZXN0cm95KHNrZWwpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoXFx1MDAyNmVudiwgTlNfTFNNX1JFQ1VSU0lPTl9URVNUKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogU3RlcCAxOiBSdW4gdGhlIHNldHVwIFNZU0NBTEwgcHJvZyB0byBjcmVhdGUgdGhlIGtzb2NrICovXFxuK1xcdGlmICgha3NvY2tfc2V0dXBfY3R4KHNrZWwtXFx1MDAzZXByb2dzLmtzb2NrX3NldHVwLFxcbitcXHRcXHRcXHQgICAgIFxcdTAwMjZza2VsLVxcdTAwM2Vic3MtXFx1MDAzZWlwdjRfcmVtb3RlLFxcbitcXHRcXHRcXHQgICAgIFxcdTAwMjZza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlbW90ZV9wb3J0KSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogU3RlcCAyOiBBdHRhY2ggTFNNIHByb2cgYW5kIHRyaWdnZXIgc29ja2V0X3NlbmRtc2cgZnJvbSB1c2Vyc3BhY2UgKi9cXG4rXFx0c2tlbC1cXHUwMDNlbGlua3Mua3NvY2tfc29ja2V0X3NlbmRtc2cgPVxcbitcXHRcXHRicGZfcHJvZ3JhbV9fYXR0YWNoX2xzbShza2VsLVxcdTAwM2Vwcm9ncy5rc29ja19zb2NrZXRfc2VuZG1zZyk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLVxcdTAwM2VsaW5rcy5rc29ja19zb2NrZXRfc2VuZG1zZyxcXG4rXFx0XFx0XFx0ICAgXFxcImF0dGFjaCBzb2NrZXRfc2VuZG1zZyBsc21cXFwiKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0dGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQodGZkLCBcXFwidHJpZ2dlciBzb2NrZXRcXFwiKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0YXJnZXRfcGlkID0gZ2V0cGlkKCk7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldHJpZ2dlcl9zZW5kID0gMTtcXG4rXFx0biA9IHNlbmR0byh0ZmQsIFxcdTAwMjZ0cmlnZ2VyLCBzaXplb2YodHJpZ2dlciksIDAsXFxuK1xcdFxcdCAgIChzdHJ1Y3Qgc29ja2FkZHIgKilcXHUwMDI2ZW52LmFkZHIsIHNpemVvZihlbnYuYWRkcikpO1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRhcmdldF9waWQgPSAwO1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRyaWdnZXJfc2VuZCA9IDA7XFxuK1xcdGlmICghQVNTRVJUX0VRKG4sIHNpemVvZih0cmlnZ2VyKSwgXFxcInRyaWdnZXIgc2VuZHRvXFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIFN0ZXAgMzogVGhlIG5lc3RlZCBicGZfa3NvY2tfc2VuZCgpIG11c3QgaGl0IHRoZSByZWN1cnNpb24gZ3VhcmQgKi9cXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNfY291bnQsIDIsXFxuK1xcdFxcdCAgICAgICBcXFwic29ja2V0X3NlbmRtc2cgcmVjdXJzaW9uIGNvdW50XFxcIikpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlZGF0YS1cXHUwMDNlcmVjX2tmdW5jX3JldHNbMF0sIC1FQlVTWSxcXG4rXFx0XFx0ICAgICAgIFxcXCJyZWN1cnNpdmUgc2VuZCBzdGF0dXNcXFwiKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHRpZiAoIUFTU0VSVF9FUShza2VsLVxcdTAwM2VkYXRhLVxcdTAwM2VyZWNfa2Z1bmNfcmV0c1sxXSxcXG4rXFx0XFx0ICAgICAgIHNpemVvZihza2VsLVxcdTAwM2VkYXRhLVxcdTAwM2VzZW5kX2RhdGEpLCBcXFwib3V0ZXIgc2VuZCBieXRlc1xcXCIpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHRrc29ja19hc3NlcnRfcmVjdihcXHUwMDI2ZW52LCBza2VsLVxcdTAwM2VkYXRhLVxcdTAwM2VzZW5kX2RhdGEsXFxuK1xcdFxcdFxcdCAgc2l6ZW9mKHNrZWwtXFx1MDAzZWRhdGEtXFx1MDAzZXNlbmRfZGF0YSkpO1xcbitcXG4rZmFpbDpcXG4rXFx0aWYgKHRmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZSh0ZmQpO1xcbitcXHRrc29ja190ZXN0X2Vudl9jbGVhbnVwKFxcdTAwMjZlbnYpO1xcbitcXHRrc29ja19yZWN1cnNpb25fX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3F1b3RhLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5jODZkOWIwYTk1MTNlOFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja19xdW90YS5jXFxuQEAgLTAsMCArMSwxMzkgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zdGF0LmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwidGVzdF9wcm9ncy5oXFxcIlxcbisjaW5jbHVkZSBcXFwibmV0d29ya19oZWxwZXJzLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJzeXNjdGxfaGVscGVycy5oXFxcIlxcbisjaW5jbHVkZSBcXFwia3NvY2tfcXVvdGEuc2tlbC5oXFxcIlxcbitcXG4rI2RlZmluZSBOU19ORVRfUVVPVEFfVEVTVDEgXFxcImtzb2NrX25ldF9xdW90YV9uczFcXFwiXFxuKyNkZWZpbmUgTlNfTkVUX1FVT1RBX1RFU1QyIFxcXCJrc29ja19uZXRfcXVvdGFfbnMyXFxcIlxcbisjZGVmaW5lIEtTT0NLX01BWF9TWVNDVEwgXFxcIi9wcm9jL3N5cy9uZXQvY29yZS9icGZfa3NvY2tfbWF4XFxcIlxcbisjZGVmaW5lIEtTT0NLX1FVT1RBX05TX1NMT1RTIDNcXG4rI2RlZmluZSBLU09DS19RVU9UQV9OUzFfT0ZGU0VUIDBcXG4rI2RlZmluZSBLU09DS19RVU9UQV9OUzJfT0ZGU0VUIEtTT0NLX1FVT1RBX05TX1NMT1RTXFxuK1xcbitzdGF0aWMgaW50IGtzb2NrX3J1bl9wcm9nKHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZylcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChwcm9nKSwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHRyZXR1cm4gb3B0cy5yZXR2YWw7XFxuK31cXG4rXFxuK3N0YXRpYyBfX3U2NCBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChzdHJ1Y3Qga3NvY2tfcXVvdGEgKnNrZWwpXFxuK3tcXG4rXFx0cmV0dXJuIF9fYXRvbWljX2xvYWRfbihcXHUwMDI2c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VxdW90YV9yZWxlYXNlX2NvbXBsZXRlZCxcXG4rXFx0XFx0XFx0ICAgICAgIF9fQVRPTUlDX0FDUVVJUkUpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGtzb2NrX3JlbGVhc2VfcXVvdGFfc2xvdHMoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgc2xvdF9vZmZzZXQpXFxuK3tcXG4rXFx0X191NjQgY29tcGxldGVkO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0Y29tcGxldGVkID0ga3NvY2tfcXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQoc2tlbCk7XFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcXVvdGFfc2xvdF9vZmZzZXQgPSBzbG90X29mZnNldDtcXG4rXFx0ZXJyID0ga3NvY2tfcnVuX3Byb2coc2tlbC1cXHUwMDNlcHJvZ3Mua3NvY2tfcXVvdGFfcmVsZWFzZSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImtzb2NrX3F1b3RhX3JlbGVhc2VcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0d2hpbGUgKGtzb2NrX3F1b3RhX3JlbGVhc2VfY29tcGxldGVkKHNrZWwpIC0gY29tcGxldGVkIFxcdTAwM2NcXG4rXFx0ICAgICAgIHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcXVvdGFfcmVsZWFzZWQpXFxuK1xcdFxcdHVzbGVlcCgxMDAwKTtcXG4rXFxuK1xcdHJldHVybiBza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXF1b3RhX3JlbGVhc2VkO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBrc29ja19leHBlY3RfcXVvdGEoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgc2xvdF9vZmZzZXQsXFxuK1xcdFxcdFxcdCAgICAgICBjb25zdCBjaGFyICpuYW1lKVxcbit7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXF1b3RhX3Nsb3Rfb2Zmc2V0ID0gc2xvdF9vZmZzZXQ7XFxuK1xcdGVyciA9IGtzb2NrX3J1bl9wcm9nKHNrZWwtXFx1MDAzZXByb2dzLmtzb2NrX3F1b3RhX2NyZWF0ZSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgbmFtZSkpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VxdW90YV9jcmVhdGVkLCAyLCBuYW1lKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRyZXR1cm4gQVNTRVJUX0VRKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcXVvdGFfZXJyLCAtRU5PU1BDLCBuYW1lKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgcmVjb3JkX2N1cnJlbnRfbnMoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgdGFyZ2V0KVxcbit7XFxuK1xcdHN0cnVjdCBzdGF0IHN0O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZXJyID0gc3RhdChcXFwiL3Byb2Mvc2VsZi9ucy9uZXRcXFwiLCBcXHUwMDI2c3QpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzdGF0IG5ldG5zXFxcIikpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0YXJnZXRfbmV0bnNfaW51bVt0YXJnZXRdID0gKF9fdTMyKXN0LnN0X2lubztcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3ZvaWQgc2VyaWFsX3Rlc3Rfa3NvY2tfbmV0X3F1b3RhKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciBvbGRfbWF4WzE2XSA9IHt9O1xcbitcXHRzdHJ1Y3QgbmV0bnNfb2JqICpuZXRuczEgPSBOVUxMLCAqbmV0bnMyID0gTlVMTDtcXG4rXFx0c3RydWN0IGtzb2NrX3F1b3RhICpza2VsO1xcbitcXHRpbnQgcmVsZWFzZWQ7XFxuK1xcbitcXHRza2VsID0ga3NvY2tfcXVvdGFfX29wZW5fYW5kX2xvYWQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJrc29jayBxdW90YSBza2VsZXRvblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNrZWwtXFx1MDAzZWxpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlciA9XFxuK1xcdFxcdGJwZl9wcm9ncmFtX19hdHRhY2hfdHJhY2Uoc2tlbC1cXHUwMDNlcHJvZ3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwtXFx1MDAzZWxpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlcixcXG4rXFx0XFx0XFx0ICAgXFxcImF0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZW50cnlcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdHNrZWwtXFx1MDAzZWxpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19leGl0ID1cXG4rXFx0XFx0YnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLVxcdTAwM2Vwcm9ncy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLVxcdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCxcXG4rXFx0XFx0XFx0ICAgXFxcImF0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZXhpdFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmIChzeXNjdGxfc2V0X29yX2ZhaWwoS1NPQ0tfTUFYX1NZU0NUTCwgb2xkX21heCwgXFxcIjJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRuZXRuczEgPSBuZXRuc19uZXcoTlNfTkVUX1FVT1RBX1RFU1QxLCB0cnVlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMSwgXFxcImNyZWF0ZSBmaXJzdCBuZXRuc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFyZWNvcmRfY3VycmVudF9ucyhza2VsLCAwKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoIWtzb2NrX2V4cGVjdF9xdW90YShza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VULFxcbitcXHRcXHRcXHRcXHRcXFwiZmlyc3QgbmV0bnMgcXVvdGFcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBUaGUgaG9zdC13aWRlIHNldHRpbmcgZ3JhbnRzIHRoZSBmdWxsIGFsbG93YW5jZSB0byBlYWNoIG5ldG5zLiAqL1xcbitcXHRuZXRuczIgPSBuZXRuc19uZXcoTlNfTkVUX1FVT1RBX1RFU1QyLCB0cnVlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMiwgXFxcImNyZWF0ZSBzZWNvbmQgbmV0bnNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghcmVjb3JkX2N1cnJlbnRfbnMoc2tlbCwgMSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKCFrc29ja19leHBlY3RfcXVvdGEoc2tlbCwgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCxcXG4rXFx0XFx0XFx0XFx0XFxcInNlY29uZCBuZXRucyBxdW90YVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHJlbGVhc2VkID0ga3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEocmVsZWFzZWQsIDIsIFxcXCJzZWNvbmQgbmV0bnMgcXVvdGEgcmVsZWFzZWRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBCb3RoIHJlbGVhc2VkIHNsb3RzIG11c3QgYmVjb21lIGF2YWlsYWJsZSBhZ2Fpbi4gKi9cXG4rXFx0a3NvY2tfZXhwZWN0X3F1b3RhKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQsIFxcXCJyZWNvdmVyZWQgcXVvdGFcXFwiKTtcXG4rXFxuK291dDpcXG4rXFx0a3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTtcXG4rXFx0a3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VUKTtcXG4rXFx0bmV0bnNfZnJlZShuZXRuczIpO1xcbitcXHRuZXRuc19mcmVlKG5ldG5zMSk7XFxuK1xcdGlmIChvbGRfbWF4WzBdKVxcbitcXHRcXHRzeXNjdGxfc2V0X29yX2ZhaWwoS1NPQ0tfTUFYX1NZU0NUTCwgTlVMTCwgb2xkX21heCk7XFxuK1xcdGtzb2NrX3F1b3RhX19kZXN0cm95KHNrZWwpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3dxLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja193cS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTg0YjEzNGYzODIzNzBcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuY1xcbkBAIC0wLDAgKzEsMzQgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcInRlc3RfcHJvZ3MuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImtzb2NrX3dxLnNrZWwuaFxcXCJcXG4rXFxuK3ZvaWQgdGVzdF9rc29ja193cSh2b2lkKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzKTtcXG4rXFx0c3RydWN0IGtzb2NrX3dxICpza2VsO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0c2tlbCA9IGtzb2NrX3dxX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwia3NvY2tfd3Egb3BlbiBhbmQgbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVxcdTAwM2Vwcm9ncy5rc29ja193cV9zdGFydCksXFxuK1xcdFxcdFxcdFxcdCAgICAgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW4ga3NvY2tfd3Ffc3RhcnRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghQVNTRVJUX09LKG9wdHMucmV0dmFsLCBcXFwia3NvY2tfd3Ffc3RhcnQgcmV0dmFsXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0d2hpbGUgKCFfX2F0b21pY19sb2FkX24oXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlY2FsbGJhY2tfZG9uZSwgX19BVE9NSUNfQUNRVUlSRSkpXFxuK1xcdFxcdHVzbGVlcCgxMDAwKTtcXG4rXFxuK1xcdEFTU0VSVF9FUShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZWNyZWF0ZV9lcnIsIC1FT1BOT1RTVVBQLFxcbitcXHRcXHQgIFxcXCJ3b3JrcXVldWUgY3JlYXRlIHJlamVjdGVkXFxcIik7XFxuK1xcbitvdXQ6XFxuK1xcdGtzb2NrX3dxX19kZXN0cm95KHNrZWwpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2Jhc2ljLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4xODliMGZjMTU3NzAxMVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfYmFzaWMuY1xcbkBAIC0wLDAgKzEsMzcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2VuZGlhbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiYnBmX3RyYWNpbmdfbmV0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJrc29ja19jb21tb24uaFxcXCJcXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBrc29ja19zZXR1cCh2b2lkICpjdHgpXFxuK3tcXG4rXFx0cmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBrc29ja19zZW5kKHZvaWQgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xcbitcXHRpbnQgc2VuZCA9IC0xO1xcbitcXG4rXFx0diA9IGtzb2NrX2N0eF92YWx1ZV9sb29rdXAoKTtcXG4rXFx0aWYgKCF2KVxcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFxuK1xcdGtzID0gYnBmX2twdHJfeGNoZyhcXHUwMDI2di1cXHUwMDNlY3R4LCBOVUxMKTtcXG4rXFx0aWYgKCFrcylcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcbitcXHRzZW5kID0gYnBmX2tzb2NrX3NlbmQoa3MsIHNlbmRfZGF0YSwgc2l6ZW9mKHNlbmRfZGF0YSkpO1xcbitcXHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XFxuK1xcdHJldHVybiBzZW5kO1xcbit9XFxuK1xcbitjaGFyIF9fbGljZW5zZVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19jb21tb24uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19jb21tb24uaFxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdjZjY0MzE5YjkwMTQ1XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19jb21tb24uaFxcbkBAIC0wLDAgKzEsMTEwIEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cXG4rXFxuKyNpZm5kZWYgX0tTT0NLX0NPTU1PTl9IXFxuKyNkZWZpbmUgX0tTT0NLX0NPTU1PTl9IXFxuK1xcbisjaW5jbHVkZSBcXFwiZXJybm8uaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGJvb2wuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgU09DS19TVFJFQU1cXHQxXFxuKyNkZWZpbmUgU09DS19ER1JBTVxcdDJcXG4rI2RlZmluZSBJUFBST1RPX1RDUFxcdDZcXG4rI2RlZmluZSBJUFBST1RPX1VEUFxcdDE3XFxuK1xcbitzdHJ1Y3QgYnBmX2tzb2NrICpicGZfa3NvY2tfY3JlYXRlKGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKm9wdHMsXFxuK1xcdFxcdFxcdFxcdCAgIHUzMiBvcHRzX19zeiwgaW50ICplcnJfX3VuaW5pdCkgX19rc3ltO1xcbitpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXFxuK1xcdFxcdCAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzICpvcHRzLCB1MzIgb3B0c19fc3opIF9fa3N5bTtcXG4raW50IGJwZl9rc29ja19jb25uZWN0KHN0cnVjdCBicGZfa3NvY2sgKmtzLFxcbitcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cywgdTMyIG9wdHNfX3N6KSBfX2tzeW07XFxuK3N0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19hY3F1aXJlKHN0cnVjdCBicGZfa3NvY2sgKmtzKSBfX2tzeW07XFxuK3ZvaWQgYnBmX2tzb2NrX3JlbGVhc2Uoc3RydWN0IGJwZl9rc29jayAqa3MpIF9fa3N5bTtcXG4raW50IGJwZl9rc29ja19zZW5kKHN0cnVjdCBicGZfa3NvY2sgKmtzLFxcbitcXHRcXHQgICBjb25zdCB2b2lkICpkYXRhLCB1MzIgZGF0YV9fc3opIF9fa3N5bTtcXG4rXFxuK3N0cnVjdCBfX2tzb2NrX2N0eF92YWx1ZSB7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4O1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdHlwZShrZXksIGludCk7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlKTtcXG4rXFx0X191aW50KG1heF9lbnRyaWVzLCAxKTtcXG4rfSBfX2tzb2NrX2N0eF9tYXAgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKmtzb2NrX2N0eF92YWx1ZV9sb29rdXAodm9pZClcXG4re1xcbitcXHR1MzIga2V5ID0gMDtcXG4rXFxuK1xcdHJldHVybiBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZfX2tzb2NrX2N0eF9tYXAsIFxcdTAwMjZrZXkpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBrc29ja19jdHhfaW5zZXJ0KHN0cnVjdCBicGZfa3NvY2sgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgbG9jYWwsICp2O1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrICpvbGQ7XFxuK1xcdHUzMiBrZXkgPSAwO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0bG9jYWwuY3R4ID0gTlVMTDtcXG4rXFx0ZXJyID0gYnBmX21hcF91cGRhdGVfZWxlbShcXHUwMDI2X19rc29ja19jdHhfbWFwLCBcXHUwMDI2a2V5LCBcXHUwMDI2bG9jYWwsIDApO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdGJwZl9rc29ja19yZWxlYXNlKGN0eCk7XFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdHYgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZfX2tzb2NrX2N0eF9tYXAsIFxcdTAwMjZrZXkpO1xcbitcXHRpZiAoIXYpIHtcXG4rXFx0XFx0YnBmX2tzb2NrX3JlbGVhc2UoY3R4KTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4rXFxuK1xcdG9sZCA9IGJwZl9rcHRyX3hjaGcoXFx1MDAyNnYtXFx1MDAzZWN0eCwgY3R4KTtcXG4rXFx0aWYgKG9sZCkge1xcbitcXHRcXHRicGZfa3NvY2tfcmVsZWFzZShvbGQpO1xcbitcXHRcXHRyZXR1cm4gLUVFWElTVDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIEdsb2JhbHMgZm9yIHBhc3NpbmcgY29uZmlnIGZyb20gdXNlcnNwYWNlICovXFxuK19fYmUzMiBpcHY0X3JlbW90ZTtcXG4rX191MTYgcmVtb3RlX3BvcnQ7XFxuK1xcbitjaGFyIHNlbmRfZGF0YVszMl0gPSBcXFwiaGVsbG8gZnJvbSBicGYga3NvY2tcXFwiO1xcbitcXG4rc3RhdGljIGlubGluZSBpbnQgZG9fa3NvY2tfc2V0dXAodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XFxuK1xcdHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIGFkZHJfb3B0cyA9IHt9O1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcXG4rXFx0aW50IGVyciA9IDA7XFxuK1xcbitcXHRjcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUO1xcbitcXHRjcmVhdGVfb3B0cy50eXBlID0gU09DS19ER1JBTTtcXG4rXFx0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcXG4rXFxuK1xcdGtzID0gYnBmX2tzb2NrX2NyZWF0ZShcXHUwMDI2Y3JlYXRlX29wdHMsIHNpemVvZihjcmVhdGVfb3B0cyksIFxcdTAwMjZlcnIpO1xcbitcXHRpZiAoIWtzKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0YWRkcl9vcHRzLmZhbWlseSA9IEFGX0lORVQ7XFxuK1xcdGFkZHJfb3B0cy5wb3J0ID0gcmVtb3RlX3BvcnQ7XFxuK1xcdGFkZHJfb3B0cy5pcHY0X2FkZHIgPSBpcHY0X3JlbW90ZTtcXG4rXFxuK1xcdGVyciA9IGJwZl9rc29ja19jb25uZWN0KGtzLCBcXHUwMDI2YWRkcl9vcHRzLCBzaXplb2YoYWRkcl9vcHRzKSk7XFxuK1xcdGlmIChlcnIpIHtcXG4rXFx0XFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHR9XFxuK1xcbitcXHRlcnIgPSBrc29ja19jdHhfaW5zZXJ0KGtzKTtcXG4rXFx0aWYgKGVyciBcXHUwMDI2XFx1MDAyNiBlcnIgIT0gLUVFWElTVClcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKyNlbmRpZiAvKiBfS1NPQ0tfQ09NTU9OX0ggKi9cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3F1b3RhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjkxODU0ZWEzMzNjMTIxXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19xdW90YS5jXFxuQEAgLTAsMCArMSwxNjcgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiYnBmX3RyYWNpbmdfbmV0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJrc29ja19jb21tb24uaFxcXCJcXG4rXFxuKyNkZWZpbmUgS1NPQ0tfUVVPVEFfTlNfU0xPVFMgM1xcbisjZGVmaW5lIEtTT0NLX1FVT1RBX05FVE5TIDJcXG4rI2RlZmluZSBLU09DS19RVU9UQV9TTE9UUyAoS1NPQ0tfUVVPVEFfTlNfU0xPVFMgKiBLU09DS19RVU9UQV9ORVROUylcXG4rXFxuK3N0cnVjdCBrc29ja19xdW90YV92YWx1ZSB7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4O1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdHlwZShrZXksIHUzMik7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IGtzb2NrX3F1b3RhX3ZhbHVlKTtcXG4rXFx0X191aW50KG1heF9lbnRyaWVzLCBLU09DS19RVU9UQV9TTE9UUyk7XFxuK30gcXVvdGFfbWFwIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XFxuK1xcdF9fdHlwZShrZXksIHU2NCk7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgdTgpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIEtTT0NLX1FVT1RBX1NMT1RTKTtcXG4rfSByZWxlYXNlX3dvcmtlcnMgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rdTMyIHF1b3RhX2NyZWF0ZWQ7XFxuK3UzMiBxdW90YV9yZWxlYXNlZDtcXG4rdTMyIHF1b3RhX3Nsb3Rfb2Zmc2V0O1xcbit1MzIgdGFyZ2V0X25ldG5zX2ludW1bS1NPQ0tfUVVPVEFfTkVUTlNdO1xcbit1NjQgcXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQ7XFxuK2ludCBxdW90YV9lcnI7XFxuK1xcbitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2xcXG4ra3NvY2tfcXVvdGFfY3JlYXRlX29uZSh1MzIgaSxcXG4rXFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKmNyZWF0ZV9vcHRzKVxcbit7XFxuK1xcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcXG4rXFx0c3RydWN0IGJwZl9rc29jayAqa3MsICpvbGQ7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXG4rXFx0aSArPSBxdW90YV9zbG90X29mZnNldDtcXG4rXFx0aWYgKGkgXFx1MDAzZT0gS1NPQ0tfUVVPVEFfU0xPVFMpIHtcXG4rXFx0XFx0cXVvdGFfZXJyID0gLUVSQU5HRTtcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdGJhcnJpZXJfdmFyKGVycik7XFxuK1xcdGtzID0gYnBmX2tzb2NrX2NyZWF0ZShjcmVhdGVfb3B0cywgc2l6ZW9mKCpjcmVhdGVfb3B0cyksIFxcdTAwMjZlcnIpO1xcbitcXHRpZiAoIWtzKSB7XFxuK1xcdFxcdHF1b3RhX2VyciA9IGVycjtcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdHYgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZxdW90YV9tYXAsIFxcdTAwMjZpKTtcXG4rXFx0aWYgKCF2KSB7XFxuK1xcdFxcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcXG4rXFx0XFx0cXVvdGFfZXJyID0gLUVOT0VOVDtcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdG9sZCA9IGJwZl9rcHRyX3hjaGcoXFx1MDAyNnYtXFx1MDAzZWN0eCwga3MpO1xcbitcXHRpZiAob2xkKVxcbitcXHRcXHRicGZfa3NvY2tfcmVsZWFzZShvbGQpO1xcbitcXHRxdW90YV9jcmVhdGVkKys7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKHUzMiBpKVxcbit7XFxuK1xcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcXG4rXFx0c3RydWN0IGJwZl9rc29jayAqa3M7XFxuK1xcbitcXHRpICs9IHF1b3RhX3Nsb3Rfb2Zmc2V0O1xcbitcXHRpZiAoaSBcXHUwMDNlPSBLU09DS19RVU9UQV9TTE9UUylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0diA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXFx1MDAyNnF1b3RhX21hcCwgXFx1MDAyNmkpO1xcbitcXHRpZiAoIXYpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGtzID0gYnBmX2twdHJfeGNoZyhcXHUwMDI2di1cXHUwMDNlY3R4LCBOVUxMKTtcXG4rXFx0aWYgKGtzKSB7XFxuK1xcdFxcdGJwZl9rc29ja19yZWxlYXNlKGtzKTtcXG4rXFx0XFx0cXVvdGFfcmVsZWFzZWQrKztcXG4rXFx0fVxcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQga3NvY2tfcXVvdGFfY3JlYXRlKHZvaWQgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XFxuK1xcbitcXHRjcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUO1xcbitcXHRjcmVhdGVfb3B0cy50eXBlID0gU09DS19ER1JBTTtcXG4rXFx0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcXG4rXFx0cXVvdGFfY3JlYXRlZCA9IDA7XFxuK1xcdHF1b3RhX2VyciA9IDA7XFxuK1xcbitcXHRpZiAoa3NvY2tfcXVvdGFfY3JlYXRlX29uZSgwLCBcXHUwMDI2Y3JlYXRlX29wdHMpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0aWYgKGtzb2NrX3F1b3RhX2NyZWF0ZV9vbmUoMSwgXFx1MDAyNmNyZWF0ZV9vcHRzKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdGtzb2NrX3F1b3RhX2NyZWF0ZV9vbmUoMiwgXFx1MDAyNmNyZWF0ZV9vcHRzKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQga3NvY2tfcXVvdGFfcmVsZWFzZSh2b2lkICpjdHgpXFxuK3tcXG4rXFx0cXVvdGFfcmVsZWFzZWQgPSAwO1xcbitcXHRrc29ja19xdW90YV9yZWxlYXNlX29uZSgwKTtcXG4rXFx0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMSk7XFxuK1xcdGtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKDIpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwiZmVudHJ5L2tzb2NrX3JlbGVhc2Vfd29ya19mblxcXCIpXFxuK2ludCBCUEZfUFJPRyhrc29ja19yZWxlYXNlX3dvcmtfZW50ZXIsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3QgcmN1X3dvcmsgKnJ3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByY3Vfd29yaywgd29yayk7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgKmtzID0gY29udGFpbmVyX29mKHJ3b3JrLCBzdHJ1Y3QgYnBmX2tzb2NrLCByd29yayk7XFxuK1xcdHU2NCBwaWRfdGdpZCA9IGJwZl9nZXRfY3VycmVudF9waWRfdGdpZCgpO1xcbitcXHRzdHJ1Y3QgbmV0ICpuZXQ7XFxuK1xcdHUzMiBpbnVtO1xcbitcXHR1OCB0cmFja2VkID0gMTtcXG4rXFxuK1xcdC8qIGtzb2NrX3JlbGVhc2Vfd29ya19mbigpIGZyZWVzIGtzIGJlZm9yZSB0aGUgZmV4aXQgcHJvZ3JhbSBydW5zLiAqL1xcbitcXHRuZXQgPSBCUEZfQ09SRV9SRUFEKGtzLCBzb2NrLCBzaywgX19za19jb21tb24uc2tjX25ldC5uZXQpO1xcbitcXHRpZiAoIW5ldClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpbnVtID0gQlBGX0NPUkVfUkVBRChuZXQsIG5zLmludW0pO1xcbitcXHRpZiAoaW51bSAhPSB0YXJnZXRfbmV0bnNfaW51bVswXSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgaW51bSAhPSB0YXJnZXRfbmV0bnNfaW51bVsxXSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRicGZfbWFwX3VwZGF0ZV9lbGVtKFxcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFxcdTAwMjZwaWRfdGdpZCwgXFx1MDAyNnRyYWNrZWQsIEJQRl9BTlkpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJmZXhpdC9rc29ja19yZWxlYXNlX3dvcmtfZm5cXFwiKVxcbitpbnQgQlBGX1BST0coa3NvY2tfcmVsZWFzZV93b3JrX2V4aXQsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHR1NjQgcGlkX3RnaWQgPSBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQoKTtcXG4rXFx0dTggKnRyYWNrZWQ7XFxuK1xcbitcXHR0cmFja2VkID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2cmVsZWFzZV93b3JrZXJzLCBcXHUwMDI2cGlkX3RnaWQpO1xcbitcXHRpZiAoIXRyYWNrZWQpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRicGZfbWFwX2RlbGV0ZV9lbGVtKFxcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFxcdTAwMjZwaWRfdGdpZCk7XFxuK1xcbitcXHQvKiBUaGUgd29ya2VyIGhhcyByZWxlYXNlZCB0aGUgc29ja2V0IGFuZCByZXR1cm5lZCBpdHMgcXVvdGEgY2hhcmdlLiAqL1xcbitcXHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcXHUwMDI2cXVvdGFfcmVsZWFzZV9jb21wbGV0ZWQsIDEpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK2NoYXIgX19saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3JlY3Vyc2lvbi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3JlY3Vyc2lvbi5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJmNTIwMDk0M2UzNmFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3JlY3Vyc2lvbi5jXFxuQEAgLTAsMCArMSw2OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXFxuK1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfZW5kaWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZfdHJhY2luZ19uZXQuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImtzb2NrX2NvbW1vbi5oXFxcIlxcbitcXG4rdm9pZCBicGZfcmN1X3JlYWRfbG9jayh2b2lkKSBfX2tzeW07XFxuK3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07XFxuK1xcbitpbnQgdGFyZ2V0X3BpZDtcXG4raW50IHRyaWdnZXJfc2VuZDtcXG4rXFxuK3Vuc2lnbmVkIGludCByZWNfY291bnQ7XFxuK2ludCByZWNfa2Z1bmNfcmV0c1tdID0geyAtMSwgLTEgfTtcXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBrc29ja19zZXR1cCh2b2lkICpjdHgpXFxuK3tcXG4rXFx0cmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7XFxuK31cXG4rXFxuK1NFQyhcXFwibHNtLnMvc29ja2V0X3NlbmRtc2dcXFwiKVxcbitpbnQgQlBGX1BST0coa3NvY2tfc29ja2V0X3NlbmRtc2csIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG4rXFx0ICAgICBpbnQgc2l6ZSwgaW50IHJldClcXG4re1xcbitcXHRzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKnY7XFxuK1xcdHN0cnVjdCBicGZfa3NvY2sgKmtzLCAqdG1wO1xcbitcXHR1MzIgcGlkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCkgXFx1MDAzZVxcdTAwM2UgMzI7XFxuK1xcdGludCBrZnVuY19yZXQ7XFxuK1xcbitcXHRpZiAocmV0IHx8ICF0cmlnZ2VyX3NlbmQgfHwgcGlkICE9IHRhcmdldF9waWQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR2ID0ga3NvY2tfY3R4X3ZhbHVlX2xvb2t1cCgpO1xcbitcXHRpZiAoIXYpIHtcXG4rXFx0XFx0a2Z1bmNfcmV0ID0gLUVOT0VOVDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGtzID0gTlVMTDtcXG4rXFx0YnBmX3JjdV9yZWFkX2xvY2soKTtcXG4rXFx0dG1wID0gdi1cXHUwMDNlY3R4O1xcbitcXHRpZiAodG1wKVxcbitcXHRcXHRrcyA9IGJwZl9rc29ja19hY3F1aXJlKHRtcCk7XFxuK1xcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcXG4rXFxuK1xcdGlmICgha3MpIHtcXG4rXFx0XFx0a2Z1bmNfcmV0ID0gLUVOT0VOVDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGtmdW5jX3JldCA9IGJwZl9rc29ja19zZW5kKGtzLCBzZW5kX2RhdGEsIHNpemVvZihzZW5kX2RhdGEpKTtcXG4rXFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xcbitcXG4rb3V0OlxcbitcXHRyZWNfa2Z1bmNfcmV0c1tyZWNfY291bnQgXFx1MDAyNiAxXSA9IGtmdW5jX3JldDtcXG4rXFx0X19zeW5jX2ZldGNoX2FuZF9hZGQoXFx1MDAyNnJlY19jb3VudCwgMSk7XFxuK1xcbitcXHRpZiAoa2Z1bmNfcmV0ICE9IC1FQlVTWSlcXG4rXFx0XFx0dHJpZ2dlcl9zZW5kID0gMDtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK2NoYXIgX19saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3dxLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfd3EuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjE2YTE4NzNkMTMyZWRlXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jXFxuQEAgLTAsMCArMSw2MiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXFxuK1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJicGZfdHJhY2luZ19uZXQuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImVycm5vLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJrc29ja19jb21tb24uaFxcXCJcXG4rXFxuK3N0cnVjdCBrc29ja193cV92YWx1ZSB7XFxuK1xcdHN0cnVjdCBicGZfd3Egd29yaztcXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xcbitcXHRfX3R5cGUoa2V5LCB1MzIpO1xcbitcXHRfX3R5cGUodmFsdWUsIHN0cnVjdCBrc29ja193cV92YWx1ZSk7XFxuK30gd29ya19tYXAgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4raW50IGNyZWF0ZV9lcnI7XFxuK3UzMiBjYWxsYmFja19kb25lO1xcbitcXG4rc3RhdGljIGludCBrc29ja193cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIG9wdHMgPSB7XFxuK1xcdFxcdC5mYW1pbHkgPSBBRl9JTkVULFxcbitcXHRcXHQudHlwZSA9IFNPQ0tfREdSQU0sXFxuK1xcdFxcdC5wcm90b2NvbCA9IElQUFJPVE9fVURQLFxcbitcXHR9O1xcbitcXHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcXG4rXFx0aW50IGVyciA9IDA7XFxuK1xcbitcXHRrcyA9IGJwZl9rc29ja19jcmVhdGUoXFx1MDAyNm9wdHMsIHNpemVvZihvcHRzKSwgXFx1MDAyNmVycik7XFxuK1xcdGlmIChrcylcXG4rXFx0XFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xcbitcXHRjcmVhdGVfZXJyID0gZXJyO1xcbitcXHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcXHUwMDI2Y2FsbGJhY2tfZG9uZSwgMSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQga3NvY2tfd3Ffc3RhcnQodm9pZCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBrc29ja193cV92YWx1ZSAqdmFsdWU7XFxuK1xcdHUzMiBrZXkgPSAwO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0dmFsdWUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZ3b3JrX21hcCwgXFx1MDAyNmtleSk7XFxuK1xcdGlmICghdmFsdWUpXFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRlcnIgPSBicGZfd3FfaW5pdChcXHUwMDI2dmFsdWUtXFx1MDAzZXdvcmssIFxcdTAwMjZ3b3JrX21hcCwgMCk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdGVyciA9IGJwZl93cV9zZXRfY2FsbGJhY2soXFx1MDAyNnZhbHVlLVxcdTAwM2V3b3JrLCBrc29ja193cV9jYWxsYmFjaywgMCk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdHJldHVybiBicGZfd3Ffc3RhcnQoXFx1MDAyNnZhbHVlLVxcdTAwM2V3b3JrLCAwKTtcXG4rfVxcbitcXG4rY2hhciBfX2xpY2Vuc2VbXSBTRUMoXFxcImxpY2Vuc2VcXFwiKSA9IFxcXCJHUExcXFwiO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQxMjo1ODo1NS45OTUyMzg2MDFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE1ODEzOTIzNDI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJJTkVUXCIsXG4gICAgXCJJUFY2XCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX2tzb2NrX2NyZWF0ZVwiLFxuICAgIFwiYnBmX2tzb2NrX2JpbmRcIixcbiAgICBcImJwZl9rc29ja19jb25uZWN0XCIsXG4gICAgXCJicGZfa3NvY2tfc2VuZFwiLFxuICAgIFwiYnBmX2tzb2NrX2FjcXVpcmVcIixcbiAgICBcImJwZl9rc29ja19yZWxlYXNlXCIsXG4gICAgXCJfX3N5c19jb25uZWN0X3NvY2tldFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGZlYXR1cmUgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBrZXJuZWwgc29ja2V0cyAoYGJwZl9rc29ja2ApLiBUaGlzIGFkZHMgbmV3IEJQRiBrZnVuY3MgKGBicGZfa3NvY2tfY3JlYXRlYCwgYGJwZl9rc29ja19iaW5kYCwgYGJwZl9rc29ja19jb25uZWN0YCwgYGJwZl9rc29ja19zZW5kYCwgZXRjLikgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgY29yZSBuZXR3b3JraW5nIHN0YWNrLiBGdXp6aW5nIHRoZXNlIGtmdW5jcyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIG1lbW9yeSBzYWZldHkgYW5kIGNvcnJlY3QgYmVoYXZpb3Igb2YgdGhlIG5ldyBmZWF0dXJlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG5ldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0XG4gICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksXG4gICBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDZjMDQ0YTNiM2FlMmY4MWRhZWQwY2M5MGI5YzQwODQ5Y2Q2MzEzZWJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEp1bCA2IDEyOjU4OjU0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNjdGwvbmV0LnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvc3lzY3RsL25ldC5yc3RcbmluZGV4IGU1ODZlMTdmYzdhNTgyLi44YmNkYzFiZmQ3MTEzOCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvc3lzY3RsL25ldC5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvc3lzY3RsL25ldC5yc3RcbkBAIC0xMjgsNiArMTI4LDE4IEBAIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlamVjdCB1bnByaXZpbGVnZWQgSklUIHJlcXVlc3RzIG9uY2UgaXQgaGFzXG4gYmVlbiBzdXJwYXNzZWQuIGJwZl9qaXRfbGltaXQgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwgbGltaXRcbiBpbiBieXRlcy5cbiBcbiticGZfa3NvY2tfbWF4XG4rLS0tLS0tLS0tLS0tLVxuK1xuK01heGltdW0gbnVtYmVyIG9mIEJQRiBrZXJuZWwgc29ja2V0cyB0aGF0IG1heSBleGlzdCBpbiBlYWNoIG5ldHdvcmsgbmFtZXNwYWNlLlxuK1RoaXMgaG9zdC13aWRlIHNldHRpbmcgaXMgZXhwb3NlZCBpbiB0aGUgaW5pdGlhbCBuZXR3b3JrIG5hbWVzcGFjZSBhbmQgYXBwbGllc1xuK3RoZSBzYW1lIGxpbWl0IGluZGVwZW5kZW50bHkgdG8gZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuIFNvY2tldHMgYXdhaXRpbmdcbitkZWZlcnJlZCBSQ1UgYW5kIHdvcmtxdWV1ZSBjbGVhbnVwIHJlbWFpbiBjb3VudGVkIHVudGlsIHRoZSB1bmRlcmx5aW5nIHNvY2tldFxuK2hhcyBiZWVuIHJlbGVhc2VkLiBBIHZhbHVlIG9mIDAgZGlzYWJsZXMgY3JlYXRpb24gb2YgQlBGIGtlcm5lbCBzb2NrZXRzIGluXG4rZXZlcnkgbmV0d29yayBuYW1lc3BhY2UuXG4rXG4rRGVmYXVsdDogMTAyNFxuK1xuIGRldl93ZWlnaHRcbiAtLS0tLS0tLS0tXG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGZfa3NvY2suaCBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMDQ4NWI4ZWRkYzFmMjBcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmX2tzb2NrLmhcbkBAIC0wLDAgKzEsNTAgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuK1xuKyNpZm5kZWYgX0JQRl9LU09DS19IXG4rI2RlZmluZSBfQlBGX0tTT0NLX0hcbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4rXG4rI2RlZmluZSBCUEZfS1NPQ0tfTUFYX0RFRkFVTFQgMTAyNFxuK1xuK2V4dGVybiBpbnQgc3lzY3RsX2JwZl9rc29ja19tYXg7XG4rXG4rLyoqXG4rICogc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAtIEJQRiBrZXJuZWwgc29ja2V0IGNyZWF0aW9uIHBhcmFtZXRlcnNcbisgKiBAZmFtaWx5Olx0QWRkcmVzcyBmYW1pbHk6IEFGX0lORVQgb3IgQUZfSU5FVDYuXG4rICogQHR5cGU6XHRTb2NrZXQgdHlwZTogb25seSBTT0NLX0RHUkFNIHN1cHBvcnRlZCBmb3Igbm93LlxuKyAqIEBwcm90b2NvbDpcdFByb3RvY29sIG51bWJlciAoZS5nLiBJUFBST1RPX1VEUCksIG9yIDAgZm9yIHRoZSBkZWZhdWx0IHByb3RvY29sXG4rICpcdFx0b2YgdGhlIGdpdmVuIHR5cGUuXG4rICogQHJlc2VydmVkOlx0TXVzdCBiZSB6ZXJvLiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbisgKi9cbitzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIHtcbitcdF9fdTggZmFtaWx5O1xuK1x0X191OCB0eXBlO1xuK1x0X191OCBwcm90b2NvbDtcbitcdF9fdTggcmVzZXJ2ZWQ7XG4rfTtcbitcbisvKipcbisgKiBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAtIEJQRiBrZXJuZWwgc29ja2V0IGFkZHJlc3MgcGFyYW1ldGVyc1xuKyAqIEBmYW1pbHk6XHRBZGRyZXNzIGZhbWlseTogQUZfSU5FVCBvciBBRl9JTkVUNi5cbisgKiBAcmVzZXJ2ZWQ6XHRNdXN0IGJlIHplcm8uIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuKyAqIEBwb3J0Olx0UG9ydCBpbiBob3N0IGJ5dGUgb3JkZXIuXG4rICogQHNjb3BlX2lkOlx0SVB2NiBzY29wZSBJRCBmb3Igc2NvcGVkIEFGX0lORVQ2IGFkZHJlc3Nlcywgb3IgemVyby5cbisgKlx0XHRNdXN0IGJlIHplcm8gd2hlbiBmYW1pbHk9QUZfSU5FVC5cbisgKiBAaXB2NF9hZGRyOlx0SVB2NCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gVXNlZCB3aGVuIGZhbWlseT1BRl9JTkVULlxuKyAqIEBpcHY2X2FkZHI6XHRJUHY2IGFkZHJlc3MgKDE2IGJ5dGVzLCBuZXR3b3JrIGJ5dGUgb3JkZXIpLiBVc2VkIHdoZW4gZmFtaWx5PUFGX0lORVQ2LlxuKyAqL1xuK3N0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIHtcbitcdF9fdTggZmFtaWx5O1xuK1x0X191OCByZXNlcnZlZDtcbitcdF9fdTE2IHBvcnQ7XG4rXHRfX3UzMiBzY29wZV9pZDtcbitcbitcdHVuaW9uIHtcbitcdFx0X19iZTMyIGlwdjRfYWRkcjtcbitcdFx0X191MzIgaXB2Nl9hZGRyWzRdOyAvKiBpbjZfYWRkcjsgbmV0d29yayBvcmRlciAqL1xuK1x0fTtcbit9O1xuK1xuKyNlbmRpZiAvKiBfQlBGX0tTT0NLX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuaW5kZXggMmE4ZDdiMTRmMWQxMTkuLjQ4ZjFlYjgxOTNkZWExIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaFxuQEAgLTQ2MSw2ICs0NjEsOCBAQCBleHRlcm4gc3RydWN0IGZpbGUgKl9fc3lzX3NvY2tldF9maWxlKGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpO1xuIGV4dGVybiBpbnQgX19zeXNfYmluZChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVteWFkZHIsIGludCBhZGRybGVuKTtcbiBleHRlcm4gaW50IF9fc3lzX2JpbmRfc29ja2V0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxuIFx0XHRcdCAgICAgaW50IGFkZHJsZW4pO1xuK2V4dGVybiBpbnQgX19zeXNfY29ubmVjdF9zb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsXG4rXHRcdFx0XHRpbnQgYWRkcmxlbiwgaW50IGZsYWdzKTtcbiBleHRlcm4gaW50IF9fc3lzX2Nvbm5lY3RfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsXG4gXHRcdFx0ICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKTtcbiBleHRlcm4gaW50IF9fc3lzX2Nvbm5lY3QoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1c2VydmFkZHIsXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uNTJmNmE4OTU0NmU0NmEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTQ0MjQsNiArNDQyNCw5IEBAIEJURl9JRChzdHJ1Y3QsIHRhc2tfc3RydWN0KVxuICNpZmRlZiBDT05GSUdfQ1JZUFRPXG4gQlRGX0lEKHN0cnVjdCwgYnBmX2NyeXB0b19jdHgpXG4gI2VuZGlmXG4rI2lmZGVmIENPTkZJR19JTkVUXG4rQlRGX0lEKHN0cnVjdCwgYnBmX2tzb2NrKVxuKyNlbmRpZlxuIEJURl9TRVRfRU5EKHJjdV9wcm90ZWN0ZWRfdHlwZXMpXG4gXG4gc3RhdGljIGJvb2wgcmN1X3Byb3RlY3RlZF9vYmplY3QoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKVxuZGlmZiAtLWdpdCBhL25ldC9jb3JlL01ha2VmaWxlIGIvbmV0L2NvcmUvTWFrZWZpbGVcbmluZGV4IGIzZmRjYjRlMzU1ZmE2Li5hOTI5NWI3ODU5MDEwOSAxMDA2NDRcbi0tLSBhL25ldC9jb3JlL01ha2VmaWxlXG4rKysgYi9uZXQvY29yZS9NYWtlZmlsZVxuQEAgLTQ0LDYgKzQ0LDkgQEAgb2JqLSQoQ09ORklHX0ZBSUxPVkVSKSArPSBmYWlsb3Zlci5vXG4gb2JqLSQoQ09ORklHX05FVF9TT0NLX01TRykgKz0gc2ttc2cub1xuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gc29ja19tYXAub1xuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX3NrX3N0b3JhZ2Uub1xuK2lmbmVxICgkKENPTkZJR19JTkVUKSwpXG4rb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBicGZfa3NvY2sub1xuK2VuZGlmXG4gb2JqLSQoQ09ORklHX09GKVx0Kz0gb2ZfbmV0Lm9cbiBvYmotJChDT05GSUdfTkVUX1RFU1QpICs9IG5ldF90ZXN0Lm9cbiBvYmotJChDT05GSUdfTkVUX0RFVk1FTSkgKz0gZGV2bWVtLm9cbmRpZmYgLS1naXQgYS9uZXQvY29yZS9icGZfa3NvY2suYyBiL25ldC9jb3JlL2JwZl9rc29jay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjhiZGU3MzRiYzkxN2QzXG4tLS0gL2Rldi9udWxsXG4rKysgYi9uZXQvY29yZS9icGZfa3NvY2suY1xuQEAgLTAsMCArMSw1MTYgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmX2tzb2NrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NhY2hlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9oYXNoLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaW42LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9saXN0X2JsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9uZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JlZmNvdW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VwZGF0ZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NvY2tldC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdW5hbGlnbmVkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lwLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvaXB2Ni5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbmV0L25ldF9uYW1lc3BhY2UuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY25ldC9uZXRucy9nZW5lcmljLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvc29jay5oXHUwMDNlXG4rXG4rLyoqXG4rICogc3RydWN0IGJwZl9rc29jayAtIHJlZmNvdW50ZWQgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dFxuKyAqIEBzb2NrOlx0VGhlIHVuZGVybHlpbmcga2VybmVsIHNvY2tldC5cbisgKiBAdXNhZ2U6XHRSZWZlcmVuY2UgY291bnRlci5cbisgKiBAcndvcms6XHRSQ1Ugd29yayBmb3IgZGVmZXJyZWQgY2xlYW51cCAoc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXG4rICovXG4rc3RydWN0IGJwZl9rc29jayB7XG4rXHRzdHJ1Y3Qgc29ja2V0ICpzb2NrO1xuK1x0cmVmY291bnRfdCB1c2FnZTtcbitcdHN0cnVjdCByY3Vfd29yayByd29yaztcbit9O1xuK1xuK3N0cnVjdCBicGZfa3NvY2tfc2VuZF9ndWFyZCB7XG4rXHRzdHJ1Y3QgaGxpc3RfYmxfbm9kZSBub2RlO1xuK1x0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xuK307XG4rXG4rI2RlZmluZSBCUEZfS1NPQ0tfU0VORF9HVUFSRF9IQVNIX0JJVFMgNlxuK1xuK3N0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQge1xuK1x0c3RydWN0IGhsaXN0X2JsX2hlYWQgaGVhZDtcbit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7XG4rXG4rc3RhdGljIHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXRcbitcdGJwZl9rc29ja19zZW5kX2J1Y2tldHNbMSBcdTAwM2NcdTAwM2MgQlBGX0tTT0NLX1NFTkRfR1VBUkRfSEFTSF9CSVRTXTtcbitcbitzdGF0aWMgc3RydWN0IGJwZl9rc29ja19zZW5kX2J1Y2tldCAqXG4rYnBmX2tzb2NrX3NlbmRfYnVja2V0KGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbit7XG4rXHR1MzIgYnVja2V0X2lkeCA9IGhhc2hfcHRyKHRhc2ssIEJQRl9LU09DS19TRU5EX0dVQVJEX0hBU0hfQklUUyk7XG4rXG4rXHRyZXR1cm4gXHUwMDI2YnBmX2tzb2NrX3NlbmRfYnVja2V0c1tidWNrZXRfaWR4XTtcbit9XG4rXG4rc3RhdGljIGJvb2wgYnBmX2tzb2NrX3NlbmRfZW50ZXIoc3RydWN0IGJwZl9rc29ja19zZW5kX2d1YXJkICpndWFyZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmVudHJ5O1xuK1x0c3RydWN0IGhsaXN0X2JsX25vZGUgKnBvcztcbitcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKmJ1Y2tldDtcbitcbitcdGJ1Y2tldCA9IGJwZl9rc29ja19zZW5kX2J1Y2tldChjdXJyZW50KTtcbitcdGhsaXN0X2JsX2xvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuK1x0aGxpc3RfYmxfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQsIG5vZGUpIHtcbitcdFx0aWYgKGVudHJ5LVx1MDAzZXRhc2sgPT0gY3VycmVudCkge1xuK1x0XHRcdGhsaXN0X2JsX3VubG9jayhcdTAwMjZidWNrZXQtXHUwMDNlaGVhZCk7XG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRndWFyZC1cdTAwM2V0YXNrID0gY3VycmVudDtcbitcdElOSVRfSExJU1RfQkxfTk9ERShcdTAwMjZndWFyZC1cdTAwM2Vub2RlKTtcbitcdGhsaXN0X2JsX2FkZF9oZWFkKFx1MDAyNmd1YXJkLVx1MDAzZW5vZGUsIFx1MDAyNmJ1Y2tldC1cdTAwM2VoZWFkKTtcbitcdGhsaXN0X2JsX3VubG9jayhcdTAwMjZidWNrZXQtXHUwMDNlaGVhZCk7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgYnBmX2tzb2NrX3NlbmRfZXhpdChzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgKmd1YXJkKVxuK3tcbitcdHN0cnVjdCBicGZfa3NvY2tfc2VuZF9idWNrZXQgKmJ1Y2tldDtcbitcbitcdGJ1Y2tldCA9IGJwZl9rc29ja19zZW5kX2J1Y2tldChndWFyZC1cdTAwM2V0YXNrKTtcbitcdGhsaXN0X2JsX2xvY2soXHUwMDI2YnVja2V0LVx1MDAzZWhlYWQpO1xuK1x0aGxpc3RfYmxfZGVsKFx1MDAyNmd1YXJkLVx1MDAzZW5vZGUpO1xuK1x0aGxpc3RfYmxfdW5sb2NrKFx1MDAyNmJ1Y2tldC1cdTAwM2VoZWFkKTtcbit9XG4rXG4rc3RydWN0IGJwZl9rc29ja19uZXQge1xuK1x0YXRvbWljX3QgY291bnQ7XG4rfTtcbitcbitzdGF0aWMgdW5zaWduZWQgaW50IGJwZl9rc29ja19uZXRfaWQ7XG4raW50IHN5c2N0bF9icGZfa3NvY2tfbWF4IF9fcmVhZF9tb3N0bHkgPSBCUEZfS1NPQ0tfTUFYX0RFRkFVTFQ7XG4rXG4rc3RhdGljIHN0cnVjdCBicGZfa3NvY2tfbmV0ICpicGZfa3NvY2tfcGVybmV0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldClcbit7XG4rXHRyZXR1cm4gbmV0X2dlbmVyaWMobmV0LCBicGZfa3NvY2tfbmV0X2lkKTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBicGZfa3NvY2tfbmV0X29wcyA9IHtcbitcdC5pZCA9IFx1MDAyNmJwZl9rc29ja19uZXRfaWQsXG4rXHQuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnBmX2tzb2NrX25ldCksXG4rfTtcbitcbitzdGF0aWMgYm9vbCBicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2Uoc3RydWN0IG5ldCAqbmV0KVxuK3tcbitcdHN0cnVjdCBicGZfa3NvY2tfbmV0ICprbiA9IGJwZl9rc29ja19wZXJuZXQobmV0KTtcbitcdGludCBjb3VudCA9IGF0b21pY19yZWFkKFx1MDAyNmtuLVx1MDAzZWNvdW50KTtcbitcdGludCBtYXg7XG4rXG4rXHRkbyB7XG4rXHRcdG1heCA9IFJFQURfT05DRShzeXNjdGxfYnBmX2tzb2NrX21heCk7XG4rXHRcdGlmIChjb3VudCBcdTAwM2U9IG1heClcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9IHdoaWxlICghYXRvbWljX3RyeV9jbXB4Y2hnKFx1MDAyNmtuLVx1MDAzZWNvdW50LCBcdTAwMjZjb3VudCwgY291bnQgKyAxKSk7XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgYnBmX2tzb2NrX25ldF91bmNoYXJnZShzdHJ1Y3QgbmV0ICpuZXQpXG4re1xuK1x0c3RydWN0IGJwZl9rc29ja19uZXQgKmtuID0gYnBmX2tzb2NrX3Blcm5ldChuZXQpO1xuK1xuK1x0V0FSTl9PTl9PTkNFKGF0b21pY19kZWNfcmV0dXJuKFx1MDAyNmtuLVx1MDAzZWNvdW50KSBcdTAwM2MgMCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGtzb2NrX3JlbGVhc2Vfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4re1xuK1x0c3RydWN0IGJwZl9rc29jayAqa3MgPVxuK1x0XHRjb250YWluZXJfb2YodG9fcmN1X3dvcmsod29yayksIHN0cnVjdCBicGZfa3NvY2ssIHJ3b3JrKTtcbitcdHN0cnVjdCBuZXQgKm5ldCA9IGdldF9uZXQoc29ja19uZXQoa3MtXHUwMDNlc29jay1cdTAwM2VzaykpO1xuK1xuK1x0c29ja19yZWxlYXNlKGtzLVx1MDAzZXNvY2spO1xuK1x0YnBmX2tzb2NrX25ldF91bmNoYXJnZShuZXQpO1xuK1x0cHV0X25ldChuZXQpO1xuK1x0a2ZyZWUoa3MpO1xuK31cbitcbitzdGF0aWMgaW50IGJwZl9rc29ja19nZXRfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcbitcdFx0XHQgICAgICB1MzIgb3B0c19fc3osIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKVxuK3tcbitcdHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzIG9wdHNfY29weTtcbitcbitcdGlmICghb3B0cyB8fCBvcHRzX19zeiAhPSBzaXplb2YoKm9wdHMpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdC8qIEtmdW5jIG1lbW9yeSBhcmd1bWVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIG5hdHVyYWxseSBhbGlnbmVkLiAqL1xuK1x0bWVtY3B5KFx1MDAyNm9wdHNfY29weSwgb3B0cywgc2l6ZW9mKG9wdHNfY29weSkpO1xuK1xuK1x0aWYgKG9wdHNfY29weS5yZXNlcnZlZClcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRzd2l0Y2ggKG9wdHNfY29weS5mYW1pbHkpIHtcbitcdGNhc2UgQUZfSU5FVDoge1xuK1x0XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7XG4rXG4rXHRcdGlmIChvcHRzX2NvcHkuc2NvcGVfaWQpXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRcdCphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4pe1xuK1x0XHRcdC5zaW5fZmFtaWx5ID0gQUZfSU5FVCxcbitcdFx0XHQuc2luX3BvcnQgPSBodG9ucyhvcHRzX2NvcHkucG9ydCksXG4rXHRcdFx0LnNpbl9hZGRyLnNfYWRkciA9IG9wdHNfY29weS5pcHY0X2FkZHIsXG4rXHRcdH07XG4rXHRcdHJldHVybiBzaXplb2YoKmFkZHI0KTtcbitcdH1cbisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNilcbitcdGNhc2UgQUZfSU5FVDY6IHtcbitcdFx0c3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7XG4rXG4rXHRcdCphZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KXtcbitcdFx0XHQuc2luNl9mYW1pbHkgPSBBRl9JTkVUNixcbitcdFx0XHQuc2luNl9wb3J0ID0gaHRvbnMob3B0c19jb3B5LnBvcnQpLFxuK1x0XHRcdC5zaW42X3Njb3BlX2lkID0gb3B0c19jb3B5LnNjb3BlX2lkLFxuK1x0XHR9O1xuK1x0XHRtZW1jcHkoXHUwMDI2YWRkcjYtXHUwMDNlc2luNl9hZGRyLCBvcHRzX2NvcHkuaXB2Nl9hZGRyLFxuK1x0XHQgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpO1xuK1x0XHRyZXR1cm4gc2l6ZW9mKCphZGRyNik7XG4rXHR9XG4rI2VuZGlmXG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gLUVBRk5PU1VQUE9SVDtcbitcdH1cbit9XG4rXG4rc3RhdGljIGJvb2wgYnBmX2tzb2NrX2hhc191c2VyX3Rhc2tfY29udGV4dCh2b2lkKVxuK3tcbitcdC8qXG4rXHQgKiBUYXNrIHdvcmsgY2FuIHJ1biBmcm9tIGRvX2V4aXQoKSBhZnRlciBleGl0X25zcHJveHlfbmFtZXNwYWNlcygpXG4rXHQgKiBjbGVhcmVkIGN1cnJlbnQtXHUwMDNlbnNwcm94eSwgd2hpbGUgY3VycmVudCBpcyBzdGlsbCBub3QgYSBrdGhyZWFkLlxuK1x0ICovXG4rXHRyZXR1cm4gIShjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9LVEhSRUFEKSBcdTAwMjZcdTAwMjYgY3VycmVudC1cdTAwM2Vuc3Byb3h5O1xuK31cbitcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4rXG4rLyoqXG4rICogYnBmX2tzb2NrX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgQlBGIGtlcm5lbCBzb2NrZXQuXG4rICpcbisgKiBBbGxvY2F0ZXMgYW5kIGNyZWF0ZXMgYSBrZXJuZWwgc29ja2V0LlxuKyAqIFRoZSBzb2NrZXQgaXMgY2hhcmdlZCBhZ2FpbnN0IHRoZSBhY3RpdmUgbmV0d29yayBuYW1lc3BhY2UncyBCUEYga2VybmVsXG4rICogc29ja2V0IHF1b3RhLlxuKyAqXG4rICogVGhlIHJldHVybmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3JcbisgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCAoc29ja19jcmVhdGUpLCBzbyBpdCBjYW4gb25seSBiZSB1c2VkXG4rICogaW4gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuXG4rICogSXQgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgQlBGIHdvcmtxdWV1ZSBjYWxsYmFjayBiZWNhdXNlIHRoYXQgY2FsbGJhY2tcbisgKiBkb2VzIG5vdCByZXRhaW4gdGhlIGludm9raW5nIHRhc2sncyBuYW1lc3BhY2Ugb3Igc2VjdXJpdHkgY29udGV4dC5cbisgKlxuKyAqIEBvcHRzOlx0UG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIHdpdGggc29ja2V0IHBhcmFtZXRlcnMuXG4rICogQG9wdHNfX3N6Olx0U2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuXG4rICogQGVycl9fdW5pbml0Olx0SW50ZWdlciB0byBzdG9yZSBlcnJvciBjb2RlIHdoZW4gTlVMTCBpcyByZXR1cm5lZC5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3QgYnBmX2tzb2NrICpcbiticGZfa3NvY2tfY3JlYXRlKGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKm9wdHMsIHUzMiBvcHRzX19zeixcbitcdFx0IGludCAqZXJyX191bmluaXQpXG4re1xuK1x0c3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBvcHRzX2NvcHk7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrICprcztcbitcdHN0cnVjdCBuZXQgKm5ldDtcbitcdGludCBlcnI7XG4rXG4rXHQvKlxuK1x0ICogc29ja19jcmVhdGUoKSBkZXJpdmVzIHRoZSBuZXR3b3JrIG5hbWVzcGFjZSwgY3JlZGVudGlhbHMsIGFuZCBjZ3JvdXBcbitcdCAqIGZyb20gY3VycmVudC4gS2VybmVsIHRocmVhZHMsIGluY2x1ZGluZyBCUEYgd29ya3F1ZXVlIGNhbGxiYWNrcywgZG9cbitcdCAqIG5vdCBjYXJyeSB0aGUgY29udGV4dCBvZiB0aGUgdGFzayB0aGF0IGludm9rZWQgdGhlIEJQRiBwcm9ncmFtLlxuK1x0ICovXG4rXHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSkge1xuK1x0XHRlcnIgPSAtRU9QTk9UU1VQUDtcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0fVxuK1xuK1x0aWYgKCFvcHRzIHx8IG9wdHNfX3N6ICE9IHNpemVvZihzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzKSkge1xuK1x0XHRlcnIgPSAtRUlOVkFMO1xuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHR9XG4rXG4rXHRvcHRzX2NvcHkgPSAoc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyl7XG4rXHRcdC5mYW1pbHkgPSBSRUFEX09OQ0Uob3B0cy1cdTAwM2VmYW1pbHkpLFxuK1x0XHQudHlwZSA9IFJFQURfT05DRShvcHRzLVx1MDAzZXR5cGUpLFxuK1x0XHQucHJvdG9jb2wgPSBSRUFEX09OQ0Uob3B0cy1cdTAwM2Vwcm90b2NvbCksXG4rXHRcdC5yZXNlcnZlZCA9IFJFQURfT05DRShvcHRzLVx1MDAzZXJlc2VydmVkKSxcbitcdH07XG4rXG4rXHRpZiAob3B0c19jb3B5LnJlc2VydmVkKSB7XG4rXHRcdGVyciA9IC1FSU5WQUw7XG4rXHRcdGdvdG8gZXJyX291dDtcbitcdH1cbitcbitcdGlmIChvcHRzX2NvcHkuZmFtaWx5ICE9IEFGX0lORVQgXHUwMDI2XHUwMDI2IG9wdHNfY29weS5mYW1pbHkgIT0gQUZfSU5FVDYpIHtcbitcdFx0ZXJyID0gLUVBRk5PU1VQUE9SVDtcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0fVxuK1xuK1x0aWYgKG9wdHNfY29weS50eXBlICE9IFNPQ0tfREdSQU0pIHtcbitcdFx0ZXJyID0gLUVQUk9UT05PU1VQUE9SVDtcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0fVxuK1xuK1x0aWYgKG9wdHNfY29weS5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCBcdTAwMjZcdTAwMjYgb3B0c19jb3B5LnByb3RvY29sICE9IDApIHtcbitcdFx0ZXJyID0gLUVQUk9UT05PU1VQUE9SVDtcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0fVxuK1xuK1x0a3MgPSBremFsbG9jX29iaigqa3MpO1xuK1x0aWYgKCFrcykge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuK1x0XHRnb3RvIGVycl9vdXQ7XG4rXHR9XG4rXG4rXHRuZXQgPSBjdXJyZW50LVx1MDAzZW5zcHJveHktXHUwMDNlbmV0X25zO1xuK1x0aWYgKCFicGZfa3NvY2tfbmV0X3RyeV9jaGFyZ2UobmV0KSkge1xuK1x0XHRlcnIgPSAtRU5PU1BDO1xuK1x0XHRnb3RvIGVycl9mcmVlO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIFVzZSB0aGUgbm9ybWFsIGN1cnJlbnQtdGFzayBzb2NrZXQgcGF0aCBzbyBMU00vY2dyb3VwIHBvbGljeSxcbitcdCAqIHNvY2tldCBsYWJlbHMsIGFuZCB0aGUgYWN0aXZlIG5ldG5zIHJlZmVyZW5jZSBtYXRjaCBhIHNvY2tldCgyKVxuK1x0ICogY3JlYXRlZCBieSB0aGUgQlBGIHByb2dyYW0ncyBjYWxsZXIuXG4rXHQgKi9cbitcdGVyciA9IHNvY2tfY3JlYXRlKG9wdHNfY29weS5mYW1pbHksIG9wdHNfY29weS50eXBlLCBvcHRzX2NvcHkucHJvdG9jb2wsXG4rXHRcdFx0ICBcdTAwMjZrcy1cdTAwM2Vzb2NrKTtcbitcdGlmIChlcnIpXG4rXHRcdGdvdG8gZXJyX3VuY2hhcmdlO1xuK1xuK1x0a3MtXHUwMDNlc29jay1cdTAwM2Vzay1cdTAwM2Vza19yY3ZidWYgPSBTT0NLX01JTl9SQ1ZCVUY7XG4rXHRrcy1cdTAwM2Vzb2NrLVx1MDAzZXNrLVx1MDAzZXNrX3VzZXJsb2NrcyB8PSBTT0NLX1JDVkJVRl9MT0NLO1xuK1xuK1x0cmVmY291bnRfc2V0KFx1MDAyNmtzLVx1MDAzZXVzYWdlLCAxKTtcbitcdHB1dF91bmFsaWduZWQoMCwgZXJyX191bmluaXQpO1xuK1x0cmV0dXJuIGtzO1xuK1xuK2Vycl91bmNoYXJnZTpcbitcdGJwZl9rc29ja19uZXRfdW5jaGFyZ2UobmV0KTtcbitlcnJfZnJlZTpcbitcdGtmcmVlKGtzKTtcbitlcnJfb3V0OlxuK1x0cHV0X3VuYWxpZ25lZChlcnIsIGVycl9fdW5pbml0KTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKipcbisgKiBicGZfa3NvY2tfYmluZCgpIC0gQmluZCBhIEJQRiBrZXJuZWwgc29ja2V0IHRvIGEgbG9jYWwgYWRkcmVzcy5cbisgKiBAa3M6XHRcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LlxuKyAqIEBvcHRzOlx0UG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyB3aXRoIGxvY2FsIGFkZHJlc3MuXG4rICogQG9wdHNfX3N6Olx0U2l6ZSBvZiB0aGUgb3B0cyBzdHJ1Y3QuXG4rICpcbisgKiBCaW5kcyB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYWwgYWRkcmVzcyBhbmQgcG9ydC5cbisgKiBUaGlzIGlzIG9wdGlvbmFsOyBpZiBub3QgY2FsbGVkLCB0aGUga2VybmVsIHdpbGwgYXV0by1hc3NpZ24uXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCB3aGlsZSBiaW5kaW5nIHRoZSBzb2NrZXQsIHNvIGl0IGNhbiBvbmx5IGJlIHVzZWQgaW5cbisgKiBzbGVlcGFibGUgQlBGIHByb2dyYW1zIChTWVNDQUxMKS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci5cbisgKi9cbitfX2JwZl9rZnVuYyBpbnQgYnBmX2tzb2NrX2JpbmQoc3RydWN0IGJwZl9rc29jayAqa3MsXG4rXHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfYWRkcl9vcHRzICpvcHRzLFxuK1x0XHRcdCAgICAgICB1MzIgb3B0c19fc3opXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkciA9IHt9O1xuK1x0aW50IGFkZHJsZW47XG4rXG4rXHRpZiAoIWJwZl9rc29ja19oYXNfdXNlcl90YXNrX2NvbnRleHQoKSlcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuK1x0YWRkcmxlbiA9IGJwZl9rc29ja19nZXRfYWRkcihvcHRzLCBvcHRzX19zeiwgXHUwMDI2YWRkcik7XG4rXHRpZiAoYWRkcmxlbiBcdTAwM2MgMClcbitcdFx0cmV0dXJuIGFkZHJsZW47XG4rXG4rXHRyZXR1cm4gX19zeXNfYmluZF9zb2NrZXQoa3MtXHUwMDNlc29jaywgXHUwMDI2YWRkciwgYWRkcmxlbik7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9rc29ja19jb25uZWN0KCkgLSBDb25uZWN0IGEgQlBGIGtlcm5lbCBzb2NrZXQgdG8gYSByZW1vdGUgYWRkcmVzcy5cbisgKiBAa3M6XHRcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0LlxuKyAqIEBvcHRzOlx0UG9pbnRlciB0byBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyB3aXRoIHJlbW90ZSBhZGRyZXNzLlxuKyAqIEBvcHRzX19zejpcdFNpemUgb2YgdGhlIG9wdHMgc3RydWN0LlxuKyAqXG4rICogQ29ubmVjdHMgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBhZGRyZXNzIGFuZCBwb3J0LlxuKyAqXG4rICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgd2hpbGUgY29ubmVjdGluZyB0aGUgc29ja2V0LCBzbyBpdCBjYW4gb25seSBiZSB1c2VkXG4rICogaW4gc2xlZXBhYmxlIEJQRiBwcm9ncmFtcyAoU1lTQ0FMTCkuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuXG4rICovXG4rX19icGZfa2Z1bmMgaW50IGJwZl9rc29ja19jb25uZWN0KHN0cnVjdCBicGZfa3NvY2sgKmtzLFxuK1x0XHRcdFx0ICBjb25zdCBzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyAqb3B0cyxcbitcdFx0XHRcdCAgdTMyIG9wdHNfX3N6KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHIgPSB7fTtcbitcdGludCBhZGRybGVuO1xuK1xuK1x0aWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdGFkZHJsZW4gPSBicGZfa3NvY2tfZ2V0X2FkZHIob3B0cywgb3B0c19fc3osIFx1MDAyNmFkZHIpO1xuK1x0aWYgKGFkZHJsZW4gXHUwMDNjIDApXG4rXHRcdHJldHVybiBhZGRybGVuO1xuK1xuK1x0cmV0dXJuIF9fc3lzX2Nvbm5lY3Rfc29ja2V0KGtzLVx1MDAzZXNvY2ssIFx1MDAyNmFkZHIsIGFkZHJsZW4sIDApO1xuK31cbitcbisvKipcbisgKiBicGZfa3NvY2tfYWNxdWlyZSgpIC0gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byBhIEJQRiBrZXJuZWwgc29ja2V0LlxuKyAqIEBrczpcdFRoZSBCUEYga2VybmVsIHNvY2tldCBjb250ZXh0IHRvIGFjcXVpcmUuIE11c3QgYmUgYVxuKyAqXHR0cnVzdGVkIHBvaW50ZXIgKGUuZy4gUkNVLXByb3RlY3RlZCBrcHRyIGZyb20gYSBtYXApLlxuKyAqXG4rICogVGhlIGFjcXVpcmVkIGNvbnRleHQgbXVzdCBlaXRoZXIgYmUgc3RvcmVkIGluIGEgbWFwIGFzIGEga3B0ciwgb3JcbisgKiBmcmVlZCB3aXRoIGJwZl9rc29ja19yZWxlYXNlKCkuXG4rICovXG4rX19icGZfa2Z1bmMgc3RydWN0IGJwZl9rc29jayAqYnBmX2tzb2NrX2FjcXVpcmUoc3RydWN0IGJwZl9rc29jayAqa3MpXG4re1xuK1x0aWYgKCFyZWZjb3VudF9pbmNfbm90X3plcm8oXHUwMDI2a3MtXHUwMDNldXNhZ2UpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiBrcztcbit9XG4rXG4rLyoqXG4rICogYnBmX2tzb2NrX3JlbGVhc2UoKSAtIFJlbGVhc2UgYSBCUEYga2VybmVsIHNvY2tldC5cbisgKiBAa3M6XHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dCB0byByZWxlYXNlLlxuKyAqXG4rICogV2hlbiB0aGUgZmluYWwgcmVmZXJlbmNlIGlzIHJlbGVhc2VkLCB0aGUgc29ja2V0IGlzIGNsZWFuZWQgdXAgdmlhXG4rICogcXVldWVfcmN1X3dvcmsoKSAoc2luY2Ugc29ja19yZWxlYXNlIG1heSBzbGVlcCkuXG4rICovXG4rX19icGZfa2Z1bmMgdm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcylcbit7XG4rXHRpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KFx1MDAyNmtzLVx1MDAzZXVzYWdlKSkge1xuK1x0XHRJTklUX1JDVV9XT1JLKFx1MDAyNmtzLVx1MDAzZXJ3b3JrLCBrc29ja19yZWxlYXNlX3dvcmtfZm4pO1xuK1x0XHRxdWV1ZV9yY3Vfd29yayhzeXN0ZW1fZGZsX3dxLCBcdTAwMjZrcy1cdTAwM2Vyd29yayk7XG4rXHR9XG4rfVxuK1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2tzb2NrX3JlbGVhc2VfZHRvcih2b2lkICprcylcbit7XG4rXHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4rfVxuK0NGSV9OT1NFQUwoYnBmX2tzb2NrX3JlbGVhc2VfZHRvcik7XG4rXG4rLyoqXG4rICogYnBmX2tzb2NrX3NlbmQoKSAtIFNlbmQgZGF0YSB0aHJvdWdoIGEgQlBGIGtlcm5lbCBzb2NrZXQuXG4rICogQGtzOlx0XHRUaGUgQlBGIGtlcm5lbCBzb2NrZXQgY29udGV4dC4gTXVzdCBiZSBhbiBhY3F1aXJlZCByZWZlcmVuY2UuXG4rICogQGRhdGE6XHRQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHNlbmQuXG4rICogQGRhdGFfX3N6Olx0U2l6ZSBvZiB0aGUgZGF0YSB0byBzZW5kIChtYXggNjU1MzUgYnl0ZXMpLlxuKyAqXG4rICogU2VuZHMgZGF0YSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQsIGJlc3QtZWZmb3J0IGFuZCBub25ibG9ja2luZy4gVGhpcyBtYXkgc2xlZXBcbisgKiAoa2VybmVsX3NlbmRtc2cpLCBzbyBpdCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBzbGVlcGFibGUgQlBGIHByb2dyYW1zLlxuKyAqXG4rICogUmV0dXJuOiBOdW1iZXIgb2YgYnl0ZXMgc2VudCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci5cbisgKi9cbitfX2JwZl9rZnVuYyBpbnQgYnBmX2tzb2NrX3NlbmQoc3RydWN0IGJwZl9rc29jayAqa3MsIGNvbnN0IHZvaWQgKmRhdGEsXG4rXHRcdFx0ICAgICAgIHUzMiBkYXRhX19zeilcbit7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX3NlbmRfZ3VhcmQgZ3VhcmQ7XG4rXHRzdHJ1Y3QgbXNnaGRyIG1zZyA9IHtcbitcdFx0Lm1zZ19mbGFncyA9IE1TR19ET05UV0FJVCxcbitcdH07XG4rXHRzdHJ1Y3Qga3ZlYyBpb3YgPSB7XG4rXHRcdC5pb3ZfYmFzZSA9ICh2b2lkICopZGF0YSxcbitcdFx0Lmlvdl9sZW4gPSBkYXRhX19zeixcbitcdH07XG4rXHRpbnQgcmV0O1xuK1xuK1x0aWYgKCFicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0KCkpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdC8qIEVhcmx5IGNoZWNrIGZvciBVRFAuIEV4YWN0IGxpbWl0cyBlbmZvcmNlZCBieSBrZXJuZWxfc2VuZG1zZygpLiAqL1xuK1x0aWYgKGRhdGFfX3N6IFx1MDAzZSBJUF9NQVhfTVRVKVxuK1x0XHRyZXR1cm4gLUVNU0dTSVpFO1xuK1xuK1x0aWYgKCFicGZfa3NvY2tfc2VuZF9lbnRlcihcdTAwMjZndWFyZCkpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4rXHRyZXQgPSBrZXJuZWxfc2VuZG1zZyhrcy1cdTAwM2Vzb2NrLCBcdTAwMjZtc2csIFx1MDAyNmlvdiwgMSwgZGF0YV9fc3opO1xuK1x0YnBmX2tzb2NrX3NlbmRfZXhpdChcdTAwMjZndWFyZCk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuK1xuK0JURl9LRlVOQ1NfU1RBUlQoa3NvY2tfaW5pdF9rZnVuY19idGZfaWRzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfa3NvY2tfY3JlYXRlLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwgfCBLRl9TTEVFUEFCTEUpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19iaW5kLCBLRl9TTEVFUEFCTEUpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19jb25uZWN0LCBLRl9TTEVFUEFCTEUpXG4rQlRGX0tGVU5DU19FTkQoa3NvY2tfaW5pdF9rZnVuY19idGZfaWRzKVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBrc29ja19pbml0X2tmdW5jX3NldCA9IHtcbitcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuK1x0LnNldCA9IFx1MDAyNmtzb2NrX2luaXRfa2Z1bmNfYnRmX2lkcyxcbit9O1xuK1xuK0JURl9LRlVOQ1NfU1RBUlQoa3NvY2tfa2Z1bmNfYnRmX2lkcylcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2tzb2NrX3JlbGVhc2UsIEtGX1JFTEVBU0UpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19hY3F1aXJlLCBLRl9BQ1FVSVJFIHwgS0ZfUkNVIHwgS0ZfUkVUX05VTEwpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rc29ja19zZW5kLCBLRl9TTEVFUEFCTEUpXG4rQlRGX0tGVU5DU19FTkQoa3NvY2tfa2Z1bmNfYnRmX2lkcylcbitcbitzdGF0aWMgaW50IGJwZl9rc29ja19rZnVuY19maWx0ZXIoY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1MzIga2Z1bmNfaWQpXG4re1xuK1x0aWYgKCFidGZfaWRfc2V0OF9jb250YWlucyhcdTAwMjZrc29ja19rZnVuY19idGZfaWRzLCBrZnVuY19pZCkgfHxcbitcdCAgICBwcm9nLVx1MDAzZXR5cGUgPT0gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHx8XG4rXHQgICAgcHJvZy1cdTAwM2V0eXBlID09IEJQRl9QUk9HX1RZUEVfTFNNKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiAtRUFDQ0VTO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQga3NvY2tfa2Z1bmNfc2V0ID0ge1xuK1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4rXHQuc2V0ID0gXHUwMDI2a3NvY2tfa2Z1bmNfYnRmX2lkcyxcbitcdC5maWx0ZXIgPSBicGZfa3NvY2tfa2Z1bmNfZmlsdGVyLFxuK307XG4rXG4rQlRGX0lEX0xJU1QoYnBmX2tzb2NrX2R0b3JfaWRzKVxuK0JURl9JRChzdHJ1Y3QsIGJwZl9rc29jaylcbitCVEZfSUQoZnVuYywgYnBmX2tzb2NrX3JlbGVhc2VfZHRvcilcbitcbitzdGF0aWMgaW50IF9faW5pdCBicGZfa3NvY2tfa2Z1bmNfaW5pdCh2b2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjb25zdCBzdHJ1Y3QgYnRmX2lkX2R0b3Jfa2Z1bmMgYnBmX2tzb2NrX2R0b3JzW10gPSB7XG4rXHRcdHtcbitcdFx0XHQuYnRmX2lkID0gYnBmX2tzb2NrX2R0b3JfaWRzWzBdLFxuK1x0XHRcdC5rZnVuY19idGZfaWQgPSBicGZfa3NvY2tfZHRvcl9pZHNbMV0sXG4rXHRcdH0sXG4rXHR9O1xuK1xuK1x0cmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cyhcdTAwMjZicGZfa3NvY2tfbmV0X29wcyk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXG4rXHRcdFx0XHRcdFx1MDAyNmtzb2NrX2luaXRfa2Z1bmNfc2V0KTtcbitcdGlmIChyZXQpIHtcbitcdFx0dW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKFx1MDAyNmJwZl9rc29ja19uZXRfb3BzKTtcbitcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZrc29ja19rZnVuY19zZXQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MU00sXG4rXHRcdFx0XHRcdCAgICAgICBcdTAwMjZrc29ja19rZnVuY19zZXQpO1xuK1x0cmV0dXJuIHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoYnBmX2tzb2NrX2R0b3JzLFxuK1x0XHRcdFx0XHRcdCBBUlJBWV9TSVpFKGJwZl9rc29ja19kdG9ycyksXG4rXHRcdFx0XHRcdFx0IFRISVNfTU9EVUxFKTtcbit9XG4rXG4rbGF0ZV9pbml0Y2FsbChicGZfa3NvY2tfa2Z1bmNfaW5pdCk7XG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMgYi9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuY1xuaW5kZXggYjUwODYxOGJmYzEyMzkuLmQyMjFhMTgwYzg3NzA1IDEwMDY0NFxuLS0tIGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmNcbisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jXG5AQCAtNyw2ICs3LDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWx0ZXIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZl9rc29jay5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3N5c2N0bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbkBAIC01MjUsNiArNTI2LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5ldF9jb3JlX3RhYmxlW10gPSB7XG4gXHRcdC5leHRyYTFcdFx0PSBTWVNDVExfTE9OR19PTkUsXG4gXHRcdC5leHRyYTJcdFx0PSBcdTAwMjZicGZfaml0X2xpbWl0X21heCxcbiBcdH0sXG4rI2VuZGlmXG4rI2lmIElTX0VOQUJMRUQoQ09ORklHX0JQRl9TWVNDQUxMKSBcdTAwMjZcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfSU5FVClcbitcdHtcbitcdFx0LnByb2NuYW1lXHQ9IFwiYnBmX2tzb2NrX21heFwiLFxuK1x0XHQuZGF0YVx0XHQ9IFx1MDAyNnN5c2N0bF9icGZfa3NvY2tfbWF4LFxuK1x0XHQubWF4bGVuXHRcdD0gc2l6ZW9mKGludCksXG4rXHRcdC5tb2RlXHRcdD0gMDY0NCxcbitcdFx0LnByb2NfaGFuZGxlclx0PSBwcm9jX2RvaW50dmVjX21pbm1heCxcbitcdFx0LmV4dHJhMVx0XHQ9IFNZU0NUTF9aRVJPLFxuK1x0fSxcbiAjZW5kaWZcbiBcdHtcbiBcdFx0LnByb2NuYW1lXHQ9IFwibmV0ZGV2X3RzdGFtcF9wcmVxdWV1ZVwiLFxuZGlmZiAtLWdpdCBhL25ldC9zb2NrZXQuYyBiL25ldC9zb2NrZXQuY1xuaW5kZXggNjNjNjlhMGZhNzRlMWUuLmM3NDI3ZGQ0ZGQ1MjNkIDEwMDY0NFxuLS0tIGEvbmV0L3NvY2tldC5jXG4rKysgYi9uZXQvc29ja2V0LmNcbkBAIC0yMTE1LDI3ICsyMTE1LDMxIEBAIFNZU0NBTExfREVGSU5FMyhhY2NlcHQsIGludCwgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgdXBlZXJfc29ja2FkZHIsXG4gICpcdGluY2x1ZGUgdGhlIC1FSU5QUk9HUkVTUyBzdGF0dXMgZm9yIHN1Y2ggc29ja2V0cy5cbiAgKi9cbiBcbitpbnQgX19zeXNfY29ubmVjdF9zb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHJlc3MsXG4rXHRcdFx0IGludCBhZGRybGVuLCBpbnQgZmxhZ3MpXG4re1xuK1x0aW50IGVycjtcbitcbitcdGVyciA9IHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTtcbitcdGlmIChlcnIpXG4rXHRcdHJldHVybiBlcnI7XG4rXG4rXHRyZXR1cm4gUkVBRF9PTkNFKHNvY2stXHUwMDNlb3BzKS1cdTAwM2Vjb25uZWN0KHNvY2ssXG4rXHRcdFx0XHQgICAgKHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICopYWRkcmVzcyxcbitcdFx0XHRcdCAgICBhZGRybGVuLCBmbGFncyk7XG4rfVxuK1xuIGludCBfX3N5c19jb25uZWN0X2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyZXNzLFxuIFx0XHQgICAgICAgaW50IGFkZHJsZW4sIGludCBmaWxlX2ZsYWdzKVxuIHtcbiBcdHN0cnVjdCBzb2NrZXQgKnNvY2s7XG4tXHRpbnQgZXJyO1xuIFxuIFx0c29jayA9IHNvY2tfZnJvbV9maWxlKGZpbGUpO1xuLVx0aWYgKCFzb2NrKSB7XG4tXHRcdGVyciA9IC1FTk9UU09DSztcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4tXHRlcnIgPVxuLVx0ICAgIHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCBhZGRybGVuKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFzb2NrKVxuK1x0XHRyZXR1cm4gLUVOT1RTT0NLO1xuIFxuLVx0ZXJyID0gUkVBRF9PTkNFKHNvY2stXHUwMDNlb3BzKS1cdTAwM2Vjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqKWFkZHJlc3MsXG4tXHRcdFx0XHRcdCAgICBhZGRybGVuLCBzb2NrLVx1MDAzZWZpbGUtXHUwMDNlZl9mbGFncyB8IGZpbGVfZmxhZ3MpO1xuLW91dDpcbi1cdHJldHVybiBlcnI7XG4rXHRyZXR1cm4gX19zeXNfY29ubmVjdF9zb2NrZXQoc29jaywgYWRkcmVzcywgYWRkcmxlbixcbitcdFx0XHRcdCAgICBzb2NrLVx1MDAzZWZpbGUtXHUwMDNlZl9mbGFncyB8IGZpbGVfZmxhZ3MpO1xuIH1cbiBcbiBpbnQgX19zeXNfY29ubmVjdChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzZXJ2YWRkciwgaW50IGFkZHJsZW4pXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uOGIxNGZkOThkNDEwZWRcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrLmNcbkBAIC0wLDAgKzEsMjM5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXJwYS9pbmV0LmhcdTAwM2VcbitcbisjaW5jbHVkZSBcInRlc3RfcHJvZ3MuaFwiXG4rI2luY2x1ZGUgXCJuZXR3b3JrX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJrc29ja19iYXNpYy5za2VsLmhcIlxuKyNpbmNsdWRlIFwia3NvY2tfcmVjdXJzaW9uLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBOU19URVNUIFwia3NvY2tfYmFzaWNfbnNcIlxuKyNkZWZpbmUgTlNfTFNNX1JFQ1VSU0lPTl9URVNUIFwia3NvY2tfbHNtX3JlY3Vyc2lvbl9uc1wiXG4rI2RlZmluZSBMT09QQkFDS19JUCBcIjEyNy4wLjAuMVwiXG4rI2RlZmluZSBSRUNWX1BPUlQgNzc3N1xuKyNkZWZpbmUgUkVDVl9USU1FT1VUX1NFQyA1XG4rXG4rc3RydWN0IGtzb2NrX3Rlc3RfZW52IHtcbitcdGNvbnN0IGNoYXIgKm5ldG5zO1xuK1x0Ym9vbCBuZXRuc19jcmVhdGVkO1xuK1x0c3RydWN0IG5zdG9rZW4gKm5zdG9rZW47XG4rXHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjtcbitcdGludCByZmQ7XG4rXHRjaGFyIGJ1ZlszMl07XG4rfTtcbitcbitzdGF0aWMgYm9vbCBrc29ja190ZXN0X2Vudl9zZXR1cChzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudiwgY29uc3QgY2hhciAqbmV0bnMpXG4re1xuK1x0c3RydWN0IHRpbWV2YWwgdHY7XG4rXHRpbnQgZXJyO1xuK1xuK1x0bWVtc2V0KGVudiwgMCwgc2l6ZW9mKCplbnYpKTtcbitcdGVudi1cdTAwM2VuZXRucyA9IG5ldG5zO1xuK1x0ZW52LVx1MDAzZXJmZCA9IC0xO1xuK1xuK1x0U1lTKGZhaWwsIFwiaXAgbmV0bnMgYWRkICVzXCIsIG5ldG5zKTtcbitcdGVudi1cdTAwM2VuZXRuc19jcmVhdGVkID0gdHJ1ZTtcbitcdFNZUyhmYWlsLCBcImlwIC1uZXQgJXMgbGluayBzZXQgbG8gdXBcIiwgbmV0bnMpO1xuK1xuK1x0ZW52LVx1MDAzZW5zdG9rZW4gPSBvcGVuX25ldG5zKG5ldG5zKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihlbnYtXHUwMDNlbnN0b2tlbiwgXCJvcGVuX25ldG5zXCIpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHRlbnYtXHUwMDNlcmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGVudi1cdTAwM2VyZmQsIFwicmVjZWl2ZXIgc29ja2V0XCIpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHRlbnYtXHUwMDNlYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDtcbitcdGVudi1cdTAwM2VhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihMT09QQkFDS19JUCk7XG4rXHRlbnYtXHUwMDNlYWRkci5zaW5fcG9ydCA9IGh0b25zKFJFQ1ZfUE9SVCk7XG4rXG4rXHRlcnIgPSBiaW5kKGVudi1cdTAwM2VyZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZlbnYtXHUwMDNlYWRkciwgc2l6ZW9mKGVudi1cdTAwM2VhZGRyKSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYmluZCByZWNlaXZlclwiKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0dHYudHZfc2VjID0gUkVDVl9USU1FT1VUX1NFQztcbitcdHR2LnR2X3VzZWMgPSAwO1xuK1x0ZXJyID0gc2V0c29ja29wdChlbnYtXHUwMDNlcmZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgXHUwMDI2dHYsIHNpemVvZih0dikpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldCByY3Z0aW1lb1wiKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0cmV0dXJuIHRydWU7XG4rXG4rZmFpbDpcbitcdGlmIChlbnYtXHUwMDNlcmZkIFx1MDAzZT0gMCkge1xuK1x0XHRjbG9zZShlbnYtXHUwMDNlcmZkKTtcbitcdFx0ZW52LVx1MDAzZXJmZCA9IC0xO1xuK1x0fVxuK1x0aWYgKGVudi1cdTAwM2Vuc3Rva2VuKSB7XG4rXHRcdGNsb3NlX25ldG5zKGVudi1cdTAwM2Vuc3Rva2VuKTtcbitcdFx0ZW52LVx1MDAzZW5zdG9rZW4gPSBOVUxMO1xuK1x0fVxuK1x0aWYgKGVudi1cdTAwM2VuZXRuc19jcmVhdGVkKSB7XG4rXHRcdFNZU19OT0ZBSUwoXCJpcCBuZXRucyBkZWwgJXMgXHUwMDNlL2Rldi9udWxsIDJcdTAwM2VcdTAwMjYxXCIsIG5ldG5zKTtcbitcdFx0ZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQgPSBmYWxzZTtcbitcdH1cbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIHZvaWQga3NvY2tfdGVzdF9lbnZfY2xlYW51cChzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgKmVudilcbit7XG4rXHRpZiAoZW52LVx1MDAzZXJmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGVudi1cdTAwM2VyZmQpO1xuK1x0aWYgKGVudi1cdTAwM2Vuc3Rva2VuKVxuK1x0XHRjbG9zZV9uZXRucyhlbnYtXHUwMDNlbnN0b2tlbik7XG4rXHRpZiAoZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQpIHtcbitcdFx0U1lTX05PRkFJTChcImlwIG5ldG5zIGRlbCAlcyBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjFcIiwgZW52LVx1MDAzZW5ldG5zKTtcbitcdFx0ZW52LVx1MDAzZW5ldG5zX2NyZWF0ZWQgPSBmYWxzZTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQga3NvY2tfYXNzZXJ0X3JlY3Yoc3RydWN0IGtzb2NrX3Rlc3RfZW52ICplbnYsIGNvbnN0IGNoYXIgKmRhdGEsXG4rXHRcdFx0ICAgICAgc2l6ZV90IGRhdGFfc3opXG4re1xuK1x0c3NpemVfdCBuO1xuK1xuK1x0bWVtc2V0KGVudi1cdTAwM2VidWYsIDAsIHNpemVvZihlbnYtXHUwMDNlYnVmKSk7XG4rXHRuID0gcmVjdmZyb20oZW52LVx1MDAzZXJmZCwgZW52LVx1MDAzZWJ1Ziwgc2l6ZW9mKGVudi1cdTAwM2VidWYpLCAwLCBOVUxMLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX0VRKG4sIGRhdGFfc3osIFwicmVjdmZyb20gbGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRBU1NFUlRfTUVNRVEoZW52LVx1MDAzZWJ1ZiwgZGF0YSwgZGF0YV9zeiwgXCJwYXlsb2FkIG1hdGNoXCIpO1xuK31cbitcbitzdGF0aWMgYm9vbCBrc29ja19zZXR1cF9jdHgoc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nLCBfX2JlMzIgKmlwdjRfcmVtb3RlLFxuK1x0XHRcdCAgICBfX3UxNiAqcmVtb3RlX3BvcnQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuK1x0aW50IGVyciwgcGZkO1xuK1xuK1x0KmlwdjRfcmVtb3RlID0gaW5ldF9hZGRyKExPT1BCQUNLX0lQKTtcbitcdCpyZW1vdGVfcG9ydCA9IFJFQ1ZfUE9SVDtcbitcbitcdHBmZCA9IGJwZl9wcm9ncmFtX19mZChwcm9nKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKHBmZCwgXCJrc29ja19zZXR1cCBmZFwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwZmQsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImtzb2NrX3NldHVwIHJ1blwiKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0aWYgKCFBU1NFUlRfT0sob3B0cy5yZXR2YWwsIFwia3NvY2tfc2V0dXAgcmV0dmFsXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rdm9pZCB0ZXN0X2tzb2NrX2Jhc2ljKHZvaWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuK1x0c3RydWN0IGtzb2NrX3Rlc3RfZW52IGVudjtcbitcdHN0cnVjdCBrc29ja19iYXNpYyAqc2tlbDtcbitcdGludCBlcnIsIHBmZDtcbitcbitcdHNrZWwgPSBrc29ja19iYXNpY19fb3BlbigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwic2tlbCBvcGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRlcnIgPSBrc29ja19iYXNpY19fbG9hZChza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJza2VsIGxvYWRcIikpIHtcbitcdFx0a3NvY2tfYmFzaWNfX2Rlc3Ryb3koc2tlbCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdGlmICgha3NvY2tfdGVzdF9lbnZfc2V0dXAoXHUwMDI2ZW52LCBOU19URVNUKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogU3RlcCAxOiBSdW4gdGhlIHNldHVwIFNZU0NBTEwgcHJvZyB0byBjcmVhdGUga3NvY2sgKi9cbitcdGlmICgha3NvY2tfc2V0dXBfY3R4KHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfc2V0dXAsXG4rXHRcdFx0ICAgICBcdTAwMjZza2VsLVx1MDAzZWJzcy1cdTAwM2VpcHY0X3JlbW90ZSxcbitcdFx0XHQgICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlbW90ZV9wb3J0KSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogU3RlcCAyOiBSdW4gdGhlIHNlbmQgU1lTQ0FMTCBwcm9nICovXG4rXHRwZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5rc29ja19zZW5kKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKHBmZCwgXCJrc29ja19zZW5kIGZkXCIpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHBmZCwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwia3NvY2tfc2VuZCBydW5cIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcdGlmICghQVNTRVJUX0VRKG9wdHMucmV0dmFsLFxuK1x0XHQgICAgICAgc2l6ZW9mKHNrZWwtXHUwMDNlZGF0YS1cdTAwM2VzZW5kX2RhdGEpLCBcInNlbmRtc2cgYnl0ZXNcIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIFN0ZXAgMzogUmVjZWl2ZSBhbmQgdmVyaWZ5IHRoZSBkYXRhICovXG4rXHRrc29ja19hc3NlcnRfcmVjdihcdTAwMjZlbnYsIHNrZWwtXHUwMDNlZGF0YS1cdTAwM2VzZW5kX2RhdGEsXG4rXHRcdFx0ICBzaXplb2Yoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSkpO1xuK1xuK2ZhaWw6XG4rXHRrc29ja190ZXN0X2Vudl9jbGVhbnVwKFx1MDAyNmVudik7XG4rXHRrc29ja19iYXNpY19fZGVzdHJveShza2VsKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2tzb2NrX2xzbV9yZWN1cnNpb24odm9pZClcbit7XG4rXHRzdHJ1Y3Qga3NvY2tfdGVzdF9lbnYgZW52O1xuK1x0c3RydWN0IGtzb2NrX3JlY3Vyc2lvbiAqc2tlbDtcbitcdGNoYXIgdHJpZ2dlciA9ICd4JztcbitcdGludCB0ZmQgPSAtMTtcbitcdGludCBlcnI7XG4rXHRzc2l6ZV90IG47XG4rXG4rXHRza2VsID0ga3NvY2tfcmVjdXJzaW9uX19vcGVuKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJza2VsIG9wZW5cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IGtzb2NrX3JlY3Vyc2lvbl9fbG9hZChza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJza2VsIGxvYWRcIikpIHtcbitcdFx0a3NvY2tfcmVjdXJzaW9uX19kZXN0cm95KHNrZWwpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRpZiAoIWtzb2NrX3Rlc3RfZW52X3NldHVwKFx1MDAyNmVudiwgTlNfTFNNX1JFQ1VSU0lPTl9URVNUKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogU3RlcCAxOiBSdW4gdGhlIHNldHVwIFNZU0NBTEwgcHJvZyB0byBjcmVhdGUgdGhlIGtzb2NrICovXG4rXHRpZiAoIWtzb2NrX3NldHVwX2N0eChza2VsLVx1MDAzZXByb2dzLmtzb2NrX3NldHVwLFxuK1x0XHRcdCAgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNlaXB2NF9yZW1vdGUsXG4rXHRcdFx0ICAgICBcdTAwMjZza2VsLVx1MDAzZWJzcy1cdTAwM2VyZW1vdGVfcG9ydCkpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIFN0ZXAgMjogQXR0YWNoIExTTSBwcm9nIGFuZCB0cmlnZ2VyIHNvY2tldF9zZW5kbXNnIGZyb20gdXNlcnNwYWNlICovXG4rXHRza2VsLVx1MDAzZWxpbmtzLmtzb2NrX3NvY2tldF9zZW5kbXNnID1cbitcdFx0YnBmX3Byb2dyYW1fX2F0dGFjaF9sc20oc2tlbC1cdTAwM2Vwcm9ncy5rc29ja19zb2NrZXRfc2VuZG1zZyk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VsaW5rcy5rc29ja19zb2NrZXRfc2VuZG1zZyxcbitcdFx0XHQgICBcImF0dGFjaCBzb2NrZXRfc2VuZG1zZyBsc21cIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdHRmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRCh0ZmQsIFwidHJpZ2dlciBzb2NrZXRcIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9waWQgPSBnZXRwaWQoKTtcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRyaWdnZXJfc2VuZCA9IDE7XG4rXHRuID0gc2VuZHRvKHRmZCwgXHUwMDI2dHJpZ2dlciwgc2l6ZW9mKHRyaWdnZXIpLCAwLFxuK1x0XHQgICAoc3RydWN0IHNvY2thZGRyICopXHUwMDI2ZW52LmFkZHIsIHNpemVvZihlbnYuYWRkcikpO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X3BpZCA9IDA7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0cmlnZ2VyX3NlbmQgPSAwO1xuK1x0aWYgKCFBU1NFUlRfRVEobiwgc2l6ZW9mKHRyaWdnZXIpLCBcInRyaWdnZXIgc2VuZHRvXCIpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBTdGVwIDM6IFRoZSBuZXN0ZWQgYnBmX2tzb2NrX3NlbmQoKSBtdXN0IGhpdCB0aGUgcmVjdXJzaW9uIGd1YXJkICovXG4rXHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNfY291bnQsIDIsXG4rXHRcdCAgICAgICBcInNvY2tldF9zZW5kbXNnIHJlY3Vyc2lvbiBjb3VudFwiKSlcbitcdFx0Z290byBmYWlsO1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXJlY19rZnVuY19yZXRzWzBdLCAtRUJVU1ksXG4rXHRcdCAgICAgICBcInJlY3Vyc2l2ZSBzZW5kIHN0YXR1c1wiKSlcbitcdFx0Z290byBmYWlsO1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXJlY19rZnVuY19yZXRzWzFdLFxuK1x0XHQgICAgICAgc2l6ZW9mKHNrZWwtXHUwMDNlZGF0YS1cdTAwM2VzZW5kX2RhdGEpLCBcIm91dGVyIHNlbmQgYnl0ZXNcIikpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdGtzb2NrX2Fzc2VydF9yZWN2KFx1MDAyNmVudiwgc2tlbC1cdTAwM2VkYXRhLVx1MDAzZXNlbmRfZGF0YSxcbitcdFx0XHQgIHNpemVvZihza2VsLVx1MDAzZWRhdGEtXHUwMDNlc2VuZF9kYXRhKSk7XG4rXG4rZmFpbDpcbitcdGlmICh0ZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZSh0ZmQpO1xuK1x0a3NvY2tfdGVzdF9lbnZfY2xlYW51cChcdTAwMjZlbnYpO1xuK1x0a3NvY2tfcmVjdXJzaW9uX19kZXN0cm95KHNrZWwpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rc29ja19xdW90YS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5jODZkOWIwYTk1MTNlOFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfcXVvdGEuY1xuQEAgLTAsMCArMSwxMzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJ0ZXN0X3Byb2dzLmhcIlxuKyNpbmNsdWRlIFwibmV0d29ya19oZWxwZXJzLmhcIlxuKyNpbmNsdWRlIFwic3lzY3RsX2hlbHBlcnMuaFwiXG4rI2luY2x1ZGUgXCJrc29ja19xdW90YS5za2VsLmhcIlxuK1xuKyNkZWZpbmUgTlNfTkVUX1FVT1RBX1RFU1QxIFwia3NvY2tfbmV0X3F1b3RhX25zMVwiXG4rI2RlZmluZSBOU19ORVRfUVVPVEFfVEVTVDIgXCJrc29ja19uZXRfcXVvdGFfbnMyXCJcbisjZGVmaW5lIEtTT0NLX01BWF9TWVNDVEwgXCIvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2tzb2NrX21heFwiXG4rI2RlZmluZSBLU09DS19RVU9UQV9OU19TTE9UUyAzXG4rI2RlZmluZSBLU09DS19RVU9UQV9OUzFfT0ZGU0VUIDBcbisjZGVmaW5lIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQgS1NPQ0tfUVVPVEFfTlNfU0xPVFNcbitcbitzdGF0aWMgaW50IGtzb2NrX3J1bl9wcm9nKHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZylcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQocHJvZyksIFx1MDAyNm9wdHMpO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcdHJldHVybiBvcHRzLnJldHZhbDtcbit9XG4rXG4rc3RhdGljIF9fdTY0IGtzb2NrX3F1b3RhX3JlbGVhc2VfY29tcGxldGVkKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbClcbit7XG4rXHRyZXR1cm4gX19hdG9taWNfbG9hZF9uKFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3JlbGVhc2VfY29tcGxldGVkLFxuK1x0XHRcdCAgICAgICBfX0FUT01JQ19BQ1FVSVJFKTtcbit9XG4rXG4rc3RhdGljIGludCBrc29ja19yZWxlYXNlX3F1b3RhX3Nsb3RzKHN0cnVjdCBrc29ja19xdW90YSAqc2tlbCwgaW50IHNsb3Rfb2Zmc2V0KVxuK3tcbitcdF9fdTY0IGNvbXBsZXRlZDtcbitcdGludCBlcnI7XG4rXG4rXHRjb21wbGV0ZWQgPSBrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKTtcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3Nsb3Rfb2Zmc2V0ID0gc2xvdF9vZmZzZXQ7XG4rXHRlcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLVx1MDAzZXByb2dzLmtzb2NrX3F1b3RhX3JlbGVhc2UpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImtzb2NrX3F1b3RhX3JlbGVhc2VcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHdoaWxlIChrc29ja19xdW90YV9yZWxlYXNlX2NvbXBsZXRlZChza2VsKSAtIGNvbXBsZXRlZCBcdTAwM2NcbitcdCAgICAgICBza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9yZWxlYXNlZClcbitcdFx0dXNsZWVwKDEwMDApO1xuK1xuK1x0cmV0dXJuIHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3JlbGVhc2VkO1xuK31cbitcbitzdGF0aWMgYm9vbCBrc29ja19leHBlY3RfcXVvdGEoc3RydWN0IGtzb2NrX3F1b3RhICpza2VsLCBpbnQgc2xvdF9vZmZzZXQsXG4rXHRcdFx0ICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpXG4re1xuK1x0aW50IGVycjtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXF1b3RhX3Nsb3Rfb2Zmc2V0ID0gc2xvdF9vZmZzZXQ7XG4rXHRlcnIgPSBrc29ja19ydW5fcHJvZyhza2VsLVx1MDAzZXByb2dzLmtzb2NrX3F1b3RhX2NyZWF0ZSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIG5hbWUpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9jcmVhdGVkLCAyLCBuYW1lKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0cmV0dXJuIEFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VxdW90YV9lcnIsIC1FTk9TUEMsIG5hbWUpO1xuK31cbitcbitzdGF0aWMgYm9vbCByZWNvcmRfY3VycmVudF9ucyhzdHJ1Y3Qga3NvY2tfcXVvdGEgKnNrZWwsIGludCB0YXJnZXQpXG4re1xuK1x0c3RydWN0IHN0YXQgc3Q7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gc3RhdChcIi9wcm9jL3NlbGYvbnMvbmV0XCIsIFx1MDAyNnN0KTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzdGF0IG5ldG5zXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0YXJnZXRfbmV0bnNfaW51bVt0YXJnZXRdID0gKF9fdTMyKXN0LnN0X2lubztcbitcdHJldHVybiB0cnVlO1xuK31cbitcbit2b2lkIHNlcmlhbF90ZXN0X2tzb2NrX25ldF9xdW90YSh2b2lkKVxuK3tcbitcdGNoYXIgb2xkX21heFsxNl0gPSB7fTtcbitcdHN0cnVjdCBuZXRuc19vYmogKm5ldG5zMSA9IE5VTEwsICpuZXRuczIgPSBOVUxMO1xuK1x0c3RydWN0IGtzb2NrX3F1b3RhICpza2VsO1xuK1x0aW50IHJlbGVhc2VkO1xuK1xuK1x0c2tlbCA9IGtzb2NrX3F1b3RhX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJrc29jayBxdW90YSBza2VsZXRvblwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZW50ZXIgPVxuK1x0XHRicGZfcHJvZ3JhbV9fYXR0YWNoX3RyYWNlKHNrZWwtXHUwMDNlcHJvZ3Mua3NvY2tfcmVsZWFzZV93b3JrX2VudGVyKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLVx1MDAzZWxpbmtzLmtzb2NrX3JlbGVhc2Vfd29ya19lbnRlcixcbitcdFx0XHQgICBcImF0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZW50cnlcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0c2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCA9XG4rXHRcdGJwZl9wcm9ncmFtX19hdHRhY2hfdHJhY2Uoc2tlbC1cdTAwM2Vwcm9ncy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbC1cdTAwM2VsaW5rcy5rc29ja19yZWxlYXNlX3dvcmtfZXhpdCxcbitcdFx0XHQgICBcImF0dGFjaCBrc29jayByZWxlYXNlIHdvcmsgZXhpdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoc3lzY3RsX3NldF9vcl9mYWlsKEtTT0NLX01BWF9TWVNDVEwsIG9sZF9tYXgsIFwiMlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRuZXRuczEgPSBuZXRuc19uZXcoTlNfTkVUX1FVT1RBX1RFU1QxLCB0cnVlKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihuZXRuczEsIFwiY3JlYXRlIGZpcnN0IG5ldG5zXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghcmVjb3JkX2N1cnJlbnRfbnMoc2tlbCwgMCkpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKCFrc29ja19leHBlY3RfcXVvdGEoc2tlbCwgS1NPQ0tfUVVPVEFfTlMxX09GRlNFVCxcbitcdFx0XHRcdFwiZmlyc3QgbmV0bnMgcXVvdGFcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LyogVGhlIGhvc3Qtd2lkZSBzZXR0aW5nIGdyYW50cyB0aGUgZnVsbCBhbGxvd2FuY2UgdG8gZWFjaCBuZXRucy4gKi9cbitcdG5ldG5zMiA9IG5ldG5zX25ldyhOU19ORVRfUVVPVEFfVEVTVDIsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5ldG5zMiwgXCJjcmVhdGUgc2Vjb25kIG5ldG5zXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghcmVjb3JkX2N1cnJlbnRfbnMoc2tlbCwgMSkpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKCFrc29ja19leHBlY3RfcXVvdGEoc2tlbCwgS1NPQ0tfUVVPVEFfTlMyX09GRlNFVCxcbitcdFx0XHRcdFwic2Vjb25kIG5ldG5zIHF1b3RhXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHJlbGVhc2VkID0ga3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VUKTtcbitcdGlmICghQVNTRVJUX0VRKHJlbGVhc2VkLCAyLCBcInNlY29uZCBuZXRucyBxdW90YSByZWxlYXNlZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBCb3RoIHJlbGVhc2VkIHNsb3RzIG11c3QgYmVjb21lIGF2YWlsYWJsZSBhZ2Fpbi4gKi9cbitcdGtzb2NrX2V4cGVjdF9xdW90YShza2VsLCBLU09DS19RVU9UQV9OUzJfT0ZGU0VULCBcInJlY292ZXJlZCBxdW90YVwiKTtcbitcbitvdXQ6XG4rXHRrc29ja19yZWxlYXNlX3F1b3RhX3Nsb3RzKHNrZWwsIEtTT0NLX1FVT1RBX05TMl9PRkZTRVQpO1xuK1x0a3NvY2tfcmVsZWFzZV9xdW90YV9zbG90cyhza2VsLCBLU09DS19RVU9UQV9OUzFfT0ZGU0VUKTtcbitcdG5ldG5zX2ZyZWUobmV0bnMyKTtcbitcdG5ldG5zX2ZyZWUobmV0bnMxKTtcbitcdGlmIChvbGRfbWF4WzBdKVxuK1x0XHRzeXNjdGxfc2V0X29yX2ZhaWwoS1NPQ0tfTUFYX1NZU0NUTCwgTlVMTCwgb2xkX21heCk7XG4rXHRrc29ja19xdW90YV9fZGVzdHJveShza2VsKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva3NvY2tfd3EuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3dxLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTg0YjEzNGYzODIzNzBcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tzb2NrX3dxLmNcbkBAIC0wLDAgKzEsMzQgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbitcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwidGVzdF9wcm9ncy5oXCJcbisjaW5jbHVkZSBcImtzb2NrX3dxLnNrZWwuaFwiXG4rXG4rdm9pZCB0ZXN0X2tzb2NrX3dxKHZvaWQpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xuK1x0c3RydWN0IGtzb2NrX3dxICpza2VsO1xuK1x0aW50IGVycjtcbitcbitcdHNrZWwgPSBrc29ja193cV9fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwia3NvY2tfd3Egb3BlbiBhbmQgbG9hZFwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5rc29ja193cV9zdGFydCksXG4rXHRcdFx0XHQgICAgIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1biBrc29ja193cV9zdGFydFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9PSyhvcHRzLnJldHZhbCwgXCJrc29ja193cV9zdGFydCByZXR2YWxcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0d2hpbGUgKCFfX2F0b21pY19sb2FkX24oXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNlY2FsbGJhY2tfZG9uZSwgX19BVE9NSUNfQUNRVUlSRSkpXG4rXHRcdHVzbGVlcCgxMDAwKTtcbitcbitcdEFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VjcmVhdGVfZXJyLCAtRU9QTk9UU1VQUCxcbitcdFx0ICBcIndvcmtxdWV1ZSBjcmVhdGUgcmVqZWN0ZWRcIik7XG4rXG4rb3V0OlxuK1x0a3NvY2tfd3FfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2Jhc2ljLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTg5YjBmYzE1NzcwMTFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19iYXNpYy5jXG5AQCAtMCwwICsxLDM3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2VuZGlhbi5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfdHJhY2luZ19uZXQuaFwiXG4rI2luY2x1ZGUgXCJrc29ja19jb21tb24uaFwiXG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBrc29ja19zZXR1cCh2b2lkICpjdHgpXG4re1xuK1x0cmV0dXJuIGRvX2tzb2NrX3NldHVwKCk7XG4rfVxuK1xuK1NFQyhcInN5c2NhbGxcIilcbitpbnQga3NvY2tfc2VuZCh2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlICp2O1xuK1x0c3RydWN0IGJwZl9rc29jayAqa3M7XG4rXHRpbnQgc2VuZCA9IC0xO1xuK1xuK1x0diA9IGtzb2NrX2N0eF92YWx1ZV9sb29rdXAoKTtcbitcdGlmICghdilcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXG4rXHRrcyA9IGJwZl9rcHRyX3hjaGcoXHUwMDI2di1cdTAwM2VjdHgsIE5VTEwpO1xuK1x0aWYgKCFrcylcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXG4rXHRzZW5kID0gYnBmX2tzb2NrX3NlbmQoa3MsIHNlbmRfZGF0YSwgc2l6ZW9mKHNlbmRfZGF0YSkpO1xuK1x0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuK1x0cmV0dXJuIHNlbmQ7XG4rfVxuK1xuK2NoYXIgX19saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2NvbW1vbi5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX2NvbW1vbi5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdjZjY0MzE5YjkwMTQ1XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfY29tbW9uLmhcbkBAIC0wLDAgKzEsMTEwIEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2lmbmRlZiBfS1NPQ0tfQ09NTU9OX0hcbisjZGVmaW5lIF9LU09DS19DT01NT05fSFxuK1xuKyNpbmNsdWRlIFwiZXJybm8uaFwiXG4rI2luY2x1ZGUgXHUwMDNjc3RkYm9vbC5oXHUwMDNlXG4rXG4rI2RlZmluZSBTT0NLX1NUUkVBTVx0MVxuKyNkZWZpbmUgU09DS19ER1JBTVx0MlxuKyNkZWZpbmUgSVBQUk9UT19UQ1BcdDZcbisjZGVmaW5lIElQUFJPVE9fVURQXHQxN1xuK1xuK3N0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19jcmVhdGUoY29uc3Qgc3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyAqb3B0cyxcbitcdFx0XHRcdCAgIHUzMiBvcHRzX19zeiwgaW50ICplcnJfX3VuaW5pdCkgX19rc3ltO1xuK2ludCBicGZfa3NvY2tfYmluZChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcbitcdFx0ICAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsIHUzMiBvcHRzX19zeikgX19rc3ltO1xuK2ludCBicGZfa3NvY2tfY29ubmVjdChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcbitcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJwZl9rc29ja19hZGRyX29wdHMgKm9wdHMsIHUzMiBvcHRzX19zeikgX19rc3ltO1xuK3N0cnVjdCBicGZfa3NvY2sgKmJwZl9rc29ja19hY3F1aXJlKHN0cnVjdCBicGZfa3NvY2sgKmtzKSBfX2tzeW07XG4rdm9pZCBicGZfa3NvY2tfcmVsZWFzZShzdHJ1Y3QgYnBmX2tzb2NrICprcykgX19rc3ltO1xuK2ludCBicGZfa3NvY2tfc2VuZChzdHJ1Y3QgYnBmX2tzb2NrICprcyxcbitcdFx0ICAgY29uc3Qgdm9pZCAqZGF0YSwgdTMyIGRhdGFfX3N6KSBfX2tzeW07XG4rXG4rc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlIHtcbitcdHN0cnVjdCBicGZfa3NvY2sgX19rcHRyICogY3R4O1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X190eXBlKGtleSwgaW50KTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlKTtcbitcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4rfSBfX2tzb2NrX2N0eF9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgX19rc29ja19jdHhfdmFsdWUgKmtzb2NrX2N0eF92YWx1ZV9sb29rdXAodm9pZClcbit7XG4rXHR1MzIga2V5ID0gMDtcbitcbitcdHJldHVybiBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNl9fa3NvY2tfY3R4X21hcCwgXHUwMDI2a2V5KTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQga3NvY2tfY3R4X2luc2VydChzdHJ1Y3QgYnBmX2tzb2NrICpjdHgpXG4re1xuK1x0c3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlIGxvY2FsLCAqdjtcbitcdHN0cnVjdCBicGZfa3NvY2sgKm9sZDtcbitcdHUzMiBrZXkgPSAwO1xuK1x0aW50IGVycjtcbitcbitcdGxvY2FsLmN0eCA9IE5VTEw7XG4rXHRlcnIgPSBicGZfbWFwX3VwZGF0ZV9lbGVtKFx1MDAyNl9fa3NvY2tfY3R4X21hcCwgXHUwMDI2a2V5LCBcdTAwMjZsb2NhbCwgMCk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdGJwZl9rc29ja19yZWxlYXNlKGN0eCk7XG4rXHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHR2ID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZfX2tzb2NrX2N0eF9tYXAsIFx1MDAyNmtleSk7XG4rXHRpZiAoIXYpIHtcbitcdFx0YnBmX2tzb2NrX3JlbGVhc2UoY3R4KTtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4rXG4rXHRvbGQgPSBicGZfa3B0cl94Y2hnKFx1MDAyNnYtXHUwMDNlY3R4LCBjdHgpO1xuK1x0aWYgKG9sZCkge1xuK1x0XHRicGZfa3NvY2tfcmVsZWFzZShvbGQpO1xuK1x0XHRyZXR1cm4gLUVFWElTVDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKiBHbG9iYWxzIGZvciBwYXNzaW5nIGNvbmZpZyBmcm9tIHVzZXJzcGFjZSAqL1xuK19fYmUzMiBpcHY0X3JlbW90ZTtcbitfX3UxNiByZW1vdGVfcG9ydDtcbitcbitjaGFyIHNlbmRfZGF0YVszMl0gPSBcImhlbGxvIGZyb20gYnBmIGtzb2NrXCI7XG4rXG4rc3RhdGljIGlubGluZSBpbnQgZG9fa3NvY2tfc2V0dXAodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIGNyZWF0ZV9vcHRzID0ge307XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX2FkZHJfb3B0cyBhZGRyX29wdHMgPSB7fTtcbitcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xuK1x0aW50IGVyciA9IDA7XG4rXG4rXHRjcmVhdGVfb3B0cy5mYW1pbHkgPSBBRl9JTkVUO1xuK1x0Y3JlYXRlX29wdHMudHlwZSA9IFNPQ0tfREdSQU07XG4rXHRjcmVhdGVfb3B0cy5wcm90b2NvbCA9IElQUFJPVE9fVURQO1xuK1xuK1x0a3MgPSBicGZfa3NvY2tfY3JlYXRlKFx1MDAyNmNyZWF0ZV9vcHRzLCBzaXplb2YoY3JlYXRlX29wdHMpLCBcdTAwMjZlcnIpO1xuK1x0aWYgKCFrcylcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdGFkZHJfb3B0cy5mYW1pbHkgPSBBRl9JTkVUO1xuK1x0YWRkcl9vcHRzLnBvcnQgPSByZW1vdGVfcG9ydDtcbitcdGFkZHJfb3B0cy5pcHY0X2FkZHIgPSBpcHY0X3JlbW90ZTtcbitcbitcdGVyciA9IGJwZl9rc29ja19jb25uZWN0KGtzLCBcdTAwMjZhZGRyX29wdHMsIHNpemVvZihhZGRyX29wdHMpKTtcbitcdGlmIChlcnIpIHtcbitcdFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuK1x0XHRyZXR1cm4gZXJyO1xuK1x0fVxuK1xuK1x0ZXJyID0ga3NvY2tfY3R4X2luc2VydChrcyk7XG4rXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gLUVFWElTVClcbitcdFx0cmV0dXJuIGVycjtcbitcdHJldHVybiAwO1xuK31cbitcbisjZW5kaWYgLyogX0tTT0NLX0NPTU1PTl9IICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3F1b3RhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcXVvdGEuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi45MTg1NGVhMzMzYzEyMVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3F1b3RhLmNcbkBAIC0wLDAgKzEsMTY3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfdHJhY2luZ19uZXQuaFwiXG4rI2luY2x1ZGUgXCJrc29ja19jb21tb24uaFwiXG4rXG4rI2RlZmluZSBLU09DS19RVU9UQV9OU19TTE9UUyAzXG4rI2RlZmluZSBLU09DS19RVU9UQV9ORVROUyAyXG4rI2RlZmluZSBLU09DS19RVU9UQV9TTE9UUyAoS1NPQ0tfUVVPVEFfTlNfU0xPVFMgKiBLU09DS19RVU9UQV9ORVROUylcbitcbitzdHJ1Y3Qga3NvY2tfcXVvdGFfdmFsdWUge1xuK1x0c3RydWN0IGJwZl9rc29jayBfX2twdHIgKiBjdHg7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3R5cGUoa2V5LCB1MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qga3NvY2tfcXVvdGFfdmFsdWUpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCBLU09DS19RVU9UQV9TTE9UUyk7XG4rfSBxdW90YV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XG4rXHRfX3R5cGUoa2V5LCB1NjQpO1xuK1x0X190eXBlKHZhbHVlLCB1OCk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIEtTT0NLX1FVT1RBX1NMT1RTKTtcbit9IHJlbGVhc2Vfd29ya2VycyBTRUMoXCIubWFwc1wiKTtcbitcbit1MzIgcXVvdGFfY3JlYXRlZDtcbit1MzIgcXVvdGFfcmVsZWFzZWQ7XG4rdTMyIHF1b3RhX3Nsb3Rfb2Zmc2V0O1xuK3UzMiB0YXJnZXRfbmV0bnNfaW51bVtLU09DS19RVU9UQV9ORVROU107XG4rdTY0IHF1b3RhX3JlbGVhc2VfY29tcGxldGVkO1xuK2ludCBxdW90YV9lcnI7XG4rXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sXG4ra3NvY2tfcXVvdGFfY3JlYXRlX29uZSh1MzIgaSxcbitcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfa3NvY2tfY3JlYXRlX29wdHMgKmNyZWF0ZV9vcHRzKVxuK3tcbitcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcbitcdHN0cnVjdCBicGZfa3NvY2sgKmtzLCAqb2xkO1xuK1x0aW50IGVyciA9IDA7XG4rXG4rXHRpICs9IHF1b3RhX3Nsb3Rfb2Zmc2V0O1xuK1x0aWYgKGkgXHUwMDNlPSBLU09DS19RVU9UQV9TTE9UUykge1xuK1x0XHRxdW90YV9lcnIgPSAtRVJBTkdFO1xuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcdH1cbitcbitcdGJhcnJpZXJfdmFyKGVycik7XG4rXHRrcyA9IGJwZl9rc29ja19jcmVhdGUoY3JlYXRlX29wdHMsIHNpemVvZigqY3JlYXRlX29wdHMpLCBcdTAwMjZlcnIpO1xuK1x0aWYgKCFrcykge1xuK1x0XHRxdW90YV9lcnIgPSBlcnI7XG4rXHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1xuK1x0diA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cXVvdGFfbWFwLCBcdTAwMjZpKTtcbitcdGlmICghdikge1xuK1x0XHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4rXHRcdHF1b3RhX2VyciA9IC1FTk9FTlQ7XG4rXHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1xuK1x0b2xkID0gYnBmX2twdHJfeGNoZyhcdTAwMjZ2LVx1MDAzZWN0eCwga3MpO1xuK1x0aWYgKG9sZClcbitcdFx0YnBmX2tzb2NrX3JlbGVhc2Uob2xkKTtcbitcdHF1b3RhX2NyZWF0ZWQrKztcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKHUzMiBpKVxuK3tcbitcdHN0cnVjdCBrc29ja19xdW90YV92YWx1ZSAqdjtcbitcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xuK1xuK1x0aSArPSBxdW90YV9zbG90X29mZnNldDtcbitcdGlmIChpIFx1MDAzZT0gS1NPQ0tfUVVPVEFfU0xPVFMpXG4rXHRcdHJldHVybjtcbitcbitcdHYgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNnF1b3RhX21hcCwgXHUwMDI2aSk7XG4rXHRpZiAoIXYpXG4rXHRcdHJldHVybjtcbitcbitcdGtzID0gYnBmX2twdHJfeGNoZyhcdTAwMjZ2LVx1MDAzZWN0eCwgTlVMTCk7XG4rXHRpZiAoa3MpIHtcbitcdFx0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuK1x0XHRxdW90YV9yZWxlYXNlZCsrO1xuK1x0fVxuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IGtzb2NrX3F1b3RhX2NyZWF0ZSh2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9rc29ja19jcmVhdGVfb3B0cyBjcmVhdGVfb3B0cyA9IHt9O1xuK1xuK1x0Y3JlYXRlX29wdHMuZmFtaWx5ID0gQUZfSU5FVDtcbitcdGNyZWF0ZV9vcHRzLnR5cGUgPSBTT0NLX0RHUkFNO1xuK1x0Y3JlYXRlX29wdHMucHJvdG9jb2wgPSBJUFBST1RPX1VEUDtcbitcdHF1b3RhX2NyZWF0ZWQgPSAwO1xuK1x0cXVvdGFfZXJyID0gMDtcbitcbitcdGlmIChrc29ja19xdW90YV9jcmVhdGVfb25lKDAsIFx1MDAyNmNyZWF0ZV9vcHRzKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRpZiAoa3NvY2tfcXVvdGFfY3JlYXRlX29uZSgxLCBcdTAwMjZjcmVhdGVfb3B0cykpXG4rXHRcdHJldHVybiAwO1xuK1x0a3NvY2tfcXVvdGFfY3JlYXRlX29uZSgyLCBcdTAwMjZjcmVhdGVfb3B0cyk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBrc29ja19xdW90YV9yZWxlYXNlKHZvaWQgKmN0eClcbit7XG4rXHRxdW90YV9yZWxlYXNlZCA9IDA7XG4rXHRrc29ja19xdW90YV9yZWxlYXNlX29uZSgwKTtcbitcdGtzb2NrX3F1b3RhX3JlbGVhc2Vfb25lKDEpO1xuK1x0a3NvY2tfcXVvdGFfcmVsZWFzZV9vbmUoMik7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwiZmVudHJ5L2tzb2NrX3JlbGVhc2Vfd29ya19mblwiKVxuK2ludCBCUEZfUFJPRyhrc29ja19yZWxlYXNlX3dvcmtfZW50ZXIsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3QgcmN1X3dvcmsgKnJ3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByY3Vfd29yaywgd29yayk7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrICprcyA9IGNvbnRhaW5lcl9vZihyd29yaywgc3RydWN0IGJwZl9rc29jaywgcndvcmspO1xuK1x0dTY0IHBpZF90Z2lkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCk7XG4rXHRzdHJ1Y3QgbmV0ICpuZXQ7XG4rXHR1MzIgaW51bTtcbitcdHU4IHRyYWNrZWQgPSAxO1xuK1xuK1x0Lyoga3NvY2tfcmVsZWFzZV93b3JrX2ZuKCkgZnJlZXMga3MgYmVmb3JlIHRoZSBmZXhpdCBwcm9ncmFtIHJ1bnMuICovXG4rXHRuZXQgPSBCUEZfQ09SRV9SRUFEKGtzLCBzb2NrLCBzaywgX19za19jb21tb24uc2tjX25ldC5uZXQpO1xuK1x0aWYgKCFuZXQpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0aW51bSA9IEJQRl9DT1JFX1JFQUQobmV0LCBucy5pbnVtKTtcbitcdGlmIChpbnVtICE9IHRhcmdldF9uZXRuc19pbnVtWzBdIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGludW0gIT0gdGFyZ2V0X25ldG5zX2ludW1bMV0pXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0YnBmX21hcF91cGRhdGVfZWxlbShcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFx1MDAyNnBpZF90Z2lkLCBcdTAwMjZ0cmFja2VkLCBCUEZfQU5ZKTtcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJmZXhpdC9rc29ja19yZWxlYXNlX3dvcmtfZm5cIilcbitpbnQgQlBGX1BST0coa3NvY2tfcmVsZWFzZV93b3JrX2V4aXQsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHR1NjQgcGlkX3RnaWQgPSBicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQoKTtcbitcdHU4ICp0cmFja2VkO1xuK1xuK1x0dHJhY2tlZCA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2cmVsZWFzZV93b3JrZXJzLCBcdTAwMjZwaWRfdGdpZCk7XG4rXHRpZiAoIXRyYWNrZWQpXG4rXHRcdHJldHVybiAwO1xuK1x0YnBmX21hcF9kZWxldGVfZWxlbShcdTAwMjZyZWxlYXNlX3dvcmtlcnMsIFx1MDAyNnBpZF90Z2lkKTtcbitcbitcdC8qIFRoZSB3b3JrZXIgaGFzIHJlbGVhc2VkIHRoZSBzb2NrZXQgYW5kIHJldHVybmVkIGl0cyBxdW90YSBjaGFyZ2UuICovXG4rXHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcdTAwMjZxdW90YV9yZWxlYXNlX2NvbXBsZXRlZCwgMSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rY2hhciBfX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mva3NvY2tfcmVjdXJzaW9uLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uNTJmNTIwMDk0M2UzNmFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja19yZWN1cnNpb24uY1xuQEAgLTAsMCArMSw2OSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuK1xuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9lbmRpYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmX3RyYWNpbmdfbmV0LmhcIlxuKyNpbmNsdWRlIFwia3NvY2tfY29tbW9uLmhcIlxuK1xuK3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltO1xuK3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07XG4rXG4raW50IHRhcmdldF9waWQ7XG4raW50IHRyaWdnZXJfc2VuZDtcbitcbit1bnNpZ25lZCBpbnQgcmVjX2NvdW50O1xuK2ludCByZWNfa2Z1bmNfcmV0c1tdID0geyAtMSwgLTEgfTtcbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IGtzb2NrX3NldHVwKHZvaWQgKmN0eClcbit7XG4rXHRyZXR1cm4gZG9fa3NvY2tfc2V0dXAoKTtcbit9XG4rXG4rU0VDKFwibHNtLnMvc29ja2V0X3NlbmRtc2dcIilcbitpbnQgQlBGX1BST0coa3NvY2tfc29ja2V0X3NlbmRtc2csIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcbitcdCAgICAgaW50IHNpemUsIGludCByZXQpXG4re1xuK1x0c3RydWN0IF9fa3NvY2tfY3R4X3ZhbHVlICp2O1xuK1x0c3RydWN0IGJwZl9rc29jayAqa3MsICp0bXA7XG4rXHR1MzIgcGlkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCkgXHUwMDNlXHUwMDNlIDMyO1xuK1x0aW50IGtmdW5jX3JldDtcbitcbitcdGlmIChyZXQgfHwgIXRyaWdnZXJfc2VuZCB8fCBwaWQgIT0gdGFyZ2V0X3BpZClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHYgPSBrc29ja19jdHhfdmFsdWVfbG9va3VwKCk7XG4rXHRpZiAoIXYpIHtcbitcdFx0a2Z1bmNfcmV0ID0gLUVOT0VOVDtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRrcyA9IE5VTEw7XG4rXHRicGZfcmN1X3JlYWRfbG9jaygpO1xuK1x0dG1wID0gdi1cdTAwM2VjdHg7XG4rXHRpZiAodG1wKVxuK1x0XHRrcyA9IGJwZl9rc29ja19hY3F1aXJlKHRtcCk7XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rXG4rXHRpZiAoIWtzKSB7XG4rXHRcdGtmdW5jX3JldCA9IC1FTk9FTlQ7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0a2Z1bmNfcmV0ID0gYnBmX2tzb2NrX3NlbmQoa3MsIHNlbmRfZGF0YSwgc2l6ZW9mKHNlbmRfZGF0YSkpO1xuK1x0YnBmX2tzb2NrX3JlbGVhc2Uoa3MpO1xuK1xuK291dDpcbitcdHJlY19rZnVuY19yZXRzW3JlY19jb3VudCBcdTAwMjYgMV0gPSBrZnVuY19yZXQ7XG4rXHRfX3N5bmNfZmV0Y2hfYW5kX2FkZChcdTAwMjZyZWNfY291bnQsIDEpO1xuK1xuK1x0aWYgKGtmdW5jX3JldCAhPSAtRUJVU1kpXG4rXHRcdHRyaWdnZXJfc2VuZCA9IDA7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitjaGFyIF9fbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2tzb2NrX3dxLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMTZhMTg3M2QxMzJlZGVcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9rc29ja193cS5jXG5AQCAtMCwwICsxLDYyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4rXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFwiYnBmX3RyYWNpbmdfbmV0LmhcIlxuKyNpbmNsdWRlIFwiZXJybm8uaFwiXG4rI2luY2x1ZGUgXCJrc29ja19jb21tb24uaFwiXG4rXG4rc3RydWN0IGtzb2NrX3dxX3ZhbHVlIHtcbitcdHN0cnVjdCBicGZfd3Egd29yaztcbit9O1xuK1xuK3N0cnVjdCB7XG4rXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbitcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4rXHRfX3R5cGUoa2V5LCB1MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qga3NvY2tfd3FfdmFsdWUpO1xuK30gd29ya19tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4raW50IGNyZWF0ZV9lcnI7XG4rdTMyIGNhbGxiYWNrX2RvbmU7XG4rXG4rc3RhdGljIGludCBrc29ja193cV9jYWxsYmFjayh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbit7XG4rXHRzdHJ1Y3QgYnBmX2tzb2NrX2NyZWF0ZV9vcHRzIG9wdHMgPSB7XG4rXHRcdC5mYW1pbHkgPSBBRl9JTkVULFxuK1x0XHQudHlwZSA9IFNPQ0tfREdSQU0sXG4rXHRcdC5wcm90b2NvbCA9IElQUFJPVE9fVURQLFxuK1x0fTtcbitcdHN0cnVjdCBicGZfa3NvY2sgKmtzO1xuK1x0aW50IGVyciA9IDA7XG4rXG4rXHRrcyA9IGJwZl9rc29ja19jcmVhdGUoXHUwMDI2b3B0cywgc2l6ZW9mKG9wdHMpLCBcdTAwMjZlcnIpO1xuK1x0aWYgKGtzKVxuK1x0XHRicGZfa3NvY2tfcmVsZWFzZShrcyk7XG4rXHRjcmVhdGVfZXJyID0gZXJyO1xuK1x0X19zeW5jX2ZldGNoX2FuZF9hZGQoXHUwMDI2Y2FsbGJhY2tfZG9uZSwgMSk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBrc29ja193cV9zdGFydCh2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0IGtzb2NrX3dxX3ZhbHVlICp2YWx1ZTtcbitcdHUzMiBrZXkgPSAwO1xuK1x0aW50IGVycjtcbitcbitcdHZhbHVlID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3b3JrX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghdmFsdWUpXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1x0ZXJyID0gYnBmX3dxX2luaXQoXHUwMDI2dmFsdWUtXHUwMDNld29yaywgXHUwMDI2d29ya19tYXAsIDApO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcdGVyciA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2dmFsdWUtXHUwMDNld29yaywga3NvY2tfd3FfY2FsbGJhY2ssIDApO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcdHJldHVybiBicGZfd3Ffc3RhcnQoXHUwMDI2dmFsdWUtXHUwMDNld29yaywgMCk7XG4rfVxuK1xuK2NoYXIgX19saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQxMjo1ODo1NS45OTUyNDA3NDFaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTczMDcyMDIxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE5ldyBgYnBmX2tzb2NrYCBGZWF0dXJlIGZvciBGdXp6aW5nKipcblxuT2theSwgc28gd2UndmUgZ290IHRoaXMgbmV3IHBhdGNoIGludHJvZHVjaW5nIGBicGZfa3NvY2tgLCB3aGljaCBsZXRzIEJQRiBwcm9ncmFtcyBjcmVhdGUsIGJpbmQsIGNvbm5lY3QsIGFuZCBzZW5kIGRhdGEgdGhyb3VnaCBrZXJuZWwgc29ja2V0cy4gVGhhdCdzIGRlZmluaXRlbHkgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSB0aGUgQlBGIHN1YnN5c3RlbSBhbmQgbmV0d29ya2luZywgc2NyZWFtaW5nIGZvciBmdXp6aW5nLiBMZXQncyBkaWcgaW50byB0aGUgZGlmZiB0byBpZGVudGlmeSB0aGUga2V5IHN5bWJvbHMgYW5kIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLlxuXG5GaXJzdCwgbGV0J3MgbG9vayBhdCB0aGUgY29uZmlncy4gVGhlIGBuZXQvY29yZS9NYWtlZmlsZWAgYWRkcyBgYnBmX2tzb2NrLm9gIHVuZGVyIHRoZSBjb25kaXRpb25zOiBgaWZuZXEgKCQoQ09ORklHX0lORVQpLClgIGFuZCBgb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBicGZfa3NvY2sub2AuIFNvLCB3ZSAqZGVmaW5pdGVseSogbmVlZCBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19JTkVUYCB0byBiZSBlbmFibGVkLlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRob3NlIGZvY3VzIHN5bWJvbHMuIExvb2tpbmcgYXQgYG5ldC9jb3JlL2JwZl9rc29jay5jYCwgd2Ugc2VlIHRoZSBuZXcgZnVuY3Rpb25zIGFyZTogYGJwZl9rc29ja19jcmVhdGVgLCBgYnBmX2tzb2NrX2JpbmRgLCBgYnBmX2tzb2NrX2Nvbm5lY3RgLCBgYnBmX2tzb2NrX2FjcXVpcmVgLCBgYnBmX2tzb2NrX3JlbGVhc2VgLCBgYnBmX2tzb2NrX3JlbGVhc2VfZHRvcmAsIGFuZCBgYnBmX2tzb2NrX3NlbmRgLiBUaGVzZSBhcmUgZXhwb3NlZCBhcyBCUEYga2Z1bmNzLCBzbyBmdXp6aW5nIHRoZW0gaXMgaGlnaCBwcmlvcml0eS4gVGhlcmUgYXJlIGEgZmV3IHN1cHBvcnRpbmcgZnVuY3Rpb25zIGFzIHdlbGwsIGxldCdzIGtlZXAgdHJhY2sgb2YgdGhvc2UgaW4gY2FzZSB0aGV5J3JlIHJlbGV2YW50OiBgYnBmX2tzb2NrX25ldF90cnlfY2hhcmdlYCwgYGJwZl9rc29ja19uZXRfdW5jaGFyZ2VgLCBga3NvY2tfcmVsZWFzZV93b3JrX2ZuYCwgYGJwZl9rc29ja19nZXRfYWRkcmAsIGBicGZfa3NvY2tfaGFzX3VzZXJfdGFza19jb250ZXh0YCwgYGJwZl9rc29ja19zZW5kX2VudGVyYCwgYW5kIGBicGZfa3NvY2tfc2VuZF9leGl0YC4gQnV0IHRoZSBtYWluIGVudHJ5IHBvaW50cyBmb3IgZnV6emluZyBhcmUgZGVmaW5pdGVseSB0aG9zZSBrZnVuY3MuXG5cbkRvdWJsZS1jaGVja2luZyBjb25maWdzLCB3ZSd2ZSBnb3QgYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kIGBDT05GSUdfSU5FVGAgYXMgdGhlIGJpZyBvbmVzLiBBbmQgZ2xhbmNpbmcgYXQgYGJwZl9rc29ja19nZXRfYWRkcmAsIEkgc2VlIGBDT05GSUdfSVBWNmAgaXMgYWxzbyB1c2VkLlxuXG5Pa2F5LCBsZXQncyByZWZpbmUgdGhhdCBmb2N1cyBzeW1ib2wgbGlzdC4gSXQgc2VlbXMgbGlrZSB0aGUgY29yZSBvbmVzIGFyZTogYGJwZl9rc29ja19jcmVhdGVgLCBgYnBmX2tzb2NrX2JpbmRgLCBgYnBmX2tzb2NrX2Nvbm5lY3RgLCBgYnBmX2tzb2NrX3NlbmRgLCBgYnBmX2tzb2NrX2FjcXVpcmVgLCBhbmQgYGJwZl9rc29ja19yZWxlYXNlYC4gQW5kIGBicGZfa3NvY2tfcmVsZWFzZV9kdG9yYCBhbmQgYGJwZl9rc29ja19nZXRfYWRkcmAgc2VlbSBpbXBvcnRhbnQgdG9vLiBJIG1pZ2h0IG5lZWQgdG8gY29uc2lkZXIgYGtzb2NrX3JlbGVhc2Vfd29ya19mbmAgbGF0ZXIsIGFzIGl0IGlzIGEga2VybmVsIHdvcmtxdWV1ZSwgd2hpY2ggdGVuZHMgdG8gYmUgaW50ZXJlc3RpbmcgZnJvbSBhIGZ1enppbmcgcGVyc3BlY3RpdmUuXG5cbkxldCdzIHF1aWNrbHkgY2hlY2sgYG5ldC9zb2NrZXQuY2AgdG8gc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRoZXJlLiBZZXAsIHdlJ3ZlIGdvdCBgX19zeXNfY29ubmVjdF9zb2NrZXRgIGJlaW5nIHVzZWQuIFRoYXQncyBhIG5ldyBmdW5jdGlvbiwgc28gbGV0J3MgYWRkIHRoYXQgdG8gdGhlIGZvY3VzIHN5bWJvbHMuXG5cbkZpbmFsIHJlZmluZWQgbGlzdDogYGJwZl9rc29ja19jcmVhdGVgLCBgYnBmX2tzb2NrX2JpbmRgLCBgYnBmX2tzb2NrX2Nvbm5lY3RgLCBgYnBmX2tzb2NrX3NlbmRgLCBgYnBmX2tzb2NrX2FjcXVpcmVgLCBgYnBmX2tzb2NrX3JlbGVhc2VgLCBhbmQgYF9fc3lzX2Nvbm5lY3Rfc29ja2V0YC5cblxuUmlnaHQsIGxldCdzIHZlcmlmeSB0aGUgY29uZmlnczogYENPTkZJR19CUEZfU1lTQ0FMTGAsIGBDT05GSUdfSU5FVGAsIGBDT05GSUdfSVBWNmAuXG5cbk5vdywgdGhlIGluc3RydWN0aW9ucyBzYXkgdG8gYXZvaWQgbGlzdGluZyBnZW5lcmljIGNvbmZpZ3MgYW5kIG9ubHkgbGlzdCB0aG9zZSBzcGVjaWZpYyB0byB0aGUgbW9kaWZpZWQgY29kZS4gVGhleSBhbHNvIHdhbnQgdXMgdG8gZHJvcCB0aGUgYENPTkZJR19gIHByZWZpeC4gYEJQRl9TWVNDQUxMYCwgYElORVRgLCBhbmQgYElQVjZgIGFyZSBraW5kYSBnZW5lcmljLCBidXQgdGhleSBhcmUgKnNwZWNpZmljYWxseSogcmVxdWlyZWQgaGVyZS4gU28sIGxvb2tpbmcgYXQgdGhlIE1ha2VmaWxlLCBgQlBGX1NZU0NBTExgIGFuZCBgSU5FVGAgYXJlIHRoZSBleGFjdCBjb25kaXRpb25zLiBTbyB0aG9zZSBhcmUgdGhlIG9uZXMgdG8gaW5jbHVkZS5cblxuU28sIGZ1enppbmcgdGhlc2Uga2Z1bmNzIGlzIGNyaXRpY2FsLCBhcyB0aGV5J3JlIGRpcmVjdGx5IGludGVyZmFjaW5nIEJQRiB3aXRoIHRoZSBuZXR3b3JraW5nIHN0YWNrLiBUaGV5IG5lZWQgdG8gYmUgcmlnb3JvdXNseSB0ZXN0ZWQgZm9yIG1lbW9yeSBzYWZldHkgYW5kIGNvcnJlY3Qgb3BlcmF0aW9uLlxuXG5MZXQncyBmb3JtYXQgdGhhdCB0b29sIGNhbGwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMzI1LCJPdXRwdXRUb2tlbnMiOjIxNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExODIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQxMjo1OToxMS43MjU5NjMwNDRaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgzMTk0ODYzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiSU5FVFwiLFxuICAgIFwiSVBWNlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9rc29ja19jcmVhdGVcIixcbiAgICBcImJwZl9rc29ja19iaW5kXCIsXG4gICAgXCJicGZfa3NvY2tfY29ubmVjdFwiLFxuICAgIFwiYnBmX2tzb2NrX3NlbmRcIixcbiAgICBcImJwZl9rc29ja19hY3F1aXJlXCIsXG4gICAgXCJicGZfa3NvY2tfcmVsZWFzZVwiLFxuICAgIFwiX19zeXNfY29ubmVjdF9zb2NrZXRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiSU5FVFwiLFxuICAgIFwiSVBWNlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9rc29ja19jcmVhdGVcIixcbiAgICBcImJwZl9rc29ja19iaW5kXCIsXG4gICAgXCJicGZfa3NvY2tfY29ubmVjdFwiLFxuICAgIFwiYnBmX2tzb2NrX3NlbmRcIixcbiAgICBcImJwZl9rc29ja19hY3F1aXJlXCIsXG4gICAgXCJicGZfa3NvY2tfcmVsZWFzZVwiLFxuICAgIFwiX19zeXNfY29ubmVjdF9zb2NrZXRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBmZWF0dXJlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcga2VybmVsIHNvY2tldHMgKGBicGZfa3NvY2tgKS4gVGhpcyBhZGRzIG5ldyBCUEYga2Z1bmNzIChgYnBmX2tzb2NrX2NyZWF0ZWAsIGBicGZfa3NvY2tfYmluZGAsIGBicGZfa3NvY2tfY29ubmVjdGAsIGBicGZfa3NvY2tfc2VuZGAsIGV0Yy4pIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGludGVyYWN0IHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBzdGFjay4gRnV6emluZyB0aGVzZSBrZnVuY3MgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSBtZW1vcnkgc2FmZXR5IGFuZCBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBuZXcgZmVhdHVyZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowgr58t[1] Phase: Succeeded StartedAt: 2026-07-06 12:59:24 +0000 UTC FinishedAt: 2026-07-06 12:59:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-06 12:59:25 +0000 UTC FinishedAt: 2026-07-06 12:59:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2] Phase: Succeeded StartedAt: 2026-07-06 12:59:25 +0000 UTC FinishedAt: 2026-07-06 17:08:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-06 12:59:25 +0000 UTC FinishedAt: 2026-07-06 17:08:58 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-06 12:59:25 +0000 UTC FinishedAt: 2026-07-06 12:59:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-06 12:59:25 +0000 UTC FinishedAt: 2026-07-06 12:59:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},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-workflowgr58t/series-workflowgr58t-convert-artifact-1654473526/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-06 12:59:38 +0000 UTC FinishedAt: 2026-07-06 13:26:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-06 12:59:39 +0000 UTC FinishedAt: 2026-07-06 13:26:57 +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:*5d10ef0d-3d3d-4114-9f50-2635b9a00b0e,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-workflowgr58t/series-workflowgr58t-convert-artifact-1654473526/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": "e514d2a6-5a1a-4929-8101-8beb524c1236", "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-workflowgr58t/series-workflowgr58t-build-action-1575905868/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-06 12:59:39 +0000 UTC FinishedAt: 2026-07-06 13:26:47 +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:*5d10ef0d-3d3d-4114-9f50-2635b9a00b0e,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-workflowgr58t/series-workflowgr58t-convert-artifact-1654473526/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": "e514d2a6-5a1a-4929-8101-8beb524c1236", "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-workflowgr58t/series-workflowgr58t-build-action-1575905868/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-06 13:26:57 +0000 UTC FinishedAt: 2026-07-06 13:26:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-06 13:26:57 +0000 UTC FinishedAt: 2026-07-06 13:26:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-06 13:26:57 +0000 UTC FinishedAt: 2026-07-06 13:27:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-06 13:26:57 +0000 UTC FinishedAt: 2026-07-06 13:27:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},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-workflowgr58t/series-workflowgr58t-convert-artifact-87016393/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-06 13:27:17 +0000 UTC FinishedAt: 2026-07-06 13:29:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-06 13:27:17 +0000 UTC FinishedAt: 2026-07-06 13:29:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*e514d2a6-5a1a-4929-8101-8beb524c1236,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-workflowgr58t/series-workflowgr58t-build-action-1575905868/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-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-06 13:29:22 +0000 UTC FinishedAt: 2026-07-06 13:29:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-06 13:29:22 +0000 UTC FinishedAt: 2026-07-06 13:29:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-06 13:29:22 +0000 UTC FinishedAt: 2026-07-06 14:04:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-06 13:29:22 +0000 UTC FinishedAt: 2026-07-06 14:04:14 +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:*5d10ef0d-3d3d-4114-9f50-2635b9a00b0e,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-workflowgr58t/series-workflowgr58t-convert-artifact-87016393/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": "f64465bc-806b-4aeb-8d80-079ec466eb8a", "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-workflowgr58t/series-workflowgr58t-build-action-1999983269/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-06 13:29:22 +0000 UTC FinishedAt: 2026-07-06 14:03:24 +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:*5d10ef0d-3d3d-4114-9f50-2635b9a00b0e,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-workflowgr58t/series-workflowgr58t-convert-artifact-87016393/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": "f64465bc-806b-4aeb-8d80-079ec466eb8a", "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-workflowgr58t/series-workflowgr58t-build-action-1999983269/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-06 14:04:14 +0000 UTC FinishedAt: 2026-07-06 14:04:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-06 14:04:14 +0000 UTC FinishedAt: 2026-07-06 14:04:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-06 14:04:14 +0000 UTC FinishedAt: 2026-07-06 14:06:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-06 14:04:14 +0000 UTC FinishedAt: 2026-07-06 14:06:12 +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:*f64465bc-806b-4aeb-8d80-079ec466eb8a,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-workflowgr58t/series-workflowgr58t-build-action-1999983269/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-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-06 14:06:28 +0000 UTC FinishedAt: 2026-07-06 17:08:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-06 14:06:28 +0000 UTC FinishedAt: 2026-07-06 17:08:58 +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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},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:*e514d2a6-5a1a-4929-8101-8beb524c1236,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*f64465bc-806b-4aeb-8d80-079ec466eb8a,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-workflowgr58t/series-workflowgr58t-build-action-1575905868/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-workflowgr58t/series-workflowgr58t-build-action-1999983269/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-06 14:06:28 +0000 UTC FinishedAt: 2026-07-06 14:07:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-06 14:06:28 +0000 UTC FinishedAt: 2026-07-06 14:07:18 +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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},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-workflowgr58t/series-workflowgr58t-convert-artifact-820173342/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-06 14:06:28 +0000 UTC FinishedAt: 2026-07-06 14:06:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-06 14:06:28 +0000 UTC FinishedAt: 2026-07-06 14:06:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-06 14:06:28 +0000 UTC FinishedAt: 2026-07-06 14:06:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-06 14:07:31 +0000 UTC FinishedAt: 2026-07-06 17:08:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgr58t[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["bpf","net"],"focus_symbols":["bpf_ksock_create","bpf_ksock_bind","bpf_ksock_connect","bpf_ksock_send","bpf_ksock_acquire","bpf_ksock_release","__sys_connect_socket"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"bb4e90e91ba19b598cbdd9a2161b893b86a3f637","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","INET","IPV6"],"series_id":"3eacd087-8dee-4e0e-8e6c-b3c9edba36e1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-06 14:07:31 +0000 UTC FinishedAt: 2026-07-06 17:08:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*e514d2a6-5a1a-4929-8101-8beb524c1236,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*f64465bc-806b-4aeb-8d80-079ec466eb8a,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-workflowgr58t/series-workflowgr58t-build-action-1575905868/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-workflowgr58t/series-workflowgr58t-build-action-1999983269/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-workflowgr58t/series-workflowgr58t-convert-artifact-820173342/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,}