Name: series-workflow7lp9l Phase: Succeeded StartedAt: 2026-09-06 15:19:44 +0000 UTC FinishedAt: 2026-09-06 19:06:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[0] Phase: Succeeded StartedAt: 2026-09-06 15:19:44 +0000 UTC FinishedAt: 2026-09-06 15:22:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[0].run-triage Phase: Succeeded StartedAt: 2026-09-06 15:19:44 +0000 UTC FinishedAt: 2026-09-06 15:22:59 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "641d03105cc0d2437e32fdeec164f91a4ccef6c4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IPV6", "IPV6_MROUTE", "IPV6_MROUTE_MULTIPLE_TABLES" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "641d03105cc0d2437e32fdeec164f91a4ccef6c4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IPV6", "IPV6_MROUTE", "IPV6_MROUTE_MULTIPLE_TABLES" ], "series_id": "aaa7c65c-7234-4ec7-83fb-134e1137c61c" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "ip6_mroute_setsockopt", "ip6_mroute_getsockopt", "ip6mr_ioctl", "ip6mr_compat_ioctl", "ip6mr_sk_done", "ip6mr_get_or_alloc_sk_table", "ip6mr_maybe_destroy_table", "ip6mr_destroy_workfn", "ip6mr_device_event", "ipmr_expire_process" ], "corpus_urls": [ "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+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lQVjYmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEUmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aXA2X21yb3V0ZV9zZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O2lwNl9tcm91dGVfZ2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtpcDZtcl9pb2N0bCYjMzQ7LAogICAgJiMzNDtpcDZtcl9jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7aXA2bXJfc2tfZG9uZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUmIzM0OywKICAgICYjMzQ7aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXN0cm95X3dvcmtmbiYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXZpY2VfZXZlbnQmIzM0OywKICAgICYjMzQ7aXBtcl9leHBpcmVfcHJvY2VzcyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCAobmV0L2lwdjYvaXA2bXIuYykgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgdGFibGVzIG9uIGRlbWFuZCB3aGVuIHNvY2tldCBvcHRpb25zIGFyZSBjb25maWd1cmVkIGFuZCB0byBkZXN0cm95IHRoZW0gd2hlbiB0aGV5IGJlY29tZSB1bnJlZmVyZW5jZWQgb3IgZW1wdHkuXG5cbi0gTWVtb3J5IEFsbG9jYXRpb25zOiBOZXcgZHluYW1pYyBhbGxvY2F0aW9ucyAoc3VjaCBhcyBgc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29ya2AgYWxsb2NhdGVkIHZpYSBga21hbGxvY19vYmpgKSBoYXZlIGFsbCBtZW1iZXIgZmllbGRzIChgd29ya2AsIGBuZXRgLCBgaWRgKSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBUaGUgdW5kZXJseWluZyBtdWx0aWNhc3QgdGFibGVzIGFsbG9jYXRlZCB2aWEgYG1yX3RhYmxlX2FsbG9jKClgIHVzZSBga3phbGxvY19vYmooKWAuXG4tIERhdGEgc2VudCB0byB1c2VyIHNwYWNlOiBpb2N0bC9jb21wYXRfaW9jdGwgYW5kIGdldHNvY2tvcHQgaGFuZGxlcnMgb25seSBjb3B5IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgZmllbGRzIG9yIGRhdGEgY29waWVkIGZyb20gdXNlciBzcGFjZSBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBsZWF2aW5nIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciByZWFkaW5nIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS5cbi0gQ29udHJvbCBmbG93IGFuZCBMaWZldGltZXM6IENoYW5nZXMgYWZmZWN0IHRhYmxlIGxpZmVjeWNsZSwgUkNVIHN5bmNocm9uaXphdGlvbiwgbGlzdCBtYW5pcHVsYXRpb25zLCBhbmQgbG9ja2luZyAoUlROTC9tcnRfbG9jaykuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhlc2UgcGF0aHMgaW52b2x2ZSB1c2UtYWZ0ZXItZnJlZSwgY29uY3VycmVudCBhY2Nlc3MsIG9yIG1lbW9yeSBsZWFrcywgd2hpY2ggYXJlIGhhbmRsZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBLTUVNTEVBSy5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIGludHJvZHVjZWQsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyAoaXA2bXIpIHRhYmxlIGxpZmVjeWNsZSBhbmQgbG9ja2luZy4gSXQgYWRkcyBkeW5hbWljIHRhYmxlIGFsbG9jYXRpb24sIGFzeW5jaHJvbm91cyB0YWJsZSBkZXN0cnVjdGlvbiB2aWEgd29ya3F1ZXVlcywgYW5kIHVwZGF0ZXMgc2V0c29ja29wdCwgZ2V0c29ja29wdCwgaW9jdGwsIHRpbWVyIGV4cGlyYXRpb24sIGFuZCBuZXRkZXYgbm90aWZpZXIgaGFuZGxpbmcuIFRoZXNlIHBhdGhzIGFyZSBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHZpYSByYXcgSVB2NiBzb2NrZXRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNTIxYzBiMDJhNjgxNDIwMGIwZWViMjBhYWYxM2M1ZDg0ZTk4ZmU1YlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gU2VwIDYgMTU6MjE6NTYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2bXIuYyBiL25ldC9pcHY2L2lwNm1yLmNcbmluZGV4IDNmMmVkOWI3N2RlYjUuLjI2YmQyY2NkNDIwMWEgMTAwNjQ0XG4tLS0gYS9uZXQvaXB2Ni9pcDZtci5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvaXB2Ni9pcDZtci5jXG5AQCAtMjgsNiAmIzQzOzI4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb21wYXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JoYXNodGFibGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9wcm90b2NvbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2tidWZmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NuZXQvcmF3LmhcdTAwM2VcbkBAIC0zNjgsNiAmIzQzOzM2OSwxMiBAQCBzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9nZXRfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXG4gXHRyZXR1cm4gbXJ0O1xuIH1cbiBcbiYjNDM7c3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbG9va3VwX3NrX3RhYmxlKHN0cnVjdCBzb2NrICpzaylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBfX2lwNm1yX2dldF90YWJsZShzb2NrX25ldChzayksXG4mIzQzO1x0XHRcdFx0IHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGludCBpcDZtcl9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLFxuIFx0XHRcdCAgY29uc3Qgdm9pZCAqcHRyKVxuIHtcbkBAIC00MTcsNiAmIzQzOzQyNCwxMjQgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0XHRcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpO1xuIH1cbiBcbiYjNDM7LyogdGFibGVfc2V0IGNhbGxiYWNrIHVzZWQgd2hpbGUgdGhlIG5ldyB0YWJsZSBpcyBzdGlsbCB1bnB1Ymxpc2hlZC4gKi9cbiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfdGFibGVfbm9fcHVibGlzaChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IG5ldCAqbmV0KVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBib29sICpuZXdfdGFibGUpXG4mIzQzO3tcbiYjNDM7XHR1MzIgaWQgPSByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQ7XG4mIzQzO1x0c3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spO1xuJiM0MztcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfUlROTCgpO1xuJiM0MztcdCpuZXdfdGFibGUgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0bXJ0ID0gX19pcDZtcl9nZXRfdGFibGUobmV0LCBpZCk7XG4mIzQzO1x0aWYgKG1ydClcbiYjNDM7XHRcdHJldHVybiBtcnQ7XG4mIzQzO1xuJiM0MztcdG1ydCA9IG1yX3RhYmxlX2FsbG9jKG5ldCwgaWQsIFx1MDAyNmlwNm1yX21yX3RhYmxlX29wcyxcbiYjNDM7XHRcdFx0ICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKTtcbiYjNDM7XHRpZiAoIUlTX0VSUihtcnQpKVxuJiM0MztcdFx0Km5ld190YWJsZSA9IHRydWU7XG4mIzQzO1x0cmV0dXJuIG1ydDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfcHVibGlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKG5ld190YWJsZSlcbiYjNDM7XHRcdGlwNm1yX25ld190YWJsZV9zZXQobXJ0LCByZWFkX3BuZXQoXHUwMDI2bXJ0LVx1MDAzZW5ldCkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuJiM0Mzt7XG4mIzQzO1x0QVNTRVJUX1JUTkwoKTtcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4mIzQzO1x0aWYgKG1ydC1cdTAwM2VpZCA9PSBSVDZfVEFCTEVfREZMVClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHQvKiBOZXN0ZWQgTkVUREVWX1VOUkVHSVNURVIgbWF5IGFscmVhZHkgaGF2ZSB1bmxpbmtlZCB0aGlzIHRhYmxlLiAqL1xuJiM0MztcdGlmIChfX2lwNm1yX2dldF90YWJsZShyZWFkX3BuZXQoXHUwMDI2bXJ0LVx1MDAzZW5ldCksIG1ydC1cdTAwM2VpZCkgIT0gbXJ0KVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC1cdTAwM2Vtcm91dGVfc2spIHx8XG4mIzQzO1x0ICAgIG1ydC1cdTAwM2VtYXh2aWYgfHxcbiYjNDM7XHQgICAgIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY19jYWNoZV9saXN0KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbiYjNDM7XHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpIHtcbiYjNDM7XHRcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0c3Bpbl91bmxvY2tfYmgoXHUwMDI2bWZjX3VucmVzX2xvY2spO1xuJiM0MztcbiYjNDM7XHRsaXN0X2RlbF9yY3UoXHUwMDI2bXJ0LVx1MDAzZWxpc3QpO1xuJiM0MztcdHRpbWVyX3NodXRkb3duX3N5bmMoXHUwMDI2bXJ0LVx1MDAzZWlwbXJfZXhwaXJlX3RpbWVyKTtcbiYjNDM7XHRtcl90YWJsZV9mcmVlKG1ydCk7XG4mIzQzOyNlbmRpZlxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xuJiM0MztzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrIHtcbiYjNDM7XHRzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yaztcbiYjNDM7XHRzdHJ1Y3QgbmV0ICpuZXQ7XG4mIzQzO1x0dTMyIGlkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfZGVzdHJveV93b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHcgPVxuJiM0MztcdFx0Y29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmssIHdvcmspO1xuJiM0MztcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuJiM0MztcbiYjNDM7XHRydG5sX2xvY2soKTtcbiYjNDM7XHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShkdy1cdTAwM2VuZXQsIGR3LVx1MDAzZWlkKTtcbiYjNDM7XHRpZiAobXJ0KVxuJiM0MztcdFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xuJiM0MztcdHJ0bmxfdW5sb2NrKCk7XG4mIzQzO1x0cHV0X25ldChkdy1cdTAwM2VuZXQpO1xuJiM0MztcdGtmcmVlKGR3KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveShzdHJ1Y3QgbXJfdGFibGUgKm1ydClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuZXQgKm5ldCA9IHJlYWRfcG5ldChcdTAwMjZtcnQtXHUwMDNlbmV0KTtcbiYjNDM7XHRzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrICpkdztcbiYjNDM7XG4mIzQzO1x0aWYgKG1ydC1cdTAwM2VpZCA9PSBSVDZfVEFCTEVfREZMVClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0ZHcgPSBrbWFsbG9jX29iaigqZHcsIEdGUF9BVE9NSUMpO1xuJiM0MztcdGlmICghZHcpIHtcbiYjNDM7XHRcdG1vZF90aW1lcihcdTAwMjZtcnQtXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgJiM0MzsgSFopO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIW1heWJlX2dldF9uZXQobmV0KSkge1xuJiM0MztcdFx0a2ZyZWUoZHcpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRJTklUX1dPUksoXHUwMDI2ZHctXHUwMDNld29yaywgaXA2bXJfZGVzdHJveV93b3JrZm4pO1xuJiM0MztcdGR3LVx1MDAzZW5ldCA9IG5ldDtcbiYjNDM7XHRkdy1cdTAwM2VpZCA9IG1ydC1cdTAwM2VpZDtcbiYjNDM7XHRxdWV1ZV93b3JrKHN5c3RlbV9kZmxfd3EsIFx1MDAyNmR3LVx1MDAzZXdvcmspO1xuJiM0Mzt9XG4mIzQzOyNlbHNlXG4mIzQzO3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpXG4mIzQzO3tcbiYjNDM7fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgaXA2bXJfZmluaXNoX25ld190YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgYm9vbCBuZXdfdGFibGUsXG4mIzQzO1x0XHRcdFx0ICBpbnQgZXJyKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKG5ld190YWJsZSBcdTAwMjZcdTAwMjYgZXJyKVxuJiM0MztcdFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgaXA2bXJfZnJlZV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcbiBcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRldl9raWxsX2xpc3QpXG4ge1xuQEAgLTg2NiwxNiAmIzQzOzk5MSwyNSBAQCBzdGF0aWMgdm9pZCBpcG1yX2RvX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuIHN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpXG4ge1xuIFx0c3RydWN0IG1yX3RhYmxlICptcnQgPSB0aW1lcl9jb250YWluZXJfb2YobXJ0LCB0LCBpcG1yX2V4cGlyZV90aW1lcik7XG4mIzQzO1x0Ym9vbCBlbXB0eSA9IGZhbHNlO1xuIFxuIFx0aWYgKCFzcGluX3RyeWxvY2soXHUwMDI2bWZjX3VucmVzX2xvY2spKSB7XG4gXHRcdG1vZF90aW1lcihcdTAwMjZtcnQtXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgJiM0MzsgMSk7XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcbi1cdGlmICghbGlzdF9lbXB0eShcdTAwMjZtcnQtXHUwMDNlbWZjX3VucmVzX3F1ZXVlKSlcbiYjNDM7XHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpIHtcbiBcdFx0aXBtcl9kb19leHBpcmVfcHJvY2VzcyhtcnQpO1xuJiM0MztcdFx0ZW1wdHkgPSBsaXN0X2VtcHR5KFx1MDAyNm1ydC1cdTAwM2VtZmNfdW5yZXNfcXVldWUpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHQvKiBSZXRyeSBhZnRlciBHRlBfQVRPTUlDIGFsbG9jYXRpb24gZmFpbHVyZS4gKi9cbiYjNDM7XHRcdGVtcHR5ID0gdHJ1ZTtcbiYjNDM7XHR9XG4gXG4gXHRzcGluX3VubG9jayhcdTAwMjZtZmNfdW5yZXNfbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmIChlbXB0eSlcbiYjNDM7XHRcdGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3kobXJ0KTtcbiB9XG4gXG4gLyogRmlsbCBvaWZzIGxpc3QuIEl0IGlzIGNhbGxlZCB1bmRlciBsb2NrZWQgbXJ0X2xvY2suICovXG5AQCAtMTI5MCwxOSAmIzQzOzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxuIHtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTtcbiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbiYjNDM7XHRzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgKm5leHQ7XG4mIzQzOyNlbHNlXG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiYjNDM7I2VuZGlmXG4gXHRzdHJ1Y3QgdmlmX2RldmljZSAqdjtcbiBcdGludCBjdDtcbiBcbiBcdGlmIChldmVudCAhPSBORVRERVZfVU5SRUdJU1RFUilcbiBcdFx0cmV0dXJuIE5PVElGWV9ET05FO1xuIFxuLVx0aXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpIHtcbiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCBcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tcjZfdGFibGVzLCBsaXN0KVxuJiM0MzsjZWxzZVxuJiM0MztcdGlwNm1yX2Zvcl9lYWNoX3RhYmxlKG1ydCwgbmV0KVxuJiM0MzsjZW5kaWZcbiYjNDM7XHR7XG4mIzQzO1x0XHRib29sIHZpZl9nb25lID0gZmFsc2U7XG4mIzQzO1xuIFx0XHR2ID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVswXTtcbiBcdFx0Zm9yIChjdCA9IDA7IGN0IFx1MDAzYyBtcnQtXHUwMDNlbWF4dmlmOyBjdCYjNDM7JiM0MzssIHYmIzQzOyYjNDM7KSB7XG4tXHRcdFx0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcih2LVx1MDAzZWRldikgPT0gZGV2KVxuJiM0MztcdFx0XHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXHUwMDNlZGV2KSA9PSBkZXYpIHtcbiBcdFx0XHRcdG1pZjZfZGVsZXRlKG1ydCwgY3QsIDEsIE5VTEwpO1xuJiM0MztcdFx0XHRcdHZpZl9nb25lID0gdHJ1ZTtcbiYjNDM7XHRcdFx0fVxuIFx0XHR9XG4mIzQzO1x0XHRpZiAodmlmX2dvbmUpXG4mIzQzO1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdH1cbiBcbiBcdHJldHVybiBOT1RJRllfRE9ORTtcbkBAIC0xNjE4LDEwICYjNDM7MTc2NywxMSBAQCBzdGF0aWMgdm9pZCBtcm91dGVfY2xlYW5fdGFibGVzKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBpbnQgZmxhZ3MsXG4gXG4gc3RhdGljIGludCBpcDZtcl9za19pbml0KHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBzdHJ1Y3Qgc29jayAqc2spXG4ge1xuLVx0aW50IGVyciA9IDA7XG4gXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4mIzQzO1x0aW50IGVyciA9IDA7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9SVE5MKCk7XG4gXG4tXHRydG5sX2xvY2soKTtcbiBcdHNwaW5fbG9jayhcdTAwMjZtcnRfbG9jayk7XG4gXHRpZiAocnRubF9kZXJlZmVyZW5jZShtcnQtXHUwMDNlbXJvdXRlX3NrKSkge1xuIFx0XHRlcnIgPSAtRUFERFJJTlVTRTtcbkBAIC0xNjM3LDggJiM0MzsxNzg3LDYgQEAgc3RhdGljIGludCBpcDZtcl9za19pbml0KHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBzdHJ1Y3Qgc29jayAqc2spXG4gXHRcdFx0XHRcdCAgICAgTkVUQ09ORkFfTUNfRk9SV0FSRElORyxcbiBcdFx0XHRcdFx0ICAgICBORVRDT05GQV9JRklOREVYX0FMTCxcbiBcdFx0XHRcdFx0ICAgICBuZXQtXHUwMDNlaXB2Ni5kZXZjb25mX2FsbCk7XG4tXHRydG5sX3VubG9jaygpO1xuLVxuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtMTY3Nyw2ICYjNDM7MTgyNSw3IEBAIGludCBpcDZtcl9za19kb25lKHN0cnVjdCBzb2NrICpzaylcbiBcdFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgTVJUNl9GTFVTSF9NSUZTIHwgTVJUNl9GTFVTSF9NRkMsXG4gXHRcdFx0XHRcdCAgICBcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiBcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbiBcdH1cbkBAIC0xNzIzLDI3ICYjNDM7MTg3Miw0NSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHQgICAgaW5ldF9zayhzayktXHUwMDNlaW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpXG4gXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4tXG4gXHRpZiAob3B0bmFtZSAhPSBNUlQ2X0lOSVQpIHtcbi1cdFx0aWYgKHNrICE9IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFuc19jYXBhYmxlKG5ldC1cdTAwM2V1c2VyX25zLCBDQVBfTkVUX0FETUlOKSlcbiYjNDM7XHRcdGJvb2wgaXNfbXJvdXRlX3NrID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdFx0cmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRcdGlmIChtcnQgXHUwMDI2XHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSlcbiYjNDM7XHRcdFx0aXNfbXJvdXRlX3NrID0gdHJ1ZTtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRcdGlmICghaXNfbXJvdXRlX3NrIFx1MDAyNlx1MDAyNiAhbnNfY2FwYWJsZShuZXQtXHUwMDNldXNlcl9ucywgQ0FQX05FVF9BRE1JTikpXG4gXHRcdFx0cmV0dXJuIC1FQUNDRVM7XG4gXHR9XG4gXG4gXHRzd2l0Y2ggKG9wdG5hbWUpIHtcbi1cdGNhc2UgTVJUNl9JTklUOlxuJiM0MztcdGNhc2UgTVJUNl9JTklUOiB7XG4mIzQzO1x0XHRib29sIG5ld190YWJsZSA9IGZhbHNlO1xuJiM0MztcbiBcdFx0aWYgKG9wdGxlbiBcdTAwM2Mgc2l6ZW9mKGludCkpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdHJldHVybiBpcDZtcl9za19pbml0KG1ydCwgc2spO1xuJiM0MztcdFx0cnRubF9sb2NrKCk7XG4mIzQzO1x0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKG1ydCkpIHtcbiYjNDM7XHRcdFx0cnRubF91bmxvY2soKTtcbiYjNDM7XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbiYjNDM7XHRcdHJldCA9IGlwNm1yX3NrX2luaXQobXJ0LCBzayk7XG4mIzQzO1x0XHRyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpO1xuJiM0MztcdFx0cnRubF91bmxvY2soKTtcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuIFxuIFx0Y2FzZSBNUlQ2X0RPTkU6XG4gXHRcdHJldHVybiBpcDZtcl9za19kb25lKHNrKTtcbiBcbi1cdGNhc2UgTVJUNl9BRERfTUlGOlxuJiM0MztcdGNhc2UgTVJUNl9BRERfTUlGOiB7XG4mIzQzO1x0XHRib29sIG5ld190YWJsZSA9IGZhbHNlO1xuJiM0MztcbiBcdFx0aWYgKG9wdGxlbiBcdTAwM2Mgc2l6ZW9mKHZpZikpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZ2aWYsIG9wdHZhbCwgc2l6ZW9mKHZpZikpKVxuQEAgLTE3NTEsMTAgJiM0MzsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHZpZi5taWY2Y19taWZpIFx1MDAzZT0gTUFYTUlGUylcbiBcdFx0XHRyZXR1cm4gLUVORklMRTtcbiBcdFx0cnRubF9sb2NrKCk7XG4mIzQzO1x0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKG1ydCkpIHtcbiYjNDM7XHRcdFx0cnRubF91bmxvY2soKTtcbiYjNDM7XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbiBcdFx0cmV0ID0gbWlmNl9hZGQobmV0LCBtcnQsIFx1MDAyNnZpZixcbiBcdFx0XHQgICAgICAgc2sgPT0gcnRubF9kZXJlZmVyZW5jZShtcnQtXHUwMDNlbXJvdXRlX3NrKSk7XG4mIzQzO1x0XHRyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpO1xuIFx0XHRydG5sX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdH1cbiBcbiBcdGNhc2UgTVJUNl9ERUxfTUlGOlxuIFx0XHRpZiAob3B0bGVuIFx1MDAzYyBzaXplb2YobWlmaV90KSlcbkBAIC0xNzYyLDcgJiM0MzsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFx1MDAyNm1pZmksIG9wdHZhbCwgc2l6ZW9mKG1pZmlfdCkpKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0XHRydG5sX2xvY2soKTtcbiYjNDM7XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4mIzQzO1x0XHRpZiAoIW1ydCkge1xuJiM0MztcdFx0XHRydG5sX3VubG9jaygpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdH1cbiBcdFx0cmV0ID0gbWlmNl9kZWxldGUobXJ0LCBtaWZpLCAwLCBOVUxMKTtcbiYjNDM7XHRcdGlmICghcmV0KVxuJiM0MztcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4gXG5AQCAtMTc4MywxNyAmIzQzOzE5NjUsMzkgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0XHRpZiAocGFyZW50ID09IDApXG4gXHRcdFx0cGFyZW50ID0gbWZjLm1mNmNjX3BhcmVudDtcbiBcbi1cdFx0bXV0ZXhfbG9jayhcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xuJiM0MztcdFx0cnRubF9sb2NrKCk7XG4mIzQzO1x0XHRpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpIHtcbiYjNDM7XHRcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRcdFx0aWYgKCFtcnQpIHtcbiYjNDM7XHRcdFx0XHRydG5sX3VubG9jaygpO1xuJiM0MztcdFx0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRib29sIG5ld190YWJsZSA9IGZhbHNlO1xuIFxuLVx0XHRpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpXG4tXHRcdFx0cmV0ID0gaXA2bXJfbWZjX2RlbGV0ZShtcnQsIFx1MDAyNm1mYywgcGFyZW50KTtcbi1cdFx0ZWxzZVxuJiM0MztcdFx0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4mIzQzO1x0XHRcdGlmIChJU19FUlIobXJ0KSkge1xuJiM0MztcdFx0XHRcdHJ0bmxfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpcDZtcl9wdWJsaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSk7XG4mIzQzO1x0XHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbiBcdFx0XHRyZXQgPSBpcDZtcl9tZmNfYWRkKG5ldCwgbXJ0LCBcdTAwMjZtZmMsXG4gXHRcdFx0XHRcdCAgICBzayA9PVxuIFx0XHRcdFx0XHQgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spLFxuIFx0XHRcdFx0XHQgICAgcGFyZW50KTtcbiYjNDM7XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1mY19tdXRleCk7XG4mIzQzO1x0XHRcdHJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7XG4mIzQzO1x0XHRcdHJ0bmxfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHR9XG4gXG4mIzQzO1x0XHRtdXRleF9sb2NrKFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1mY19tdXRleCk7XG4mIzQzO1x0XHRyZXQgPSBpcDZtcl9tZmNfZGVsZXRlKG1ydCwgXHUwMDI2bWZjLCBwYXJlbnQpO1xuIFx0XHRtdXRleF91bmxvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbiYjNDM7XHRcdGlmICghcmV0KVxuJiM0MztcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4mIzQzO1x0XHRydG5sX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gcmV0O1xuIFxuIFx0Y2FzZSBNUlQ2X0ZMVVNIOlxuQEAgLTE4MDcsOCAmIzQzOzIwMTEsMTQgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFxuIFx0XHRydG5sX2xvY2soKTtcbiYjNDM7XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4mIzQzO1x0XHRpZiAoIW1ydCkge1xuJiM0MztcdFx0XHRydG5sX3VubG9jaygpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdH1cbiBcdFx0bXJvdXRlX2NsZWFuX3RhYmxlcyhtcnQsIGZsYWdzLCBcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiBcdFx0dW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueShcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiYjNDM7XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0cnRubF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG5AQCAtMTgyNCw3ICYjNDM7MjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZ2LCBvcHR2YWwsIHNpemVvZih2KSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1x0XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0XHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xuJiM0MztcdFx0aWYgKCFtcnQpIHtcbiYjNDM7XHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdFx0fVxuIFx0XHRXUklURV9PTkNFKG1ydC1cdTAwM2Vtcm91dGVfZG9fYXNzZXJ0LCB2KTtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbkBAIC0xODQyLDYgJiM0MzsyMDU5LDExIEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0ZG9fd3JtaWZ3aG9sZSA9ICh2ID09IE1SVDZNU0dfV1JNSUZXSE9MRSk7XG4gXHRcdHYgPSAhIXY7XG4gXHRcdHJ0bmxfbG9jaygpO1xuJiM0MztcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRcdGlmICghbXJ0KSB7XG4mIzQzO1x0XHRcdHJ0bmxfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdFx0fVxuIFx0XHRyZXQgPSAwO1xuIFx0XHRpZiAodiAhPSBtcnQtXHUwMDNlbXJvdXRlX2RvX3BpbSkge1xuIFx0XHRcdFdSSVRFX09OQ0UobXJ0LVx1MDAzZW1yb3V0ZV9kb19waW0sIHYpO1xuQEAgLTE4NjUsMTggJiM0MzsyMDg3LDE2IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0LyogXCYjMzQ7cGltNnJlZyV1XCYjMzQ7IHNob3VsZCBub3QgZXhjZWVkIDE2IGJ5dGVzIChJRk5BTVNJWikgKi9cbiBcdFx0aWYgKHYgIT0gUlRfVEFCTEVfREVGQVVMVCBcdTAwMjZcdTAwMjYgdiBcdTAwM2U9IDEwMDAwMDAwMClcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0aWYgKHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSlcbiYjNDM7XHRcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4mIzQzO1x0XHRpZiAobXJ0IFx1MDAyNlx1MDAyNiBzayA9PSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LVx1MDAzZW1yb3V0ZV9zaykpIHtcbiYjNDM7XHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFxuLVx0XHRydG5sX2xvY2soKTtcbi1cdFx0cmV0ID0gMDtcbi1cdFx0bXJ0ID0gaXA2bXJfbmV3X3RhYmxlKG5ldCwgdik7XG4tXHRcdGlmIChJU19FUlIobXJ0KSlcbi1cdFx0XHRyZXQgPSBQVFJfRVJSKG1ydCk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRyYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA9IHY7XG4tXHRcdHJ0bmxfdW5sb2NrKCk7XG4tXHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHRyYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA9IHY7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcdH1cbiAjZW5kaWZcbiBcdC8qXG5AQCAtMTg5NywxNiAmIzQzOzIxMTcsMTggQEAgaW50IGlwNl9tcm91dGVfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIHtcbiBcdGludCBvbHI7XG4gXHRpbnQgdmFsO1xuLVx0c3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spO1xuIFx0c3RydWN0IG1yX3RhYmxlICptcnQ7XG4gXG4gXHRpZiAoc2stXHUwMDNlc2tfdHlwZSAhPSBTT0NLX1JBVyB8fFxuIFx0ICAgIGluZXRfc2soc2spLVx1MDAzZWluZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KVxuIFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gXG4tXHRtcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xuLVx0aWYgKCFtcnQpXG4mIzQzO1x0cmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4mIzQzO1x0aWYgKCFtcnQpIHtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4gXG4gXHRzd2l0Y2ggKG9wdG5hbWUpIHtcbiBcdGNhc2UgTVJUNl9WRVJTSU9OOlxuQEAgLTE5MjEsOCAmIzQzOzIxNDMsMTAgQEAgaW50IGlwNl9tcm91dGVfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0XHR2YWwgPSBSRUFEX09OQ0UobXJ0LVx1MDAzZW1yb3V0ZV9kb19hc3NlcnQpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9QUk9UT09QVDtcbiBcdH1cbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiBcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZvbHIsIG9wdGxlbiwgc2l6ZW9mKGludCkpKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbkBAIC0xOTQ3LDIwICYjNDM7MjE3MSwyMyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXG4gXHRzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqdnI7XG4gXHRzdHJ1Y3QgdmlmX2RldmljZSAqdmlmO1xuIFx0c3RydWN0IG1mYzZfY2FjaGUgKmM7XG4tXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRpZiAoIW1ydCkge1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdH1cbiBcbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHR2ciA9IChzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqKWFyZztcbi1cdFx0aWYgKHZyLVx1MDAzZW1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKVxuJiM0MztcdFx0aWYgKHZyLVx1MDAzZW1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKSB7XG4mIzQzO1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0fVxuIFx0XHR2ci1cdTAwM2VtaWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLVx1MDAzZW1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdHZpZiA9IFx1MDAyNm1ydC1cdTAwM2V2aWZfdGFibGVbdnItXHUwMDNlbWlmaV07XG4gXHRcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnItXHUwMDNlbWlmaSkpIHtcbiBcdFx0XHR2ci1cdTAwM2VpY291bnQgPSBSRUFEX09OQ0UodmlmLVx1MDAzZXBrdF9pbik7XG5AQCAtMTk3NCw4ICYjNDM7MjIwMSw2IEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZylcbiBcdFx0cmV0dXJuIC1FQUREUk5PVEFWQUlMO1xuIFx0Y2FzZSBTSU9DR0VUU0dDTlRfSU42OlxuIFx0XHRzciA9IChzdHJ1Y3Qgc2lvY19zZ19yZXE2ICopYXJnO1xuLVxuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdGMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgXHUwMDI2c3ItXHUwMDNlc3JjLnNpbjZfYWRkcixcbiBcdFx0XHRcdCAgICAgXHUwMDI2c3ItXHUwMDNlZ3JwLnNpbjZfYWRkcik7XG4gXHRcdGlmIChjKSB7XG5AQCAtMTk4OCw2ICYjNDM7MjIxMyw3IEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZylcbiBcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAtRUFERFJOT1RBVkFJTDtcbiBcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbiBcdH1cbiB9XG5AQCAtMjAxNSwyMSAmIzQzOzIyNDEsMjMgQEAgaW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpXG4gXHRzdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYgdnI7XG4gXHRzdHJ1Y3QgdmlmX2RldmljZSAqdmlmO1xuIFx0c3RydWN0IG1mYzZfY2FjaGUgKmM7XG4tXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4tXG4gXHRzd2l0Y2ggKGNtZCkge1xuIFx0Y2FzZSBTSU9DR0VUTUlGQ05UX0lONjpcbiBcdFx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNnZyLCBhcmcsIHNpemVvZih2cikpKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuLVx0XHRpZiAodnIubWlmaSBcdTAwM2U9IG1ydC1cdTAwM2VtYXh2aWYpXG4mIzQzO1x0XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0XHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xuJiM0MztcdFx0aWYgKCFtcnQpIHtcbiYjNDM7XHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHZyLm1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKSB7XG4mIzQzO1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0fVxuIFx0XHR2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdHZpZiA9IFx1MDAyNm1ydC1cdTAwM2V2aWZfdGFibGVbdnIubWlmaV07XG4gXHRcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnIubWlmaSkpIHtcbiBcdFx0XHR2ci5pY291bnQgPSBSRUFEX09OQ0UodmlmLVx1MDAzZXBrdF9pbik7XG5AQCAtMjA0OSw2ICYjNDM7MjI3NywxMSBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbiBcdFx0cmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRcdGlmICghbXJ0KSB7XG4mIzQzO1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdH1cbiBcdFx0YyA9IGlwNm1yX2NhY2hlX2ZpbmQobXJ0LCBcdTAwMjZzci5zcmMuc2luNl9hZGRyLCBcdTAwMjZzci5ncnAuc2luNl9hZGRyKTtcbiBcdFx0aWYgKGMpIHtcbiBcdFx0XHRzci5wa3RjbnQgPSBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNmMtXHUwMDNlX2MubWZjX3VuLnJlcy5wa3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIxPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lQVjYmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEUmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aXA2X21yb3V0ZV9zZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O2lwNl9tcm91dGVfZ2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtpcDZtcl9pb2N0bCYjMzQ7LAogICAgJiMzNDtpcDZtcl9jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7aXA2bXJfc2tfZG9uZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUmIzM0OywKICAgICYjMzQ7aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXN0cm95X3dvcmtmbiYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXZpY2VfZXZlbnQmIzM0OywKICAgICYjMzQ7aXBtcl9leHBpcmVfcHJvY2VzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyAoaXA2bXIpIHRhYmxlIGxpZmVjeWNsZSBhbmQgbG9ja2luZy4gSXQgYWRkcyBkeW5hbWljIHRhYmxlIGFsbG9jYXRpb24sIGFzeW5jaHJvbm91cyB0YWJsZSBkZXN0cnVjdGlvbiB2aWEgd29ya3F1ZXVlcywgYW5kIHVwZGF0ZXMgc2V0c29ja29wdCwgZ2V0c29ja29wdCwgaW9jdGwsIHRpbWVyIGV4cGlyYXRpb24sIGFuZCBuZXRkZXYgbm90aWZpZXIgaGFuZGxpbmcuIFRoZXNlIHBhdGhzIGFyZSBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHZpYSByYXcgSVB2NiBzb2NrZXRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNTIxYzBiMDJhNjgxNDIwMGIwZWViMjBhYWYxM2M1ZDg0ZTk4ZmU1YgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gU2VwIDYgMTU6MjE6NTYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZtci5jIGIvbmV0L2lwdjYvaXA2bXIuYwppbmRleCAzZjJlZDliNzdkZWI1Li4yNmJkMmNjZDQyMDFhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZtci5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9pcHY2L2lwNm1yLmMKQEAgLTI4LDYgJiM0MzsyOCw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvaW5pdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2NvbXBhdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3JoYXNodGFibGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvd29ya3F1ZXVlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L3Byb3RvY29sLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc2tidWZmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L3Jhdy5oJmd0OwpAQCAtMzY4LDYgJiM0MzszNjksMTIgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKQogCXJldHVybiBtcnQ7CiB9CiAKJiM0MztzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9sb29rdXBfc2tfdGFibGUoc3RydWN0IHNvY2sgKnNrKQomIzQzO3sKJiM0MzsJcmV0dXJuIF9faXA2bXJfZ2V0X3RhYmxlKHNvY2tfbmV0KHNrKSwKJiM0MzsJCQkJIHJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgaXA2bXJfaGFzaF9jbXAoc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgKmFyZywKIAkJCSAgY29uc3Qgdm9pZCAqcHRyKQogewpAQCAtNDE3LDYgJiM0Mzs0MjQsMTI0IEBAIHN0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX25ld190YWJsZShzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBpZCkKIAkJCSAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpOwogfQogCiYjNDM7LyogdGFibGVfc2V0IGNhbGxiYWNrIHVzZWQgd2hpbGUgdGhlIG5ldyB0YWJsZSBpcyBzdGlsbCB1bnB1Ymxpc2hlZC4gKi8KJiM0MztzdGF0aWMgdm9pZCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBzdHJ1Y3QgbmV0ICpuZXQpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc3RydWN0IHNvY2sgKnNrLAomIzQzOwkJCQkJCSAgICBib29sICpuZXdfdGFibGUpCiYjNDM7ewomIzQzOwl1MzIgaWQgPSByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUOwomIzQzOwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiYjNDM7CXN0cnVjdCBtcl90YWJsZSAqbXJ0OwomIzQzOwomIzQzOwlBU1NFUlRfUlROTCgpOwomIzQzOwkqbmV3X3RhYmxlID0gZmFsc2U7CiYjNDM7CiYjNDM7CW1ydCA9IF9faXA2bXJfZ2V0X3RhYmxlKG5ldCwgaWQpOwomIzQzOwlpZiAobXJ0KQomIzQzOwkJcmV0dXJuIG1ydDsKJiM0MzsKJiM0MzsJbXJ0ID0gbXJfdGFibGVfYWxsb2MobmV0LCBpZCwgJmFtcDtpcDZtcl9tcl90YWJsZV9vcHMsCiYjNDM7CQkJICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKTsKJiM0MzsJaWYgKCFJU19FUlIobXJ0KSkKJiM0MzsJCSpuZXdfdGFibGUgPSB0cnVlOwomIzQzOwlyZXR1cm4gbXJ0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBpcDZtcl9wdWJsaXNoX25ld190YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgYm9vbCBuZXdfdGFibGUpCiYjNDM7ewomIzQzOwlpZiAobmV3X3RhYmxlKQomIzQzOwkJaXA2bXJfbmV3X3RhYmxlX3NldChtcnQsIHJlYWRfcG5ldCgmYW1wO21ydC0mZ3Q7bmV0KSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQpCiYjNDM7ewomIzQzOwlBU1NFUlRfUlROTCgpOwomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTCiYjNDM7CWlmIChtcnQtJmd0O2lkID09IFJUNl9UQUJMRV9ERkxUKQomIzQzOwkJcmV0dXJuOwomIzQzOwkvKiBOZXN0ZWQgTkVUREVWX1VOUkVHSVNURVIgbWF5IGFscmVhZHkgaGF2ZSB1bmxpbmtlZCB0aGlzIHRhYmxlLiAqLwomIzQzOwlpZiAoX19pcDZtcl9nZXRfdGFibGUocmVhZF9wbmV0KCZhbXA7bXJ0LSZndDtuZXQpLCBtcnQtJmd0O2lkKSAhPSBtcnQpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC0mZ3Q7bXJvdXRlX3NrKSB8fAomIzQzOwkgICAgbXJ0LSZndDttYXh2aWYgfHwKJiM0MzsJICAgICFsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfY2FjaGVfbGlzdCkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXNwaW5fbG9ja19iaCgmYW1wO21mY191bnJlc19sb2NrKTsKJiM0MzsJaWYgKCFsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfdW5yZXNfcXVldWUpKSB7CiYjNDM7CQlzcGluX3VubG9ja19iaCgmYW1wO21mY191bnJlc19sb2NrKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlzcGluX3VubG9ja19iaCgmYW1wO21mY191bnJlc19sb2NrKTsKJiM0MzsKJiM0MzsJbGlzdF9kZWxfcmN1KCZhbXA7bXJ0LSZndDtsaXN0KTsKJiM0MzsJdGltZXJfc2h1dGRvd25fc3luYygmYW1wO21ydC0mZ3Q7aXBtcl9leHBpcmVfdGltZXIpOwomIzQzOwltcl90YWJsZV9mcmVlKG1ydCk7CiYjNDM7I2VuZGlmCiYjNDM7fQomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTCiYjNDM7c3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7CiYjNDM7CXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwomIzQzOwlzdHJ1Y3QgbmV0ICpuZXQ7CiYjNDM7CXUzMiBpZDsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmsgKmR3ID0KJiM0MzsJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrLCB3b3JrKTsKJiM0MzsJc3RydWN0IG1yX3RhYmxlICptcnQ7CiYjNDM7CiYjNDM7CXJ0bmxfbG9jaygpOwomIzQzOwltcnQgPSBfX2lwNm1yX2dldF90YWJsZShkdy0mZ3Q7bmV0LCBkdy0mZ3Q7aWQpOwomIzQzOwlpZiAobXJ0KQomIzQzOwkJaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpOwomIzQzOwlydG5sX3VubG9jaygpOwomIzQzOwlwdXRfbmV0KGR3LSZndDtuZXQpOwomIzQzOwlrZnJlZShkdyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbmV0ICpuZXQgPSByZWFkX3BuZXQoJmFtcDttcnQtJmd0O25ldCk7CiYjNDM7CXN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmsgKmR3OwomIzQzOwomIzQzOwlpZiAobXJ0LSZndDtpZCA9PSBSVDZfVEFCTEVfREZMVCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZHcgPSBrbWFsbG9jX29iaigqZHcsIEdGUF9BVE9NSUMpOwomIzQzOwlpZiAoIWR3KSB7CiYjNDM7CQltb2RfdGltZXIoJmFtcDttcnQtJmd0O2lwbXJfZXhwaXJlX3RpbWVyLCBqaWZmaWVzICYjNDM7IEhaKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlpZiAoIW1heWJlX2dldF9uZXQobmV0KSkgewomIzQzOwkJa2ZyZWUoZHcpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CUlOSVRfV09SSygmYW1wO2R3LSZndDt3b3JrLCBpcDZtcl9kZXN0cm95X3dvcmtmbik7CiYjNDM7CWR3LSZndDtuZXQgPSBuZXQ7CiYjNDM7CWR3LSZndDtpZCA9IG1ydC0mZ3Q7aWQ7CiYjNDM7CXF1ZXVlX3dvcmsoc3lzdGVtX2RmbF93cSwgJmFtcDtkdy0mZ3Q7d29yayk7CiYjNDM7fQomIzQzOyNlbHNlCiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveShzdHJ1Y3QgbXJfdGFibGUgKm1ydCkKJiM0Mzt7CiYjNDM7fQomIzQzOyNlbmRpZgomIzQzOwomIzQzO3N0YXRpYyBpbnQgaXA2bXJfZmluaXNoX25ld190YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgYm9vbCBuZXdfdGFibGUsCiYjNDM7CQkJCSAgaW50IGVycikKJiM0Mzt7CiYjNDM7CWlmIChuZXdfdGFibGUgJmFtcDsmYW1wOyBlcnIpCiYjNDM7CQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgaXA2bXJfZnJlZV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwKIAkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqZGV2X2tpbGxfbGlzdCkKIHsKQEAgLTg2NiwxNiAmIzQzOzk5MSwyNSBAQCBzdGF0aWMgdm9pZCBpcG1yX2RvX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCBtcl90YWJsZSAqbXJ0KQogc3RhdGljIHZvaWQgaXBtcl9leHBpcmVfcHJvY2VzcyhzdHJ1Y3QgdGltZXJfbGlzdCAqdCkKIHsKIAlzdHJ1Y3QgbXJfdGFibGUgKm1ydCA9IHRpbWVyX2NvbnRhaW5lcl9vZihtcnQsIHQsIGlwbXJfZXhwaXJlX3RpbWVyKTsKJiM0MzsJYm9vbCBlbXB0eSA9IGZhbHNlOwogCiAJaWYgKCFzcGluX3RyeWxvY2soJmFtcDttZmNfdW5yZXNfbG9jaykpIHsKIAkJbW9kX3RpbWVyKCZhbXA7bXJ0LSZndDtpcG1yX2V4cGlyZV90aW1lciwgamlmZmllcyAmIzQzOyAxKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICghbGlzdF9lbXB0eSgmYW1wO21ydC0mZ3Q7bWZjX3VucmVzX3F1ZXVlKSkKJiM0MzsJaWYgKCFsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfdW5yZXNfcXVldWUpKSB7CiAJCWlwbXJfZG9fZXhwaXJlX3Byb2Nlc3MobXJ0KTsKJiM0MzsJCWVtcHR5ID0gbGlzdF9lbXB0eSgmYW1wO21ydC0mZ3Q7bWZjX3VucmVzX3F1ZXVlKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCS8qIFJldHJ5IGFmdGVyIEdGUF9BVE9NSUMgYWxsb2NhdGlvbiBmYWlsdXJlLiAqLwomIzQzOwkJZW1wdHkgPSB0cnVlOwomIzQzOwl9CiAKIAlzcGluX3VubG9jaygmYW1wO21mY191bnJlc19sb2NrKTsKJiM0MzsKJiM0MzsJaWYgKGVtcHR5KQomIzQzOwkJaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveShtcnQpOwogfQogCiAvKiBGaWxsIG9pZnMgbGlzdC4gSXQgaXMgY2FsbGVkIHVuZGVyIGxvY2tlZCBtcnRfbG9jay4gKi8KQEAgLTEyOTAsMTkgJiM0MzsxNDI0LDM0IEBAIHN0YXRpYyBpbnQgaXA2bXJfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmV0ZGV2X25vdGlmaWVyX2luZm9fdG9fZGV2KHB0cik7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwomIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTCiYjNDM7CXN0cnVjdCBtcl90YWJsZSAqbXJ0LCAqbmV4dDsKJiM0MzsjZWxzZQogCXN0cnVjdCBtcl90YWJsZSAqbXJ0OwomIzQzOyNlbmRpZgogCXN0cnVjdCB2aWZfZGV2aWNlICp2OwogCWludCBjdDsKIAogCWlmIChldmVudCAhPSBORVRERVZfVU5SRUdJU1RFUikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCi0JaXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpIHsKJiM0MzsjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFUwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCAmYW1wO25ldC0mZ3Q7aXB2Ni5tcjZfdGFibGVzLCBsaXN0KQomIzQzOyNlbHNlCiYjNDM7CWlwNm1yX2Zvcl9lYWNoX3RhYmxlKG1ydCwgbmV0KQomIzQzOyNlbmRpZgomIzQzOwl7CiYjNDM7CQlib29sIHZpZl9nb25lID0gZmFsc2U7CiYjNDM7CiAJCXYgPSAmYW1wO21ydC0mZ3Q7dmlmX3RhYmxlWzBdOwogCQlmb3IgKGN0ID0gMDsgY3QgJmx0OyBtcnQtJmd0O21heHZpZjsgY3QmIzQzOyYjNDM7LCB2JiM0MzsmIzQzOykgewotCQkJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcih2LSZndDtkZXYpID09IGRldikKJiM0MzsJCQlpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtJmd0O2RldikgPT0gZGV2KSB7CiAJCQkJbWlmNl9kZWxldGUobXJ0LCBjdCwgMSwgTlVMTCk7CiYjNDM7CQkJCXZpZl9nb25lID0gdHJ1ZTsKJiM0MzsJCQl9CiAJCX0KJiM0MzsJCWlmICh2aWZfZ29uZSkKJiM0MzsJCQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiAJfQogCiAJcmV0dXJuIE5PVElGWV9ET05FOwpAQCAtMTYxOCwxMCAmIzQzOzE3NjcsMTEgQEAgc3RhdGljIHZvaWQgbXJvdXRlX2NsZWFuX3RhYmxlcyhzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgaW50IGZsYWdzLAogCiBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaykKIHsKLQlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiYjNDM7CWludCBlcnIgPSAwOwomIzQzOwomIzQzOwlBU1NFUlRfUlROTCgpOwogCi0JcnRubF9sb2NrKCk7CiAJc3Bpbl9sb2NrKCZhbXA7bXJ0X2xvY2spOwogCWlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC0mZ3Q7bXJvdXRlX3NrKSkgewogCQllcnIgPSAtRUFERFJJTlVTRTsKQEAgLTE2MzcsOCAmIzQzOzE3ODcsNiBAQCBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaykKIAkJCQkJICAgICBORVRDT05GQV9NQ19GT1JXQVJESU5HLAogCQkJCQkgICAgIE5FVENPTkZBX0lGSU5ERVhfQUxMLAogCQkJCQkgICAgIG5ldC0mZ3Q7aXB2Ni5kZXZjb25mX2FsbCk7Ci0JcnRubF91bmxvY2soKTsKLQogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE2NzcsNiAmIzQzOzE4MjUsNyBAQCBpbnQgaXA2bXJfc2tfZG9uZShzdHJ1Y3Qgc29jayAqc2spCiAJCQltcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgTVJUNl9GTFVTSF9NSUZTIHwgTVJUNl9GTFVTSF9NRkMsCiAJCQkJCSAgICAmYW1wO2Rldl9raWxsX2xpc3QpOwogCQkJZXJyID0gMDsKJiM0MzsJCQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE3MjMsMjcgJiM0MzsxODcyLDQ1IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkgICAgaW5ldF9zayhzayktJmd0O2luZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAoIW1ydCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KIAlpZiAob3B0bmFtZSAhPSBNUlQ2X0lOSVQpIHsKLQkJaWYgKHNrICE9IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zaykgJmFtcDsmYW1wOwotCQkgICAgIW5zX2NhcGFibGUobmV0LSZndDt1c2VyX25zLCBDQVBfTkVUX0FETUlOKSkKJiM0MzsJCWJvb2wgaXNfbXJvdXRlX3NrID0gZmFsc2U7CiYjNDM7CiYjNDM7CQlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKG1ydCAmYW1wOyZhbXA7IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zaykpCiYjNDM7CQkJaXNfbXJvdXRlX3NrID0gdHJ1ZTsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwomIzQzOwkJaWYgKCFpc19tcm91dGVfc2sgJmFtcDsmYW1wOyAhbnNfY2FwYWJsZShuZXQtJmd0O3VzZXJfbnMsIENBUF9ORVRfQURNSU4pKQogCQkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCiAJc3dpdGNoIChvcHRuYW1lKSB7Ci0JY2FzZSBNUlQ2X0lOSVQ6CiYjNDM7CWNhc2UgTVJUNl9JTklUOiB7CiYjNDM7CQlib29sIG5ld190YWJsZSA9IGZhbHNlOwomIzQzOwogCQlpZiAob3B0bGVuICZsdDsgc2l6ZW9mKGludCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlyZXR1cm4gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTsKJiM0MzsJCXJ0bmxfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlKHNrLCAmYW1wO25ld190YWJsZSk7CiYjNDM7CQlpZiAoSVNfRVJSKG1ydCkpIHsKJiM0MzsJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCXJldHVybiBQVFJfRVJSKG1ydCk7CiYjNDM7CQl9CiYjNDM7CQlpcDZtcl9wdWJsaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSk7CiYjNDM7CQlyZXQgPSBpcDZtcl9za19pbml0KG1ydCwgc2spOwomIzQzOwkJcmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTsKJiM0MzsJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwl9CiAKIAljYXNlIE1SVDZfRE9ORToKIAkJcmV0dXJuIGlwNm1yX3NrX2RvbmUoc2spOwogCi0JY2FzZSBNUlQ2X0FERF9NSUY6CiYjNDM7CWNhc2UgTVJUNl9BRERfTUlGOiB7CiYjNDM7CQlib29sIG5ld190YWJsZSA9IGZhbHNlOwomIzQzOwogCQlpZiAob3B0bGVuICZsdDsgc2l6ZW9mKHZpZikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGNvcHlfZnJvbV9zb2NrcHRyKCZhbXA7dmlmLCBvcHR2YWwsIHNpemVvZih2aWYpKSkKQEAgLTE3NTEsMTAgJiM0MzsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJaWYgKHZpZi5taWY2Y19taWZpICZndDs9IE1BWE1JRlMpCiAJCQlyZXR1cm4gLUVORklMRTsKIAkJcnRubF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssICZhbXA7bmV3X3RhYmxlKTsKJiM0MzsJCWlmIChJU19FUlIobXJ0KSkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIFBUUl9FUlIobXJ0KTsKJiM0MzsJCX0KJiM0MzsJCWlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTsKIAkJcmV0ID0gbWlmNl9hZGQobmV0LCBtcnQsICZhbXA7dmlmLAogCQkJICAgICAgIHNrID09IHJ0bmxfZGVyZWZlcmVuY2UobXJ0LSZndDttcm91dGVfc2spKTsKJiM0MzsJCXJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7CiAJCXJ0bmxfdW5sb2NrKCk7CiAJCXJldHVybiByZXQ7CiYjNDM7CX0KIAogCWNhc2UgTVJUNl9ERUxfTUlGOgogCQlpZiAob3B0bGVuICZsdDsgc2l6ZW9mKG1pZmlfdCkpCkBAIC0xNzYyLDcgJiM0MzsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJaWYgKGNvcHlfZnJvbV9zb2NrcHRyKCZhbXA7bWlmaSwgb3B0dmFsLCBzaXplb2YobWlmaV90KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcnRubF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKCFtcnQpIHsKJiM0MzsJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQogCQlyZXQgPSBtaWY2X2RlbGV0ZShtcnQsIG1pZmksIDAsIE5VTEwpOwomIzQzOwkJaWYgKCFyZXQpCiYjNDM7CQkJaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpOwogCQlydG5sX3VubG9jaygpOwogCQlyZXR1cm4gcmV0OwogCkBAIC0xNzgzLDE3ICYjNDM7MTk2NSwzOSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCWlmIChwYXJlbnQgPT0gMCkKIAkJCXBhcmVudCA9IG1mYy5tZjZjY19wYXJlbnQ7CiAKLQkJbXV0ZXhfbG9jaygmYW1wO25ldC0mZ3Q7aXB2Ni5tZmNfbXV0ZXgpOwomIzQzOwkJcnRubF9sb2NrKCk7CiYjNDM7CQlpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpIHsKJiM0MzsJCQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJCWlmICghbXJ0KSB7CiYjNDM7CQkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJYm9vbCBuZXdfdGFibGUgPSBmYWxzZTsKIAotCQlpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpCi0JCQlyZXQgPSBpcDZtcl9tZmNfZGVsZXRlKG1ydCwgJmFtcDttZmMsIHBhcmVudCk7Ci0JCWVsc2UKJiM0MzsJCQltcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssICZhbXA7bmV3X3RhYmxlKTsKJiM0MzsJCQlpZiAoSVNfRVJSKG1ydCkpIHsKJiM0MzsJCQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQkJcmV0dXJuIFBUUl9FUlIobXJ0KTsKJiM0MzsJCQl9CiYjNDM7CQkJaXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpOwomIzQzOwkJCW11dGV4X2xvY2soJmFtcDtuZXQtJmd0O2lwdjYubWZjX211dGV4KTsKIAkJCXJldCA9IGlwNm1yX21mY19hZGQobmV0LCBtcnQsICZhbXA7bWZjLAogCQkJCQkgICAgc2sgPT0KIAkJCQkJICAgIHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zayksCiAJCQkJCSAgICBwYXJlbnQpOwomIzQzOwkJCW11dGV4X3VubG9jaygmYW1wO25ldC0mZ3Q7aXB2Ni5tZmNfbXV0ZXgpOwomIzQzOwkJCXJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7CiYjNDM7CQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQogCiYjNDM7CQltdXRleF9sb2NrKCZhbXA7bmV0LSZndDtpcHY2Lm1mY19tdXRleCk7CiYjNDM7CQlyZXQgPSBpcDZtcl9tZmNfZGVsZXRlKG1ydCwgJmFtcDttZmMsIHBhcmVudCk7CiAJCW11dGV4X3VubG9jaygmYW1wO25ldC0mZ3Q7aXB2Ni5tZmNfbXV0ZXgpOwomIzQzOwkJaWYgKCFyZXQpCiYjNDM7CQkJaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpOwomIzQzOwkJcnRubF91bmxvY2soKTsKIAkJcmV0dXJuIHJldDsKIAogCWNhc2UgTVJUNl9GTFVTSDoKQEAgLTE4MDcsOCAmIzQzOzIwMTEsMTQgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJcnRubF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKCFtcnQpIHsKJiM0MzsJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQogCQltcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgZmxhZ3MsICZhbXA7ZGV2X2tpbGxfbGlzdCk7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX21hbnkoJmFtcDtkZXZfa2lsbF9saXN0KTsKJiM0MzsJCWlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTsKIAkJcnRubF91bmxvY2soKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTgyNCw3ICYjNDM7MjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGNvcHlfZnJvbV9zb2NrcHRyKCZhbXA7diwgb3B0dmFsLCBzaXplb2YodikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CQlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKCFtcnQpIHsKJiM0MzsJCQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJCX0KIAkJV1JJVEVfT05DRShtcnQtJmd0O21yb3V0ZV9kb19hc3NlcnQsIHYpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTg0Miw2ICYjNDM7MjA1OSwxMSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCWRvX3dybWlmd2hvbGUgPSAodiA9PSBNUlQ2TVNHX1dSTUlGV0hPTEUpOwogCQl2ID0gISF2OwogCQlydG5sX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiAJCXJldCA9IDA7CiAJCWlmICh2ICE9IG1ydC0mZ3Q7bXJvdXRlX2RvX3BpbSkgewogCQkJV1JJVEVfT05DRShtcnQtJmd0O21yb3V0ZV9kb19waW0sIHYpOwpAQCAtMTg2NSwxOCAmIzQzOzIwODcsMTYgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQkvKiAmIzM0O3BpbTZyZWcldSYjMzQ7IHNob3VsZCBub3QgZXhjZWVkIDE2IGJ5dGVzIChJRk5BTVNJWikgKi8KIAkJaWYgKHYgIT0gUlRfVEFCTEVfREVGQVVMVCAmYW1wOyZhbXA7IHYgJmd0Oz0gMTAwMDAwMDAwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChzayA9PSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LSZndDttcm91dGVfc2spKQomIzQzOwkJcmN1X3JlYWRfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJCWlmIChtcnQgJmFtcDsmYW1wOyBzayA9PSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LSZndDttcm91dGVfc2spKSB7CiYjNDM7CQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJfQomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJcnRubF9sb2NrKCk7Ci0JCXJldCA9IDA7Ci0JCW1ydCA9IGlwNm1yX25ld190YWJsZShuZXQsIHYpOwotCQlpZiAoSVNfRVJSKG1ydCkpCi0JCQlyZXQgPSBQVFJfRVJSKG1ydCk7Ci0JCWVsc2UKLQkJCXJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA9IHY7Ci0JCXJ0bmxfdW5sb2NrKCk7Ci0JCXJldHVybiByZXQ7CiYjNDM7CQlyYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPSB2OwomIzQzOwkJcmV0dXJuIDA7CiAJfQogI2VuZGlmCiAJLyoKQEAgLTE4OTcsMTYgJiM0MzsyMTE3LDE4IEBAIGludCBpcDZfbXJvdXRlX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIHsKIAlpbnQgb2xyOwogCWludCB2YWw7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCXN0cnVjdCBtcl90YWJsZSAqbXJ0OwogCiAJaWYgKHNrLSZndDtza190eXBlICE9IFNPQ0tfUkFXIHx8CiAJICAgIGluZXRfc2soc2spLSZndDtpbmV0X251bSAhPSBJUFBST1RPX0lDTVBWNikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7Ci0JaWYgKCFtcnQpCiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJaWYgKCFtcnQpIHsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJfQogCiAJc3dpdGNoIChvcHRuYW1lKSB7CiAJY2FzZSBNUlQ2X1ZFUlNJT046CkBAIC0xOTIxLDggJiM0MzsyMTQzLDEwIEBAIGludCBpcDZfbXJvdXRlX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJdmFsID0gUkVBRF9PTkNFKG1ydC0mZ3Q7bXJvdXRlX2RvX2Fzc2VydCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwogCiAJaWYgKGNvcHlfZnJvbV9zb2NrcHRyKCZhbXA7b2xyLCBvcHRsZW4sIHNpemVvZihpbnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xOTQ3LDIwICYjNDM7MjE3MSwyMyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpCiAJc3RydWN0IHNpb2NfbWlmX3JlcTYgKnZyOwogCXN0cnVjdCB2aWZfZGV2aWNlICp2aWY7CiAJc3RydWN0IG1mYzZfY2FjaGUgKmM7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCXN0cnVjdCBtcl90YWJsZSAqbXJ0OwogCi0JbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7Ci0JaWYgKCFtcnQpCiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJaWYgKCFtcnQpIHsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJfQogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHRVRNSUZDTlRfSU42OgogCQl2ciA9IChzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqKWFyZzsKLQkJaWYgKHZyLSZndDttaWZpICZndDs9IG1ydC0mZ3Q7bWF4dmlmKQomIzQzOwkJaWYgKHZyLSZndDttaWZpICZndDs9IG1ydC0mZ3Q7bWF4dmlmKSB7CiYjNDM7CQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCX0KIAkJdnItJmd0O21pZmkgPSBhcnJheV9pbmRleF9ub3NwZWModnItJmd0O21pZmksIG1ydC0mZ3Q7bWF4dmlmKTsKLQkJcmN1X3JlYWRfbG9jaygpOwogCQl2aWYgPSAmYW1wO21ydC0mZ3Q7dmlmX3RhYmxlW3ZyLSZndDttaWZpXTsKIAkJaWYgKFZJRl9FWElTVFMobXJ0LCB2ci0mZ3Q7bWlmaSkpIHsKIAkJCXZyLSZndDtpY291bnQgPSBSRUFEX09OQ0UodmlmLSZndDtwa3RfaW4pOwpAQCAtMTk3NCw4ICYjNDM7MjIwMSw2IEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZykKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCWNhc2UgU0lPQ0dFVFNHQ05UX0lONjoKIAkJc3IgPSAoc3RydWN0IHNpb2Nfc2dfcmVxNiAqKWFyZzsKLQotCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgJmFtcDtzci0mZ3Q7c3JjLnNpbjZfYWRkciwKIAkJCQkgICAgICZhbXA7c3ItJmd0O2dycC5zaW42X2FkZHIpOwogCQlpZiAoYykgewpAQCAtMTk4OCw2ICYjNDM7MjIxMyw3IEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZykKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIAlkZWZhdWx0OgomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQogfQpAQCAtMjAxNSwyMSAmIzQzOzIyNDEsMjMgQEAgaW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiAJc3RydWN0IGNvbXBhdF9zaW9jX21pZl9yZXE2IHZyOwogCXN0cnVjdCB2aWZfZGV2aWNlICp2aWY7CiAJc3RydWN0IG1mYzZfY2FjaGUgKmM7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCXN0cnVjdCBtcl90YWJsZSAqbXJ0OwogCi0JbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7Ci0JaWYgKCFtcnQpCi0JCXJldHVybiAtRU5PRU5UOwotCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHRVRNSUZDTlRfSU42OgogCQlpZiAoY29weV9mcm9tX3VzZXIoJmFtcDt2ciwgYXJnLCBzaXplb2YodnIpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAodnIubWlmaSAmZ3Q7PSBtcnQtJmd0O21heHZpZikKJiM0MzsJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQomIzQzOwkJaWYgKHZyLm1pZmkgJmd0Oz0gbXJ0LSZndDttYXh2aWYpIHsKJiM0MzsJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJfQogCQl2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC0mZ3Q7bWF4dmlmKTsKLQkJcmN1X3JlYWRfbG9jaygpOwogCQl2aWYgPSAmYW1wO21ydC0mZ3Q7dmlmX3RhYmxlW3ZyLm1pZmldOwogCQlpZiAoVklGX0VYSVNUUyhtcnQsIHZyLm1pZmkpKSB7CiAJCQl2ci5pY291bnQgPSBSRUFEX09OQ0UodmlmLSZndDtwa3RfaW4pOwpAQCAtMjA0OSw2ICYjNDM7MjI3NywxMSBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQogCQljID0gaXA2bXJfY2FjaGVfZmluZChtcnQsICZhbXA7c3Iuc3JjLnNpbjZfYWRkciwgJmFtcDtzci5ncnAuc2luNl9hZGRyKTsKIAkJaWYgKGMpIHsKIAkJCXNyLnBrdGNudCA9IGF0b21pY19sb25nX3JlYWQoJmFtcDtjLSZndDtfYy5tZmNfdW4ucmVzLnBrdCk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2NTQKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAzODMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgRnV6emluZyBTdHJhdGVneSBmb3IgVGhpcyBJUHY2IE11bHRpY2FzdCBSb3V0aW5nIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBtb2RpZnlpbmcgYG5ldC9pcHY2L2lwNm1yLmNgIOKAkyBpdCYjMzk7cyBhbGwgYWJvdXQgSVB2NiBtdWx0aWNhc3Qgcm91dGluZywgYW5kIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBvcHRpbWFsIGZ1enppbmcgYXBwcm9hY2guIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgaXMgYWJzb2x1dGVseSBXb3J0aEZ1enppbmcuIFRoZSBjaGFuZ2VzIGFyZSBxdWl0ZSBzaWduaWZpY2FudCwgdG91Y2hpbmcgb24gY3J1Y2lhbCBhcmVhcyBsaWtlIHRhYmxlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiwgZHluYW1pYyBhbGxvY2F0aW9uLCBzZXRzb2Nrb3B0L2dldHNvY2tvcHQvaW9jdGwgaGFuZGxpbmcsIGFuZCB0aGUgaW50cm9kdWN0aW9uIG9mIHdvcmtxdWV1ZXMgYW5kIHRpbWVycy4gVGhpcyBzY3JlYW1zIHBvdGVudGlhbCBmb3IgaW50ZXJlc3RpbmcgYnVncy4KClNwZWNpZmljYWxseSwgdGhlIHBhdGNoIHNlZW1zIHRvIG92ZXJoYXVsIGhvdyBgbXJfdGFibGVzYCBhcmUgaGFuZGxlZC4gV2UmIzM5O3JlIHNlZWluZyBkeW5hbWljIGNyZWF0aW9uLCBkZWxheWVkIHB1Ymxpc2hpbmcsIGFuZCBkZXN0cnVjdGlvbiDigJMgdGhhdCYjMzk7cyBhIHJlZCBmbGFnIGZvciByYWNlIGNvbmRpdGlvbnMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IGlzc3Vlcywgd2hpY2ggYXJlIGFsd2F5cyBwcmltZSB0YXJnZXRzLiBJIHNlZSBjaGFuZ2VzIGluIHRoZSBoYW5kbGluZyBvZiBNUlQ2XyosIFNJT0NHRVRNSUZDTlRfSU42LCBhbmQgU0lPQ0dFVFNHQ05UX0lONiB2aWEgc2V0c29ja29wdC9nZXRzb2Nrb3B0L2lvY3RsLCBhbmQgdGhlIGBpcG1yX2V4cGlyZV9wcm9jZXNzYCwgYGlwNm1yX2RldmljZV9ldmVudGAsIGBpcDZtcl9za19pbml0YCwgYW5kIGBpcDZtcl9za19kb25lYCBmdW5jdGlvbnMgYXJlIGFsbCBpbiB0aGUgbWl4IHRvby4gV29ya3F1ZXVlcyAoYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCkgYW5kIHRpbWVycyBhbHNvIGdldCB0aHJvd24gaW4uIFRoYXQmIzM5O3MgYSBnb29kIG1peCBvZiBwb3RlbnRpYWwgZnV6eiB0YXJnZXRzLgoKVGhlIGdvb2QgbmV3cyBpcywgdGhpcyBzaG91bGQgYmUgcmVhY2hhYmxlIGluIGEgc3RhbmRhcmQgc3l6a2FsbGVyIC8gUUVNVSBzZXR1cC4gSVB2NiBtdWx0aWNhc3Qgcm91dGluZyBpcyBjb3JlIG5ldHdvcmtpbmcgY29kZSwgYWNjZXNzaWJsZSB2aWEgcmF3IHNvY2tldHMgKElQUFJPVE9fSUNNUFY2LCBldGMuKSBhbmQgdGhvc2Ugc2V0c29ja29wdC9pb2N0bCBjYWxscy4gVGhhdCBtYWtlcyBpdCBlYXNpZXIgdG8gdGFyZ2V0IGFuZCB0ZXN0LiBHaXZlbiB0aGUgbW9kaWZpY2F0aW9ucywgSSYjMzk7bGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byBsb2NraW5nIG1lY2hhbmlzbXMsIHRhYmxlIGxpZmVjeWNsZSBtYW5hZ2VtZW50LCBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZywgaG93IHRoZSB0aW1lcnMgYW5kIHdvcmtxdWV1ZXMgaW50ZXJhY3QsIGFuZCB0aGUgaGFuZGxpbmcgb2YgbmV0ZGV2IG5vdGlmaWVyIGV2ZW50cy4KCk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgYW55IG5lY2Vzc2FyeSBLY29uZmlnIGRlcGVuZGVuY2llcyB0byBnZXQgdGhlIHJlbGV2YW50IGNvZGUgZW5hYmxlZC4gSSYjMzk7bGwgdXNlIGBncmVwcGVyYCB0byBxdWlja2x5IHNjYW4gYG5ldC9pcHY2L0tjb25maWdgIGFuZCBgbmV0L2lwdjYvTWFrZWZpbGVgIHRvIGlkZW50aWZ5IGFueSByZXF1aXJlZCBjb25maWd1cmF0aW9ucy4gVGhpcyB3aWxsIGd1aWRlIG15IHN5emthbGxlciBjb25maWd1cmF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR19JUFY2X01ST1VURSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9pcHY2JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9pcHY2L01ha2VmaWxlPTE1PWlwdjYtJChDT05GSUdfU1lTQ1RMKSAmIzQzOz0gc3lzY3RsX25ldF9pcHY2Lm9cbm5ldC9pcHY2L01ha2VmaWxlOjE2OmlwdjYtJChDT05GSUdfSVBWNl9NUk9VVEUpICYjNDM7PSBpcDZtci5vXG5uZXQvaXB2Ni9NYWtlZmlsZS0xNy1cbi0tXG5uZXQvaXB2Ni9hZGRyY29uZi5jPTUwOD1zdGF0aWMgaW50IGluZXQ2X25ldGNvbmZfbXNnc2l6ZV9kZXZjb25mKGludCB0eXBlKVxuLS1cbm5ldC9pcHY2L2FkZHJjb25mLmMtNTE4LVx0XHRzaXplICYjNDM7PSBubGFfdG90YWxfc2l6ZSg0KTtcbm5ldC9pcHY2L2FkZHJjb25mLmM6NTE5OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcbm5ldC9pcHY2L2FkZHJjb25mLmMtNTIwLVx0aWYgKGFsbCB8fCB0eXBlID09IE5FVENPTkZBX01DX0ZPUldBUkRJTkcpXG4tLVxubmV0L2lwdjYvYWRkcmNvbmYuYz01MzI9c3RhdGljIGludCBpbmV0Nl9uZXRjb25mX2ZpbGxfZGV2Y29uZihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaWZpbmRleCxcbi0tXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU2MS1cdFx0Z290byBubGFfcHV0X2ZhaWx1cmU7XG5uZXQvaXB2Ni9hZGRyY29uZi5jOjU2MjojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU2My1cdGlmICgoYWxsIHx8IHR5cGUgPT0gTkVUQ09ORkFfTUNfRk9SV0FSRElORykgXHUwMDI2XHUwMDI2XG4tLVxubmV0L2lwdjYvYWRkcmNvbmYuYz01NjY0PXN0YXRpYyB2b2lkIGlwdjZfc3RvcmVfZGV2Y29uZihjb25zdCBzdHJ1Y3QgaXB2Nl9kZXZjb25mICpjbmYsXG4tLVxubmV0L2lwdjYvYWRkcmNvbmYuYy01NzE3LSNlbmRpZlxubmV0L2lwdjYvYWRkcmNvbmYuYzo1NzE4OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcbm5ldC9pcHY2L2FkZHJjb25mLmMtNTcxOS1cdGFycmF5W0RFVkNPTkZfTUNfRk9SV0FSRElOR10gPSBhdG9taWNfcmVhZChcdTAwMjZjbmYtXHUwMDNlbWNfZm9yd2FyZGluZyk7XG4tLVxubmV0L2lwdjYvYWRkcmNvbmYuYz02ODQ5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIGFkZHJjb25mX3N5c2N0bFtdID0ge1xuLS1cbm5ldC9pcHY2L2FkZHJjb25mLmMtNzExNy0jZW5kaWZcbm5ldC9pcHY2L2FkZHJjb25mLmM6NzExODojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTcxMTktXHR7XG4tLVxubmV0L2lwdjYvaXA2X2lucHV0LmM9NTU0PWludCBpcDZfbWNfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvaXB2Ni9pcDZfaW5wdXQuYy01NzYtXG5uZXQvaXB2Ni9pcDZfaW5wdXQuYzo1Nzc6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURVxubmV0L2lwdjYvaXA2X2lucHV0LmMtNTc4LVx0Lypcbi0tXG5uZXQvaXB2Ni9pcDZtci5jPTEwNj1zdGF0aWMgdm9pZCBpcG1yX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCB0aW1lcl9saXN0ICp0KTtcbm5ldC9pcHY2L2lwNm1yLmMtMTA3LVxubmV0L2lwdjYvaXA2bXIuYzoxMDg6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbm5ldC9pcHY2L2lwNm1yLmMtMTA5LSNkZWZpbmUgaXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpIFxcXG4tLVxubmV0L2lwdjYvaXA2bXIuYz0zOTc9c3RhdGljIHZvaWQgaXA2bXJfbmV3X3RhYmxlX3NldChzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTM5OS17XG5uZXQvaXB2Ni9pcDZtci5jOjQwMDojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xubmV0L2lwdjYvaXA2bXIuYy00MDEtXHRsaXN0X2FkZF90YWlsX3JjdShcdTAwMjZtcnQtXHUwMDNlbGlzdCwgXHUwMDI2bmV0LVx1MDAzZWlwdjYubXI2X3RhYmxlcyk7XG4tLVxubmV0L2lwdjYvaXA2bXIuYz00NTk9c3RhdGljIHZvaWQgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydClcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTQ2Mi1cbm5ldC9pcHY2L2lwNm1yLmM6NDYzOiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG5uZXQvaXB2Ni9pcDZtci5jLTQ2NC1cdGlmIChtcnQtXHUwMDNlaWQgPT0gUlQ2X1RBQkxFX0RGTFQpXG4tLVxubmV0L2lwdjYvaXA2bXIuYy00ODYtXG5uZXQvaXB2Ni9pcDZtci5jOjQ4NzojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xubmV0L2lwdjYvaXA2bXIuYy00ODgtc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XG4tLVxubmV0L2lwdjYvaXA2bXIuYz0xNDIyPXN0YXRpYyBpbnQgaXA2bXJfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcyxcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTE0MjYtXHRzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7XG5uZXQvaXB2Ni9pcDZtci5jOjE0Mjc6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbm5ldC9pcHY2L2lwNm1yLmMtMTQyOC1cdHN0cnVjdCBtcl90YWJsZSAqbXJ0LCAqbmV4dDtcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTE0MzctXG5uZXQvaXB2Ni9pcDZtci5jOjE0Mzg6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbm5ldC9pcHY2L2lwNm1yLmMtMTQzOS1cdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtcnQsIG5leHQsIFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1yNl90YWJsZXMsIGxpc3QpXG4tLVxubmV0L2lwdjYvaXA2bXIuYz0xODYxPWludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTIwNzctI2VuZGlmXG5uZXQvaXB2Ni9pcDZtci5jOjIwNzg6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbm5ldC9pcHY2L2lwNm1yLmMtMjA3OS1cdGNhc2UgTVJUNl9UQUJMRTpcbi0tXG5uZXQvaXB2Ni9yYXcuYz0xMTI2PXN0YXRpYyBpbnQgcmF3djZfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCBpbnQgKmthcmcpXG4tLVxubmV0L2lwdjYvcmF3LmMtMTE0Ni1cdGRlZmF1bHQ6XG5uZXQvaXB2Ni9yYXcuYzoxMTQ3OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcbm5ldC9pcHY2L3Jhdy5jLTExNDgtXHRcdHJldHVybiBpcDZtcl9pb2N0bChzaywgY21kLCBrYXJnKTtcbi0tXG5uZXQvaXB2Ni9yYXcuYz0xMTU2PXN0YXRpYyBpbnQgY29tcGF0X3Jhd3Y2X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxubmV0L2lwdjYvcmF3LmMtMTE2Mi1cdGRlZmF1bHQ6XG5uZXQvaXB2Ni9yYXcuYzoxMTYzOiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcbm5ldC9pcHY2L3Jhdy5jLTExNjQtXHRcdHJldHVybiBpcDZtcl9jb21wYXRfaW9jdGwoc2ssIGNtZCwgY29tcGF0X3B0cihhcmcpKTtcbi0tXG5uZXQvaXB2Ni9yb3V0ZS5jPTU3ODc9c3RhdGljIGludCBydDZfZmlsbF9ub2RlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvaXB2Ni9yb3V0ZS5jLTU4NTItXHRpZiAoaWlmKSB7XG5uZXQvaXB2Ni9yb3V0ZS5jOjU4NTM6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURVxubmV0L2lwdjYvcm91dGUuYy01ODU0LVx0XHRpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdChcdTAwMjZydDZfZHN0LVx1MDAzZWFkZHIpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIyODkKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBJUHY2IE11bHRpY2FzdCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIElQdjYgbXVsdGljYXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIG5hdmlnYXRlIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBmaWxlcywgc3BlY2lmaWNhbGx5IGBuZXQvaXB2Ni9LY29uZmlnYC4gVGhhdCYjMzk7cyB0aGUgbG9naWNhbCBwbGFjZSB0byBzdGFydCBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMgb2YgYW55dGhpbmcgcmVsYXRlZCB0byBJUHY2LiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGFueXRoaW5nIHJlbGF0ZWQgdG8gYElQVjZfTVJPVVRFYCwgYXMgdGhhdCYjMzk7cyBteSBmb2NhbCBwb2ludC4gSSBmaWd1cmUgYnkgZXhhbWluaW5nIHRoZSBgS2NvbmZpZ2AgZmlsZSBhbmQgdGhlIHN1cnJvdW5kaW5nIGNvZGUgSSYjMzk7bGwgZmluZCB0aGUgc3BlY2lmaWMgY29uZmlnIG5hbWVzLCBkZXBlbmRlbmNpZXMsIGFuZCByZWxhdGlvbnNoaXBzIGJldHdlZW4gdmFyaW91cyBJUHY2IG11bHRpY2FzdCBmZWF0dXJlcy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFuZCBob3cgdGhleSBpbnRlcmFjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtJUFY2X01ST1VURSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9pcHY2L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2lwdjYvS2NvbmZpZz0yNDM9Y29uZmlnIElQVjZfU1VCVFJFRVNcbi0tXG5uZXQvaXB2Ni9LY29uZmlnLTI1Ni1cbm5ldC9pcHY2L0tjb25maWc6MjU3OmNvbmZpZyBJUFY2X01ST1VURVxubmV0L2lwdjYvS2NvbmZpZy0yNTgtXHRib29sIFwmIzM0O0lQdjY6IG11bHRpY2FzdCByb3V0aW5nXCYjMzQ7XG4tLVxubmV0L2lwdjYvS2NvbmZpZy0yNjQtXG5uZXQvaXB2Ni9LY29uZmlnOjI2NTpjb25maWcgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG5uZXQvaXB2Ni9LY29uZmlnLTI2Ni1cdGJvb2wgXCYjMzQ7SVB2NjogbXVsdGljYXN0IHBvbGljeSByb3V0aW5nXCYjMzQ7XG5uZXQvaXB2Ni9LY29uZmlnOjI2NzpcdGRlcGVuZHMgb24gSVBWNl9NUk9VVEVcbm5ldC9pcHY2L0tjb25maWctMjY4LVx0c2VsZWN0IEZJQl9SVUxFU1xuLS1cbm5ldC9pcHY2L0tjb25maWc9Mjc5PWNvbmZpZyBJUFY2X1BJTVNNX1YyXG5uZXQvaXB2Ni9LY29uZmlnLTI4MC1cdGJvb2wgXCYjMzQ7SVB2NjogUElNLVNNIHZlcnNpb24gMiBzdXBwb3J0XCYjMzQ7XG5uZXQvaXB2Ni9LY29uZmlnOjI4MTpcdGRlcGVuZHMgb24gSVBWNl9NUk9VVEVcbm5ldC9pcHY2L0tjb25maWctMjgyLVx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNzg5CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gSVB2NiBDb25maWd1cmF0aW9uKioKCk9rYXksIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBJUHY2IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gTXkgaW5zdGluY3QgaXMgdG8gaGVhZCBzdHJhaWdodCB0byB0aGUgc291cmNlLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGNoZWNrIHRoZSBgcmVhZC1maWxlYCBpbiB0aGUgYG5ldC9pcHY2L0tjb25maWdgIGZpbGUsIGZvY3VzaW5nIG9uIHRoZSBsaW5lcyBiZXR3ZWVuIDI1MCBhbmQgMjkwLiBUaGF0JiMzOTtzIHVzdWFsbHkgd2hlcmUgdGhlIG1lYXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGFuZCBkZXBlbmRlbmNpZXMgYXJlIGRlZmluZWQuIFRoaXMgd2lsbCBnaXZlIG1lIHRoZSBtb3N0IGRpcmVjdCBhbmQgcmVsaWFibGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCYjMzk7cyBhdmFpbGFibGUgYW5kIGhvdyB0aGV5IGludGVyYWN0LiBUaGlzIGFwcHJvYWNoIHNob3VsZCBvZmZlciBhIGdvb2Qgb3ZlcnZpZXcgb2YgdGhlIHJlbGV2YW50IEtjb25maWcgb3B0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9pcHY2L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI1MDpcdFx0ICBub3JtYWwgYW5kIHNvdXJjZSBwcmVmaXggc3BlY2lmaWMgcm91dGVzIGluIHRoZSBzYW1lIHJvdXRpbmcgdGFibGVcbiAyNTE6XHRcdCAgbWF5IHNvbWV0aW1lcyBsZWFkIHRvIHVuaW50ZW5kZWQgcm91dGluZyBiZWhhdmlvci4gIFRoaXMgY2FuIGJlXG4gMjUyOlx0XHQgIGF2b2lkZWQgYnkgZGVmaW5pbmcgZGlmZmVyZW50IHJvdXRpbmcgdGFibGVzIGZvciB0aGUgbm9ybWFsIGFuZFxuIDI1MzpcdFx0ICBzb3VyY2UgcHJlZml4IHNwZWNpZmljIHJvdXRlcy5cbiAyNTQ6XHRcbiAyNTU6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAyNTY6XHRcbiAyNTc6XHRjb25maWcgSVBWNl9NUk9VVEVcbiAyNTg6XHRcdGJvb2wgXCYjMzQ7SVB2NjogbXVsdGljYXN0IHJvdXRpbmdcJiMzNDtcbiAyNTk6XHRcdGRlcGVuZHMgb24gSVBWNlxuIDI2MDpcdFx0c2VsZWN0IElQX01ST1VURV9DT01NT05cbiAyNjE6XHRcdGhlbHBcbiAyNjI6XHRcdCAgU3VwcG9ydCBmb3IgSVB2NiBtdWx0aWNhc3QgZm9yd2FyZGluZy5cbiAyNjM6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAyNjQ6XHRcbiAyNjU6XHRjb25maWcgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4gMjY2Olx0XHRib29sIFwmIzM0O0lQdjY6IG11bHRpY2FzdCBwb2xpY3kgcm91dGluZ1wmIzM0O1xuIDI2NzpcdFx0ZGVwZW5kcyBvbiBJUFY2X01ST1VURVxuIDI2ODpcdFx0c2VsZWN0IEZJQl9SVUxFU1xuIDI2OTpcdFx0aGVscFxuIDI3MDpcdFx0ICBOb3JtYWxseSwgYSBtdWx0aWNhc3Qgcm91dGVyIHJ1bnMgYSB1c2Vyc3BhY2UgZGFlbW9uIGFuZCBkZWNpZGVzXG4gMjcxOlx0XHQgIHdoYXQgdG8gZG8gd2l0aCBhIG11bHRpY2FzdCBwYWNrZXQgYmFzZWQgb24gdGhlIHNvdXJjZSBhbmRcbiAyNzI6XHRcdCAgZGVzdGluYXRpb24gYWRkcmVzc2VzLiBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIG11bHRpY2FzdCByb3V0ZXJcbiAyNzM6XHRcdCAgd2lsbCBhbHNvIGJlIGFibGUgdG8gdGFrZSBpbnRlcmZhY2VzIGFuZCBwYWNrZXQgbWFya3MgaW50b1xuIDI3NDpcdFx0ICBhY2NvdW50IGFuZCBydW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHVzZXJzcGFjZSBkYWVtb25zXG4gMjc1Olx0XHQgIHNpbXVsdGFuZW91c2x5LCBlYWNoIG9uZSBoYW5kbGluZyBhIHNpbmdsZSB0YWJsZS5cbiAyNzY6XHRcbiAyNzc6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAyNzg6XHRcbiAyNzk6XHRjb25maWcgSVBWNl9QSU1TTV9WMlxuIDI4MDpcdFx0Ym9vbCBcJiMzNDtJUHY2OiBQSU0tU00gdmVyc2lvbiAyIHN1cHBvcnRcJiMzNDtcbiAyODE6XHRcdGRlcGVuZHMgb24gSVBWNl9NUk9VVEVcbiAyODI6XHRcdGhlbHBcbiAyODM6XHRcdCAgU3VwcG9ydCBmb3IgSVB2NiBQSU0gbXVsdGljYXN0IHJvdXRpbmcgcHJvdG9jb2wgUElNLVNNdjIuXG4gMjg0Olx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4gMjg1Olx0XG4gMjg2Olx0Y29uZmlnIElQVjZfU0VHNl9MV1RVTk5FTFxuIDI4NzpcdFx0Ym9vbCBcJiMzNDtJUHY2OiBTZWdtZW50IFJvdXRpbmcgSGVhZGVyIGVuY2Fwc3VsYXRpb24gc3VwcG9ydFwmIzM0O1xuIDI4ODpcdFx0ZGVwZW5kcyBvbiBJUFY2XG4gMjg5Olx0XHRzZWxlY3QgTFdUVU5ORUxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU4OQoJCQkJCQkJb3V0cHV0OiAyMzQKCQkJCQkJCXRob3VnaHRzOiA5NzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIElQdjYgTXVsdGljYXN0IFJvdXRpbmcgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgc2VlIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBwYXRjaCByZWxhdGVkIHRvIElQdjYgbXVsdGljYXN0IHJvdXRpbmcsIGluZGljYXRlZCBieSB0aGUga2V5IHN5bWJvbHMgYElQVjZfTVJPVVRFYCBhbmQgYElQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU2AuIFRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBgI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNgIGJsb2NrcyBmb3IgdGhpbmdzIGxpa2UgdGFibGUgZGVzdHJ1Y3Rpb24gYW5kIGBNUlQ2X1RBQkxFYCBgc2V0c29ja29wdGAgdXNhZ2UgaW1tZWRpYXRlbHkgZmxhZ3MgdGhhdCB0aGlzIGlzbiYjMzk7dCBhIHRyaXZpYWwgY2hhbmdlLiBXZSBhcmUgZGVmaW5pdGVseSB3b3JraW5nIHdpdGggc29tZSBuZXcgbG9naWMgZm9yIG11bHRpcGxlIHRhYmxlcyBoZXJlLCB3aGljaCBtZWFucyB3ZSBoYXZlIHRvIGRpdmUgYSBsaXR0bGUgZGVlcGVyLiBPZiBjb3Vyc2UsIGBJUFY2YCBpcyBhbHNvIGEgY3JpdGljYWwgY29uZmlnLgoKTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUuIExldCYjMzk7cyBsb29rIGF0IHRoZSBmdW5jdGlvbnMgYWRkZWQgb3IgbW9kaWZpZWQ6IGEgbGlzdCBvZiBmdW5jdGlvbnMsIGJvdGggc3RhdGljIGFuZCBleHBvcnRlZC4gSSBzZWUgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCB0YWJsZSBsb29rdXAsIGFsbG9jYXRpb24sIHB1Ymxpc2hpbmcsIGFuZCBkZXN0cnVjdGlvbiAocG90ZW50aWFsbHkgZGVsYXllZCB2aWEgYSB3b3JrcXVldWUgd2hpY2ggaXMgdmVyeSBpbnRlcmVzdGluZyBmb3IgY29uY3VycmVuY3kpLCBhbG9uZyB3aXRoIHRpbWVyIGFuZCBub3RpZmllciBjYWxsYmFja3MuIENyaXRpY2FsbHksIEkgaGF2ZSB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZXNlOiBgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0YCwgYGlwNl9tcm91dGVfZ2V0c29ja29wdGAsIGBpcDZtcl9pb2N0bGAsIGBpcDZtcl9jb21wYXRfaW9jdGxgLCBhbmQgYGlwNm1yX3NrX2RvbmVgIGFzIHRoZXNlIHJlcHJlc2VudCB0aGUgdXNlci1zcGFjZSBpbnRlcmZhY2UuIFRoZXkgYXJlIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgdGhlIGVudHJ5cG9pbnRzLiBgaXA2bXJfZGV2aWNlX2V2ZW50YCwgYGlwbXJfZXhwaXJlX3Byb2Nlc3NgLCBgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgLCBhbmQgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCBhcmUga2V5IGFzIHdlbGwsIGFzIHRoZXNlIGFyZSB0aGUgY29yZSBpbnRlcm5hbCBmdW5jdGlvbnMuCgpBIHF1aWNrIGNoZWNrIGNvbmZpcm1zIHRoYXQgb25seSBgbmV0L2lwdjYvaXA2bXIuY2AgaGFzIGJlZW4gbW9kaWZpZWQuIFRoYXQmIzM5O3MgZ29vZCwga2VlcHMgdGhlIGZvY3VzIHNvbWV3aGF0IG1hbmFnZWFibGUuCgpBbHJpZ2h0LCB3aGF0IHN5bWJvbHMgYXJlIGFic29sdXRlbHkgY3JpdGljYWw/IGBpcDZfbXJvdXRlX3NldHNvY2tvcHRgLCBgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0YCwgYGlwNm1yX2lvY3RsYCwgYGlwNm1yX2NvbXBhdF9pb2N0bGAsIGBpcDZtcl9za19kb25lYCwgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAsIGBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlYCwgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCwgYGlwNm1yX2RldmljZV9ldmVudGAsIGFuZCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AgYXJlIHRoZSBvbmVzIHRvIGZvY3VzIG9uLiBUaGV5IGFyZSBzcGVjaWZpYyB0byBJUHY2IG11bHRpY2FzdCByb3V0aW5nIChgaXA2bXJgKSwgYW5kIG5vdCB1YmlxdWl0b3VzLCBzbyB0aGF0IHJlZHVjZXMgdGhlIGNoYW5jZSBvZiBjb25mbGljdHMgd2l0aCBvdGhlciBmdW5jdGlvbnMuCgpGb3IgdGhlIGNvbmZpZ3VyYXRpb25zLCBgSVBWNmAsIGBJUFY2X01ST1VURWAsIGFuZCBgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTYCBhcmUgZXNzZW50aWFsIGZvciBlbmFibGluZyB0aGlzIGZ1bmN0aW9uYWxpdHkuCgpOb3csIGxldCYjMzk7cyBjb25maXJtIHRoZSBmdXp6aW5nIHN0cmF0ZWd5LiBUaGUgcGF0Y2gmIzM5O3MgaW1wYWN0IGlzIHNpZ25pZmljYW50OiBpdCBtb2RpZmllcyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQgaW4gYGlwNm1yLmNgLCBpbnRyb2R1Y2luZyBkeW5hbWljIHRhYmxlIGFsbG9jYXRpb24sIGRlbGF5ZWQgcHVibGlzaGluZywgYXN5bmNocm9ub3VzIHRhYmxlIGRlc3RydWN0aW9uIHZpYSB3b3JrcXVldWVzLCBhbmQgc2lnbmlmaWNhbnQgbW9kaWZpY2F0aW9ucyB0byBsb2NraW5nIGFuZCBsaWZlY3ljbGUgaGFuZGxpbmcgYWNyb3NzIHRoZSB1c2VyLXNwYWNlIGludGVyZmFjZSAoc2V0c29ja29wdCwgZ2V0c29ja29wdCwgaW9jdGxzKSBhbmQgaW50ZXJuYWwgbWVjaGFuaXNtcyBsaWtlIG5ldGRldiBldmVudCBub3RpZmljYXRpb24gYW5kIHRpbWVyIGV4cGlyYXRpb24uIFRoaXMgY29kZSBpcyBhbHNvIGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSB1c2VyIHNwYWNlIHZpYSByYXcgSVB2NiBzb2NrZXRzIGFuZCB0aGUgaW9jdGwvc2V0c29ja29wdCBzeXNjYWxscy4gRGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBUaGUgZ29hbCBvZiB0aGlzIGZ1enogaXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Uga2V5IGZ1bmN0aW9ucywgcGFydGljdWxhcmx5IHRoZSBvbmVzIHRoYXQgZGVhbCB3aXRoIHRoZSB1c2VyLXNwYWNlIGludGVyYWN0aW9uIGFuZCB0YWJsZSBtYW5hZ2VtZW50LCBhcmUgcm9idXN0IGFuZCBzZWN1cmUgYW5kIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gcmFjZSBjb25kaXRpb25zIG9yIG1lbW9yeSBlcnJvcnMgcHJlc2VudC4KClNvLCB0byBzdW1tYXJpemUsIHRoZSBgRm9jdXNTeW1ib2xzYCBhcmU6IGBpcDZfbXJvdXRlX3NldHNvY2tvcHRgLCBgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0YCwgYGlwNm1yX2lvY3RsYCwgYGlwNm1yX2NvbXBhdF9pb2N0bGAsIGBpcDZtcl9za19kb25lYCwgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAsIGBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlYCwgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCwgYGlwNm1yX2RldmljZV9ldmVudGAsIGFuZCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AuIFRoZSByZXF1aXJlZCBgRW5hYmxlQ29uZmlnc2AgYXJlOiBgSVBWNmAsIGBJUFY2X01ST1VURWAsIGFuZCBgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTYC4KClJlYWR5IHRvIHByb2NlZWQgd2l0aCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SVBWNiYjMzQ7LAogICAgJiMzNDtJUFY2X01ST1VURSYjMzQ7LAogICAgJiMzNDtJUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpcDZfbXJvdXRlX3NldHNvY2tvcHQmIzM0OywKICAgICYjMzQ7aXA2X21yb3V0ZV9nZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O2lwNm1yX2lvY3RsJiMzNDssCiAgICAmIzM0O2lwNm1yX2NvbXBhdF9pb2N0bCYjMzQ7LAogICAgJiMzNDtpcDZtcl9za19kb25lJiMzNDssCiAgICAmIzM0O2lwNm1yX2dldF9vcl9hbGxvY19za190YWJsZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlJiMzNDssCiAgICAmIzM0O2lwNm1yX2Rlc3Ryb3lfd29ya2ZuJiMzNDssCiAgICAmIzM0O2lwNm1yX2RldmljZV9ldmVudCYjMzQ7LAogICAgJiMzNDtpcG1yX2V4cGlyZV9wcm9jZXNzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIChpcDZtcikgdGFibGUgbGlmZWN5Y2xlIGFuZCBsb2NraW5nLiBJdCBhZGRzIGR5bmFtaWMgdGFibGUgYWxsb2NhdGlvbiwgYXN5bmNocm9ub3VzIHRhYmxlIGRlc3RydWN0aW9uIHZpYSB3b3JrcXVldWVzLCBhbmQgdXBkYXRlcyBzZXRzb2Nrb3B0LCBnZXRzb2Nrb3B0LCBpb2N0bCwgdGltZXIgZXhwaXJhdGlvbiwgYW5kIG5ldGRldiBub3RpZmllciBoYW5kbGluZy4gVGhlc2UgcGF0aHMgYXJlIGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHJhdyBJUHY2IHNvY2tldHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lQVjYmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEUmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aXA2X21yb3V0ZV9zZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O2lwNl9tcm91dGVfZ2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtpcDZtcl9pb2N0bCYjMzQ7LAogICAgJiMzNDtpcDZtcl9jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7aXA2bXJfc2tfZG9uZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUmIzM0OywKICAgICYjMzQ7aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXN0cm95X3dvcmtmbiYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXZpY2VfZXZlbnQmIzM0OywKICAgICYjMzQ7aXBtcl9leHBpcmVfcHJvY2VzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyAoaXA2bXIpIHRhYmxlIGxpZmVjeWNsZSBhbmQgbG9ja2luZy4gSXQgYWRkcyBkeW5hbWljIHRhYmxlIGFsbG9jYXRpb24sIGFzeW5jaHJvbm91cyB0YWJsZSBkZXN0cnVjdGlvbiB2aWEgd29ya3F1ZXVlcywgYW5kIHVwZGF0ZXMgc2V0c29ja29wdCwgZ2V0c29ja29wdCwgaW9jdGwsIHRpbWVyIGV4cGlyYXRpb24sIGFuZCBuZXRkZXYgbm90aWZpZXIgaGFuZGxpbmcuIFRoZXNlIHBhdGhzIGFyZSBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHZpYSByYXcgSVB2NiBzb2NrZXRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50IChuZXQvaXB2Ni9pcDZtci5jKSB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0YWJsZXMgb24gZGVtYW5kIHdoZW4gc29ja2V0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgYW5kIHRvIGRlc3Ryb3kgdGhlbSB3aGVuIHRoZXkgYmVjb21lIHVucmVmZXJlbmNlZCBvciBlbXB0eS5cblxuLSBNZW1vcnkgQWxsb2NhdGlvbnM6IE5ldyBkeW5hbWljIGFsbG9jYXRpb25zIChzdWNoIGFzIGBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrYCBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jX29iamApIGhhdmUgYWxsIG1lbWJlciBmaWVsZHMgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFRoZSB1bmRlcmx5aW5nIG11bHRpY2FzdCB0YWJsZXMgYWxsb2NhdGVkIHZpYSBgbXJfdGFibGVfYWxsb2MoKWAgdXNlIGBremFsbG9jX29iaigpYC5cbi0gRGF0YSBzZW50IHRvIHVzZXIgc3BhY2U6IGlvY3RsL2NvbXBhdF9pb2N0bCBhbmQgZ2V0c29ja29wdCBoYW5kbGVycyBvbmx5IGNvcHkgZXhwbGljaXRseSBpbml0aWFsaXplZCBmaWVsZHMgb3IgZGF0YSBjb3BpZWQgZnJvbSB1c2VyIHNwYWNlIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRob3V0IGxlYXZpbmcgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHJlYWRpbmcgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuLSBDb250cm9sIGZsb3cgYW5kIExpZmV0aW1lczogQ2hhbmdlcyBhZmZlY3QgdGFibGUgbGlmZWN5Y2xlLCBSQ1Ugc3luY2hyb25pemF0aW9uLCBsaXN0IG1hbmlwdWxhdGlvbnMsIGFuZCBsb2NraW5nIChSVE5ML21ydF9sb2NrKS4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGVzZSBwYXRocyBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGFjY2Vzcywgb3IgbWVtb3J5IGxlYWtzLCB3aGljaCBhcmUgaGFuZGxlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIEtNRU1MRUFLLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCwgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA1MjFjMGIwMmE2ODE0MjAwYjBlZWIyMGFhZjEzYzVkODRlOThmZTViCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBTZXAgNiAxNToyMTo1NiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jCmluZGV4IDNmMmVkOWI3N2RlYjUuLjI2YmQyY2NkNDIwMWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNm1yLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2lwdjYvaXA2bXIuYwpAQCAtMjgsNiAmIzQzOzI4LDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9pbml0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY29tcGF0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcmhhc2h0YWJsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC93b3JrcXVldWUuaCZndDsKICNpbmNsdWRlICZsdDtuZXQvcHJvdG9jb2wuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9za2J1ZmYuaCZndDsKICNpbmNsdWRlICZsdDtuZXQvcmF3LmgmZ3Q7CkBAIC0zNjgsNiAmIzQzOzM2OSwxMiBAQCBzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9nZXRfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpCiAJcmV0dXJuIG1ydDsKIH0KIAomIzQzO3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2xvb2t1cF9za190YWJsZShzdHJ1Y3Qgc29jayAqc2spCiYjNDM7ewomIzQzOwlyZXR1cm4gX19pcDZtcl9nZXRfdGFibGUoc29ja19uZXQoc2spLAomIzQzOwkJCQkgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7CiYjNDM7fQomIzQzOwogc3RhdGljIGludCBpcDZtcl9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLAogCQkJICBjb25zdCB2b2lkICpwdHIpCiB7CkBAIC00MTcsNiAmIzQzOzQyNCwxMjQgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKQogCQkJICAgICAgaXBtcl9leHBpcmVfcHJvY2VzcywgaXA2bXJfbmV3X3RhYmxlX3NldCk7CiB9CiAKJiM0MzsvKiB0YWJsZV9zZXQgY2FsbGJhY2sgdXNlZCB3aGlsZSB0aGUgbmV3IHRhYmxlIGlzIHN0aWxsIHVucHVibGlzaGVkLiAqLwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2goc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBuZXQgKm5ldCkKJiM0Mzt7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssCiYjNDM7CQkJCQkJICAgIGJvb2wgKm5ld190YWJsZSkKJiM0Mzt7CiYjNDM7CXUzMiBpZCA9IHJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQ7CiYjNDM7CXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKJiM0MzsJc3RydWN0IG1yX3RhYmxlICptcnQ7CiYjNDM7CiYjNDM7CUFTU0VSVF9SVE5MKCk7CiYjNDM7CSpuZXdfdGFibGUgPSBmYWxzZTsKJiM0MzsKJiM0MzsJbXJ0ID0gX19pcDZtcl9nZXRfdGFibGUobmV0LCBpZCk7CiYjNDM7CWlmIChtcnQpCiYjNDM7CQlyZXR1cm4gbXJ0OwomIzQzOwomIzQzOwltcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCAmYW1wO2lwNm1yX21yX3RhYmxlX29wcywKJiM0MzsJCQkgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2gpOwomIzQzOwlpZiAoIUlTX0VSUihtcnQpKQomIzQzOwkJKm5ld190YWJsZSA9IHRydWU7CiYjNDM7CXJldHVybiBtcnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBib29sIG5ld190YWJsZSkKJiM0Mzt7CiYjNDM7CWlmIChuZXdfdGFibGUpCiYjNDM7CQlpcDZtcl9uZXdfdGFibGVfc2V0KG1ydCwgcmVhZF9wbmV0KCZhbXA7bXJ0LSZndDtuZXQpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCkKJiM0Mzt7CiYjNDM7CUFTU0VSVF9SVE5MKCk7CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVMKJiM0MzsJaWYgKG1ydC0mZ3Q7aWQgPT0gUlQ2X1RBQkxFX0RGTFQpCiYjNDM7CQlyZXR1cm47CiYjNDM7CS8qIE5lc3RlZCBORVRERVZfVU5SRUdJU1RFUiBtYXkgYWxyZWFkeSBoYXZlIHVubGlua2VkIHRoaXMgdGFibGUuICovCiYjNDM7CWlmIChfX2lwNm1yX2dldF90YWJsZShyZWFkX3BuZXQoJmFtcDttcnQtJmd0O25ldCksIG1ydC0mZ3Q7aWQpICE9IG1ydCkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LSZndDttcm91dGVfc2spIHx8CiYjNDM7CSAgICBtcnQtJmd0O21heHZpZiB8fAomIzQzOwkgICAgIWxpc3RfZW1wdHkoJmFtcDttcnQtJmd0O21mY19jYWNoZV9saXN0KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrX2JoKCZhbXA7bWZjX3VucmVzX2xvY2spOwomIzQzOwlpZiAoIWxpc3RfZW1wdHkoJmFtcDttcnQtJmd0O21mY191bnJlc19xdWV1ZSkpIHsKJiM0MzsJCXNwaW5fdW5sb2NrX2JoKCZhbXA7bWZjX3VucmVzX2xvY2spOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CXNwaW5fdW5sb2NrX2JoKCZhbXA7bWZjX3VucmVzX2xvY2spOwomIzQzOwomIzQzOwlsaXN0X2RlbF9yY3UoJmFtcDttcnQtJmd0O2xpc3QpOwomIzQzOwl0aW1lcl9zaHV0ZG93bl9zeW5jKCZhbXA7bXJ0LSZndDtpcG1yX2V4cGlyZV90aW1lcik7CiYjNDM7CW1yX3RhYmxlX2ZyZWUobXJ0KTsKJiM0MzsjZW5kaWYKJiM0Mzt9CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVMKJiM0MztzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrIHsKJiM0MzsJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiYjNDM7CXN0cnVjdCBuZXQgKm5ldDsKJiM0MzsJdTMyIGlkOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfZGVzdHJveV93b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQomIzQzO3sKJiM0MzsJc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHcgPQomIzQzOwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmssIHdvcmspOwomIzQzOwlzdHJ1Y3QgbXJfdGFibGUgKm1ydDsKJiM0MzsKJiM0MzsJcnRubF9sb2NrKCk7CiYjNDM7CW1ydCA9IF9faXA2bXJfZ2V0X3RhYmxlKGR3LSZndDtuZXQsIGR3LSZndDtpZCk7CiYjNDM7CWlmIChtcnQpCiYjNDM7CQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiYjNDM7CXJ0bmxfdW5sb2NrKCk7CiYjNDM7CXB1dF9uZXQoZHctJmd0O25ldCk7CiYjNDM7CWtmcmVlKGR3KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveShzdHJ1Y3QgbXJfdGFibGUgKm1ydCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuZXQgKm5ldCA9IHJlYWRfcG5ldCgmYW1wO21ydC0mZ3Q7bmV0KTsKJiM0MzsJc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHc7CiYjNDM7CiYjNDM7CWlmIChtcnQtJmd0O2lkID09IFJUNl9UQUJMRV9ERkxUKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlkdyA9IGttYWxsb2Nfb2JqKCpkdywgR0ZQX0FUT01JQyk7CiYjNDM7CWlmICghZHcpIHsKJiM0MzsJCW1vZF90aW1lcigmYW1wO21ydC0mZ3Q7aXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgJiM0MzsgSFopOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWlmICghbWF5YmVfZ2V0X25ldChuZXQpKSB7CiYjNDM7CQlrZnJlZShkdyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJSU5JVF9XT1JLKCZhbXA7ZHctJmd0O3dvcmssIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKTsKJiM0MzsJZHctJmd0O25ldCA9IG5ldDsKJiM0MzsJZHctJmd0O2lkID0gbXJ0LSZndDtpZDsKJiM0MzsJcXVldWVfd29yayhzeXN0ZW1fZGZsX3dxLCAmYW1wO2R3LSZndDt3b3JrKTsKJiM0Mzt9CiYjNDM7I2Vsc2UKJiM0MztzdGF0aWMgdm9pZCBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KHN0cnVjdCBtcl90YWJsZSAqbXJ0KQomIzQzO3sKJiM0Mzt9CiYjNDM7I2VuZGlmCiYjNDM7CiYjNDM7c3RhdGljIGludCBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBib29sIG5ld190YWJsZSwKJiM0MzsJCQkJICBpbnQgZXJyKQomIzQzO3sKJiM0MzsJaWYgKG5ld190YWJsZSAmYW1wOyZhbXA7IGVycikKJiM0MzsJCWlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCBpcDZtcl9mcmVlX3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LAogCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfa2lsbF9saXN0KQogewpAQCAtODY2LDE2ICYjNDM7OTkxLDI1IEBAIHN0YXRpYyB2b2lkIGlwbXJfZG9fZXhwaXJlX3Byb2Nlc3Moc3RydWN0IG1yX3RhYmxlICptcnQpCiBzdGF0aWMgdm9pZCBpcG1yX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCB0aW1lcl9saXN0ICp0KQogewogCXN0cnVjdCBtcl90YWJsZSAqbXJ0ID0gdGltZXJfY29udGFpbmVyX29mKG1ydCwgdCwgaXBtcl9leHBpcmVfdGltZXIpOwomIzQzOwlib29sIGVtcHR5ID0gZmFsc2U7CiAKIAlpZiAoIXNwaW5fdHJ5bG9jaygmYW1wO21mY191bnJlc19sb2NrKSkgewogCQltb2RfdGltZXIoJmFtcDttcnQtJmd0O2lwbXJfZXhwaXJlX3RpbWVyLCBqaWZmaWVzICYjNDM7IDEpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKCFsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfdW5yZXNfcXVldWUpKQomIzQzOwlpZiAoIWxpc3RfZW1wdHkoJmFtcDttcnQtJmd0O21mY191bnJlc19xdWV1ZSkpIHsKIAkJaXBtcl9kb19leHBpcmVfcHJvY2VzcyhtcnQpOwomIzQzOwkJZW1wdHkgPSBsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfdW5yZXNfcXVldWUpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJLyogUmV0cnkgYWZ0ZXIgR0ZQX0FUT01JQyBhbGxvY2F0aW9uIGZhaWx1cmUuICovCiYjNDM7CQllbXB0eSA9IHRydWU7CiYjNDM7CX0KIAogCXNwaW5fdW5sb2NrKCZhbXA7bWZjX3VucmVzX2xvY2spOwomIzQzOwomIzQzOwlpZiAoZW1wdHkpCiYjNDM7CQlpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KG1ydCk7CiB9CiAKIC8qIEZpbGwgb2lmcyBsaXN0LiBJdCBpcyBjYWxsZWQgdW5kZXIgbG9ja2VkIG1ydF9sb2NrLiAqLwpAQCAtMTI5MCwxOSAmIzQzOzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVMKJiM0MzsJc3RydWN0IG1yX3RhYmxlICptcnQsICpuZXh0OwomIzQzOyNlbHNlCiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiYjNDM7I2VuZGlmCiAJc3RydWN0IHZpZl9kZXZpY2UgKnY7CiAJaW50IGN0OwogCiAJaWYgKGV2ZW50ICE9IE5FVERFVl9VTlJFR0lTVEVSKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKLQlpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldCkgewomIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTCiYjNDM7CWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtcnQsIG5leHQsICZhbXA7bmV0LSZndDtpcHY2Lm1yNl90YWJsZXMsIGxpc3QpCiYjNDM7I2Vsc2UKJiM0MzsJaXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpCiYjNDM7I2VuZGlmCiYjNDM7CXsKJiM0MzsJCWJvb2wgdmlmX2dvbmUgPSBmYWxzZTsKJiM0MzsKIAkJdiA9ICZhbXA7bXJ0LSZndDt2aWZfdGFibGVbMF07CiAJCWZvciAoY3QgPSAwOyBjdCAmbHQ7IG1ydC0mZ3Q7bWF4dmlmOyBjdCYjNDM7JiM0MzssIHYmIzQzOyYjNDM7KSB7Ci0JCQlpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtJmd0O2RldikgPT0gZGV2KQomIzQzOwkJCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIodi0mZ3Q7ZGV2KSA9PSBkZXYpIHsKIAkJCQltaWY2X2RlbGV0ZShtcnQsIGN0LCAxLCBOVUxMKTsKJiM0MzsJCQkJdmlmX2dvbmUgPSB0cnVlOwomIzQzOwkJCX0KIAkJfQomIzQzOwkJaWYgKHZpZl9nb25lKQomIzQzOwkJCWlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTsKIAl9CiAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CkBAIC0xNjE4LDEwICYjNDM7MTc2NywxMSBAQCBzdGF0aWMgdm9pZCBtcm91dGVfY2xlYW5fdGFibGVzKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBpbnQgZmxhZ3MsCiAKIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKQogewotCWludCBlcnIgPSAwOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKJiM0MzsJaW50IGVyciA9IDA7CiYjNDM7CiYjNDM7CUFTU0VSVF9SVE5MKCk7CiAKLQlydG5sX2xvY2soKTsKIAlzcGluX2xvY2soJmFtcDttcnRfbG9jayk7CiAJaWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LSZndDttcm91dGVfc2spKSB7CiAJCWVyciA9IC1FQUREUklOVVNFOwpAQCAtMTYzNyw4ICYjNDM7MTc4Nyw2IEBAIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKQogCQkJCQkgICAgIE5FVENPTkZBX01DX0ZPUldBUkRJTkcsCiAJCQkJCSAgICAgTkVUQ09ORkFfSUZJTkRFWF9BTEwsCiAJCQkJCSAgICAgbmV0LSZndDtpcHY2LmRldmNvbmZfYWxsKTsKLQlydG5sX3VubG9jaygpOwotCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTY3Nyw2ICYjNDM7MTgyNSw3IEBAIGludCBpcDZtcl9za19kb25lKHN0cnVjdCBzb2NrICpzaykKIAkJCW1yb3V0ZV9jbGVhbl90YWJsZXMobXJ0LCBNUlQ2X0ZMVVNIX01JRlMgfCBNUlQ2X0ZMVVNIX01GQywKIAkJCQkJICAgICZhbXA7ZGV2X2tpbGxfbGlzdCk7CiAJCQllcnIgPSAwOwomIzQzOwkJCWlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTcyMywyNyAmIzQzOzE4NzIsNDUgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCSAgICBpbmV0X3NrKHNrKS0mZ3Q7aW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCW1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpOwotCWlmICghbXJ0KQotCQlyZXR1cm4gLUVOT0VOVDsKLQogCWlmIChvcHRuYW1lICE9IE1SVDZfSU5JVCkgewotCQlpZiAoc2sgIT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC0mZ3Q7bXJvdXRlX3NrKSAmYW1wOyZhbXA7Ci0JCSAgICAhbnNfY2FwYWJsZShuZXQtJmd0O3VzZXJfbnMsIENBUF9ORVRfQURNSU4pKQomIzQzOwkJYm9vbCBpc19tcm91dGVfc2sgPSBmYWxzZTsKJiM0MzsKJiM0MzsJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAobXJ0ICZhbXA7JmFtcDsgc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC0mZ3Q7bXJvdXRlX3NrKSkKJiM0MzsJCQlpc19tcm91dGVfc2sgPSB0cnVlOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CiYjNDM7CQlpZiAoIWlzX21yb3V0ZV9zayAmYW1wOyZhbXA7ICFuc19jYXBhYmxlKG5ldC0mZ3Q7dXNlcl9ucywgQ0FQX05FVF9BRE1JTikpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKIAlzd2l0Y2ggKG9wdG5hbWUpIHsKLQljYXNlIE1SVDZfSU5JVDoKJiM0MzsJY2FzZSBNUlQ2X0lOSVQ6IHsKJiM0MzsJCWJvb2wgbmV3X3RhYmxlID0gZmFsc2U7CiYjNDM7CiAJCWlmIChvcHRsZW4gJmx0OyBzaXplb2YoaW50KSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXJldHVybiBpcDZtcl9za19pbml0KG1ydCwgc2spOwomIzQzOwkJcnRubF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssICZhbXA7bmV3X3RhYmxlKTsKJiM0MzsJCWlmIChJU19FUlIobXJ0KSkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIFBUUl9FUlIobXJ0KTsKJiM0MzsJCX0KJiM0MzsJCWlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTsKJiM0MzsJCXJldCA9IGlwNm1yX3NrX2luaXQobXJ0LCBzayk7CiYjNDM7CQlyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpOwomIzQzOwkJcnRubF91bmxvY2soKTsKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CX0KIAogCWNhc2UgTVJUNl9ET05FOgogCQlyZXR1cm4gaXA2bXJfc2tfZG9uZShzayk7CiAKLQljYXNlIE1SVDZfQUREX01JRjoKJiM0MzsJY2FzZSBNUlQ2X0FERF9NSUY6IHsKJiM0MzsJCWJvb2wgbmV3X3RhYmxlID0gZmFsc2U7CiYjNDM7CiAJCWlmIChvcHRsZW4gJmx0OyBzaXplb2YodmlmKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoY29weV9mcm9tX3NvY2twdHIoJmFtcDt2aWYsIG9wdHZhbCwgc2l6ZW9mKHZpZikpKQpAQCAtMTc1MSwxMCAmIzQzOzE5MTgsMTggQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQlpZiAodmlmLm1pZjZjX21pZmkgJmd0Oz0gTUFYTUlGUykKIAkJCXJldHVybiAtRU5GSUxFOwogCQlydG5sX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgJmFtcDtuZXdfdGFibGUpOwomIzQzOwkJaWYgKElTX0VSUihtcnQpKSB7CiYjNDM7CQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQlyZXR1cm4gUFRSX0VSUihtcnQpOwomIzQzOwkJfQomIzQzOwkJaXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpOwogCQlyZXQgPSBtaWY2X2FkZChuZXQsIG1ydCwgJmFtcDt2aWYsCiAJCQkgICAgICAgc2sgPT0gcnRubF9kZXJlZmVyZW5jZShtcnQtJmd0O21yb3V0ZV9zaykpOwomIzQzOwkJcmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTsKIAkJcnRubF91bmxvY2soKTsKIAkJcmV0dXJuIHJldDsKJiM0MzsJfQogCiAJY2FzZSBNUlQ2X0RFTF9NSUY6CiAJCWlmIChvcHRsZW4gJmx0OyBzaXplb2YobWlmaV90KSkKQEAgLTE3NjIsNyAmIzQzOzE5MzcsMTQgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQlpZiAoY29weV9mcm9tX3NvY2twdHIoJmFtcDttaWZpLCBvcHR2YWwsIHNpemVvZihtaWZpX3QpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlydG5sX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiAJCXJldCA9IG1pZjZfZGVsZXRlKG1ydCwgbWlmaSwgMCwgTlVMTCk7CiYjNDM7CQlpZiAoIXJldCkKJiM0MzsJCQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiAJCXJ0bmxfdW5sb2NrKCk7CiAJCXJldHVybiByZXQ7CiAKQEAgLTE3ODMsMTcgJiM0MzsxOTY1LDM5IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJaWYgKHBhcmVudCA9PSAwKQogCQkJcGFyZW50ID0gbWZjLm1mNmNjX3BhcmVudDsKIAotCQltdXRleF9sb2NrKCZhbXA7bmV0LSZndDtpcHY2Lm1mY19tdXRleCk7CiYjNDM7CQlydG5sX2xvY2soKTsKJiM0MzsJCWlmIChvcHRuYW1lID09IE1SVDZfREVMX01GQyB8fCBvcHRuYW1lID09IE1SVDZfREVMX01GQ19QUk9YWSkgewomIzQzOwkJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQkJaWYgKCFtcnQpIHsKJiM0MzsJCQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQkJfQomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQlib29sIG5ld190YWJsZSA9IGZhbHNlOwogCi0JCWlmIChvcHRuYW1lID09IE1SVDZfREVMX01GQyB8fCBvcHRuYW1lID09IE1SVDZfREVMX01GQ19QUk9YWSkKLQkJCXJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCAmYW1wO21mYywgcGFyZW50KTsKLQkJZWxzZQomIzQzOwkJCW1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgJmFtcDtuZXdfdGFibGUpOwomIzQzOwkJCWlmIChJU19FUlIobXJ0KSkgewomIzQzOwkJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCQlyZXR1cm4gUFRSX0VSUihtcnQpOwomIzQzOwkJCX0KJiM0MzsJCQlpcDZtcl9wdWJsaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSk7CiYjNDM7CQkJbXV0ZXhfbG9jaygmYW1wO25ldC0mZ3Q7aXB2Ni5tZmNfbXV0ZXgpOwogCQkJcmV0ID0gaXA2bXJfbWZjX2FkZChuZXQsIG1ydCwgJmFtcDttZmMsCiAJCQkJCSAgICBzayA9PQogCQkJCQkgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC0mZ3Q7bXJvdXRlX3NrKSwKIAkJCQkJICAgIHBhcmVudCk7CiYjNDM7CQkJbXV0ZXhfdW5sb2NrKCZhbXA7bmV0LSZndDtpcHY2Lm1mY19tdXRleCk7CiYjNDM7CQkJcmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTsKJiM0MzsJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQl9CiAKJiM0MzsJCW11dGV4X2xvY2soJmFtcDtuZXQtJmd0O2lwdjYubWZjX211dGV4KTsKJiM0MzsJCXJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCAmYW1wO21mYywgcGFyZW50KTsKIAkJbXV0ZXhfdW5sb2NrKCZhbXA7bmV0LSZndDtpcHY2Lm1mY19tdXRleCk7CiYjNDM7CQlpZiAoIXJldCkKJiM0MzsJCQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiYjNDM7CQlydG5sX3VubG9jaygpOwogCQlyZXR1cm4gcmV0OwogCiAJY2FzZSBNUlQ2X0ZMVVNIOgpAQCAtMTgwNyw4ICYjNDM7MjAxMSwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlydG5sX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiAJCW1yb3V0ZV9jbGVhbl90YWJsZXMobXJ0LCBmbGFncywgJmFtcDtkZXZfa2lsbF9saXN0KTsKIAkJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueSgmYW1wO2Rldl9raWxsX2xpc3QpOwomIzQzOwkJaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpOwogCQlydG5sX3VubG9jaygpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xODI0LDcgJiM0MzsyMDM0LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoY29weV9mcm9tX3NvY2twdHIoJmFtcDt2LCBvcHR2YWwsIHNpemVvZih2KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKJiM0MzsJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQogCQlXUklURV9PTkNFKG1ydC0mZ3Q7bXJvdXRlX2RvX2Fzc2VydCwgdik7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xODQyLDYgJiM0MzsyMDU5LDExIEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJZG9fd3JtaWZ3aG9sZSA9ICh2ID09IE1SVDZNU0dfV1JNSUZXSE9MRSk7CiAJCXYgPSAhIXY7CiAJCXJ0bmxfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJCWlmICghbXJ0KSB7CiYjNDM7CQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJCX0KIAkJcmV0ID0gMDsKIAkJaWYgKHYgIT0gbXJ0LSZndDttcm91dGVfZG9fcGltKSB7CiAJCQlXUklURV9PTkNFKG1ydC0mZ3Q7bXJvdXRlX2RvX3BpbSwgdik7CkBAIC0xODY1LDE4ICYjNDM7MjA4NywxNiBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCS8qICYjMzQ7cGltNnJlZyV1JiMzNDsgc2hvdWxkIG5vdCBleGNlZWQgMTYgYnl0ZXMgKElGTkFNU0laKSAqLwogCQlpZiAodiAhPSBSVF9UQUJMRV9ERUZBVUxUICZhbXA7JmFtcDsgdiAmZ3Q7PSAxMDAwMDAwMDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zaykpCiYjNDM7CQlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKG1ydCAmYW1wOyZhbXA7IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zaykpIHsKJiM0MzsJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiAtRUJVU1k7CiYjNDM7CQl9CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKIAotCQlydG5sX2xvY2soKTsKLQkJcmV0ID0gMDsKLQkJbXJ0ID0gaXA2bXJfbmV3X3RhYmxlKG5ldCwgdik7Ci0JCWlmIChJU19FUlIobXJ0KSkKLQkJCXJldCA9IFBUUl9FUlIobXJ0KTsKLQkJZWxzZQotCQkJcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID0gdjsKLQkJcnRubF91bmxvY2soKTsKLQkJcmV0dXJuIHJldDsKJiM0MzsJCXJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA9IHY7CiYjNDM7CQlyZXR1cm4gMDsKIAl9CiAjZW5kaWYKIAkvKgpAQCAtMTg5NywxNiAmIzQzOzIxMTcsMTggQEAgaW50IGlwNl9tcm91dGVfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogewogCWludCBvbHI7CiAJaW50IHZhbDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiAKIAlpZiAoc2stJmd0O3NrX3R5cGUgIT0gU09DS19SQVcgfHwKIAkgICAgaW5ldF9zayhzayktJmd0O2luZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAoIW1ydCkKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwlpZiAoIW1ydCkgewomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiAKIAlzd2l0Y2ggKG9wdG5hbWUpIHsKIAljYXNlIE1SVDZfVkVSU0lPTjoKQEAgLTE5MjEsOCAmIzQzOzIxNDMsMTAgQEAgaW50IGlwNl9tcm91dGVfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQl2YWwgPSBSRUFEX09OQ0UobXJ0LSZndDttcm91dGVfZG9fYXNzZXJ0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KJiM0MzsJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlpZiAoY29weV9mcm9tX3NvY2twdHIoJmFtcDtvbHIsIG9wdGxlbiwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE5NDcsMjAgJiM0MzsyMTcxLDIzIEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZykKIAlzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqdnI7CiAJc3RydWN0IHZpZl9kZXZpY2UgKnZpZjsKIAlzdHJ1Y3QgbWZjNl9jYWNoZSAqYzsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiAKLQltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAoIW1ydCkKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwlpZiAoIW1ydCkgewomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dFVE1JRkNOVF9JTjY6CiAJCXZyID0gKHN0cnVjdCBzaW9jX21pZl9yZXE2ICopYXJnOwotCQlpZiAodnItJmd0O21pZmkgJmd0Oz0gbXJ0LSZndDttYXh2aWYpCiYjNDM7CQlpZiAodnItJmd0O21pZmkgJmd0Oz0gbXJ0LSZndDttYXh2aWYpIHsKJiM0MzsJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJfQogCQl2ci0mZ3Q7bWlmaSA9IGFycmF5X2luZGV4X25vc3BlYyh2ci0mZ3Q7bWlmaSwgbXJ0LSZndDttYXh2aWYpOwotCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXZpZiA9ICZhbXA7bXJ0LSZndDt2aWZfdGFibGVbdnItJmd0O21pZmldOwogCQlpZiAoVklGX0VYSVNUUyhtcnQsIHZyLSZndDttaWZpKSkgewogCQkJdnItJmd0O2ljb3VudCA9IFJFQURfT05DRSh2aWYtJmd0O3BrdF9pbik7CkBAIC0xOTc0LDggJiM0MzsyMjAxLDYgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKQogCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiAJY2FzZSBTSU9DR0VUU0dDTlRfSU42OgogCQlzciA9IChzdHJ1Y3Qgc2lvY19zZ19yZXE2ICopYXJnOwotCi0JCXJjdV9yZWFkX2xvY2soKTsKIAkJYyA9IGlwNm1yX2NhY2hlX2ZpbmQobXJ0LCAmYW1wO3NyLSZndDtzcmMuc2luNl9hZGRyLAogCQkJCSAgICAgJmFtcDtzci0mZ3Q7Z3JwLnNpbjZfYWRkcik7CiAJCWlmIChjKSB7CkBAIC0xOTg4LDYgJiM0MzsyMjEzLDcgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKQogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCWRlZmF1bHQ6CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsKIAl9CiB9CkBAIC0yMDE1LDIxICYjNDM7MjI0MSwyMyBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKIAlzdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYgdnI7CiAJc3RydWN0IHZpZl9kZXZpY2UgKnZpZjsKIAlzdHJ1Y3QgbWZjNl9jYWNoZSAqYzsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiAKLQltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAoIW1ydCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dFVE1JRkNOVF9JTjY6CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmYW1wO3ZyLCBhcmcsIHNpemVvZih2cikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICh2ci5taWZpICZndDs9IG1ydC0mZ3Q7bWF4dmlmKQomIzQzOwkJcmN1X3JlYWRfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJCWlmICghbXJ0KSB7CiYjNDM7CQkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiYjNDM7CQlpZiAodnIubWlmaSAmZ3Q7PSBtcnQtJmd0O21heHZpZikgewomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQl9CiAJCXZyLm1pZmkgPSBhcnJheV9pbmRleF9ub3NwZWModnIubWlmaSwgbXJ0LSZndDttYXh2aWYpOwotCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXZpZiA9ICZhbXA7bXJ0LSZndDt2aWZfdGFibGVbdnIubWlmaV07CiAJCWlmIChWSUZfRVhJU1RTKG1ydCwgdnIubWlmaSkpIHsKIAkJCXZyLmljb3VudCA9IFJFQURfT05DRSh2aWYtJmd0O3BrdF9pbik7CkBAIC0yMDQ5LDYgJiM0MzsyMjc3LDExIEBAIGludCBpcDZtcl9jb21wYXRfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJcmN1X3JlYWRfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJCWlmICghbXJ0KSB7CiYjNDM7CQkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiAJCWMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgJmFtcDtzci5zcmMuc2luNl9hZGRyLCAmYW1wO3NyLmdycC5zaW42X2FkZHIpOwogCQlpZiAoYykgewogCQkJc3IucGt0Y250ID0gYXRvbWljX2xvbmdfcmVhZCgmYW1wO2MtJmd0O19jLm1mY191bi5yZXMucGt0KTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg4NjYKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMDA1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50KioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIHNlZSBpZiBpdCB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlcy4gSXQmIzM5O3MgdG91Y2hpbmcgYG5ldC9pcHY2L2lwNm1yLmNgLCB3aGljaCB0ZWxscyBtZSB0aGlzIGNvbmNlcm5zIElQdjYgbXVsdGljYXN0IHJvdXRpbmcuCgpOb3csIGZvY3VzaW5nIG9uIHRoZSBjb3JlIGNoYW5nZXMsIGl0IGFwcGVhcnMgdGhpcyBwYXRjaCBpcyBhYm91dCBkeW5hbWljIHRhYmxlIG1hbmFnZW1lbnQgZm9yIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGBpcDZtcmApLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIGJlIG1vdmluZyBmcm9tIHByZS1hbGxvY2F0aW9uIG9yIGFsbG9jYXRpb24gZHVyaW5nIGBNUlQ2X1RBQkxFYCB0byBkeW5hbWljIGFsbG9jYXRpb24gdXNpbmcgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAgd2hlbiBgc2V0c29ja29wdGAgY2FsbHMgbGlrZSBgTVJUNl9JTklUYCwgYE1SVDZfQUREX01JRmAsIGFuZCBgTVJUNl9BRERfTUZDYCBhcmUgbWFkZS4gVGhlIHBhdGNoIGFsc28gaW50cm9kdWNlcyBkeW5hbWljIHRhYmxlIGRlc3RydWN0aW9uIChgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95YCkgd2hlbiB0YWJsZXMgYXJlIGVtcHR5LCB1bnJlZ2lzdGVyZWQsIG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkLgoKSSYjMzk7bSBub3RpbmcgdGhhdCB3aXRoaW4gYGlwNl9tcm91dGVfc2V0c29ja29wdGAgd2l0aCBgTVJUNl9UQUJMRWAsIHRoZSBjb2RlIG5vdyAqanVzdCogc2V0cyB0aGUgcG9pbnRlciBgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID0gdjtgIHdpdGhvdXQgaW1tZWRpYXRlbHkgYWxsb2NhdGluZyB0aGUgdGFibGUsIGZ1cnRoZXIgcmVpbmZvcmNpbmcgdGhpcyBkeW5hbWljIGJlaGF2aW9yLiBBbHNvLCBpbiBgaXA2bXJfaW9jdGxgIGFuZCBgaXA2bXJfY29tcGF0X2lvY3RsYCwgaXQgbm93IGxvb2tzIHVwIHRoZSB0YWJsZSB1c2luZyBgaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKWAgdW5kZXIgYHJjdV9yZWFkX2xvY2soKWAgcmF0aGVyIHRoYW4gYW4gdXBmcm9udCBsb29rdXAuIExhc3RseSwgSSBzZWUgY2hhbmdlcyB0byBsb2NraW5nIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCwgd2l0aCBgaXA2bXJfZGVzdHJveV93b3JrYCBub3cgYmVpbmcgYWxsb2NhdGVkIHZpYSBga21hbGxvY19vYmooKmR3LCBHRlBfQVRPTUlDKWAuCgpNeSBuZXh0IG1ham9yIGNvbmNlcm4gaXMgdW5pbml0aWFsaXplZCBtZW1vcnkuIExldCYjMzk7cyBkaWcgaW4gaGVyZS4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGFsbG9jYXRpb24gYW5kIHVzZSBvZiBga21hbGxvY19vYmooKmR3LCBHRlBfQVRPTUlDKWAgd2l0aGluIGBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95YC4gRnJvbSB3aGF0IEkgc2VlIGluIHRoYXQgY29kZSwgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIGBpcDZtcl9kZXN0cm95X3dvcmtgIHN0cnVjdCAoYHdvcmtgLCBgbmV0YCwgYGlkYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgKmJlZm9yZSogdGhlIHdvcmsgaXMgcXVldWVkLiBUaGUgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCBvbmx5IHJlYWRzIGBkdy0mZ3Q7bmV0YCBhbmQgYGR3LSZndDtpZGAsIHRoZW4gZnJlZXMgYGR3YC4gVGhhdCBsb29rcyBzYWZlLgoKSSYjMzk7bGwgYWxzbyBxdWlja2x5IGNoZWNrIHRoYXQgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgJmFtcDtuZXdfdGFibGUpYCBpbml0aWFsaXplcyBgbmV3X3RhYmxlYCB0byBgZmFsc2VgIGFuZCBzZXRzIGl0IHRvIGB0cnVlYCBvbiBhbGxvY2F0aW9uIHN1Y2Nlc3MuIEkmIzM5O20gYWxzbyBnbGFuY2luZyBhdCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AsIHdoaWNoIGluaXRpYWxpemVzIGEgYm9vbGVhbiBgZW1wdHlgIGFuZCB0aGVuIGFzc2lnbnMgaXQgYmFzZWQgb24gYGxpc3RfZW1wdHlgIGNhbGxzIG9yIHNldHMgdG8gYHRydWVgLiBTaW1pbGFybHksIGBpcDZtcl9kZXZpY2VfZXZlbnRgIGluaXRpYWxpemVzIGB2aWZfZ29uZSA9IGZhbHNlO2AuCgpGaW5hbGx5LCB0aGUgaW9jdGwgYW5kIGNvbXBhdCBpb2N0bCBoYW5kbGluZyBjYXRjaGVzIG15IGF0dGVudGlvbi4gSW4gdGhlIHJlZ3VsYXIgaW9jdGwgKGBpcDZtcl9pb2N0bGApLCB0aGUgYXJndW1lbnRzIChgdnJgIGFuZCBgc3JgKSBhcmUgY2FzdC4gIEluIHRoZSBjb21wYXQgaW9jdGwgKGBpcDZtcl9jb21wYXRfaW9jdGxgKSwgdGhlIGRhdGEgZnJvbSB1c2VyIHNwYWNlIGlzIGNvcGllZCB2aWEgYGNvcHlfZnJvbV91c2VyYC4gIElmIHN1Y2Nlc3NmdWwsIHRoZSBtb2RpZmllZCB2YWx1ZXMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UgdXNpbmcgYGNvcHlfdG9fdXNlcmAuIEkgbmVlZCB0byBjb25maXJtIHdoZXRoZXIgdGhpcyBiZWhhdmlvciBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHByZS1wYXRjaCB2ZXJzaW9ucyB0byBhc3Nlc3MgYW55IHBvdGVudGlhbCBpc3N1ZXMgaGVyZS4gVGhpcyBkZXNlcnZlcyBhIGNsb3NlciBsb29rIGF0IHRoZSBvcmlnaW5hbCBjb2RlIHRvIGNvbmZpcm0uCgpHaXZlbiBteSBhbmFseXNpcywgSSBhbSBnb2luZyB0byBkZXRlcm1pbmUgaWYgdGhlIGNoYW5nZXMgYXJlIGVub3VnaCB0byB3YXJyYW50IGEgS01TQU4gZnV6emluZyBzZXNzaW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpcDZtcl9jb21wYXRfaW9jdGwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvaXB2Ni9pcDZtci5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9pcHY2L2lwNm1yLmM9MjIzMD1zdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYge1xuLS1cbm5ldC9pcHY2L2lwNm1yLmMtMjIzNy1cbm5ldC9pcHY2L2lwNm1yLmM6MjIzODppbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcbm5ldC9pcHY2L2lwNm1yLmMtMjIzOS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNzg3CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYGlwNm1yX2NvbXBhdF9pb2N0bGAqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBjb2RlLCBhbmQgSSBuZWVkIHRvIG1ha2UgYWJzb2x1dGVseSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJhY3Rpb24gYXJvdW5kIGBpcDZtcl9jb21wYXRfaW9jdGxgLiBMZXQmIzM5O3MgemVybyBpbiBvbiB0aGF0IHNlY3Rpb24sIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAyMjM4LiBJJiMzOTttIGdvaW5nIHRvIGNhcmVmdWxseSByZXZpZXcgdGhhdCBmdW5jdGlvbiB0byBtYWtlIGNlcnRhaW4gSSYjMzk7bSBub3QgbWlzc2luZyBhbnkgc3VidGxlIGRldGFpbHMgb3IgcG90ZW50aWFsIGVkZ2UgY2FzZXMuIE5lZWQgdG8gZ2V0IGEgcmVhbGx5IGdvb2QgaGFuZGxlIG9uIGhvdyB0aGlzIHRoaW5nIGlzIGFjdHVhbGx5IHdvcmtpbmcsIHNvIGxldCYjMzk7cyBzdGFydCB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvaXB2Ni9pcDZtci5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjIzOCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjM4Olx0aW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpXG4yMjM5Olx0e1xuMjI0MDpcdFx0c3RydWN0IGNvbXBhdF9zaW9jX3NnX3JlcTYgc3I7XG4yMjQxOlx0XHRzdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYgdnI7XG4yMjQyOlx0XHRzdHJ1Y3QgdmlmX2RldmljZSAqdmlmO1xuMjI0MzpcdFx0c3RydWN0IG1mYzZfY2FjaGUgKmM7XG4yMjQ0Olx0XHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbjIyNDU6XHRcbjIyNDY6XHRcdHN3aXRjaCAoY21kKSB7XG4yMjQ3Olx0XHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuMjI0ODpcdFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dnIsIGFyZywgc2l6ZW9mKHZyKSkpXG4yMjQ5Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4yMjUwOlx0XHRcdHJjdV9yZWFkX2xvY2soKTtcbjIyNTE6XHRcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbjIyNTI6XHRcdFx0aWYgKCFtcnQpIHtcbjIyNTM6XHRcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyNTQ6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjIyNTU6XHRcdFx0fVxuMjI1NjpcdFx0XHRpZiAodnIubWlmaSBcdTAwM2U9IG1ydC1cdTAwM2VtYXh2aWYpIHtcbjIyNTc6XHRcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyNTg6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIyNTk6XHRcdFx0fVxuMjI2MDpcdFx0XHR2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuMjI2MTpcdFx0XHR2aWYgPSBcdTAwMjZtcnQtXHUwMDNldmlmX3RhYmxlW3ZyLm1pZmldO1xuMjI2MjpcdFx0XHRpZiAoVklGX0VYSVNUUyhtcnQsIHZyLm1pZmkpKSB7XG4yMjYzOlx0XHRcdFx0dnIuaWNvdW50ID0gUkVBRF9PTkNFKHZpZi1cdTAwM2Vwa3RfaW4pO1xuMjI2NDpcdFx0XHRcdHZyLm9jb3VudCA9IFJFQURfT05DRSh2aWYtXHUwMDNlcGt0X291dCk7XG4yMjY1Olx0XHRcdFx0dnIuaWJ5dGVzID0gUkVBRF9PTkNFKHZpZi1cdTAwM2VieXRlc19pbik7XG4yMjY2Olx0XHRcdFx0dnIub2J5dGVzID0gUkVBRF9PTkNFKHZpZi1cdTAwM2VieXRlc19vdXQpO1xuMjI2NzpcdFx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuMjI2ODpcdFxuMjI2OTpcdFx0XHRcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcdTAwMjZ2ciwgc2l6ZW9mKHZyKSkpXG4yMjcwOlx0XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbjIyNzE6XHRcdFx0XHRyZXR1cm4gMDtcbjIyNzI6XHRcdFx0fVxuMjI3MzpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyNzQ6XHRcdFx0cmV0dXJuIC1FQUREUk5PVEFWQUlMO1xuMjI3NTpcdFx0Y2FzZSBTSU9DR0VUU0dDTlRfSU42OlxuMjI3NjpcdFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2c3IsIGFyZywgc2l6ZW9mKHNyKSkpXG4yMjc3Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4yMjc4Olx0XG4yMjc5Olx0XHRcdHJjdV9yZWFkX2xvY2soKTtcbjIyODA6XHRcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbjIyODE6XHRcdFx0aWYgKCFtcnQpIHtcbjIyODI6XHRcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyODM6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjIyODQ6XHRcdFx0fVxuMjI4NTpcdFx0XHRjID0gaXA2bXJfY2FjaGVfZmluZChtcnQsIFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFx1MDAyNnNyLmdycC5zaW42X2FkZHIpO1xuMjI4NjpcdFx0XHRpZiAoYykge1xuMjI4NzpcdFx0XHRcdHNyLnBrdGNudCA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLnBrdCk7XG4yMjg4Olx0XHRcdFx0c3IuYnl0ZWNudCA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLmJ5dGVzKTtcbjIyODk6XHRcdFx0XHRzci53cm9uZ19pZiA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLndyb25nX2lmKTtcbjIyOTA6XHRcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyOTE6XHRcbjIyOTI6XHRcdFx0XHRpZiAoY29weV90b191c2VyKGFyZywgXHUwMDI2c3IsIHNpemVvZihzcikpKVxuMjI5MzpcdFx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4yMjk0Olx0XHRcdFx0cmV0dXJuIDA7XG4yMjk1Olx0XHRcdH1cbjIyOTY6XHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4yMjk3Olx0XHRcdHJldHVybiAtRUFERFJOT1RBVkFJTDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE5OTQKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiAzOTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIElQdjYgTXVsdGljYXN0IFJvdXRpbmcgQ29kZSBDaGFuZ2VzKioKCk9rYXksIHNvIGxvb2tpbmcgYXQgdGhpcyBgaXA2bXJfY29tcGF0X2lvY3RsYCBmdW5jdGlvbiwgdGhlIGNvZGUmIzM5O3MgYmVlbiByZW9yZ2FuaXplZC4gSXQgdXNlZCB0byBncmFiIHRoZSBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSAoYG1ydCA9IGlwNm1yX2dldF90YWJsZSguLi4pYCkgYmVmb3JlIGFueSB1c2VyIGRhdGEgY29weWluZy4gTm93LCBpdCBkb2VzIHRoZSBgY29weV9mcm9tX3VzZXJgICpmaXJzdCosIHRoZW4gbG9ja3MgUkNVLCBmaW5kcyB0aGUgdGFibGUsIGFuZCB0aGVuLCBpZiBpdCBleGlzdHMsIHByb2NlZWRzIHRvIHBvcHVsYXRlIHRoZSB1c2VyLXNwYWNlIGZpZWxkcyBhbmQgY29weSB0aGVtIGJhY2sg4oCTIGVzc2VudGlhbGx5IHRoZSBzYW1lIGVuZCByZXN1bHQgYXMgYmVmb3JlLCBqdXN0IGEgcmUtb3JkZXJpbmcuIFRoZSBnb29kIG5ld3MgaXMsIEkgZG9uJiMzOTt0IHNlZSBhbnkgb2J2aW91cyBpbnRyb2R1Y3Rpb24gb2YgdW5pbml0aWFsaXplZCBkYXRhLCB3aGljaCBpcyBhbHdheXMgYSBjcml0aWNhbCBjb25jZXJuIHdpdGggdGhlc2Ugc29ydHMgb2YgY2hhbmdlcy4gVGhhdCYjMzk7cyBhIHJlbGllZi4KCk5vdywgSSB3YW50IHRvIGRyaWxsIGRvd24gZnVydGhlciwgc28gSSBuZWVkIHRvIGNoZWNrIG91dCBgbXJfdGFibGVfYWxsb2NgIGFuZCB0aGUgYGlwNm1yX3RhYmxlX25vX3B1Ymxpc2hgIGZ1bmN0aW9uLiBMZXQmIzM5O3Mgc2VlLi4uIGxvb2tpbmcgYXQgdGhlIGNvZGUsIGl0IGxvb2tzIGxpa2UgYGlwNm1yX3RhYmxlX25vX3B1Ymxpc2hgIGlzIGEgY2FsbGJhY2sgdGhhdCBkb2VzIG5vdGhpbmcsIHdoaWNoIGlzIGZpbmUsIGVzcGVjaWFsbHkgaWYgaXQmIzM5O3MgdXNlZCAqd2hpbGUqIHRoZSB0YWJsZSBpcyBzdGlsbCB1bnB1Ymxpc2hlZCwgYXMgdGhlIGNvbW1lbnQgc3VnZ2VzdHMuIFdlIGNhbiBpZ25vcmUgdGhhdCBmb3Igbm93LgoKVGhlbiwgdGhlIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgIGZ1bmN0aW9uIHVzZXMgYF9faXA2bXJfZ2V0X3RhYmxlYCB0byBnZXQgdGhlIE1SVC4gSWYgaXQmIzM5O3Mgbm90IGZvdW5kLCBgbXJfdGFibGVfYWxsb2NgIGlzIGNhbGxlZCB0byBhbGxvY2F0ZSBhIG5ldyB0YWJsZS4gQWxyaWdodC4gYG1yX3RhYmxlX2FsbG9jYCBsb29rcyBsaWtlIHRoZSBwbGFjZSB3aGVyZSB0aGUgY29yZSB0YWJsZSBhbGxvY2F0aW9uIGhhcHBlbnMuIExldCYjMzk7cyBkaWcgZGVlcGVyLiBJIG5lZWQgdG8gZXhhbWluZSB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIGBtcl90YWJsZV9hbGxvY2AsIHByb2JhYmx5IGluIGBuZXQvaXB2NC9pcG1yX2Jhc2UuY2Agb3IgYSBzaW1pbGFyIGZpbGUuIEkgbmVlZCB0byBzZWUgZXhhY3RseSB3aGF0IG1lbW9yeSBpbml0aWFsaXphdGlvbiBpcyBkb25lIGR1cmluZyB0YWJsZSBjcmVhdGlvbi4gSXQmIzM5O3MgbGlrZWx5IHRoYXQgdGFibGUgYWxsb2NhdGlvbiBkb2VzIHNvbWUgaW5pdGlhbGl6YXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gdmVyaWZ5IHRoYXQgaW5pdGlhbGl6YXRpb24gdG8gY29uZmlybSB0aGF0IHRoZSBjaGFuZ2VzIGRvbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHZ1bG5lcmFiaWxpdGllcyB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgbXJfdGFibGUgXFwqbXJfdGFibGVfYWxsb2MmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjg1MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSHVudGluZyBEb3duIGBtcl90YWJsZV9hbGxvY2AqKgoKT2theSwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBsb2NhdGUgYG1yX3RhYmxlX2FsbG9jYC4gSW1tZWRpYXRlbHksIG15IG1pbmQgc3RhcnRzIHRvIG1hcCBvdXQgdGhlIHBvc3NpYmlsaXRpZXMuIFRoaXMgaXMgbGlrZWx5IGEgbWVtb3J5IHJlc291cmNlIGFsbG9jYXRpb24gZnVuY3Rpb24sIGp1ZGdpbmcgYnkgdGhlIHByZWZpeCAmIzM0O21yJiMzNDsgYW5kIHRoZSBzdWZmaXggJiMzNDthbGxvYyYjMzQ7LiBHaXZlbiB0aGUgcG90ZW50aWFsIHNjb3BlIG9mIGEgc3lzdGVtIGxpa2UgdGhpcywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGJlc3QgYXBwcm9hY2ggdG8gZmluZCBpdCBlZmZpY2llbnRseS4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBlbXBsb3kgYWxsIG15IHVzdWFsIHRyaWNrcy4gV2hlcmUgZG9lcyB0aGlzIGNvZGViYXNlIGxpa2VseSByZXNpZGU/IFdoYXQgbGlicmFyaWVzIHdvdWxkIGJlIGV4cGVjdGVkPyBJJiMzOTtkIGltbWVkaWF0ZWx5IGxlYW4gdG93YXJkcyBleGFtaW5pbmcgaGVhZGVyIGZpbGVzIGZpcnN0LiBBIHF1aWNrIGBncmVwYCAob3IgZXF1aXZhbGVudCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtKSBhY3Jvc3MgdGhlIHByb2plY3Qgd2l0aCBhIHBhdHRlcm4gdGhhdCBsb29rcyBmb3IgYSBkZWNsYXJhdGlvbiB3b3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIEkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gY2hlY2sgZm9yIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMgYXMgd2VsbC4gTWF5YmUgaXQmIzM5O3MgZGVmaW5lZCB3aXRoaW4gYW4gYCNpZmRlZmAgYmxvY2suCgpJZiB0aGUgZnVuY3Rpb24gaXNuJiMzOTt0IHJlYWRpbHkgYXBwYXJlbnQgaW4gdGhlIGhlYWRlcnMsIEkmIzM5O2xsIHN3aXRjaCB0byBsb29raW5nIGF0IHRoZSBzb3VyY2UgZmlsZXMgdGhlbXNlbHZlcy4gR2l2ZW4gaXRzIG5hbWUsIGl0JiMzOTtzIGxpa2VseSBhIHJlbGF0aXZlbHkgbG93LWxldmVsIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9uLCBzbyBJJiMzOTtsbCBwcmlvcml0aXplIGV4YW1pbmluZyBtb2R1bGVzIHJlbGF0ZWQgdG8gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSwgdGFibGUgc3RydWN0dXJlcywgYW5kIGFueSBhc3NvY2lhdGVkIHJlc291cmNlIG1hbmFnZW1lbnQgb3IgYWxsb2NhdGlvbiBsYXllcnMuIEkmIzM5O2xsIGhhdmUgdG8ga2VlcCBpbiBtaW5kLCBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbSwgaXQgbWF5IGJlIGEgbW9yZSBnZW5lcmFsLXB1cnBvc2Ugcm91dGluZS4KCkkgc2hvdWxkIGFsc28gY29uc2lkZXIgd2hldGhlciBpdCYjMzk7cyBwYXJ0IG9mIGEgdGhpcmQtcGFydHkgbGlicmFyeS4gSWYgc28sIEnigJlsbCBuZWVkIHRvIGZhbWlsaWFyaXplIG15c2VsZiB3aXRoIGl0cyBkb2N1bWVudGF0aW9uIGFuZCBidWlsZCBwcm9jZXNzIHRvIHNlZSBpZiBJIGNhbiBuYXJyb3cgZG93biB3aGVyZSBpdCYjMzk7cyBpbmNsdWRlZC4KCkkgY2FuIGFsc28gaW1hZ2luZSB0aGVyZSBhcmUgc3RhdGljIGFuYWx5c2lzIHRvb2xzIHRoYXQgY291bGQgYXNzaXN0LiBBIHN5bWJvbCBsb29rdXAgZnJvbSBhIGRlYnVnZ2VyIGlmIHRoYXQmIzM5O3MgYXZhaWxhYmxlIHdvdWxkIHNwZWVkIHRoaW5ncyBhbG9uZy4gVGhlIGdvYWwgaGVyZSBpcyBlZmZpY2llbmN5IGFuZCBwcmVjaXNpb24uIEkmIzM5O2xsIG5lZWQgdG8gYmFsYW5jZSBzcGVlZCBhbmQgYWNjdXJhY3kgaW4gbXkgc2VhcmNoLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBjb25zaWRlciB0aGUgY29udGV4dCBvZiB0aGUgdXNhZ2UgYXMgdGhhdCB3aWxsIGFsc28gbGlrZWx5IGd1aWRlIG15IHByb2Nlc3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21yX3RhYmxlX2FsbG9jXFwoJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbXJvdXRlX2Jhc2UuaD0yODA9c3RydWN0IG1yX3RhYmxlICpcbmluY2x1ZGUvbGludXgvbXJvdXRlX2Jhc2UuaDoyODE6bXJfdGFibGVfYWxsb2Moc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQsXG5pbmNsdWRlL2xpbnV4L21yb3V0ZV9iYXNlLmgtMjgyLVx0ICAgICAgIHN0cnVjdCBtcl90YWJsZV9vcHMgKm9wcyxcbi0tXG5uZXQvaXB2NC9pcG1yLmM9NDI2PXN0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwbXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuLS1cbm5ldC9pcHY0L2lwbXIuYy00MzctXG5uZXQvaXB2NC9pcG1yLmM6NDM4Olx0cmV0dXJuIG1yX3RhYmxlX2FsbG9jKG5ldCwgaWQsIFx1MDAyNmlwbXJfbXJfdGFibGVfb3BzLFxubmV0L2lwdjQvaXBtci5jLTQzOS1cdFx0XHQgICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcG1yX25ld190YWJsZV9zZXQpO1xuLS1cbm5ldC9pcHY0L2lwbXJfYmFzZS5jPTQ1PXN0cnVjdCBtcl90YWJsZSAqXG5uZXQvaXB2NC9pcG1yX2Jhc2UuYzo0Njptcl90YWJsZV9hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBpZCxcbm5ldC9pcHY0L2lwbXJfYmFzZS5jLTQ3LVx0ICAgICAgIHN0cnVjdCBtcl90YWJsZV9vcHMgKm9wcyxcbi0tXG5uZXQvaXB2Ni9pcDZtci5jPTQxNT1zdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXG4tLVxubmV0L2lwdjYvaXA2bXIuYy00MjItXG5uZXQvaXB2Ni9pcDZtci5jOjQyMzpcdHJldHVybiBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcdTAwMjZpcDZtcl9tcl90YWJsZV9vcHMsXG5uZXQvaXB2Ni9pcDZtci5jLTQyNC1cdFx0XHQgICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl9uZXdfdGFibGVfc2V0KTtcbi0tXG5uZXQvaXB2Ni9pcDZtci5jPTQzMj1zdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc3RydWN0IHNvY2sgKnNrLFxuLS1cbm5ldC9pcHY2L2lwNm1yLmMtNDQ1LVxubmV0L2lwdjYvaXA2bXIuYzo0NDY6XHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcdTAwMjZpcDZtcl9tcl90YWJsZV9vcHMsXG5uZXQvaXB2Ni9pcDZtci5jLTQ0Ny1cdFx0XHQgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2gpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzg2MQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246CgoqKkRpdmluZyBpbnRvIHRoZSBJUHY0IE11bHRpY2FzdCBSb3V0ZXIgQ29kZSoqCgpPa2F5LCB0aW1lIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIHRoaXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZXMgYXJlIGFsbG9jYXRlZCwgc28gbGV0JiMzOTtzIHplcm8gaW4gb24gYG1yX3RhYmxlX2FsbG9jYC4gVGhhdCYjMzk7cyB0aGUgZnVuY3Rpb24gSSBuZWVkIHRvIGludmVzdGlnYXRlLCBhbmQgaXQgbGl2ZXMgaW4gYG5ldC9pcHY0L2lwbXJfYmFzZS5jYC4gSSYjMzk7bSBnb2luZyB0byBzdGFydCB0aGVyZSBhbmQgc2VlIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIHdoYXQgaXQgaW50ZXJhY3RzIHdpdGgsIGFuZCBob3cgaXQgaGFuZGxlcyBtZW1vcnkgYWxsb2NhdGlvbiwgYW55IHNwaW5sb2NrcywgYW5kIG90aGVyIGNvbmN1cnJlbnQgYWNjZXNzLiBJIGV4cGVjdCB0byBiZSBkaWdnaW5nIGRlZXAgaW50byB0aGUgaW50cmljYWNpZXMgb2Yga2VybmVsIGRhdGEgc3RydWN0dXJlcyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdG8gZ2V0IGEgY29tcGxldGUgcGljdHVyZS4gVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCB3b3JrIGJlZ2lucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvaXB2NC9pcG1yX2Jhc2UuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgNDU6XHRzdHJ1Y3QgbXJfdGFibGUgKlxuICA0NjpcdG1yX3RhYmxlX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkLFxuICA0NzpcdFx0ICAgICAgIHN0cnVjdCBtcl90YWJsZV9vcHMgKm9wcyxcbiAgNDg6XHRcdCAgICAgICB2b2lkICgqZXhwaXJlX2Z1bmMpKHN0cnVjdCB0aW1lcl9saXN0ICp0KSxcbiAgNDk6XHRcdCAgICAgICB2b2lkICgqdGFibGVfc2V0KShzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcbiAgNTA6XHRcdFx0XHRcdCBzdHJ1Y3QgbmV0ICpuZXQpKVxuICA1MTpcdHtcbiAgNTI6XHRcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuICA1MzpcdFx0aW50IGVycjtcbiAgNTQ6XHRcbiAgNTU6XHRcdG1ydCA9IGt6YWxsb2Nfb2JqKCptcnQpO1xuICA1NjpcdFx0aWYgKCFtcnQpXG4gIDU3Olx0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuICA1ODpcdFx0bXJ0LVx1MDAzZWlkID0gaWQ7XG4gIDU5Olx0XHR3cml0ZV9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQsIG5ldCk7XG4gIDYwOlx0XG4gIDYxOlx0XHRtcnQtXHUwMDNlb3BzID0gKm9wcztcbiAgNjI6XHRcdGVyciA9IHJobHRhYmxlX2luaXQoXHUwMDI2bXJ0LVx1MDAzZW1mY19oYXNoLCBtcnQtXHUwMDNlb3BzLnJodF9wYXJhbXMpO1xuICA2MzpcdFx0aWYgKGVycikge1xuICA2NDpcdFx0XHRrZnJlZShtcnQpO1xuICA2NTpcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuICA2NjpcdFx0fVxuICA2NzpcdFxuICA2ODpcdFx0SU5JVF9SQ1VfV09SSyhcdTAwMjZtcnQtXHUwMDNld29yaywgX19tcl9mcmVlX3RhYmxlKTtcbiAgNjk6XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNm1ydC1cdTAwM2VtZmNfY2FjaGVfbGlzdCk7XG4gIDcwOlx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtcnQtXHUwMDNlbWZjX3VucmVzX3F1ZXVlKTtcbiAgNzE6XHRcbiAgNzI6XHRcdHRpbWVyX3NldHVwKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lciwgZXhwaXJlX2Z1bmMsIDApO1xuICA3MzpcdFxuICA3NDpcdFx0bXJ0LVx1MDAzZW1yb3V0ZV9yZWdfdmlmX251bSA9IC0xO1xuICA3NTpcdFx0dGFibGVfc2V0KG1ydCwgbmV0KTtcbiAgNzY6XHRcdHJldHVybiBtcnQ7XG4gIDc3Olx0fVxuICA3ODpcdFxuICA3OTpcdHZvaWQgKm1yX21mY19maW5kX3BhcmVudChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgdm9pZCAqaGFzaGFyZywgaW50IHBhcmVudClcbiAgODA6XHR7XG4gIDgxOlx0XHRzdHJ1Y3QgcmhsaXN0X2hlYWQgKnRtcCwgKmxpc3Q7XG4gIDgyOlx0XHRzdHJ1Y3QgbXJfbWZjICpjO1xuICA4MzpcdFxuICA4NDpcdFx0bGlzdCA9IHJobHRhYmxlX2xvb2t1cChcdTAwMjZtcnQtXHUwMDNlbWZjX2hhc2gsIGhhc2hhcmcsICptcnQtXHUwMDNlb3BzLnJodF9wYXJhbXMpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDY4OQoJCQkJCQkJb3V0cHV0OiAyNzcKCQkJCQkJCXRob3VnaHRzOiAyNzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgYG1yX3RhYmxlYCBDaGFuZ2VzKioKCk9rYXksIHNvIGBtcl90YWJsZV9hbGxvY2AgdXNlcyBga3phbGxvY19vYmpgIG9uIHRoZSBgc3RydWN0IG1yX3RhYmxlYC4gVGhhdCYjMzk7cyBnb29kIOKAkyBpdCBtZWFucyB0aGUgZW50aXJlIHN0cnVjdHVyZSBpcyB6ZXJvLWluaXRpYWxpemVkIHJpZ2h0IG9mZiB0aGUgYmF0LiBObyB1bmluaXRpYWxpemVkIGdhcmJhZ2UgbGVmdCBsaW5nZXJpbmcgdGhlcmUuIE5vdywgbGV0JiMzOTtzIHRoaW5rIGFib3V0IHdoZXJlIGVsc2UgdGhpcyB0aGluZyBpcyB0b3VjaGVkLiBEZXN0cnVjdGlvbiwgcmVmY291bnRpbmcsIFJDVSwgbG9ja2luZywgbGlzdCBtYW5hZ2VtZW504oCmIGNsYXNzaWMgbWVtb3J5IGxpZmV0aW1lIGlzc3Vlcywgc3luY2hyb25pemF0aW9uLCBhbmQgUkNVIG1hbmFnZW1lbnQgZml4ZXMsIGFzIGV4cGVjdGVkLiBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcyBvciB1c2UtYWZ0ZXItZnJlZSBzaXR1YXRpb25zIHdoZW4gbXVsdGljYXN0IHRhYmxlcyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KCkFueSBidWdzIHRoYXQgKmNvdWxkKiBwb3AgdXAgaGVyZSB3b3VsZCBsaWtlbHkgYmUgc3RhbmRhcmQ6IHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZS1mcmVlLCB3aGljaCBLQVNBTiBzaG91bGQgbmFpbDsgbG9ja2luZyBwcm9ibGVtcyBvciBkZWFkbG9ja3MsIExPQ0tERVAgd2lsbCBjYXRjaCB0aG9zZTsgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlcyBvciBkb2RneSBlcnJvciBoYW5kbGluZywgc3RhbmRhcmQga2VybmVsIGNoZWNrcyBhbmQgS0FTQU4gd291bGQgdGFrZSBjYXJlIG9mIHRoYXQ7IGFuZCwgZmluYWxseSwgbWVtb3J5IGxlYWtzLCB3aGljaCBLTUVNTEVBSyBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZXhwb3NlLgoKQ3J1Y2lhbGx5LCBmcm9tIG15IGV4cGVydCBwb2ludCBvZiB2aWV3LCBub25lIG9mIHRoZXNlIGNoYW5nZXMgc2VlbSB0byBpbnRyb2R1Y2UgKmFueSogcmlza3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgYW55IHBvdGVudGlhbCBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2VyIHNwYWNlLiBBbGwgdGhlIG5ldyBvciBtb2RpZmllZCB2YXJpYWJsZXMg4oCTIHN0YWNrIGFuZCBoZWFwIOKAkyBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIGBrbWFsbG9jX29iamAgd2l0aCBleHBsaWNpdCBmaWVsZCBpbml0aWFsaXphdGlvbiwgYGt6YWxsb2Nfb2JqYCwgb3IgemVyby1pbml0aWFsaXplZCBwcmltaXRpdmVzLiBTbywgbm8gc3VycHJpc2VzIHRoZXJlLgoKVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IHRyaWdnZXIgYW55IG9mIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBwaXRmYWxscyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4mIzM5O3MgYXR0ZW50aW9uLiBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHN0YW5kYXJkIEtBU0FOIGFuZCBMT0NLREVQIHRlc3RpbmcgYXJlIG1vcmUgdGhhbiBzdWZmaWNpZW50IHRvIGNvdmVyIHRoaXMuIEkmIzM5O20gZ29pbmcgdG8gc2V0IGBOZWVkc0tNU0FOPWZhbHNlYCB3aXRoIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24uIFRoYXQmIzM5O3MgbXkgY2FsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50IChuZXQvaXB2Ni9pcDZtci5jKSB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0YWJsZXMgb24gZGVtYW5kIHdoZW4gc29ja2V0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgYW5kIHRvIGRlc3Ryb3kgdGhlbSB3aGVuIHRoZXkgYmVjb21lIHVucmVmZXJlbmNlZCBvciBlbXB0eS5cblxuLSBNZW1vcnkgQWxsb2NhdGlvbnM6IE5ldyBkeW5hbWljIGFsbG9jYXRpb25zIChzdWNoIGFzIGBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrYCBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jX29iamApIGhhdmUgYWxsIG1lbWJlciBmaWVsZHMgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFRoZSB1bmRlcmx5aW5nIG11bHRpY2FzdCB0YWJsZXMgYWxsb2NhdGVkIHZpYSBgbXJfdGFibGVfYWxsb2MoKWAgdXNlIGBremFsbG9jX29iaigpYC5cbi0gRGF0YSBzZW50IHRvIHVzZXIgc3BhY2U6IGlvY3RsL2NvbXBhdF9pb2N0bCBhbmQgZ2V0c29ja29wdCBoYW5kbGVycyBvbmx5IGNvcHkgZXhwbGljaXRseSBpbml0aWFsaXplZCBmaWVsZHMgb3IgZGF0YSBjb3BpZWQgZnJvbSB1c2VyIHNwYWNlIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRob3V0IGxlYXZpbmcgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHJlYWRpbmcgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuLSBDb250cm9sIGZsb3cgYW5kIExpZmV0aW1lczogQ2hhbmdlcyBhZmZlY3QgdGFibGUgbGlmZWN5Y2xlLCBSQ1Ugc3luY2hyb25pemF0aW9uLCBsaXN0IG1hbmlwdWxhdGlvbnMsIGFuZCBsb2NraW5nIChSVE5ML21ydF9sb2NrKS4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGVzZSBwYXRocyBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGFjY2Vzcywgb3IgbWVtb3J5IGxlYWtzLCB3aGljaCBhcmUgaGFuZGxlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIEtNRU1MRUFLLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCwgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQgKG5ldC9pcHY2L2lwNm1yLmMpIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRhYmxlcyBvbiBkZW1hbmQgd2hlbiBzb2NrZXQgb3B0aW9ucyBhcmUgY29uZmlndXJlZCBhbmQgdG8gZGVzdHJveSB0aGVtIHdoZW4gdGhleSBiZWNvbWUgdW5yZWZlcmVuY2VkIG9yIGVtcHR5LlxuXG4tIE1lbW9yeSBBbGxvY2F0aW9uczogTmV3IGR5bmFtaWMgYWxsb2NhdGlvbnMgKHN1Y2ggYXMgYHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmtgIGFsbG9jYXRlZCB2aWEgYGttYWxsb2Nfb2JqYCkgaGF2ZSBhbGwgbWVtYmVyIGZpZWxkcyAoYHdvcmtgLCBgbmV0YCwgYGlkYCkgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gVGhlIHVuZGVybHlpbmcgbXVsdGljYXN0IHRhYmxlcyBhbGxvY2F0ZWQgdmlhIGBtcl90YWJsZV9hbGxvYygpYCB1c2UgYGt6YWxsb2Nfb2JqKClgLlxuLSBEYXRhIHNlbnQgdG8gdXNlciBzcGFjZTogaW9jdGwvY29tcGF0X2lvY3RsIGFuZCBnZXRzb2Nrb3B0IGhhbmRsZXJzIG9ubHkgY29weSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGZpZWxkcyBvciBkYXRhIGNvcGllZCBmcm9tIHVzZXIgc3BhY2UgYmFjayB0byB1c2VyIHNwYWNlIHdpdGhvdXQgbGVhdmluZyB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgcmVhZGluZyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuXG4tIENvbnRyb2wgZmxvdyBhbmQgTGlmZXRpbWVzOiBDaGFuZ2VzIGFmZmVjdCB0YWJsZSBsaWZlY3ljbGUsIFJDVSBzeW5jaHJvbml6YXRpb24sIGxpc3QgbWFuaXB1bGF0aW9ucywgYW5kIGxvY2tpbmcgKFJUTkwvbXJ0X2xvY2spLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoZXNlIHBhdGhzIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgYWNjZXNzLCBvciBtZW1vcnkgbGVha3MsIHdoaWNoIGFyZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgS01FTUxFQUsuXG5cblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBpbnRyb2R1Y2VkLCBzbyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjE6NTcuMzQ3MTk5NjhaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MDkyNzI3Njg1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJUFY2XCIsXG4gICAgXCJJUFY2X01ST1VURVwiLFxuICAgIFwiSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaXA2X21yb3V0ZV9zZXRzb2Nrb3B0XCIsXG4gICAgXCJpcDZfbXJvdXRlX2dldHNvY2tvcHRcIixcbiAgICBcImlwNm1yX2lvY3RsXCIsXG4gICAgXCJpcDZtcl9jb21wYXRfaW9jdGxcIixcbiAgICBcImlwNm1yX3NrX2RvbmVcIixcbiAgICBcImlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZVwiLFxuICAgIFwiaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZVwiLFxuICAgIFwiaXA2bXJfZGVzdHJveV93b3JrZm5cIixcbiAgICBcImlwNm1yX2RldmljZV9ldmVudFwiLFxuICAgIFwiaXBtcl9leHBpcmVfcHJvY2Vzc1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50IChuZXQvaXB2Ni9pcDZtci5jKSB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0YWJsZXMgb24gZGVtYW5kIHdoZW4gc29ja2V0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgYW5kIHRvIGRlc3Ryb3kgdGhlbSB3aGVuIHRoZXkgYmVjb21lIHVucmVmZXJlbmNlZCBvciBlbXB0eS5cXG5cXG4tIE1lbW9yeSBBbGxvY2F0aW9uczogTmV3IGR5bmFtaWMgYWxsb2NhdGlvbnMgKHN1Y2ggYXMgYHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmtgIGFsbG9jYXRlZCB2aWEgYGttYWxsb2Nfb2JqYCkgaGF2ZSBhbGwgbWVtYmVyIGZpZWxkcyAoYHdvcmtgLCBgbmV0YCwgYGlkYCkgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gVGhlIHVuZGVybHlpbmcgbXVsdGljYXN0IHRhYmxlcyBhbGxvY2F0ZWQgdmlhIGBtcl90YWJsZV9hbGxvYygpYCB1c2UgYGt6YWxsb2Nfb2JqKClgLlxcbi0gRGF0YSBzZW50IHRvIHVzZXIgc3BhY2U6IGlvY3RsL2NvbXBhdF9pb2N0bCBhbmQgZ2V0c29ja29wdCBoYW5kbGVycyBvbmx5IGNvcHkgZXhwbGljaXRseSBpbml0aWFsaXplZCBmaWVsZHMgb3IgZGF0YSBjb3BpZWQgZnJvbSB1c2VyIHNwYWNlIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRob3V0IGxlYXZpbmcgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHJlYWRpbmcgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5Llxcbi0gQ29udHJvbCBmbG93IGFuZCBMaWZldGltZXM6IENoYW5nZXMgYWZmZWN0IHRhYmxlIGxpZmVjeWNsZSwgUkNVIHN5bmNocm9uaXphdGlvbiwgbGlzdCBtYW5pcHVsYXRpb25zLCBhbmQgbG9ja2luZyAoUlROTC9tcnRfbG9jaykuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhlc2UgcGF0aHMgaW52b2x2ZSB1c2UtYWZ0ZXItZnJlZSwgY29uY3VycmVudCBhY2Nlc3MsIG9yIG1lbW9yeSBsZWFrcywgd2hpY2ggYXJlIGhhbmRsZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBLTUVNTEVBSy5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCwgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGlwNm1yKSB0YWJsZSBsaWZlY3ljbGUgYW5kIGxvY2tpbmcuIEl0IGFkZHMgZHluYW1pYyB0YWJsZSBhbGxvY2F0aW9uLCBhc3luY2hyb25vdXMgdGFibGUgZGVzdHJ1Y3Rpb24gdmlhIHdvcmtxdWV1ZXMsIGFuZCB1cGRhdGVzIHNldHNvY2tvcHQsIGdldHNvY2tvcHQsIGlvY3RsLCB0aW1lciBleHBpcmF0aW9uLCBhbmQgbmV0ZGV2IG5vdGlmaWVyIGhhbmRsaW5nLiBUaGVzZSBwYXRocyBhcmUgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgcmF3IElQdjYgc29ja2V0cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjE6NTcuMzQ3MjA4NTdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyNDc2NTk3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDUyMWMwYjAyYTY4MTQyMDBiMGVlYjIwYWFmMTNjNWQ4NGU5OGZlNWJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFN1biBTZXAgNiAxNToyMTo1NiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZtci5jIGIvbmV0L2lwdjYvaXA2bXIuY1xcbmluZGV4IDNmMmVkOWI3N2RlYjUuLjI2YmQyY2NkNDIwMWEgMTAwNjQ0XFxuLS0tIGEvbmV0L2lwdjYvaXA2bXIuY1xcbisrKyBiL25ldC9pcHY2L2lwNm1yLmNcXG5AQCAtMjgsNiArMjgsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGF0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9yaGFzaHRhYmxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC93b3JrcXVldWUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY25ldC9wcm90b2NvbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2tidWZmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NuZXQvcmF3LmhcXHUwMDNlXFxuQEAgLTM2OCw2ICszNjksMTIgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxcbiBcXHRyZXR1cm4gbXJ0O1xcbiB9XFxuIFxcbitzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9sb29rdXBfc2tfdGFibGUoc3RydWN0IHNvY2sgKnNrKVxcbit7XFxuK1xcdHJldHVybiBfX2lwNm1yX2dldF90YWJsZShzb2NrX25ldChzayksXFxuK1xcdFxcdFxcdFxcdCByYXc2X3NrKHNrKS1cXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcXG4rfVxcbitcXG4gc3RhdGljIGludCBpcDZtcl9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLFxcbiBcXHRcXHRcXHQgIGNvbnN0IHZvaWQgKnB0cilcXG4ge1xcbkBAIC00MTcsNiArNDI0LDEyNCBAQCBzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXFxuIFxcdFxcdFxcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpO1xcbiB9XFxuIFxcbisvKiB0YWJsZV9zZXQgY2FsbGJhY2sgdXNlZCB3aGlsZSB0aGUgbmV3IHRhYmxlIGlzIHN0aWxsIHVucHVibGlzaGVkLiAqL1xcbitzdGF0aWMgdm9pZCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBzdHJ1Y3QgbmV0ICpuZXQpXFxuK3tcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlKHN0cnVjdCBzb2NrICpzayxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIGJvb2wgKm5ld190YWJsZSlcXG4re1xcbitcXHR1MzIgaWQgPSByYXc2X3NrKHNrKS1cXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUO1xcbitcXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XFxuK1xcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbitcXG4rXFx0QVNTRVJUX1JUTkwoKTtcXG4rXFx0Km5ld190YWJsZSA9IGZhbHNlO1xcbitcXG4rXFx0bXJ0ID0gX19pcDZtcl9nZXRfdGFibGUobmV0LCBpZCk7XFxuK1xcdGlmIChtcnQpXFxuK1xcdFxcdHJldHVybiBtcnQ7XFxuK1xcbitcXHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcXHUwMDI2aXA2bXJfbXJfdGFibGVfb3BzLFxcbitcXHRcXHRcXHQgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2gpO1xcbitcXHRpZiAoIUlTX0VSUihtcnQpKVxcbitcXHRcXHQqbmV3X3RhYmxlID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIG1ydDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgaXA2bXJfcHVibGlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlKVxcbit7XFxuK1xcdGlmIChuZXdfdGFibGUpXFxuK1xcdFxcdGlwNm1yX25ld190YWJsZV9zZXQobXJ0LCByZWFkX3BuZXQoXFx1MDAyNm1ydC1cXHUwMDNlbmV0KSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQpXFxuK3tcXG4rXFx0QVNTRVJUX1JUTkwoKTtcXG4rXFxuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxuK1xcdGlmIChtcnQtXFx1MDAzZWlkID09IFJUNl9UQUJMRV9ERkxUKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdC8qIE5lc3RlZCBORVRERVZfVU5SRUdJU1RFUiBtYXkgYWxyZWFkeSBoYXZlIHVubGlua2VkIHRoaXMgdGFibGUuICovXFxuK1xcdGlmIChfX2lwNm1yX2dldF90YWJsZShyZWFkX3BuZXQoXFx1MDAyNm1ydC1cXHUwMDNlbmV0KSwgbXJ0LVxcdTAwM2VpZCkgIT0gbXJ0KVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC1cXHUwMDNlbXJvdXRlX3NrKSB8fFxcbitcXHQgICAgbXJ0LVxcdTAwM2VtYXh2aWYgfHxcXG4rXFx0ICAgICFsaXN0X2VtcHR5KFxcdTAwMjZtcnQtXFx1MDAzZW1mY19jYWNoZV9saXN0KSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0c3Bpbl9sb2NrX2JoKFxcdTAwMjZtZmNfdW5yZXNfbG9jayk7XFxuK1xcdGlmICghbGlzdF9lbXB0eShcXHUwMDI2bXJ0LVxcdTAwM2VtZmNfdW5yZXNfcXVldWUpKSB7XFxuK1xcdFxcdHNwaW5fdW5sb2NrX2JoKFxcdTAwMjZtZmNfdW5yZXNfbG9jayk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRzcGluX3VubG9ja19iaChcXHUwMDI2bWZjX3VucmVzX2xvY2spO1xcbitcXG4rXFx0bGlzdF9kZWxfcmN1KFxcdTAwMjZtcnQtXFx1MDAzZWxpc3QpO1xcbitcXHR0aW1lcl9zaHV0ZG93bl9zeW5jKFxcdTAwMjZtcnQtXFx1MDAzZWlwbXJfZXhwaXJlX3RpbWVyKTtcXG4rXFx0bXJfdGFibGVfZnJlZShtcnQpO1xcbisjZW5kaWZcXG4rfVxcbitcXG4rI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcXG4rc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrO1xcbitcXHRzdHJ1Y3QgbmV0ICpuZXQ7XFxuK1xcdHUzMiBpZDtcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrICpkdyA9XFxuK1xcdFxcdGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrLCB3b3JrKTtcXG4rXFx0c3RydWN0IG1yX3RhYmxlICptcnQ7XFxuK1xcbitcXHRydG5sX2xvY2soKTtcXG4rXFx0bXJ0ID0gX19pcDZtcl9nZXRfdGFibGUoZHctXFx1MDAzZW5ldCwgZHctXFx1MDAzZWlkKTtcXG4rXFx0aWYgKG1ydClcXG4rXFx0XFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xcbitcXHRydG5sX3VubG9jaygpO1xcbitcXHRwdXRfbmV0KGR3LVxcdTAwM2VuZXQpO1xcbitcXHRrZnJlZShkdyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpXFxuK3tcXG4rXFx0c3RydWN0IG5ldCAqbmV0ID0gcmVhZF9wbmV0KFxcdTAwMjZtcnQtXFx1MDAzZW5ldCk7XFxuK1xcdHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmsgKmR3O1xcbitcXG4rXFx0aWYgKG1ydC1cXHUwMDNlaWQgPT0gUlQ2X1RBQkxFX0RGTFQpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGR3ID0ga21hbGxvY19vYmooKmR3LCBHRlBfQVRPTUlDKTtcXG4rXFx0aWYgKCFkdykge1xcbitcXHRcXHRtb2RfdGltZXIoXFx1MDAyNm1ydC1cXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgKyBIWik7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRpZiAoIW1heWJlX2dldF9uZXQobmV0KSkge1xcbitcXHRcXHRrZnJlZShkdyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRJTklUX1dPUksoXFx1MDAyNmR3LVxcdTAwM2V3b3JrLCBpcDZtcl9kZXN0cm95X3dvcmtmbik7XFxuK1xcdGR3LVxcdTAwM2VuZXQgPSBuZXQ7XFxuK1xcdGR3LVxcdTAwM2VpZCA9IG1ydC1cXHUwMDNlaWQ7XFxuK1xcdHF1ZXVlX3dvcmsoc3lzdGVtX2RmbF93cSwgXFx1MDAyNmR3LVxcdTAwM2V3b3JrKTtcXG4rfVxcbisjZWxzZVxcbitzdGF0aWMgdm9pZCBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxcbit7XFxuK31cXG4rI2VuZGlmXFxuK1xcbitzdGF0aWMgaW50IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlLFxcbitcXHRcXHRcXHRcXHQgIGludCBlcnIpXFxuK3tcXG4rXFx0aWYgKG5ld190YWJsZSBcXHUwMDI2XFx1MDAyNiBlcnIpXFxuK1xcdFxcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgaXA2bXJfZnJlZV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcXG4gXFx0XFx0XFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfa2lsbF9saXN0KVxcbiB7XFxuQEAgLTg2NiwxNiArOTkxLDI1IEBAIHN0YXRpYyB2b2lkIGlwbXJfZG9fZXhwaXJlX3Byb2Nlc3Moc3RydWN0IG1yX3RhYmxlICptcnQpXFxuIHN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpXFxuIHtcXG4gXFx0c3RydWN0IG1yX3RhYmxlICptcnQgPSB0aW1lcl9jb250YWluZXJfb2YobXJ0LCB0LCBpcG1yX2V4cGlyZV90aW1lcik7XFxuK1xcdGJvb2wgZW1wdHkgPSBmYWxzZTtcXG4gXFxuIFxcdGlmICghc3Bpbl90cnlsb2NrKFxcdTAwMjZtZmNfdW5yZXNfbG9jaykpIHtcXG4gXFx0XFx0bW9kX3RpbWVyKFxcdTAwMjZtcnQtXFx1MDAzZWlwbXJfZXhwaXJlX3RpbWVyLCBqaWZmaWVzICsgMSk7XFxuIFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZtcnQtXFx1MDAzZW1mY191bnJlc19xdWV1ZSkpXFxuK1xcdGlmICghbGlzdF9lbXB0eShcXHUwMDI2bXJ0LVxcdTAwM2VtZmNfdW5yZXNfcXVldWUpKSB7XFxuIFxcdFxcdGlwbXJfZG9fZXhwaXJlX3Byb2Nlc3MobXJ0KTtcXG4rXFx0XFx0ZW1wdHkgPSBsaXN0X2VtcHR5KFxcdTAwMjZtcnQtXFx1MDAzZW1mY191bnJlc19xdWV1ZSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdC8qIFJldHJ5IGFmdGVyIEdGUF9BVE9NSUMgYWxsb2NhdGlvbiBmYWlsdXJlLiAqL1xcbitcXHRcXHRlbXB0eSA9IHRydWU7XFxuK1xcdH1cXG4gXFxuIFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZtZmNfdW5yZXNfbG9jayk7XFxuK1xcbitcXHRpZiAoZW1wdHkpXFxuK1xcdFxcdGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3kobXJ0KTtcXG4gfVxcbiBcXG4gLyogRmlsbCBvaWZzIGxpc3QuIEl0IGlzIGNhbGxlZCB1bmRlciBsb2NrZWQgbXJ0X2xvY2suICovXFxuQEAgLTEyOTAsMTkgKzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxcbiB7XFxuIFxcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTtcXG4gXFx0c3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpO1xcbisjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xcbitcXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgKm5leHQ7XFxuKyNlbHNlXFxuIFxcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbisjZW5kaWZcXG4gXFx0c3RydWN0IHZpZl9kZXZpY2UgKnY7XFxuIFxcdGludCBjdDtcXG4gXFxuIFxcdGlmIChldmVudCAhPSBORVRERVZfVU5SRUdJU1RFUilcXG4gXFx0XFx0cmV0dXJuIE5PVElGWV9ET05FO1xcbiBcXG4tXFx0aXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpIHtcXG4rI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcXG4rXFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1ydCwgbmV4dCwgXFx1MDAyNm5ldC1cXHUwMDNlaXB2Ni5tcjZfdGFibGVzLCBsaXN0KVxcbisjZWxzZVxcbitcXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldClcXG4rI2VuZGlmXFxuK1xcdHtcXG4rXFx0XFx0Ym9vbCB2aWZfZ29uZSA9IGZhbHNlO1xcbitcXG4gXFx0XFx0diA9IFxcdTAwMjZtcnQtXFx1MDAzZXZpZl90YWJsZVswXTtcXG4gXFx0XFx0Zm9yIChjdCA9IDA7IGN0IFxcdTAwM2MgbXJ0LVxcdTAwM2VtYXh2aWY7IGN0KyssIHYrKykge1xcbi1cXHRcXHRcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXFx1MDAzZWRldikgPT0gZGV2KVxcbitcXHRcXHRcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXFx1MDAzZWRldikgPT0gZGV2KSB7XFxuIFxcdFxcdFxcdFxcdG1pZjZfZGVsZXRlKG1ydCwgY3QsIDEsIE5VTEwpO1xcbitcXHRcXHRcXHRcXHR2aWZfZ29uZSA9IHRydWU7XFxuK1xcdFxcdFxcdH1cXG4gXFx0XFx0fVxcbitcXHRcXHRpZiAodmlmX2dvbmUpXFxuK1xcdFxcdFxcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIE5PVElGWV9ET05FO1xcbkBAIC0xNjE4LDEwICsxNzY3LDExIEBAIHN0YXRpYyB2b2lkIG1yb3V0ZV9jbGVhbl90YWJsZXMoc3RydWN0IG1yX3RhYmxlICptcnQsIGludCBmbGFncyxcXG4gXFxuIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKVxcbiB7XFxuLVxcdGludCBlcnIgPSAwO1xcbiBcXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXG4rXFx0QVNTRVJUX1JUTkwoKTtcXG4gXFxuLVxcdHJ0bmxfbG9jaygpO1xcbiBcXHRzcGluX2xvY2soXFx1MDAyNm1ydF9sb2NrKTtcXG4gXFx0aWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LVxcdTAwM2Vtcm91dGVfc2spKSB7XFxuIFxcdFxcdGVyciA9IC1FQUREUklOVVNFO1xcbkBAIC0xNjM3LDggKzE3ODcsNiBAQCBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaylcXG4gXFx0XFx0XFx0XFx0XFx0ICAgICBORVRDT05GQV9NQ19GT1JXQVJESU5HLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgIE5FVENPTkZBX0lGSU5ERVhfQUxMLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgIG5ldC1cXHUwMDNlaXB2Ni5kZXZjb25mX2FsbCk7XFxuLVxcdHJ0bmxfdW5sb2NrKCk7XFxuLVxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbkBAIC0xNjc3LDYgKzE4MjUsNyBAQCBpbnQgaXA2bXJfc2tfZG9uZShzdHJ1Y3Qgc29jayAqc2spXFxuIFxcdFxcdFxcdG1yb3V0ZV9jbGVhbl90YWJsZXMobXJ0LCBNUlQ2X0ZMVVNIX01JRlMgfCBNUlQ2X0ZMVVNIX01GQyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIFxcdTAwMjZkZXZfa2lsbF9saXN0KTtcXG4gXFx0XFx0XFx0ZXJyID0gMDtcXG4rXFx0XFx0XFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbiBcXHR9XFxuQEAgLTE3MjMsMjcgKzE4NzIsNDUgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxcbiBcXHQgICAgaW5ldF9zayhzayktXFx1MDAzZWluZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KVxcbiBcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuIFxcbi1cXHRtcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS1cXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcXG4tXFx0aWYgKCFtcnQpXFxuLVxcdFxcdHJldHVybiAtRU5PRU5UO1xcbi1cXG4gXFx0aWYgKG9wdG5hbWUgIT0gTVJUNl9JTklUKSB7XFxuLVxcdFxcdGlmIChzayAhPSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LVxcdTAwM2Vtcm91dGVfc2spIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICAhbnNfY2FwYWJsZShuZXQtXFx1MDAzZXVzZXJfbnMsIENBUF9ORVRfQURNSU4pKVxcbitcXHRcXHRib29sIGlzX21yb3V0ZV9zayA9IGZhbHNlO1xcbitcXG4rXFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRcXHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xcbitcXHRcXHRpZiAobXJ0IFxcdTAwMjZcXHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXFx1MDAzZW1yb3V0ZV9zaykpXFxuK1xcdFxcdFxcdGlzX21yb3V0ZV9zayA9IHRydWU7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXG4rXFx0XFx0aWYgKCFpc19tcm91dGVfc2sgXFx1MDAyNlxcdTAwMjYgIW5zX2NhcGFibGUobmV0LVxcdTAwM2V1c2VyX25zLCBDQVBfTkVUX0FETUlOKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FQUNDRVM7XFxuIFxcdH1cXG4gXFxuIFxcdHN3aXRjaCAob3B0bmFtZSkge1xcbi1cXHRjYXNlIE1SVDZfSU5JVDpcXG4rXFx0Y2FzZSBNUlQ2X0lOSVQ6IHtcXG4rXFx0XFx0Ym9vbCBuZXdfdGFibGUgPSBmYWxzZTtcXG4rXFxuIFxcdFxcdGlmIChvcHRsZW4gXFx1MDAzYyBzaXplb2YoaW50KSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbi1cXHRcXHRyZXR1cm4gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcXG4rXFx0XFx0cnRubF9sb2NrKCk7XFxuK1xcdFxcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXFx1MDAyNm5ld190YWJsZSk7XFxuK1xcdFxcdGlmIChJU19FUlIobXJ0KSkge1xcbitcXHRcXHRcXHRydG5sX3VubG9jaygpO1xcbitcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihtcnQpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcXG4rXFx0XFx0cmV0ID0gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcXG4rXFx0XFx0cmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTtcXG4rXFx0XFx0cnRubF91bmxvY2soKTtcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0fVxcbiBcXG4gXFx0Y2FzZSBNUlQ2X0RPTkU6XFxuIFxcdFxcdHJldHVybiBpcDZtcl9za19kb25lKHNrKTtcXG4gXFxuLVxcdGNhc2UgTVJUNl9BRERfTUlGOlxcbitcXHRjYXNlIE1SVDZfQUREX01JRjoge1xcbitcXHRcXHRib29sIG5ld190YWJsZSA9IGZhbHNlO1xcbitcXG4gXFx0XFx0aWYgKG9wdGxlbiBcXHUwMDNjIHNpemVvZih2aWYpKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0XFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFxcdTAwMjZ2aWYsIG9wdHZhbCwgc2l6ZW9mKHZpZikpKVxcbkBAIC0xNzUxLDEwICsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4gXFx0XFx0aWYgKHZpZi5taWY2Y19taWZpIFxcdTAwM2U9IE1BWE1JRlMpXFxuIFxcdFxcdFxcdHJldHVybiAtRU5GSUxFO1xcbiBcXHRcXHRydG5sX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlKHNrLCBcXHUwMDI2bmV3X3RhYmxlKTtcXG4rXFx0XFx0aWYgKElTX0VSUihtcnQpKSB7XFxuK1xcdFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiBQVFJfRVJSKG1ydCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpO1xcbiBcXHRcXHRyZXQgPSBtaWY2X2FkZChuZXQsIG1ydCwgXFx1MDAyNnZpZixcXG4gXFx0XFx0XFx0ICAgICAgIHNrID09IHJ0bmxfZGVyZWZlcmVuY2UobXJ0LVxcdTAwM2Vtcm91dGVfc2spKTtcXG4rXFx0XFx0cmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTtcXG4gXFx0XFx0cnRubF91bmxvY2soKTtcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0fVxcbiBcXG4gXFx0Y2FzZSBNUlQ2X0RFTF9NSUY6XFxuIFxcdFxcdGlmIChvcHRsZW4gXFx1MDAzYyBzaXplb2YobWlmaV90KSlcXG5AQCAtMTc2Miw3ICsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4gXFx0XFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFxcdTAwMjZtaWZpLCBvcHR2YWwsIHNpemVvZihtaWZpX3QpKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdFxcdHJ0bmxfbG9jaygpO1xcbitcXHRcXHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xcbitcXHRcXHRpZiAoIW1ydCkge1xcbitcXHRcXHRcXHRydG5sX3VubG9jaygpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0XFx0fVxcbiBcXHRcXHRyZXQgPSBtaWY2X2RlbGV0ZShtcnQsIG1pZmksIDAsIE5VTEwpO1xcbitcXHRcXHRpZiAoIXJldClcXG4rXFx0XFx0XFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xcbiBcXHRcXHRydG5sX3VubG9jaygpO1xcbiBcXHRcXHRyZXR1cm4gcmV0O1xcbiBcXG5AQCAtMTc4MywxNyArMTk2NSwzOSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXFxuIFxcdFxcdGlmIChwYXJlbnQgPT0gMClcXG4gXFx0XFx0XFx0cGFyZW50ID0gbWZjLm1mNmNjX3BhcmVudDtcXG4gXFxuLVxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm5ldC1cXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xcbitcXHRcXHRydG5sX2xvY2soKTtcXG4rXFx0XFx0aWYgKG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDIHx8IG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDX1BST1hZKSB7XFxuK1xcdFxcdFxcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XFxuK1xcdFxcdFxcdGlmICghbXJ0KSB7XFxuK1xcdFxcdFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XFxuIFxcbi1cXHRcXHRpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpXFxuLVxcdFxcdFxcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcXHUwMDI2bWZjLCBwYXJlbnQpO1xcbi1cXHRcXHRlbHNlXFxuK1xcdFxcdFxcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXFx1MDAyNm5ld190YWJsZSk7XFxuK1xcdFxcdFxcdGlmIChJU19FUlIobXJ0KSkge1xcbitcXHRcXHRcXHRcXHRydG5sX3VubG9jaygpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihtcnQpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcXG4rXFx0XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2bmV0LVxcdTAwM2VpcHY2Lm1mY19tdXRleCk7XFxuIFxcdFxcdFxcdHJldCA9IGlwNm1yX21mY19hZGQobmV0LCBtcnQsIFxcdTAwMjZtZmMsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICBzayA9PVxcbiBcXHRcXHRcXHRcXHRcXHQgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cXHUwMDNlbXJvdXRlX3NrKSxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIHBhcmVudCk7XFxuK1xcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bmV0LVxcdTAwM2VpcHY2Lm1mY19tdXRleCk7XFxuK1xcdFxcdFxcdHJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7XFxuK1xcdFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdH1cXG4gXFxuK1xcdFxcdG11dGV4X2xvY2soXFx1MDAyNm5ldC1cXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xcbitcXHRcXHRyZXQgPSBpcDZtcl9tZmNfZGVsZXRlKG1ydCwgXFx1MDAyNm1mYywgcGFyZW50KTtcXG4gXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuZXQtXFx1MDAzZWlwdjYubWZjX211dGV4KTtcXG4rXFx0XFx0aWYgKCFyZXQpXFxuK1xcdFxcdFxcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcXG4rXFx0XFx0cnRubF91bmxvY2soKTtcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuIFxcdGNhc2UgTVJUNl9GTFVTSDpcXG5AQCAtMTgwNyw4ICsyMDExLDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4gXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcbiBcXHRcXHRydG5sX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4rXFx0XFx0aWYgKCFtcnQpIHtcXG4rXFx0XFx0XFx0cnRubF91bmxvY2soKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdFxcdH1cXG4gXFx0XFx0bXJvdXRlX2NsZWFuX3RhYmxlcyhtcnQsIGZsYWdzLCBcXHUwMDI2ZGV2X2tpbGxfbGlzdCk7XFxuIFxcdFxcdHVucmVnaXN0ZXJfbmV0ZGV2aWNlX21hbnkoXFx1MDAyNmRldl9raWxsX2xpc3QpO1xcbitcXHRcXHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XFxuIFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHR9XFxuQEAgLTE4MjQsNyArMjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXFxuIFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXHRcXHRpZiAoY29weV9mcm9tX3NvY2twdHIoXFx1MDAyNnYsIG9wdHZhbCwgc2l6ZW9mKHYpKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4rXFx0XFx0aWYgKCFtcnQpIHtcXG4rXFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHR9XFxuIFxcdFxcdFdSSVRFX09OQ0UobXJ0LVxcdTAwM2Vtcm91dGVfZG9fYXNzZXJ0LCB2KTtcXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHR9XFxuIFxcbkBAIC0xODQyLDYgKzIwNTksMTEgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxcbiBcXHRcXHRkb193cm1pZndob2xlID0gKHYgPT0gTVJUNk1TR19XUk1JRldIT0xFKTtcXG4gXFx0XFx0diA9ICEhdjtcXG4gXFx0XFx0cnRubF9sb2NrKCk7XFxuK1xcdFxcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XFxuK1xcdFxcdGlmICghbXJ0KSB7XFxuK1xcdFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHR9XFxuIFxcdFxcdHJldCA9IDA7XFxuIFxcdFxcdGlmICh2ICE9IG1ydC1cXHUwMDNlbXJvdXRlX2RvX3BpbSkge1xcbiBcXHRcXHRcXHRXUklURV9PTkNFKG1ydC1cXHUwMDNlbXJvdXRlX2RvX3BpbSwgdik7XFxuQEAgLTE4NjUsMTggKzIwODcsMTYgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxcbiBcXHRcXHQvKiBcXFwicGltNnJlZyV1XFxcIiBzaG91bGQgbm90IGV4Y2VlZCAxNiBieXRlcyAoSUZOQU1TSVopICovXFxuIFxcdFxcdGlmICh2ICE9IFJUX1RBQkxFX0RFRkFVTFQgXFx1MDAyNlxcdTAwMjYgdiBcXHUwMDNlPSAxMDAwMDAwMDApXFxuIFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHRcXHRpZiAoc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cXHUwMDNlbXJvdXRlX3NrKSlcXG4rXFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRcXHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xcbitcXHRcXHRpZiAobXJ0IFxcdTAwMjZcXHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXFx1MDAzZW1yb3V0ZV9zaykpIHtcXG4rXFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuIFxcdFxcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdFxcdH1cXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuIFxcbi1cXHRcXHRydG5sX2xvY2soKTtcXG4tXFx0XFx0cmV0ID0gMDtcXG4tXFx0XFx0bXJ0ID0gaXA2bXJfbmV3X3RhYmxlKG5ldCwgdik7XFxuLVxcdFxcdGlmIChJU19FUlIobXJ0KSlcXG4tXFx0XFx0XFx0cmV0ID0gUFRSX0VSUihtcnQpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdHJhdzZfc2soc2spLVxcdTAwM2VpcDZtcl90YWJsZSA9IHY7XFxuLVxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuLVxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJhdzZfc2soc2spLVxcdTAwM2VpcDZtcl90YWJsZSA9IHY7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXHR9XFxuICNlbmRpZlxcbiBcXHQvKlxcbkBAIC0xODk3LDE2ICsyMTE3LDE4IEBAIGludCBpcDZfbXJvdXRlX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4ge1xcbiBcXHRpbnQgb2xyO1xcbiBcXHRpbnQgdmFsO1xcbi1cXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XFxuIFxcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbiBcXG4gXFx0aWYgKHNrLVxcdTAwM2Vza190eXBlICE9IFNPQ0tfUkFXIHx8XFxuIFxcdCAgICBpbmV0X3NrKHNrKS1cXHUwMDNlaW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpXFxuIFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gXFxuLVxcdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVxcdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xcbi1cXHRpZiAoIW1ydClcXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xcbitcXHRpZiAoIW1ydCkge1xcbitcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4gXFxuIFxcdHN3aXRjaCAob3B0bmFtZSkge1xcbiBcXHRjYXNlIE1SVDZfVkVSU0lPTjpcXG5AQCAtMTkyMSw4ICsyMTQzLDEwIEBAIGludCBpcDZfbXJvdXRlX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4gXFx0XFx0dmFsID0gUkVBRF9PTkNFKG1ydC1cXHUwMDNlbXJvdXRlX2RvX2Fzc2VydCk7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRkZWZhdWx0OlxcbitcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFx0XFx0cmV0dXJuIC1FTk9QUk9UT09QVDtcXG4gXFx0fVxcbitcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFxuIFxcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcXHUwMDI2b2xyLCBvcHRsZW4sIHNpemVvZihpbnQpKSlcXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuQEAgLTE5NDcsMjAgKzIxNzEsMjMgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKVxcbiBcXHRzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqdnI7XFxuIFxcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XFxuIFxcdHN0cnVjdCBtZmM2X2NhY2hlICpjO1xcbi1cXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XFxuIFxcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbiBcXG4tXFx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXFx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XFxuLVxcdGlmICghbXJ0KVxcbitcXHRyY3VfcmVhZF9sb2NrKCk7XFxuK1xcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XFxuK1xcdGlmICghbXJ0KSB7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0fVxcbiBcXG4gXFx0c3dpdGNoIChjbWQpIHtcXG4gXFx0Y2FzZSBTSU9DR0VUTUlGQ05UX0lONjpcXG4gXFx0XFx0dnIgPSAoc3RydWN0IHNpb2NfbWlmX3JlcTYgKilhcmc7XFxuLVxcdFxcdGlmICh2ci1cXHUwMDNlbWlmaSBcXHUwMDNlPSBtcnQtXFx1MDAzZW1heHZpZilcXG4rXFx0XFx0aWYgKHZyLVxcdTAwM2VtaWZpIFxcdTAwM2U9IG1ydC1cXHUwMDNlbWF4dmlmKSB7XFxuK1xcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0fVxcbiBcXHRcXHR2ci1cXHUwMDNlbWlmaSA9IGFycmF5X2luZGV4X25vc3BlYyh2ci1cXHUwMDNlbWlmaSwgbXJ0LVxcdTAwM2VtYXh2aWYpO1xcbi1cXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIFxcdFxcdHZpZiA9IFxcdTAwMjZtcnQtXFx1MDAzZXZpZl90YWJsZVt2ci1cXHUwMDNlbWlmaV07XFxuIFxcdFxcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnItXFx1MDAzZW1pZmkpKSB7XFxuIFxcdFxcdFxcdHZyLVxcdTAwM2VpY291bnQgPSBSRUFEX09OQ0UodmlmLVxcdTAwM2Vwa3RfaW4pO1xcbkBAIC0xOTc0LDggKzIyMDEsNiBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXFxuIFxcdFxcdHJldHVybiAtRUFERFJOT1RBVkFJTDtcXG4gXFx0Y2FzZSBTSU9DR0VUU0dDTlRfSU42OlxcbiBcXHRcXHRzciA9IChzdHJ1Y3Qgc2lvY19zZ19yZXE2ICopYXJnO1xcbi1cXG4tXFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiBcXHRcXHRjID0gaXA2bXJfY2FjaGVfZmluZChtcnQsIFxcdTAwMjZzci1cXHUwMDNlc3JjLnNpbjZfYWRkcixcXG4gXFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2c3ItXFx1MDAzZWdycC5zaW42X2FkZHIpO1xcbiBcXHRcXHRpZiAoYykge1xcbkBAIC0xOTg4LDYgKzIyMTMsNyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXFxuIFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XFxuIFxcdGRlZmF1bHQ6XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xcbiBcXHR9XFxuIH1cXG5AQCAtMjAxNSwyMSArMjI0MSwyMyBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcXG4gXFx0c3RydWN0IGNvbXBhdF9zaW9jX21pZl9yZXE2IHZyO1xcbiBcXHRzdHJ1Y3QgdmlmX2RldmljZSAqdmlmO1xcbiBcXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcXG4tXFx0c3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spO1xcbiBcXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcXG4gXFxuLVxcdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVxcdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xcbi1cXHRpZiAoIW1ydClcXG4tXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuLVxcbiBcXHRzd2l0Y2ggKGNtZCkge1xcbiBcXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxcbiBcXHRcXHRpZiAoY29weV9mcm9tX3VzZXIoXFx1MDAyNnZyLCBhcmcsIHNpemVvZih2cikpKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4tXFx0XFx0aWYgKHZyLm1pZmkgXFx1MDAzZT0gbXJ0LVxcdTAwM2VtYXh2aWYpXFxuK1xcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4rXFx0XFx0aWYgKCFtcnQpIHtcXG4rXFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmICh2ci5taWZpIFxcdTAwM2U9IG1ydC1cXHUwMDNlbWF4dmlmKSB7XFxuK1xcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0fVxcbiBcXHRcXHR2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC1cXHUwMDNlbWF4dmlmKTtcXG4tXFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiBcXHRcXHR2aWYgPSBcXHUwMDI2bXJ0LVxcdTAwM2V2aWZfdGFibGVbdnIubWlmaV07XFxuIFxcdFxcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnIubWlmaSkpIHtcXG4gXFx0XFx0XFx0dnIuaWNvdW50ID0gUkVBRF9PTkNFKHZpZi1cXHUwMDNlcGt0X2luKTtcXG5AQCAtMjA0OSw2ICsyMjc3LDExIEBAIGludCBpcDZtcl9jb21wYXRfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gXFxuIFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4rXFx0XFx0aWYgKCFtcnQpIHtcXG4rXFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHR9XFxuIFxcdFxcdGMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgXFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFxcdTAwMjZzci5ncnAuc2luNl9hZGRyKTtcXG4gXFx0XFx0aWYgKGMpIHtcXG4gXFx0XFx0XFx0c3IucGt0Y250ID0gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2Yy1cXHUwMDNlX2MubWZjX3VuLnJlcy5wa3QpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMTo1Ny44NzI4MTcyNDJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE2NTkzMjIwNDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklQVjZcIixcbiAgICBcIklQVjZfTVJPVVRFXCIsXG4gICAgXCJJUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJpcDZfbXJvdXRlX3NldHNvY2tvcHRcIixcbiAgICBcImlwNl9tcm91dGVfZ2V0c29ja29wdFwiLFxuICAgIFwiaXA2bXJfaW9jdGxcIixcbiAgICBcImlwNm1yX2NvbXBhdF9pb2N0bFwiLFxuICAgIFwiaXA2bXJfc2tfZG9uZVwiLFxuICAgIFwiaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlXCIsXG4gICAgXCJpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlXCIsXG4gICAgXCJpcDZtcl9kZXN0cm95X3dvcmtmblwiLFxuICAgIFwiaXA2bXJfZGV2aWNlX2V2ZW50XCIsXG4gICAgXCJpcG1yX2V4cGlyZV9wcm9jZXNzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGlwNm1yKSB0YWJsZSBsaWZlY3ljbGUgYW5kIGxvY2tpbmcuIEl0IGFkZHMgZHluYW1pYyB0YWJsZSBhbGxvY2F0aW9uLCBhc3luY2hyb25vdXMgdGFibGUgZGVzdHJ1Y3Rpb24gdmlhIHdvcmtxdWV1ZXMsIGFuZCB1cGRhdGVzIHNldHNvY2tvcHQsIGdldHNvY2tvcHQsIGlvY3RsLCB0aW1lciBleHBpcmF0aW9uLCBhbmQgbmV0ZGV2IG5vdGlmaWVyIGhhbmRsaW5nLiBUaGVzZSBwYXRocyBhcmUgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgcmF3IElQdjYgc29ja2V0cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA1MjFjMGIwMmE2ODE0MjAwYjBlZWIyMGFhZjEzYzVkODRlOThmZTViXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFN1biBTZXAgNiAxNToyMTo1NiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jXG5pbmRleCAzZjJlZDliNzdkZWI1Li4yNmJkMmNjZDQyMDFhIDEwMDY0NFxuLS0tIGEvbmV0L2lwdjYvaXA2bXIuY1xuKysrIGIvbmV0L2lwdjYvaXA2bXIuY1xuQEAgLTI4LDYgKzI4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb21wYXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JoYXNodGFibGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0L3Byb3RvY29sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9za2J1ZmYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9yYXcuaFx1MDAzZVxuQEAgLTM2OCw2ICszNjksMTIgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0cmV0dXJuIG1ydDtcbiB9XG4gXG4rc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbG9va3VwX3NrX3RhYmxlKHN0cnVjdCBzb2NrICpzaylcbit7XG4rXHRyZXR1cm4gX19pcDZtcl9nZXRfdGFibGUoc29ja19uZXQoc2spLFxuK1x0XHRcdFx0IHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4rfVxuK1xuIHN0YXRpYyBpbnQgaXA2bXJfaGFzaF9jbXAoc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgKmFyZyxcbiBcdFx0XHQgIGNvbnN0IHZvaWQgKnB0cilcbiB7XG5AQCAtNDE3LDYgKzQyNCwxMjQgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0XHRcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpO1xuIH1cbiBcbisvKiB0YWJsZV9zZXQgY2FsbGJhY2sgdXNlZCB3aGlsZSB0aGUgbmV3IHRhYmxlIGlzIHN0aWxsIHVucHVibGlzaGVkLiAqL1xuK3N0YXRpYyB2b2lkIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2goc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBuZXQgKm5ldClcbit7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssXG4rXHRcdFx0XHRcdFx0ICAgIGJvb2wgKm5ld190YWJsZSlcbit7XG4rXHR1MzIgaWQgPSByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQ7XG4rXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4rXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbitcbitcdEFTU0VSVF9SVE5MKCk7XG4rXHQqbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4rXHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShuZXQsIGlkKTtcbitcdGlmIChtcnQpXG4rXHRcdHJldHVybiBtcnQ7XG4rXG4rXHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcdTAwMjZpcDZtcl9tcl90YWJsZV9vcHMsXG4rXHRcdFx0ICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKTtcbitcdGlmICghSVNfRVJSKG1ydCkpXG4rXHRcdCpuZXdfdGFibGUgPSB0cnVlO1xuK1x0cmV0dXJuIG1ydDtcbit9XG4rXG4rc3RhdGljIHZvaWQgaXA2bXJfcHVibGlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlKVxuK3tcbitcdGlmIChuZXdfdGFibGUpXG4rXHRcdGlwNm1yX25ld190YWJsZV9zZXQobXJ0LCByZWFkX3BuZXQoXHUwMDI2bXJ0LVx1MDAzZW5ldCkpO1xuK31cbitcbitzdGF0aWMgdm9pZCBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuK3tcbitcdEFTU0VSVF9SVE5MKCk7XG4rXG4rI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbitcdGlmIChtcnQtXHUwMDNlaWQgPT0gUlQ2X1RBQkxFX0RGTFQpXG4rXHRcdHJldHVybjtcbitcdC8qIE5lc3RlZCBORVRERVZfVU5SRUdJU1RFUiBtYXkgYWxyZWFkeSBoYXZlIHVubGlua2VkIHRoaXMgdGFibGUuICovXG4rXHRpZiAoX19pcDZtcl9nZXRfdGFibGUocmVhZF9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQpLCBtcnQtXHUwMDNlaWQpICE9IG1ydClcbitcdFx0cmV0dXJuO1xuK1x0aWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LVx1MDAzZW1yb3V0ZV9zaykgfHxcbitcdCAgICBtcnQtXHUwMDNlbWF4dmlmIHx8XG4rXHQgICAgIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY19jYWNoZV9saXN0KSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c3Bpbl9sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbitcdGlmICghbGlzdF9lbXB0eShcdTAwMjZtcnQtXHUwMDNlbWZjX3VucmVzX3F1ZXVlKSkge1xuK1x0XHRzcGluX3VubG9ja19iaChcdTAwMjZtZmNfdW5yZXNfbG9jayk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbitcbitcdGxpc3RfZGVsX3JjdShcdTAwMjZtcnQtXHUwMDNlbGlzdCk7XG4rXHR0aW1lcl9zaHV0ZG93bl9zeW5jKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lcik7XG4rXHRtcl90YWJsZV9mcmVlKG1ydCk7XG4rI2VuZGlmXG4rfVxuK1xuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4rc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XG4rXHRzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yaztcbitcdHN0cnVjdCBuZXQgKm5ldDtcbitcdHUzMiBpZDtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrICpkdyA9XG4rXHRcdGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrLCB3b3JrKTtcbitcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuK1xuK1x0cnRubF9sb2NrKCk7XG4rXHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShkdy1cdTAwM2VuZXQsIGR3LVx1MDAzZWlkKTtcbitcdGlmIChtcnQpXG4rXHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbitcdHJ0bmxfdW5sb2NrKCk7XG4rXHRwdXRfbmV0KGR3LVx1MDAzZW5ldCk7XG4rXHRrZnJlZShkdyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpXG4re1xuK1x0c3RydWN0IG5ldCAqbmV0ID0gcmVhZF9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQpO1xuK1x0c3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHc7XG4rXG4rXHRpZiAobXJ0LVx1MDAzZWlkID09IFJUNl9UQUJMRV9ERkxUKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRkdyA9IGttYWxsb2Nfb2JqKCpkdywgR0ZQX0FUT01JQyk7XG4rXHRpZiAoIWR3KSB7XG4rXHRcdG1vZF90aW1lcihcdTAwMjZtcnQtXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgKyBIWik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghbWF5YmVfZ2V0X25ldChuZXQpKSB7XG4rXHRcdGtmcmVlKGR3KTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0SU5JVF9XT1JLKFx1MDAyNmR3LVx1MDAzZXdvcmssIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKTtcbitcdGR3LVx1MDAzZW5ldCA9IG5ldDtcbitcdGR3LVx1MDAzZWlkID0gbXJ0LVx1MDAzZWlkO1xuK1x0cXVldWVfd29yayhzeXN0ZW1fZGZsX3dxLCBcdTAwMjZkdy1cdTAwM2V3b3JrKTtcbit9XG4rI2Vsc2VcbitzdGF0aWMgdm9pZCBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuK3tcbit9XG4rI2VuZGlmXG4rXG4rc3RhdGljIGludCBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBib29sIG5ld190YWJsZSxcbitcdFx0XHRcdCAgaW50IGVycilcbit7XG4rXHRpZiAobmV3X3RhYmxlIFx1MDAyNlx1MDAyNiBlcnIpXG4rXHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIGlwNm1yX2ZyZWVfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfa2lsbF9saXN0KVxuIHtcbkBAIC04NjYsMTYgKzk5MSwyNSBAQCBzdGF0aWMgdm9pZCBpcG1yX2RvX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuIHN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpXG4ge1xuIFx0c3RydWN0IG1yX3RhYmxlICptcnQgPSB0aW1lcl9jb250YWluZXJfb2YobXJ0LCB0LCBpcG1yX2V4cGlyZV90aW1lcik7XG4rXHRib29sIGVtcHR5ID0gZmFsc2U7XG4gXG4gXHRpZiAoIXNwaW5fdHJ5bG9jayhcdTAwMjZtZmNfdW5yZXNfbG9jaykpIHtcbiBcdFx0bW9kX3RpbWVyKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lciwgamlmZmllcyArIDEpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG4gXG4tXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpXG4rXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpIHtcbiBcdFx0aXBtcl9kb19leHBpcmVfcHJvY2VzcyhtcnQpO1xuK1x0XHRlbXB0eSA9IGxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBSZXRyeSBhZnRlciBHRlBfQVRPTUlDIGFsbG9jYXRpb24gZmFpbHVyZS4gKi9cbitcdFx0ZW1wdHkgPSB0cnVlO1xuK1x0fVxuIFxuIFx0c3Bpbl91bmxvY2soXHUwMDI2bWZjX3VucmVzX2xvY2spO1xuK1xuK1x0aWYgKGVtcHR5KVxuK1x0XHRpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KG1ydCk7XG4gfVxuIFxuIC8qIEZpbGwgb2lmcyBsaXN0LiBJdCBpcyBjYWxsZWQgdW5kZXIgbG9ja2VkIG1ydF9sb2NrLiAqL1xuQEAgLTEyOTAsMTkgKzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxuIHtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTtcbisjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xuK1x0c3RydWN0IG1yX3RhYmxlICptcnQsICpuZXh0O1xuKyNlbHNlXG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbisjZW5kaWZcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2O1xuIFx0aW50IGN0O1xuIFxuIFx0aWYgKGV2ZW50ICE9IE5FVERFVl9VTlJFR0lTVEVSKVxuIFx0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4gXG4tXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldCkge1xuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCBcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tcjZfdGFibGVzLCBsaXN0KVxuKyNlbHNlXG4rXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldClcbisjZW5kaWZcbitcdHtcbitcdFx0Ym9vbCB2aWZfZ29uZSA9IGZhbHNlO1xuK1xuIFx0XHR2ID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVswXTtcbiBcdFx0Zm9yIChjdCA9IDA7IGN0IFx1MDAzYyBtcnQtXHUwMDNlbWF4dmlmOyBjdCsrLCB2KyspIHtcbi1cdFx0XHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXHUwMDNlZGV2KSA9PSBkZXYpXG4rXHRcdFx0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcih2LVx1MDAzZWRldikgPT0gZGV2KSB7XG4gXHRcdFx0XHRtaWY2X2RlbGV0ZShtcnQsIGN0LCAxLCBOVUxMKTtcbitcdFx0XHRcdHZpZl9nb25lID0gdHJ1ZTtcbitcdFx0XHR9XG4gXHRcdH1cbitcdFx0aWYgKHZpZl9nb25lKVxuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdH1cbiBcbiBcdHJldHVybiBOT1RJRllfRE9ORTtcbkBAIC0xNjE4LDEwICsxNzY3LDExIEBAIHN0YXRpYyB2b2lkIG1yb3V0ZV9jbGVhbl90YWJsZXMoc3RydWN0IG1yX3RhYmxlICptcnQsIGludCBmbGFncyxcbiBcbiBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaylcbiB7XG4tXHRpbnQgZXJyID0gMDtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbitcdGludCBlcnIgPSAwO1xuK1xuK1x0QVNTRVJUX1JUTkwoKTtcbiBcbi1cdHJ0bmxfbG9jaygpO1xuIFx0c3Bpbl9sb2NrKFx1MDAyNm1ydF9sb2NrKTtcbiBcdGlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC1cdTAwM2Vtcm91dGVfc2spKSB7XG4gXHRcdGVyciA9IC1FQUREUklOVVNFO1xuQEAgLTE2MzcsOCArMTc4Nyw2IEBAIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKVxuIFx0XHRcdFx0XHQgICAgIE5FVENPTkZBX01DX0ZPUldBUkRJTkcsXG4gXHRcdFx0XHRcdCAgICAgTkVUQ09ORkFfSUZJTkRFWF9BTEwsXG4gXHRcdFx0XHRcdCAgICAgbmV0LVx1MDAzZWlwdjYuZGV2Y29uZl9hbGwpO1xuLVx0cnRubF91bmxvY2soKTtcbi1cbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuQEAgLTE2NzcsNiArMTgyNSw3IEBAIGludCBpcDZtcl9za19kb25lKHN0cnVjdCBzb2NrICpzaylcbiBcdFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgTVJUNl9GTFVTSF9NSUZTIHwgTVJUNl9GTFVTSF9NRkMsXG4gXHRcdFx0XHRcdCAgICBcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiBcdFx0XHRlcnIgPSAwO1xuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuIFx0fVxuQEAgLTE3MjMsMjcgKzE4NzIsNDUgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0ICAgIGluZXRfc2soc2spLVx1MDAzZWluZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KVxuIFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gXG4tXHRtcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xuLVx0aWYgKCFtcnQpXG4tXHRcdHJldHVybiAtRU5PRU5UO1xuLVxuIFx0aWYgKG9wdG5hbWUgIT0gTVJUNl9JTklUKSB7XG4tXHRcdGlmIChzayAhPSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LVx1MDAzZW1yb3V0ZV9zaykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAhbnNfY2FwYWJsZShuZXQtXHUwMDNldXNlcl9ucywgQ0FQX05FVF9BRE1JTikpXG4rXHRcdGJvb2wgaXNfbXJvdXRlX3NrID0gZmFsc2U7XG4rXG4rXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKG1ydCBcdTAwMjZcdTAwMjYgc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spKVxuK1x0XHRcdGlzX21yb3V0ZV9zayA9IHRydWU7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1xuK1x0XHRpZiAoIWlzX21yb3V0ZV9zayBcdTAwMjZcdTAwMjYgIW5zX2NhcGFibGUobmV0LVx1MDAzZXVzZXJfbnMsIENBUF9ORVRfQURNSU4pKVxuIFx0XHRcdHJldHVybiAtRUFDQ0VTO1xuIFx0fVxuIFxuIFx0c3dpdGNoIChvcHRuYW1lKSB7XG4tXHRjYXNlIE1SVDZfSU5JVDpcbitcdGNhc2UgTVJUNl9JTklUOiB7XG4rXHRcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4gXHRcdGlmIChvcHRsZW4gXHUwMDNjIHNpemVvZihpbnQpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0XHRyZXR1cm4gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcbitcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKTtcbitcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtcnQpO1xuK1x0XHR9XG4rXHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbitcdFx0cmV0ID0gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcbitcdFx0cmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTtcbitcdFx0cnRubF91bmxvY2soKTtcbitcdFx0cmV0dXJuIHJldDtcbitcdH1cbiBcbiBcdGNhc2UgTVJUNl9ET05FOlxuIFx0XHRyZXR1cm4gaXA2bXJfc2tfZG9uZShzayk7XG4gXG4tXHRjYXNlIE1SVDZfQUREX01JRjpcbitcdGNhc2UgTVJUNl9BRERfTUlGOiB7XG4rXHRcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4gXHRcdGlmIChvcHRsZW4gXHUwMDNjIHNpemVvZih2aWYpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFx0XHRpZiAoY29weV9mcm9tX3NvY2twdHIoXHUwMDI2dmlmLCBvcHR2YWwsIHNpemVvZih2aWYpKSlcbkBAIC0xNzUxLDEwICsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHZpZi5taWY2Y19taWZpIFx1MDAzZT0gTUFYTUlGUylcbiBcdFx0XHRyZXR1cm4gLUVORklMRTtcbiBcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKTtcbitcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtcnQpO1xuK1x0XHR9XG4rXHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbiBcdFx0cmV0ID0gbWlmNl9hZGQobmV0LCBtcnQsIFx1MDAyNnZpZixcbiBcdFx0XHQgICAgICAgc2sgPT0gcnRubF9kZXJlZmVyZW5jZShtcnQtXHUwMDNlbXJvdXRlX3NrKSk7XG4rXHRcdHJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4rXHR9XG4gXG4gXHRjYXNlIE1SVDZfREVMX01JRjpcbiBcdFx0aWYgKG9wdGxlbiBcdTAwM2Mgc2l6ZW9mKG1pZmlfdCkpXG5AQCAtMTc2Miw3ICsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFx1MDAyNm1pZmksIG9wdHZhbCwgc2l6ZW9mKG1pZmlfdCkpKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0XHRydG5sX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4gXHRcdHJldCA9IG1pZjZfZGVsZXRlKG1ydCwgbWlmaSwgMCwgTlVMTCk7XG4rXHRcdGlmICghcmV0KVxuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0cnRubF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNzgzLDE3ICsxOTY1LDM5IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHBhcmVudCA9PSAwKVxuIFx0XHRcdHBhcmVudCA9IG1mYy5tZjZjY19wYXJlbnQ7XG4gXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbitcdFx0cnRubF9sb2NrKCk7XG4rXHRcdGlmIChvcHRuYW1lID09IE1SVDZfREVMX01GQyB8fCBvcHRuYW1lID09IE1SVDZfREVMX01GQ19QUk9YWSkge1xuK1x0XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRcdHJ0bmxfdW5sb2NrKCk7XG4rXHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0Ym9vbCBuZXdfdGFibGUgPSBmYWxzZTtcbiBcbi1cdFx0aWYgKG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDIHx8IG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDX1BST1hZKVxuLVx0XHRcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcdTAwMjZtZmMsIHBhcmVudCk7XG4tXHRcdGVsc2VcbitcdFx0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4rXHRcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbitcdFx0XHR9XG4rXHRcdFx0aXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpO1xuK1x0XHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbiBcdFx0XHRyZXQgPSBpcDZtcl9tZmNfYWRkKG5ldCwgbXJ0LCBcdTAwMjZtZmMsXG4gXHRcdFx0XHRcdCAgICBzayA9PVxuIFx0XHRcdFx0XHQgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spLFxuIFx0XHRcdFx0XHQgICAgcGFyZW50KTtcbitcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbitcdFx0XHRyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpO1xuK1x0XHRcdHJ0bmxfdW5sb2NrKCk7XG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuIFxuK1x0XHRtdXRleF9sb2NrKFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1mY19tdXRleCk7XG4rXHRcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcdTAwMjZtZmMsIHBhcmVudCk7XG4gXHRcdG11dGV4X3VubG9jayhcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xuK1x0XHRpZiAoIXJldClcbitcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4rXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4gXG4gXHRjYXNlIE1SVDZfRkxVU0g6XG5AQCAtMTgwNyw4ICsyMDExLDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbiBcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdGlmICghbXJ0KSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgZmxhZ3MsIFx1MDAyNmRldl9raWxsX2xpc3QpO1xuIFx0XHR1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KFx1MDAyNmRldl9raWxsX2xpc3QpO1xuK1x0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAwO1xuIFx0fVxuQEAgLTE4MjQsNyArMjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZ2LCBvcHR2YWwsIHNpemVvZih2KSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRXUklURV9PTkNFKG1ydC1cdTAwM2Vtcm91dGVfZG9fYXNzZXJ0LCB2KTtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAwO1xuIFx0fVxuIFxuQEAgLTE4NDIsNiArMjA1OSwxMSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdGRvX3dybWlmd2hvbGUgPSAodiA9PSBNUlQ2TVNHX1dSTUlGV0hPTEUpO1xuIFx0XHR2ID0gISF2O1xuIFx0XHRydG5sX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4gXHRcdHJldCA9IDA7XG4gXHRcdGlmICh2ICE9IG1ydC1cdTAwM2Vtcm91dGVfZG9fcGltKSB7XG4gXHRcdFx0V1JJVEVfT05DRShtcnQtXHUwMDNlbXJvdXRlX2RvX3BpbSwgdik7XG5AQCAtMTg2NSwxOCArMjA4NywxNiBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdC8qIFwicGltNnJlZyV1XCIgc2hvdWxkIG5vdCBleGNlZWQgMTYgYnl0ZXMgKElGTkFNU0laKSAqL1xuIFx0XHRpZiAodiAhPSBSVF9UQUJMRV9ERUZBVUxUIFx1MDAyNlx1MDAyNiB2IFx1MDAzZT0gMTAwMDAwMDAwKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRpZiAoc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spKVxuK1x0XHRyY3VfcmVhZF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdGlmIChtcnQgXHUwMDI2XHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSkge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdH1cbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXG4tXHRcdHJ0bmxfbG9jaygpO1xuLVx0XHRyZXQgPSAwO1xuLVx0XHRtcnQgPSBpcDZtcl9uZXdfdGFibGUobmV0LCB2KTtcbi1cdFx0aWYgKElTX0VSUihtcnQpKVxuLVx0XHRcdHJldCA9IFBUUl9FUlIobXJ0KTtcbi1cdFx0ZWxzZVxuLVx0XHRcdHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID0gdjtcbi1cdFx0cnRubF91bmxvY2soKTtcbi1cdFx0cmV0dXJuIHJldDtcbitcdFx0cmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPSB2O1xuK1x0XHRyZXR1cm4gMDtcbiBcdH1cbiAjZW5kaWZcbiBcdC8qXG5AQCAtMTg5NywxNiArMjExNywxOCBAQCBpbnQgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4ge1xuIFx0aW50IG9scjtcbiBcdGludCB2YWw7XG4tXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiBcbiBcdGlmIChzay1cdTAwM2Vza190eXBlICE9IFNPQ0tfUkFXIHx8XG4gXHQgICAgaW5ldF9zayhzayktXHUwMDNlaW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpXG4gXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbitcdHJjdV9yZWFkX2xvY2soKTtcbitcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRpZiAoIW1ydCkge1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4gXG4gXHRzd2l0Y2ggKG9wdG5hbWUpIHtcbiBcdGNhc2UgTVJUNl9WRVJTSU9OOlxuQEAgLTE5MjEsOCArMjE0MywxMCBAQCBpbnQgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdHZhbCA9IFJFQURfT05DRShtcnQtXHUwMDNlbXJvdXRlX2RvX2Fzc2VydCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAtRU5PUFJPVE9PUFQ7XG4gXHR9XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiBcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZvbHIsIG9wdGxlbiwgc2l6ZW9mKGludCkpKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbkBAIC0xOTQ3LDIwICsyMTcxLDIzIEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZylcbiBcdHN0cnVjdCBzaW9jX21pZl9yZXE2ICp2cjtcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XG4gXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcbi1cdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbiBcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuIFxuLVx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcbi1cdGlmICghbXJ0KVxuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdGlmICghbXJ0KSB7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdH1cbiBcbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHR2ciA9IChzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqKWFyZztcbi1cdFx0aWYgKHZyLVx1MDAzZW1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKVxuK1x0XHRpZiAodnItXHUwMDNlbWlmaSBcdTAwM2U9IG1ydC1cdTAwM2VtYXh2aWYpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0fVxuIFx0XHR2ci1cdTAwM2VtaWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLVx1MDAzZW1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdHZpZiA9IFx1MDAyNm1ydC1cdTAwM2V2aWZfdGFibGVbdnItXHUwMDNlbWlmaV07XG4gXHRcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnItXHUwMDNlbWlmaSkpIHtcbiBcdFx0XHR2ci1cdTAwM2VpY291bnQgPSBSRUFEX09OQ0UodmlmLVx1MDAzZXBrdF9pbik7XG5AQCAtMTk3NCw4ICsyMjAxLDYgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKVxuIFx0XHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XG4gXHRjYXNlIFNJT0NHRVRTR0NOVF9JTjY6XG4gXHRcdHNyID0gKHN0cnVjdCBzaW9jX3NnX3JlcTYgKilhcmc7XG4tXG4tXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0YyA9IGlwNm1yX2NhY2hlX2ZpbmQobXJ0LCBcdTAwMjZzci1cdTAwM2VzcmMuc2luNl9hZGRyLFxuIFx0XHRcdFx0ICAgICBcdTAwMjZzci1cdTAwM2VncnAuc2luNl9hZGRyKTtcbiBcdFx0aWYgKGMpIHtcbkBAIC0xOTg4LDYgKzIyMTMsNyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXG4gXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XG4gXHRkZWZhdWx0OlxuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbiBcdH1cbiB9XG5AQCAtMjAxNSwyMSArMjI0MSwyMyBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcbiBcdHN0cnVjdCBjb21wYXRfc2lvY19taWZfcmVxNiB2cjtcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XG4gXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcbi1cdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbiBcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuIFxuLVx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcbi1cdGlmICghbXJ0KVxuLVx0XHRyZXR1cm4gLUVOT0VOVDtcbi1cbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dnIsIGFyZywgc2l6ZW9mKHZyKSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4tXHRcdGlmICh2ci5taWZpIFx1MDAzZT0gbXJ0LVx1MDAzZW1heHZpZilcbitcdFx0cmN1X3JlYWRfbG9jaygpO1xuK1x0XHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xuK1x0XHRpZiAoIW1ydCkge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4rXHRcdGlmICh2ci5taWZpIFx1MDAzZT0gbXJ0LVx1MDAzZW1heHZpZikge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0XHR9XG4gXHRcdHZyLm1pZmkgPSBhcnJheV9pbmRleF9ub3NwZWModnIubWlmaSwgbXJ0LVx1MDAzZW1heHZpZik7XG4tXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0dmlmID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVt2ci5taWZpXTtcbiBcdFx0aWYgKFZJRl9FWElTVFMobXJ0LCB2ci5taWZpKSkge1xuIFx0XHRcdHZyLmljb3VudCA9IFJFQURfT05DRSh2aWYtXHUwMDNlcGt0X2luKTtcbkBAIC0yMDQ5LDYgKzIyNzcsMTEgQEAgaW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG4gXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRjID0gaXA2bXJfY2FjaGVfZmluZChtcnQsIFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFx1MDAyNnNyLmdycC5zaW42X2FkZHIpO1xuIFx0XHRpZiAoYykge1xuIFx0XHRcdHNyLnBrdGNudCA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLnBrdCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMTo1Ny44NzI4MTg5NzJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0Mjg3NjQzODIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIFRoaXMgSVB2NiBNdWx0aWNhc3QgUm91dGluZyBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIG1vZGlmeWluZyBgbmV0L2lwdjYvaXA2bXIuY2Ag4oCTIGl0J3MgYWxsIGFib3V0IElQdjYgbXVsdGljYXN0IHJvdXRpbmcsIGFuZCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgb3B0aW1hbCBmdXp6aW5nIGFwcHJvYWNoLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIGlzIGFic29sdXRlbHkgV29ydGhGdXp6aW5nLiBUaGUgY2hhbmdlcyBhcmUgcXVpdGUgc2lnbmlmaWNhbnQsIHRvdWNoaW5nIG9uIGNydWNpYWwgYXJlYXMgbGlrZSB0YWJsZSBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24sIGR5bmFtaWMgYWxsb2NhdGlvbiwgc2V0c29ja29wdC9nZXRzb2Nrb3B0L2lvY3RsIGhhbmRsaW5nLCBhbmQgdGhlIGludHJvZHVjdGlvbiBvZiB3b3JrcXVldWVzIGFuZCB0aW1lcnMuIFRoaXMgc2NyZWFtcyBwb3RlbnRpYWwgZm9yIGludGVyZXN0aW5nIGJ1Z3MuXG5cblNwZWNpZmljYWxseSwgdGhlIHBhdGNoIHNlZW1zIHRvIG92ZXJoYXVsIGhvdyBgbXJfdGFibGVzYCBhcmUgaGFuZGxlZC4gV2UncmUgc2VlaW5nIGR5bmFtaWMgY3JlYXRpb24sIGRlbGF5ZWQgcHVibGlzaGluZywgYW5kIGRlc3RydWN0aW9uIOKAkyB0aGF0J3MgYSByZWQgZmxhZyBmb3IgcmFjZSBjb25kaXRpb25zIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZXMsIHdoaWNoIGFyZSBhbHdheXMgcHJpbWUgdGFyZ2V0cy4gSSBzZWUgY2hhbmdlcyBpbiB0aGUgaGFuZGxpbmcgb2YgTVJUNl8qLCBTSU9DR0VUTUlGQ05UX0lONiwgYW5kIFNJT0NHRVRTR0NOVF9JTjYgdmlhIHNldHNvY2tvcHQvZ2V0c29ja29wdC9pb2N0bCwgYW5kIHRoZSBgaXBtcl9leHBpcmVfcHJvY2Vzc2AsIGBpcDZtcl9kZXZpY2VfZXZlbnRgLCBgaXA2bXJfc2tfaW5pdGAsIGFuZCBgaXA2bXJfc2tfZG9uZWAgZnVuY3Rpb25zIGFyZSBhbGwgaW4gdGhlIG1peCB0b28uIFdvcmtxdWV1ZXMgKGBpcDZtcl9kZXN0cm95X3dvcmtmbmApIGFuZCB0aW1lcnMgYWxzbyBnZXQgdGhyb3duIGluLiBUaGF0J3MgYSBnb29kIG1peCBvZiBwb3RlbnRpYWwgZnV6eiB0YXJnZXRzLlxuXG5UaGUgZ29vZCBuZXdzIGlzLCB0aGlzIHNob3VsZCBiZSByZWFjaGFibGUgaW4gYSBzdGFuZGFyZCBzeXprYWxsZXIgLyBRRU1VIHNldHVwLiBJUHY2IG11bHRpY2FzdCByb3V0aW5nIGlzIGNvcmUgbmV0d29ya2luZyBjb2RlLCBhY2Nlc3NpYmxlIHZpYSByYXcgc29ja2V0cyAoSVBQUk9UT19JQ01QVjYsIGV0Yy4pIGFuZCB0aG9zZSBzZXRzb2Nrb3B0L2lvY3RsIGNhbGxzLiBUaGF0IG1ha2VzIGl0IGVhc2llciB0byB0YXJnZXQgYW5kIHRlc3QuIEdpdmVuIHRoZSBtb2RpZmljYXRpb25zLCBJJ2xsIGJlIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gbG9ja2luZyBtZWNoYW5pc21zLCB0YWJsZSBsaWZlY3ljbGUgbWFuYWdlbWVudCwgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcsIGhvdyB0aGUgdGltZXJzIGFuZCB3b3JrcXVldWVzIGludGVyYWN0LCBhbmQgdGhlIGhhbmRsaW5nIG9mIG5ldGRldiBub3RpZmllciBldmVudHMuXG5cbk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgYW55IG5lY2Vzc2FyeSBLY29uZmlnIGRlcGVuZGVuY2llcyB0byBnZXQgdGhlIHJlbGV2YW50IGNvZGUgZW5hYmxlZC4gSSdsbCB1c2UgYGdyZXBwZXJgIHRvIHF1aWNrbHkgc2NhbiBgbmV0L2lwdjYvS2NvbmZpZ2AgYW5kIGBuZXQvaXB2Ni9NYWtlZmlsZWAgdG8gaWRlbnRpZnkgYW55IHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLiBUaGlzIHdpbGwgZ3VpZGUgbXkgc3l6a2FsbGVyIGNvbmZpZ3VyYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2NTQsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozODMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjowMi4xNjA0NjYxMzRaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTY1NTAzNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX0lQVjZfTVJPVVRFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9pcHY2XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9pcHY2L01ha2VmaWxlPTE1PWlwdjYtJChDT05GSUdfU1lTQ1RMKSArPSBzeXNjdGxfbmV0X2lwdjYub1xcbm5ldC9pcHY2L01ha2VmaWxlOjE2OmlwdjYtJChDT05GSUdfSVBWNl9NUk9VVEUpICs9IGlwNm1yLm9cXG5uZXQvaXB2Ni9NYWtlZmlsZS0xNy1cXG4tLVxcbm5ldC9pcHY2L2FkZHJjb25mLmM9NTA4PXN0YXRpYyBpbnQgaW5ldDZfbmV0Y29uZl9tc2dzaXplX2RldmNvbmYoaW50IHR5cGUpXFxuLS1cXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTUxOC1cXHRcXHRzaXplICs9IG5sYV90b3RhbF9zaXplKDQpO1xcbm5ldC9pcHY2L2FkZHJjb25mLmM6NTE5OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTUyMC1cXHRpZiAoYWxsIHx8IHR5cGUgPT0gTkVUQ09ORkFfTUNfRk9SV0FSRElORylcXG4tLVxcbm5ldC9pcHY2L2FkZHJjb25mLmM9NTMyPXN0YXRpYyBpbnQgaW5ldDZfbmV0Y29uZl9maWxsX2RldmNvbmYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlmaW5kZXgsXFxuLS1cXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU2MS1cXHRcXHRnb3RvIG5sYV9wdXRfZmFpbHVyZTtcXG5uZXQvaXB2Ni9hZGRyY29uZi5jOjU2MjojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXFxubmV0L2lwdjYvYWRkcmNvbmYuYy01NjMtXFx0aWYgKChhbGwgfHwgdHlwZSA9PSBORVRDT05GQV9NQ19GT1JXQVJESU5HKSBcXHUwMDI2XFx1MDAyNlxcbi0tXFxubmV0L2lwdjYvYWRkcmNvbmYuYz01NjY0PXN0YXRpYyB2b2lkIGlwdjZfc3RvcmVfZGV2Y29uZihjb25zdCBzdHJ1Y3QgaXB2Nl9kZXZjb25mICpjbmYsXFxuLS1cXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU3MTctI2VuZGlmXFxubmV0L2lwdjYvYWRkcmNvbmYuYzo1NzE4OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU3MTktXFx0YXJyYXlbREVWQ09ORl9NQ19GT1JXQVJESU5HXSA9IGF0b21pY19yZWFkKFxcdTAwMjZjbmYtXFx1MDAzZW1jX2ZvcndhcmRpbmcpO1xcbi0tXFxubmV0L2lwdjYvYWRkcmNvbmYuYz02ODQ5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIGFkZHJjb25mX3N5c2N0bFtdID0ge1xcbi0tXFxubmV0L2lwdjYvYWRkcmNvbmYuYy03MTE3LSNlbmRpZlxcbm5ldC9pcHY2L2FkZHJjb25mLmM6NzExODojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXFxubmV0L2lwdjYvYWRkcmNvbmYuYy03MTE5LVxcdHtcXG4tLVxcbm5ldC9pcHY2L2lwNl9pbnB1dC5jPTU1ND1pbnQgaXA2X21jX2lucHV0KHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvaXB2Ni9pcDZfaW5wdXQuYy01NzYtXFxubmV0L2lwdjYvaXA2X2lucHV0LmM6NTc3OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9pcDZfaW5wdXQuYy01NzgtXFx0LypcXG4tLVxcbm5ldC9pcHY2L2lwNm1yLmM9MTA2PXN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpO1xcbm5ldC9pcHY2L2lwNm1yLmMtMTA3LVxcbm5ldC9pcHY2L2lwNm1yLmM6MTA4OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxubmV0L2lwdjYvaXA2bXIuYy0xMDktI2RlZmluZSBpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldCkgXFxcXFxcbi0tXFxubmV0L2lwdjYvaXA2bXIuYz0zOTc9c3RhdGljIHZvaWQgaXA2bXJfbmV3X3RhYmxlX3NldChzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcXG4tLVxcbm5ldC9pcHY2L2lwNm1yLmMtMzk5LXtcXG5uZXQvaXB2Ni9pcDZtci5jOjQwMDojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xcbm5ldC9pcHY2L2lwNm1yLmMtNDAxLVxcdGxpc3RfYWRkX3RhaWxfcmN1KFxcdTAwMjZtcnQtXFx1MDAzZWxpc3QsIFxcdTAwMjZuZXQtXFx1MDAzZWlwdjYubXI2X3RhYmxlcyk7XFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jPTQ1OT1zdGF0aWMgdm9pZCBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy00NjItXFxubmV0L2lwdjYvaXA2bXIuYzo0NjM6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcXG5uZXQvaXB2Ni9pcDZtci5jLTQ2NC1cXHRpZiAobXJ0LVxcdTAwM2VpZCA9PSBSVDZfVEFCTEVfREZMVClcXG4tLVxcbm5ldC9pcHY2L2lwNm1yLmMtNDg2LVxcbm5ldC9pcHY2L2lwNm1yLmM6NDg3OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxubmV0L2lwdjYvaXA2bXIuYy00ODgtc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jPTE0MjI9c3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy0xNDI2LVxcdHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTtcXG5uZXQvaXB2Ni9pcDZtci5jOjE0Mjc6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcXG5uZXQvaXB2Ni9pcDZtci5jLTE0MjgtXFx0c3RydWN0IG1yX3RhYmxlICptcnQsICpuZXh0O1xcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy0xNDM3LVxcbm5ldC9pcHY2L2lwNm1yLmM6MTQzODojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xcbm5ldC9pcHY2L2lwNm1yLmMtMTQzOS1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCBcXHUwMDI2bmV0LVxcdTAwM2VpcHY2Lm1yNl90YWJsZXMsIGxpc3QpXFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jPTE4NjE9aW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy0yMDc3LSNlbmRpZlxcbm5ldC9pcHY2L2lwNm1yLmM6MjA3ODojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xcbm5ldC9pcHY2L2lwNm1yLmMtMjA3OS1cXHRjYXNlIE1SVDZfVEFCTEU6XFxuLS1cXG5uZXQvaXB2Ni9yYXcuYz0xMTI2PXN0YXRpYyBpbnQgcmF3djZfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCBpbnQgKmthcmcpXFxuLS1cXG5uZXQvaXB2Ni9yYXcuYy0xMTQ2LVxcdGRlZmF1bHQ6XFxubmV0L2lwdjYvcmF3LmM6MTE0NzojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXFxubmV0L2lwdjYvcmF3LmMtMTE0OC1cXHRcXHRyZXR1cm4gaXA2bXJfaW9jdGwoc2ssIGNtZCwga2FyZyk7XFxuLS1cXG5uZXQvaXB2Ni9yYXcuYz0xMTU2PXN0YXRpYyBpbnQgY29tcGF0X3Jhd3Y2X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5uZXQvaXB2Ni9yYXcuYy0xMTYyLVxcdGRlZmF1bHQ6XFxubmV0L2lwdjYvcmF3LmM6MTE2MzojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXFxubmV0L2lwdjYvcmF3LmMtMTE2NC1cXHRcXHRyZXR1cm4gaXA2bXJfY29tcGF0X2lvY3RsKHNrLCBjbWQsIGNvbXBhdF9wdHIoYXJnKSk7XFxuLS1cXG5uZXQvaXB2Ni9yb3V0ZS5jPTU3ODc9c3RhdGljIGludCBydDZfZmlsbF9ub2RlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9pcHY2L3JvdXRlLmMtNTg1Mi1cXHRpZiAoaWlmKSB7XFxubmV0L2lwdjYvcm91dGUuYzo1ODUzOiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9yb3V0ZS5jLTU4NTQtXFx0XFx0aWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoXFx1MDAyNnJ0Nl9kc3QtXFx1MDAzZWFkZHIpKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjAyLjI1NzA1NzIzM1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5NzEyOTQ4MDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIElQdjYgTXVsdGljYXN0IENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBJUHY2IG11bHRpY2FzdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBuYXZpZ2F0ZSB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZmlsZXMsIHNwZWNpZmljYWxseSBgbmV0L2lwdjYvS2NvbmZpZ2AuIFRoYXQncyB0aGUgbG9naWNhbCBwbGFjZSB0byBzdGFydCBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMgb2YgYW55dGhpbmcgcmVsYXRlZCB0byBJUHY2LiBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gYW55dGhpbmcgcmVsYXRlZCB0byBgSVBWNl9NUk9VVEVgLCBhcyB0aGF0J3MgbXkgZm9jYWwgcG9pbnQuIEkgZmlndXJlIGJ5IGV4YW1pbmluZyB0aGUgYEtjb25maWdgIGZpbGUgYW5kIHRoZSBzdXJyb3VuZGluZyBjb2RlIEknbGwgZmluZCB0aGUgc3BlY2lmaWMgY29uZmlnIG5hbWVzLCBkZXBlbmRlbmNpZXMsIGFuZCByZWxhdGlvbnNoaXBzIGJldHdlZW4gdmFyaW91cyBJUHY2IG11bHRpY2FzdCBmZWF0dXJlcy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFuZCBob3cgdGhleSBpbnRlcmFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIyODksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjowNC4yMjgzNTUxMTJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODY1Mzg2ODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiSVBWNl9NUk9VVEVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2lwdjYvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvaXB2Ni9LY29uZmlnPTI0Mz1jb25maWcgSVBWNl9TVUJUUkVFU1xcbi0tXFxubmV0L2lwdjYvS2NvbmZpZy0yNTYtXFxubmV0L2lwdjYvS2NvbmZpZzoyNTc6Y29uZmlnIElQVjZfTVJPVVRFXFxubmV0L2lwdjYvS2NvbmZpZy0yNTgtXFx0Ym9vbCBcXFwiSVB2NjogbXVsdGljYXN0IHJvdXRpbmdcXFwiXFxuLS1cXG5uZXQvaXB2Ni9LY29uZmlnLTI2NC1cXG5uZXQvaXB2Ni9LY29uZmlnOjI2NTpjb25maWcgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxubmV0L2lwdjYvS2NvbmZpZy0yNjYtXFx0Ym9vbCBcXFwiSVB2NjogbXVsdGljYXN0IHBvbGljeSByb3V0aW5nXFxcIlxcbm5ldC9pcHY2L0tjb25maWc6MjY3OlxcdGRlcGVuZHMgb24gSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9LY29uZmlnLTI2OC1cXHRzZWxlY3QgRklCX1JVTEVTXFxuLS1cXG5uZXQvaXB2Ni9LY29uZmlnPTI3OT1jb25maWcgSVBWNl9QSU1TTV9WMlxcbm5ldC9pcHY2L0tjb25maWctMjgwLVxcdGJvb2wgXFxcIklQdjY6IFBJTS1TTSB2ZXJzaW9uIDIgc3VwcG9ydFxcXCJcXG5uZXQvaXB2Ni9LY29uZmlnOjI4MTpcXHRkZXBlbmRzIG9uIElQVjZfTVJPVVRFXFxubmV0L2lwdjYvS2NvbmZpZy0yODItXFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjowNC4zMTQ5MDEzNloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyMDg2NzM4MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIElQdjYgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBJUHY2IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gTXkgaW5zdGluY3QgaXMgdG8gaGVhZCBzdHJhaWdodCB0byB0aGUgc291cmNlLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGNoZWNrIHRoZSBgcmVhZC1maWxlYCBpbiB0aGUgYG5ldC9pcHY2L0tjb25maWdgIGZpbGUsIGZvY3VzaW5nIG9uIHRoZSBsaW5lcyBiZXR3ZWVuIDI1MCBhbmQgMjkwLiBUaGF0J3MgdXN1YWxseSB3aGVyZSB0aGUgbWVhdCBvZiB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgYW5kIGRlcGVuZGVuY2llcyBhcmUgZGVmaW5lZC4gVGhpcyB3aWxsIGdpdmUgbWUgdGhlIG1vc3QgZGlyZWN0IGFuZCByZWxpYWJsZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0J3MgYXZhaWxhYmxlIGFuZCBob3cgdGhleSBpbnRlcmFjdC4gVGhpcyBhcHByb2FjaCBzaG91bGQgb2ZmZXIgYSBnb29kIG92ZXJ2aWV3IG9mIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNzg5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjI6MDYuNTIzNTc3Nzc2WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTIzNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2lwdjYvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyNTA6XFx0XFx0ICBub3JtYWwgYW5kIHNvdXJjZSBwcmVmaXggc3BlY2lmaWMgcm91dGVzIGluIHRoZSBzYW1lIHJvdXRpbmcgdGFibGVcXG4gMjUxOlxcdFxcdCAgbWF5IHNvbWV0aW1lcyBsZWFkIHRvIHVuaW50ZW5kZWQgcm91dGluZyBiZWhhdmlvci4gIFRoaXMgY2FuIGJlXFxuIDI1MjpcXHRcXHQgIGF2b2lkZWQgYnkgZGVmaW5pbmcgZGlmZmVyZW50IHJvdXRpbmcgdGFibGVzIGZvciB0aGUgbm9ybWFsIGFuZFxcbiAyNTM6XFx0XFx0ICBzb3VyY2UgcHJlZml4IHNwZWNpZmljIHJvdXRlcy5cXG4gMjU0OlxcdFxcbiAyNTU6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAyNTY6XFx0XFxuIDI1NzpcXHRjb25maWcgSVBWNl9NUk9VVEVcXG4gMjU4OlxcdFxcdGJvb2wgXFxcIklQdjY6IG11bHRpY2FzdCByb3V0aW5nXFxcIlxcbiAyNTk6XFx0XFx0ZGVwZW5kcyBvbiBJUFY2XFxuIDI2MDpcXHRcXHRzZWxlY3QgSVBfTVJPVVRFX0NPTU1PTlxcbiAyNjE6XFx0XFx0aGVscFxcbiAyNjI6XFx0XFx0ICBTdXBwb3J0IGZvciBJUHY2IG11bHRpY2FzdCBmb3J3YXJkaW5nLlxcbiAyNjM6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAyNjQ6XFx0XFxuIDI2NTpcXHRjb25maWcgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxuIDI2NjpcXHRcXHRib29sIFxcXCJJUHY2OiBtdWx0aWNhc3QgcG9saWN5IHJvdXRpbmdcXFwiXFxuIDI2NzpcXHRcXHRkZXBlbmRzIG9uIElQVjZfTVJPVVRFXFxuIDI2ODpcXHRcXHRzZWxlY3QgRklCX1JVTEVTXFxuIDI2OTpcXHRcXHRoZWxwXFxuIDI3MDpcXHRcXHQgIE5vcm1hbGx5LCBhIG11bHRpY2FzdCByb3V0ZXIgcnVucyBhIHVzZXJzcGFjZSBkYWVtb24gYW5kIGRlY2lkZXNcXG4gMjcxOlxcdFxcdCAgd2hhdCB0byBkbyB3aXRoIGEgbXVsdGljYXN0IHBhY2tldCBiYXNlZCBvbiB0aGUgc291cmNlIGFuZFxcbiAyNzI6XFx0XFx0ICBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgbXVsdGljYXN0IHJvdXRlclxcbiAyNzM6XFx0XFx0ICB3aWxsIGFsc28gYmUgYWJsZSB0byB0YWtlIGludGVyZmFjZXMgYW5kIHBhY2tldCBtYXJrcyBpbnRvXFxuIDI3NDpcXHRcXHQgIGFjY291bnQgYW5kIHJ1biBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdXNlcnNwYWNlIGRhZW1vbnNcXG4gMjc1OlxcdFxcdCAgc2ltdWx0YW5lb3VzbHksIGVhY2ggb25lIGhhbmRsaW5nIGEgc2luZ2xlIHRhYmxlLlxcbiAyNzY6XFx0XFxuIDI3NzpcXHRcXHQgIElmIHVuc3VyZSwgc2F5IE4uXFxuIDI3ODpcXHRcXG4gMjc5OlxcdGNvbmZpZyBJUFY2X1BJTVNNX1YyXFxuIDI4MDpcXHRcXHRib29sIFxcXCJJUHY2OiBQSU0tU00gdmVyc2lvbiAyIHN1cHBvcnRcXFwiXFxuIDI4MTpcXHRcXHRkZXBlbmRzIG9uIElQVjZfTVJPVVRFXFxuIDI4MjpcXHRcXHRoZWxwXFxuIDI4MzpcXHRcXHQgIFN1cHBvcnQgZm9yIElQdjYgUElNIG11bHRpY2FzdCByb3V0aW5nIHByb3RvY29sIFBJTS1TTXYyLlxcbiAyODQ6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAyODU6XFx0XFxuIDI4NjpcXHRjb25maWcgSVBWNl9TRUc2X0xXVFVOTkVMXFxuIDI4NzpcXHRcXHRib29sIFxcXCJJUHY2OiBTZWdtZW50IFJvdXRpbmcgSGVhZGVyIGVuY2Fwc3VsYXRpb24gc3VwcG9ydFxcXCJcXG4gMjg4OlxcdFxcdGRlcGVuZHMgb24gSVBWNlxcbiAyODk6XFx0XFx0c2VsZWN0IExXVFVOTkVMXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjA2LjUyMzY3Mjk5NloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjc4MjEyNDc0MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIElQdjYgTXVsdGljYXN0IFJvdXRpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIHNlZSB3ZSdyZSBkZWFsaW5nIHdpdGggYSBwYXRjaCByZWxhdGVkIHRvIElQdjYgbXVsdGljYXN0IHJvdXRpbmcsIGluZGljYXRlZCBieSB0aGUga2V5IHN5bWJvbHMgYElQVjZfTVJPVVRFYCBhbmQgYElQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU2AuIFRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBgI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNgIGJsb2NrcyBmb3IgdGhpbmdzIGxpa2UgdGFibGUgZGVzdHJ1Y3Rpb24gYW5kIGBNUlQ2X1RBQkxFYCBgc2V0c29ja29wdGAgdXNhZ2UgaW1tZWRpYXRlbHkgZmxhZ3MgdGhhdCB0aGlzIGlzbid0IGEgdHJpdmlhbCBjaGFuZ2UuIFdlIGFyZSBkZWZpbml0ZWx5IHdvcmtpbmcgd2l0aCBzb21lIG5ldyBsb2dpYyBmb3IgbXVsdGlwbGUgdGFibGVzIGhlcmUsIHdoaWNoIG1lYW5zIHdlIGhhdmUgdG8gZGl2ZSBhIGxpdHRsZSBkZWVwZXIuIE9mIGNvdXJzZSwgYElQVjZgIGlzIGFsc28gYSBjcml0aWNhbCBjb25maWcuXG5cbk5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlLiBMZXQncyBsb29rIGF0IHRoZSBmdW5jdGlvbnMgYWRkZWQgb3IgbW9kaWZpZWQ6IGEgbGlzdCBvZiBmdW5jdGlvbnMsIGJvdGggc3RhdGljIGFuZCBleHBvcnRlZC4gSSBzZWUgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCB0YWJsZSBsb29rdXAsIGFsbG9jYXRpb24sIHB1Ymxpc2hpbmcsIGFuZCBkZXN0cnVjdGlvbiAocG90ZW50aWFsbHkgZGVsYXllZCB2aWEgYSB3b3JrcXVldWUgd2hpY2ggaXMgdmVyeSBpbnRlcmVzdGluZyBmb3IgY29uY3VycmVuY3kpLCBhbG9uZyB3aXRoIHRpbWVyIGFuZCBub3RpZmllciBjYWxsYmFja3MuIENyaXRpY2FsbHksIEkgaGF2ZSB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZXNlOiBgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0YCwgYGlwNl9tcm91dGVfZ2V0c29ja29wdGAsIGBpcDZtcl9pb2N0bGAsIGBpcDZtcl9jb21wYXRfaW9jdGxgLCBhbmQgYGlwNm1yX3NrX2RvbmVgIGFzIHRoZXNlIHJlcHJlc2VudCB0aGUgdXNlci1zcGFjZSBpbnRlcmZhY2UuIFRoZXkgYXJlIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgdGhlIGVudHJ5cG9pbnRzLiBgaXA2bXJfZGV2aWNlX2V2ZW50YCwgYGlwbXJfZXhwaXJlX3Byb2Nlc3NgLCBgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgLCBhbmQgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCBhcmUga2V5IGFzIHdlbGwsIGFzIHRoZXNlIGFyZSB0aGUgY29yZSBpbnRlcm5hbCBmdW5jdGlvbnMuXG5cbkEgcXVpY2sgY2hlY2sgY29uZmlybXMgdGhhdCBvbmx5IGBuZXQvaXB2Ni9pcDZtci5jYCBoYXMgYmVlbiBtb2RpZmllZC4gVGhhdCdzIGdvb2QsIGtlZXBzIHRoZSBmb2N1cyBzb21ld2hhdCBtYW5hZ2VhYmxlLlxuXG5BbHJpZ2h0LCB3aGF0IHN5bWJvbHMgYXJlIGFic29sdXRlbHkgY3JpdGljYWw/IGBpcDZfbXJvdXRlX3NldHNvY2tvcHRgLCBgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0YCwgYGlwNm1yX2lvY3RsYCwgYGlwNm1yX2NvbXBhdF9pb2N0bGAsIGBpcDZtcl9za19kb25lYCwgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAsIGBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlYCwgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCwgYGlwNm1yX2RldmljZV9ldmVudGAsIGFuZCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AgYXJlIHRoZSBvbmVzIHRvIGZvY3VzIG9uLiBUaGV5IGFyZSBzcGVjaWZpYyB0byBJUHY2IG11bHRpY2FzdCByb3V0aW5nIChgaXA2bXJgKSwgYW5kIG5vdCB1YmlxdWl0b3VzLCBzbyB0aGF0IHJlZHVjZXMgdGhlIGNoYW5jZSBvZiBjb25mbGljdHMgd2l0aCBvdGhlciBmdW5jdGlvbnMuXG5cbkZvciB0aGUgY29uZmlndXJhdGlvbnMsIGBJUFY2YCwgYElQVjZfTVJPVVRFYCwgYW5kIGBJUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNgIGFyZSBlc3NlbnRpYWwgZm9yIGVuYWJsaW5nIHRoaXMgZnVuY3Rpb25hbGl0eS5cblxuTm93LCBsZXQncyBjb25maXJtIHRoZSBmdXp6aW5nIHN0cmF0ZWd5LiBUaGUgcGF0Y2gncyBpbXBhY3QgaXMgc2lnbmlmaWNhbnQ6IGl0IG1vZGlmaWVzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCBpbiBgaXA2bXIuY2AsIGludHJvZHVjaW5nIGR5bmFtaWMgdGFibGUgYWxsb2NhdGlvbiwgZGVsYXllZCBwdWJsaXNoaW5nLCBhc3luY2hyb25vdXMgdGFibGUgZGVzdHJ1Y3Rpb24gdmlhIHdvcmtxdWV1ZXMsIGFuZCBzaWduaWZpY2FudCBtb2RpZmljYXRpb25zIHRvIGxvY2tpbmcgYW5kIGxpZmVjeWNsZSBoYW5kbGluZyBhY3Jvc3MgdGhlIHVzZXItc3BhY2UgaW50ZXJmYWNlIChzZXRzb2Nrb3B0LCBnZXRzb2Nrb3B0LCBpb2N0bHMpIGFuZCBpbnRlcm5hbCBtZWNoYW5pc21zIGxpa2UgbmV0ZGV2IGV2ZW50IG5vdGlmaWNhdGlvbiBhbmQgdGltZXIgZXhwaXJhdGlvbi4gVGhpcyBjb2RlIGlzIGFsc28gZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHJhdyBJUHY2IHNvY2tldHMgYW5kIHRoZSBpb2N0bC9zZXRzb2Nrb3B0IHN5c2NhbGxzLiBEZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIFRoZSBnb2FsIG9mIHRoaXMgZnV6eiBpcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBrZXkgZnVuY3Rpb25zLCBwYXJ0aWN1bGFybHkgdGhlIG9uZXMgdGhhdCBkZWFsIHdpdGggdGhlIHVzZXItc3BhY2UgaW50ZXJhY3Rpb24gYW5kIHRhYmxlIG1hbmFnZW1lbnQsIGFyZSByb2J1c3QgYW5kIHNlY3VyZSBhbmQgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyByYWNlIGNvbmRpdGlvbnMgb3IgbWVtb3J5IGVycm9ycyBwcmVzZW50LlxuXG5TbywgdG8gc3VtbWFyaXplLCB0aGUgYEZvY3VzU3ltYm9sc2AgYXJlOiBgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0YCwgYGlwNl9tcm91dGVfZ2V0c29ja29wdGAsIGBpcDZtcl9pb2N0bGAsIGBpcDZtcl9jb21wYXRfaW9jdGxgLCBgaXA2bXJfc2tfZG9uZWAsIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgLCBgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9kZXN0cm95X3dvcmtmbmAsIGBpcDZtcl9kZXZpY2VfZXZlbnRgLCBhbmQgYGlwbXJfZXhwaXJlX3Byb2Nlc3NgLiBUaGUgcmVxdWlyZWQgYEVuYWJsZUNvbmZpZ3NgIGFyZTogYElQVjZgLCBgSVBWNl9NUk9VVEVgLCBhbmQgYElQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU2AuXG5cblJlYWR5IHRvIHByb2NlZWQgd2l0aCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzU4OSwiT3V0cHV0VG9rZW5zIjoyMzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoxNC4zNDQ5MjM3NTJaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjExMDg0MDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklQVjZcIixcbiAgICBcIklQVjZfTVJPVVRFXCIsXG4gICAgXCJJUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJpcDZfbXJvdXRlX3NldHNvY2tvcHRcIixcbiAgICBcImlwNl9tcm91dGVfZ2V0c29ja29wdFwiLFxuICAgIFwiaXA2bXJfaW9jdGxcIixcbiAgICBcImlwNm1yX2NvbXBhdF9pb2N0bFwiLFxuICAgIFwiaXA2bXJfc2tfZG9uZVwiLFxuICAgIFwiaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlXCIsXG4gICAgXCJpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlXCIsXG4gICAgXCJpcDZtcl9kZXN0cm95X3dvcmtmblwiLFxuICAgIFwiaXA2bXJfZGV2aWNlX2V2ZW50XCIsXG4gICAgXCJpcG1yX2V4cGlyZV9wcm9jZXNzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGlwNm1yKSB0YWJsZSBsaWZlY3ljbGUgYW5kIGxvY2tpbmcuIEl0IGFkZHMgZHluYW1pYyB0YWJsZSBhbGxvY2F0aW9uLCBhc3luY2hyb25vdXMgdGFibGUgZGVzdHJ1Y3Rpb24gdmlhIHdvcmtxdWV1ZXMsIGFuZCB1cGRhdGVzIHNldHNvY2tvcHQsIGdldHNvY2tvcHQsIGlvY3RsLCB0aW1lciBleHBpcmF0aW9uLCBhbmQgbmV0ZGV2IG5vdGlmaWVyIGhhbmRsaW5nLiBUaGVzZSBwYXRocyBhcmUgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgcmF3IElQdjYgc29ja2V0cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJUFY2XCIsXG4gICAgXCJJUFY2X01ST1VURVwiLFxuICAgIFwiSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaXA2X21yb3V0ZV9zZXRzb2Nrb3B0XCIsXG4gICAgXCJpcDZfbXJvdXRlX2dldHNvY2tvcHRcIixcbiAgICBcImlwNm1yX2lvY3RsXCIsXG4gICAgXCJpcDZtcl9jb21wYXRfaW9jdGxcIixcbiAgICBcImlwNm1yX3NrX2RvbmVcIixcbiAgICBcImlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZVwiLFxuICAgIFwiaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZVwiLFxuICAgIFwiaXA2bXJfZGVzdHJveV93b3JrZm5cIixcbiAgICBcImlwNm1yX2RldmljZV9ldmVudFwiLFxuICAgIFwiaXBtcl9leHBpcmVfcHJvY2Vzc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIChpcDZtcikgdGFibGUgbGlmZWN5Y2xlIGFuZCBsb2NraW5nLiBJdCBhZGRzIGR5bmFtaWMgdGFibGUgYWxsb2NhdGlvbiwgYXN5bmNocm9ub3VzIHRhYmxlIGRlc3RydWN0aW9uIHZpYSB3b3JrcXVldWVzLCBhbmQgdXBkYXRlcyBzZXRzb2Nrb3B0LCBnZXRzb2Nrb3B0LCBpb2N0bCwgdGltZXIgZXhwaXJhdGlvbiwgYW5kIG5ldGRldiBub3RpZmllciBoYW5kbGluZy4gVGhlc2UgcGF0aHMgYXJlIGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHJhdyBJUHY2IHNvY2tldHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjE0LjQ2NjA0MzIzMVoiLCJTZXEiOjExLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzM4MDg0MTY1MDcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoxNC40NjY3NjczNFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjMzODA3NjgwNjM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQgKG5ldC9pcHY2L2lwNm1yLmMpIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRhYmxlcyBvbiBkZW1hbmQgd2hlbiBzb2NrZXQgb3B0aW9ucyBhcmUgY29uZmlndXJlZCBhbmQgdG8gZGVzdHJveSB0aGVtIHdoZW4gdGhleSBiZWNvbWUgdW5yZWZlcmVuY2VkIG9yIGVtcHR5Llxcblxcbi0gTWVtb3J5IEFsbG9jYXRpb25zOiBOZXcgZHluYW1pYyBhbGxvY2F0aW9ucyAoc3VjaCBhcyBgc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29ya2AgYWxsb2NhdGVkIHZpYSBga21hbGxvY19vYmpgKSBoYXZlIGFsbCBtZW1iZXIgZmllbGRzIChgd29ya2AsIGBuZXRgLCBgaWRgKSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBUaGUgdW5kZXJseWluZyBtdWx0aWNhc3QgdGFibGVzIGFsbG9jYXRlZCB2aWEgYG1yX3RhYmxlX2FsbG9jKClgIHVzZSBga3phbGxvY19vYmooKWAuXFxuLSBEYXRhIHNlbnQgdG8gdXNlciBzcGFjZTogaW9jdGwvY29tcGF0X2lvY3RsIGFuZCBnZXRzb2Nrb3B0IGhhbmRsZXJzIG9ubHkgY29weSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGZpZWxkcyBvciBkYXRhIGNvcGllZCBmcm9tIHVzZXIgc3BhY2UgYmFjayB0byB1c2VyIHNwYWNlIHdpdGhvdXQgbGVhdmluZyB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgcmVhZGluZyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuXFxuLSBDb250cm9sIGZsb3cgYW5kIExpZmV0aW1lczogQ2hhbmdlcyBhZmZlY3QgdGFibGUgbGlmZWN5Y2xlLCBSQ1Ugc3luY2hyb25pemF0aW9uLCBsaXN0IG1hbmlwdWxhdGlvbnMsIGFuZCBsb2NraW5nIChSVE5ML21ydF9sb2NrKS4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGVzZSBwYXRocyBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGFjY2Vzcywgb3IgbWVtb3J5IGxlYWtzLCB3aGljaCBhcmUgaGFuZGxlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIEtNRU1MRUFLLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBpbnRyb2R1Y2VkLCBzbyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA1MjFjMGIwMmE2ODE0MjAwYjBlZWIyMGFhZjEzYzVkODRlOThmZTViXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFN1biBTZXAgNiAxNToyMTo1NiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jXG5pbmRleCAzZjJlZDliNzdkZWI1Li4yNmJkMmNjZDQyMDFhIDEwMDY0NFxuLS0tIGEvbmV0L2lwdjYvaXA2bXIuY1xuKysrIGIvbmV0L2lwdjYvaXA2bXIuY1xuQEAgLTI4LDYgKzI4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb21wYXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JoYXNodGFibGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0L3Byb3RvY29sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9za2J1ZmYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9yYXcuaFx1MDAzZVxuQEAgLTM2OCw2ICszNjksMTIgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0cmV0dXJuIG1ydDtcbiB9XG4gXG4rc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbG9va3VwX3NrX3RhYmxlKHN0cnVjdCBzb2NrICpzaylcbit7XG4rXHRyZXR1cm4gX19pcDZtcl9nZXRfdGFibGUoc29ja19uZXQoc2spLFxuK1x0XHRcdFx0IHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4rfVxuK1xuIHN0YXRpYyBpbnQgaXA2bXJfaGFzaF9jbXAoc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgKmFyZyxcbiBcdFx0XHQgIGNvbnN0IHZvaWQgKnB0cilcbiB7XG5AQCAtNDE3LDYgKzQyNCwxMjQgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0XHRcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpO1xuIH1cbiBcbisvKiB0YWJsZV9zZXQgY2FsbGJhY2sgdXNlZCB3aGlsZSB0aGUgbmV3IHRhYmxlIGlzIHN0aWxsIHVucHVibGlzaGVkLiAqL1xuK3N0YXRpYyB2b2lkIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2goc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBuZXQgKm5ldClcbit7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssXG4rXHRcdFx0XHRcdFx0ICAgIGJvb2wgKm5ld190YWJsZSlcbit7XG4rXHR1MzIgaWQgPSByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQ7XG4rXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4rXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbitcbitcdEFTU0VSVF9SVE5MKCk7XG4rXHQqbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4rXHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShuZXQsIGlkKTtcbitcdGlmIChtcnQpXG4rXHRcdHJldHVybiBtcnQ7XG4rXG4rXHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcdTAwMjZpcDZtcl9tcl90YWJsZV9vcHMsXG4rXHRcdFx0ICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKTtcbitcdGlmICghSVNfRVJSKG1ydCkpXG4rXHRcdCpuZXdfdGFibGUgPSB0cnVlO1xuK1x0cmV0dXJuIG1ydDtcbit9XG4rXG4rc3RhdGljIHZvaWQgaXA2bXJfcHVibGlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlKVxuK3tcbitcdGlmIChuZXdfdGFibGUpXG4rXHRcdGlwNm1yX25ld190YWJsZV9zZXQobXJ0LCByZWFkX3BuZXQoXHUwMDI2bXJ0LVx1MDAzZW5ldCkpO1xuK31cbitcbitzdGF0aWMgdm9pZCBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuK3tcbitcdEFTU0VSVF9SVE5MKCk7XG4rXG4rI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbitcdGlmIChtcnQtXHUwMDNlaWQgPT0gUlQ2X1RBQkxFX0RGTFQpXG4rXHRcdHJldHVybjtcbitcdC8qIE5lc3RlZCBORVRERVZfVU5SRUdJU1RFUiBtYXkgYWxyZWFkeSBoYXZlIHVubGlua2VkIHRoaXMgdGFibGUuICovXG4rXHRpZiAoX19pcDZtcl9nZXRfdGFibGUocmVhZF9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQpLCBtcnQtXHUwMDNlaWQpICE9IG1ydClcbitcdFx0cmV0dXJuO1xuK1x0aWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LVx1MDAzZW1yb3V0ZV9zaykgfHxcbitcdCAgICBtcnQtXHUwMDNlbWF4dmlmIHx8XG4rXHQgICAgIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY19jYWNoZV9saXN0KSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c3Bpbl9sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbitcdGlmICghbGlzdF9lbXB0eShcdTAwMjZtcnQtXHUwMDNlbWZjX3VucmVzX3F1ZXVlKSkge1xuK1x0XHRzcGluX3VubG9ja19iaChcdTAwMjZtZmNfdW5yZXNfbG9jayk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbitcbitcdGxpc3RfZGVsX3JjdShcdTAwMjZtcnQtXHUwMDNlbGlzdCk7XG4rXHR0aW1lcl9zaHV0ZG93bl9zeW5jKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lcik7XG4rXHRtcl90YWJsZV9mcmVlKG1ydCk7XG4rI2VuZGlmXG4rfVxuK1xuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4rc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XG4rXHRzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yaztcbitcdHN0cnVjdCBuZXQgKm5ldDtcbitcdHUzMiBpZDtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrICpkdyA9XG4rXHRcdGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrLCB3b3JrKTtcbitcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuK1xuK1x0cnRubF9sb2NrKCk7XG4rXHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShkdy1cdTAwM2VuZXQsIGR3LVx1MDAzZWlkKTtcbitcdGlmIChtcnQpXG4rXHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbitcdHJ0bmxfdW5sb2NrKCk7XG4rXHRwdXRfbmV0KGR3LVx1MDAzZW5ldCk7XG4rXHRrZnJlZShkdyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpXG4re1xuK1x0c3RydWN0IG5ldCAqbmV0ID0gcmVhZF9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQpO1xuK1x0c3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHc7XG4rXG4rXHRpZiAobXJ0LVx1MDAzZWlkID09IFJUNl9UQUJMRV9ERkxUKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRkdyA9IGttYWxsb2Nfb2JqKCpkdywgR0ZQX0FUT01JQyk7XG4rXHRpZiAoIWR3KSB7XG4rXHRcdG1vZF90aW1lcihcdTAwMjZtcnQtXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgKyBIWik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghbWF5YmVfZ2V0X25ldChuZXQpKSB7XG4rXHRcdGtmcmVlKGR3KTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0SU5JVF9XT1JLKFx1MDAyNmR3LVx1MDAzZXdvcmssIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKTtcbitcdGR3LVx1MDAzZW5ldCA9IG5ldDtcbitcdGR3LVx1MDAzZWlkID0gbXJ0LVx1MDAzZWlkO1xuK1x0cXVldWVfd29yayhzeXN0ZW1fZGZsX3dxLCBcdTAwMjZkdy1cdTAwM2V3b3JrKTtcbit9XG4rI2Vsc2VcbitzdGF0aWMgdm9pZCBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuK3tcbit9XG4rI2VuZGlmXG4rXG4rc3RhdGljIGludCBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBib29sIG5ld190YWJsZSxcbitcdFx0XHRcdCAgaW50IGVycilcbit7XG4rXHRpZiAobmV3X3RhYmxlIFx1MDAyNlx1MDAyNiBlcnIpXG4rXHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIGlwNm1yX2ZyZWVfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfa2lsbF9saXN0KVxuIHtcbkBAIC04NjYsMTYgKzk5MSwyNSBAQCBzdGF0aWMgdm9pZCBpcG1yX2RvX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuIHN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpXG4ge1xuIFx0c3RydWN0IG1yX3RhYmxlICptcnQgPSB0aW1lcl9jb250YWluZXJfb2YobXJ0LCB0LCBpcG1yX2V4cGlyZV90aW1lcik7XG4rXHRib29sIGVtcHR5ID0gZmFsc2U7XG4gXG4gXHRpZiAoIXNwaW5fdHJ5bG9jayhcdTAwMjZtZmNfdW5yZXNfbG9jaykpIHtcbiBcdFx0bW9kX3RpbWVyKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lciwgamlmZmllcyArIDEpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG4gXG4tXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpXG4rXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpIHtcbiBcdFx0aXBtcl9kb19leHBpcmVfcHJvY2VzcyhtcnQpO1xuK1x0XHRlbXB0eSA9IGxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBSZXRyeSBhZnRlciBHRlBfQVRPTUlDIGFsbG9jYXRpb24gZmFpbHVyZS4gKi9cbitcdFx0ZW1wdHkgPSB0cnVlO1xuK1x0fVxuIFxuIFx0c3Bpbl91bmxvY2soXHUwMDI2bWZjX3VucmVzX2xvY2spO1xuK1xuK1x0aWYgKGVtcHR5KVxuK1x0XHRpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KG1ydCk7XG4gfVxuIFxuIC8qIEZpbGwgb2lmcyBsaXN0LiBJdCBpcyBjYWxsZWQgdW5kZXIgbG9ja2VkIG1ydF9sb2NrLiAqL1xuQEAgLTEyOTAsMTkgKzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxuIHtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTtcbisjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xuK1x0c3RydWN0IG1yX3RhYmxlICptcnQsICpuZXh0O1xuKyNlbHNlXG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbisjZW5kaWZcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2O1xuIFx0aW50IGN0O1xuIFxuIFx0aWYgKGV2ZW50ICE9IE5FVERFVl9VTlJFR0lTVEVSKVxuIFx0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4gXG4tXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldCkge1xuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCBcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tcjZfdGFibGVzLCBsaXN0KVxuKyNlbHNlXG4rXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldClcbisjZW5kaWZcbitcdHtcbitcdFx0Ym9vbCB2aWZfZ29uZSA9IGZhbHNlO1xuK1xuIFx0XHR2ID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVswXTtcbiBcdFx0Zm9yIChjdCA9IDA7IGN0IFx1MDAzYyBtcnQtXHUwMDNlbWF4dmlmOyBjdCsrLCB2KyspIHtcbi1cdFx0XHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXHUwMDNlZGV2KSA9PSBkZXYpXG4rXHRcdFx0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcih2LVx1MDAzZWRldikgPT0gZGV2KSB7XG4gXHRcdFx0XHRtaWY2X2RlbGV0ZShtcnQsIGN0LCAxLCBOVUxMKTtcbitcdFx0XHRcdHZpZl9nb25lID0gdHJ1ZTtcbitcdFx0XHR9XG4gXHRcdH1cbitcdFx0aWYgKHZpZl9nb25lKVxuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdH1cbiBcbiBcdHJldHVybiBOT1RJRllfRE9ORTtcbkBAIC0xNjE4LDEwICsxNzY3LDExIEBAIHN0YXRpYyB2b2lkIG1yb3V0ZV9jbGVhbl90YWJsZXMoc3RydWN0IG1yX3RhYmxlICptcnQsIGludCBmbGFncyxcbiBcbiBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaylcbiB7XG4tXHRpbnQgZXJyID0gMDtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbitcdGludCBlcnIgPSAwO1xuK1xuK1x0QVNTRVJUX1JUTkwoKTtcbiBcbi1cdHJ0bmxfbG9jaygpO1xuIFx0c3Bpbl9sb2NrKFx1MDAyNm1ydF9sb2NrKTtcbiBcdGlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC1cdTAwM2Vtcm91dGVfc2spKSB7XG4gXHRcdGVyciA9IC1FQUREUklOVVNFO1xuQEAgLTE2MzcsOCArMTc4Nyw2IEBAIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKVxuIFx0XHRcdFx0XHQgICAgIE5FVENPTkZBX01DX0ZPUldBUkRJTkcsXG4gXHRcdFx0XHRcdCAgICAgTkVUQ09ORkFfSUZJTkRFWF9BTEwsXG4gXHRcdFx0XHRcdCAgICAgbmV0LVx1MDAzZWlwdjYuZGV2Y29uZl9hbGwpO1xuLVx0cnRubF91bmxvY2soKTtcbi1cbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuQEAgLTE2NzcsNiArMTgyNSw3IEBAIGludCBpcDZtcl9za19kb25lKHN0cnVjdCBzb2NrICpzaylcbiBcdFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgTVJUNl9GTFVTSF9NSUZTIHwgTVJUNl9GTFVTSF9NRkMsXG4gXHRcdFx0XHRcdCAgICBcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiBcdFx0XHRlcnIgPSAwO1xuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuIFx0fVxuQEAgLTE3MjMsMjcgKzE4NzIsNDUgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0ICAgIGluZXRfc2soc2spLVx1MDAzZWluZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KVxuIFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gXG4tXHRtcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xuLVx0aWYgKCFtcnQpXG4tXHRcdHJldHVybiAtRU5PRU5UO1xuLVxuIFx0aWYgKG9wdG5hbWUgIT0gTVJUNl9JTklUKSB7XG4tXHRcdGlmIChzayAhPSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LVx1MDAzZW1yb3V0ZV9zaykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAhbnNfY2FwYWJsZShuZXQtXHUwMDNldXNlcl9ucywgQ0FQX05FVF9BRE1JTikpXG4rXHRcdGJvb2wgaXNfbXJvdXRlX3NrID0gZmFsc2U7XG4rXG4rXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKG1ydCBcdTAwMjZcdTAwMjYgc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spKVxuK1x0XHRcdGlzX21yb3V0ZV9zayA9IHRydWU7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1xuK1x0XHRpZiAoIWlzX21yb3V0ZV9zayBcdTAwMjZcdTAwMjYgIW5zX2NhcGFibGUobmV0LVx1MDAzZXVzZXJfbnMsIENBUF9ORVRfQURNSU4pKVxuIFx0XHRcdHJldHVybiAtRUFDQ0VTO1xuIFx0fVxuIFxuIFx0c3dpdGNoIChvcHRuYW1lKSB7XG4tXHRjYXNlIE1SVDZfSU5JVDpcbitcdGNhc2UgTVJUNl9JTklUOiB7XG4rXHRcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4gXHRcdGlmIChvcHRsZW4gXHUwMDNjIHNpemVvZihpbnQpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0XHRyZXR1cm4gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcbitcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKTtcbitcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtcnQpO1xuK1x0XHR9XG4rXHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbitcdFx0cmV0ID0gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcbitcdFx0cmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTtcbitcdFx0cnRubF91bmxvY2soKTtcbitcdFx0cmV0dXJuIHJldDtcbitcdH1cbiBcbiBcdGNhc2UgTVJUNl9ET05FOlxuIFx0XHRyZXR1cm4gaXA2bXJfc2tfZG9uZShzayk7XG4gXG4tXHRjYXNlIE1SVDZfQUREX01JRjpcbitcdGNhc2UgTVJUNl9BRERfTUlGOiB7XG4rXHRcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4gXHRcdGlmIChvcHRsZW4gXHUwMDNjIHNpemVvZih2aWYpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFx0XHRpZiAoY29weV9mcm9tX3NvY2twdHIoXHUwMDI2dmlmLCBvcHR2YWwsIHNpemVvZih2aWYpKSlcbkBAIC0xNzUxLDEwICsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHZpZi5taWY2Y19taWZpIFx1MDAzZT0gTUFYTUlGUylcbiBcdFx0XHRyZXR1cm4gLUVORklMRTtcbiBcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKTtcbitcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtcnQpO1xuK1x0XHR9XG4rXHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbiBcdFx0cmV0ID0gbWlmNl9hZGQobmV0LCBtcnQsIFx1MDAyNnZpZixcbiBcdFx0XHQgICAgICAgc2sgPT0gcnRubF9kZXJlZmVyZW5jZShtcnQtXHUwMDNlbXJvdXRlX3NrKSk7XG4rXHRcdHJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4rXHR9XG4gXG4gXHRjYXNlIE1SVDZfREVMX01JRjpcbiBcdFx0aWYgKG9wdGxlbiBcdTAwM2Mgc2l6ZW9mKG1pZmlfdCkpXG5AQCAtMTc2Miw3ICsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFx1MDAyNm1pZmksIG9wdHZhbCwgc2l6ZW9mKG1pZmlfdCkpKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0XHRydG5sX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4gXHRcdHJldCA9IG1pZjZfZGVsZXRlKG1ydCwgbWlmaSwgMCwgTlVMTCk7XG4rXHRcdGlmICghcmV0KVxuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0cnRubF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNzgzLDE3ICsxOTY1LDM5IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHBhcmVudCA9PSAwKVxuIFx0XHRcdHBhcmVudCA9IG1mYy5tZjZjY19wYXJlbnQ7XG4gXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbitcdFx0cnRubF9sb2NrKCk7XG4rXHRcdGlmIChvcHRuYW1lID09IE1SVDZfREVMX01GQyB8fCBvcHRuYW1lID09IE1SVDZfREVMX01GQ19QUk9YWSkge1xuK1x0XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRcdHJ0bmxfdW5sb2NrKCk7XG4rXHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0Ym9vbCBuZXdfdGFibGUgPSBmYWxzZTtcbiBcbi1cdFx0aWYgKG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDIHx8IG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDX1BST1hZKVxuLVx0XHRcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcdTAwMjZtZmMsIHBhcmVudCk7XG4tXHRcdGVsc2VcbitcdFx0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4rXHRcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbitcdFx0XHR9XG4rXHRcdFx0aXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpO1xuK1x0XHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbiBcdFx0XHRyZXQgPSBpcDZtcl9tZmNfYWRkKG5ldCwgbXJ0LCBcdTAwMjZtZmMsXG4gXHRcdFx0XHRcdCAgICBzayA9PVxuIFx0XHRcdFx0XHQgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spLFxuIFx0XHRcdFx0XHQgICAgcGFyZW50KTtcbitcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbitcdFx0XHRyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpO1xuK1x0XHRcdHJ0bmxfdW5sb2NrKCk7XG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuIFxuK1x0XHRtdXRleF9sb2NrKFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1mY19tdXRleCk7XG4rXHRcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcdTAwMjZtZmMsIHBhcmVudCk7XG4gXHRcdG11dGV4X3VubG9jayhcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xuK1x0XHRpZiAoIXJldClcbitcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4rXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4gXG4gXHRjYXNlIE1SVDZfRkxVU0g6XG5AQCAtMTgwNyw4ICsyMDExLDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbiBcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdGlmICghbXJ0KSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgZmxhZ3MsIFx1MDAyNmRldl9raWxsX2xpc3QpO1xuIFx0XHR1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KFx1MDAyNmRldl9raWxsX2xpc3QpO1xuK1x0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAwO1xuIFx0fVxuQEAgLTE4MjQsNyArMjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZ2LCBvcHR2YWwsIHNpemVvZih2KSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRXUklURV9PTkNFKG1ydC1cdTAwM2Vtcm91dGVfZG9fYXNzZXJ0LCB2KTtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAwO1xuIFx0fVxuIFxuQEAgLTE4NDIsNiArMjA1OSwxMSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdGRvX3dybWlmd2hvbGUgPSAodiA9PSBNUlQ2TVNHX1dSTUlGV0hPTEUpO1xuIFx0XHR2ID0gISF2O1xuIFx0XHRydG5sX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4gXHRcdHJldCA9IDA7XG4gXHRcdGlmICh2ICE9IG1ydC1cdTAwM2Vtcm91dGVfZG9fcGltKSB7XG4gXHRcdFx0V1JJVEVfT05DRShtcnQtXHUwMDNlbXJvdXRlX2RvX3BpbSwgdik7XG5AQCAtMTg2NSwxOCArMjA4NywxNiBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdC8qIFwicGltNnJlZyV1XCIgc2hvdWxkIG5vdCBleGNlZWQgMTYgYnl0ZXMgKElGTkFNU0laKSAqL1xuIFx0XHRpZiAodiAhPSBSVF9UQUJMRV9ERUZBVUxUIFx1MDAyNlx1MDAyNiB2IFx1MDAzZT0gMTAwMDAwMDAwKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRpZiAoc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spKVxuK1x0XHRyY3VfcmVhZF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdGlmIChtcnQgXHUwMDI2XHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSkge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdH1cbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXG4tXHRcdHJ0bmxfbG9jaygpO1xuLVx0XHRyZXQgPSAwO1xuLVx0XHRtcnQgPSBpcDZtcl9uZXdfdGFibGUobmV0LCB2KTtcbi1cdFx0aWYgKElTX0VSUihtcnQpKVxuLVx0XHRcdHJldCA9IFBUUl9FUlIobXJ0KTtcbi1cdFx0ZWxzZVxuLVx0XHRcdHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID0gdjtcbi1cdFx0cnRubF91bmxvY2soKTtcbi1cdFx0cmV0dXJuIHJldDtcbitcdFx0cmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPSB2O1xuK1x0XHRyZXR1cm4gMDtcbiBcdH1cbiAjZW5kaWZcbiBcdC8qXG5AQCAtMTg5NywxNiArMjExNywxOCBAQCBpbnQgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4ge1xuIFx0aW50IG9scjtcbiBcdGludCB2YWw7XG4tXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiBcbiBcdGlmIChzay1cdTAwM2Vza190eXBlICE9IFNPQ0tfUkFXIHx8XG4gXHQgICAgaW5ldF9zayhzayktXHUwMDNlaW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpXG4gXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbitcdHJjdV9yZWFkX2xvY2soKTtcbitcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRpZiAoIW1ydCkge1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4gXG4gXHRzd2l0Y2ggKG9wdG5hbWUpIHtcbiBcdGNhc2UgTVJUNl9WRVJTSU9OOlxuQEAgLTE5MjEsOCArMjE0MywxMCBAQCBpbnQgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdHZhbCA9IFJFQURfT05DRShtcnQtXHUwMDNlbXJvdXRlX2RvX2Fzc2VydCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAtRU5PUFJPVE9PUFQ7XG4gXHR9XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiBcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZvbHIsIG9wdGxlbiwgc2l6ZW9mKGludCkpKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbkBAIC0xOTQ3LDIwICsyMTcxLDIzIEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZylcbiBcdHN0cnVjdCBzaW9jX21pZl9yZXE2ICp2cjtcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XG4gXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcbi1cdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbiBcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuIFxuLVx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcbi1cdGlmICghbXJ0KVxuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdGlmICghbXJ0KSB7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdH1cbiBcbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHR2ciA9IChzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqKWFyZztcbi1cdFx0aWYgKHZyLVx1MDAzZW1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKVxuK1x0XHRpZiAodnItXHUwMDNlbWlmaSBcdTAwM2U9IG1ydC1cdTAwM2VtYXh2aWYpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0fVxuIFx0XHR2ci1cdTAwM2VtaWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLVx1MDAzZW1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdHZpZiA9IFx1MDAyNm1ydC1cdTAwM2V2aWZfdGFibGVbdnItXHUwMDNlbWlmaV07XG4gXHRcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnItXHUwMDNlbWlmaSkpIHtcbiBcdFx0XHR2ci1cdTAwM2VpY291bnQgPSBSRUFEX09OQ0UodmlmLVx1MDAzZXBrdF9pbik7XG5AQCAtMTk3NCw4ICsyMjAxLDYgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKVxuIFx0XHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XG4gXHRjYXNlIFNJT0NHRVRTR0NOVF9JTjY6XG4gXHRcdHNyID0gKHN0cnVjdCBzaW9jX3NnX3JlcTYgKilhcmc7XG4tXG4tXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0YyA9IGlwNm1yX2NhY2hlX2ZpbmQobXJ0LCBcdTAwMjZzci1cdTAwM2VzcmMuc2luNl9hZGRyLFxuIFx0XHRcdFx0ICAgICBcdTAwMjZzci1cdTAwM2VncnAuc2luNl9hZGRyKTtcbiBcdFx0aWYgKGMpIHtcbkBAIC0xOTg4LDYgKzIyMTMsNyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXG4gXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XG4gXHRkZWZhdWx0OlxuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbiBcdH1cbiB9XG5AQCAtMjAxNSwyMSArMjI0MSwyMyBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcbiBcdHN0cnVjdCBjb21wYXRfc2lvY19taWZfcmVxNiB2cjtcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XG4gXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcbi1cdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbiBcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuIFxuLVx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcbi1cdGlmICghbXJ0KVxuLVx0XHRyZXR1cm4gLUVOT0VOVDtcbi1cbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dnIsIGFyZywgc2l6ZW9mKHZyKSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4tXHRcdGlmICh2ci5taWZpIFx1MDAzZT0gbXJ0LVx1MDAzZW1heHZpZilcbitcdFx0cmN1X3JlYWRfbG9jaygpO1xuK1x0XHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xuK1x0XHRpZiAoIW1ydCkge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4rXHRcdGlmICh2ci5taWZpIFx1MDAzZT0gbXJ0LVx1MDAzZW1heHZpZikge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0XHR9XG4gXHRcdHZyLm1pZmkgPSBhcnJheV9pbmRleF9ub3NwZWModnIubWlmaSwgbXJ0LVx1MDAzZW1heHZpZik7XG4tXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0dmlmID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVt2ci5taWZpXTtcbiBcdFx0aWYgKFZJRl9FWElTVFMobXJ0LCB2ci5taWZpKSkge1xuIFx0XHRcdHZyLmljb3VudCA9IFJFQURfT05DRSh2aWYtXHUwMDNlcGt0X2luKTtcbkBAIC0yMDQ5LDYgKzIyNzcsMTEgQEAgaW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG4gXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRjID0gaXA2bXJfY2FjaGVfZmluZChtcnQsIFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFx1MDAyNnNyLmdycC5zaW42X2FkZHIpO1xuIFx0XHRpZiAoYykge1xuIFx0XHRcdHNyLnBrdGNudCA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLnBrdCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoxNC40NjY3NjkwNzFaIiwiU2VxIjoxMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Nzc1MDM1ODQ2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBGdXp6aW5nIFNlc3Npb24gQXNzZXNzbWVudCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBwYXRjaCBhbmQgc2VlIGlmIGl0IHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2VzLiBJdCdzIHRvdWNoaW5nIGBuZXQvaXB2Ni9pcDZtci5jYCwgd2hpY2ggdGVsbHMgbWUgdGhpcyBjb25jZXJucyBJUHY2IG11bHRpY2FzdCByb3V0aW5nLlxuXG5Ob3csIGZvY3VzaW5nIG9uIHRoZSBjb3JlIGNoYW5nZXMsIGl0IGFwcGVhcnMgdGhpcyBwYXRjaCBpcyBhYm91dCBkeW5hbWljIHRhYmxlIG1hbmFnZW1lbnQgZm9yIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGBpcDZtcmApLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIGJlIG1vdmluZyBmcm9tIHByZS1hbGxvY2F0aW9uIG9yIGFsbG9jYXRpb24gZHVyaW5nIGBNUlQ2X1RBQkxFYCB0byBkeW5hbWljIGFsbG9jYXRpb24gdXNpbmcgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAgd2hlbiBgc2V0c29ja29wdGAgY2FsbHMgbGlrZSBgTVJUNl9JTklUYCwgYE1SVDZfQUREX01JRmAsIGFuZCBgTVJUNl9BRERfTUZDYCBhcmUgbWFkZS4gVGhlIHBhdGNoIGFsc28gaW50cm9kdWNlcyBkeW5hbWljIHRhYmxlIGRlc3RydWN0aW9uIChgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95YCkgd2hlbiB0YWJsZXMgYXJlIGVtcHR5LCB1bnJlZ2lzdGVyZWQsIG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkLlxuXG5JJ20gbm90aW5nIHRoYXQgd2l0aGluIGBpcDZfbXJvdXRlX3NldHNvY2tvcHRgIHdpdGggYE1SVDZfVEFCTEVgLCB0aGUgY29kZSBub3cgKmp1c3QqIHNldHMgdGhlIHBvaW50ZXIgYHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID0gdjtgIHdpdGhvdXQgaW1tZWRpYXRlbHkgYWxsb2NhdGluZyB0aGUgdGFibGUsIGZ1cnRoZXIgcmVpbmZvcmNpbmcgdGhpcyBkeW5hbWljIGJlaGF2aW9yLiBBbHNvLCBpbiBgaXA2bXJfaW9jdGxgIGFuZCBgaXA2bXJfY29tcGF0X2lvY3RsYCwgaXQgbm93IGxvb2tzIHVwIHRoZSB0YWJsZSB1c2luZyBgaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKWAgdW5kZXIgYHJjdV9yZWFkX2xvY2soKWAgcmF0aGVyIHRoYW4gYW4gdXBmcm9udCBsb29rdXAuIExhc3RseSwgSSBzZWUgY2hhbmdlcyB0byBsb2NraW5nIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCwgd2l0aCBgaXA2bXJfZGVzdHJveV93b3JrYCBub3cgYmVpbmcgYWxsb2NhdGVkIHZpYSBga21hbGxvY19vYmooKmR3LCBHRlBfQVRPTUlDKWAuXG5cbk15IG5leHQgbWFqb3IgY29uY2VybiBpcyB1bmluaXRpYWxpemVkIG1lbW9yeS4gTGV0J3MgZGlnIGluIGhlcmUuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGNoZWNrIHRoZSBhbGxvY2F0aW9uIGFuZCB1c2Ugb2YgYGttYWxsb2Nfb2JqKCpkdywgR0ZQX0FUT01JQylgIHdpdGhpbiBgaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveWAuIEZyb20gd2hhdCBJIHNlZSBpbiB0aGF0IGNvZGUsIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBgaXA2bXJfZGVzdHJveV93b3JrYCBzdHJ1Y3QgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkICpiZWZvcmUqIHRoZSB3b3JrIGlzIHF1ZXVlZC4gVGhlIGBpcDZtcl9kZXN0cm95X3dvcmtmbmAgb25seSByZWFkcyBgZHctXHUwMDNlbmV0YCBhbmQgYGR3LVx1MDAzZWlkYCwgdGhlbiBmcmVlcyBgZHdgLiBUaGF0IGxvb2tzIHNhZmUuXG5cbkknbGwgYWxzbyBxdWlja2x5IGNoZWNrIHRoYXQgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKWAgaW5pdGlhbGl6ZXMgYG5ld190YWJsZWAgdG8gYGZhbHNlYCBhbmQgc2V0cyBpdCB0byBgdHJ1ZWAgb24gYWxsb2NhdGlvbiBzdWNjZXNzLiBJJ20gYWxzbyBnbGFuY2luZyBhdCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AsIHdoaWNoIGluaXRpYWxpemVzIGEgYm9vbGVhbiBgZW1wdHlgIGFuZCB0aGVuIGFzc2lnbnMgaXQgYmFzZWQgb24gYGxpc3RfZW1wdHlgIGNhbGxzIG9yIHNldHMgdG8gYHRydWVgLiBTaW1pbGFybHksIGBpcDZtcl9kZXZpY2VfZXZlbnRgIGluaXRpYWxpemVzIGB2aWZfZ29uZSA9IGZhbHNlO2AuXG5cbkZpbmFsbHksIHRoZSBpb2N0bCBhbmQgY29tcGF0IGlvY3RsIGhhbmRsaW5nIGNhdGNoZXMgbXkgYXR0ZW50aW9uLiBJbiB0aGUgcmVndWxhciBpb2N0bCAoYGlwNm1yX2lvY3RsYCksIHRoZSBhcmd1bWVudHMgKGB2cmAgYW5kIGBzcmApIGFyZSBjYXN0LiAgSW4gdGhlIGNvbXBhdCBpb2N0bCAoYGlwNm1yX2NvbXBhdF9pb2N0bGApLCB0aGUgZGF0YSBmcm9tIHVzZXIgc3BhY2UgaXMgY29waWVkIHZpYSBgY29weV9mcm9tX3VzZXJgLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIG1vZGlmaWVkIHZhbHVlcyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZSB1c2luZyBgY29weV90b191c2VyYC4gSSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciB0aGlzIGJlaGF2aW9yIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHJlLXBhdGNoIHZlcnNpb25zIHRvIGFzc2VzcyBhbnkgcG90ZW50aWFsIGlzc3VlcyBoZXJlLiBUaGlzIGRlc2VydmVzIGEgY2xvc2VyIGxvb2sgYXQgdGhlIG9yaWdpbmFsIGNvZGUgdG8gY29uZmlybS5cblxuR2l2ZW4gbXkgYW5hbHlzaXMsIEkgYW0gZ29pbmcgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFuZ2VzIGFyZSBlbm91Z2ggdG8gd2FycmFudCBhIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODg2NiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMDUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoyMi4yMTcxMzA1MThaIiwiU2VxIjoxNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2NjE1NjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlwNm1yX2NvbXBhdF9pb2N0bFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvaXB2Ni9pcDZtci5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9pcHY2L2lwNm1yLmM9MjIzMD1zdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYge1xcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy0yMjM3LVxcbm5ldC9pcHY2L2lwNm1yLmM6MjIzODppbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcXG5uZXQvaXB2Ni9pcDZtci5jLTIyMzkte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoyMi4yOTM3NTk1MDdaIiwiU2VxIjoxNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjI2NDcwNjAzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYGlwNm1yX2NvbXBhdF9pb2N0bGAqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSwgYW5kIEkgbmVlZCB0byBtYWtlIGFic29sdXRlbHkgc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGludGVyYWN0aW9uIGFyb3VuZCBgaXA2bXJfY29tcGF0X2lvY3RsYC4gTGV0J3MgemVybyBpbiBvbiB0aGF0IHNlY3Rpb24sIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAyMjM4LiBJJ20gZ29pbmcgdG8gY2FyZWZ1bGx5IHJldmlldyB0aGF0IGZ1bmN0aW9uIHRvIG1ha2UgY2VydGFpbiBJJ20gbm90IG1pc3NpbmcgYW55IHN1YnRsZSBkZXRhaWxzIG9yIHBvdGVudGlhbCBlZGdlIGNhc2VzLiBOZWVkIHRvIGdldCBhIHJlYWxseSBnb29kIGhhbmRsZSBvbiBob3cgdGhpcyB0aGluZyBpcyBhY3R1YWxseSB3b3JraW5nLCBzbyBsZXQncyBzdGFydCB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA3ODcsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoyNC41NTg0NjgzMTJaIiwiU2VxIjoxNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE4MDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9pcHY2L2lwNm1yLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjIzOCxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjIzODpcXHRpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcXG4yMjM5OlxcdHtcXG4yMjQwOlxcdFxcdHN0cnVjdCBjb21wYXRfc2lvY19zZ19yZXE2IHNyO1xcbjIyNDE6XFx0XFx0c3RydWN0IGNvbXBhdF9zaW9jX21pZl9yZXE2IHZyO1xcbjIyNDI6XFx0XFx0c3RydWN0IHZpZl9kZXZpY2UgKnZpZjtcXG4yMjQzOlxcdFxcdHN0cnVjdCBtZmM2X2NhY2hlICpjO1xcbjIyNDQ6XFx0XFx0c3RydWN0IG1yX3RhYmxlICptcnQ7XFxuMjI0NTpcXHRcXG4yMjQ2OlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuMjI0NzpcXHRcXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxcbjIyNDg6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZ2ciwgYXJnLCBzaXplb2YodnIpKSlcXG4yMjQ5OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbjIyNTA6XFx0XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbjIyNTE6XFx0XFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4yMjUyOlxcdFxcdFxcdGlmICghbXJ0KSB7XFxuMjI1MzpcXHRcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4yMjU0OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjIyNTU6XFx0XFx0XFx0fVxcbjIyNTY6XFx0XFx0XFx0aWYgKHZyLm1pZmkgXFx1MDAzZT0gbXJ0LVxcdTAwM2VtYXh2aWYpIHtcXG4yMjU3OlxcdFxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjIyNTg6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjI1OTpcXHRcXHRcXHR9XFxuMjI2MDpcXHRcXHRcXHR2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC1cXHUwMDNlbWF4dmlmKTtcXG4yMjYxOlxcdFxcdFxcdHZpZiA9IFxcdTAwMjZtcnQtXFx1MDAzZXZpZl90YWJsZVt2ci5taWZpXTtcXG4yMjYyOlxcdFxcdFxcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnIubWlmaSkpIHtcXG4yMjYzOlxcdFxcdFxcdFxcdHZyLmljb3VudCA9IFJFQURfT05DRSh2aWYtXFx1MDAzZXBrdF9pbik7XFxuMjI2NDpcXHRcXHRcXHRcXHR2ci5vY291bnQgPSBSRUFEX09OQ0UodmlmLVxcdTAwM2Vwa3Rfb3V0KTtcXG4yMjY1OlxcdFxcdFxcdFxcdHZyLmlieXRlcyA9IFJFQURfT05DRSh2aWYtXFx1MDAzZWJ5dGVzX2luKTtcXG4yMjY2OlxcdFxcdFxcdFxcdHZyLm9ieXRlcyA9IFJFQURfT05DRSh2aWYtXFx1MDAzZWJ5dGVzX291dCk7XFxuMjI2NzpcXHRcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4yMjY4OlxcdFxcbjIyNjk6XFx0XFx0XFx0XFx0aWYgKGNvcHlfdG9fdXNlcihhcmcsIFxcdTAwMjZ2ciwgc2l6ZW9mKHZyKSkpXFxuMjI3MDpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4yMjcxOlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbjIyNzI6XFx0XFx0XFx0fVxcbjIyNzM6XFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuMjI3NDpcXHRcXHRcXHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XFxuMjI3NTpcXHRcXHRjYXNlIFNJT0NHRVRTR0NOVF9JTjY6XFxuMjI3NjpcXHRcXHRcXHRpZiAoY29weV9mcm9tX3VzZXIoXFx1MDAyNnNyLCBhcmcsIHNpemVvZihzcikpKVxcbjIyNzc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuMjI3ODpcXHRcXG4yMjc5OlxcdFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4yMjgwOlxcdFxcdFxcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XFxuMjI4MTpcXHRcXHRcXHRpZiAoIW1ydCkge1xcbjIyODI6XFx0XFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuMjI4MzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4yMjg0OlxcdFxcdFxcdH1cXG4yMjg1OlxcdFxcdFxcdGMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgXFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFxcdTAwMjZzci5ncnAuc2luNl9hZGRyKTtcXG4yMjg2OlxcdFxcdFxcdGlmIChjKSB7XFxuMjI4NzpcXHRcXHRcXHRcXHRzci5wa3RjbnQgPSBhdG9taWNfbG9uZ19yZWFkKFxcdTAwMjZjLVxcdTAwM2VfYy5tZmNfdW4ucmVzLnBrdCk7XFxuMjI4ODpcXHRcXHRcXHRcXHRzci5ieXRlY250ID0gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2Yy1cXHUwMDNlX2MubWZjX3VuLnJlcy5ieXRlcyk7XFxuMjI4OTpcXHRcXHRcXHRcXHRzci53cm9uZ19pZiA9IGF0b21pY19sb25nX3JlYWQoXFx1MDAyNmMtXFx1MDAzZV9jLm1mY191bi5yZXMud3JvbmdfaWYpO1xcbjIyOTA6XFx0XFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuMjI5MTpcXHRcXG4yMjkyOlxcdFxcdFxcdFxcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcXHUwMDI2c3IsIHNpemVvZihzcikpKVxcbjIyOTM6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuMjI5NDpcXHRcXHRcXHRcXHRyZXR1cm4gMDtcXG4yMjk1OlxcdFxcdFxcdH1cXG4yMjk2OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjIyOTc6XFx0XFx0XFx0cmV0dXJuIC1FQUREUk5PVEFWQUlMO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoyNC41NTg2OTAwMDFaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mzc5NDQ4NjI1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgSVB2NiBNdWx0aWNhc3QgUm91dGluZyBDb2RlIENoYW5nZXMqKlxuXG5Pa2F5LCBzbyBsb29raW5nIGF0IHRoaXMgYGlwNm1yX2NvbXBhdF9pb2N0bGAgZnVuY3Rpb24sIHRoZSBjb2RlJ3MgYmVlbiByZW9yZ2FuaXplZC4gSXQgdXNlZCB0byBncmFiIHRoZSBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSAoYG1ydCA9IGlwNm1yX2dldF90YWJsZSguLi4pYCkgYmVmb3JlIGFueSB1c2VyIGRhdGEgY29weWluZy4gTm93LCBpdCBkb2VzIHRoZSBgY29weV9mcm9tX3VzZXJgICpmaXJzdCosIHRoZW4gbG9ja3MgUkNVLCBmaW5kcyB0aGUgdGFibGUsIGFuZCB0aGVuLCBpZiBpdCBleGlzdHMsIHByb2NlZWRzIHRvIHBvcHVsYXRlIHRoZSB1c2VyLXNwYWNlIGZpZWxkcyBhbmQgY29weSB0aGVtIGJhY2sg4oCTIGVzc2VudGlhbGx5IHRoZSBzYW1lIGVuZCByZXN1bHQgYXMgYmVmb3JlLCBqdXN0IGEgcmUtb3JkZXJpbmcuIFRoZSBnb29kIG5ld3MgaXMsIEkgZG9uJ3Qgc2VlIGFueSBvYnZpb3VzIGludHJvZHVjdGlvbiBvZiB1bmluaXRpYWxpemVkIGRhdGEsIHdoaWNoIGlzIGFsd2F5cyBhIGNyaXRpY2FsIGNvbmNlcm4gd2l0aCB0aGVzZSBzb3J0cyBvZiBjaGFuZ2VzLiBUaGF0J3MgYSByZWxpZWYuXG5cbk5vdywgSSB3YW50IHRvIGRyaWxsIGRvd24gZnVydGhlciwgc28gSSBuZWVkIHRvIGNoZWNrIG91dCBgbXJfdGFibGVfYWxsb2NgIGFuZCB0aGUgYGlwNm1yX3RhYmxlX25vX3B1Ymxpc2hgIGZ1bmN0aW9uLiBMZXQncyBzZWUuLi4gbG9va2luZyBhdCB0aGUgY29kZSwgaXQgbG9va3MgbGlrZSBgaXA2bXJfdGFibGVfbm9fcHVibGlzaGAgaXMgYSBjYWxsYmFjayB0aGF0IGRvZXMgbm90aGluZywgd2hpY2ggaXMgZmluZSwgZXNwZWNpYWxseSBpZiBpdCdzIHVzZWQgKndoaWxlKiB0aGUgdGFibGUgaXMgc3RpbGwgdW5wdWJsaXNoZWQsIGFzIHRoZSBjb21tZW50IHN1Z2dlc3RzLiBXZSBjYW4gaWdub3JlIHRoYXQgZm9yIG5vdy5cblxuVGhlbiwgdGhlIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgIGZ1bmN0aW9uIHVzZXMgYF9faXA2bXJfZ2V0X3RhYmxlYCB0byBnZXQgdGhlIE1SVC4gSWYgaXQncyBub3QgZm91bmQsIGBtcl90YWJsZV9hbGxvY2AgaXMgY2FsbGVkIHRvIGFsbG9jYXRlIGEgbmV3IHRhYmxlLiBBbHJpZ2h0LiBgbXJfdGFibGVfYWxsb2NgIGxvb2tzIGxpa2UgdGhlIHBsYWNlIHdoZXJlIHRoZSBjb3JlIHRhYmxlIGFsbG9jYXRpb24gaGFwcGVucy4gTGV0J3MgZGlnIGRlZXBlci4gSSBuZWVkIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiBgbXJfdGFibGVfYWxsb2NgLCBwcm9iYWJseSBpbiBgbmV0L2lwdjQvaXBtcl9iYXNlLmNgIG9yIGEgc2ltaWxhciBmaWxlLiBJIG5lZWQgdG8gc2VlIGV4YWN0bHkgd2hhdCBtZW1vcnkgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBkdXJpbmcgdGFibGUgY3JlYXRpb24uIEl0J3MgbGlrZWx5IHRoYXQgdGFibGUgYWxsb2NhdGlvbiBkb2VzIHNvbWUgaW5pdGlhbGl6YXRpb24uIEknbGwgbmVlZCB0byB2ZXJpZnkgdGhhdCBpbml0aWFsaXphdGlvbiB0byBjb25maXJtIHRoYXQgdGhlIGNoYW5nZXMgZG9uJ3QgaW50cm9kdWNlIGFueSB2dWxuZXJhYmlsaXRpZXMgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExOTk0LCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mzk0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjI6MjguMzUzMTc4NjQyWiIsIlNlcSI6MTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMzk0MTI2MTA2LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgbXJfdGFibGUgXFxcXCptcl90YWJsZV9hbGxvY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjI6MzEuNzQ3MzEyMTE4WiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMxMjA5MDQ5OTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSHVudGluZyBEb3duIGBtcl90YWJsZV9hbGxvY2AqKlxuXG5Pa2F5LCBzbyB0aGUgdGFzayBhdCBoYW5kIGlzIHRvIGxvY2F0ZSBgbXJfdGFibGVfYWxsb2NgLiBJbW1lZGlhdGVseSwgbXkgbWluZCBzdGFydHMgdG8gbWFwIG91dCB0aGUgcG9zc2liaWxpdGllcy4gVGhpcyBpcyBsaWtlbHkgYSBtZW1vcnkgcmVzb3VyY2UgYWxsb2NhdGlvbiBmdW5jdGlvbiwganVkZ2luZyBieSB0aGUgcHJlZml4IFwibXJcIiBhbmQgdGhlIHN1ZmZpeCBcImFsbG9jXCIuIEdpdmVuIHRoZSBwb3RlbnRpYWwgc2NvcGUgb2YgYSBzeXN0ZW0gbGlrZSB0aGlzLCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYmVzdCBhcHByb2FjaCB0byBmaW5kIGl0IGVmZmljaWVudGx5LlxuXG5NeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZW1wbG95IGFsbCBteSB1c3VhbCB0cmlja3MuIFdoZXJlIGRvZXMgdGhpcyBjb2RlYmFzZSBsaWtlbHkgcmVzaWRlPyBXaGF0IGxpYnJhcmllcyB3b3VsZCBiZSBleHBlY3RlZD8gSSdkIGltbWVkaWF0ZWx5IGxlYW4gdG93YXJkcyBleGFtaW5pbmcgaGVhZGVyIGZpbGVzIGZpcnN0LiBBIHF1aWNrIGBncmVwYCAob3IgZXF1aXZhbGVudCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtKSBhY3Jvc3MgdGhlIHByb2plY3Qgd2l0aCBhIHBhdHRlcm4gdGhhdCBsb29rcyBmb3IgYSBkZWNsYXJhdGlvbiB3b3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIEknbGwgbmVlZCB0byByZW1lbWJlciB0byBjaGVjayBmb3IgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscyBhcyB3ZWxsLiBNYXliZSBpdCdzIGRlZmluZWQgd2l0aGluIGFuIGAjaWZkZWZgIGJsb2NrLlxuXG5JZiB0aGUgZnVuY3Rpb24gaXNuJ3QgcmVhZGlseSBhcHBhcmVudCBpbiB0aGUgaGVhZGVycywgSSdsbCBzd2l0Y2ggdG8gbG9va2luZyBhdCB0aGUgc291cmNlIGZpbGVzIHRoZW1zZWx2ZXMuIEdpdmVuIGl0cyBuYW1lLCBpdCdzIGxpa2VseSBhIHJlbGF0aXZlbHkgbG93LWxldmVsIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9uLCBzbyBJJ2xsIHByaW9yaXRpemUgZXhhbWluaW5nIG1vZHVsZXMgcmVsYXRlZCB0byB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLCB0YWJsZSBzdHJ1Y3R1cmVzLCBhbmQgYW55IGFzc29jaWF0ZWQgcmVzb3VyY2UgbWFuYWdlbWVudCBvciBhbGxvY2F0aW9uIGxheWVycy4gSSdsbCBoYXZlIHRvIGtlZXAgaW4gbWluZCwgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0sIGl0IG1heSBiZSBhIG1vcmUgZ2VuZXJhbC1wdXJwb3NlIHJvdXRpbmUuXG5cbkkgc2hvdWxkIGFsc28gY29uc2lkZXIgd2hldGhlciBpdCdzIHBhcnQgb2YgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5LiBJZiBzbywgSeKAmWxsIG5lZWQgdG8gZmFtaWxpYXJpemUgbXlzZWxmIHdpdGggaXRzIGRvY3VtZW50YXRpb24gYW5kIGJ1aWxkIHByb2Nlc3MgdG8gc2VlIGlmIEkgY2FuIG5hcnJvdyBkb3duIHdoZXJlIGl0J3MgaW5jbHVkZWQuXG5cbkkgY2FuIGFsc28gaW1hZ2luZSB0aGVyZSBhcmUgc3RhdGljIGFuYWx5c2lzIHRvb2xzIHRoYXQgY291bGQgYXNzaXN0LiBBIHN5bWJvbCBsb29rdXAgZnJvbSBhIGRlYnVnZ2VyIGlmIHRoYXQncyBhdmFpbGFibGUgd291bGQgc3BlZWQgdGhpbmdzIGFsb25nLiBUaGUgZ29hbCBoZXJlIGlzIGVmZmljaWVuY3kgYW5kIHByZWNpc2lvbi4gSSdsbCBuZWVkIHRvIGJhbGFuY2Ugc3BlZWQgYW5kIGFjY3VyYWN5IGluIG15IHNlYXJjaC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY29uc2lkZXIgdGhlIGNvbnRleHQgb2YgdGhlIHVzYWdlIGFzIHRoYXQgd2lsbCBhbHNvIGxpa2VseSBndWlkZSBteSBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjg1MSwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjM0Ljg2ODIyMTUyOVoiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzM4MzM2MDM1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtcl90YWJsZV9hbGxvY1xcXFwoXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvbXJvdXRlX2Jhc2UuaD0yODA9c3RydWN0IG1yX3RhYmxlICpcXG5pbmNsdWRlL2xpbnV4L21yb3V0ZV9iYXNlLmg6MjgxOm1yX3RhYmxlX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkLFxcbmluY2x1ZGUvbGludXgvbXJvdXRlX2Jhc2UuaC0yODItXFx0ICAgICAgIHN0cnVjdCBtcl90YWJsZV9vcHMgKm9wcyxcXG4tLVxcbm5ldC9pcHY0L2lwbXIuYz00MjY9c3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXBtcl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXFxuLS1cXG5uZXQvaXB2NC9pcG1yLmMtNDM3LVxcbm5ldC9pcHY0L2lwbXIuYzo0Mzg6XFx0cmV0dXJuIG1yX3RhYmxlX2FsbG9jKG5ldCwgaWQsIFxcdTAwMjZpcG1yX21yX3RhYmxlX29wcyxcXG5uZXQvaXB2NC9pcG1yLmMtNDM5LVxcdFxcdFxcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwbXJfbmV3X3RhYmxlX3NldCk7XFxuLS1cXG5uZXQvaXB2NC9pcG1yX2Jhc2UuYz00NT1zdHJ1Y3QgbXJfdGFibGUgKlxcbm5ldC9pcHY0L2lwbXJfYmFzZS5jOjQ2Om1yX3RhYmxlX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkLFxcbm5ldC9pcHY0L2lwbXJfYmFzZS5jLTQ3LVxcdCAgICAgICBzdHJ1Y3QgbXJfdGFibGVfb3BzICpvcHMsXFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jPTQxNT1zdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jLTQyMi1cXG5uZXQvaXB2Ni9pcDZtci5jOjQyMzpcXHRyZXR1cm4gbXJfdGFibGVfYWxsb2MobmV0LCBpZCwgXFx1MDAyNmlwNm1yX21yX3RhYmxlX29wcyxcXG5uZXQvaXB2Ni9pcDZtci5jLTQyNC1cXHRcXHRcXHQgICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl9uZXdfdGFibGVfc2V0KTtcXG4tLVxcbm5ldC9pcHY2L2lwNm1yLmM9NDMyPXN0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jLTQ0NS1cXG5uZXQvaXB2Ni9pcDZtci5jOjQ0NjpcXHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcXHUwMDI2aXA2bXJfbXJfdGFibGVfb3BzLFxcbm5ldC9pcHY2L2lwNm1yLmMtNDQ3LVxcdFxcdFxcdCAgICAgaXBtcl9leHBpcmVfcHJvY2VzcywgaXA2bXJfdGFibGVfbm9fcHVibGlzaCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjM4LjI1MTU5MDY0NloiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTk2MDAwMjc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipEaXZpbmcgaW50byB0aGUgSVB2NCBNdWx0aWNhc3QgUm91dGVyIENvZGUqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIHRoaXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZXMgYXJlIGFsbG9jYXRlZCwgc28gbGV0J3MgemVybyBpbiBvbiBgbXJfdGFibGVfYWxsb2NgLiBUaGF0J3MgdGhlIGZ1bmN0aW9uIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSwgYW5kIGl0IGxpdmVzIGluIGBuZXQvaXB2NC9pcG1yX2Jhc2UuY2AuIEknbSBnb2luZyB0byBzdGFydCB0aGVyZSBhbmQgc2VlIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIHdoYXQgaXQgaW50ZXJhY3RzIHdpdGgsIGFuZCBob3cgaXQgaGFuZGxlcyBtZW1vcnkgYWxsb2NhdGlvbiwgYW55IHNwaW5sb2NrcywgYW5kIG90aGVyIGNvbmN1cnJlbnQgYWNjZXNzLiBJIGV4cGVjdCB0byBiZSBkaWdnaW5nIGRlZXAgaW50byB0aGUgaW50cmljYWNpZXMgb2Yga2VybmVsIGRhdGEgc3RydWN0dXJlcyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdG8gZ2V0IGEgY29tcGxldGUgcGljdHVyZS4gVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCB3b3JrIGJlZ2lucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM4NjEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjo0MC40NDc1OTUzNzFaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAwMDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9pcHY0L2lwbXJfYmFzZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQ1LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDQ1OlxcdHN0cnVjdCBtcl90YWJsZSAqXFxuICA0NjpcXHRtcl90YWJsZV9hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBpZCxcXG4gIDQ3OlxcdFxcdCAgICAgICBzdHJ1Y3QgbXJfdGFibGVfb3BzICpvcHMsXFxuICA0ODpcXHRcXHQgICAgICAgdm9pZCAoKmV4cGlyZV9mdW5jKShzdHJ1Y3QgdGltZXJfbGlzdCAqdCksXFxuICA0OTpcXHRcXHQgICAgICAgdm9pZCAoKnRhYmxlX3NldCkoc3RydWN0IG1yX3RhYmxlICptcnQsXFxuICA1MDpcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG5ldCAqbmV0KSlcXG4gIDUxOlxcdHtcXG4gIDUyOlxcdFxcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbiAgNTM6XFx0XFx0aW50IGVycjtcXG4gIDU0OlxcdFxcbiAgNTU6XFx0XFx0bXJ0ID0ga3phbGxvY19vYmooKm1ydCk7XFxuICA1NjpcXHRcXHRpZiAoIW1ydClcXG4gIDU3OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiAgNTg6XFx0XFx0bXJ0LVxcdTAwM2VpZCA9IGlkO1xcbiAgNTk6XFx0XFx0d3JpdGVfcG5ldChcXHUwMDI2bXJ0LVxcdTAwM2VuZXQsIG5ldCk7XFxuICA2MDpcXHRcXG4gIDYxOlxcdFxcdG1ydC1cXHUwMDNlb3BzID0gKm9wcztcXG4gIDYyOlxcdFxcdGVyciA9IHJobHRhYmxlX2luaXQoXFx1MDAyNm1ydC1cXHUwMDNlbWZjX2hhc2gsIG1ydC1cXHUwMDNlb3BzLnJodF9wYXJhbXMpO1xcbiAgNjM6XFx0XFx0aWYgKGVycikge1xcbiAgNjQ6XFx0XFx0XFx0a2ZyZWUobXJ0KTtcXG4gIDY1OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuICA2NjpcXHRcXHR9XFxuICA2NzpcXHRcXG4gIDY4OlxcdFxcdElOSVRfUkNVX1dPUksoXFx1MDAyNm1ydC1cXHUwMDNld29yaywgX19tcl9mcmVlX3RhYmxlKTtcXG4gIDY5OlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtcnQtXFx1MDAzZW1mY19jYWNoZV9saXN0KTtcXG4gIDcwOlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtcnQtXFx1MDAzZW1mY191bnJlc19xdWV1ZSk7XFxuICA3MTpcXHRcXG4gIDcyOlxcdFxcdHRpbWVyX3NldHVwKFxcdTAwMjZtcnQtXFx1MDAzZWlwbXJfZXhwaXJlX3RpbWVyLCBleHBpcmVfZnVuYywgMCk7XFxuICA3MzpcXHRcXG4gIDc0OlxcdFxcdG1ydC1cXHUwMDNlbXJvdXRlX3JlZ192aWZfbnVtID0gLTE7XFxuICA3NTpcXHRcXHR0YWJsZV9zZXQobXJ0LCBuZXQpO1xcbiAgNzY6XFx0XFx0cmV0dXJuIG1ydDtcXG4gIDc3OlxcdH1cXG4gIDc4OlxcdFxcbiAgNzk6XFx0dm9pZCAqbXJfbWZjX2ZpbmRfcGFyZW50KHN0cnVjdCBtcl90YWJsZSAqbXJ0LCB2b2lkICpoYXNoYXJnLCBpbnQgcGFyZW50KVxcbiAgODA6XFx0e1xcbiAgODE6XFx0XFx0c3RydWN0IHJobGlzdF9oZWFkICp0bXAsICpsaXN0O1xcbiAgODI6XFx0XFx0c3RydWN0IG1yX21mYyAqYztcXG4gIDgzOlxcdFxcbiAgODQ6XFx0XFx0bGlzdCA9IHJobHRhYmxlX2xvb2t1cChcXHUwMDI2bXJ0LVxcdTAwM2VtZmNfaGFzaCwgaGFzaGFyZywgKm1ydC1cXHUwMDNlb3BzLnJodF9wYXJhbXMpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjo0MC40NDc2OTgxMDFaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzgyNjcxMDU0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBgbXJfdGFibGVgIENoYW5nZXMqKlxuXG5Pa2F5LCBzbyBgbXJfdGFibGVfYWxsb2NgIHVzZXMgYGt6YWxsb2Nfb2JqYCBvbiB0aGUgYHN0cnVjdCBtcl90YWJsZWAuIFRoYXQncyBnb29kIOKAkyBpdCBtZWFucyB0aGUgZW50aXJlIHN0cnVjdHVyZSBpcyB6ZXJvLWluaXRpYWxpemVkIHJpZ2h0IG9mZiB0aGUgYmF0LiBObyB1bmluaXRpYWxpemVkIGdhcmJhZ2UgbGVmdCBsaW5nZXJpbmcgdGhlcmUuIE5vdywgbGV0J3MgdGhpbmsgYWJvdXQgd2hlcmUgZWxzZSB0aGlzIHRoaW5nIGlzIHRvdWNoZWQuIERlc3RydWN0aW9uLCByZWZjb3VudGluZywgUkNVLCBsb2NraW5nLCBsaXN0IG1hbmFnZW1lbnTigKYgY2xhc3NpYyBtZW1vcnkgbGlmZXRpbWUgaXNzdWVzLCBzeW5jaHJvbml6YXRpb24sIGFuZCBSQ1UgbWFuYWdlbWVudCBmaXhlcywgYXMgZXhwZWN0ZWQuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgcHJldmVudGluZyBtZW1vcnkgbGVha3Mgb3IgdXNlLWFmdGVyLWZyZWUgc2l0dWF0aW9ucyB3aGVuIG11bHRpY2FzdCB0YWJsZXMgYXJlIG5vIGxvbmdlciBuZWVkZWQuXG5cbkFueSBidWdzIHRoYXQgKmNvdWxkKiBwb3AgdXAgaGVyZSB3b3VsZCBsaWtlbHkgYmUgc3RhbmRhcmQ6IHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZS1mcmVlLCB3aGljaCBLQVNBTiBzaG91bGQgbmFpbDsgbG9ja2luZyBwcm9ibGVtcyBvciBkZWFkbG9ja3MsIExPQ0tERVAgd2lsbCBjYXRjaCB0aG9zZTsgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlcyBvciBkb2RneSBlcnJvciBoYW5kbGluZywgc3RhbmRhcmQga2VybmVsIGNoZWNrcyBhbmQgS0FTQU4gd291bGQgdGFrZSBjYXJlIG9mIHRoYXQ7IGFuZCwgZmluYWxseSwgbWVtb3J5IGxlYWtzLCB3aGljaCBLTUVNTEVBSyBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZXhwb3NlLlxuXG5DcnVjaWFsbHksIGZyb20gbXkgZXhwZXJ0IHBvaW50IG9mIHZpZXcsIG5vbmUgb2YgdGhlc2UgY2hhbmdlcyBzZWVtIHRvIGludHJvZHVjZSAqYW55KiByaXNrcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBhbnkgcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UuIEFsbCB0aGUgbmV3IG9yIG1vZGlmaWVkIHZhcmlhYmxlcyDigJMgc3RhY2sgYW5kIGhlYXAg4oCTIGFyZSBmdWxseSBpbml0aWFsaXplZC4gYGttYWxsb2Nfb2JqYCB3aXRoIGV4cGxpY2l0IGZpZWxkIGluaXRpYWxpemF0aW9uLCBga3phbGxvY19vYmpgLCBvciB6ZXJvLWluaXRpYWxpemVkIHByaW1pdGl2ZXMuIFNvLCBubyBzdXJwcmlzZXMgdGhlcmUuXG5cblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBkb2Vzbid0IHRyaWdnZXIgYW55IG9mIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBwaXRmYWxscyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4ncyBhdHRlbnRpb24uIEknbSBjb25maWRlbnQgdGhhdCBzdGFuZGFyZCBLQVNBTiBhbmQgTE9DS0RFUCB0ZXN0aW5nIGFyZSBtb3JlIHRoYW4gc3VmZmljaWVudCB0byBjb3ZlciB0aGlzLiBJJ20gZ29pbmcgdG8gc2V0IGBOZWVkc0tNU0FOPWZhbHNlYCB3aXRoIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24uIFRoYXQncyBteSBjYWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDY4OSwiT3V0cHV0VG9rZW5zIjoyNzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNzMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjo0OC4yNzQ0MTE4OThaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMzgxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCAobmV0L2lwdjYvaXA2bXIuYykgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgdGFibGVzIG9uIGRlbWFuZCB3aGVuIHNvY2tldCBvcHRpb25zIGFyZSBjb25maWd1cmVkIGFuZCB0byBkZXN0cm95IHRoZW0gd2hlbiB0aGV5IGJlY29tZSB1bnJlZmVyZW5jZWQgb3IgZW1wdHkuXFxuXFxuLSBNZW1vcnkgQWxsb2NhdGlvbnM6IE5ldyBkeW5hbWljIGFsbG9jYXRpb25zIChzdWNoIGFzIGBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrYCBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jX29iamApIGhhdmUgYWxsIG1lbWJlciBmaWVsZHMgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFRoZSB1bmRlcmx5aW5nIG11bHRpY2FzdCB0YWJsZXMgYWxsb2NhdGVkIHZpYSBgbXJfdGFibGVfYWxsb2MoKWAgdXNlIGBremFsbG9jX29iaigpYC5cXG4tIERhdGEgc2VudCB0byB1c2VyIHNwYWNlOiBpb2N0bC9jb21wYXRfaW9jdGwgYW5kIGdldHNvY2tvcHQgaGFuZGxlcnMgb25seSBjb3B5IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgZmllbGRzIG9yIGRhdGEgY29waWVkIGZyb20gdXNlciBzcGFjZSBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBsZWF2aW5nIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciByZWFkaW5nIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS5cXG4tIENvbnRyb2wgZmxvdyBhbmQgTGlmZXRpbWVzOiBDaGFuZ2VzIGFmZmVjdCB0YWJsZSBsaWZlY3ljbGUsIFJDVSBzeW5jaHJvbml6YXRpb24sIGxpc3QgbWFuaXB1bGF0aW9ucywgYW5kIGxvY2tpbmcgKFJUTkwvbXJ0X2xvY2spLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoZXNlIHBhdGhzIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgYWNjZXNzLCBvciBtZW1vcnkgbGVha3MsIHdoaWNoIGFyZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgS01FTUxFQUsuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIGludHJvZHVjZWQsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCAobmV0L2lwdjYvaXA2bXIuYykgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgdGFibGVzIG9uIGRlbWFuZCB3aGVuIHNvY2tldCBvcHRpb25zIGFyZSBjb25maWd1cmVkIGFuZCB0byBkZXN0cm95IHRoZW0gd2hlbiB0aGV5IGJlY29tZSB1bnJlZmVyZW5jZWQgb3IgZW1wdHkuXFxuXFxuLSBNZW1vcnkgQWxsb2NhdGlvbnM6IE5ldyBkeW5hbWljIGFsbG9jYXRpb25zIChzdWNoIGFzIGBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrYCBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jX29iamApIGhhdmUgYWxsIG1lbWJlciBmaWVsZHMgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFRoZSB1bmRlcmx5aW5nIG11bHRpY2FzdCB0YWJsZXMgYWxsb2NhdGVkIHZpYSBgbXJfdGFibGVfYWxsb2MoKWAgdXNlIGBremFsbG9jX29iaigpYC5cXG4tIERhdGEgc2VudCB0byB1c2VyIHNwYWNlOiBpb2N0bC9jb21wYXRfaW9jdGwgYW5kIGdldHNvY2tvcHQgaGFuZGxlcnMgb25seSBjb3B5IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgZmllbGRzIG9yIGRhdGEgY29waWVkIGZyb20gdXNlciBzcGFjZSBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBsZWF2aW5nIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciByZWFkaW5nIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS5cXG4tIENvbnRyb2wgZmxvdyBhbmQgTGlmZXRpbWVzOiBDaGFuZ2VzIGFmZmVjdCB0YWJsZSBsaWZlY3ljbGUsIFJDVSBzeW5jaHJvbml6YXRpb24sIGxpc3QgbWFuaXB1bGF0aW9ucywgYW5kIGxvY2tpbmcgKFJUTkwvbXJ0X2xvY2spLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoZXNlIHBhdGhzIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgYWNjZXNzLCBvciBtZW1vcnkgbGVha3MsIHdoaWNoIGFyZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgS01FTUxFQUsuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIGludHJvZHVjZWQsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow7lp9l[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-06 15:19:44 +0000 UTC FinishedAt: 2026-09-06 15:22:50 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "641d03105cc0d2437e32fdeec164f91a4ccef6c4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IPV6", "IPV6_MROUTE", "IPV6_MROUTE_MULTIPLE_TABLES" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "641d03105cc0d2437e32fdeec164f91a4ccef6c4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IPV6", "IPV6_MROUTE", "IPV6_MROUTE_MULTIPLE_TABLES" ], "series_id": "aaa7c65c-7234-4ec7-83fb-134e1137c61c" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "ip6_mroute_setsockopt", "ip6_mroute_getsockopt", "ip6mr_ioctl", "ip6mr_compat_ioctl", "ip6mr_sk_done", "ip6mr_get_or_alloc_sk_table", "ip6mr_maybe_destroy_table", "ip6mr_destroy_workfn", "ip6mr_device_event", "ipmr_expire_process" ], "corpus_urls": [ "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+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lQVjYmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEUmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aXA2X21yb3V0ZV9zZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O2lwNl9tcm91dGVfZ2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtpcDZtcl9pb2N0bCYjMzQ7LAogICAgJiMzNDtpcDZtcl9jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7aXA2bXJfc2tfZG9uZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUmIzM0OywKICAgICYjMzQ7aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXN0cm95X3dvcmtmbiYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXZpY2VfZXZlbnQmIzM0OywKICAgICYjMzQ7aXBtcl9leHBpcmVfcHJvY2VzcyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCAobmV0L2lwdjYvaXA2bXIuYykgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgdGFibGVzIG9uIGRlbWFuZCB3aGVuIHNvY2tldCBvcHRpb25zIGFyZSBjb25maWd1cmVkIGFuZCB0byBkZXN0cm95IHRoZW0gd2hlbiB0aGV5IGJlY29tZSB1bnJlZmVyZW5jZWQgb3IgZW1wdHkuXG5cbi0gTWVtb3J5IEFsbG9jYXRpb25zOiBOZXcgZHluYW1pYyBhbGxvY2F0aW9ucyAoc3VjaCBhcyBgc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29ya2AgYWxsb2NhdGVkIHZpYSBga21hbGxvY19vYmpgKSBoYXZlIGFsbCBtZW1iZXIgZmllbGRzIChgd29ya2AsIGBuZXRgLCBgaWRgKSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBUaGUgdW5kZXJseWluZyBtdWx0aWNhc3QgdGFibGVzIGFsbG9jYXRlZCB2aWEgYG1yX3RhYmxlX2FsbG9jKClgIHVzZSBga3phbGxvY19vYmooKWAuXG4tIERhdGEgc2VudCB0byB1c2VyIHNwYWNlOiBpb2N0bC9jb21wYXRfaW9jdGwgYW5kIGdldHNvY2tvcHQgaGFuZGxlcnMgb25seSBjb3B5IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgZmllbGRzIG9yIGRhdGEgY29waWVkIGZyb20gdXNlciBzcGFjZSBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBsZWF2aW5nIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciByZWFkaW5nIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS5cbi0gQ29udHJvbCBmbG93IGFuZCBMaWZldGltZXM6IENoYW5nZXMgYWZmZWN0IHRhYmxlIGxpZmVjeWNsZSwgUkNVIHN5bmNocm9uaXphdGlvbiwgbGlzdCBtYW5pcHVsYXRpb25zLCBhbmQgbG9ja2luZyAoUlROTC9tcnRfbG9jaykuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhlc2UgcGF0aHMgaW52b2x2ZSB1c2UtYWZ0ZXItZnJlZSwgY29uY3VycmVudCBhY2Nlc3MsIG9yIG1lbW9yeSBsZWFrcywgd2hpY2ggYXJlIGhhbmRsZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBLTUVNTEVBSy5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIGludHJvZHVjZWQsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyAoaXA2bXIpIHRhYmxlIGxpZmVjeWNsZSBhbmQgbG9ja2luZy4gSXQgYWRkcyBkeW5hbWljIHRhYmxlIGFsbG9jYXRpb24sIGFzeW5jaHJvbm91cyB0YWJsZSBkZXN0cnVjdGlvbiB2aWEgd29ya3F1ZXVlcywgYW5kIHVwZGF0ZXMgc2V0c29ja29wdCwgZ2V0c29ja29wdCwgaW9jdGwsIHRpbWVyIGV4cGlyYXRpb24sIGFuZCBuZXRkZXYgbm90aWZpZXIgaGFuZGxpbmcuIFRoZXNlIHBhdGhzIGFyZSBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHZpYSByYXcgSVB2NiBzb2NrZXRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNTIxYzBiMDJhNjgxNDIwMGIwZWViMjBhYWYxM2M1ZDg0ZTk4ZmU1YlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gU2VwIDYgMTU6MjE6NTYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2bXIuYyBiL25ldC9pcHY2L2lwNm1yLmNcbmluZGV4IDNmMmVkOWI3N2RlYjUuLjI2YmQyY2NkNDIwMWEgMTAwNjQ0XG4tLS0gYS9uZXQvaXB2Ni9pcDZtci5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvaXB2Ni9pcDZtci5jXG5AQCAtMjgsNiAmIzQzOzI4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb21wYXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JoYXNodGFibGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC93b3JrcXVldWUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9wcm90b2NvbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2tidWZmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NuZXQvcmF3LmhcdTAwM2VcbkBAIC0zNjgsNiAmIzQzOzM2OSwxMiBAQCBzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9nZXRfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXG4gXHRyZXR1cm4gbXJ0O1xuIH1cbiBcbiYjNDM7c3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbG9va3VwX3NrX3RhYmxlKHN0cnVjdCBzb2NrICpzaylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBfX2lwNm1yX2dldF90YWJsZShzb2NrX25ldChzayksXG4mIzQzO1x0XHRcdFx0IHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGludCBpcDZtcl9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLFxuIFx0XHRcdCAgY29uc3Qgdm9pZCAqcHRyKVxuIHtcbkBAIC00MTcsNiAmIzQzOzQyNCwxMjQgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0XHRcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpO1xuIH1cbiBcbiYjNDM7LyogdGFibGVfc2V0IGNhbGxiYWNrIHVzZWQgd2hpbGUgdGhlIG5ldyB0YWJsZSBpcyBzdGlsbCB1bnB1Ymxpc2hlZC4gKi9cbiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfdGFibGVfbm9fcHVibGlzaChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IG5ldCAqbmV0KVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBib29sICpuZXdfdGFibGUpXG4mIzQzO3tcbiYjNDM7XHR1MzIgaWQgPSByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQ7XG4mIzQzO1x0c3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spO1xuJiM0MztcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfUlROTCgpO1xuJiM0MztcdCpuZXdfdGFibGUgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0bXJ0ID0gX19pcDZtcl9nZXRfdGFibGUobmV0LCBpZCk7XG4mIzQzO1x0aWYgKG1ydClcbiYjNDM7XHRcdHJldHVybiBtcnQ7XG4mIzQzO1xuJiM0MztcdG1ydCA9IG1yX3RhYmxlX2FsbG9jKG5ldCwgaWQsIFx1MDAyNmlwNm1yX21yX3RhYmxlX29wcyxcbiYjNDM7XHRcdFx0ICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKTtcbiYjNDM7XHRpZiAoIUlTX0VSUihtcnQpKVxuJiM0MztcdFx0Km5ld190YWJsZSA9IHRydWU7XG4mIzQzO1x0cmV0dXJuIG1ydDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfcHVibGlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKG5ld190YWJsZSlcbiYjNDM7XHRcdGlwNm1yX25ld190YWJsZV9zZXQobXJ0LCByZWFkX3BuZXQoXHUwMDI2bXJ0LVx1MDAzZW5ldCkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuJiM0Mzt7XG4mIzQzO1x0QVNTRVJUX1JUTkwoKTtcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4mIzQzO1x0aWYgKG1ydC1cdTAwM2VpZCA9PSBSVDZfVEFCTEVfREZMVClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHQvKiBOZXN0ZWQgTkVUREVWX1VOUkVHSVNURVIgbWF5IGFscmVhZHkgaGF2ZSB1bmxpbmtlZCB0aGlzIHRhYmxlLiAqL1xuJiM0MztcdGlmIChfX2lwNm1yX2dldF90YWJsZShyZWFkX3BuZXQoXHUwMDI2bXJ0LVx1MDAzZW5ldCksIG1ydC1cdTAwM2VpZCkgIT0gbXJ0KVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC1cdTAwM2Vtcm91dGVfc2spIHx8XG4mIzQzO1x0ICAgIG1ydC1cdTAwM2VtYXh2aWYgfHxcbiYjNDM7XHQgICAgIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY19jYWNoZV9saXN0KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbiYjNDM7XHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpIHtcbiYjNDM7XHRcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0c3Bpbl91bmxvY2tfYmgoXHUwMDI2bWZjX3VucmVzX2xvY2spO1xuJiM0MztcbiYjNDM7XHRsaXN0X2RlbF9yY3UoXHUwMDI2bXJ0LVx1MDAzZWxpc3QpO1xuJiM0MztcdHRpbWVyX3NodXRkb3duX3N5bmMoXHUwMDI2bXJ0LVx1MDAzZWlwbXJfZXhwaXJlX3RpbWVyKTtcbiYjNDM7XHRtcl90YWJsZV9mcmVlKG1ydCk7XG4mIzQzOyNlbmRpZlxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xuJiM0MztzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrIHtcbiYjNDM7XHRzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yaztcbiYjNDM7XHRzdHJ1Y3QgbmV0ICpuZXQ7XG4mIzQzO1x0dTMyIGlkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfZGVzdHJveV93b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHcgPVxuJiM0MztcdFx0Y29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmssIHdvcmspO1xuJiM0MztcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuJiM0MztcbiYjNDM7XHRydG5sX2xvY2soKTtcbiYjNDM7XHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShkdy1cdTAwM2VuZXQsIGR3LVx1MDAzZWlkKTtcbiYjNDM7XHRpZiAobXJ0KVxuJiM0MztcdFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xuJiM0MztcdHJ0bmxfdW5sb2NrKCk7XG4mIzQzO1x0cHV0X25ldChkdy1cdTAwM2VuZXQpO1xuJiM0MztcdGtmcmVlKGR3KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveShzdHJ1Y3QgbXJfdGFibGUgKm1ydClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBuZXQgKm5ldCA9IHJlYWRfcG5ldChcdTAwMjZtcnQtXHUwMDNlbmV0KTtcbiYjNDM7XHRzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrICpkdztcbiYjNDM7XG4mIzQzO1x0aWYgKG1ydC1cdTAwM2VpZCA9PSBSVDZfVEFCTEVfREZMVClcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0ZHcgPSBrbWFsbG9jX29iaigqZHcsIEdGUF9BVE9NSUMpO1xuJiM0MztcdGlmICghZHcpIHtcbiYjNDM7XHRcdG1vZF90aW1lcihcdTAwMjZtcnQtXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgJiM0MzsgSFopO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIW1heWJlX2dldF9uZXQobmV0KSkge1xuJiM0MztcdFx0a2ZyZWUoZHcpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRJTklUX1dPUksoXHUwMDI2ZHctXHUwMDNld29yaywgaXA2bXJfZGVzdHJveV93b3JrZm4pO1xuJiM0MztcdGR3LVx1MDAzZW5ldCA9IG5ldDtcbiYjNDM7XHRkdy1cdTAwM2VpZCA9IG1ydC1cdTAwM2VpZDtcbiYjNDM7XHRxdWV1ZV93b3JrKHN5c3RlbV9kZmxfd3EsIFx1MDAyNmR3LVx1MDAzZXdvcmspO1xuJiM0Mzt9XG4mIzQzOyNlbHNlXG4mIzQzO3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpXG4mIzQzO3tcbiYjNDM7fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgaXA2bXJfZmluaXNoX25ld190YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgYm9vbCBuZXdfdGFibGUsXG4mIzQzO1x0XHRcdFx0ICBpbnQgZXJyKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKG5ld190YWJsZSBcdTAwMjZcdTAwMjYgZXJyKVxuJiM0MztcdFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgaXA2bXJfZnJlZV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcbiBcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRldl9raWxsX2xpc3QpXG4ge1xuQEAgLTg2NiwxNiAmIzQzOzk5MSwyNSBAQCBzdGF0aWMgdm9pZCBpcG1yX2RvX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuIHN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpXG4ge1xuIFx0c3RydWN0IG1yX3RhYmxlICptcnQgPSB0aW1lcl9jb250YWluZXJfb2YobXJ0LCB0LCBpcG1yX2V4cGlyZV90aW1lcik7XG4mIzQzO1x0Ym9vbCBlbXB0eSA9IGZhbHNlO1xuIFxuIFx0aWYgKCFzcGluX3RyeWxvY2soXHUwMDI2bWZjX3VucmVzX2xvY2spKSB7XG4gXHRcdG1vZF90aW1lcihcdTAwMjZtcnQtXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgJiM0MzsgMSk7XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcbi1cdGlmICghbGlzdF9lbXB0eShcdTAwMjZtcnQtXHUwMDNlbWZjX3VucmVzX3F1ZXVlKSlcbiYjNDM7XHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpIHtcbiBcdFx0aXBtcl9kb19leHBpcmVfcHJvY2VzcyhtcnQpO1xuJiM0MztcdFx0ZW1wdHkgPSBsaXN0X2VtcHR5KFx1MDAyNm1ydC1cdTAwM2VtZmNfdW5yZXNfcXVldWUpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHQvKiBSZXRyeSBhZnRlciBHRlBfQVRPTUlDIGFsbG9jYXRpb24gZmFpbHVyZS4gKi9cbiYjNDM7XHRcdGVtcHR5ID0gdHJ1ZTtcbiYjNDM7XHR9XG4gXG4gXHRzcGluX3VubG9jayhcdTAwMjZtZmNfdW5yZXNfbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmIChlbXB0eSlcbiYjNDM7XHRcdGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3kobXJ0KTtcbiB9XG4gXG4gLyogRmlsbCBvaWZzIGxpc3QuIEl0IGlzIGNhbGxlZCB1bmRlciBsb2NrZWQgbXJ0X2xvY2suICovXG5AQCAtMTI5MCwxOSAmIzQzOzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxuIHtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTtcbiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbiYjNDM7XHRzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgKm5leHQ7XG4mIzQzOyNlbHNlXG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiYjNDM7I2VuZGlmXG4gXHRzdHJ1Y3QgdmlmX2RldmljZSAqdjtcbiBcdGludCBjdDtcbiBcbiBcdGlmIChldmVudCAhPSBORVRERVZfVU5SRUdJU1RFUilcbiBcdFx0cmV0dXJuIE5PVElGWV9ET05FO1xuIFxuLVx0aXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpIHtcbiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCBcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tcjZfdGFibGVzLCBsaXN0KVxuJiM0MzsjZWxzZVxuJiM0MztcdGlwNm1yX2Zvcl9lYWNoX3RhYmxlKG1ydCwgbmV0KVxuJiM0MzsjZW5kaWZcbiYjNDM7XHR7XG4mIzQzO1x0XHRib29sIHZpZl9nb25lID0gZmFsc2U7XG4mIzQzO1xuIFx0XHR2ID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVswXTtcbiBcdFx0Zm9yIChjdCA9IDA7IGN0IFx1MDAzYyBtcnQtXHUwMDNlbWF4dmlmOyBjdCYjNDM7JiM0MzssIHYmIzQzOyYjNDM7KSB7XG4tXHRcdFx0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcih2LVx1MDAzZWRldikgPT0gZGV2KVxuJiM0MztcdFx0XHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXHUwMDNlZGV2KSA9PSBkZXYpIHtcbiBcdFx0XHRcdG1pZjZfZGVsZXRlKG1ydCwgY3QsIDEsIE5VTEwpO1xuJiM0MztcdFx0XHRcdHZpZl9nb25lID0gdHJ1ZTtcbiYjNDM7XHRcdFx0fVxuIFx0XHR9XG4mIzQzO1x0XHRpZiAodmlmX2dvbmUpXG4mIzQzO1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdH1cbiBcbiBcdHJldHVybiBOT1RJRllfRE9ORTtcbkBAIC0xNjE4LDEwICYjNDM7MTc2NywxMSBAQCBzdGF0aWMgdm9pZCBtcm91dGVfY2xlYW5fdGFibGVzKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBpbnQgZmxhZ3MsXG4gXG4gc3RhdGljIGludCBpcDZtcl9za19pbml0KHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBzdHJ1Y3Qgc29jayAqc2spXG4ge1xuLVx0aW50IGVyciA9IDA7XG4gXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4mIzQzO1x0aW50IGVyciA9IDA7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9SVE5MKCk7XG4gXG4tXHRydG5sX2xvY2soKTtcbiBcdHNwaW5fbG9jayhcdTAwMjZtcnRfbG9jayk7XG4gXHRpZiAocnRubF9kZXJlZmVyZW5jZShtcnQtXHUwMDNlbXJvdXRlX3NrKSkge1xuIFx0XHRlcnIgPSAtRUFERFJJTlVTRTtcbkBAIC0xNjM3LDggJiM0MzsxNzg3LDYgQEAgc3RhdGljIGludCBpcDZtcl9za19pbml0KHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBzdHJ1Y3Qgc29jayAqc2spXG4gXHRcdFx0XHRcdCAgICAgTkVUQ09ORkFfTUNfRk9SV0FSRElORyxcbiBcdFx0XHRcdFx0ICAgICBORVRDT05GQV9JRklOREVYX0FMTCxcbiBcdFx0XHRcdFx0ICAgICBuZXQtXHUwMDNlaXB2Ni5kZXZjb25mX2FsbCk7XG4tXHRydG5sX3VubG9jaygpO1xuLVxuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtMTY3Nyw2ICYjNDM7MTgyNSw3IEBAIGludCBpcDZtcl9za19kb25lKHN0cnVjdCBzb2NrICpzaylcbiBcdFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgTVJUNl9GTFVTSF9NSUZTIHwgTVJUNl9GTFVTSF9NRkMsXG4gXHRcdFx0XHRcdCAgICBcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiBcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbiBcdH1cbkBAIC0xNzIzLDI3ICYjNDM7MTg3Miw0NSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHQgICAgaW5ldF9zayhzayktXHUwMDNlaW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpXG4gXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4tXG4gXHRpZiAob3B0bmFtZSAhPSBNUlQ2X0lOSVQpIHtcbi1cdFx0aWYgKHNrICE9IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFuc19jYXBhYmxlKG5ldC1cdTAwM2V1c2VyX25zLCBDQVBfTkVUX0FETUlOKSlcbiYjNDM7XHRcdGJvb2wgaXNfbXJvdXRlX3NrID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdFx0cmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRcdGlmIChtcnQgXHUwMDI2XHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSlcbiYjNDM7XHRcdFx0aXNfbXJvdXRlX3NrID0gdHJ1ZTtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRcdGlmICghaXNfbXJvdXRlX3NrIFx1MDAyNlx1MDAyNiAhbnNfY2FwYWJsZShuZXQtXHUwMDNldXNlcl9ucywgQ0FQX05FVF9BRE1JTikpXG4gXHRcdFx0cmV0dXJuIC1FQUNDRVM7XG4gXHR9XG4gXG4gXHRzd2l0Y2ggKG9wdG5hbWUpIHtcbi1cdGNhc2UgTVJUNl9JTklUOlxuJiM0MztcdGNhc2UgTVJUNl9JTklUOiB7XG4mIzQzO1x0XHRib29sIG5ld190YWJsZSA9IGZhbHNlO1xuJiM0MztcbiBcdFx0aWYgKG9wdGxlbiBcdTAwM2Mgc2l6ZW9mKGludCkpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdHJldHVybiBpcDZtcl9za19pbml0KG1ydCwgc2spO1xuJiM0MztcdFx0cnRubF9sb2NrKCk7XG4mIzQzO1x0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKG1ydCkpIHtcbiYjNDM7XHRcdFx0cnRubF91bmxvY2soKTtcbiYjNDM7XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbiYjNDM7XHRcdHJldCA9IGlwNm1yX3NrX2luaXQobXJ0LCBzayk7XG4mIzQzO1x0XHRyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpO1xuJiM0MztcdFx0cnRubF91bmxvY2soKTtcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuIFxuIFx0Y2FzZSBNUlQ2X0RPTkU6XG4gXHRcdHJldHVybiBpcDZtcl9za19kb25lKHNrKTtcbiBcbi1cdGNhc2UgTVJUNl9BRERfTUlGOlxuJiM0MztcdGNhc2UgTVJUNl9BRERfTUlGOiB7XG4mIzQzO1x0XHRib29sIG5ld190YWJsZSA9IGZhbHNlO1xuJiM0MztcbiBcdFx0aWYgKG9wdGxlbiBcdTAwM2Mgc2l6ZW9mKHZpZikpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZ2aWYsIG9wdHZhbCwgc2l6ZW9mKHZpZikpKVxuQEAgLTE3NTEsMTAgJiM0MzsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHZpZi5taWY2Y19taWZpIFx1MDAzZT0gTUFYTUlGUylcbiBcdFx0XHRyZXR1cm4gLUVORklMRTtcbiBcdFx0cnRubF9sb2NrKCk7XG4mIzQzO1x0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKG1ydCkpIHtcbiYjNDM7XHRcdFx0cnRubF91bmxvY2soKTtcbiYjNDM7XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbiBcdFx0cmV0ID0gbWlmNl9hZGQobmV0LCBtcnQsIFx1MDAyNnZpZixcbiBcdFx0XHQgICAgICAgc2sgPT0gcnRubF9kZXJlZmVyZW5jZShtcnQtXHUwMDNlbXJvdXRlX3NrKSk7XG4mIzQzO1x0XHRyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpO1xuIFx0XHRydG5sX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdH1cbiBcbiBcdGNhc2UgTVJUNl9ERUxfTUlGOlxuIFx0XHRpZiAob3B0bGVuIFx1MDAzYyBzaXplb2YobWlmaV90KSlcbkBAIC0xNzYyLDcgJiM0MzsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFx1MDAyNm1pZmksIG9wdHZhbCwgc2l6ZW9mKG1pZmlfdCkpKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0XHRydG5sX2xvY2soKTtcbiYjNDM7XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4mIzQzO1x0XHRpZiAoIW1ydCkge1xuJiM0MztcdFx0XHRydG5sX3VubG9jaygpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdH1cbiBcdFx0cmV0ID0gbWlmNl9kZWxldGUobXJ0LCBtaWZpLCAwLCBOVUxMKTtcbiYjNDM7XHRcdGlmICghcmV0KVxuJiM0MztcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4gXG5AQCAtMTc4MywxNyAmIzQzOzE5NjUsMzkgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0XHRpZiAocGFyZW50ID09IDApXG4gXHRcdFx0cGFyZW50ID0gbWZjLm1mNmNjX3BhcmVudDtcbiBcbi1cdFx0bXV0ZXhfbG9jayhcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xuJiM0MztcdFx0cnRubF9sb2NrKCk7XG4mIzQzO1x0XHRpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpIHtcbiYjNDM7XHRcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRcdFx0aWYgKCFtcnQpIHtcbiYjNDM7XHRcdFx0XHRydG5sX3VubG9jaygpO1xuJiM0MztcdFx0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRib29sIG5ld190YWJsZSA9IGZhbHNlO1xuIFxuLVx0XHRpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpXG4tXHRcdFx0cmV0ID0gaXA2bXJfbWZjX2RlbGV0ZShtcnQsIFx1MDAyNm1mYywgcGFyZW50KTtcbi1cdFx0ZWxzZVxuJiM0MztcdFx0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4mIzQzO1x0XHRcdGlmIChJU19FUlIobXJ0KSkge1xuJiM0MztcdFx0XHRcdHJ0bmxfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpcDZtcl9wdWJsaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSk7XG4mIzQzO1x0XHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbiBcdFx0XHRyZXQgPSBpcDZtcl9tZmNfYWRkKG5ldCwgbXJ0LCBcdTAwMjZtZmMsXG4gXHRcdFx0XHRcdCAgICBzayA9PVxuIFx0XHRcdFx0XHQgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spLFxuIFx0XHRcdFx0XHQgICAgcGFyZW50KTtcbiYjNDM7XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1mY19tdXRleCk7XG4mIzQzO1x0XHRcdHJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7XG4mIzQzO1x0XHRcdHJ0bmxfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHR9XG4gXG4mIzQzO1x0XHRtdXRleF9sb2NrKFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1mY19tdXRleCk7XG4mIzQzO1x0XHRyZXQgPSBpcDZtcl9tZmNfZGVsZXRlKG1ydCwgXHUwMDI2bWZjLCBwYXJlbnQpO1xuIFx0XHRtdXRleF91bmxvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbiYjNDM7XHRcdGlmICghcmV0KVxuJiM0MztcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4mIzQzO1x0XHRydG5sX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gcmV0O1xuIFxuIFx0Y2FzZSBNUlQ2X0ZMVVNIOlxuQEAgLTE4MDcsOCAmIzQzOzIwMTEsMTQgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFxuIFx0XHRydG5sX2xvY2soKTtcbiYjNDM7XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4mIzQzO1x0XHRpZiAoIW1ydCkge1xuJiM0MztcdFx0XHRydG5sX3VubG9jaygpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdH1cbiBcdFx0bXJvdXRlX2NsZWFuX3RhYmxlcyhtcnQsIGZsYWdzLCBcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiBcdFx0dW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueShcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiYjNDM7XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0cnRubF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG5AQCAtMTgyNCw3ICYjNDM7MjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZ2LCBvcHR2YWwsIHNpemVvZih2KSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1x0XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0XHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xuJiM0MztcdFx0aWYgKCFtcnQpIHtcbiYjNDM7XHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdFx0fVxuIFx0XHRXUklURV9PTkNFKG1ydC1cdTAwM2Vtcm91dGVfZG9fYXNzZXJ0LCB2KTtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbkBAIC0xODQyLDYgJiM0MzsyMDU5LDExIEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0ZG9fd3JtaWZ3aG9sZSA9ICh2ID09IE1SVDZNU0dfV1JNSUZXSE9MRSk7XG4gXHRcdHYgPSAhIXY7XG4gXHRcdHJ0bmxfbG9jaygpO1xuJiM0MztcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRcdGlmICghbXJ0KSB7XG4mIzQzO1x0XHRcdHJ0bmxfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdFx0fVxuIFx0XHRyZXQgPSAwO1xuIFx0XHRpZiAodiAhPSBtcnQtXHUwMDNlbXJvdXRlX2RvX3BpbSkge1xuIFx0XHRcdFdSSVRFX09OQ0UobXJ0LVx1MDAzZW1yb3V0ZV9kb19waW0sIHYpO1xuQEAgLTE4NjUsMTggJiM0MzsyMDg3LDE2IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0LyogXCYjMzQ7cGltNnJlZyV1XCYjMzQ7IHNob3VsZCBub3QgZXhjZWVkIDE2IGJ5dGVzIChJRk5BTVNJWikgKi9cbiBcdFx0aWYgKHYgIT0gUlRfVEFCTEVfREVGQVVMVCBcdTAwMjZcdTAwMjYgdiBcdTAwM2U9IDEwMDAwMDAwMClcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0aWYgKHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSlcbiYjNDM7XHRcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4mIzQzO1x0XHRpZiAobXJ0IFx1MDAyNlx1MDAyNiBzayA9PSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LVx1MDAzZW1yb3V0ZV9zaykpIHtcbiYjNDM7XHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFxuLVx0XHRydG5sX2xvY2soKTtcbi1cdFx0cmV0ID0gMDtcbi1cdFx0bXJ0ID0gaXA2bXJfbmV3X3RhYmxlKG5ldCwgdik7XG4tXHRcdGlmIChJU19FUlIobXJ0KSlcbi1cdFx0XHRyZXQgPSBQVFJfRVJSKG1ydCk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRyYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA9IHY7XG4tXHRcdHJ0bmxfdW5sb2NrKCk7XG4tXHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHRyYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA9IHY7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcdH1cbiAjZW5kaWZcbiBcdC8qXG5AQCAtMTg5NywxNiAmIzQzOzIxMTcsMTggQEAgaW50IGlwNl9tcm91dGVfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIHtcbiBcdGludCBvbHI7XG4gXHRpbnQgdmFsO1xuLVx0c3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spO1xuIFx0c3RydWN0IG1yX3RhYmxlICptcnQ7XG4gXG4gXHRpZiAoc2stXHUwMDNlc2tfdHlwZSAhPSBTT0NLX1JBVyB8fFxuIFx0ICAgIGluZXRfc2soc2spLVx1MDAzZWluZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KVxuIFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gXG4tXHRtcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xuLVx0aWYgKCFtcnQpXG4mIzQzO1x0cmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4mIzQzO1x0aWYgKCFtcnQpIHtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4gXG4gXHRzd2l0Y2ggKG9wdG5hbWUpIHtcbiBcdGNhc2UgTVJUNl9WRVJTSU9OOlxuQEAgLTE5MjEsOCAmIzQzOzIxNDMsMTAgQEAgaW50IGlwNl9tcm91dGVfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0XHR2YWwgPSBSRUFEX09OQ0UobXJ0LVx1MDAzZW1yb3V0ZV9kb19hc3NlcnQpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9QUk9UT09QVDtcbiBcdH1cbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiBcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZvbHIsIG9wdGxlbiwgc2l6ZW9mKGludCkpKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbkBAIC0xOTQ3LDIwICYjNDM7MjE3MSwyMyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXG4gXHRzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqdnI7XG4gXHRzdHJ1Y3QgdmlmX2RldmljZSAqdmlmO1xuIFx0c3RydWN0IG1mYzZfY2FjaGUgKmM7XG4tXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRpZiAoIW1ydCkge1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdH1cbiBcbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHR2ciA9IChzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqKWFyZztcbi1cdFx0aWYgKHZyLVx1MDAzZW1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKVxuJiM0MztcdFx0aWYgKHZyLVx1MDAzZW1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKSB7XG4mIzQzO1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0fVxuIFx0XHR2ci1cdTAwM2VtaWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLVx1MDAzZW1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdHZpZiA9IFx1MDAyNm1ydC1cdTAwM2V2aWZfdGFibGVbdnItXHUwMDNlbWlmaV07XG4gXHRcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnItXHUwMDNlbWlmaSkpIHtcbiBcdFx0XHR2ci1cdTAwM2VpY291bnQgPSBSRUFEX09OQ0UodmlmLVx1MDAzZXBrdF9pbik7XG5AQCAtMTk3NCw4ICYjNDM7MjIwMSw2IEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZylcbiBcdFx0cmV0dXJuIC1FQUREUk5PVEFWQUlMO1xuIFx0Y2FzZSBTSU9DR0VUU0dDTlRfSU42OlxuIFx0XHRzciA9IChzdHJ1Y3Qgc2lvY19zZ19yZXE2ICopYXJnO1xuLVxuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdGMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgXHUwMDI2c3ItXHUwMDNlc3JjLnNpbjZfYWRkcixcbiBcdFx0XHRcdCAgICAgXHUwMDI2c3ItXHUwMDNlZ3JwLnNpbjZfYWRkcik7XG4gXHRcdGlmIChjKSB7XG5AQCAtMTk4OCw2ICYjNDM7MjIxMyw3IEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZylcbiBcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAtRUFERFJOT1RBVkFJTDtcbiBcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbiBcdH1cbiB9XG5AQCAtMjAxNSwyMSAmIzQzOzIyNDEsMjMgQEAgaW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpXG4gXHRzdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYgdnI7XG4gXHRzdHJ1Y3QgdmlmX2RldmljZSAqdmlmO1xuIFx0c3RydWN0IG1mYzZfY2FjaGUgKmM7XG4tXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbi1cdFx0cmV0dXJuIC1FTk9FTlQ7XG4tXG4gXHRzd2l0Y2ggKGNtZCkge1xuIFx0Y2FzZSBTSU9DR0VUTUlGQ05UX0lONjpcbiBcdFx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNnZyLCBhcmcsIHNpemVvZih2cikpKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuLVx0XHRpZiAodnIubWlmaSBcdTAwM2U9IG1ydC1cdTAwM2VtYXh2aWYpXG4mIzQzO1x0XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0XHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xuJiM0MztcdFx0aWYgKCFtcnQpIHtcbiYjNDM7XHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHZyLm1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKSB7XG4mIzQzO1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0fVxuIFx0XHR2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdHZpZiA9IFx1MDAyNm1ydC1cdTAwM2V2aWZfdGFibGVbdnIubWlmaV07XG4gXHRcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnIubWlmaSkpIHtcbiBcdFx0XHR2ci5pY291bnQgPSBSRUFEX09OQ0UodmlmLVx1MDAzZXBrdF9pbik7XG5AQCAtMjA0OSw2ICYjNDM7MjI3NywxMSBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbiBcdFx0cmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbiYjNDM7XHRcdGlmICghbXJ0KSB7XG4mIzQzO1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdH1cbiBcdFx0YyA9IGlwNm1yX2NhY2hlX2ZpbmQobXJ0LCBcdTAwMjZzci5zcmMuc2luNl9hZGRyLCBcdTAwMjZzci5ncnAuc2luNl9hZGRyKTtcbiBcdFx0aWYgKGMpIHtcbiBcdFx0XHRzci5wa3RjbnQgPSBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNmMtXHUwMDNlX2MubWZjX3VuLnJlcy5wa3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIxPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lQVjYmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEUmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aXA2X21yb3V0ZV9zZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O2lwNl9tcm91dGVfZ2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtpcDZtcl9pb2N0bCYjMzQ7LAogICAgJiMzNDtpcDZtcl9jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7aXA2bXJfc2tfZG9uZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUmIzM0OywKICAgICYjMzQ7aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXN0cm95X3dvcmtmbiYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXZpY2VfZXZlbnQmIzM0OywKICAgICYjMzQ7aXBtcl9leHBpcmVfcHJvY2VzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyAoaXA2bXIpIHRhYmxlIGxpZmVjeWNsZSBhbmQgbG9ja2luZy4gSXQgYWRkcyBkeW5hbWljIHRhYmxlIGFsbG9jYXRpb24sIGFzeW5jaHJvbm91cyB0YWJsZSBkZXN0cnVjdGlvbiB2aWEgd29ya3F1ZXVlcywgYW5kIHVwZGF0ZXMgc2V0c29ja29wdCwgZ2V0c29ja29wdCwgaW9jdGwsIHRpbWVyIGV4cGlyYXRpb24sIGFuZCBuZXRkZXYgbm90aWZpZXIgaGFuZGxpbmcuIFRoZXNlIHBhdGhzIGFyZSBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHZpYSByYXcgSVB2NiBzb2NrZXRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNTIxYzBiMDJhNjgxNDIwMGIwZWViMjBhYWYxM2M1ZDg0ZTk4ZmU1YgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gU2VwIDYgMTU6MjE6NTYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZtci5jIGIvbmV0L2lwdjYvaXA2bXIuYwppbmRleCAzZjJlZDliNzdkZWI1Li4yNmJkMmNjZDQyMDFhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZtci5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9pcHY2L2lwNm1yLmMKQEAgLTI4LDYgJiM0MzsyOCw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvaW5pdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2NvbXBhdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3JoYXNodGFibGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvd29ya3F1ZXVlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L3Byb3RvY29sLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc2tidWZmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L3Jhdy5oJmd0OwpAQCAtMzY4LDYgJiM0MzszNjksMTIgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKQogCXJldHVybiBtcnQ7CiB9CiAKJiM0MztzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9sb29rdXBfc2tfdGFibGUoc3RydWN0IHNvY2sgKnNrKQomIzQzO3sKJiM0MzsJcmV0dXJuIF9faXA2bXJfZ2V0X3RhYmxlKHNvY2tfbmV0KHNrKSwKJiM0MzsJCQkJIHJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgaXA2bXJfaGFzaF9jbXAoc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgKmFyZywKIAkJCSAgY29uc3Qgdm9pZCAqcHRyKQogewpAQCAtNDE3LDYgJiM0Mzs0MjQsMTI0IEBAIHN0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX25ld190YWJsZShzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBpZCkKIAkJCSAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpOwogfQogCiYjNDM7LyogdGFibGVfc2V0IGNhbGxiYWNrIHVzZWQgd2hpbGUgdGhlIG5ldyB0YWJsZSBpcyBzdGlsbCB1bnB1Ymxpc2hlZC4gKi8KJiM0MztzdGF0aWMgdm9pZCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBzdHJ1Y3QgbmV0ICpuZXQpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc3RydWN0IHNvY2sgKnNrLAomIzQzOwkJCQkJCSAgICBib29sICpuZXdfdGFibGUpCiYjNDM7ewomIzQzOwl1MzIgaWQgPSByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUOwomIzQzOwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiYjNDM7CXN0cnVjdCBtcl90YWJsZSAqbXJ0OwomIzQzOwomIzQzOwlBU1NFUlRfUlROTCgpOwomIzQzOwkqbmV3X3RhYmxlID0gZmFsc2U7CiYjNDM7CiYjNDM7CW1ydCA9IF9faXA2bXJfZ2V0X3RhYmxlKG5ldCwgaWQpOwomIzQzOwlpZiAobXJ0KQomIzQzOwkJcmV0dXJuIG1ydDsKJiM0MzsKJiM0MzsJbXJ0ID0gbXJfdGFibGVfYWxsb2MobmV0LCBpZCwgJmFtcDtpcDZtcl9tcl90YWJsZV9vcHMsCiYjNDM7CQkJICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKTsKJiM0MzsJaWYgKCFJU19FUlIobXJ0KSkKJiM0MzsJCSpuZXdfdGFibGUgPSB0cnVlOwomIzQzOwlyZXR1cm4gbXJ0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBpcDZtcl9wdWJsaXNoX25ld190YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgYm9vbCBuZXdfdGFibGUpCiYjNDM7ewomIzQzOwlpZiAobmV3X3RhYmxlKQomIzQzOwkJaXA2bXJfbmV3X3RhYmxlX3NldChtcnQsIHJlYWRfcG5ldCgmYW1wO21ydC0mZ3Q7bmV0KSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQpCiYjNDM7ewomIzQzOwlBU1NFUlRfUlROTCgpOwomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTCiYjNDM7CWlmIChtcnQtJmd0O2lkID09IFJUNl9UQUJMRV9ERkxUKQomIzQzOwkJcmV0dXJuOwomIzQzOwkvKiBOZXN0ZWQgTkVUREVWX1VOUkVHSVNURVIgbWF5IGFscmVhZHkgaGF2ZSB1bmxpbmtlZCB0aGlzIHRhYmxlLiAqLwomIzQzOwlpZiAoX19pcDZtcl9nZXRfdGFibGUocmVhZF9wbmV0KCZhbXA7bXJ0LSZndDtuZXQpLCBtcnQtJmd0O2lkKSAhPSBtcnQpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC0mZ3Q7bXJvdXRlX3NrKSB8fAomIzQzOwkgICAgbXJ0LSZndDttYXh2aWYgfHwKJiM0MzsJICAgICFsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfY2FjaGVfbGlzdCkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXNwaW5fbG9ja19iaCgmYW1wO21mY191bnJlc19sb2NrKTsKJiM0MzsJaWYgKCFsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfdW5yZXNfcXVldWUpKSB7CiYjNDM7CQlzcGluX3VubG9ja19iaCgmYW1wO21mY191bnJlc19sb2NrKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlzcGluX3VubG9ja19iaCgmYW1wO21mY191bnJlc19sb2NrKTsKJiM0MzsKJiM0MzsJbGlzdF9kZWxfcmN1KCZhbXA7bXJ0LSZndDtsaXN0KTsKJiM0MzsJdGltZXJfc2h1dGRvd25fc3luYygmYW1wO21ydC0mZ3Q7aXBtcl9leHBpcmVfdGltZXIpOwomIzQzOwltcl90YWJsZV9mcmVlKG1ydCk7CiYjNDM7I2VuZGlmCiYjNDM7fQomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTCiYjNDM7c3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7CiYjNDM7CXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwomIzQzOwlzdHJ1Y3QgbmV0ICpuZXQ7CiYjNDM7CXUzMiBpZDsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmsgKmR3ID0KJiM0MzsJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrLCB3b3JrKTsKJiM0MzsJc3RydWN0IG1yX3RhYmxlICptcnQ7CiYjNDM7CiYjNDM7CXJ0bmxfbG9jaygpOwomIzQzOwltcnQgPSBfX2lwNm1yX2dldF90YWJsZShkdy0mZ3Q7bmV0LCBkdy0mZ3Q7aWQpOwomIzQzOwlpZiAobXJ0KQomIzQzOwkJaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpOwomIzQzOwlydG5sX3VubG9jaygpOwomIzQzOwlwdXRfbmV0KGR3LSZndDtuZXQpOwomIzQzOwlrZnJlZShkdyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbmV0ICpuZXQgPSByZWFkX3BuZXQoJmFtcDttcnQtJmd0O25ldCk7CiYjNDM7CXN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmsgKmR3OwomIzQzOwomIzQzOwlpZiAobXJ0LSZndDtpZCA9PSBSVDZfVEFCTEVfREZMVCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZHcgPSBrbWFsbG9jX29iaigqZHcsIEdGUF9BVE9NSUMpOwomIzQzOwlpZiAoIWR3KSB7CiYjNDM7CQltb2RfdGltZXIoJmFtcDttcnQtJmd0O2lwbXJfZXhwaXJlX3RpbWVyLCBqaWZmaWVzICYjNDM7IEhaKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlpZiAoIW1heWJlX2dldF9uZXQobmV0KSkgewomIzQzOwkJa2ZyZWUoZHcpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CUlOSVRfV09SSygmYW1wO2R3LSZndDt3b3JrLCBpcDZtcl9kZXN0cm95X3dvcmtmbik7CiYjNDM7CWR3LSZndDtuZXQgPSBuZXQ7CiYjNDM7CWR3LSZndDtpZCA9IG1ydC0mZ3Q7aWQ7CiYjNDM7CXF1ZXVlX3dvcmsoc3lzdGVtX2RmbF93cSwgJmFtcDtkdy0mZ3Q7d29yayk7CiYjNDM7fQomIzQzOyNlbHNlCiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveShzdHJ1Y3QgbXJfdGFibGUgKm1ydCkKJiM0Mzt7CiYjNDM7fQomIzQzOyNlbmRpZgomIzQzOwomIzQzO3N0YXRpYyBpbnQgaXA2bXJfZmluaXNoX25ld190YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgYm9vbCBuZXdfdGFibGUsCiYjNDM7CQkJCSAgaW50IGVycikKJiM0Mzt7CiYjNDM7CWlmIChuZXdfdGFibGUgJmFtcDsmYW1wOyBlcnIpCiYjNDM7CQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgaXA2bXJfZnJlZV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwKIAkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqZGV2X2tpbGxfbGlzdCkKIHsKQEAgLTg2NiwxNiAmIzQzOzk5MSwyNSBAQCBzdGF0aWMgdm9pZCBpcG1yX2RvX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCBtcl90YWJsZSAqbXJ0KQogc3RhdGljIHZvaWQgaXBtcl9leHBpcmVfcHJvY2VzcyhzdHJ1Y3QgdGltZXJfbGlzdCAqdCkKIHsKIAlzdHJ1Y3QgbXJfdGFibGUgKm1ydCA9IHRpbWVyX2NvbnRhaW5lcl9vZihtcnQsIHQsIGlwbXJfZXhwaXJlX3RpbWVyKTsKJiM0MzsJYm9vbCBlbXB0eSA9IGZhbHNlOwogCiAJaWYgKCFzcGluX3RyeWxvY2soJmFtcDttZmNfdW5yZXNfbG9jaykpIHsKIAkJbW9kX3RpbWVyKCZhbXA7bXJ0LSZndDtpcG1yX2V4cGlyZV90aW1lciwgamlmZmllcyAmIzQzOyAxKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICghbGlzdF9lbXB0eSgmYW1wO21ydC0mZ3Q7bWZjX3VucmVzX3F1ZXVlKSkKJiM0MzsJaWYgKCFsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfdW5yZXNfcXVldWUpKSB7CiAJCWlwbXJfZG9fZXhwaXJlX3Byb2Nlc3MobXJ0KTsKJiM0MzsJCWVtcHR5ID0gbGlzdF9lbXB0eSgmYW1wO21ydC0mZ3Q7bWZjX3VucmVzX3F1ZXVlKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCS8qIFJldHJ5IGFmdGVyIEdGUF9BVE9NSUMgYWxsb2NhdGlvbiBmYWlsdXJlLiAqLwomIzQzOwkJZW1wdHkgPSB0cnVlOwomIzQzOwl9CiAKIAlzcGluX3VubG9jaygmYW1wO21mY191bnJlc19sb2NrKTsKJiM0MzsKJiM0MzsJaWYgKGVtcHR5KQomIzQzOwkJaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveShtcnQpOwogfQogCiAvKiBGaWxsIG9pZnMgbGlzdC4gSXQgaXMgY2FsbGVkIHVuZGVyIGxvY2tlZCBtcnRfbG9jay4gKi8KQEAgLTEyOTAsMTkgJiM0MzsxNDI0LDM0IEBAIHN0YXRpYyBpbnQgaXA2bXJfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmV0ZGV2X25vdGlmaWVyX2luZm9fdG9fZGV2KHB0cik7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwomIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTCiYjNDM7CXN0cnVjdCBtcl90YWJsZSAqbXJ0LCAqbmV4dDsKJiM0MzsjZWxzZQogCXN0cnVjdCBtcl90YWJsZSAqbXJ0OwomIzQzOyNlbmRpZgogCXN0cnVjdCB2aWZfZGV2aWNlICp2OwogCWludCBjdDsKIAogCWlmIChldmVudCAhPSBORVRERVZfVU5SRUdJU1RFUikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCi0JaXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpIHsKJiM0MzsjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFUwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCAmYW1wO25ldC0mZ3Q7aXB2Ni5tcjZfdGFibGVzLCBsaXN0KQomIzQzOyNlbHNlCiYjNDM7CWlwNm1yX2Zvcl9lYWNoX3RhYmxlKG1ydCwgbmV0KQomIzQzOyNlbmRpZgomIzQzOwl7CiYjNDM7CQlib29sIHZpZl9nb25lID0gZmFsc2U7CiYjNDM7CiAJCXYgPSAmYW1wO21ydC0mZ3Q7dmlmX3RhYmxlWzBdOwogCQlmb3IgKGN0ID0gMDsgY3QgJmx0OyBtcnQtJmd0O21heHZpZjsgY3QmIzQzOyYjNDM7LCB2JiM0MzsmIzQzOykgewotCQkJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcih2LSZndDtkZXYpID09IGRldikKJiM0MzsJCQlpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtJmd0O2RldikgPT0gZGV2KSB7CiAJCQkJbWlmNl9kZWxldGUobXJ0LCBjdCwgMSwgTlVMTCk7CiYjNDM7CQkJCXZpZl9nb25lID0gdHJ1ZTsKJiM0MzsJCQl9CiAJCX0KJiM0MzsJCWlmICh2aWZfZ29uZSkKJiM0MzsJCQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiAJfQogCiAJcmV0dXJuIE5PVElGWV9ET05FOwpAQCAtMTYxOCwxMCAmIzQzOzE3NjcsMTEgQEAgc3RhdGljIHZvaWQgbXJvdXRlX2NsZWFuX3RhYmxlcyhzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgaW50IGZsYWdzLAogCiBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaykKIHsKLQlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiYjNDM7CWludCBlcnIgPSAwOwomIzQzOwomIzQzOwlBU1NFUlRfUlROTCgpOwogCi0JcnRubF9sb2NrKCk7CiAJc3Bpbl9sb2NrKCZhbXA7bXJ0X2xvY2spOwogCWlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC0mZ3Q7bXJvdXRlX3NrKSkgewogCQllcnIgPSAtRUFERFJJTlVTRTsKQEAgLTE2MzcsOCAmIzQzOzE3ODcsNiBAQCBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaykKIAkJCQkJICAgICBORVRDT05GQV9NQ19GT1JXQVJESU5HLAogCQkJCQkgICAgIE5FVENPTkZBX0lGSU5ERVhfQUxMLAogCQkJCQkgICAgIG5ldC0mZ3Q7aXB2Ni5kZXZjb25mX2FsbCk7Ci0JcnRubF91bmxvY2soKTsKLQogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE2NzcsNiAmIzQzOzE4MjUsNyBAQCBpbnQgaXA2bXJfc2tfZG9uZShzdHJ1Y3Qgc29jayAqc2spCiAJCQltcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgTVJUNl9GTFVTSF9NSUZTIHwgTVJUNl9GTFVTSF9NRkMsCiAJCQkJCSAgICAmYW1wO2Rldl9raWxsX2xpc3QpOwogCQkJZXJyID0gMDsKJiM0MzsJCQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE3MjMsMjcgJiM0MzsxODcyLDQ1IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkgICAgaW5ldF9zayhzayktJmd0O2luZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAoIW1ydCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KIAlpZiAob3B0bmFtZSAhPSBNUlQ2X0lOSVQpIHsKLQkJaWYgKHNrICE9IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zaykgJmFtcDsmYW1wOwotCQkgICAgIW5zX2NhcGFibGUobmV0LSZndDt1c2VyX25zLCBDQVBfTkVUX0FETUlOKSkKJiM0MzsJCWJvb2wgaXNfbXJvdXRlX3NrID0gZmFsc2U7CiYjNDM7CiYjNDM7CQlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKG1ydCAmYW1wOyZhbXA7IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zaykpCiYjNDM7CQkJaXNfbXJvdXRlX3NrID0gdHJ1ZTsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwomIzQzOwkJaWYgKCFpc19tcm91dGVfc2sgJmFtcDsmYW1wOyAhbnNfY2FwYWJsZShuZXQtJmd0O3VzZXJfbnMsIENBUF9ORVRfQURNSU4pKQogCQkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCiAJc3dpdGNoIChvcHRuYW1lKSB7Ci0JY2FzZSBNUlQ2X0lOSVQ6CiYjNDM7CWNhc2UgTVJUNl9JTklUOiB7CiYjNDM7CQlib29sIG5ld190YWJsZSA9IGZhbHNlOwomIzQzOwogCQlpZiAob3B0bGVuICZsdDsgc2l6ZW9mKGludCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlyZXR1cm4gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTsKJiM0MzsJCXJ0bmxfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlKHNrLCAmYW1wO25ld190YWJsZSk7CiYjNDM7CQlpZiAoSVNfRVJSKG1ydCkpIHsKJiM0MzsJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCXJldHVybiBQVFJfRVJSKG1ydCk7CiYjNDM7CQl9CiYjNDM7CQlpcDZtcl9wdWJsaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSk7CiYjNDM7CQlyZXQgPSBpcDZtcl9za19pbml0KG1ydCwgc2spOwomIzQzOwkJcmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTsKJiM0MzsJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwl9CiAKIAljYXNlIE1SVDZfRE9ORToKIAkJcmV0dXJuIGlwNm1yX3NrX2RvbmUoc2spOwogCi0JY2FzZSBNUlQ2X0FERF9NSUY6CiYjNDM7CWNhc2UgTVJUNl9BRERfTUlGOiB7CiYjNDM7CQlib29sIG5ld190YWJsZSA9IGZhbHNlOwomIzQzOwogCQlpZiAob3B0bGVuICZsdDsgc2l6ZW9mKHZpZikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGNvcHlfZnJvbV9zb2NrcHRyKCZhbXA7dmlmLCBvcHR2YWwsIHNpemVvZih2aWYpKSkKQEAgLTE3NTEsMTAgJiM0MzsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJaWYgKHZpZi5taWY2Y19taWZpICZndDs9IE1BWE1JRlMpCiAJCQlyZXR1cm4gLUVORklMRTsKIAkJcnRubF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssICZhbXA7bmV3X3RhYmxlKTsKJiM0MzsJCWlmIChJU19FUlIobXJ0KSkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIFBUUl9FUlIobXJ0KTsKJiM0MzsJCX0KJiM0MzsJCWlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTsKIAkJcmV0ID0gbWlmNl9hZGQobmV0LCBtcnQsICZhbXA7dmlmLAogCQkJICAgICAgIHNrID09IHJ0bmxfZGVyZWZlcmVuY2UobXJ0LSZndDttcm91dGVfc2spKTsKJiM0MzsJCXJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7CiAJCXJ0bmxfdW5sb2NrKCk7CiAJCXJldHVybiByZXQ7CiYjNDM7CX0KIAogCWNhc2UgTVJUNl9ERUxfTUlGOgogCQlpZiAob3B0bGVuICZsdDsgc2l6ZW9mKG1pZmlfdCkpCkBAIC0xNzYyLDcgJiM0MzsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJaWYgKGNvcHlfZnJvbV9zb2NrcHRyKCZhbXA7bWlmaSwgb3B0dmFsLCBzaXplb2YobWlmaV90KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcnRubF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKCFtcnQpIHsKJiM0MzsJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQogCQlyZXQgPSBtaWY2X2RlbGV0ZShtcnQsIG1pZmksIDAsIE5VTEwpOwomIzQzOwkJaWYgKCFyZXQpCiYjNDM7CQkJaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpOwogCQlydG5sX3VubG9jaygpOwogCQlyZXR1cm4gcmV0OwogCkBAIC0xNzgzLDE3ICYjNDM7MTk2NSwzOSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCWlmIChwYXJlbnQgPT0gMCkKIAkJCXBhcmVudCA9IG1mYy5tZjZjY19wYXJlbnQ7CiAKLQkJbXV0ZXhfbG9jaygmYW1wO25ldC0mZ3Q7aXB2Ni5tZmNfbXV0ZXgpOwomIzQzOwkJcnRubF9sb2NrKCk7CiYjNDM7CQlpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpIHsKJiM0MzsJCQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJCWlmICghbXJ0KSB7CiYjNDM7CQkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJYm9vbCBuZXdfdGFibGUgPSBmYWxzZTsKIAotCQlpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpCi0JCQlyZXQgPSBpcDZtcl9tZmNfZGVsZXRlKG1ydCwgJmFtcDttZmMsIHBhcmVudCk7Ci0JCWVsc2UKJiM0MzsJCQltcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssICZhbXA7bmV3X3RhYmxlKTsKJiM0MzsJCQlpZiAoSVNfRVJSKG1ydCkpIHsKJiM0MzsJCQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQkJcmV0dXJuIFBUUl9FUlIobXJ0KTsKJiM0MzsJCQl9CiYjNDM7CQkJaXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpOwomIzQzOwkJCW11dGV4X2xvY2soJmFtcDtuZXQtJmd0O2lwdjYubWZjX211dGV4KTsKIAkJCXJldCA9IGlwNm1yX21mY19hZGQobmV0LCBtcnQsICZhbXA7bWZjLAogCQkJCQkgICAgc2sgPT0KIAkJCQkJICAgIHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zayksCiAJCQkJCSAgICBwYXJlbnQpOwomIzQzOwkJCW11dGV4X3VubG9jaygmYW1wO25ldC0mZ3Q7aXB2Ni5tZmNfbXV0ZXgpOwomIzQzOwkJCXJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7CiYjNDM7CQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQogCiYjNDM7CQltdXRleF9sb2NrKCZhbXA7bmV0LSZndDtpcHY2Lm1mY19tdXRleCk7CiYjNDM7CQlyZXQgPSBpcDZtcl9tZmNfZGVsZXRlKG1ydCwgJmFtcDttZmMsIHBhcmVudCk7CiAJCW11dGV4X3VubG9jaygmYW1wO25ldC0mZ3Q7aXB2Ni5tZmNfbXV0ZXgpOwomIzQzOwkJaWYgKCFyZXQpCiYjNDM7CQkJaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpOwomIzQzOwkJcnRubF91bmxvY2soKTsKIAkJcmV0dXJuIHJldDsKIAogCWNhc2UgTVJUNl9GTFVTSDoKQEAgLTE4MDcsOCAmIzQzOzIwMTEsMTQgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJcnRubF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKCFtcnQpIHsKJiM0MzsJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQogCQltcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgZmxhZ3MsICZhbXA7ZGV2X2tpbGxfbGlzdCk7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX21hbnkoJmFtcDtkZXZfa2lsbF9saXN0KTsKJiM0MzsJCWlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTsKIAkJcnRubF91bmxvY2soKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTgyNCw3ICYjNDM7MjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGNvcHlfZnJvbV9zb2NrcHRyKCZhbXA7diwgb3B0dmFsLCBzaXplb2YodikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CQlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKCFtcnQpIHsKJiM0MzsJCQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJCX0KIAkJV1JJVEVfT05DRShtcnQtJmd0O21yb3V0ZV9kb19hc3NlcnQsIHYpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTg0Miw2ICYjNDM7MjA1OSwxMSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCWRvX3dybWlmd2hvbGUgPSAodiA9PSBNUlQ2TVNHX1dSTUlGV0hPTEUpOwogCQl2ID0gISF2OwogCQlydG5sX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiAJCXJldCA9IDA7CiAJCWlmICh2ICE9IG1ydC0mZ3Q7bXJvdXRlX2RvX3BpbSkgewogCQkJV1JJVEVfT05DRShtcnQtJmd0O21yb3V0ZV9kb19waW0sIHYpOwpAQCAtMTg2NSwxOCAmIzQzOzIwODcsMTYgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQkvKiAmIzM0O3BpbTZyZWcldSYjMzQ7IHNob3VsZCBub3QgZXhjZWVkIDE2IGJ5dGVzIChJRk5BTVNJWikgKi8KIAkJaWYgKHYgIT0gUlRfVEFCTEVfREVGQVVMVCAmYW1wOyZhbXA7IHYgJmd0Oz0gMTAwMDAwMDAwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChzayA9PSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LSZndDttcm91dGVfc2spKQomIzQzOwkJcmN1X3JlYWRfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJCWlmIChtcnQgJmFtcDsmYW1wOyBzayA9PSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LSZndDttcm91dGVfc2spKSB7CiYjNDM7CQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJfQomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJcnRubF9sb2NrKCk7Ci0JCXJldCA9IDA7Ci0JCW1ydCA9IGlwNm1yX25ld190YWJsZShuZXQsIHYpOwotCQlpZiAoSVNfRVJSKG1ydCkpCi0JCQlyZXQgPSBQVFJfRVJSKG1ydCk7Ci0JCWVsc2UKLQkJCXJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA9IHY7Ci0JCXJ0bmxfdW5sb2NrKCk7Ci0JCXJldHVybiByZXQ7CiYjNDM7CQlyYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPSB2OwomIzQzOwkJcmV0dXJuIDA7CiAJfQogI2VuZGlmCiAJLyoKQEAgLTE4OTcsMTYgJiM0MzsyMTE3LDE4IEBAIGludCBpcDZfbXJvdXRlX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIHsKIAlpbnQgb2xyOwogCWludCB2YWw7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCXN0cnVjdCBtcl90YWJsZSAqbXJ0OwogCiAJaWYgKHNrLSZndDtza190eXBlICE9IFNPQ0tfUkFXIHx8CiAJICAgIGluZXRfc2soc2spLSZndDtpbmV0X251bSAhPSBJUFBST1RPX0lDTVBWNikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7Ci0JaWYgKCFtcnQpCiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJaWYgKCFtcnQpIHsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJfQogCiAJc3dpdGNoIChvcHRuYW1lKSB7CiAJY2FzZSBNUlQ2X1ZFUlNJT046CkBAIC0xOTIxLDggJiM0MzsyMTQzLDEwIEBAIGludCBpcDZfbXJvdXRlX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJdmFsID0gUkVBRF9PTkNFKG1ydC0mZ3Q7bXJvdXRlX2RvX2Fzc2VydCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwogCiAJaWYgKGNvcHlfZnJvbV9zb2NrcHRyKCZhbXA7b2xyLCBvcHRsZW4sIHNpemVvZihpbnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xOTQ3LDIwICYjNDM7MjE3MSwyMyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpCiAJc3RydWN0IHNpb2NfbWlmX3JlcTYgKnZyOwogCXN0cnVjdCB2aWZfZGV2aWNlICp2aWY7CiAJc3RydWN0IG1mYzZfY2FjaGUgKmM7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCXN0cnVjdCBtcl90YWJsZSAqbXJ0OwogCi0JbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7Ci0JaWYgKCFtcnQpCiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJaWYgKCFtcnQpIHsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJfQogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHRVRNSUZDTlRfSU42OgogCQl2ciA9IChzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqKWFyZzsKLQkJaWYgKHZyLSZndDttaWZpICZndDs9IG1ydC0mZ3Q7bWF4dmlmKQomIzQzOwkJaWYgKHZyLSZndDttaWZpICZndDs9IG1ydC0mZ3Q7bWF4dmlmKSB7CiYjNDM7CQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCX0KIAkJdnItJmd0O21pZmkgPSBhcnJheV9pbmRleF9ub3NwZWModnItJmd0O21pZmksIG1ydC0mZ3Q7bWF4dmlmKTsKLQkJcmN1X3JlYWRfbG9jaygpOwogCQl2aWYgPSAmYW1wO21ydC0mZ3Q7dmlmX3RhYmxlW3ZyLSZndDttaWZpXTsKIAkJaWYgKFZJRl9FWElTVFMobXJ0LCB2ci0mZ3Q7bWlmaSkpIHsKIAkJCXZyLSZndDtpY291bnQgPSBSRUFEX09OQ0UodmlmLSZndDtwa3RfaW4pOwpAQCAtMTk3NCw4ICYjNDM7MjIwMSw2IEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZykKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCWNhc2UgU0lPQ0dFVFNHQ05UX0lONjoKIAkJc3IgPSAoc3RydWN0IHNpb2Nfc2dfcmVxNiAqKWFyZzsKLQotCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgJmFtcDtzci0mZ3Q7c3JjLnNpbjZfYWRkciwKIAkJCQkgICAgICZhbXA7c3ItJmd0O2dycC5zaW42X2FkZHIpOwogCQlpZiAoYykgewpAQCAtMTk4OCw2ICYjNDM7MjIxMyw3IEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZykKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIAlkZWZhdWx0OgomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQogfQpAQCAtMjAxNSwyMSAmIzQzOzIyNDEsMjMgQEAgaW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiAJc3RydWN0IGNvbXBhdF9zaW9jX21pZl9yZXE2IHZyOwogCXN0cnVjdCB2aWZfZGV2aWNlICp2aWY7CiAJc3RydWN0IG1mYzZfY2FjaGUgKmM7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCXN0cnVjdCBtcl90YWJsZSAqbXJ0OwogCi0JbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7Ci0JaWYgKCFtcnQpCi0JCXJldHVybiAtRU5PRU5UOwotCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHRVRNSUZDTlRfSU42OgogCQlpZiAoY29weV9mcm9tX3VzZXIoJmFtcDt2ciwgYXJnLCBzaXplb2YodnIpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAodnIubWlmaSAmZ3Q7PSBtcnQtJmd0O21heHZpZikKJiM0MzsJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQomIzQzOwkJaWYgKHZyLm1pZmkgJmd0Oz0gbXJ0LSZndDttYXh2aWYpIHsKJiM0MzsJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJfQogCQl2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC0mZ3Q7bWF4dmlmKTsKLQkJcmN1X3JlYWRfbG9jaygpOwogCQl2aWYgPSAmYW1wO21ydC0mZ3Q7dmlmX3RhYmxlW3ZyLm1pZmldOwogCQlpZiAoVklGX0VYSVNUUyhtcnQsIHZyLm1pZmkpKSB7CiAJCQl2ci5pY291bnQgPSBSRUFEX09OQ0UodmlmLSZndDtwa3RfaW4pOwpAQCAtMjA0OSw2ICYjNDM7MjI3NywxMSBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQogCQljID0gaXA2bXJfY2FjaGVfZmluZChtcnQsICZhbXA7c3Iuc3JjLnNpbjZfYWRkciwgJmFtcDtzci5ncnAuc2luNl9hZGRyKTsKIAkJaWYgKGMpIHsKIAkJCXNyLnBrdGNudCA9IGF0b21pY19sb25nX3JlYWQoJmFtcDtjLSZndDtfYy5tZmNfdW4ucmVzLnBrdCk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2NTQKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAzODMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgRnV6emluZyBTdHJhdGVneSBmb3IgVGhpcyBJUHY2IE11bHRpY2FzdCBSb3V0aW5nIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBtb2RpZnlpbmcgYG5ldC9pcHY2L2lwNm1yLmNgIOKAkyBpdCYjMzk7cyBhbGwgYWJvdXQgSVB2NiBtdWx0aWNhc3Qgcm91dGluZywgYW5kIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBvcHRpbWFsIGZ1enppbmcgYXBwcm9hY2guIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgaXMgYWJzb2x1dGVseSBXb3J0aEZ1enppbmcuIFRoZSBjaGFuZ2VzIGFyZSBxdWl0ZSBzaWduaWZpY2FudCwgdG91Y2hpbmcgb24gY3J1Y2lhbCBhcmVhcyBsaWtlIHRhYmxlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiwgZHluYW1pYyBhbGxvY2F0aW9uLCBzZXRzb2Nrb3B0L2dldHNvY2tvcHQvaW9jdGwgaGFuZGxpbmcsIGFuZCB0aGUgaW50cm9kdWN0aW9uIG9mIHdvcmtxdWV1ZXMgYW5kIHRpbWVycy4gVGhpcyBzY3JlYW1zIHBvdGVudGlhbCBmb3IgaW50ZXJlc3RpbmcgYnVncy4KClNwZWNpZmljYWxseSwgdGhlIHBhdGNoIHNlZW1zIHRvIG92ZXJoYXVsIGhvdyBgbXJfdGFibGVzYCBhcmUgaGFuZGxlZC4gV2UmIzM5O3JlIHNlZWluZyBkeW5hbWljIGNyZWF0aW9uLCBkZWxheWVkIHB1Ymxpc2hpbmcsIGFuZCBkZXN0cnVjdGlvbiDigJMgdGhhdCYjMzk7cyBhIHJlZCBmbGFnIGZvciByYWNlIGNvbmRpdGlvbnMgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IGlzc3Vlcywgd2hpY2ggYXJlIGFsd2F5cyBwcmltZSB0YXJnZXRzLiBJIHNlZSBjaGFuZ2VzIGluIHRoZSBoYW5kbGluZyBvZiBNUlQ2XyosIFNJT0NHRVRNSUZDTlRfSU42LCBhbmQgU0lPQ0dFVFNHQ05UX0lONiB2aWEgc2V0c29ja29wdC9nZXRzb2Nrb3B0L2lvY3RsLCBhbmQgdGhlIGBpcG1yX2V4cGlyZV9wcm9jZXNzYCwgYGlwNm1yX2RldmljZV9ldmVudGAsIGBpcDZtcl9za19pbml0YCwgYW5kIGBpcDZtcl9za19kb25lYCBmdW5jdGlvbnMgYXJlIGFsbCBpbiB0aGUgbWl4IHRvby4gV29ya3F1ZXVlcyAoYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCkgYW5kIHRpbWVycyBhbHNvIGdldCB0aHJvd24gaW4uIFRoYXQmIzM5O3MgYSBnb29kIG1peCBvZiBwb3RlbnRpYWwgZnV6eiB0YXJnZXRzLgoKVGhlIGdvb2QgbmV3cyBpcywgdGhpcyBzaG91bGQgYmUgcmVhY2hhYmxlIGluIGEgc3RhbmRhcmQgc3l6a2FsbGVyIC8gUUVNVSBzZXR1cC4gSVB2NiBtdWx0aWNhc3Qgcm91dGluZyBpcyBjb3JlIG5ldHdvcmtpbmcgY29kZSwgYWNjZXNzaWJsZSB2aWEgcmF3IHNvY2tldHMgKElQUFJPVE9fSUNNUFY2LCBldGMuKSBhbmQgdGhvc2Ugc2V0c29ja29wdC9pb2N0bCBjYWxscy4gVGhhdCBtYWtlcyBpdCBlYXNpZXIgdG8gdGFyZ2V0IGFuZCB0ZXN0LiBHaXZlbiB0aGUgbW9kaWZpY2F0aW9ucywgSSYjMzk7bGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byBsb2NraW5nIG1lY2hhbmlzbXMsIHRhYmxlIGxpZmVjeWNsZSBtYW5hZ2VtZW50LCBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZywgaG93IHRoZSB0aW1lcnMgYW5kIHdvcmtxdWV1ZXMgaW50ZXJhY3QsIGFuZCB0aGUgaGFuZGxpbmcgb2YgbmV0ZGV2IG5vdGlmaWVyIGV2ZW50cy4KCk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgYW55IG5lY2Vzc2FyeSBLY29uZmlnIGRlcGVuZGVuY2llcyB0byBnZXQgdGhlIHJlbGV2YW50IGNvZGUgZW5hYmxlZC4gSSYjMzk7bGwgdXNlIGBncmVwcGVyYCB0byBxdWlja2x5IHNjYW4gYG5ldC9pcHY2L0tjb25maWdgIGFuZCBgbmV0L2lwdjYvTWFrZWZpbGVgIHRvIGlkZW50aWZ5IGFueSByZXF1aXJlZCBjb25maWd1cmF0aW9ucy4gVGhpcyB3aWxsIGd1aWRlIG15IHN5emthbGxlciBjb25maWd1cmF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR19JUFY2X01ST1VURSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9pcHY2JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9pcHY2L01ha2VmaWxlPTE1PWlwdjYtJChDT05GSUdfU1lTQ1RMKSAmIzQzOz0gc3lzY3RsX25ldF9pcHY2Lm9cbm5ldC9pcHY2L01ha2VmaWxlOjE2OmlwdjYtJChDT05GSUdfSVBWNl9NUk9VVEUpICYjNDM7PSBpcDZtci5vXG5uZXQvaXB2Ni9NYWtlZmlsZS0xNy1cbi0tXG5uZXQvaXB2Ni9hZGRyY29uZi5jPTUwOD1zdGF0aWMgaW50IGluZXQ2X25ldGNvbmZfbXNnc2l6ZV9kZXZjb25mKGludCB0eXBlKVxuLS1cbm5ldC9pcHY2L2FkZHJjb25mLmMtNTE4LVx0XHRzaXplICYjNDM7PSBubGFfdG90YWxfc2l6ZSg0KTtcbm5ldC9pcHY2L2FkZHJjb25mLmM6NTE5OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcbm5ldC9pcHY2L2FkZHJjb25mLmMtNTIwLVx0aWYgKGFsbCB8fCB0eXBlID09IE5FVENPTkZBX01DX0ZPUldBUkRJTkcpXG4tLVxubmV0L2lwdjYvYWRkcmNvbmYuYz01MzI9c3RhdGljIGludCBpbmV0Nl9uZXRjb25mX2ZpbGxfZGV2Y29uZihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaWZpbmRleCxcbi0tXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU2MS1cdFx0Z290byBubGFfcHV0X2ZhaWx1cmU7XG5uZXQvaXB2Ni9hZGRyY29uZi5jOjU2MjojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU2My1cdGlmICgoYWxsIHx8IHR5cGUgPT0gTkVUQ09ORkFfTUNfRk9SV0FSRElORykgXHUwMDI2XHUwMDI2XG4tLVxubmV0L2lwdjYvYWRkcmNvbmYuYz01NjY0PXN0YXRpYyB2b2lkIGlwdjZfc3RvcmVfZGV2Y29uZihjb25zdCBzdHJ1Y3QgaXB2Nl9kZXZjb25mICpjbmYsXG4tLVxubmV0L2lwdjYvYWRkcmNvbmYuYy01NzE3LSNlbmRpZlxubmV0L2lwdjYvYWRkcmNvbmYuYzo1NzE4OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcbm5ldC9pcHY2L2FkZHJjb25mLmMtNTcxOS1cdGFycmF5W0RFVkNPTkZfTUNfRk9SV0FSRElOR10gPSBhdG9taWNfcmVhZChcdTAwMjZjbmYtXHUwMDNlbWNfZm9yd2FyZGluZyk7XG4tLVxubmV0L2lwdjYvYWRkcmNvbmYuYz02ODQ5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIGFkZHJjb25mX3N5c2N0bFtdID0ge1xuLS1cbm5ldC9pcHY2L2FkZHJjb25mLmMtNzExNy0jZW5kaWZcbm5ldC9pcHY2L2FkZHJjb25mLmM6NzExODojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTcxMTktXHR7XG4tLVxubmV0L2lwdjYvaXA2X2lucHV0LmM9NTU0PWludCBpcDZfbWNfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvaXB2Ni9pcDZfaW5wdXQuYy01NzYtXG5uZXQvaXB2Ni9pcDZfaW5wdXQuYzo1Nzc6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURVxubmV0L2lwdjYvaXA2X2lucHV0LmMtNTc4LVx0Lypcbi0tXG5uZXQvaXB2Ni9pcDZtci5jPTEwNj1zdGF0aWMgdm9pZCBpcG1yX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCB0aW1lcl9saXN0ICp0KTtcbm5ldC9pcHY2L2lwNm1yLmMtMTA3LVxubmV0L2lwdjYvaXA2bXIuYzoxMDg6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbm5ldC9pcHY2L2lwNm1yLmMtMTA5LSNkZWZpbmUgaXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpIFxcXG4tLVxubmV0L2lwdjYvaXA2bXIuYz0zOTc9c3RhdGljIHZvaWQgaXA2bXJfbmV3X3RhYmxlX3NldChzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTM5OS17XG5uZXQvaXB2Ni9pcDZtci5jOjQwMDojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xubmV0L2lwdjYvaXA2bXIuYy00MDEtXHRsaXN0X2FkZF90YWlsX3JjdShcdTAwMjZtcnQtXHUwMDNlbGlzdCwgXHUwMDI2bmV0LVx1MDAzZWlwdjYubXI2X3RhYmxlcyk7XG4tLVxubmV0L2lwdjYvaXA2bXIuYz00NTk9c3RhdGljIHZvaWQgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydClcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTQ2Mi1cbm5ldC9pcHY2L2lwNm1yLmM6NDYzOiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG5uZXQvaXB2Ni9pcDZtci5jLTQ2NC1cdGlmIChtcnQtXHUwMDNlaWQgPT0gUlQ2X1RBQkxFX0RGTFQpXG4tLVxubmV0L2lwdjYvaXA2bXIuYy00ODYtXG5uZXQvaXB2Ni9pcDZtci5jOjQ4NzojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xubmV0L2lwdjYvaXA2bXIuYy00ODgtc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XG4tLVxubmV0L2lwdjYvaXA2bXIuYz0xNDIyPXN0YXRpYyBpbnQgaXA2bXJfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcyxcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTE0MjYtXHRzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7XG5uZXQvaXB2Ni9pcDZtci5jOjE0Mjc6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbm5ldC9pcHY2L2lwNm1yLmMtMTQyOC1cdHN0cnVjdCBtcl90YWJsZSAqbXJ0LCAqbmV4dDtcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTE0MzctXG5uZXQvaXB2Ni9pcDZtci5jOjE0Mzg6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbm5ldC9pcHY2L2lwNm1yLmMtMTQzOS1cdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtcnQsIG5leHQsIFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1yNl90YWJsZXMsIGxpc3QpXG4tLVxubmV0L2lwdjYvaXA2bXIuYz0xODYxPWludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbi0tXG5uZXQvaXB2Ni9pcDZtci5jLTIwNzctI2VuZGlmXG5uZXQvaXB2Ni9pcDZtci5jOjIwNzg6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbm5ldC9pcHY2L2lwNm1yLmMtMjA3OS1cdGNhc2UgTVJUNl9UQUJMRTpcbi0tXG5uZXQvaXB2Ni9yYXcuYz0xMTI2PXN0YXRpYyBpbnQgcmF3djZfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCBpbnQgKmthcmcpXG4tLVxubmV0L2lwdjYvcmF3LmMtMTE0Ni1cdGRlZmF1bHQ6XG5uZXQvaXB2Ni9yYXcuYzoxMTQ3OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcbm5ldC9pcHY2L3Jhdy5jLTExNDgtXHRcdHJldHVybiBpcDZtcl9pb2N0bChzaywgY21kLCBrYXJnKTtcbi0tXG5uZXQvaXB2Ni9yYXcuYz0xMTU2PXN0YXRpYyBpbnQgY29tcGF0X3Jhd3Y2X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxubmV0L2lwdjYvcmF3LmMtMTE2Mi1cdGRlZmF1bHQ6XG5uZXQvaXB2Ni9yYXcuYzoxMTYzOiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcbm5ldC9pcHY2L3Jhdy5jLTExNjQtXHRcdHJldHVybiBpcDZtcl9jb21wYXRfaW9jdGwoc2ssIGNtZCwgY29tcGF0X3B0cihhcmcpKTtcbi0tXG5uZXQvaXB2Ni9yb3V0ZS5jPTU3ODc9c3RhdGljIGludCBydDZfZmlsbF9ub2RlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvaXB2Ni9yb3V0ZS5jLTU4NTItXHRpZiAoaWlmKSB7XG5uZXQvaXB2Ni9yb3V0ZS5jOjU4NTM6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURVxubmV0L2lwdjYvcm91dGUuYy01ODU0LVx0XHRpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdChcdTAwMjZydDZfZHN0LVx1MDAzZWFkZHIpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIyODkKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBJUHY2IE11bHRpY2FzdCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIElQdjYgbXVsdGljYXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIG5hdmlnYXRlIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBmaWxlcywgc3BlY2lmaWNhbGx5IGBuZXQvaXB2Ni9LY29uZmlnYC4gVGhhdCYjMzk7cyB0aGUgbG9naWNhbCBwbGFjZSB0byBzdGFydCBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMgb2YgYW55dGhpbmcgcmVsYXRlZCB0byBJUHY2LiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGFueXRoaW5nIHJlbGF0ZWQgdG8gYElQVjZfTVJPVVRFYCwgYXMgdGhhdCYjMzk7cyBteSBmb2NhbCBwb2ludC4gSSBmaWd1cmUgYnkgZXhhbWluaW5nIHRoZSBgS2NvbmZpZ2AgZmlsZSBhbmQgdGhlIHN1cnJvdW5kaW5nIGNvZGUgSSYjMzk7bGwgZmluZCB0aGUgc3BlY2lmaWMgY29uZmlnIG5hbWVzLCBkZXBlbmRlbmNpZXMsIGFuZCByZWxhdGlvbnNoaXBzIGJldHdlZW4gdmFyaW91cyBJUHY2IG11bHRpY2FzdCBmZWF0dXJlcy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFuZCBob3cgdGhleSBpbnRlcmFjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtJUFY2X01ST1VURSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9pcHY2L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2lwdjYvS2NvbmZpZz0yNDM9Y29uZmlnIElQVjZfU1VCVFJFRVNcbi0tXG5uZXQvaXB2Ni9LY29uZmlnLTI1Ni1cbm5ldC9pcHY2L0tjb25maWc6MjU3OmNvbmZpZyBJUFY2X01ST1VURVxubmV0L2lwdjYvS2NvbmZpZy0yNTgtXHRib29sIFwmIzM0O0lQdjY6IG11bHRpY2FzdCByb3V0aW5nXCYjMzQ7XG4tLVxubmV0L2lwdjYvS2NvbmZpZy0yNjQtXG5uZXQvaXB2Ni9LY29uZmlnOjI2NTpjb25maWcgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG5uZXQvaXB2Ni9LY29uZmlnLTI2Ni1cdGJvb2wgXCYjMzQ7SVB2NjogbXVsdGljYXN0IHBvbGljeSByb3V0aW5nXCYjMzQ7XG5uZXQvaXB2Ni9LY29uZmlnOjI2NzpcdGRlcGVuZHMgb24gSVBWNl9NUk9VVEVcbm5ldC9pcHY2L0tjb25maWctMjY4LVx0c2VsZWN0IEZJQl9SVUxFU1xuLS1cbm5ldC9pcHY2L0tjb25maWc9Mjc5PWNvbmZpZyBJUFY2X1BJTVNNX1YyXG5uZXQvaXB2Ni9LY29uZmlnLTI4MC1cdGJvb2wgXCYjMzQ7SVB2NjogUElNLVNNIHZlcnNpb24gMiBzdXBwb3J0XCYjMzQ7XG5uZXQvaXB2Ni9LY29uZmlnOjI4MTpcdGRlcGVuZHMgb24gSVBWNl9NUk9VVEVcbm5ldC9pcHY2L0tjb25maWctMjgyLVx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNzg5CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gSVB2NiBDb25maWd1cmF0aW9uKioKCk9rYXksIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBJUHY2IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gTXkgaW5zdGluY3QgaXMgdG8gaGVhZCBzdHJhaWdodCB0byB0aGUgc291cmNlLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGNoZWNrIHRoZSBgcmVhZC1maWxlYCBpbiB0aGUgYG5ldC9pcHY2L0tjb25maWdgIGZpbGUsIGZvY3VzaW5nIG9uIHRoZSBsaW5lcyBiZXR3ZWVuIDI1MCBhbmQgMjkwLiBUaGF0JiMzOTtzIHVzdWFsbHkgd2hlcmUgdGhlIG1lYXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGFuZCBkZXBlbmRlbmNpZXMgYXJlIGRlZmluZWQuIFRoaXMgd2lsbCBnaXZlIG1lIHRoZSBtb3N0IGRpcmVjdCBhbmQgcmVsaWFibGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCYjMzk7cyBhdmFpbGFibGUgYW5kIGhvdyB0aGV5IGludGVyYWN0LiBUaGlzIGFwcHJvYWNoIHNob3VsZCBvZmZlciBhIGdvb2Qgb3ZlcnZpZXcgb2YgdGhlIHJlbGV2YW50IEtjb25maWcgb3B0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9pcHY2L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI1MDpcdFx0ICBub3JtYWwgYW5kIHNvdXJjZSBwcmVmaXggc3BlY2lmaWMgcm91dGVzIGluIHRoZSBzYW1lIHJvdXRpbmcgdGFibGVcbiAyNTE6XHRcdCAgbWF5IHNvbWV0aW1lcyBsZWFkIHRvIHVuaW50ZW5kZWQgcm91dGluZyBiZWhhdmlvci4gIFRoaXMgY2FuIGJlXG4gMjUyOlx0XHQgIGF2b2lkZWQgYnkgZGVmaW5pbmcgZGlmZmVyZW50IHJvdXRpbmcgdGFibGVzIGZvciB0aGUgbm9ybWFsIGFuZFxuIDI1MzpcdFx0ICBzb3VyY2UgcHJlZml4IHNwZWNpZmljIHJvdXRlcy5cbiAyNTQ6XHRcbiAyNTU6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAyNTY6XHRcbiAyNTc6XHRjb25maWcgSVBWNl9NUk9VVEVcbiAyNTg6XHRcdGJvb2wgXCYjMzQ7SVB2NjogbXVsdGljYXN0IHJvdXRpbmdcJiMzNDtcbiAyNTk6XHRcdGRlcGVuZHMgb24gSVBWNlxuIDI2MDpcdFx0c2VsZWN0IElQX01ST1VURV9DT01NT05cbiAyNjE6XHRcdGhlbHBcbiAyNjI6XHRcdCAgU3VwcG9ydCBmb3IgSVB2NiBtdWx0aWNhc3QgZm9yd2FyZGluZy5cbiAyNjM6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAyNjQ6XHRcbiAyNjU6XHRjb25maWcgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4gMjY2Olx0XHRib29sIFwmIzM0O0lQdjY6IG11bHRpY2FzdCBwb2xpY3kgcm91dGluZ1wmIzM0O1xuIDI2NzpcdFx0ZGVwZW5kcyBvbiBJUFY2X01ST1VURVxuIDI2ODpcdFx0c2VsZWN0IEZJQl9SVUxFU1xuIDI2OTpcdFx0aGVscFxuIDI3MDpcdFx0ICBOb3JtYWxseSwgYSBtdWx0aWNhc3Qgcm91dGVyIHJ1bnMgYSB1c2Vyc3BhY2UgZGFlbW9uIGFuZCBkZWNpZGVzXG4gMjcxOlx0XHQgIHdoYXQgdG8gZG8gd2l0aCBhIG11bHRpY2FzdCBwYWNrZXQgYmFzZWQgb24gdGhlIHNvdXJjZSBhbmRcbiAyNzI6XHRcdCAgZGVzdGluYXRpb24gYWRkcmVzc2VzLiBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIG11bHRpY2FzdCByb3V0ZXJcbiAyNzM6XHRcdCAgd2lsbCBhbHNvIGJlIGFibGUgdG8gdGFrZSBpbnRlcmZhY2VzIGFuZCBwYWNrZXQgbWFya3MgaW50b1xuIDI3NDpcdFx0ICBhY2NvdW50IGFuZCBydW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHVzZXJzcGFjZSBkYWVtb25zXG4gMjc1Olx0XHQgIHNpbXVsdGFuZW91c2x5LCBlYWNoIG9uZSBoYW5kbGluZyBhIHNpbmdsZSB0YWJsZS5cbiAyNzY6XHRcbiAyNzc6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAyNzg6XHRcbiAyNzk6XHRjb25maWcgSVBWNl9QSU1TTV9WMlxuIDI4MDpcdFx0Ym9vbCBcJiMzNDtJUHY2OiBQSU0tU00gdmVyc2lvbiAyIHN1cHBvcnRcJiMzNDtcbiAyODE6XHRcdGRlcGVuZHMgb24gSVBWNl9NUk9VVEVcbiAyODI6XHRcdGhlbHBcbiAyODM6XHRcdCAgU3VwcG9ydCBmb3IgSVB2NiBQSU0gbXVsdGljYXN0IHJvdXRpbmcgcHJvdG9jb2wgUElNLVNNdjIuXG4gMjg0Olx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4gMjg1Olx0XG4gMjg2Olx0Y29uZmlnIElQVjZfU0VHNl9MV1RVTk5FTFxuIDI4NzpcdFx0Ym9vbCBcJiMzNDtJUHY2OiBTZWdtZW50IFJvdXRpbmcgSGVhZGVyIGVuY2Fwc3VsYXRpb24gc3VwcG9ydFwmIzM0O1xuIDI4ODpcdFx0ZGVwZW5kcyBvbiBJUFY2XG4gMjg5Olx0XHRzZWxlY3QgTFdUVU5ORUxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU4OQoJCQkJCQkJb3V0cHV0OiAyMzQKCQkJCQkJCXRob3VnaHRzOiA5NzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIElQdjYgTXVsdGljYXN0IFJvdXRpbmcgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgc2VlIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBwYXRjaCByZWxhdGVkIHRvIElQdjYgbXVsdGljYXN0IHJvdXRpbmcsIGluZGljYXRlZCBieSB0aGUga2V5IHN5bWJvbHMgYElQVjZfTVJPVVRFYCBhbmQgYElQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU2AuIFRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBgI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNgIGJsb2NrcyBmb3IgdGhpbmdzIGxpa2UgdGFibGUgZGVzdHJ1Y3Rpb24gYW5kIGBNUlQ2X1RBQkxFYCBgc2V0c29ja29wdGAgdXNhZ2UgaW1tZWRpYXRlbHkgZmxhZ3MgdGhhdCB0aGlzIGlzbiYjMzk7dCBhIHRyaXZpYWwgY2hhbmdlLiBXZSBhcmUgZGVmaW5pdGVseSB3b3JraW5nIHdpdGggc29tZSBuZXcgbG9naWMgZm9yIG11bHRpcGxlIHRhYmxlcyBoZXJlLCB3aGljaCBtZWFucyB3ZSBoYXZlIHRvIGRpdmUgYSBsaXR0bGUgZGVlcGVyLiBPZiBjb3Vyc2UsIGBJUFY2YCBpcyBhbHNvIGEgY3JpdGljYWwgY29uZmlnLgoKTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUuIExldCYjMzk7cyBsb29rIGF0IHRoZSBmdW5jdGlvbnMgYWRkZWQgb3IgbW9kaWZpZWQ6IGEgbGlzdCBvZiBmdW5jdGlvbnMsIGJvdGggc3RhdGljIGFuZCBleHBvcnRlZC4gSSBzZWUgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCB0YWJsZSBsb29rdXAsIGFsbG9jYXRpb24sIHB1Ymxpc2hpbmcsIGFuZCBkZXN0cnVjdGlvbiAocG90ZW50aWFsbHkgZGVsYXllZCB2aWEgYSB3b3JrcXVldWUgd2hpY2ggaXMgdmVyeSBpbnRlcmVzdGluZyBmb3IgY29uY3VycmVuY3kpLCBhbG9uZyB3aXRoIHRpbWVyIGFuZCBub3RpZmllciBjYWxsYmFja3MuIENyaXRpY2FsbHksIEkgaGF2ZSB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZXNlOiBgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0YCwgYGlwNl9tcm91dGVfZ2V0c29ja29wdGAsIGBpcDZtcl9pb2N0bGAsIGBpcDZtcl9jb21wYXRfaW9jdGxgLCBhbmQgYGlwNm1yX3NrX2RvbmVgIGFzIHRoZXNlIHJlcHJlc2VudCB0aGUgdXNlci1zcGFjZSBpbnRlcmZhY2UuIFRoZXkgYXJlIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgdGhlIGVudHJ5cG9pbnRzLiBgaXA2bXJfZGV2aWNlX2V2ZW50YCwgYGlwbXJfZXhwaXJlX3Byb2Nlc3NgLCBgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgLCBhbmQgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCBhcmUga2V5IGFzIHdlbGwsIGFzIHRoZXNlIGFyZSB0aGUgY29yZSBpbnRlcm5hbCBmdW5jdGlvbnMuCgpBIHF1aWNrIGNoZWNrIGNvbmZpcm1zIHRoYXQgb25seSBgbmV0L2lwdjYvaXA2bXIuY2AgaGFzIGJlZW4gbW9kaWZpZWQuIFRoYXQmIzM5O3MgZ29vZCwga2VlcHMgdGhlIGZvY3VzIHNvbWV3aGF0IG1hbmFnZWFibGUuCgpBbHJpZ2h0LCB3aGF0IHN5bWJvbHMgYXJlIGFic29sdXRlbHkgY3JpdGljYWw/IGBpcDZfbXJvdXRlX3NldHNvY2tvcHRgLCBgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0YCwgYGlwNm1yX2lvY3RsYCwgYGlwNm1yX2NvbXBhdF9pb2N0bGAsIGBpcDZtcl9za19kb25lYCwgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAsIGBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlYCwgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCwgYGlwNm1yX2RldmljZV9ldmVudGAsIGFuZCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AgYXJlIHRoZSBvbmVzIHRvIGZvY3VzIG9uLiBUaGV5IGFyZSBzcGVjaWZpYyB0byBJUHY2IG11bHRpY2FzdCByb3V0aW5nIChgaXA2bXJgKSwgYW5kIG5vdCB1YmlxdWl0b3VzLCBzbyB0aGF0IHJlZHVjZXMgdGhlIGNoYW5jZSBvZiBjb25mbGljdHMgd2l0aCBvdGhlciBmdW5jdGlvbnMuCgpGb3IgdGhlIGNvbmZpZ3VyYXRpb25zLCBgSVBWNmAsIGBJUFY2X01ST1VURWAsIGFuZCBgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTYCBhcmUgZXNzZW50aWFsIGZvciBlbmFibGluZyB0aGlzIGZ1bmN0aW9uYWxpdHkuCgpOb3csIGxldCYjMzk7cyBjb25maXJtIHRoZSBmdXp6aW5nIHN0cmF0ZWd5LiBUaGUgcGF0Y2gmIzM5O3MgaW1wYWN0IGlzIHNpZ25pZmljYW50OiBpdCBtb2RpZmllcyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQgaW4gYGlwNm1yLmNgLCBpbnRyb2R1Y2luZyBkeW5hbWljIHRhYmxlIGFsbG9jYXRpb24sIGRlbGF5ZWQgcHVibGlzaGluZywgYXN5bmNocm9ub3VzIHRhYmxlIGRlc3RydWN0aW9uIHZpYSB3b3JrcXVldWVzLCBhbmQgc2lnbmlmaWNhbnQgbW9kaWZpY2F0aW9ucyB0byBsb2NraW5nIGFuZCBsaWZlY3ljbGUgaGFuZGxpbmcgYWNyb3NzIHRoZSB1c2VyLXNwYWNlIGludGVyZmFjZSAoc2V0c29ja29wdCwgZ2V0c29ja29wdCwgaW9jdGxzKSBhbmQgaW50ZXJuYWwgbWVjaGFuaXNtcyBsaWtlIG5ldGRldiBldmVudCBub3RpZmljYXRpb24gYW5kIHRpbWVyIGV4cGlyYXRpb24uIFRoaXMgY29kZSBpcyBhbHNvIGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSB1c2VyIHNwYWNlIHZpYSByYXcgSVB2NiBzb2NrZXRzIGFuZCB0aGUgaW9jdGwvc2V0c29ja29wdCBzeXNjYWxscy4gRGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBUaGUgZ29hbCBvZiB0aGlzIGZ1enogaXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Uga2V5IGZ1bmN0aW9ucywgcGFydGljdWxhcmx5IHRoZSBvbmVzIHRoYXQgZGVhbCB3aXRoIHRoZSB1c2VyLXNwYWNlIGludGVyYWN0aW9uIGFuZCB0YWJsZSBtYW5hZ2VtZW50LCBhcmUgcm9idXN0IGFuZCBzZWN1cmUgYW5kIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gcmFjZSBjb25kaXRpb25zIG9yIG1lbW9yeSBlcnJvcnMgcHJlc2VudC4KClNvLCB0byBzdW1tYXJpemUsIHRoZSBgRm9jdXNTeW1ib2xzYCBhcmU6IGBpcDZfbXJvdXRlX3NldHNvY2tvcHRgLCBgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0YCwgYGlwNm1yX2lvY3RsYCwgYGlwNm1yX2NvbXBhdF9pb2N0bGAsIGBpcDZtcl9za19kb25lYCwgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAsIGBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlYCwgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCwgYGlwNm1yX2RldmljZV9ldmVudGAsIGFuZCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AuIFRoZSByZXF1aXJlZCBgRW5hYmxlQ29uZmlnc2AgYXJlOiBgSVBWNmAsIGBJUFY2X01ST1VURWAsIGFuZCBgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTYC4KClJlYWR5IHRvIHByb2NlZWQgd2l0aCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SVBWNiYjMzQ7LAogICAgJiMzNDtJUFY2X01ST1VURSYjMzQ7LAogICAgJiMzNDtJUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpcDZfbXJvdXRlX3NldHNvY2tvcHQmIzM0OywKICAgICYjMzQ7aXA2X21yb3V0ZV9nZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O2lwNm1yX2lvY3RsJiMzNDssCiAgICAmIzM0O2lwNm1yX2NvbXBhdF9pb2N0bCYjMzQ7LAogICAgJiMzNDtpcDZtcl9za19kb25lJiMzNDssCiAgICAmIzM0O2lwNm1yX2dldF9vcl9hbGxvY19za190YWJsZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlJiMzNDssCiAgICAmIzM0O2lwNm1yX2Rlc3Ryb3lfd29ya2ZuJiMzNDssCiAgICAmIzM0O2lwNm1yX2RldmljZV9ldmVudCYjMzQ7LAogICAgJiMzNDtpcG1yX2V4cGlyZV9wcm9jZXNzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIChpcDZtcikgdGFibGUgbGlmZWN5Y2xlIGFuZCBsb2NraW5nLiBJdCBhZGRzIGR5bmFtaWMgdGFibGUgYWxsb2NhdGlvbiwgYXN5bmNocm9ub3VzIHRhYmxlIGRlc3RydWN0aW9uIHZpYSB3b3JrcXVldWVzLCBhbmQgdXBkYXRlcyBzZXRzb2Nrb3B0LCBnZXRzb2Nrb3B0LCBpb2N0bCwgdGltZXIgZXhwaXJhdGlvbiwgYW5kIG5ldGRldiBub3RpZmllciBoYW5kbGluZy4gVGhlc2UgcGF0aHMgYXJlIGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHJhdyBJUHY2IHNvY2tldHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lQVjYmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEUmIzM0OywKICAgICYjMzQ7SVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aXA2X21yb3V0ZV9zZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O2lwNl9tcm91dGVfZ2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtpcDZtcl9pb2N0bCYjMzQ7LAogICAgJiMzNDtpcDZtcl9jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7aXA2bXJfc2tfZG9uZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUmIzM0OywKICAgICYjMzQ7aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZSYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXN0cm95X3dvcmtmbiYjMzQ7LAogICAgJiMzNDtpcDZtcl9kZXZpY2VfZXZlbnQmIzM0OywKICAgICYjMzQ7aXBtcl9leHBpcmVfcHJvY2VzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyAoaXA2bXIpIHRhYmxlIGxpZmVjeWNsZSBhbmQgbG9ja2luZy4gSXQgYWRkcyBkeW5hbWljIHRhYmxlIGFsbG9jYXRpb24sIGFzeW5jaHJvbm91cyB0YWJsZSBkZXN0cnVjdGlvbiB2aWEgd29ya3F1ZXVlcywgYW5kIHVwZGF0ZXMgc2V0c29ja29wdCwgZ2V0c29ja29wdCwgaW9jdGwsIHRpbWVyIGV4cGlyYXRpb24sIGFuZCBuZXRkZXYgbm90aWZpZXIgaGFuZGxpbmcuIFRoZXNlIHBhdGhzIGFyZSBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHZpYSByYXcgSVB2NiBzb2NrZXRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50IChuZXQvaXB2Ni9pcDZtci5jKSB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0YWJsZXMgb24gZGVtYW5kIHdoZW4gc29ja2V0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgYW5kIHRvIGRlc3Ryb3kgdGhlbSB3aGVuIHRoZXkgYmVjb21lIHVucmVmZXJlbmNlZCBvciBlbXB0eS5cblxuLSBNZW1vcnkgQWxsb2NhdGlvbnM6IE5ldyBkeW5hbWljIGFsbG9jYXRpb25zIChzdWNoIGFzIGBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrYCBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jX29iamApIGhhdmUgYWxsIG1lbWJlciBmaWVsZHMgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFRoZSB1bmRlcmx5aW5nIG11bHRpY2FzdCB0YWJsZXMgYWxsb2NhdGVkIHZpYSBgbXJfdGFibGVfYWxsb2MoKWAgdXNlIGBremFsbG9jX29iaigpYC5cbi0gRGF0YSBzZW50IHRvIHVzZXIgc3BhY2U6IGlvY3RsL2NvbXBhdF9pb2N0bCBhbmQgZ2V0c29ja29wdCBoYW5kbGVycyBvbmx5IGNvcHkgZXhwbGljaXRseSBpbml0aWFsaXplZCBmaWVsZHMgb3IgZGF0YSBjb3BpZWQgZnJvbSB1c2VyIHNwYWNlIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRob3V0IGxlYXZpbmcgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHJlYWRpbmcgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuLSBDb250cm9sIGZsb3cgYW5kIExpZmV0aW1lczogQ2hhbmdlcyBhZmZlY3QgdGFibGUgbGlmZWN5Y2xlLCBSQ1Ugc3luY2hyb25pemF0aW9uLCBsaXN0IG1hbmlwdWxhdGlvbnMsIGFuZCBsb2NraW5nIChSVE5ML21ydF9sb2NrKS4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGVzZSBwYXRocyBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGFjY2Vzcywgb3IgbWVtb3J5IGxlYWtzLCB3aGljaCBhcmUgaGFuZGxlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIEtNRU1MRUFLLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCwgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA1MjFjMGIwMmE2ODE0MjAwYjBlZWIyMGFhZjEzYzVkODRlOThmZTViCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBTZXAgNiAxNToyMTo1NiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jCmluZGV4IDNmMmVkOWI3N2RlYjUuLjI2YmQyY2NkNDIwMWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNm1yLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2lwdjYvaXA2bXIuYwpAQCAtMjgsNiAmIzQzOzI4LDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9pbml0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY29tcGF0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcmhhc2h0YWJsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC93b3JrcXVldWUuaCZndDsKICNpbmNsdWRlICZsdDtuZXQvcHJvdG9jb2wuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9za2J1ZmYuaCZndDsKICNpbmNsdWRlICZsdDtuZXQvcmF3LmgmZ3Q7CkBAIC0zNjgsNiAmIzQzOzM2OSwxMiBAQCBzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9nZXRfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpCiAJcmV0dXJuIG1ydDsKIH0KIAomIzQzO3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2xvb2t1cF9za190YWJsZShzdHJ1Y3Qgc29jayAqc2spCiYjNDM7ewomIzQzOwlyZXR1cm4gX19pcDZtcl9nZXRfdGFibGUoc29ja19uZXQoc2spLAomIzQzOwkJCQkgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7CiYjNDM7fQomIzQzOwogc3RhdGljIGludCBpcDZtcl9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLAogCQkJICBjb25zdCB2b2lkICpwdHIpCiB7CkBAIC00MTcsNiAmIzQzOzQyNCwxMjQgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKQogCQkJICAgICAgaXBtcl9leHBpcmVfcHJvY2VzcywgaXA2bXJfbmV3X3RhYmxlX3NldCk7CiB9CiAKJiM0MzsvKiB0YWJsZV9zZXQgY2FsbGJhY2sgdXNlZCB3aGlsZSB0aGUgbmV3IHRhYmxlIGlzIHN0aWxsIHVucHVibGlzaGVkLiAqLwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2goc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBuZXQgKm5ldCkKJiM0Mzt7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssCiYjNDM7CQkJCQkJICAgIGJvb2wgKm5ld190YWJsZSkKJiM0Mzt7CiYjNDM7CXUzMiBpZCA9IHJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQ7CiYjNDM7CXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKJiM0MzsJc3RydWN0IG1yX3RhYmxlICptcnQ7CiYjNDM7CiYjNDM7CUFTU0VSVF9SVE5MKCk7CiYjNDM7CSpuZXdfdGFibGUgPSBmYWxzZTsKJiM0MzsKJiM0MzsJbXJ0ID0gX19pcDZtcl9nZXRfdGFibGUobmV0LCBpZCk7CiYjNDM7CWlmIChtcnQpCiYjNDM7CQlyZXR1cm4gbXJ0OwomIzQzOwomIzQzOwltcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCAmYW1wO2lwNm1yX21yX3RhYmxlX29wcywKJiM0MzsJCQkgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2gpOwomIzQzOwlpZiAoIUlTX0VSUihtcnQpKQomIzQzOwkJKm5ld190YWJsZSA9IHRydWU7CiYjNDM7CXJldHVybiBtcnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBib29sIG5ld190YWJsZSkKJiM0Mzt7CiYjNDM7CWlmIChuZXdfdGFibGUpCiYjNDM7CQlpcDZtcl9uZXdfdGFibGVfc2V0KG1ydCwgcmVhZF9wbmV0KCZhbXA7bXJ0LSZndDtuZXQpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCkKJiM0Mzt7CiYjNDM7CUFTU0VSVF9SVE5MKCk7CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVMKJiM0MzsJaWYgKG1ydC0mZ3Q7aWQgPT0gUlQ2X1RBQkxFX0RGTFQpCiYjNDM7CQlyZXR1cm47CiYjNDM7CS8qIE5lc3RlZCBORVRERVZfVU5SRUdJU1RFUiBtYXkgYWxyZWFkeSBoYXZlIHVubGlua2VkIHRoaXMgdGFibGUuICovCiYjNDM7CWlmIChfX2lwNm1yX2dldF90YWJsZShyZWFkX3BuZXQoJmFtcDttcnQtJmd0O25ldCksIG1ydC0mZ3Q7aWQpICE9IG1ydCkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LSZndDttcm91dGVfc2spIHx8CiYjNDM7CSAgICBtcnQtJmd0O21heHZpZiB8fAomIzQzOwkgICAgIWxpc3RfZW1wdHkoJmFtcDttcnQtJmd0O21mY19jYWNoZV9saXN0KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrX2JoKCZhbXA7bWZjX3VucmVzX2xvY2spOwomIzQzOwlpZiAoIWxpc3RfZW1wdHkoJmFtcDttcnQtJmd0O21mY191bnJlc19xdWV1ZSkpIHsKJiM0MzsJCXNwaW5fdW5sb2NrX2JoKCZhbXA7bWZjX3VucmVzX2xvY2spOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CXNwaW5fdW5sb2NrX2JoKCZhbXA7bWZjX3VucmVzX2xvY2spOwomIzQzOwomIzQzOwlsaXN0X2RlbF9yY3UoJmFtcDttcnQtJmd0O2xpc3QpOwomIzQzOwl0aW1lcl9zaHV0ZG93bl9zeW5jKCZhbXA7bXJ0LSZndDtpcG1yX2V4cGlyZV90aW1lcik7CiYjNDM7CW1yX3RhYmxlX2ZyZWUobXJ0KTsKJiM0MzsjZW5kaWYKJiM0Mzt9CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVMKJiM0MztzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrIHsKJiM0MzsJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiYjNDM7CXN0cnVjdCBuZXQgKm5ldDsKJiM0MzsJdTMyIGlkOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfZGVzdHJveV93b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQomIzQzO3sKJiM0MzsJc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHcgPQomIzQzOwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmssIHdvcmspOwomIzQzOwlzdHJ1Y3QgbXJfdGFibGUgKm1ydDsKJiM0MzsKJiM0MzsJcnRubF9sb2NrKCk7CiYjNDM7CW1ydCA9IF9faXA2bXJfZ2V0X3RhYmxlKGR3LSZndDtuZXQsIGR3LSZndDtpZCk7CiYjNDM7CWlmIChtcnQpCiYjNDM7CQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiYjNDM7CXJ0bmxfdW5sb2NrKCk7CiYjNDM7CXB1dF9uZXQoZHctJmd0O25ldCk7CiYjNDM7CWtmcmVlKGR3KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveShzdHJ1Y3QgbXJfdGFibGUgKm1ydCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBuZXQgKm5ldCA9IHJlYWRfcG5ldCgmYW1wO21ydC0mZ3Q7bmV0KTsKJiM0MzsJc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHc7CiYjNDM7CiYjNDM7CWlmIChtcnQtJmd0O2lkID09IFJUNl9UQUJMRV9ERkxUKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlkdyA9IGttYWxsb2Nfb2JqKCpkdywgR0ZQX0FUT01JQyk7CiYjNDM7CWlmICghZHcpIHsKJiM0MzsJCW1vZF90aW1lcigmYW1wO21ydC0mZ3Q7aXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgJiM0MzsgSFopOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWlmICghbWF5YmVfZ2V0X25ldChuZXQpKSB7CiYjNDM7CQlrZnJlZShkdyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJSU5JVF9XT1JLKCZhbXA7ZHctJmd0O3dvcmssIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKTsKJiM0MzsJZHctJmd0O25ldCA9IG5ldDsKJiM0MzsJZHctJmd0O2lkID0gbXJ0LSZndDtpZDsKJiM0MzsJcXVldWVfd29yayhzeXN0ZW1fZGZsX3dxLCAmYW1wO2R3LSZndDt3b3JrKTsKJiM0Mzt9CiYjNDM7I2Vsc2UKJiM0MztzdGF0aWMgdm9pZCBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KHN0cnVjdCBtcl90YWJsZSAqbXJ0KQomIzQzO3sKJiM0Mzt9CiYjNDM7I2VuZGlmCiYjNDM7CiYjNDM7c3RhdGljIGludCBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBib29sIG5ld190YWJsZSwKJiM0MzsJCQkJICBpbnQgZXJyKQomIzQzO3sKJiM0MzsJaWYgKG5ld190YWJsZSAmYW1wOyZhbXA7IGVycikKJiM0MzsJCWlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCBpcDZtcl9mcmVlX3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LAogCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfa2lsbF9saXN0KQogewpAQCAtODY2LDE2ICYjNDM7OTkxLDI1IEBAIHN0YXRpYyB2b2lkIGlwbXJfZG9fZXhwaXJlX3Byb2Nlc3Moc3RydWN0IG1yX3RhYmxlICptcnQpCiBzdGF0aWMgdm9pZCBpcG1yX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCB0aW1lcl9saXN0ICp0KQogewogCXN0cnVjdCBtcl90YWJsZSAqbXJ0ID0gdGltZXJfY29udGFpbmVyX29mKG1ydCwgdCwgaXBtcl9leHBpcmVfdGltZXIpOwomIzQzOwlib29sIGVtcHR5ID0gZmFsc2U7CiAKIAlpZiAoIXNwaW5fdHJ5bG9jaygmYW1wO21mY191bnJlc19sb2NrKSkgewogCQltb2RfdGltZXIoJmFtcDttcnQtJmd0O2lwbXJfZXhwaXJlX3RpbWVyLCBqaWZmaWVzICYjNDM7IDEpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKCFsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfdW5yZXNfcXVldWUpKQomIzQzOwlpZiAoIWxpc3RfZW1wdHkoJmFtcDttcnQtJmd0O21mY191bnJlc19xdWV1ZSkpIHsKIAkJaXBtcl9kb19leHBpcmVfcHJvY2VzcyhtcnQpOwomIzQzOwkJZW1wdHkgPSBsaXN0X2VtcHR5KCZhbXA7bXJ0LSZndDttZmNfdW5yZXNfcXVldWUpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJLyogUmV0cnkgYWZ0ZXIgR0ZQX0FUT01JQyBhbGxvY2F0aW9uIGZhaWx1cmUuICovCiYjNDM7CQllbXB0eSA9IHRydWU7CiYjNDM7CX0KIAogCXNwaW5fdW5sb2NrKCZhbXA7bWZjX3VucmVzX2xvY2spOwomIzQzOwomIzQzOwlpZiAoZW1wdHkpCiYjNDM7CQlpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KG1ydCk7CiB9CiAKIC8qIEZpbGwgb2lmcyBsaXN0LiBJdCBpcyBjYWxsZWQgdW5kZXIgbG9ja2VkIG1ydF9sb2NrLiAqLwpAQCAtMTI5MCwxOSAmIzQzOzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CiYjNDM7I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVMKJiM0MzsJc3RydWN0IG1yX3RhYmxlICptcnQsICpuZXh0OwomIzQzOyNlbHNlCiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiYjNDM7I2VuZGlmCiAJc3RydWN0IHZpZl9kZXZpY2UgKnY7CiAJaW50IGN0OwogCiAJaWYgKGV2ZW50ICE9IE5FVERFVl9VTlJFR0lTVEVSKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKLQlpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldCkgewomIzQzOyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTCiYjNDM7CWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtcnQsIG5leHQsICZhbXA7bmV0LSZndDtpcHY2Lm1yNl90YWJsZXMsIGxpc3QpCiYjNDM7I2Vsc2UKJiM0MzsJaXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpCiYjNDM7I2VuZGlmCiYjNDM7CXsKJiM0MzsJCWJvb2wgdmlmX2dvbmUgPSBmYWxzZTsKJiM0MzsKIAkJdiA9ICZhbXA7bXJ0LSZndDt2aWZfdGFibGVbMF07CiAJCWZvciAoY3QgPSAwOyBjdCAmbHQ7IG1ydC0mZ3Q7bWF4dmlmOyBjdCYjNDM7JiM0MzssIHYmIzQzOyYjNDM7KSB7Ci0JCQlpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtJmd0O2RldikgPT0gZGV2KQomIzQzOwkJCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIodi0mZ3Q7ZGV2KSA9PSBkZXYpIHsKIAkJCQltaWY2X2RlbGV0ZShtcnQsIGN0LCAxLCBOVUxMKTsKJiM0MzsJCQkJdmlmX2dvbmUgPSB0cnVlOwomIzQzOwkJCX0KIAkJfQomIzQzOwkJaWYgKHZpZl9nb25lKQomIzQzOwkJCWlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTsKIAl9CiAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CkBAIC0xNjE4LDEwICYjNDM7MTc2NywxMSBAQCBzdGF0aWMgdm9pZCBtcm91dGVfY2xlYW5fdGFibGVzKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBpbnQgZmxhZ3MsCiAKIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKQogewotCWludCBlcnIgPSAwOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKJiM0MzsJaW50IGVyciA9IDA7CiYjNDM7CiYjNDM7CUFTU0VSVF9SVE5MKCk7CiAKLQlydG5sX2xvY2soKTsKIAlzcGluX2xvY2soJmFtcDttcnRfbG9jayk7CiAJaWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LSZndDttcm91dGVfc2spKSB7CiAJCWVyciA9IC1FQUREUklOVVNFOwpAQCAtMTYzNyw4ICYjNDM7MTc4Nyw2IEBAIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKQogCQkJCQkgICAgIE5FVENPTkZBX01DX0ZPUldBUkRJTkcsCiAJCQkJCSAgICAgTkVUQ09ORkFfSUZJTkRFWF9BTEwsCiAJCQkJCSAgICAgbmV0LSZndDtpcHY2LmRldmNvbmZfYWxsKTsKLQlydG5sX3VubG9jaygpOwotCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTY3Nyw2ICYjNDM7MTgyNSw3IEBAIGludCBpcDZtcl9za19kb25lKHN0cnVjdCBzb2NrICpzaykKIAkJCW1yb3V0ZV9jbGVhbl90YWJsZXMobXJ0LCBNUlQ2X0ZMVVNIX01JRlMgfCBNUlQ2X0ZMVVNIX01GQywKIAkJCQkJICAgICZhbXA7ZGV2X2tpbGxfbGlzdCk7CiAJCQllcnIgPSAwOwomIzQzOwkJCWlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTcyMywyNyAmIzQzOzE4NzIsNDUgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCSAgICBpbmV0X3NrKHNrKS0mZ3Q7aW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCW1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpOwotCWlmICghbXJ0KQotCQlyZXR1cm4gLUVOT0VOVDsKLQogCWlmIChvcHRuYW1lICE9IE1SVDZfSU5JVCkgewotCQlpZiAoc2sgIT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC0mZ3Q7bXJvdXRlX3NrKSAmYW1wOyZhbXA7Ci0JCSAgICAhbnNfY2FwYWJsZShuZXQtJmd0O3VzZXJfbnMsIENBUF9ORVRfQURNSU4pKQomIzQzOwkJYm9vbCBpc19tcm91dGVfc2sgPSBmYWxzZTsKJiM0MzsKJiM0MzsJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAobXJ0ICZhbXA7JmFtcDsgc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC0mZ3Q7bXJvdXRlX3NrKSkKJiM0MzsJCQlpc19tcm91dGVfc2sgPSB0cnVlOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CiYjNDM7CQlpZiAoIWlzX21yb3V0ZV9zayAmYW1wOyZhbXA7ICFuc19jYXBhYmxlKG5ldC0mZ3Q7dXNlcl9ucywgQ0FQX05FVF9BRE1JTikpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKIAlzd2l0Y2ggKG9wdG5hbWUpIHsKLQljYXNlIE1SVDZfSU5JVDoKJiM0MzsJY2FzZSBNUlQ2X0lOSVQ6IHsKJiM0MzsJCWJvb2wgbmV3X3RhYmxlID0gZmFsc2U7CiYjNDM7CiAJCWlmIChvcHRsZW4gJmx0OyBzaXplb2YoaW50KSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXJldHVybiBpcDZtcl9za19pbml0KG1ydCwgc2spOwomIzQzOwkJcnRubF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssICZhbXA7bmV3X3RhYmxlKTsKJiM0MzsJCWlmIChJU19FUlIobXJ0KSkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIFBUUl9FUlIobXJ0KTsKJiM0MzsJCX0KJiM0MzsJCWlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTsKJiM0MzsJCXJldCA9IGlwNm1yX3NrX2luaXQobXJ0LCBzayk7CiYjNDM7CQlyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpOwomIzQzOwkJcnRubF91bmxvY2soKTsKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CX0KIAogCWNhc2UgTVJUNl9ET05FOgogCQlyZXR1cm4gaXA2bXJfc2tfZG9uZShzayk7CiAKLQljYXNlIE1SVDZfQUREX01JRjoKJiM0MzsJY2FzZSBNUlQ2X0FERF9NSUY6IHsKJiM0MzsJCWJvb2wgbmV3X3RhYmxlID0gZmFsc2U7CiYjNDM7CiAJCWlmIChvcHRsZW4gJmx0OyBzaXplb2YodmlmKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoY29weV9mcm9tX3NvY2twdHIoJmFtcDt2aWYsIG9wdHZhbCwgc2l6ZW9mKHZpZikpKQpAQCAtMTc1MSwxMCAmIzQzOzE5MTgsMTggQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQlpZiAodmlmLm1pZjZjX21pZmkgJmd0Oz0gTUFYTUlGUykKIAkJCXJldHVybiAtRU5GSUxFOwogCQlydG5sX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgJmFtcDtuZXdfdGFibGUpOwomIzQzOwkJaWYgKElTX0VSUihtcnQpKSB7CiYjNDM7CQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQlyZXR1cm4gUFRSX0VSUihtcnQpOwomIzQzOwkJfQomIzQzOwkJaXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpOwogCQlyZXQgPSBtaWY2X2FkZChuZXQsIG1ydCwgJmFtcDt2aWYsCiAJCQkgICAgICAgc2sgPT0gcnRubF9kZXJlZmVyZW5jZShtcnQtJmd0O21yb3V0ZV9zaykpOwomIzQzOwkJcmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTsKIAkJcnRubF91bmxvY2soKTsKIAkJcmV0dXJuIHJldDsKJiM0MzsJfQogCiAJY2FzZSBNUlQ2X0RFTF9NSUY6CiAJCWlmIChvcHRsZW4gJmx0OyBzaXplb2YobWlmaV90KSkKQEAgLTE3NjIsNyAmIzQzOzE5MzcsMTQgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQlpZiAoY29weV9mcm9tX3NvY2twdHIoJmFtcDttaWZpLCBvcHR2YWwsIHNpemVvZihtaWZpX3QpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlydG5sX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiAJCXJldCA9IG1pZjZfZGVsZXRlKG1ydCwgbWlmaSwgMCwgTlVMTCk7CiYjNDM7CQlpZiAoIXJldCkKJiM0MzsJCQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiAJCXJ0bmxfdW5sb2NrKCk7CiAJCXJldHVybiByZXQ7CiAKQEAgLTE3ODMsMTcgJiM0MzsxOTY1LDM5IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJaWYgKHBhcmVudCA9PSAwKQogCQkJcGFyZW50ID0gbWZjLm1mNmNjX3BhcmVudDsKIAotCQltdXRleF9sb2NrKCZhbXA7bmV0LSZndDtpcHY2Lm1mY19tdXRleCk7CiYjNDM7CQlydG5sX2xvY2soKTsKJiM0MzsJCWlmIChvcHRuYW1lID09IE1SVDZfREVMX01GQyB8fCBvcHRuYW1lID09IE1SVDZfREVMX01GQ19QUk9YWSkgewomIzQzOwkJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQkJaWYgKCFtcnQpIHsKJiM0MzsJCQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQkJfQomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQlib29sIG5ld190YWJsZSA9IGZhbHNlOwogCi0JCWlmIChvcHRuYW1lID09IE1SVDZfREVMX01GQyB8fCBvcHRuYW1lID09IE1SVDZfREVMX01GQ19QUk9YWSkKLQkJCXJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCAmYW1wO21mYywgcGFyZW50KTsKLQkJZWxzZQomIzQzOwkJCW1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgJmFtcDtuZXdfdGFibGUpOwomIzQzOwkJCWlmIChJU19FUlIobXJ0KSkgewomIzQzOwkJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCQlyZXR1cm4gUFRSX0VSUihtcnQpOwomIzQzOwkJCX0KJiM0MzsJCQlpcDZtcl9wdWJsaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSk7CiYjNDM7CQkJbXV0ZXhfbG9jaygmYW1wO25ldC0mZ3Q7aXB2Ni5tZmNfbXV0ZXgpOwogCQkJcmV0ID0gaXA2bXJfbWZjX2FkZChuZXQsIG1ydCwgJmFtcDttZmMsCiAJCQkJCSAgICBzayA9PQogCQkJCQkgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC0mZ3Q7bXJvdXRlX3NrKSwKIAkJCQkJICAgIHBhcmVudCk7CiYjNDM7CQkJbXV0ZXhfdW5sb2NrKCZhbXA7bmV0LSZndDtpcHY2Lm1mY19tdXRleCk7CiYjNDM7CQkJcmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTsKJiM0MzsJCQlydG5sX3VubG9jaygpOwomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQl9CiAKJiM0MzsJCW11dGV4X2xvY2soJmFtcDtuZXQtJmd0O2lwdjYubWZjX211dGV4KTsKJiM0MzsJCXJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCAmYW1wO21mYywgcGFyZW50KTsKIAkJbXV0ZXhfdW5sb2NrKCZhbXA7bmV0LSZndDtpcHY2Lm1mY19tdXRleCk7CiYjNDM7CQlpZiAoIXJldCkKJiM0MzsJCQlpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7CiYjNDM7CQlydG5sX3VubG9jaygpOwogCQlyZXR1cm4gcmV0OwogCiAJY2FzZSBNUlQ2X0ZMVVNIOgpAQCAtMTgwNyw4ICYjNDM7MjAxMSwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlydG5sX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJ0bmxfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiAJCW1yb3V0ZV9jbGVhbl90YWJsZXMobXJ0LCBmbGFncywgJmFtcDtkZXZfa2lsbF9saXN0KTsKIAkJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueSgmYW1wO2Rldl9raWxsX2xpc3QpOwomIzQzOwkJaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpOwogCQlydG5sX3VubG9jaygpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xODI0LDcgJiM0MzsyMDM0LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoY29weV9mcm9tX3NvY2twdHIoJmFtcDt2LCBvcHR2YWwsIHNpemVvZih2KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKJiM0MzsJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCW1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7CiYjNDM7CQlpZiAoIW1ydCkgewomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJfQogCQlXUklURV9PTkNFKG1ydC0mZ3Q7bXJvdXRlX2RvX2Fzc2VydCwgdik7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xODQyLDYgJiM0MzsyMDU5LDExIEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCwKIAkJZG9fd3JtaWZ3aG9sZSA9ICh2ID09IE1SVDZNU0dfV1JNSUZXSE9MRSk7CiAJCXYgPSAhIXY7CiAJCXJ0bmxfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJCWlmICghbXJ0KSB7CiYjNDM7CQkJcnRubF91bmxvY2soKTsKJiM0MzsJCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJCX0KIAkJcmV0ID0gMDsKIAkJaWYgKHYgIT0gbXJ0LSZndDttcm91dGVfZG9fcGltKSB7CiAJCQlXUklURV9PTkNFKG1ydC0mZ3Q7bXJvdXRlX2RvX3BpbSwgdik7CkBAIC0xODY1LDE4ICYjNDM7MjA4NywxNiBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsCiAJCS8qICYjMzQ7cGltNnJlZyV1JiMzNDsgc2hvdWxkIG5vdCBleGNlZWQgMTYgYnl0ZXMgKElGTkFNU0laKSAqLwogCQlpZiAodiAhPSBSVF9UQUJMRV9ERUZBVUxUICZhbXA7JmFtcDsgdiAmZ3Q7PSAxMDAwMDAwMDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zaykpCiYjNDM7CQlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CQltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwkJaWYgKG1ydCAmYW1wOyZhbXA7IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtJmd0O21yb3V0ZV9zaykpIHsKJiM0MzsJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiAtRUJVU1k7CiYjNDM7CQl9CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKIAotCQlydG5sX2xvY2soKTsKLQkJcmV0ID0gMDsKLQkJbXJ0ID0gaXA2bXJfbmV3X3RhYmxlKG5ldCwgdik7Ci0JCWlmIChJU19FUlIobXJ0KSkKLQkJCXJldCA9IFBUUl9FUlIobXJ0KTsKLQkJZWxzZQotCQkJcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID0gdjsKLQkJcnRubF91bmxvY2soKTsKLQkJcmV0dXJuIHJldDsKJiM0MzsJCXJhdzZfc2soc2spLSZndDtpcDZtcl90YWJsZSA9IHY7CiYjNDM7CQlyZXR1cm4gMDsKIAl9CiAjZW5kaWYKIAkvKgpAQCAtMTg5NywxNiAmIzQzOzIxMTcsMTggQEAgaW50IGlwNl9tcm91dGVfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogewogCWludCBvbHI7CiAJaW50IHZhbDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiAKIAlpZiAoc2stJmd0O3NrX3R5cGUgIT0gU09DS19SQVcgfHwKIAkgICAgaW5ldF9zayhzayktJmd0O2luZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAoIW1ydCkKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwlpZiAoIW1ydCkgewomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiAKIAlzd2l0Y2ggKG9wdG5hbWUpIHsKIAljYXNlIE1SVDZfVkVSU0lPTjoKQEAgLTE5MjEsOCAmIzQzOzIxNDMsMTAgQEAgaW50IGlwNl9tcm91dGVfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLAogCQl2YWwgPSBSRUFEX09OQ0UobXJ0LSZndDttcm91dGVfZG9fYXNzZXJ0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KJiM0MzsJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlpZiAoY29weV9mcm9tX3NvY2twdHIoJmFtcDtvbHIsIG9wdGxlbiwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE5NDcsMjAgJiM0MzsyMTcxLDIzIEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZykKIAlzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqdnI7CiAJc3RydWN0IHZpZl9kZXZpY2UgKnZpZjsKIAlzdHJ1Y3QgbWZjNl9jYWNoZSAqYzsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiAKLQltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAoIW1ydCkKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwltcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spOwomIzQzOwlpZiAoIW1ydCkgewomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dFVE1JRkNOVF9JTjY6CiAJCXZyID0gKHN0cnVjdCBzaW9jX21pZl9yZXE2ICopYXJnOwotCQlpZiAodnItJmd0O21pZmkgJmd0Oz0gbXJ0LSZndDttYXh2aWYpCiYjNDM7CQlpZiAodnItJmd0O21pZmkgJmd0Oz0gbXJ0LSZndDttYXh2aWYpIHsKJiM0MzsJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJfQogCQl2ci0mZ3Q7bWlmaSA9IGFycmF5X2luZGV4X25vc3BlYyh2ci0mZ3Q7bWlmaSwgbXJ0LSZndDttYXh2aWYpOwotCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXZpZiA9ICZhbXA7bXJ0LSZndDt2aWZfdGFibGVbdnItJmd0O21pZmldOwogCQlpZiAoVklGX0VYSVNUUyhtcnQsIHZyLSZndDttaWZpKSkgewogCQkJdnItJmd0O2ljb3VudCA9IFJFQURfT05DRSh2aWYtJmd0O3BrdF9pbik7CkBAIC0xOTc0LDggJiM0MzsyMjAxLDYgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKQogCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiAJY2FzZSBTSU9DR0VUU0dDTlRfSU42OgogCQlzciA9IChzdHJ1Y3Qgc2lvY19zZ19yZXE2ICopYXJnOwotCi0JCXJjdV9yZWFkX2xvY2soKTsKIAkJYyA9IGlwNm1yX2NhY2hlX2ZpbmQobXJ0LCAmYW1wO3NyLSZndDtzcmMuc2luNl9hZGRyLAogCQkJCSAgICAgJmFtcDtzci0mZ3Q7Z3JwLnNpbjZfYWRkcik7CiAJCWlmIChjKSB7CkBAIC0xOTg4LDYgJiM0MzsyMjEzLDcgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKQogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCWRlZmF1bHQ6CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsKIAl9CiB9CkBAIC0yMDE1LDIxICYjNDM7MjI0MSwyMyBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKIAlzdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYgdnI7CiAJc3RydWN0IHZpZl9kZXZpY2UgKnZpZjsKIAlzdHJ1Y3QgbWZjNl9jYWNoZSAqYzsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiAKLQltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0mZ3Q7aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAoIW1ydCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dFVE1JRkNOVF9JTjY6CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmYW1wO3ZyLCBhcmcsIHNpemVvZih2cikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICh2ci5taWZpICZndDs9IG1ydC0mZ3Q7bWF4dmlmKQomIzQzOwkJcmN1X3JlYWRfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJCWlmICghbXJ0KSB7CiYjNDM7CQkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiYjNDM7CQlpZiAodnIubWlmaSAmZ3Q7PSBtcnQtJmd0O21heHZpZikgewomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQl9CiAJCXZyLm1pZmkgPSBhcnJheV9pbmRleF9ub3NwZWModnIubWlmaSwgbXJ0LSZndDttYXh2aWYpOwotCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXZpZiA9ICZhbXA7bXJ0LSZndDt2aWZfdGFibGVbdnIubWlmaV07CiAJCWlmIChWSUZfRVhJU1RTKG1ydCwgdnIubWlmaSkpIHsKIAkJCXZyLmljb3VudCA9IFJFQURfT05DRSh2aWYtJmd0O3BrdF9pbik7CkBAIC0yMDQ5LDYgJiM0MzsyMjc3LDExIEBAIGludCBpcDZtcl9jb21wYXRfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJcmN1X3JlYWRfbG9jaygpOwomIzQzOwkJbXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTsKJiM0MzsJCWlmICghbXJ0KSB7CiYjNDM7CQkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CQl9CiAJCWMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgJmFtcDtzci5zcmMuc2luNl9hZGRyLCAmYW1wO3NyLmdycC5zaW42X2FkZHIpOwogCQlpZiAoYykgewogCQkJc3IucGt0Y250ID0gYXRvbWljX2xvbmdfcmVhZCgmYW1wO2MtJmd0O19jLm1mY191bi5yZXMucGt0KTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg4NjYKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMDA1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50KioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIHNlZSBpZiBpdCB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlcy4gSXQmIzM5O3MgdG91Y2hpbmcgYG5ldC9pcHY2L2lwNm1yLmNgLCB3aGljaCB0ZWxscyBtZSB0aGlzIGNvbmNlcm5zIElQdjYgbXVsdGljYXN0IHJvdXRpbmcuCgpOb3csIGZvY3VzaW5nIG9uIHRoZSBjb3JlIGNoYW5nZXMsIGl0IGFwcGVhcnMgdGhpcyBwYXRjaCBpcyBhYm91dCBkeW5hbWljIHRhYmxlIG1hbmFnZW1lbnQgZm9yIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGBpcDZtcmApLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIGJlIG1vdmluZyBmcm9tIHByZS1hbGxvY2F0aW9uIG9yIGFsbG9jYXRpb24gZHVyaW5nIGBNUlQ2X1RBQkxFYCB0byBkeW5hbWljIGFsbG9jYXRpb24gdXNpbmcgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAgd2hlbiBgc2V0c29ja29wdGAgY2FsbHMgbGlrZSBgTVJUNl9JTklUYCwgYE1SVDZfQUREX01JRmAsIGFuZCBgTVJUNl9BRERfTUZDYCBhcmUgbWFkZS4gVGhlIHBhdGNoIGFsc28gaW50cm9kdWNlcyBkeW5hbWljIHRhYmxlIGRlc3RydWN0aW9uIChgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95YCkgd2hlbiB0YWJsZXMgYXJlIGVtcHR5LCB1bnJlZ2lzdGVyZWQsIG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkLgoKSSYjMzk7bSBub3RpbmcgdGhhdCB3aXRoaW4gYGlwNl9tcm91dGVfc2V0c29ja29wdGAgd2l0aCBgTVJUNl9UQUJMRWAsIHRoZSBjb2RlIG5vdyAqanVzdCogc2V0cyB0aGUgcG9pbnRlciBgcmF3Nl9zayhzayktJmd0O2lwNm1yX3RhYmxlID0gdjtgIHdpdGhvdXQgaW1tZWRpYXRlbHkgYWxsb2NhdGluZyB0aGUgdGFibGUsIGZ1cnRoZXIgcmVpbmZvcmNpbmcgdGhpcyBkeW5hbWljIGJlaGF2aW9yLiBBbHNvLCBpbiBgaXA2bXJfaW9jdGxgIGFuZCBgaXA2bXJfY29tcGF0X2lvY3RsYCwgaXQgbm93IGxvb2tzIHVwIHRoZSB0YWJsZSB1c2luZyBgaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKWAgdW5kZXIgYHJjdV9yZWFkX2xvY2soKWAgcmF0aGVyIHRoYW4gYW4gdXBmcm9udCBsb29rdXAuIExhc3RseSwgSSBzZWUgY2hhbmdlcyB0byBsb2NraW5nIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCwgd2l0aCBgaXA2bXJfZGVzdHJveV93b3JrYCBub3cgYmVpbmcgYWxsb2NhdGVkIHZpYSBga21hbGxvY19vYmooKmR3LCBHRlBfQVRPTUlDKWAuCgpNeSBuZXh0IG1ham9yIGNvbmNlcm4gaXMgdW5pbml0aWFsaXplZCBtZW1vcnkuIExldCYjMzk7cyBkaWcgaW4gaGVyZS4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGFsbG9jYXRpb24gYW5kIHVzZSBvZiBga21hbGxvY19vYmooKmR3LCBHRlBfQVRPTUlDKWAgd2l0aGluIGBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95YC4gRnJvbSB3aGF0IEkgc2VlIGluIHRoYXQgY29kZSwgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIGBpcDZtcl9kZXN0cm95X3dvcmtgIHN0cnVjdCAoYHdvcmtgLCBgbmV0YCwgYGlkYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgKmJlZm9yZSogdGhlIHdvcmsgaXMgcXVldWVkLiBUaGUgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCBvbmx5IHJlYWRzIGBkdy0mZ3Q7bmV0YCBhbmQgYGR3LSZndDtpZGAsIHRoZW4gZnJlZXMgYGR3YC4gVGhhdCBsb29rcyBzYWZlLgoKSSYjMzk7bGwgYWxzbyBxdWlja2x5IGNoZWNrIHRoYXQgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgJmFtcDtuZXdfdGFibGUpYCBpbml0aWFsaXplcyBgbmV3X3RhYmxlYCB0byBgZmFsc2VgIGFuZCBzZXRzIGl0IHRvIGB0cnVlYCBvbiBhbGxvY2F0aW9uIHN1Y2Nlc3MuIEkmIzM5O20gYWxzbyBnbGFuY2luZyBhdCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AsIHdoaWNoIGluaXRpYWxpemVzIGEgYm9vbGVhbiBgZW1wdHlgIGFuZCB0aGVuIGFzc2lnbnMgaXQgYmFzZWQgb24gYGxpc3RfZW1wdHlgIGNhbGxzIG9yIHNldHMgdG8gYHRydWVgLiBTaW1pbGFybHksIGBpcDZtcl9kZXZpY2VfZXZlbnRgIGluaXRpYWxpemVzIGB2aWZfZ29uZSA9IGZhbHNlO2AuCgpGaW5hbGx5LCB0aGUgaW9jdGwgYW5kIGNvbXBhdCBpb2N0bCBoYW5kbGluZyBjYXRjaGVzIG15IGF0dGVudGlvbi4gSW4gdGhlIHJlZ3VsYXIgaW9jdGwgKGBpcDZtcl9pb2N0bGApLCB0aGUgYXJndW1lbnRzIChgdnJgIGFuZCBgc3JgKSBhcmUgY2FzdC4gIEluIHRoZSBjb21wYXQgaW9jdGwgKGBpcDZtcl9jb21wYXRfaW9jdGxgKSwgdGhlIGRhdGEgZnJvbSB1c2VyIHNwYWNlIGlzIGNvcGllZCB2aWEgYGNvcHlfZnJvbV91c2VyYC4gIElmIHN1Y2Nlc3NmdWwsIHRoZSBtb2RpZmllZCB2YWx1ZXMgYXJlIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UgdXNpbmcgYGNvcHlfdG9fdXNlcmAuIEkgbmVlZCB0byBjb25maXJtIHdoZXRoZXIgdGhpcyBiZWhhdmlvciBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHByZS1wYXRjaCB2ZXJzaW9ucyB0byBhc3Nlc3MgYW55IHBvdGVudGlhbCBpc3N1ZXMgaGVyZS4gVGhpcyBkZXNlcnZlcyBhIGNsb3NlciBsb29rIGF0IHRoZSBvcmlnaW5hbCBjb2RlIHRvIGNvbmZpcm0uCgpHaXZlbiBteSBhbmFseXNpcywgSSBhbSBnb2luZyB0byBkZXRlcm1pbmUgaWYgdGhlIGNoYW5nZXMgYXJlIGVub3VnaCB0byB3YXJyYW50IGEgS01TQU4gZnV6emluZyBzZXNzaW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpcDZtcl9jb21wYXRfaW9jdGwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvaXB2Ni9pcDZtci5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9pcHY2L2lwNm1yLmM9MjIzMD1zdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYge1xuLS1cbm5ldC9pcHY2L2lwNm1yLmMtMjIzNy1cbm5ldC9pcHY2L2lwNm1yLmM6MjIzODppbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcbm5ldC9pcHY2L2lwNm1yLmMtMjIzOS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNzg3CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYGlwNm1yX2NvbXBhdF9pb2N0bGAqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBjb2RlLCBhbmQgSSBuZWVkIHRvIG1ha2UgYWJzb2x1dGVseSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJhY3Rpb24gYXJvdW5kIGBpcDZtcl9jb21wYXRfaW9jdGxgLiBMZXQmIzM5O3MgemVybyBpbiBvbiB0aGF0IHNlY3Rpb24sIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAyMjM4LiBJJiMzOTttIGdvaW5nIHRvIGNhcmVmdWxseSByZXZpZXcgdGhhdCBmdW5jdGlvbiB0byBtYWtlIGNlcnRhaW4gSSYjMzk7bSBub3QgbWlzc2luZyBhbnkgc3VidGxlIGRldGFpbHMgb3IgcG90ZW50aWFsIGVkZ2UgY2FzZXMuIE5lZWQgdG8gZ2V0IGEgcmVhbGx5IGdvb2QgaGFuZGxlIG9uIGhvdyB0aGlzIHRoaW5nIGlzIGFjdHVhbGx5IHdvcmtpbmcsIHNvIGxldCYjMzk7cyBzdGFydCB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvaXB2Ni9pcDZtci5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjIzOCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjM4Olx0aW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpXG4yMjM5Olx0e1xuMjI0MDpcdFx0c3RydWN0IGNvbXBhdF9zaW9jX3NnX3JlcTYgc3I7XG4yMjQxOlx0XHRzdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYgdnI7XG4yMjQyOlx0XHRzdHJ1Y3QgdmlmX2RldmljZSAqdmlmO1xuMjI0MzpcdFx0c3RydWN0IG1mYzZfY2FjaGUgKmM7XG4yMjQ0Olx0XHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbjIyNDU6XHRcbjIyNDY6XHRcdHN3aXRjaCAoY21kKSB7XG4yMjQ3Olx0XHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuMjI0ODpcdFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dnIsIGFyZywgc2l6ZW9mKHZyKSkpXG4yMjQ5Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4yMjUwOlx0XHRcdHJjdV9yZWFkX2xvY2soKTtcbjIyNTE6XHRcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbjIyNTI6XHRcdFx0aWYgKCFtcnQpIHtcbjIyNTM6XHRcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyNTQ6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjIyNTU6XHRcdFx0fVxuMjI1NjpcdFx0XHRpZiAodnIubWlmaSBcdTAwM2U9IG1ydC1cdTAwM2VtYXh2aWYpIHtcbjIyNTc6XHRcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyNTg6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIyNTk6XHRcdFx0fVxuMjI2MDpcdFx0XHR2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuMjI2MTpcdFx0XHR2aWYgPSBcdTAwMjZtcnQtXHUwMDNldmlmX3RhYmxlW3ZyLm1pZmldO1xuMjI2MjpcdFx0XHRpZiAoVklGX0VYSVNUUyhtcnQsIHZyLm1pZmkpKSB7XG4yMjYzOlx0XHRcdFx0dnIuaWNvdW50ID0gUkVBRF9PTkNFKHZpZi1cdTAwM2Vwa3RfaW4pO1xuMjI2NDpcdFx0XHRcdHZyLm9jb3VudCA9IFJFQURfT05DRSh2aWYtXHUwMDNlcGt0X291dCk7XG4yMjY1Olx0XHRcdFx0dnIuaWJ5dGVzID0gUkVBRF9PTkNFKHZpZi1cdTAwM2VieXRlc19pbik7XG4yMjY2Olx0XHRcdFx0dnIub2J5dGVzID0gUkVBRF9PTkNFKHZpZi1cdTAwM2VieXRlc19vdXQpO1xuMjI2NzpcdFx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuMjI2ODpcdFxuMjI2OTpcdFx0XHRcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcdTAwMjZ2ciwgc2l6ZW9mKHZyKSkpXG4yMjcwOlx0XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbjIyNzE6XHRcdFx0XHRyZXR1cm4gMDtcbjIyNzI6XHRcdFx0fVxuMjI3MzpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyNzQ6XHRcdFx0cmV0dXJuIC1FQUREUk5PVEFWQUlMO1xuMjI3NTpcdFx0Y2FzZSBTSU9DR0VUU0dDTlRfSU42OlxuMjI3NjpcdFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2c3IsIGFyZywgc2l6ZW9mKHNyKSkpXG4yMjc3Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4yMjc4Olx0XG4yMjc5Olx0XHRcdHJjdV9yZWFkX2xvY2soKTtcbjIyODA6XHRcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbjIyODE6XHRcdFx0aWYgKCFtcnQpIHtcbjIyODI6XHRcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyODM6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjIyODQ6XHRcdFx0fVxuMjI4NTpcdFx0XHRjID0gaXA2bXJfY2FjaGVfZmluZChtcnQsIFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFx1MDAyNnNyLmdycC5zaW42X2FkZHIpO1xuMjI4NjpcdFx0XHRpZiAoYykge1xuMjI4NzpcdFx0XHRcdHNyLnBrdGNudCA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLnBrdCk7XG4yMjg4Olx0XHRcdFx0c3IuYnl0ZWNudCA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLmJ5dGVzKTtcbjIyODk6XHRcdFx0XHRzci53cm9uZ19pZiA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLndyb25nX2lmKTtcbjIyOTA6XHRcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIyOTE6XHRcbjIyOTI6XHRcdFx0XHRpZiAoY29weV90b191c2VyKGFyZywgXHUwMDI2c3IsIHNpemVvZihzcikpKVxuMjI5MzpcdFx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4yMjk0Olx0XHRcdFx0cmV0dXJuIDA7XG4yMjk1Olx0XHRcdH1cbjIyOTY6XHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4yMjk3Olx0XHRcdHJldHVybiAtRUFERFJOT1RBVkFJTDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE5OTQKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiAzOTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIElQdjYgTXVsdGljYXN0IFJvdXRpbmcgQ29kZSBDaGFuZ2VzKioKCk9rYXksIHNvIGxvb2tpbmcgYXQgdGhpcyBgaXA2bXJfY29tcGF0X2lvY3RsYCBmdW5jdGlvbiwgdGhlIGNvZGUmIzM5O3MgYmVlbiByZW9yZ2FuaXplZC4gSXQgdXNlZCB0byBncmFiIHRoZSBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSAoYG1ydCA9IGlwNm1yX2dldF90YWJsZSguLi4pYCkgYmVmb3JlIGFueSB1c2VyIGRhdGEgY29weWluZy4gTm93LCBpdCBkb2VzIHRoZSBgY29weV9mcm9tX3VzZXJgICpmaXJzdCosIHRoZW4gbG9ja3MgUkNVLCBmaW5kcyB0aGUgdGFibGUsIGFuZCB0aGVuLCBpZiBpdCBleGlzdHMsIHByb2NlZWRzIHRvIHBvcHVsYXRlIHRoZSB1c2VyLXNwYWNlIGZpZWxkcyBhbmQgY29weSB0aGVtIGJhY2sg4oCTIGVzc2VudGlhbGx5IHRoZSBzYW1lIGVuZCByZXN1bHQgYXMgYmVmb3JlLCBqdXN0IGEgcmUtb3JkZXJpbmcuIFRoZSBnb29kIG5ld3MgaXMsIEkgZG9uJiMzOTt0IHNlZSBhbnkgb2J2aW91cyBpbnRyb2R1Y3Rpb24gb2YgdW5pbml0aWFsaXplZCBkYXRhLCB3aGljaCBpcyBhbHdheXMgYSBjcml0aWNhbCBjb25jZXJuIHdpdGggdGhlc2Ugc29ydHMgb2YgY2hhbmdlcy4gVGhhdCYjMzk7cyBhIHJlbGllZi4KCk5vdywgSSB3YW50IHRvIGRyaWxsIGRvd24gZnVydGhlciwgc28gSSBuZWVkIHRvIGNoZWNrIG91dCBgbXJfdGFibGVfYWxsb2NgIGFuZCB0aGUgYGlwNm1yX3RhYmxlX25vX3B1Ymxpc2hgIGZ1bmN0aW9uLiBMZXQmIzM5O3Mgc2VlLi4uIGxvb2tpbmcgYXQgdGhlIGNvZGUsIGl0IGxvb2tzIGxpa2UgYGlwNm1yX3RhYmxlX25vX3B1Ymxpc2hgIGlzIGEgY2FsbGJhY2sgdGhhdCBkb2VzIG5vdGhpbmcsIHdoaWNoIGlzIGZpbmUsIGVzcGVjaWFsbHkgaWYgaXQmIzM5O3MgdXNlZCAqd2hpbGUqIHRoZSB0YWJsZSBpcyBzdGlsbCB1bnB1Ymxpc2hlZCwgYXMgdGhlIGNvbW1lbnQgc3VnZ2VzdHMuIFdlIGNhbiBpZ25vcmUgdGhhdCBmb3Igbm93LgoKVGhlbiwgdGhlIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgIGZ1bmN0aW9uIHVzZXMgYF9faXA2bXJfZ2V0X3RhYmxlYCB0byBnZXQgdGhlIE1SVC4gSWYgaXQmIzM5O3Mgbm90IGZvdW5kLCBgbXJfdGFibGVfYWxsb2NgIGlzIGNhbGxlZCB0byBhbGxvY2F0ZSBhIG5ldyB0YWJsZS4gQWxyaWdodC4gYG1yX3RhYmxlX2FsbG9jYCBsb29rcyBsaWtlIHRoZSBwbGFjZSB3aGVyZSB0aGUgY29yZSB0YWJsZSBhbGxvY2F0aW9uIGhhcHBlbnMuIExldCYjMzk7cyBkaWcgZGVlcGVyLiBJIG5lZWQgdG8gZXhhbWluZSB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIGBtcl90YWJsZV9hbGxvY2AsIHByb2JhYmx5IGluIGBuZXQvaXB2NC9pcG1yX2Jhc2UuY2Agb3IgYSBzaW1pbGFyIGZpbGUuIEkgbmVlZCB0byBzZWUgZXhhY3RseSB3aGF0IG1lbW9yeSBpbml0aWFsaXphdGlvbiBpcyBkb25lIGR1cmluZyB0YWJsZSBjcmVhdGlvbi4gSXQmIzM5O3MgbGlrZWx5IHRoYXQgdGFibGUgYWxsb2NhdGlvbiBkb2VzIHNvbWUgaW5pdGlhbGl6YXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gdmVyaWZ5IHRoYXQgaW5pdGlhbGl6YXRpb24gdG8gY29uZmlybSB0aGF0IHRoZSBjaGFuZ2VzIGRvbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHZ1bG5lcmFiaWxpdGllcyB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgbXJfdGFibGUgXFwqbXJfdGFibGVfYWxsb2MmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjg1MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSHVudGluZyBEb3duIGBtcl90YWJsZV9hbGxvY2AqKgoKT2theSwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBsb2NhdGUgYG1yX3RhYmxlX2FsbG9jYC4gSW1tZWRpYXRlbHksIG15IG1pbmQgc3RhcnRzIHRvIG1hcCBvdXQgdGhlIHBvc3NpYmlsaXRpZXMuIFRoaXMgaXMgbGlrZWx5IGEgbWVtb3J5IHJlc291cmNlIGFsbG9jYXRpb24gZnVuY3Rpb24sIGp1ZGdpbmcgYnkgdGhlIHByZWZpeCAmIzM0O21yJiMzNDsgYW5kIHRoZSBzdWZmaXggJiMzNDthbGxvYyYjMzQ7LiBHaXZlbiB0aGUgcG90ZW50aWFsIHNjb3BlIG9mIGEgc3lzdGVtIGxpa2UgdGhpcywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGJlc3QgYXBwcm9hY2ggdG8gZmluZCBpdCBlZmZpY2llbnRseS4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBlbXBsb3kgYWxsIG15IHVzdWFsIHRyaWNrcy4gV2hlcmUgZG9lcyB0aGlzIGNvZGViYXNlIGxpa2VseSByZXNpZGU/IFdoYXQgbGlicmFyaWVzIHdvdWxkIGJlIGV4cGVjdGVkPyBJJiMzOTtkIGltbWVkaWF0ZWx5IGxlYW4gdG93YXJkcyBleGFtaW5pbmcgaGVhZGVyIGZpbGVzIGZpcnN0LiBBIHF1aWNrIGBncmVwYCAob3IgZXF1aXZhbGVudCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtKSBhY3Jvc3MgdGhlIHByb2plY3Qgd2l0aCBhIHBhdHRlcm4gdGhhdCBsb29rcyBmb3IgYSBkZWNsYXJhdGlvbiB3b3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIEkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gY2hlY2sgZm9yIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMgYXMgd2VsbC4gTWF5YmUgaXQmIzM5O3MgZGVmaW5lZCB3aXRoaW4gYW4gYCNpZmRlZmAgYmxvY2suCgpJZiB0aGUgZnVuY3Rpb24gaXNuJiMzOTt0IHJlYWRpbHkgYXBwYXJlbnQgaW4gdGhlIGhlYWRlcnMsIEkmIzM5O2xsIHN3aXRjaCB0byBsb29raW5nIGF0IHRoZSBzb3VyY2UgZmlsZXMgdGhlbXNlbHZlcy4gR2l2ZW4gaXRzIG5hbWUsIGl0JiMzOTtzIGxpa2VseSBhIHJlbGF0aXZlbHkgbG93LWxldmVsIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9uLCBzbyBJJiMzOTtsbCBwcmlvcml0aXplIGV4YW1pbmluZyBtb2R1bGVzIHJlbGF0ZWQgdG8gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSwgdGFibGUgc3RydWN0dXJlcywgYW5kIGFueSBhc3NvY2lhdGVkIHJlc291cmNlIG1hbmFnZW1lbnQgb3IgYWxsb2NhdGlvbiBsYXllcnMuIEkmIzM5O2xsIGhhdmUgdG8ga2VlcCBpbiBtaW5kLCBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbSwgaXQgbWF5IGJlIGEgbW9yZSBnZW5lcmFsLXB1cnBvc2Ugcm91dGluZS4KCkkgc2hvdWxkIGFsc28gY29uc2lkZXIgd2hldGhlciBpdCYjMzk7cyBwYXJ0IG9mIGEgdGhpcmQtcGFydHkgbGlicmFyeS4gSWYgc28sIEnigJlsbCBuZWVkIHRvIGZhbWlsaWFyaXplIG15c2VsZiB3aXRoIGl0cyBkb2N1bWVudGF0aW9uIGFuZCBidWlsZCBwcm9jZXNzIHRvIHNlZSBpZiBJIGNhbiBuYXJyb3cgZG93biB3aGVyZSBpdCYjMzk7cyBpbmNsdWRlZC4KCkkgY2FuIGFsc28gaW1hZ2luZSB0aGVyZSBhcmUgc3RhdGljIGFuYWx5c2lzIHRvb2xzIHRoYXQgY291bGQgYXNzaXN0LiBBIHN5bWJvbCBsb29rdXAgZnJvbSBhIGRlYnVnZ2VyIGlmIHRoYXQmIzM5O3MgYXZhaWxhYmxlIHdvdWxkIHNwZWVkIHRoaW5ncyBhbG9uZy4gVGhlIGdvYWwgaGVyZSBpcyBlZmZpY2llbmN5IGFuZCBwcmVjaXNpb24uIEkmIzM5O2xsIG5lZWQgdG8gYmFsYW5jZSBzcGVlZCBhbmQgYWNjdXJhY3kgaW4gbXkgc2VhcmNoLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBjb25zaWRlciB0aGUgY29udGV4dCBvZiB0aGUgdXNhZ2UgYXMgdGhhdCB3aWxsIGFsc28gbGlrZWx5IGd1aWRlIG15IHByb2Nlc3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE1OjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21yX3RhYmxlX2FsbG9jXFwoJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvbXJvdXRlX2Jhc2UuaD0yODA9c3RydWN0IG1yX3RhYmxlICpcbmluY2x1ZGUvbGludXgvbXJvdXRlX2Jhc2UuaDoyODE6bXJfdGFibGVfYWxsb2Moc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQsXG5pbmNsdWRlL2xpbnV4L21yb3V0ZV9iYXNlLmgtMjgyLVx0ICAgICAgIHN0cnVjdCBtcl90YWJsZV9vcHMgKm9wcyxcbi0tXG5uZXQvaXB2NC9pcG1yLmM9NDI2PXN0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwbXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuLS1cbm5ldC9pcHY0L2lwbXIuYy00MzctXG5uZXQvaXB2NC9pcG1yLmM6NDM4Olx0cmV0dXJuIG1yX3RhYmxlX2FsbG9jKG5ldCwgaWQsIFx1MDAyNmlwbXJfbXJfdGFibGVfb3BzLFxubmV0L2lwdjQvaXBtci5jLTQzOS1cdFx0XHQgICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcG1yX25ld190YWJsZV9zZXQpO1xuLS1cbm5ldC9pcHY0L2lwbXJfYmFzZS5jPTQ1PXN0cnVjdCBtcl90YWJsZSAqXG5uZXQvaXB2NC9pcG1yX2Jhc2UuYzo0Njptcl90YWJsZV9hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBpZCxcbm5ldC9pcHY0L2lwbXJfYmFzZS5jLTQ3LVx0ICAgICAgIHN0cnVjdCBtcl90YWJsZV9vcHMgKm9wcyxcbi0tXG5uZXQvaXB2Ni9pcDZtci5jPTQxNT1zdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXG4tLVxubmV0L2lwdjYvaXA2bXIuYy00MjItXG5uZXQvaXB2Ni9pcDZtci5jOjQyMzpcdHJldHVybiBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcdTAwMjZpcDZtcl9tcl90YWJsZV9vcHMsXG5uZXQvaXB2Ni9pcDZtci5jLTQyNC1cdFx0XHQgICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl9uZXdfdGFibGVfc2V0KTtcbi0tXG5uZXQvaXB2Ni9pcDZtci5jPTQzMj1zdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc3RydWN0IHNvY2sgKnNrLFxuLS1cbm5ldC9pcHY2L2lwNm1yLmMtNDQ1LVxubmV0L2lwdjYvaXA2bXIuYzo0NDY6XHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcdTAwMjZpcDZtcl9tcl90YWJsZV9vcHMsXG5uZXQvaXB2Ni9pcDZtci5jLTQ0Ny1cdFx0XHQgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2gpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzg2MQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246CgoqKkRpdmluZyBpbnRvIHRoZSBJUHY0IE11bHRpY2FzdCBSb3V0ZXIgQ29kZSoqCgpPa2F5LCB0aW1lIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIHRoaXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZXMgYXJlIGFsbG9jYXRlZCwgc28gbGV0JiMzOTtzIHplcm8gaW4gb24gYG1yX3RhYmxlX2FsbG9jYC4gVGhhdCYjMzk7cyB0aGUgZnVuY3Rpb24gSSBuZWVkIHRvIGludmVzdGlnYXRlLCBhbmQgaXQgbGl2ZXMgaW4gYG5ldC9pcHY0L2lwbXJfYmFzZS5jYC4gSSYjMzk7bSBnb2luZyB0byBzdGFydCB0aGVyZSBhbmQgc2VlIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIHdoYXQgaXQgaW50ZXJhY3RzIHdpdGgsIGFuZCBob3cgaXQgaGFuZGxlcyBtZW1vcnkgYWxsb2NhdGlvbiwgYW55IHNwaW5sb2NrcywgYW5kIG90aGVyIGNvbmN1cnJlbnQgYWNjZXNzLiBJIGV4cGVjdCB0byBiZSBkaWdnaW5nIGRlZXAgaW50byB0aGUgaW50cmljYWNpZXMgb2Yga2VybmVsIGRhdGEgc3RydWN0dXJlcyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdG8gZ2V0IGEgY29tcGxldGUgcGljdHVyZS4gVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCB3b3JrIGJlZ2lucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvaXB2NC9pcG1yX2Jhc2UuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgNDU6XHRzdHJ1Y3QgbXJfdGFibGUgKlxuICA0NjpcdG1yX3RhYmxlX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkLFxuICA0NzpcdFx0ICAgICAgIHN0cnVjdCBtcl90YWJsZV9vcHMgKm9wcyxcbiAgNDg6XHRcdCAgICAgICB2b2lkICgqZXhwaXJlX2Z1bmMpKHN0cnVjdCB0aW1lcl9saXN0ICp0KSxcbiAgNDk6XHRcdCAgICAgICB2b2lkICgqdGFibGVfc2V0KShzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcbiAgNTA6XHRcdFx0XHRcdCBzdHJ1Y3QgbmV0ICpuZXQpKVxuICA1MTpcdHtcbiAgNTI6XHRcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuICA1MzpcdFx0aW50IGVycjtcbiAgNTQ6XHRcbiAgNTU6XHRcdG1ydCA9IGt6YWxsb2Nfb2JqKCptcnQpO1xuICA1NjpcdFx0aWYgKCFtcnQpXG4gIDU3Olx0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuICA1ODpcdFx0bXJ0LVx1MDAzZWlkID0gaWQ7XG4gIDU5Olx0XHR3cml0ZV9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQsIG5ldCk7XG4gIDYwOlx0XG4gIDYxOlx0XHRtcnQtXHUwMDNlb3BzID0gKm9wcztcbiAgNjI6XHRcdGVyciA9IHJobHRhYmxlX2luaXQoXHUwMDI2bXJ0LVx1MDAzZW1mY19oYXNoLCBtcnQtXHUwMDNlb3BzLnJodF9wYXJhbXMpO1xuICA2MzpcdFx0aWYgKGVycikge1xuICA2NDpcdFx0XHRrZnJlZShtcnQpO1xuICA2NTpcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuICA2NjpcdFx0fVxuICA2NzpcdFxuICA2ODpcdFx0SU5JVF9SQ1VfV09SSyhcdTAwMjZtcnQtXHUwMDNld29yaywgX19tcl9mcmVlX3RhYmxlKTtcbiAgNjk6XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNm1ydC1cdTAwM2VtZmNfY2FjaGVfbGlzdCk7XG4gIDcwOlx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtcnQtXHUwMDNlbWZjX3VucmVzX3F1ZXVlKTtcbiAgNzE6XHRcbiAgNzI6XHRcdHRpbWVyX3NldHVwKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lciwgZXhwaXJlX2Z1bmMsIDApO1xuICA3MzpcdFxuICA3NDpcdFx0bXJ0LVx1MDAzZW1yb3V0ZV9yZWdfdmlmX251bSA9IC0xO1xuICA3NTpcdFx0dGFibGVfc2V0KG1ydCwgbmV0KTtcbiAgNzY6XHRcdHJldHVybiBtcnQ7XG4gIDc3Olx0fVxuICA3ODpcdFxuICA3OTpcdHZvaWQgKm1yX21mY19maW5kX3BhcmVudChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgdm9pZCAqaGFzaGFyZywgaW50IHBhcmVudClcbiAgODA6XHR7XG4gIDgxOlx0XHRzdHJ1Y3QgcmhsaXN0X2hlYWQgKnRtcCwgKmxpc3Q7XG4gIDgyOlx0XHRzdHJ1Y3QgbXJfbWZjICpjO1xuICA4MzpcdFxuICA4NDpcdFx0bGlzdCA9IHJobHRhYmxlX2xvb2t1cChcdTAwMjZtcnQtXHUwMDNlbWZjX2hhc2gsIGhhc2hhcmcsICptcnQtXHUwMDNlb3BzLnJodF9wYXJhbXMpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNToyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDY4OQoJCQkJCQkJb3V0cHV0OiAyNzcKCQkJCQkJCXRob3VnaHRzOiAyNzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgYG1yX3RhYmxlYCBDaGFuZ2VzKioKCk9rYXksIHNvIGBtcl90YWJsZV9hbGxvY2AgdXNlcyBga3phbGxvY19vYmpgIG9uIHRoZSBgc3RydWN0IG1yX3RhYmxlYC4gVGhhdCYjMzk7cyBnb29kIOKAkyBpdCBtZWFucyB0aGUgZW50aXJlIHN0cnVjdHVyZSBpcyB6ZXJvLWluaXRpYWxpemVkIHJpZ2h0IG9mZiB0aGUgYmF0LiBObyB1bmluaXRpYWxpemVkIGdhcmJhZ2UgbGVmdCBsaW5nZXJpbmcgdGhlcmUuIE5vdywgbGV0JiMzOTtzIHRoaW5rIGFib3V0IHdoZXJlIGVsc2UgdGhpcyB0aGluZyBpcyB0b3VjaGVkLiBEZXN0cnVjdGlvbiwgcmVmY291bnRpbmcsIFJDVSwgbG9ja2luZywgbGlzdCBtYW5hZ2VtZW504oCmIGNsYXNzaWMgbWVtb3J5IGxpZmV0aW1lIGlzc3Vlcywgc3luY2hyb25pemF0aW9uLCBhbmQgUkNVIG1hbmFnZW1lbnQgZml4ZXMsIGFzIGV4cGVjdGVkLiBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcyBvciB1c2UtYWZ0ZXItZnJlZSBzaXR1YXRpb25zIHdoZW4gbXVsdGljYXN0IHRhYmxlcyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KCkFueSBidWdzIHRoYXQgKmNvdWxkKiBwb3AgdXAgaGVyZSB3b3VsZCBsaWtlbHkgYmUgc3RhbmRhcmQ6IHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZS1mcmVlLCB3aGljaCBLQVNBTiBzaG91bGQgbmFpbDsgbG9ja2luZyBwcm9ibGVtcyBvciBkZWFkbG9ja3MsIExPQ0tERVAgd2lsbCBjYXRjaCB0aG9zZTsgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlcyBvciBkb2RneSBlcnJvciBoYW5kbGluZywgc3RhbmRhcmQga2VybmVsIGNoZWNrcyBhbmQgS0FTQU4gd291bGQgdGFrZSBjYXJlIG9mIHRoYXQ7IGFuZCwgZmluYWxseSwgbWVtb3J5IGxlYWtzLCB3aGljaCBLTUVNTEVBSyBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZXhwb3NlLgoKQ3J1Y2lhbGx5LCBmcm9tIG15IGV4cGVydCBwb2ludCBvZiB2aWV3LCBub25lIG9mIHRoZXNlIGNoYW5nZXMgc2VlbSB0byBpbnRyb2R1Y2UgKmFueSogcmlza3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgYW55IHBvdGVudGlhbCBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2VyIHNwYWNlLiBBbGwgdGhlIG5ldyBvciBtb2RpZmllZCB2YXJpYWJsZXMg4oCTIHN0YWNrIGFuZCBoZWFwIOKAkyBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIGBrbWFsbG9jX29iamAgd2l0aCBleHBsaWNpdCBmaWVsZCBpbml0aWFsaXphdGlvbiwgYGt6YWxsb2Nfb2JqYCwgb3IgemVyby1pbml0aWFsaXplZCBwcmltaXRpdmVzLiBTbywgbm8gc3VycHJpc2VzIHRoZXJlLgoKVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IHRyaWdnZXIgYW55IG9mIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBwaXRmYWxscyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4mIzM5O3MgYXR0ZW50aW9uLiBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHN0YW5kYXJkIEtBU0FOIGFuZCBMT0NLREVQIHRlc3RpbmcgYXJlIG1vcmUgdGhhbiBzdWZmaWNpZW50IHRvIGNvdmVyIHRoaXMuIEkmIzM5O20gZ29pbmcgdG8gc2V0IGBOZWVkc0tNU0FOPWZhbHNlYCB3aXRoIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24uIFRoYXQmIzM5O3MgbXkgY2FsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTU6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50IChuZXQvaXB2Ni9pcDZtci5jKSB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0YWJsZXMgb24gZGVtYW5kIHdoZW4gc29ja2V0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgYW5kIHRvIGRlc3Ryb3kgdGhlbSB3aGVuIHRoZXkgYmVjb21lIHVucmVmZXJlbmNlZCBvciBlbXB0eS5cblxuLSBNZW1vcnkgQWxsb2NhdGlvbnM6IE5ldyBkeW5hbWljIGFsbG9jYXRpb25zIChzdWNoIGFzIGBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrYCBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jX29iamApIGhhdmUgYWxsIG1lbWJlciBmaWVsZHMgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFRoZSB1bmRlcmx5aW5nIG11bHRpY2FzdCB0YWJsZXMgYWxsb2NhdGVkIHZpYSBgbXJfdGFibGVfYWxsb2MoKWAgdXNlIGBremFsbG9jX29iaigpYC5cbi0gRGF0YSBzZW50IHRvIHVzZXIgc3BhY2U6IGlvY3RsL2NvbXBhdF9pb2N0bCBhbmQgZ2V0c29ja29wdCBoYW5kbGVycyBvbmx5IGNvcHkgZXhwbGljaXRseSBpbml0aWFsaXplZCBmaWVsZHMgb3IgZGF0YSBjb3BpZWQgZnJvbSB1c2VyIHNwYWNlIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRob3V0IGxlYXZpbmcgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHJlYWRpbmcgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuLSBDb250cm9sIGZsb3cgYW5kIExpZmV0aW1lczogQ2hhbmdlcyBhZmZlY3QgdGFibGUgbGlmZWN5Y2xlLCBSQ1Ugc3luY2hyb25pemF0aW9uLCBsaXN0IG1hbmlwdWxhdGlvbnMsIGFuZCBsb2NraW5nIChSVE5ML21ydF9sb2NrKS4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGVzZSBwYXRocyBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGFjY2Vzcywgb3IgbWVtb3J5IGxlYWtzLCB3aGljaCBhcmUgaGFuZGxlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIEtNRU1MRUFLLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCwgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQgKG5ldC9pcHY2L2lwNm1yLmMpIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRhYmxlcyBvbiBkZW1hbmQgd2hlbiBzb2NrZXQgb3B0aW9ucyBhcmUgY29uZmlndXJlZCBhbmQgdG8gZGVzdHJveSB0aGVtIHdoZW4gdGhleSBiZWNvbWUgdW5yZWZlcmVuY2VkIG9yIGVtcHR5LlxuXG4tIE1lbW9yeSBBbGxvY2F0aW9uczogTmV3IGR5bmFtaWMgYWxsb2NhdGlvbnMgKHN1Y2ggYXMgYHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmtgIGFsbG9jYXRlZCB2aWEgYGttYWxsb2Nfb2JqYCkgaGF2ZSBhbGwgbWVtYmVyIGZpZWxkcyAoYHdvcmtgLCBgbmV0YCwgYGlkYCkgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gVGhlIHVuZGVybHlpbmcgbXVsdGljYXN0IHRhYmxlcyBhbGxvY2F0ZWQgdmlhIGBtcl90YWJsZV9hbGxvYygpYCB1c2UgYGt6YWxsb2Nfb2JqKClgLlxuLSBEYXRhIHNlbnQgdG8gdXNlciBzcGFjZTogaW9jdGwvY29tcGF0X2lvY3RsIGFuZCBnZXRzb2Nrb3B0IGhhbmRsZXJzIG9ubHkgY29weSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGZpZWxkcyBvciBkYXRhIGNvcGllZCBmcm9tIHVzZXIgc3BhY2UgYmFjayB0byB1c2VyIHNwYWNlIHdpdGhvdXQgbGVhdmluZyB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgcmVhZGluZyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuXG4tIENvbnRyb2wgZmxvdyBhbmQgTGlmZXRpbWVzOiBDaGFuZ2VzIGFmZmVjdCB0YWJsZSBsaWZlY3ljbGUsIFJDVSBzeW5jaHJvbml6YXRpb24sIGxpc3QgbWFuaXB1bGF0aW9ucywgYW5kIGxvY2tpbmcgKFJUTkwvbXJ0X2xvY2spLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoZXNlIHBhdGhzIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgYWNjZXNzLCBvciBtZW1vcnkgbGVha3MsIHdoaWNoIGFyZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgS01FTUxFQUsuXG5cblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBpbnRyb2R1Y2VkLCBzbyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjE6NTcuMzQ3MTk5NjhaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MDkyNzI3Njg1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJUFY2XCIsXG4gICAgXCJJUFY2X01ST1VURVwiLFxuICAgIFwiSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaXA2X21yb3V0ZV9zZXRzb2Nrb3B0XCIsXG4gICAgXCJpcDZfbXJvdXRlX2dldHNvY2tvcHRcIixcbiAgICBcImlwNm1yX2lvY3RsXCIsXG4gICAgXCJpcDZtcl9jb21wYXRfaW9jdGxcIixcbiAgICBcImlwNm1yX3NrX2RvbmVcIixcbiAgICBcImlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZVwiLFxuICAgIFwiaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZVwiLFxuICAgIFwiaXA2bXJfZGVzdHJveV93b3JrZm5cIixcbiAgICBcImlwNm1yX2RldmljZV9ldmVudFwiLFxuICAgIFwiaXBtcl9leHBpcmVfcHJvY2Vzc1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgSVB2NiBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50IChuZXQvaXB2Ni9pcDZtci5jKSB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0YWJsZXMgb24gZGVtYW5kIHdoZW4gc29ja2V0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgYW5kIHRvIGRlc3Ryb3kgdGhlbSB3aGVuIHRoZXkgYmVjb21lIHVucmVmZXJlbmNlZCBvciBlbXB0eS5cXG5cXG4tIE1lbW9yeSBBbGxvY2F0aW9uczogTmV3IGR5bmFtaWMgYWxsb2NhdGlvbnMgKHN1Y2ggYXMgYHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmtgIGFsbG9jYXRlZCB2aWEgYGttYWxsb2Nfb2JqYCkgaGF2ZSBhbGwgbWVtYmVyIGZpZWxkcyAoYHdvcmtgLCBgbmV0YCwgYGlkYCkgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gVGhlIHVuZGVybHlpbmcgbXVsdGljYXN0IHRhYmxlcyBhbGxvY2F0ZWQgdmlhIGBtcl90YWJsZV9hbGxvYygpYCB1c2UgYGt6YWxsb2Nfb2JqKClgLlxcbi0gRGF0YSBzZW50IHRvIHVzZXIgc3BhY2U6IGlvY3RsL2NvbXBhdF9pb2N0bCBhbmQgZ2V0c29ja29wdCBoYW5kbGVycyBvbmx5IGNvcHkgZXhwbGljaXRseSBpbml0aWFsaXplZCBmaWVsZHMgb3IgZGF0YSBjb3BpZWQgZnJvbSB1c2VyIHNwYWNlIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRob3V0IGxlYXZpbmcgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHJlYWRpbmcgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5Llxcbi0gQ29udHJvbCBmbG93IGFuZCBMaWZldGltZXM6IENoYW5nZXMgYWZmZWN0IHRhYmxlIGxpZmVjeWNsZSwgUkNVIHN5bmNocm9uaXphdGlvbiwgbGlzdCBtYW5pcHVsYXRpb25zLCBhbmQgbG9ja2luZyAoUlROTC9tcnRfbG9jaykuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhlc2UgcGF0aHMgaW52b2x2ZSB1c2UtYWZ0ZXItZnJlZSwgY29uY3VycmVudCBhY2Nlc3MsIG9yIG1lbW9yeSBsZWFrcywgd2hpY2ggYXJlIGhhbmRsZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBLTUVNTEVBSy5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCwgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGlwNm1yKSB0YWJsZSBsaWZlY3ljbGUgYW5kIGxvY2tpbmcuIEl0IGFkZHMgZHluYW1pYyB0YWJsZSBhbGxvY2F0aW9uLCBhc3luY2hyb25vdXMgdGFibGUgZGVzdHJ1Y3Rpb24gdmlhIHdvcmtxdWV1ZXMsIGFuZCB1cGRhdGVzIHNldHNvY2tvcHQsIGdldHNvY2tvcHQsIGlvY3RsLCB0aW1lciBleHBpcmF0aW9uLCBhbmQgbmV0ZGV2IG5vdGlmaWVyIGhhbmRsaW5nLiBUaGVzZSBwYXRocyBhcmUgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgcmF3IElQdjYgc29ja2V0cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjE6NTcuMzQ3MjA4NTdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyNDc2NTk3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDUyMWMwYjAyYTY4MTQyMDBiMGVlYjIwYWFmMTNjNWQ4NGU5OGZlNWJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFN1biBTZXAgNiAxNToyMTo1NiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZtci5jIGIvbmV0L2lwdjYvaXA2bXIuY1xcbmluZGV4IDNmMmVkOWI3N2RlYjUuLjI2YmQyY2NkNDIwMWEgMTAwNjQ0XFxuLS0tIGEvbmV0L2lwdjYvaXA2bXIuY1xcbisrKyBiL25ldC9pcHY2L2lwNm1yLmNcXG5AQCAtMjgsNiArMjgsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGF0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9yaGFzaHRhYmxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC93b3JrcXVldWUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY25ldC9wcm90b2NvbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2tidWZmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NuZXQvcmF3LmhcXHUwMDNlXFxuQEAgLTM2OCw2ICszNjksMTIgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxcbiBcXHRyZXR1cm4gbXJ0O1xcbiB9XFxuIFxcbitzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9sb29rdXBfc2tfdGFibGUoc3RydWN0IHNvY2sgKnNrKVxcbit7XFxuK1xcdHJldHVybiBfX2lwNm1yX2dldF90YWJsZShzb2NrX25ldChzayksXFxuK1xcdFxcdFxcdFxcdCByYXc2X3NrKHNrKS1cXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcXG4rfVxcbitcXG4gc3RhdGljIGludCBpcDZtcl9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLFxcbiBcXHRcXHRcXHQgIGNvbnN0IHZvaWQgKnB0cilcXG4ge1xcbkBAIC00MTcsNiArNDI0LDEyNCBAQCBzdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXFxuIFxcdFxcdFxcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpO1xcbiB9XFxuIFxcbisvKiB0YWJsZV9zZXQgY2FsbGJhY2sgdXNlZCB3aGlsZSB0aGUgbmV3IHRhYmxlIGlzIHN0aWxsIHVucHVibGlzaGVkLiAqL1xcbitzdGF0aWMgdm9pZCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBzdHJ1Y3QgbmV0ICpuZXQpXFxuK3tcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlKHN0cnVjdCBzb2NrICpzayxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIGJvb2wgKm5ld190YWJsZSlcXG4re1xcbitcXHR1MzIgaWQgPSByYXc2X3NrKHNrKS1cXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUO1xcbitcXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XFxuK1xcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbitcXG4rXFx0QVNTRVJUX1JUTkwoKTtcXG4rXFx0Km5ld190YWJsZSA9IGZhbHNlO1xcbitcXG4rXFx0bXJ0ID0gX19pcDZtcl9nZXRfdGFibGUobmV0LCBpZCk7XFxuK1xcdGlmIChtcnQpXFxuK1xcdFxcdHJldHVybiBtcnQ7XFxuK1xcbitcXHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcXHUwMDI2aXA2bXJfbXJfdGFibGVfb3BzLFxcbitcXHRcXHRcXHQgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2gpO1xcbitcXHRpZiAoIUlTX0VSUihtcnQpKVxcbitcXHRcXHQqbmV3X3RhYmxlID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIG1ydDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgaXA2bXJfcHVibGlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlKVxcbit7XFxuK1xcdGlmIChuZXdfdGFibGUpXFxuK1xcdFxcdGlwNm1yX25ld190YWJsZV9zZXQobXJ0LCByZWFkX3BuZXQoXFx1MDAyNm1ydC1cXHUwMDNlbmV0KSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQpXFxuK3tcXG4rXFx0QVNTRVJUX1JUTkwoKTtcXG4rXFxuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxuK1xcdGlmIChtcnQtXFx1MDAzZWlkID09IFJUNl9UQUJMRV9ERkxUKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdC8qIE5lc3RlZCBORVRERVZfVU5SRUdJU1RFUiBtYXkgYWxyZWFkeSBoYXZlIHVubGlua2VkIHRoaXMgdGFibGUuICovXFxuK1xcdGlmIChfX2lwNm1yX2dldF90YWJsZShyZWFkX3BuZXQoXFx1MDAyNm1ydC1cXHUwMDNlbmV0KSwgbXJ0LVxcdTAwM2VpZCkgIT0gbXJ0KVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC1cXHUwMDNlbXJvdXRlX3NrKSB8fFxcbitcXHQgICAgbXJ0LVxcdTAwM2VtYXh2aWYgfHxcXG4rXFx0ICAgICFsaXN0X2VtcHR5KFxcdTAwMjZtcnQtXFx1MDAzZW1mY19jYWNoZV9saXN0KSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0c3Bpbl9sb2NrX2JoKFxcdTAwMjZtZmNfdW5yZXNfbG9jayk7XFxuK1xcdGlmICghbGlzdF9lbXB0eShcXHUwMDI2bXJ0LVxcdTAwM2VtZmNfdW5yZXNfcXVldWUpKSB7XFxuK1xcdFxcdHNwaW5fdW5sb2NrX2JoKFxcdTAwMjZtZmNfdW5yZXNfbG9jayk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRzcGluX3VubG9ja19iaChcXHUwMDI2bWZjX3VucmVzX2xvY2spO1xcbitcXG4rXFx0bGlzdF9kZWxfcmN1KFxcdTAwMjZtcnQtXFx1MDAzZWxpc3QpO1xcbitcXHR0aW1lcl9zaHV0ZG93bl9zeW5jKFxcdTAwMjZtcnQtXFx1MDAzZWlwbXJfZXhwaXJlX3RpbWVyKTtcXG4rXFx0bXJfdGFibGVfZnJlZShtcnQpO1xcbisjZW5kaWZcXG4rfVxcbitcXG4rI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcXG4rc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrO1xcbitcXHRzdHJ1Y3QgbmV0ICpuZXQ7XFxuK1xcdHUzMiBpZDtcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrICpkdyA9XFxuK1xcdFxcdGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrLCB3b3JrKTtcXG4rXFx0c3RydWN0IG1yX3RhYmxlICptcnQ7XFxuK1xcbitcXHRydG5sX2xvY2soKTtcXG4rXFx0bXJ0ID0gX19pcDZtcl9nZXRfdGFibGUoZHctXFx1MDAzZW5ldCwgZHctXFx1MDAzZWlkKTtcXG4rXFx0aWYgKG1ydClcXG4rXFx0XFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xcbitcXHRydG5sX3VubG9jaygpO1xcbitcXHRwdXRfbmV0KGR3LVxcdTAwM2VuZXQpO1xcbitcXHRrZnJlZShkdyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpXFxuK3tcXG4rXFx0c3RydWN0IG5ldCAqbmV0ID0gcmVhZF9wbmV0KFxcdTAwMjZtcnQtXFx1MDAzZW5ldCk7XFxuK1xcdHN0cnVjdCBpcDZtcl9kZXN0cm95X3dvcmsgKmR3O1xcbitcXG4rXFx0aWYgKG1ydC1cXHUwMDNlaWQgPT0gUlQ2X1RBQkxFX0RGTFQpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGR3ID0ga21hbGxvY19vYmooKmR3LCBHRlBfQVRPTUlDKTtcXG4rXFx0aWYgKCFkdykge1xcbitcXHRcXHRtb2RfdGltZXIoXFx1MDAyNm1ydC1cXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgKyBIWik7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRpZiAoIW1heWJlX2dldF9uZXQobmV0KSkge1xcbitcXHRcXHRrZnJlZShkdyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRJTklUX1dPUksoXFx1MDAyNmR3LVxcdTAwM2V3b3JrLCBpcDZtcl9kZXN0cm95X3dvcmtmbik7XFxuK1xcdGR3LVxcdTAwM2VuZXQgPSBuZXQ7XFxuK1xcdGR3LVxcdTAwM2VpZCA9IG1ydC1cXHUwMDNlaWQ7XFxuK1xcdHF1ZXVlX3dvcmsoc3lzdGVtX2RmbF93cSwgXFx1MDAyNmR3LVxcdTAwM2V3b3JrKTtcXG4rfVxcbisjZWxzZVxcbitzdGF0aWMgdm9pZCBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxcbit7XFxuK31cXG4rI2VuZGlmXFxuK1xcbitzdGF0aWMgaW50IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlLFxcbitcXHRcXHRcXHRcXHQgIGludCBlcnIpXFxuK3tcXG4rXFx0aWYgKG5ld190YWJsZSBcXHUwMDI2XFx1MDAyNiBlcnIpXFxuK1xcdFxcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgaXA2bXJfZnJlZV90YWJsZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcXG4gXFx0XFx0XFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfa2lsbF9saXN0KVxcbiB7XFxuQEAgLTg2NiwxNiArOTkxLDI1IEBAIHN0YXRpYyB2b2lkIGlwbXJfZG9fZXhwaXJlX3Byb2Nlc3Moc3RydWN0IG1yX3RhYmxlICptcnQpXFxuIHN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpXFxuIHtcXG4gXFx0c3RydWN0IG1yX3RhYmxlICptcnQgPSB0aW1lcl9jb250YWluZXJfb2YobXJ0LCB0LCBpcG1yX2V4cGlyZV90aW1lcik7XFxuK1xcdGJvb2wgZW1wdHkgPSBmYWxzZTtcXG4gXFxuIFxcdGlmICghc3Bpbl90cnlsb2NrKFxcdTAwMjZtZmNfdW5yZXNfbG9jaykpIHtcXG4gXFx0XFx0bW9kX3RpbWVyKFxcdTAwMjZtcnQtXFx1MDAzZWlwbXJfZXhwaXJlX3RpbWVyLCBqaWZmaWVzICsgMSk7XFxuIFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZtcnQtXFx1MDAzZW1mY191bnJlc19xdWV1ZSkpXFxuK1xcdGlmICghbGlzdF9lbXB0eShcXHUwMDI2bXJ0LVxcdTAwM2VtZmNfdW5yZXNfcXVldWUpKSB7XFxuIFxcdFxcdGlwbXJfZG9fZXhwaXJlX3Byb2Nlc3MobXJ0KTtcXG4rXFx0XFx0ZW1wdHkgPSBsaXN0X2VtcHR5KFxcdTAwMjZtcnQtXFx1MDAzZW1mY191bnJlc19xdWV1ZSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdC8qIFJldHJ5IGFmdGVyIEdGUF9BVE9NSUMgYWxsb2NhdGlvbiBmYWlsdXJlLiAqL1xcbitcXHRcXHRlbXB0eSA9IHRydWU7XFxuK1xcdH1cXG4gXFxuIFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZtZmNfdW5yZXNfbG9jayk7XFxuK1xcbitcXHRpZiAoZW1wdHkpXFxuK1xcdFxcdGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3kobXJ0KTtcXG4gfVxcbiBcXG4gLyogRmlsbCBvaWZzIGxpc3QuIEl0IGlzIGNhbGxlZCB1bmRlciBsb2NrZWQgbXJ0X2xvY2suICovXFxuQEAgLTEyOTAsMTkgKzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxcbiB7XFxuIFxcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTtcXG4gXFx0c3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpO1xcbisjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xcbitcXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgKm5leHQ7XFxuKyNlbHNlXFxuIFxcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbisjZW5kaWZcXG4gXFx0c3RydWN0IHZpZl9kZXZpY2UgKnY7XFxuIFxcdGludCBjdDtcXG4gXFxuIFxcdGlmIChldmVudCAhPSBORVRERVZfVU5SRUdJU1RFUilcXG4gXFx0XFx0cmV0dXJuIE5PVElGWV9ET05FO1xcbiBcXG4tXFx0aXA2bXJfZm9yX2VhY2hfdGFibGUobXJ0LCBuZXQpIHtcXG4rI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcXG4rXFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1ydCwgbmV4dCwgXFx1MDAyNm5ldC1cXHUwMDNlaXB2Ni5tcjZfdGFibGVzLCBsaXN0KVxcbisjZWxzZVxcbitcXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldClcXG4rI2VuZGlmXFxuK1xcdHtcXG4rXFx0XFx0Ym9vbCB2aWZfZ29uZSA9IGZhbHNlO1xcbitcXG4gXFx0XFx0diA9IFxcdTAwMjZtcnQtXFx1MDAzZXZpZl90YWJsZVswXTtcXG4gXFx0XFx0Zm9yIChjdCA9IDA7IGN0IFxcdTAwM2MgbXJ0LVxcdTAwM2VtYXh2aWY7IGN0KyssIHYrKykge1xcbi1cXHRcXHRcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXFx1MDAzZWRldikgPT0gZGV2KVxcbitcXHRcXHRcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXFx1MDAzZWRldikgPT0gZGV2KSB7XFxuIFxcdFxcdFxcdFxcdG1pZjZfZGVsZXRlKG1ydCwgY3QsIDEsIE5VTEwpO1xcbitcXHRcXHRcXHRcXHR2aWZfZ29uZSA9IHRydWU7XFxuK1xcdFxcdFxcdH1cXG4gXFx0XFx0fVxcbitcXHRcXHRpZiAodmlmX2dvbmUpXFxuK1xcdFxcdFxcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIE5PVElGWV9ET05FO1xcbkBAIC0xNjE4LDEwICsxNzY3LDExIEBAIHN0YXRpYyB2b2lkIG1yb3V0ZV9jbGVhbl90YWJsZXMoc3RydWN0IG1yX3RhYmxlICptcnQsIGludCBmbGFncyxcXG4gXFxuIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKVxcbiB7XFxuLVxcdGludCBlcnIgPSAwO1xcbiBcXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXG4rXFx0QVNTRVJUX1JUTkwoKTtcXG4gXFxuLVxcdHJ0bmxfbG9jaygpO1xcbiBcXHRzcGluX2xvY2soXFx1MDAyNm1ydF9sb2NrKTtcXG4gXFx0aWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LVxcdTAwM2Vtcm91dGVfc2spKSB7XFxuIFxcdFxcdGVyciA9IC1FQUREUklOVVNFO1xcbkBAIC0xNjM3LDggKzE3ODcsNiBAQCBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaylcXG4gXFx0XFx0XFx0XFx0XFx0ICAgICBORVRDT05GQV9NQ19GT1JXQVJESU5HLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgIE5FVENPTkZBX0lGSU5ERVhfQUxMLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgIG5ldC1cXHUwMDNlaXB2Ni5kZXZjb25mX2FsbCk7XFxuLVxcdHJ0bmxfdW5sb2NrKCk7XFxuLVxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbkBAIC0xNjc3LDYgKzE4MjUsNyBAQCBpbnQgaXA2bXJfc2tfZG9uZShzdHJ1Y3Qgc29jayAqc2spXFxuIFxcdFxcdFxcdG1yb3V0ZV9jbGVhbl90YWJsZXMobXJ0LCBNUlQ2X0ZMVVNIX01JRlMgfCBNUlQ2X0ZMVVNIX01GQyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIFxcdTAwMjZkZXZfa2lsbF9saXN0KTtcXG4gXFx0XFx0XFx0ZXJyID0gMDtcXG4rXFx0XFx0XFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbiBcXHR9XFxuQEAgLTE3MjMsMjcgKzE4NzIsNDUgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxcbiBcXHQgICAgaW5ldF9zayhzayktXFx1MDAzZWluZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KVxcbiBcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuIFxcbi1cXHRtcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS1cXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcXG4tXFx0aWYgKCFtcnQpXFxuLVxcdFxcdHJldHVybiAtRU5PRU5UO1xcbi1cXG4gXFx0aWYgKG9wdG5hbWUgIT0gTVJUNl9JTklUKSB7XFxuLVxcdFxcdGlmIChzayAhPSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LVxcdTAwM2Vtcm91dGVfc2spIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICAhbnNfY2FwYWJsZShuZXQtXFx1MDAzZXVzZXJfbnMsIENBUF9ORVRfQURNSU4pKVxcbitcXHRcXHRib29sIGlzX21yb3V0ZV9zayA9IGZhbHNlO1xcbitcXG4rXFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRcXHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xcbitcXHRcXHRpZiAobXJ0IFxcdTAwMjZcXHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXFx1MDAzZW1yb3V0ZV9zaykpXFxuK1xcdFxcdFxcdGlzX21yb3V0ZV9zayA9IHRydWU7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXG4rXFx0XFx0aWYgKCFpc19tcm91dGVfc2sgXFx1MDAyNlxcdTAwMjYgIW5zX2NhcGFibGUobmV0LVxcdTAwM2V1c2VyX25zLCBDQVBfTkVUX0FETUlOKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FQUNDRVM7XFxuIFxcdH1cXG4gXFxuIFxcdHN3aXRjaCAob3B0bmFtZSkge1xcbi1cXHRjYXNlIE1SVDZfSU5JVDpcXG4rXFx0Y2FzZSBNUlQ2X0lOSVQ6IHtcXG4rXFx0XFx0Ym9vbCBuZXdfdGFibGUgPSBmYWxzZTtcXG4rXFxuIFxcdFxcdGlmIChvcHRsZW4gXFx1MDAzYyBzaXplb2YoaW50KSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbi1cXHRcXHRyZXR1cm4gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcXG4rXFx0XFx0cnRubF9sb2NrKCk7XFxuK1xcdFxcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXFx1MDAyNm5ld190YWJsZSk7XFxuK1xcdFxcdGlmIChJU19FUlIobXJ0KSkge1xcbitcXHRcXHRcXHRydG5sX3VubG9jaygpO1xcbitcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihtcnQpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcXG4rXFx0XFx0cmV0ID0gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcXG4rXFx0XFx0cmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTtcXG4rXFx0XFx0cnRubF91bmxvY2soKTtcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0fVxcbiBcXG4gXFx0Y2FzZSBNUlQ2X0RPTkU6XFxuIFxcdFxcdHJldHVybiBpcDZtcl9za19kb25lKHNrKTtcXG4gXFxuLVxcdGNhc2UgTVJUNl9BRERfTUlGOlxcbitcXHRjYXNlIE1SVDZfQUREX01JRjoge1xcbitcXHRcXHRib29sIG5ld190YWJsZSA9IGZhbHNlO1xcbitcXG4gXFx0XFx0aWYgKG9wdGxlbiBcXHUwMDNjIHNpemVvZih2aWYpKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFx0XFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFxcdTAwMjZ2aWYsIG9wdHZhbCwgc2l6ZW9mKHZpZikpKVxcbkBAIC0xNzUxLDEwICsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4gXFx0XFx0aWYgKHZpZi5taWY2Y19taWZpIFxcdTAwM2U9IE1BWE1JRlMpXFxuIFxcdFxcdFxcdHJldHVybiAtRU5GSUxFO1xcbiBcXHRcXHRydG5sX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlKHNrLCBcXHUwMDI2bmV3X3RhYmxlKTtcXG4rXFx0XFx0aWYgKElTX0VSUihtcnQpKSB7XFxuK1xcdFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiBQVFJfRVJSKG1ydCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpO1xcbiBcXHRcXHRyZXQgPSBtaWY2X2FkZChuZXQsIG1ydCwgXFx1MDAyNnZpZixcXG4gXFx0XFx0XFx0ICAgICAgIHNrID09IHJ0bmxfZGVyZWZlcmVuY2UobXJ0LVxcdTAwM2Vtcm91dGVfc2spKTtcXG4rXFx0XFx0cmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTtcXG4gXFx0XFx0cnRubF91bmxvY2soKTtcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0fVxcbiBcXG4gXFx0Y2FzZSBNUlQ2X0RFTF9NSUY6XFxuIFxcdFxcdGlmIChvcHRsZW4gXFx1MDAzYyBzaXplb2YobWlmaV90KSlcXG5AQCAtMTc2Miw3ICsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4gXFx0XFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFxcdTAwMjZtaWZpLCBvcHR2YWwsIHNpemVvZihtaWZpX3QpKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdFxcdHJ0bmxfbG9jaygpO1xcbitcXHRcXHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xcbitcXHRcXHRpZiAoIW1ydCkge1xcbitcXHRcXHRcXHRydG5sX3VubG9jaygpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0XFx0fVxcbiBcXHRcXHRyZXQgPSBtaWY2X2RlbGV0ZShtcnQsIG1pZmksIDAsIE5VTEwpO1xcbitcXHRcXHRpZiAoIXJldClcXG4rXFx0XFx0XFx0aXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZShtcnQpO1xcbiBcXHRcXHRydG5sX3VubG9jaygpO1xcbiBcXHRcXHRyZXR1cm4gcmV0O1xcbiBcXG5AQCAtMTc4MywxNyArMTk2NSwzOSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXFxuIFxcdFxcdGlmIChwYXJlbnQgPT0gMClcXG4gXFx0XFx0XFx0cGFyZW50ID0gbWZjLm1mNmNjX3BhcmVudDtcXG4gXFxuLVxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm5ldC1cXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xcbitcXHRcXHRydG5sX2xvY2soKTtcXG4rXFx0XFx0aWYgKG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDIHx8IG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDX1BST1hZKSB7XFxuK1xcdFxcdFxcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XFxuK1xcdFxcdFxcdGlmICghbXJ0KSB7XFxuK1xcdFxcdFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XFxuIFxcbi1cXHRcXHRpZiAob3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkMgfHwgb3B0bmFtZSA9PSBNUlQ2X0RFTF9NRkNfUFJPWFkpXFxuLVxcdFxcdFxcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcXHUwMDI2bWZjLCBwYXJlbnQpO1xcbi1cXHRcXHRlbHNlXFxuK1xcdFxcdFxcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXFx1MDAyNm5ld190YWJsZSk7XFxuK1xcdFxcdFxcdGlmIChJU19FUlIobXJ0KSkge1xcbitcXHRcXHRcXHRcXHRydG5sX3VubG9jaygpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihtcnQpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcXG4rXFx0XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2bmV0LVxcdTAwM2VpcHY2Lm1mY19tdXRleCk7XFxuIFxcdFxcdFxcdHJldCA9IGlwNm1yX21mY19hZGQobmV0LCBtcnQsIFxcdTAwMjZtZmMsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICBzayA9PVxcbiBcXHRcXHRcXHRcXHRcXHQgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cXHUwMDNlbXJvdXRlX3NrKSxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIHBhcmVudCk7XFxuK1xcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bmV0LVxcdTAwM2VpcHY2Lm1mY19tdXRleCk7XFxuK1xcdFxcdFxcdHJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7XFxuK1xcdFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdH1cXG4gXFxuK1xcdFxcdG11dGV4X2xvY2soXFx1MDAyNm5ldC1cXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xcbitcXHRcXHRyZXQgPSBpcDZtcl9tZmNfZGVsZXRlKG1ydCwgXFx1MDAyNm1mYywgcGFyZW50KTtcXG4gXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuZXQtXFx1MDAzZWlwdjYubWZjX211dGV4KTtcXG4rXFx0XFx0aWYgKCFyZXQpXFxuK1xcdFxcdFxcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcXG4rXFx0XFx0cnRubF91bmxvY2soKTtcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuIFxcdGNhc2UgTVJUNl9GTFVTSDpcXG5AQCAtMTgwNyw4ICsyMDExLDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4gXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcbiBcXHRcXHRydG5sX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4rXFx0XFx0aWYgKCFtcnQpIHtcXG4rXFx0XFx0XFx0cnRubF91bmxvY2soKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdFxcdH1cXG4gXFx0XFx0bXJvdXRlX2NsZWFuX3RhYmxlcyhtcnQsIGZsYWdzLCBcXHUwMDI2ZGV2X2tpbGxfbGlzdCk7XFxuIFxcdFxcdHVucmVnaXN0ZXJfbmV0ZGV2aWNlX21hbnkoXFx1MDAyNmRldl9raWxsX2xpc3QpO1xcbitcXHRcXHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XFxuIFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHR9XFxuQEAgLTE4MjQsNyArMjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXFxuIFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXHRcXHRpZiAoY29weV9mcm9tX3NvY2twdHIoXFx1MDAyNnYsIG9wdHZhbCwgc2l6ZW9mKHYpKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4rXFx0XFx0aWYgKCFtcnQpIHtcXG4rXFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHR9XFxuIFxcdFxcdFdSSVRFX09OQ0UobXJ0LVxcdTAwM2Vtcm91dGVfZG9fYXNzZXJ0LCB2KTtcXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHR9XFxuIFxcbkBAIC0xODQyLDYgKzIwNTksMTEgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxcbiBcXHRcXHRkb193cm1pZndob2xlID0gKHYgPT0gTVJUNk1TR19XUk1JRldIT0xFKTtcXG4gXFx0XFx0diA9ICEhdjtcXG4gXFx0XFx0cnRubF9sb2NrKCk7XFxuK1xcdFxcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XFxuK1xcdFxcdGlmICghbXJ0KSB7XFxuK1xcdFxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHR9XFxuIFxcdFxcdHJldCA9IDA7XFxuIFxcdFxcdGlmICh2ICE9IG1ydC1cXHUwMDNlbXJvdXRlX2RvX3BpbSkge1xcbiBcXHRcXHRcXHRXUklURV9PTkNFKG1ydC1cXHUwMDNlbXJvdXRlX2RvX3BpbSwgdik7XFxuQEAgLTE4NjUsMTggKzIwODcsMTYgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxcbiBcXHRcXHQvKiBcXFwicGltNnJlZyV1XFxcIiBzaG91bGQgbm90IGV4Y2VlZCAxNiBieXRlcyAoSUZOQU1TSVopICovXFxuIFxcdFxcdGlmICh2ICE9IFJUX1RBQkxFX0RFRkFVTFQgXFx1MDAyNlxcdTAwMjYgdiBcXHUwMDNlPSAxMDAwMDAwMDApXFxuIFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHRcXHRpZiAoc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cXHUwMDNlbXJvdXRlX3NrKSlcXG4rXFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRcXHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xcbitcXHRcXHRpZiAobXJ0IFxcdTAwMjZcXHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXFx1MDAzZW1yb3V0ZV9zaykpIHtcXG4rXFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuIFxcdFxcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdFxcdH1cXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuIFxcbi1cXHRcXHRydG5sX2xvY2soKTtcXG4tXFx0XFx0cmV0ID0gMDtcXG4tXFx0XFx0bXJ0ID0gaXA2bXJfbmV3X3RhYmxlKG5ldCwgdik7XFxuLVxcdFxcdGlmIChJU19FUlIobXJ0KSlcXG4tXFx0XFx0XFx0cmV0ID0gUFRSX0VSUihtcnQpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdHJhdzZfc2soc2spLVxcdTAwM2VpcDZtcl90YWJsZSA9IHY7XFxuLVxcdFxcdHJ0bmxfdW5sb2NrKCk7XFxuLVxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJhdzZfc2soc2spLVxcdTAwM2VpcDZtcl90YWJsZSA9IHY7XFxuK1xcdFxcdHJldHVybiAwO1xcbiBcXHR9XFxuICNlbmRpZlxcbiBcXHQvKlxcbkBAIC0xODk3LDE2ICsyMTE3LDE4IEBAIGludCBpcDZfbXJvdXRlX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4ge1xcbiBcXHRpbnQgb2xyO1xcbiBcXHRpbnQgdmFsO1xcbi1cXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XFxuIFxcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbiBcXG4gXFx0aWYgKHNrLVxcdTAwM2Vza190eXBlICE9IFNPQ0tfUkFXIHx8XFxuIFxcdCAgICBpbmV0X3NrKHNrKS1cXHUwMDNlaW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpXFxuIFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gXFxuLVxcdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVxcdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xcbi1cXHRpZiAoIW1ydClcXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xcbitcXHRpZiAoIW1ydCkge1xcbitcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4gXFxuIFxcdHN3aXRjaCAob3B0bmFtZSkge1xcbiBcXHRjYXNlIE1SVDZfVkVSU0lPTjpcXG5AQCAtMTkyMSw4ICsyMTQzLDEwIEBAIGludCBpcDZfbXJvdXRlX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcXG4gXFx0XFx0dmFsID0gUkVBRF9PTkNFKG1ydC1cXHUwMDNlbXJvdXRlX2RvX2Fzc2VydCk7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRkZWZhdWx0OlxcbitcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFx0XFx0cmV0dXJuIC1FTk9QUk9UT09QVDtcXG4gXFx0fVxcbitcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFxuIFxcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcXHUwMDI2b2xyLCBvcHRsZW4sIHNpemVvZihpbnQpKSlcXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuQEAgLTE5NDcsMjAgKzIxNzEsMjMgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKVxcbiBcXHRzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqdnI7XFxuIFxcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XFxuIFxcdHN0cnVjdCBtZmM2X2NhY2hlICpjO1xcbi1cXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XFxuIFxcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbiBcXG4tXFx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXFx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XFxuLVxcdGlmICghbXJ0KVxcbitcXHRyY3VfcmVhZF9sb2NrKCk7XFxuK1xcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XFxuK1xcdGlmICghbXJ0KSB7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0fVxcbiBcXG4gXFx0c3dpdGNoIChjbWQpIHtcXG4gXFx0Y2FzZSBTSU9DR0VUTUlGQ05UX0lONjpcXG4gXFx0XFx0dnIgPSAoc3RydWN0IHNpb2NfbWlmX3JlcTYgKilhcmc7XFxuLVxcdFxcdGlmICh2ci1cXHUwMDNlbWlmaSBcXHUwMDNlPSBtcnQtXFx1MDAzZW1heHZpZilcXG4rXFx0XFx0aWYgKHZyLVxcdTAwM2VtaWZpIFxcdTAwM2U9IG1ydC1cXHUwMDNlbWF4dmlmKSB7XFxuK1xcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0fVxcbiBcXHRcXHR2ci1cXHUwMDNlbWlmaSA9IGFycmF5X2luZGV4X25vc3BlYyh2ci1cXHUwMDNlbWlmaSwgbXJ0LVxcdTAwM2VtYXh2aWYpO1xcbi1cXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIFxcdFxcdHZpZiA9IFxcdTAwMjZtcnQtXFx1MDAzZXZpZl90YWJsZVt2ci1cXHUwMDNlbWlmaV07XFxuIFxcdFxcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnItXFx1MDAzZW1pZmkpKSB7XFxuIFxcdFxcdFxcdHZyLVxcdTAwM2VpY291bnQgPSBSRUFEX09OQ0UodmlmLVxcdTAwM2Vwa3RfaW4pO1xcbkBAIC0xOTc0LDggKzIyMDEsNiBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXFxuIFxcdFxcdHJldHVybiAtRUFERFJOT1RBVkFJTDtcXG4gXFx0Y2FzZSBTSU9DR0VUU0dDTlRfSU42OlxcbiBcXHRcXHRzciA9IChzdHJ1Y3Qgc2lvY19zZ19yZXE2ICopYXJnO1xcbi1cXG4tXFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiBcXHRcXHRjID0gaXA2bXJfY2FjaGVfZmluZChtcnQsIFxcdTAwMjZzci1cXHUwMDNlc3JjLnNpbjZfYWRkcixcXG4gXFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2c3ItXFx1MDAzZWdycC5zaW42X2FkZHIpO1xcbiBcXHRcXHRpZiAoYykge1xcbkBAIC0xOTg4LDYgKzIyMTMsNyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXFxuIFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XFxuIFxcdGRlZmF1bHQ6XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xcbiBcXHR9XFxuIH1cXG5AQCAtMjAxNSwyMSArMjI0MSwyMyBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcXG4gXFx0c3RydWN0IGNvbXBhdF9zaW9jX21pZl9yZXE2IHZyO1xcbiBcXHRzdHJ1Y3QgdmlmX2RldmljZSAqdmlmO1xcbiBcXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcXG4tXFx0c3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spO1xcbiBcXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcXG4gXFxuLVxcdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVxcdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xcbi1cXHRpZiAoIW1ydClcXG4tXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuLVxcbiBcXHRzd2l0Y2ggKGNtZCkge1xcbiBcXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxcbiBcXHRcXHRpZiAoY29weV9mcm9tX3VzZXIoXFx1MDAyNnZyLCBhcmcsIHNpemVvZih2cikpKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4tXFx0XFx0aWYgKHZyLm1pZmkgXFx1MDAzZT0gbXJ0LVxcdTAwM2VtYXh2aWYpXFxuK1xcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4rXFx0XFx0aWYgKCFtcnQpIHtcXG4rXFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmICh2ci5taWZpIFxcdTAwM2U9IG1ydC1cXHUwMDNlbWF4dmlmKSB7XFxuK1xcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0fVxcbiBcXHRcXHR2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC1cXHUwMDNlbWF4dmlmKTtcXG4tXFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiBcXHRcXHR2aWYgPSBcXHUwMDI2bXJ0LVxcdTAwM2V2aWZfdGFibGVbdnIubWlmaV07XFxuIFxcdFxcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnIubWlmaSkpIHtcXG4gXFx0XFx0XFx0dnIuaWNvdW50ID0gUkVBRF9PTkNFKHZpZi1cXHUwMDNlcGt0X2luKTtcXG5AQCAtMjA0OSw2ICsyMjc3LDExIEBAIGludCBpcDZtcl9jb21wYXRfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gXFxuIFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4rXFx0XFx0aWYgKCFtcnQpIHtcXG4rXFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbitcXHRcXHR9XFxuIFxcdFxcdGMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgXFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFxcdTAwMjZzci5ncnAuc2luNl9hZGRyKTtcXG4gXFx0XFx0aWYgKGMpIHtcXG4gXFx0XFx0XFx0c3IucGt0Y250ID0gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2Yy1cXHUwMDNlX2MubWZjX3VuLnJlcy5wa3QpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMTo1Ny44NzI4MTcyNDJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE2NTkzMjIwNDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklQVjZcIixcbiAgICBcIklQVjZfTVJPVVRFXCIsXG4gICAgXCJJUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJpcDZfbXJvdXRlX3NldHNvY2tvcHRcIixcbiAgICBcImlwNl9tcm91dGVfZ2V0c29ja29wdFwiLFxuICAgIFwiaXA2bXJfaW9jdGxcIixcbiAgICBcImlwNm1yX2NvbXBhdF9pb2N0bFwiLFxuICAgIFwiaXA2bXJfc2tfZG9uZVwiLFxuICAgIFwiaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlXCIsXG4gICAgXCJpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlXCIsXG4gICAgXCJpcDZtcl9kZXN0cm95X3dvcmtmblwiLFxuICAgIFwiaXA2bXJfZGV2aWNlX2V2ZW50XCIsXG4gICAgXCJpcG1yX2V4cGlyZV9wcm9jZXNzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGlwNm1yKSB0YWJsZSBsaWZlY3ljbGUgYW5kIGxvY2tpbmcuIEl0IGFkZHMgZHluYW1pYyB0YWJsZSBhbGxvY2F0aW9uLCBhc3luY2hyb25vdXMgdGFibGUgZGVzdHJ1Y3Rpb24gdmlhIHdvcmtxdWV1ZXMsIGFuZCB1cGRhdGVzIHNldHNvY2tvcHQsIGdldHNvY2tvcHQsIGlvY3RsLCB0aW1lciBleHBpcmF0aW9uLCBhbmQgbmV0ZGV2IG5vdGlmaWVyIGhhbmRsaW5nLiBUaGVzZSBwYXRocyBhcmUgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgcmF3IElQdjYgc29ja2V0cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA1MjFjMGIwMmE2ODE0MjAwYjBlZWIyMGFhZjEzYzVkODRlOThmZTViXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFN1biBTZXAgNiAxNToyMTo1NiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jXG5pbmRleCAzZjJlZDliNzdkZWI1Li4yNmJkMmNjZDQyMDFhIDEwMDY0NFxuLS0tIGEvbmV0L2lwdjYvaXA2bXIuY1xuKysrIGIvbmV0L2lwdjYvaXA2bXIuY1xuQEAgLTI4LDYgKzI4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb21wYXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JoYXNodGFibGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0L3Byb3RvY29sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9za2J1ZmYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9yYXcuaFx1MDAzZVxuQEAgLTM2OCw2ICszNjksMTIgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0cmV0dXJuIG1ydDtcbiB9XG4gXG4rc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbG9va3VwX3NrX3RhYmxlKHN0cnVjdCBzb2NrICpzaylcbit7XG4rXHRyZXR1cm4gX19pcDZtcl9nZXRfdGFibGUoc29ja19uZXQoc2spLFxuK1x0XHRcdFx0IHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4rfVxuK1xuIHN0YXRpYyBpbnQgaXA2bXJfaGFzaF9jbXAoc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgKmFyZyxcbiBcdFx0XHQgIGNvbnN0IHZvaWQgKnB0cilcbiB7XG5AQCAtNDE3LDYgKzQyNCwxMjQgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0XHRcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpO1xuIH1cbiBcbisvKiB0YWJsZV9zZXQgY2FsbGJhY2sgdXNlZCB3aGlsZSB0aGUgbmV3IHRhYmxlIGlzIHN0aWxsIHVucHVibGlzaGVkLiAqL1xuK3N0YXRpYyB2b2lkIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2goc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBuZXQgKm5ldClcbit7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssXG4rXHRcdFx0XHRcdFx0ICAgIGJvb2wgKm5ld190YWJsZSlcbit7XG4rXHR1MzIgaWQgPSByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQ7XG4rXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4rXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbitcbitcdEFTU0VSVF9SVE5MKCk7XG4rXHQqbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4rXHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShuZXQsIGlkKTtcbitcdGlmIChtcnQpXG4rXHRcdHJldHVybiBtcnQ7XG4rXG4rXHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcdTAwMjZpcDZtcl9tcl90YWJsZV9vcHMsXG4rXHRcdFx0ICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKTtcbitcdGlmICghSVNfRVJSKG1ydCkpXG4rXHRcdCpuZXdfdGFibGUgPSB0cnVlO1xuK1x0cmV0dXJuIG1ydDtcbit9XG4rXG4rc3RhdGljIHZvaWQgaXA2bXJfcHVibGlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlKVxuK3tcbitcdGlmIChuZXdfdGFibGUpXG4rXHRcdGlwNm1yX25ld190YWJsZV9zZXQobXJ0LCByZWFkX3BuZXQoXHUwMDI2bXJ0LVx1MDAzZW5ldCkpO1xuK31cbitcbitzdGF0aWMgdm9pZCBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuK3tcbitcdEFTU0VSVF9SVE5MKCk7XG4rXG4rI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbitcdGlmIChtcnQtXHUwMDNlaWQgPT0gUlQ2X1RBQkxFX0RGTFQpXG4rXHRcdHJldHVybjtcbitcdC8qIE5lc3RlZCBORVRERVZfVU5SRUdJU1RFUiBtYXkgYWxyZWFkeSBoYXZlIHVubGlua2VkIHRoaXMgdGFibGUuICovXG4rXHRpZiAoX19pcDZtcl9nZXRfdGFibGUocmVhZF9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQpLCBtcnQtXHUwMDNlaWQpICE9IG1ydClcbitcdFx0cmV0dXJuO1xuK1x0aWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LVx1MDAzZW1yb3V0ZV9zaykgfHxcbitcdCAgICBtcnQtXHUwMDNlbWF4dmlmIHx8XG4rXHQgICAgIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY19jYWNoZV9saXN0KSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c3Bpbl9sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbitcdGlmICghbGlzdF9lbXB0eShcdTAwMjZtcnQtXHUwMDNlbWZjX3VucmVzX3F1ZXVlKSkge1xuK1x0XHRzcGluX3VubG9ja19iaChcdTAwMjZtZmNfdW5yZXNfbG9jayk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbitcbitcdGxpc3RfZGVsX3JjdShcdTAwMjZtcnQtXHUwMDNlbGlzdCk7XG4rXHR0aW1lcl9zaHV0ZG93bl9zeW5jKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lcik7XG4rXHRtcl90YWJsZV9mcmVlKG1ydCk7XG4rI2VuZGlmXG4rfVxuK1xuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4rc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XG4rXHRzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yaztcbitcdHN0cnVjdCBuZXQgKm5ldDtcbitcdHUzMiBpZDtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrICpkdyA9XG4rXHRcdGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrLCB3b3JrKTtcbitcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuK1xuK1x0cnRubF9sb2NrKCk7XG4rXHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShkdy1cdTAwM2VuZXQsIGR3LVx1MDAzZWlkKTtcbitcdGlmIChtcnQpXG4rXHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbitcdHJ0bmxfdW5sb2NrKCk7XG4rXHRwdXRfbmV0KGR3LVx1MDAzZW5ldCk7XG4rXHRrZnJlZShkdyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpXG4re1xuK1x0c3RydWN0IG5ldCAqbmV0ID0gcmVhZF9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQpO1xuK1x0c3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHc7XG4rXG4rXHRpZiAobXJ0LVx1MDAzZWlkID09IFJUNl9UQUJMRV9ERkxUKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRkdyA9IGttYWxsb2Nfb2JqKCpkdywgR0ZQX0FUT01JQyk7XG4rXHRpZiAoIWR3KSB7XG4rXHRcdG1vZF90aW1lcihcdTAwMjZtcnQtXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgKyBIWik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghbWF5YmVfZ2V0X25ldChuZXQpKSB7XG4rXHRcdGtmcmVlKGR3KTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0SU5JVF9XT1JLKFx1MDAyNmR3LVx1MDAzZXdvcmssIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKTtcbitcdGR3LVx1MDAzZW5ldCA9IG5ldDtcbitcdGR3LVx1MDAzZWlkID0gbXJ0LVx1MDAzZWlkO1xuK1x0cXVldWVfd29yayhzeXN0ZW1fZGZsX3dxLCBcdTAwMjZkdy1cdTAwM2V3b3JrKTtcbit9XG4rI2Vsc2VcbitzdGF0aWMgdm9pZCBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuK3tcbit9XG4rI2VuZGlmXG4rXG4rc3RhdGljIGludCBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBib29sIG5ld190YWJsZSxcbitcdFx0XHRcdCAgaW50IGVycilcbit7XG4rXHRpZiAobmV3X3RhYmxlIFx1MDAyNlx1MDAyNiBlcnIpXG4rXHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIGlwNm1yX2ZyZWVfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfa2lsbF9saXN0KVxuIHtcbkBAIC04NjYsMTYgKzk5MSwyNSBAQCBzdGF0aWMgdm9pZCBpcG1yX2RvX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuIHN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpXG4ge1xuIFx0c3RydWN0IG1yX3RhYmxlICptcnQgPSB0aW1lcl9jb250YWluZXJfb2YobXJ0LCB0LCBpcG1yX2V4cGlyZV90aW1lcik7XG4rXHRib29sIGVtcHR5ID0gZmFsc2U7XG4gXG4gXHRpZiAoIXNwaW5fdHJ5bG9jayhcdTAwMjZtZmNfdW5yZXNfbG9jaykpIHtcbiBcdFx0bW9kX3RpbWVyKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lciwgamlmZmllcyArIDEpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG4gXG4tXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpXG4rXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpIHtcbiBcdFx0aXBtcl9kb19leHBpcmVfcHJvY2VzcyhtcnQpO1xuK1x0XHRlbXB0eSA9IGxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBSZXRyeSBhZnRlciBHRlBfQVRPTUlDIGFsbG9jYXRpb24gZmFpbHVyZS4gKi9cbitcdFx0ZW1wdHkgPSB0cnVlO1xuK1x0fVxuIFxuIFx0c3Bpbl91bmxvY2soXHUwMDI2bWZjX3VucmVzX2xvY2spO1xuK1xuK1x0aWYgKGVtcHR5KVxuK1x0XHRpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KG1ydCk7XG4gfVxuIFxuIC8qIEZpbGwgb2lmcyBsaXN0LiBJdCBpcyBjYWxsZWQgdW5kZXIgbG9ja2VkIG1ydF9sb2NrLiAqL1xuQEAgLTEyOTAsMTkgKzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxuIHtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTtcbisjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xuK1x0c3RydWN0IG1yX3RhYmxlICptcnQsICpuZXh0O1xuKyNlbHNlXG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbisjZW5kaWZcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2O1xuIFx0aW50IGN0O1xuIFxuIFx0aWYgKGV2ZW50ICE9IE5FVERFVl9VTlJFR0lTVEVSKVxuIFx0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4gXG4tXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldCkge1xuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCBcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tcjZfdGFibGVzLCBsaXN0KVxuKyNlbHNlXG4rXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldClcbisjZW5kaWZcbitcdHtcbitcdFx0Ym9vbCB2aWZfZ29uZSA9IGZhbHNlO1xuK1xuIFx0XHR2ID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVswXTtcbiBcdFx0Zm9yIChjdCA9IDA7IGN0IFx1MDAzYyBtcnQtXHUwMDNlbWF4dmlmOyBjdCsrLCB2KyspIHtcbi1cdFx0XHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXHUwMDNlZGV2KSA9PSBkZXYpXG4rXHRcdFx0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcih2LVx1MDAzZWRldikgPT0gZGV2KSB7XG4gXHRcdFx0XHRtaWY2X2RlbGV0ZShtcnQsIGN0LCAxLCBOVUxMKTtcbitcdFx0XHRcdHZpZl9nb25lID0gdHJ1ZTtcbitcdFx0XHR9XG4gXHRcdH1cbitcdFx0aWYgKHZpZl9nb25lKVxuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdH1cbiBcbiBcdHJldHVybiBOT1RJRllfRE9ORTtcbkBAIC0xNjE4LDEwICsxNzY3LDExIEBAIHN0YXRpYyB2b2lkIG1yb3V0ZV9jbGVhbl90YWJsZXMoc3RydWN0IG1yX3RhYmxlICptcnQsIGludCBmbGFncyxcbiBcbiBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaylcbiB7XG4tXHRpbnQgZXJyID0gMDtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbitcdGludCBlcnIgPSAwO1xuK1xuK1x0QVNTRVJUX1JUTkwoKTtcbiBcbi1cdHJ0bmxfbG9jaygpO1xuIFx0c3Bpbl9sb2NrKFx1MDAyNm1ydF9sb2NrKTtcbiBcdGlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC1cdTAwM2Vtcm91dGVfc2spKSB7XG4gXHRcdGVyciA9IC1FQUREUklOVVNFO1xuQEAgLTE2MzcsOCArMTc4Nyw2IEBAIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKVxuIFx0XHRcdFx0XHQgICAgIE5FVENPTkZBX01DX0ZPUldBUkRJTkcsXG4gXHRcdFx0XHRcdCAgICAgTkVUQ09ORkFfSUZJTkRFWF9BTEwsXG4gXHRcdFx0XHRcdCAgICAgbmV0LVx1MDAzZWlwdjYuZGV2Y29uZl9hbGwpO1xuLVx0cnRubF91bmxvY2soKTtcbi1cbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuQEAgLTE2NzcsNiArMTgyNSw3IEBAIGludCBpcDZtcl9za19kb25lKHN0cnVjdCBzb2NrICpzaylcbiBcdFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgTVJUNl9GTFVTSF9NSUZTIHwgTVJUNl9GTFVTSF9NRkMsXG4gXHRcdFx0XHRcdCAgICBcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiBcdFx0XHRlcnIgPSAwO1xuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuIFx0fVxuQEAgLTE3MjMsMjcgKzE4NzIsNDUgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0ICAgIGluZXRfc2soc2spLVx1MDAzZWluZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KVxuIFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gXG4tXHRtcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xuLVx0aWYgKCFtcnQpXG4tXHRcdHJldHVybiAtRU5PRU5UO1xuLVxuIFx0aWYgKG9wdG5hbWUgIT0gTVJUNl9JTklUKSB7XG4tXHRcdGlmIChzayAhPSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LVx1MDAzZW1yb3V0ZV9zaykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAhbnNfY2FwYWJsZShuZXQtXHUwMDNldXNlcl9ucywgQ0FQX05FVF9BRE1JTikpXG4rXHRcdGJvb2wgaXNfbXJvdXRlX3NrID0gZmFsc2U7XG4rXG4rXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKG1ydCBcdTAwMjZcdTAwMjYgc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spKVxuK1x0XHRcdGlzX21yb3V0ZV9zayA9IHRydWU7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1xuK1x0XHRpZiAoIWlzX21yb3V0ZV9zayBcdTAwMjZcdTAwMjYgIW5zX2NhcGFibGUobmV0LVx1MDAzZXVzZXJfbnMsIENBUF9ORVRfQURNSU4pKVxuIFx0XHRcdHJldHVybiAtRUFDQ0VTO1xuIFx0fVxuIFxuIFx0c3dpdGNoIChvcHRuYW1lKSB7XG4tXHRjYXNlIE1SVDZfSU5JVDpcbitcdGNhc2UgTVJUNl9JTklUOiB7XG4rXHRcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4gXHRcdGlmIChvcHRsZW4gXHUwMDNjIHNpemVvZihpbnQpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0XHRyZXR1cm4gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcbitcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKTtcbitcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtcnQpO1xuK1x0XHR9XG4rXHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbitcdFx0cmV0ID0gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcbitcdFx0cmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTtcbitcdFx0cnRubF91bmxvY2soKTtcbitcdFx0cmV0dXJuIHJldDtcbitcdH1cbiBcbiBcdGNhc2UgTVJUNl9ET05FOlxuIFx0XHRyZXR1cm4gaXA2bXJfc2tfZG9uZShzayk7XG4gXG4tXHRjYXNlIE1SVDZfQUREX01JRjpcbitcdGNhc2UgTVJUNl9BRERfTUlGOiB7XG4rXHRcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4gXHRcdGlmIChvcHRsZW4gXHUwMDNjIHNpemVvZih2aWYpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFx0XHRpZiAoY29weV9mcm9tX3NvY2twdHIoXHUwMDI2dmlmLCBvcHR2YWwsIHNpemVvZih2aWYpKSlcbkBAIC0xNzUxLDEwICsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHZpZi5taWY2Y19taWZpIFx1MDAzZT0gTUFYTUlGUylcbiBcdFx0XHRyZXR1cm4gLUVORklMRTtcbiBcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKTtcbitcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtcnQpO1xuK1x0XHR9XG4rXHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbiBcdFx0cmV0ID0gbWlmNl9hZGQobmV0LCBtcnQsIFx1MDAyNnZpZixcbiBcdFx0XHQgICAgICAgc2sgPT0gcnRubF9kZXJlZmVyZW5jZShtcnQtXHUwMDNlbXJvdXRlX3NrKSk7XG4rXHRcdHJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4rXHR9XG4gXG4gXHRjYXNlIE1SVDZfREVMX01JRjpcbiBcdFx0aWYgKG9wdGxlbiBcdTAwM2Mgc2l6ZW9mKG1pZmlfdCkpXG5AQCAtMTc2Miw3ICsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFx1MDAyNm1pZmksIG9wdHZhbCwgc2l6ZW9mKG1pZmlfdCkpKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0XHRydG5sX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4gXHRcdHJldCA9IG1pZjZfZGVsZXRlKG1ydCwgbWlmaSwgMCwgTlVMTCk7XG4rXHRcdGlmICghcmV0KVxuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0cnRubF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNzgzLDE3ICsxOTY1LDM5IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHBhcmVudCA9PSAwKVxuIFx0XHRcdHBhcmVudCA9IG1mYy5tZjZjY19wYXJlbnQ7XG4gXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbitcdFx0cnRubF9sb2NrKCk7XG4rXHRcdGlmIChvcHRuYW1lID09IE1SVDZfREVMX01GQyB8fCBvcHRuYW1lID09IE1SVDZfREVMX01GQ19QUk9YWSkge1xuK1x0XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRcdHJ0bmxfdW5sb2NrKCk7XG4rXHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0Ym9vbCBuZXdfdGFibGUgPSBmYWxzZTtcbiBcbi1cdFx0aWYgKG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDIHx8IG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDX1BST1hZKVxuLVx0XHRcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcdTAwMjZtZmMsIHBhcmVudCk7XG4tXHRcdGVsc2VcbitcdFx0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4rXHRcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbitcdFx0XHR9XG4rXHRcdFx0aXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpO1xuK1x0XHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbiBcdFx0XHRyZXQgPSBpcDZtcl9tZmNfYWRkKG5ldCwgbXJ0LCBcdTAwMjZtZmMsXG4gXHRcdFx0XHRcdCAgICBzayA9PVxuIFx0XHRcdFx0XHQgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spLFxuIFx0XHRcdFx0XHQgICAgcGFyZW50KTtcbitcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbitcdFx0XHRyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpO1xuK1x0XHRcdHJ0bmxfdW5sb2NrKCk7XG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuIFxuK1x0XHRtdXRleF9sb2NrKFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1mY19tdXRleCk7XG4rXHRcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcdTAwMjZtZmMsIHBhcmVudCk7XG4gXHRcdG11dGV4X3VubG9jayhcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xuK1x0XHRpZiAoIXJldClcbitcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4rXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4gXG4gXHRjYXNlIE1SVDZfRkxVU0g6XG5AQCAtMTgwNyw4ICsyMDExLDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbiBcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdGlmICghbXJ0KSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgZmxhZ3MsIFx1MDAyNmRldl9raWxsX2xpc3QpO1xuIFx0XHR1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KFx1MDAyNmRldl9raWxsX2xpc3QpO1xuK1x0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAwO1xuIFx0fVxuQEAgLTE4MjQsNyArMjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZ2LCBvcHR2YWwsIHNpemVvZih2KSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRXUklURV9PTkNFKG1ydC1cdTAwM2Vtcm91dGVfZG9fYXNzZXJ0LCB2KTtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAwO1xuIFx0fVxuIFxuQEAgLTE4NDIsNiArMjA1OSwxMSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdGRvX3dybWlmd2hvbGUgPSAodiA9PSBNUlQ2TVNHX1dSTUlGV0hPTEUpO1xuIFx0XHR2ID0gISF2O1xuIFx0XHRydG5sX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4gXHRcdHJldCA9IDA7XG4gXHRcdGlmICh2ICE9IG1ydC1cdTAwM2Vtcm91dGVfZG9fcGltKSB7XG4gXHRcdFx0V1JJVEVfT05DRShtcnQtXHUwMDNlbXJvdXRlX2RvX3BpbSwgdik7XG5AQCAtMTg2NSwxOCArMjA4NywxNiBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdC8qIFwicGltNnJlZyV1XCIgc2hvdWxkIG5vdCBleGNlZWQgMTYgYnl0ZXMgKElGTkFNU0laKSAqL1xuIFx0XHRpZiAodiAhPSBSVF9UQUJMRV9ERUZBVUxUIFx1MDAyNlx1MDAyNiB2IFx1MDAzZT0gMTAwMDAwMDAwKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRpZiAoc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spKVxuK1x0XHRyY3VfcmVhZF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdGlmIChtcnQgXHUwMDI2XHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSkge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdH1cbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXG4tXHRcdHJ0bmxfbG9jaygpO1xuLVx0XHRyZXQgPSAwO1xuLVx0XHRtcnQgPSBpcDZtcl9uZXdfdGFibGUobmV0LCB2KTtcbi1cdFx0aWYgKElTX0VSUihtcnQpKVxuLVx0XHRcdHJldCA9IFBUUl9FUlIobXJ0KTtcbi1cdFx0ZWxzZVxuLVx0XHRcdHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID0gdjtcbi1cdFx0cnRubF91bmxvY2soKTtcbi1cdFx0cmV0dXJuIHJldDtcbitcdFx0cmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPSB2O1xuK1x0XHRyZXR1cm4gMDtcbiBcdH1cbiAjZW5kaWZcbiBcdC8qXG5AQCAtMTg5NywxNiArMjExNywxOCBAQCBpbnQgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4ge1xuIFx0aW50IG9scjtcbiBcdGludCB2YWw7XG4tXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiBcbiBcdGlmIChzay1cdTAwM2Vza190eXBlICE9IFNPQ0tfUkFXIHx8XG4gXHQgICAgaW5ldF9zayhzayktXHUwMDNlaW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpXG4gXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbitcdHJjdV9yZWFkX2xvY2soKTtcbitcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRpZiAoIW1ydCkge1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4gXG4gXHRzd2l0Y2ggKG9wdG5hbWUpIHtcbiBcdGNhc2UgTVJUNl9WRVJTSU9OOlxuQEAgLTE5MjEsOCArMjE0MywxMCBAQCBpbnQgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdHZhbCA9IFJFQURfT05DRShtcnQtXHUwMDNlbXJvdXRlX2RvX2Fzc2VydCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAtRU5PUFJPVE9PUFQ7XG4gXHR9XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiBcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZvbHIsIG9wdGxlbiwgc2l6ZW9mKGludCkpKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbkBAIC0xOTQ3LDIwICsyMTcxLDIzIEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZylcbiBcdHN0cnVjdCBzaW9jX21pZl9yZXE2ICp2cjtcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XG4gXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcbi1cdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbiBcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuIFxuLVx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcbi1cdGlmICghbXJ0KVxuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdGlmICghbXJ0KSB7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdH1cbiBcbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHR2ciA9IChzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqKWFyZztcbi1cdFx0aWYgKHZyLVx1MDAzZW1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKVxuK1x0XHRpZiAodnItXHUwMDNlbWlmaSBcdTAwM2U9IG1ydC1cdTAwM2VtYXh2aWYpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0fVxuIFx0XHR2ci1cdTAwM2VtaWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLVx1MDAzZW1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdHZpZiA9IFx1MDAyNm1ydC1cdTAwM2V2aWZfdGFibGVbdnItXHUwMDNlbWlmaV07XG4gXHRcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnItXHUwMDNlbWlmaSkpIHtcbiBcdFx0XHR2ci1cdTAwM2VpY291bnQgPSBSRUFEX09OQ0UodmlmLVx1MDAzZXBrdF9pbik7XG5AQCAtMTk3NCw4ICsyMjAxLDYgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKVxuIFx0XHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XG4gXHRjYXNlIFNJT0NHRVRTR0NOVF9JTjY6XG4gXHRcdHNyID0gKHN0cnVjdCBzaW9jX3NnX3JlcTYgKilhcmc7XG4tXG4tXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0YyA9IGlwNm1yX2NhY2hlX2ZpbmQobXJ0LCBcdTAwMjZzci1cdTAwM2VzcmMuc2luNl9hZGRyLFxuIFx0XHRcdFx0ICAgICBcdTAwMjZzci1cdTAwM2VncnAuc2luNl9hZGRyKTtcbiBcdFx0aWYgKGMpIHtcbkBAIC0xOTg4LDYgKzIyMTMsNyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXG4gXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XG4gXHRkZWZhdWx0OlxuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbiBcdH1cbiB9XG5AQCAtMjAxNSwyMSArMjI0MSwyMyBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcbiBcdHN0cnVjdCBjb21wYXRfc2lvY19taWZfcmVxNiB2cjtcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XG4gXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcbi1cdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbiBcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuIFxuLVx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcbi1cdGlmICghbXJ0KVxuLVx0XHRyZXR1cm4gLUVOT0VOVDtcbi1cbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dnIsIGFyZywgc2l6ZW9mKHZyKSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4tXHRcdGlmICh2ci5taWZpIFx1MDAzZT0gbXJ0LVx1MDAzZW1heHZpZilcbitcdFx0cmN1X3JlYWRfbG9jaygpO1xuK1x0XHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xuK1x0XHRpZiAoIW1ydCkge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4rXHRcdGlmICh2ci5taWZpIFx1MDAzZT0gbXJ0LVx1MDAzZW1heHZpZikge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0XHR9XG4gXHRcdHZyLm1pZmkgPSBhcnJheV9pbmRleF9ub3NwZWModnIubWlmaSwgbXJ0LVx1MDAzZW1heHZpZik7XG4tXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0dmlmID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVt2ci5taWZpXTtcbiBcdFx0aWYgKFZJRl9FWElTVFMobXJ0LCB2ci5taWZpKSkge1xuIFx0XHRcdHZyLmljb3VudCA9IFJFQURfT05DRSh2aWYtXHUwMDNlcGt0X2luKTtcbkBAIC0yMDQ5LDYgKzIyNzcsMTEgQEAgaW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG4gXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRjID0gaXA2bXJfY2FjaGVfZmluZChtcnQsIFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFx1MDAyNnNyLmdycC5zaW42X2FkZHIpO1xuIFx0XHRpZiAoYykge1xuIFx0XHRcdHNyLnBrdGNudCA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLnBrdCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMTo1Ny44NzI4MTg5NzJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0Mjg3NjQzODIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIFRoaXMgSVB2NiBNdWx0aWNhc3QgUm91dGluZyBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIG1vZGlmeWluZyBgbmV0L2lwdjYvaXA2bXIuY2Ag4oCTIGl0J3MgYWxsIGFib3V0IElQdjYgbXVsdGljYXN0IHJvdXRpbmcsIGFuZCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgb3B0aW1hbCBmdXp6aW5nIGFwcHJvYWNoLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIGlzIGFic29sdXRlbHkgV29ydGhGdXp6aW5nLiBUaGUgY2hhbmdlcyBhcmUgcXVpdGUgc2lnbmlmaWNhbnQsIHRvdWNoaW5nIG9uIGNydWNpYWwgYXJlYXMgbGlrZSB0YWJsZSBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24sIGR5bmFtaWMgYWxsb2NhdGlvbiwgc2V0c29ja29wdC9nZXRzb2Nrb3B0L2lvY3RsIGhhbmRsaW5nLCBhbmQgdGhlIGludHJvZHVjdGlvbiBvZiB3b3JrcXVldWVzIGFuZCB0aW1lcnMuIFRoaXMgc2NyZWFtcyBwb3RlbnRpYWwgZm9yIGludGVyZXN0aW5nIGJ1Z3MuXG5cblNwZWNpZmljYWxseSwgdGhlIHBhdGNoIHNlZW1zIHRvIG92ZXJoYXVsIGhvdyBgbXJfdGFibGVzYCBhcmUgaGFuZGxlZC4gV2UncmUgc2VlaW5nIGR5bmFtaWMgY3JlYXRpb24sIGRlbGF5ZWQgcHVibGlzaGluZywgYW5kIGRlc3RydWN0aW9uIOKAkyB0aGF0J3MgYSByZWQgZmxhZyBmb3IgcmFjZSBjb25kaXRpb25zIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZXMsIHdoaWNoIGFyZSBhbHdheXMgcHJpbWUgdGFyZ2V0cy4gSSBzZWUgY2hhbmdlcyBpbiB0aGUgaGFuZGxpbmcgb2YgTVJUNl8qLCBTSU9DR0VUTUlGQ05UX0lONiwgYW5kIFNJT0NHRVRTR0NOVF9JTjYgdmlhIHNldHNvY2tvcHQvZ2V0c29ja29wdC9pb2N0bCwgYW5kIHRoZSBgaXBtcl9leHBpcmVfcHJvY2Vzc2AsIGBpcDZtcl9kZXZpY2VfZXZlbnRgLCBgaXA2bXJfc2tfaW5pdGAsIGFuZCBgaXA2bXJfc2tfZG9uZWAgZnVuY3Rpb25zIGFyZSBhbGwgaW4gdGhlIG1peCB0b28uIFdvcmtxdWV1ZXMgKGBpcDZtcl9kZXN0cm95X3dvcmtmbmApIGFuZCB0aW1lcnMgYWxzbyBnZXQgdGhyb3duIGluLiBUaGF0J3MgYSBnb29kIG1peCBvZiBwb3RlbnRpYWwgZnV6eiB0YXJnZXRzLlxuXG5UaGUgZ29vZCBuZXdzIGlzLCB0aGlzIHNob3VsZCBiZSByZWFjaGFibGUgaW4gYSBzdGFuZGFyZCBzeXprYWxsZXIgLyBRRU1VIHNldHVwLiBJUHY2IG11bHRpY2FzdCByb3V0aW5nIGlzIGNvcmUgbmV0d29ya2luZyBjb2RlLCBhY2Nlc3NpYmxlIHZpYSByYXcgc29ja2V0cyAoSVBQUk9UT19JQ01QVjYsIGV0Yy4pIGFuZCB0aG9zZSBzZXRzb2Nrb3B0L2lvY3RsIGNhbGxzLiBUaGF0IG1ha2VzIGl0IGVhc2llciB0byB0YXJnZXQgYW5kIHRlc3QuIEdpdmVuIHRoZSBtb2RpZmljYXRpb25zLCBJJ2xsIGJlIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gbG9ja2luZyBtZWNoYW5pc21zLCB0YWJsZSBsaWZlY3ljbGUgbWFuYWdlbWVudCwgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcsIGhvdyB0aGUgdGltZXJzIGFuZCB3b3JrcXVldWVzIGludGVyYWN0LCBhbmQgdGhlIGhhbmRsaW5nIG9mIG5ldGRldiBub3RpZmllciBldmVudHMuXG5cbk5vdywgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgYW55IG5lY2Vzc2FyeSBLY29uZmlnIGRlcGVuZGVuY2llcyB0byBnZXQgdGhlIHJlbGV2YW50IGNvZGUgZW5hYmxlZC4gSSdsbCB1c2UgYGdyZXBwZXJgIHRvIHF1aWNrbHkgc2NhbiBgbmV0L2lwdjYvS2NvbmZpZ2AgYW5kIGBuZXQvaXB2Ni9NYWtlZmlsZWAgdG8gaWRlbnRpZnkgYW55IHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLiBUaGlzIHdpbGwgZ3VpZGUgbXkgc3l6a2FsbGVyIGNvbmZpZ3VyYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2NTQsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozODMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjowMi4xNjA0NjYxMzRaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTY1NTAzNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX0lQVjZfTVJPVVRFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9pcHY2XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9pcHY2L01ha2VmaWxlPTE1PWlwdjYtJChDT05GSUdfU1lTQ1RMKSArPSBzeXNjdGxfbmV0X2lwdjYub1xcbm5ldC9pcHY2L01ha2VmaWxlOjE2OmlwdjYtJChDT05GSUdfSVBWNl9NUk9VVEUpICs9IGlwNm1yLm9cXG5uZXQvaXB2Ni9NYWtlZmlsZS0xNy1cXG4tLVxcbm5ldC9pcHY2L2FkZHJjb25mLmM9NTA4PXN0YXRpYyBpbnQgaW5ldDZfbmV0Y29uZl9tc2dzaXplX2RldmNvbmYoaW50IHR5cGUpXFxuLS1cXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTUxOC1cXHRcXHRzaXplICs9IG5sYV90b3RhbF9zaXplKDQpO1xcbm5ldC9pcHY2L2FkZHJjb25mLmM6NTE5OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTUyMC1cXHRpZiAoYWxsIHx8IHR5cGUgPT0gTkVUQ09ORkFfTUNfRk9SV0FSRElORylcXG4tLVxcbm5ldC9pcHY2L2FkZHJjb25mLmM9NTMyPXN0YXRpYyBpbnQgaW5ldDZfbmV0Y29uZl9maWxsX2RldmNvbmYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlmaW5kZXgsXFxuLS1cXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU2MS1cXHRcXHRnb3RvIG5sYV9wdXRfZmFpbHVyZTtcXG5uZXQvaXB2Ni9hZGRyY29uZi5jOjU2MjojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXFxubmV0L2lwdjYvYWRkcmNvbmYuYy01NjMtXFx0aWYgKChhbGwgfHwgdHlwZSA9PSBORVRDT05GQV9NQ19GT1JXQVJESU5HKSBcXHUwMDI2XFx1MDAyNlxcbi0tXFxubmV0L2lwdjYvYWRkcmNvbmYuYz01NjY0PXN0YXRpYyB2b2lkIGlwdjZfc3RvcmVfZGV2Y29uZihjb25zdCBzdHJ1Y3QgaXB2Nl9kZXZjb25mICpjbmYsXFxuLS1cXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU3MTctI2VuZGlmXFxubmV0L2lwdjYvYWRkcmNvbmYuYzo1NzE4OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9hZGRyY29uZi5jLTU3MTktXFx0YXJyYXlbREVWQ09ORl9NQ19GT1JXQVJESU5HXSA9IGF0b21pY19yZWFkKFxcdTAwMjZjbmYtXFx1MDAzZW1jX2ZvcndhcmRpbmcpO1xcbi0tXFxubmV0L2lwdjYvYWRkcmNvbmYuYz02ODQ5PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIGFkZHJjb25mX3N5c2N0bFtdID0ge1xcbi0tXFxubmV0L2lwdjYvYWRkcmNvbmYuYy03MTE3LSNlbmRpZlxcbm5ldC9pcHY2L2FkZHJjb25mLmM6NzExODojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXFxubmV0L2lwdjYvYWRkcmNvbmYuYy03MTE5LVxcdHtcXG4tLVxcbm5ldC9pcHY2L2lwNl9pbnB1dC5jPTU1ND1pbnQgaXA2X21jX2lucHV0KHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvaXB2Ni9pcDZfaW5wdXQuYy01NzYtXFxubmV0L2lwdjYvaXA2X2lucHV0LmM6NTc3OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9pcDZfaW5wdXQuYy01NzgtXFx0LypcXG4tLVxcbm5ldC9pcHY2L2lwNm1yLmM9MTA2PXN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpO1xcbm5ldC9pcHY2L2lwNm1yLmMtMTA3LVxcbm5ldC9pcHY2L2lwNm1yLmM6MTA4OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxubmV0L2lwdjYvaXA2bXIuYy0xMDktI2RlZmluZSBpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldCkgXFxcXFxcbi0tXFxubmV0L2lwdjYvaXA2bXIuYz0zOTc9c3RhdGljIHZvaWQgaXA2bXJfbmV3X3RhYmxlX3NldChzdHJ1Y3QgbXJfdGFibGUgKm1ydCxcXG4tLVxcbm5ldC9pcHY2L2lwNm1yLmMtMzk5LXtcXG5uZXQvaXB2Ni9pcDZtci5jOjQwMDojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xcbm5ldC9pcHY2L2lwNm1yLmMtNDAxLVxcdGxpc3RfYWRkX3RhaWxfcmN1KFxcdTAwMjZtcnQtXFx1MDAzZWxpc3QsIFxcdTAwMjZuZXQtXFx1MDAzZWlwdjYubXI2X3RhYmxlcyk7XFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jPTQ1OT1zdGF0aWMgdm9pZCBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy00NjItXFxubmV0L2lwdjYvaXA2bXIuYzo0NjM6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcXG5uZXQvaXB2Ni9pcDZtci5jLTQ2NC1cXHRpZiAobXJ0LVxcdTAwM2VpZCA9PSBSVDZfVEFCTEVfREZMVClcXG4tLVxcbm5ldC9pcHY2L2lwNm1yLmMtNDg2LVxcbm5ldC9pcHY2L2lwNm1yLmM6NDg3OiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxubmV0L2lwdjYvaXA2bXIuYy00ODgtc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jPTE0MjI9c3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy0xNDI2LVxcdHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTtcXG5uZXQvaXB2Ni9pcDZtci5jOjE0Mjc6I2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcXG5uZXQvaXB2Ni9pcDZtci5jLTE0MjgtXFx0c3RydWN0IG1yX3RhYmxlICptcnQsICpuZXh0O1xcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy0xNDM3LVxcbm5ldC9pcHY2L2lwNm1yLmM6MTQzODojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xcbm5ldC9pcHY2L2lwNm1yLmMtMTQzOS1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCBcXHUwMDI2bmV0LVxcdTAwM2VpcHY2Lm1yNl90YWJsZXMsIGxpc3QpXFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jPTE4NjE9aW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy0yMDc3LSNlbmRpZlxcbm5ldC9pcHY2L2lwNm1yLmM6MjA3ODojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xcbm5ldC9pcHY2L2lwNm1yLmMtMjA3OS1cXHRjYXNlIE1SVDZfVEFCTEU6XFxuLS1cXG5uZXQvaXB2Ni9yYXcuYz0xMTI2PXN0YXRpYyBpbnQgcmF3djZfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCBpbnQgKmthcmcpXFxuLS1cXG5uZXQvaXB2Ni9yYXcuYy0xMTQ2LVxcdGRlZmF1bHQ6XFxubmV0L2lwdjYvcmF3LmM6MTE0NzojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXFxubmV0L2lwdjYvcmF3LmMtMTE0OC1cXHRcXHRyZXR1cm4gaXA2bXJfaW9jdGwoc2ssIGNtZCwga2FyZyk7XFxuLS1cXG5uZXQvaXB2Ni9yYXcuYz0xMTU2PXN0YXRpYyBpbnQgY29tcGF0X3Jhd3Y2X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5uZXQvaXB2Ni9yYXcuYy0xMTYyLVxcdGRlZmF1bHQ6XFxubmV0L2lwdjYvcmF3LmM6MTE2MzojaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFXFxubmV0L2lwdjYvcmF3LmMtMTE2NC1cXHRcXHRyZXR1cm4gaXA2bXJfY29tcGF0X2lvY3RsKHNrLCBjbWQsIGNvbXBhdF9wdHIoYXJnKSk7XFxuLS1cXG5uZXQvaXB2Ni9yb3V0ZS5jPTU3ODc9c3RhdGljIGludCBydDZfZmlsbF9ub2RlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9pcHY2L3JvdXRlLmMtNTg1Mi1cXHRpZiAoaWlmKSB7XFxubmV0L2lwdjYvcm91dGUuYzo1ODUzOiNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9yb3V0ZS5jLTU4NTQtXFx0XFx0aWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoXFx1MDAyNnJ0Nl9kc3QtXFx1MDAzZWFkZHIpKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjAyLjI1NzA1NzIzM1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5NzEyOTQ4MDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIElQdjYgTXVsdGljYXN0IENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBJUHY2IG11bHRpY2FzdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBuYXZpZ2F0ZSB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZmlsZXMsIHNwZWNpZmljYWxseSBgbmV0L2lwdjYvS2NvbmZpZ2AuIFRoYXQncyB0aGUgbG9naWNhbCBwbGFjZSB0byBzdGFydCBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMgb2YgYW55dGhpbmcgcmVsYXRlZCB0byBJUHY2LiBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gYW55dGhpbmcgcmVsYXRlZCB0byBgSVBWNl9NUk9VVEVgLCBhcyB0aGF0J3MgbXkgZm9jYWwgcG9pbnQuIEkgZmlndXJlIGJ5IGV4YW1pbmluZyB0aGUgYEtjb25maWdgIGZpbGUgYW5kIHRoZSBzdXJyb3VuZGluZyBjb2RlIEknbGwgZmluZCB0aGUgc3BlY2lmaWMgY29uZmlnIG5hbWVzLCBkZXBlbmRlbmNpZXMsIGFuZCByZWxhdGlvbnNoaXBzIGJldHdlZW4gdmFyaW91cyBJUHY2IG11bHRpY2FzdCBmZWF0dXJlcy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFuZCBob3cgdGhleSBpbnRlcmFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIyODksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjowNC4yMjgzNTUxMTJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODY1Mzg2ODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiSVBWNl9NUk9VVEVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2lwdjYvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvaXB2Ni9LY29uZmlnPTI0Mz1jb25maWcgSVBWNl9TVUJUUkVFU1xcbi0tXFxubmV0L2lwdjYvS2NvbmZpZy0yNTYtXFxubmV0L2lwdjYvS2NvbmZpZzoyNTc6Y29uZmlnIElQVjZfTVJPVVRFXFxubmV0L2lwdjYvS2NvbmZpZy0yNTgtXFx0Ym9vbCBcXFwiSVB2NjogbXVsdGljYXN0IHJvdXRpbmdcXFwiXFxuLS1cXG5uZXQvaXB2Ni9LY29uZmlnLTI2NC1cXG5uZXQvaXB2Ni9LY29uZmlnOjI2NTpjb25maWcgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxubmV0L2lwdjYvS2NvbmZpZy0yNjYtXFx0Ym9vbCBcXFwiSVB2NjogbXVsdGljYXN0IHBvbGljeSByb3V0aW5nXFxcIlxcbm5ldC9pcHY2L0tjb25maWc6MjY3OlxcdGRlcGVuZHMgb24gSVBWNl9NUk9VVEVcXG5uZXQvaXB2Ni9LY29uZmlnLTI2OC1cXHRzZWxlY3QgRklCX1JVTEVTXFxuLS1cXG5uZXQvaXB2Ni9LY29uZmlnPTI3OT1jb25maWcgSVBWNl9QSU1TTV9WMlxcbm5ldC9pcHY2L0tjb25maWctMjgwLVxcdGJvb2wgXFxcIklQdjY6IFBJTS1TTSB2ZXJzaW9uIDIgc3VwcG9ydFxcXCJcXG5uZXQvaXB2Ni9LY29uZmlnOjI4MTpcXHRkZXBlbmRzIG9uIElQVjZfTVJPVVRFXFxubmV0L2lwdjYvS2NvbmZpZy0yODItXFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjowNC4zMTQ5MDEzNloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyMDg2NzM4MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIElQdjYgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBJUHY2IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gTXkgaW5zdGluY3QgaXMgdG8gaGVhZCBzdHJhaWdodCB0byB0aGUgc291cmNlLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGNoZWNrIHRoZSBgcmVhZC1maWxlYCBpbiB0aGUgYG5ldC9pcHY2L0tjb25maWdgIGZpbGUsIGZvY3VzaW5nIG9uIHRoZSBsaW5lcyBiZXR3ZWVuIDI1MCBhbmQgMjkwLiBUaGF0J3MgdXN1YWxseSB3aGVyZSB0aGUgbWVhdCBvZiB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgYW5kIGRlcGVuZGVuY2llcyBhcmUgZGVmaW5lZC4gVGhpcyB3aWxsIGdpdmUgbWUgdGhlIG1vc3QgZGlyZWN0IGFuZCByZWxpYWJsZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0J3MgYXZhaWxhYmxlIGFuZCBob3cgdGhleSBpbnRlcmFjdC4gVGhpcyBhcHByb2FjaCBzaG91bGQgb2ZmZXIgYSBnb29kIG92ZXJ2aWV3IG9mIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNzg5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjI6MDYuNTIzNTc3Nzc2WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTIzNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2lwdjYvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyNTA6XFx0XFx0ICBub3JtYWwgYW5kIHNvdXJjZSBwcmVmaXggc3BlY2lmaWMgcm91dGVzIGluIHRoZSBzYW1lIHJvdXRpbmcgdGFibGVcXG4gMjUxOlxcdFxcdCAgbWF5IHNvbWV0aW1lcyBsZWFkIHRvIHVuaW50ZW5kZWQgcm91dGluZyBiZWhhdmlvci4gIFRoaXMgY2FuIGJlXFxuIDI1MjpcXHRcXHQgIGF2b2lkZWQgYnkgZGVmaW5pbmcgZGlmZmVyZW50IHJvdXRpbmcgdGFibGVzIGZvciB0aGUgbm9ybWFsIGFuZFxcbiAyNTM6XFx0XFx0ICBzb3VyY2UgcHJlZml4IHNwZWNpZmljIHJvdXRlcy5cXG4gMjU0OlxcdFxcbiAyNTU6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAyNTY6XFx0XFxuIDI1NzpcXHRjb25maWcgSVBWNl9NUk9VVEVcXG4gMjU4OlxcdFxcdGJvb2wgXFxcIklQdjY6IG11bHRpY2FzdCByb3V0aW5nXFxcIlxcbiAyNTk6XFx0XFx0ZGVwZW5kcyBvbiBJUFY2XFxuIDI2MDpcXHRcXHRzZWxlY3QgSVBfTVJPVVRFX0NPTU1PTlxcbiAyNjE6XFx0XFx0aGVscFxcbiAyNjI6XFx0XFx0ICBTdXBwb3J0IGZvciBJUHY2IG11bHRpY2FzdCBmb3J3YXJkaW5nLlxcbiAyNjM6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAyNjQ6XFx0XFxuIDI2NTpcXHRjb25maWcgSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXFxuIDI2NjpcXHRcXHRib29sIFxcXCJJUHY2OiBtdWx0aWNhc3QgcG9saWN5IHJvdXRpbmdcXFwiXFxuIDI2NzpcXHRcXHRkZXBlbmRzIG9uIElQVjZfTVJPVVRFXFxuIDI2ODpcXHRcXHRzZWxlY3QgRklCX1JVTEVTXFxuIDI2OTpcXHRcXHRoZWxwXFxuIDI3MDpcXHRcXHQgIE5vcm1hbGx5LCBhIG11bHRpY2FzdCByb3V0ZXIgcnVucyBhIHVzZXJzcGFjZSBkYWVtb24gYW5kIGRlY2lkZXNcXG4gMjcxOlxcdFxcdCAgd2hhdCB0byBkbyB3aXRoIGEgbXVsdGljYXN0IHBhY2tldCBiYXNlZCBvbiB0aGUgc291cmNlIGFuZFxcbiAyNzI6XFx0XFx0ICBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgbXVsdGljYXN0IHJvdXRlclxcbiAyNzM6XFx0XFx0ICB3aWxsIGFsc28gYmUgYWJsZSB0byB0YWtlIGludGVyZmFjZXMgYW5kIHBhY2tldCBtYXJrcyBpbnRvXFxuIDI3NDpcXHRcXHQgIGFjY291bnQgYW5kIHJ1biBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdXNlcnNwYWNlIGRhZW1vbnNcXG4gMjc1OlxcdFxcdCAgc2ltdWx0YW5lb3VzbHksIGVhY2ggb25lIGhhbmRsaW5nIGEgc2luZ2xlIHRhYmxlLlxcbiAyNzY6XFx0XFxuIDI3NzpcXHRcXHQgIElmIHVuc3VyZSwgc2F5IE4uXFxuIDI3ODpcXHRcXG4gMjc5OlxcdGNvbmZpZyBJUFY2X1BJTVNNX1YyXFxuIDI4MDpcXHRcXHRib29sIFxcXCJJUHY2OiBQSU0tU00gdmVyc2lvbiAyIHN1cHBvcnRcXFwiXFxuIDI4MTpcXHRcXHRkZXBlbmRzIG9uIElQVjZfTVJPVVRFXFxuIDI4MjpcXHRcXHRoZWxwXFxuIDI4MzpcXHRcXHQgIFN1cHBvcnQgZm9yIElQdjYgUElNIG11bHRpY2FzdCByb3V0aW5nIHByb3RvY29sIFBJTS1TTXYyLlxcbiAyODQ6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAyODU6XFx0XFxuIDI4NjpcXHRjb25maWcgSVBWNl9TRUc2X0xXVFVOTkVMXFxuIDI4NzpcXHRcXHRib29sIFxcXCJJUHY2OiBTZWdtZW50IFJvdXRpbmcgSGVhZGVyIGVuY2Fwc3VsYXRpb24gc3VwcG9ydFxcXCJcXG4gMjg4OlxcdFxcdGRlcGVuZHMgb24gSVBWNlxcbiAyODk6XFx0XFx0c2VsZWN0IExXVFVOTkVMXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjA2LjUyMzY3Mjk5NloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjc4MjEyNDc0MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIElQdjYgTXVsdGljYXN0IFJvdXRpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIHNlZSB3ZSdyZSBkZWFsaW5nIHdpdGggYSBwYXRjaCByZWxhdGVkIHRvIElQdjYgbXVsdGljYXN0IHJvdXRpbmcsIGluZGljYXRlZCBieSB0aGUga2V5IHN5bWJvbHMgYElQVjZfTVJPVVRFYCBhbmQgYElQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU2AuIFRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBgI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNgIGJsb2NrcyBmb3IgdGhpbmdzIGxpa2UgdGFibGUgZGVzdHJ1Y3Rpb24gYW5kIGBNUlQ2X1RBQkxFYCBgc2V0c29ja29wdGAgdXNhZ2UgaW1tZWRpYXRlbHkgZmxhZ3MgdGhhdCB0aGlzIGlzbid0IGEgdHJpdmlhbCBjaGFuZ2UuIFdlIGFyZSBkZWZpbml0ZWx5IHdvcmtpbmcgd2l0aCBzb21lIG5ldyBsb2dpYyBmb3IgbXVsdGlwbGUgdGFibGVzIGhlcmUsIHdoaWNoIG1lYW5zIHdlIGhhdmUgdG8gZGl2ZSBhIGxpdHRsZSBkZWVwZXIuIE9mIGNvdXJzZSwgYElQVjZgIGlzIGFsc28gYSBjcml0aWNhbCBjb25maWcuXG5cbk5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlLiBMZXQncyBsb29rIGF0IHRoZSBmdW5jdGlvbnMgYWRkZWQgb3IgbW9kaWZpZWQ6IGEgbGlzdCBvZiBmdW5jdGlvbnMsIGJvdGggc3RhdGljIGFuZCBleHBvcnRlZC4gSSBzZWUgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCB0YWJsZSBsb29rdXAsIGFsbG9jYXRpb24sIHB1Ymxpc2hpbmcsIGFuZCBkZXN0cnVjdGlvbiAocG90ZW50aWFsbHkgZGVsYXllZCB2aWEgYSB3b3JrcXVldWUgd2hpY2ggaXMgdmVyeSBpbnRlcmVzdGluZyBmb3IgY29uY3VycmVuY3kpLCBhbG9uZyB3aXRoIHRpbWVyIGFuZCBub3RpZmllciBjYWxsYmFja3MuIENyaXRpY2FsbHksIEkgaGF2ZSB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZXNlOiBgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0YCwgYGlwNl9tcm91dGVfZ2V0c29ja29wdGAsIGBpcDZtcl9pb2N0bGAsIGBpcDZtcl9jb21wYXRfaW9jdGxgLCBhbmQgYGlwNm1yX3NrX2RvbmVgIGFzIHRoZXNlIHJlcHJlc2VudCB0aGUgdXNlci1zcGFjZSBpbnRlcmZhY2UuIFRoZXkgYXJlIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgdGhlIGVudHJ5cG9pbnRzLiBgaXA2bXJfZGV2aWNlX2V2ZW50YCwgYGlwbXJfZXhwaXJlX3Byb2Nlc3NgLCBgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgLCBhbmQgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCBhcmUga2V5IGFzIHdlbGwsIGFzIHRoZXNlIGFyZSB0aGUgY29yZSBpbnRlcm5hbCBmdW5jdGlvbnMuXG5cbkEgcXVpY2sgY2hlY2sgY29uZmlybXMgdGhhdCBvbmx5IGBuZXQvaXB2Ni9pcDZtci5jYCBoYXMgYmVlbiBtb2RpZmllZC4gVGhhdCdzIGdvb2QsIGtlZXBzIHRoZSBmb2N1cyBzb21ld2hhdCBtYW5hZ2VhYmxlLlxuXG5BbHJpZ2h0LCB3aGF0IHN5bWJvbHMgYXJlIGFic29sdXRlbHkgY3JpdGljYWw/IGBpcDZfbXJvdXRlX3NldHNvY2tvcHRgLCBgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0YCwgYGlwNm1yX2lvY3RsYCwgYGlwNm1yX2NvbXBhdF9pb2N0bGAsIGBpcDZtcl9za19kb25lYCwgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAsIGBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlYCwgYGlwNm1yX2Rlc3Ryb3lfd29ya2ZuYCwgYGlwNm1yX2RldmljZV9ldmVudGAsIGFuZCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AgYXJlIHRoZSBvbmVzIHRvIGZvY3VzIG9uLiBUaGV5IGFyZSBzcGVjaWZpYyB0byBJUHY2IG11bHRpY2FzdCByb3V0aW5nIChgaXA2bXJgKSwgYW5kIG5vdCB1YmlxdWl0b3VzLCBzbyB0aGF0IHJlZHVjZXMgdGhlIGNoYW5jZSBvZiBjb25mbGljdHMgd2l0aCBvdGhlciBmdW5jdGlvbnMuXG5cbkZvciB0aGUgY29uZmlndXJhdGlvbnMsIGBJUFY2YCwgYElQVjZfTVJPVVRFYCwgYW5kIGBJUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNgIGFyZSBlc3NlbnRpYWwgZm9yIGVuYWJsaW5nIHRoaXMgZnVuY3Rpb25hbGl0eS5cblxuTm93LCBsZXQncyBjb25maXJtIHRoZSBmdXp6aW5nIHN0cmF0ZWd5LiBUaGUgcGF0Y2gncyBpbXBhY3QgaXMgc2lnbmlmaWNhbnQ6IGl0IG1vZGlmaWVzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCBpbiBgaXA2bXIuY2AsIGludHJvZHVjaW5nIGR5bmFtaWMgdGFibGUgYWxsb2NhdGlvbiwgZGVsYXllZCBwdWJsaXNoaW5nLCBhc3luY2hyb25vdXMgdGFibGUgZGVzdHJ1Y3Rpb24gdmlhIHdvcmtxdWV1ZXMsIGFuZCBzaWduaWZpY2FudCBtb2RpZmljYXRpb25zIHRvIGxvY2tpbmcgYW5kIGxpZmVjeWNsZSBoYW5kbGluZyBhY3Jvc3MgdGhlIHVzZXItc3BhY2UgaW50ZXJmYWNlIChzZXRzb2Nrb3B0LCBnZXRzb2Nrb3B0LCBpb2N0bHMpIGFuZCBpbnRlcm5hbCBtZWNoYW5pc21zIGxpa2UgbmV0ZGV2IGV2ZW50IG5vdGlmaWNhdGlvbiBhbmQgdGltZXIgZXhwaXJhdGlvbi4gVGhpcyBjb2RlIGlzIGFsc28gZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIHJhdyBJUHY2IHNvY2tldHMgYW5kIHRoZSBpb2N0bC9zZXRzb2Nrb3B0IHN5c2NhbGxzLiBEZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIFRoZSBnb2FsIG9mIHRoaXMgZnV6eiBpcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBrZXkgZnVuY3Rpb25zLCBwYXJ0aWN1bGFybHkgdGhlIG9uZXMgdGhhdCBkZWFsIHdpdGggdGhlIHVzZXItc3BhY2UgaW50ZXJhY3Rpb24gYW5kIHRhYmxlIG1hbmFnZW1lbnQsIGFyZSByb2J1c3QgYW5kIHNlY3VyZSBhbmQgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyByYWNlIGNvbmRpdGlvbnMgb3IgbWVtb3J5IGVycm9ycyBwcmVzZW50LlxuXG5TbywgdG8gc3VtbWFyaXplLCB0aGUgYEZvY3VzU3ltYm9sc2AgYXJlOiBgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0YCwgYGlwNl9tcm91dGVfZ2V0c29ja29wdGAsIGBpcDZtcl9pb2N0bGAsIGBpcDZtcl9jb21wYXRfaW9jdGxgLCBgaXA2bXJfc2tfZG9uZWAsIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgLCBgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9kZXN0cm95X3dvcmtmbmAsIGBpcDZtcl9kZXZpY2VfZXZlbnRgLCBhbmQgYGlwbXJfZXhwaXJlX3Byb2Nlc3NgLiBUaGUgcmVxdWlyZWQgYEVuYWJsZUNvbmZpZ3NgIGFyZTogYElQVjZgLCBgSVBWNl9NUk9VVEVgLCBhbmQgYElQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU2AuXG5cblJlYWR5IHRvIHByb2NlZWQgd2l0aCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzU4OSwiT3V0cHV0VG9rZW5zIjoyMzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoxNC4zNDQ5MjM3NTJaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjExMDg0MDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklQVjZcIixcbiAgICBcIklQVjZfTVJPVVRFXCIsXG4gICAgXCJJUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJpcDZfbXJvdXRlX3NldHNvY2tvcHRcIixcbiAgICBcImlwNl9tcm91dGVfZ2V0c29ja29wdFwiLFxuICAgIFwiaXA2bXJfaW9jdGxcIixcbiAgICBcImlwNm1yX2NvbXBhdF9pb2N0bFwiLFxuICAgIFwiaXA2bXJfc2tfZG9uZVwiLFxuICAgIFwiaXA2bXJfZ2V0X29yX2FsbG9jX3NrX3RhYmxlXCIsXG4gICAgXCJpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlXCIsXG4gICAgXCJpcDZtcl9kZXN0cm95X3dvcmtmblwiLFxuICAgIFwiaXA2bXJfZGV2aWNlX2V2ZW50XCIsXG4gICAgXCJpcG1yX2V4cGlyZV9wcm9jZXNzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGlwNm1yKSB0YWJsZSBsaWZlY3ljbGUgYW5kIGxvY2tpbmcuIEl0IGFkZHMgZHluYW1pYyB0YWJsZSBhbGxvY2F0aW9uLCBhc3luY2hyb25vdXMgdGFibGUgZGVzdHJ1Y3Rpb24gdmlhIHdvcmtxdWV1ZXMsIGFuZCB1cGRhdGVzIHNldHNvY2tvcHQsIGdldHNvY2tvcHQsIGlvY3RsLCB0aW1lciBleHBpcmF0aW9uLCBhbmQgbmV0ZGV2IG5vdGlmaWVyIGhhbmRsaW5nLiBUaGVzZSBwYXRocyBhcmUgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgcmF3IElQdjYgc29ja2V0cy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJUFY2XCIsXG4gICAgXCJJUFY2X01ST1VURVwiLFxuICAgIFwiSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaXA2X21yb3V0ZV9zZXRzb2Nrb3B0XCIsXG4gICAgXCJpcDZfbXJvdXRlX2dldHNvY2tvcHRcIixcbiAgICBcImlwNm1yX2lvY3RsXCIsXG4gICAgXCJpcDZtcl9jb21wYXRfaW9jdGxcIixcbiAgICBcImlwNm1yX3NrX2RvbmVcIixcbiAgICBcImlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZVwiLFxuICAgIFwiaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZVwiLFxuICAgIFwiaXA2bXJfZGVzdHJveV93b3JrZm5cIixcbiAgICBcImlwNm1yX2RldmljZV9ldmVudFwiLFxuICAgIFwiaXBtcl9leHBpcmVfcHJvY2Vzc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIChpcDZtcikgdGFibGUgbGlmZWN5Y2xlIGFuZCBsb2NraW5nLiBJdCBhZGRzIGR5bmFtaWMgdGFibGUgYWxsb2NhdGlvbiwgYXN5bmNocm9ub3VzIHRhYmxlIGRlc3RydWN0aW9uIHZpYSB3b3JrcXVldWVzLCBhbmQgdXBkYXRlcyBzZXRzb2Nrb3B0LCBnZXRzb2Nrb3B0LCBpb2N0bCwgdGltZXIgZXhwaXJhdGlvbiwgYW5kIG5ldGRldiBub3RpZmllciBoYW5kbGluZy4gVGhlc2UgcGF0aHMgYXJlIGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHJhdyBJUHY2IHNvY2tldHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjE0LjQ2NjA0MzIzMVoiLCJTZXEiOjExLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzM4MDg0MTY1MDcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoxNC40NjY3NjczNFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjMzODA3NjgwNjM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBJUHY2IG11bHRpY2FzdCByb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQgKG5ldC9pcHY2L2lwNm1yLmMpIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRhYmxlcyBvbiBkZW1hbmQgd2hlbiBzb2NrZXQgb3B0aW9ucyBhcmUgY29uZmlndXJlZCBhbmQgdG8gZGVzdHJveSB0aGVtIHdoZW4gdGhleSBiZWNvbWUgdW5yZWZlcmVuY2VkIG9yIGVtcHR5Llxcblxcbi0gTWVtb3J5IEFsbG9jYXRpb25zOiBOZXcgZHluYW1pYyBhbGxvY2F0aW9ucyAoc3VjaCBhcyBgc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29ya2AgYWxsb2NhdGVkIHZpYSBga21hbGxvY19vYmpgKSBoYXZlIGFsbCBtZW1iZXIgZmllbGRzIChgd29ya2AsIGBuZXRgLCBgaWRgKSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBUaGUgdW5kZXJseWluZyBtdWx0aWNhc3QgdGFibGVzIGFsbG9jYXRlZCB2aWEgYG1yX3RhYmxlX2FsbG9jKClgIHVzZSBga3phbGxvY19vYmooKWAuXFxuLSBEYXRhIHNlbnQgdG8gdXNlciBzcGFjZTogaW9jdGwvY29tcGF0X2lvY3RsIGFuZCBnZXRzb2Nrb3B0IGhhbmRsZXJzIG9ubHkgY29weSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGZpZWxkcyBvciBkYXRhIGNvcGllZCBmcm9tIHVzZXIgc3BhY2UgYmFjayB0byB1c2VyIHNwYWNlIHdpdGhvdXQgbGVhdmluZyB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgcmVhZGluZyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuXFxuLSBDb250cm9sIGZsb3cgYW5kIExpZmV0aW1lczogQ2hhbmdlcyBhZmZlY3QgdGFibGUgbGlmZWN5Y2xlLCBSQ1Ugc3luY2hyb25pemF0aW9uLCBsaXN0IG1hbmlwdWxhdGlvbnMsIGFuZCBsb2NraW5nIChSVE5ML21ydF9sb2NrKS4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGVzZSBwYXRocyBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGFjY2Vzcywgb3IgbWVtb3J5IGxlYWtzLCB3aGljaCBhcmUgaGFuZGxlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIEtNRU1MRUFLLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBpbnRyb2R1Y2VkLCBzbyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA1MjFjMGIwMmE2ODE0MjAwYjBlZWIyMGFhZjEzYzVkODRlOThmZTViXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFN1biBTZXAgNiAxNToyMTo1NiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jXG5pbmRleCAzZjJlZDliNzdkZWI1Li4yNmJkMmNjZDQyMDFhIDEwMDY0NFxuLS0tIGEvbmV0L2lwdjYvaXA2bXIuY1xuKysrIGIvbmV0L2lwdjYvaXA2bXIuY1xuQEAgLTI4LDYgKzI4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb21wYXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JoYXNodGFibGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0L3Byb3RvY29sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9za2J1ZmYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9yYXcuaFx1MDAzZVxuQEAgLTM2OCw2ICszNjksMTIgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfZ2V0X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0cmV0dXJuIG1ydDtcbiB9XG4gXG4rc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbG9va3VwX3NrX3RhYmxlKHN0cnVjdCBzb2NrICpzaylcbit7XG4rXHRyZXR1cm4gX19pcDZtcl9nZXRfdGFibGUoc29ja19uZXQoc2spLFxuK1x0XHRcdFx0IHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4rfVxuK1xuIHN0YXRpYyBpbnQgaXA2bXJfaGFzaF9jbXAoc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgKmFyZyxcbiBcdFx0XHQgIGNvbnN0IHZvaWQgKnB0cilcbiB7XG5AQCAtNDE3LDYgKzQyNCwxMjQgQEAgc3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXA2bXJfbmV3X3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkKVxuIFx0XHRcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwNm1yX25ld190YWJsZV9zZXQpO1xuIH1cbiBcbisvKiB0YWJsZV9zZXQgY2FsbGJhY2sgdXNlZCB3aGlsZSB0aGUgbmV3IHRhYmxlIGlzIHN0aWxsIHVucHVibGlzaGVkLiAqL1xuK3N0YXRpYyB2b2lkIGlwNm1yX3RhYmxlX25vX3B1Ymxpc2goc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBuZXQgKm5ldClcbit7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssXG4rXHRcdFx0XHRcdFx0ICAgIGJvb2wgKm5ld190YWJsZSlcbit7XG4rXHR1MzIgaWQgPSByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQ7XG4rXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4rXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbitcbitcdEFTU0VSVF9SVE5MKCk7XG4rXHQqbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4rXHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShuZXQsIGlkKTtcbitcdGlmIChtcnQpXG4rXHRcdHJldHVybiBtcnQ7XG4rXG4rXHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcdTAwMjZpcDZtcl9tcl90YWJsZV9vcHMsXG4rXHRcdFx0ICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl90YWJsZV9ub19wdWJsaXNoKTtcbitcdGlmICghSVNfRVJSKG1ydCkpXG4rXHRcdCpuZXdfdGFibGUgPSB0cnVlO1xuK1x0cmV0dXJuIG1ydDtcbit9XG4rXG4rc3RhdGljIHZvaWQgaXA2bXJfcHVibGlzaF9uZXdfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsIGJvb2wgbmV3X3RhYmxlKVxuK3tcbitcdGlmIChuZXdfdGFibGUpXG4rXHRcdGlwNm1yX25ld190YWJsZV9zZXQobXJ0LCByZWFkX3BuZXQoXHUwMDI2bXJ0LVx1MDAzZW5ldCkpO1xuK31cbitcbitzdGF0aWMgdm9pZCBpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuK3tcbitcdEFTU0VSVF9SVE5MKCk7XG4rXG4rI2lmZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVNcbitcdGlmIChtcnQtXHUwMDNlaWQgPT0gUlQ2X1RBQkxFX0RGTFQpXG4rXHRcdHJldHVybjtcbitcdC8qIE5lc3RlZCBORVRERVZfVU5SRUdJU1RFUiBtYXkgYWxyZWFkeSBoYXZlIHVubGlua2VkIHRoaXMgdGFibGUuICovXG4rXHRpZiAoX19pcDZtcl9nZXRfdGFibGUocmVhZF9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQpLCBtcnQtXHUwMDNlaWQpICE9IG1ydClcbitcdFx0cmV0dXJuO1xuK1x0aWYgKHJ0bmxfZGVyZWZlcmVuY2UobXJ0LVx1MDAzZW1yb3V0ZV9zaykgfHxcbitcdCAgICBtcnQtXHUwMDNlbWF4dmlmIHx8XG4rXHQgICAgIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY19jYWNoZV9saXN0KSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c3Bpbl9sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbitcdGlmICghbGlzdF9lbXB0eShcdTAwMjZtcnQtXHUwMDNlbWZjX3VucmVzX3F1ZXVlKSkge1xuK1x0XHRzcGluX3VubG9ja19iaChcdTAwMjZtZmNfdW5yZXNfbG9jayk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNm1mY191bnJlc19sb2NrKTtcbitcbitcdGxpc3RfZGVsX3JjdShcdTAwMjZtcnQtXHUwMDNlbGlzdCk7XG4rXHR0aW1lcl9zaHV0ZG93bl9zeW5jKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lcik7XG4rXHRtcl90YWJsZV9mcmVlKG1ydCk7XG4rI2VuZGlmXG4rfVxuK1xuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4rc3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayB7XG4rXHRzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yaztcbitcdHN0cnVjdCBuZXQgKm5ldDtcbitcdHUzMiBpZDtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbit7XG4rXHRzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrICpkdyA9XG4rXHRcdGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrLCB3b3JrKTtcbitcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuK1xuK1x0cnRubF9sb2NrKCk7XG4rXHRtcnQgPSBfX2lwNm1yX2dldF90YWJsZShkdy1cdTAwM2VuZXQsIGR3LVx1MDAzZWlkKTtcbitcdGlmIChtcnQpXG4rXHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbitcdHJ0bmxfdW5sb2NrKCk7XG4rXHRwdXRfbmV0KGR3LVx1MDAzZW5ldCk7XG4rXHRrZnJlZShkdyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGlwNm1yX3F1ZXVlX21heWJlX2Rlc3Ryb3koc3RydWN0IG1yX3RhYmxlICptcnQpXG4re1xuK1x0c3RydWN0IG5ldCAqbmV0ID0gcmVhZF9wbmV0KFx1MDAyNm1ydC1cdTAwM2VuZXQpO1xuK1x0c3RydWN0IGlwNm1yX2Rlc3Ryb3lfd29yayAqZHc7XG4rXG4rXHRpZiAobXJ0LVx1MDAzZWlkID09IFJUNl9UQUJMRV9ERkxUKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRkdyA9IGttYWxsb2Nfb2JqKCpkdywgR0ZQX0FUT01JQyk7XG4rXHRpZiAoIWR3KSB7XG4rXHRcdG1vZF90aW1lcihcdTAwMjZtcnQtXHUwMDNlaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgKyBIWik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghbWF5YmVfZ2V0X25ldChuZXQpKSB7XG4rXHRcdGtmcmVlKGR3KTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0SU5JVF9XT1JLKFx1MDAyNmR3LVx1MDAzZXdvcmssIGlwNm1yX2Rlc3Ryb3lfd29ya2ZuKTtcbitcdGR3LVx1MDAzZW5ldCA9IG5ldDtcbitcdGR3LVx1MDAzZWlkID0gbXJ0LVx1MDAzZWlkO1xuK1x0cXVldWVfd29yayhzeXN0ZW1fZGZsX3dxLCBcdTAwMjZkdy1cdTAwM2V3b3JrKTtcbit9XG4rI2Vsc2VcbitzdGF0aWMgdm9pZCBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuK3tcbit9XG4rI2VuZGlmXG4rXG4rc3RhdGljIGludCBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKHN0cnVjdCBtcl90YWJsZSAqbXJ0LCBib29sIG5ld190YWJsZSxcbitcdFx0XHRcdCAgaW50IGVycilcbit7XG4rXHRpZiAobmV3X3RhYmxlIFx1MDAyNlx1MDAyNiBlcnIpXG4rXHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIGlwNm1yX2ZyZWVfdGFibGUoc3RydWN0IG1yX3RhYmxlICptcnQsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfa2lsbF9saXN0KVxuIHtcbkBAIC04NjYsMTYgKzk5MSwyNSBAQCBzdGF0aWMgdm9pZCBpcG1yX2RvX2V4cGlyZV9wcm9jZXNzKHN0cnVjdCBtcl90YWJsZSAqbXJ0KVxuIHN0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3Moc3RydWN0IHRpbWVyX2xpc3QgKnQpXG4ge1xuIFx0c3RydWN0IG1yX3RhYmxlICptcnQgPSB0aW1lcl9jb250YWluZXJfb2YobXJ0LCB0LCBpcG1yX2V4cGlyZV90aW1lcik7XG4rXHRib29sIGVtcHR5ID0gZmFsc2U7XG4gXG4gXHRpZiAoIXNwaW5fdHJ5bG9jayhcdTAwMjZtZmNfdW5yZXNfbG9jaykpIHtcbiBcdFx0bW9kX3RpbWVyKFx1MDAyNm1ydC1cdTAwM2VpcG1yX2V4cGlyZV90aW1lciwgamlmZmllcyArIDEpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG4gXG4tXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpXG4rXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSkpIHtcbiBcdFx0aXBtcl9kb19leHBpcmVfcHJvY2VzcyhtcnQpO1xuK1x0XHRlbXB0eSA9IGxpc3RfZW1wdHkoXHUwMDI2bXJ0LVx1MDAzZW1mY191bnJlc19xdWV1ZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBSZXRyeSBhZnRlciBHRlBfQVRPTUlDIGFsbG9jYXRpb24gZmFpbHVyZS4gKi9cbitcdFx0ZW1wdHkgPSB0cnVlO1xuK1x0fVxuIFxuIFx0c3Bpbl91bmxvY2soXHUwMDI2bWZjX3VucmVzX2xvY2spO1xuK1xuK1x0aWYgKGVtcHR5KVxuK1x0XHRpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95KG1ydCk7XG4gfVxuIFxuIC8qIEZpbGwgb2lmcyBsaXN0LiBJdCBpcyBjYWxsZWQgdW5kZXIgbG9ja2VkIG1ydF9sb2NrLiAqL1xuQEAgLTEyOTAsMTkgKzE0MjQsMzQgQEAgc3RhdGljIGludCBpcDZtcl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLFxuIHtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTtcbisjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFU1xuK1x0c3RydWN0IG1yX3RhYmxlICptcnQsICpuZXh0O1xuKyNlbHNlXG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbisjZW5kaWZcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2O1xuIFx0aW50IGN0O1xuIFxuIFx0aWYgKGV2ZW50ICE9IE5FVERFVl9VTlJFR0lTVEVSKVxuIFx0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4gXG4tXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldCkge1xuKyNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCBcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tcjZfdGFibGVzLCBsaXN0KVxuKyNlbHNlXG4rXHRpcDZtcl9mb3JfZWFjaF90YWJsZShtcnQsIG5ldClcbisjZW5kaWZcbitcdHtcbitcdFx0Ym9vbCB2aWZfZ29uZSA9IGZhbHNlO1xuK1xuIFx0XHR2ID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVswXTtcbiBcdFx0Zm9yIChjdCA9IDA7IGN0IFx1MDAzYyBtcnQtXHUwMDNlbWF4dmlmOyBjdCsrLCB2KyspIHtcbi1cdFx0XHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKHYtXHUwMDNlZGV2KSA9PSBkZXYpXG4rXHRcdFx0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcih2LVx1MDAzZWRldikgPT0gZGV2KSB7XG4gXHRcdFx0XHRtaWY2X2RlbGV0ZShtcnQsIGN0LCAxLCBOVUxMKTtcbitcdFx0XHRcdHZpZl9nb25lID0gdHJ1ZTtcbitcdFx0XHR9XG4gXHRcdH1cbitcdFx0aWYgKHZpZl9nb25lKVxuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdH1cbiBcbiBcdHJldHVybiBOT1RJRllfRE9ORTtcbkBAIC0xNjE4LDEwICsxNzY3LDExIEBAIHN0YXRpYyB2b2lkIG1yb3V0ZV9jbGVhbl90YWJsZXMoc3RydWN0IG1yX3RhYmxlICptcnQsIGludCBmbGFncyxcbiBcbiBzdGF0aWMgaW50IGlwNm1yX3NrX2luaXQoc3RydWN0IG1yX3RhYmxlICptcnQsIHN0cnVjdCBzb2NrICpzaylcbiB7XG4tXHRpbnQgZXJyID0gMDtcbiBcdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbitcdGludCBlcnIgPSAwO1xuK1xuK1x0QVNTRVJUX1JUTkwoKTtcbiBcbi1cdHJ0bmxfbG9jaygpO1xuIFx0c3Bpbl9sb2NrKFx1MDAyNm1ydF9sb2NrKTtcbiBcdGlmIChydG5sX2RlcmVmZXJlbmNlKG1ydC1cdTAwM2Vtcm91dGVfc2spKSB7XG4gXHRcdGVyciA9IC1FQUREUklOVVNFO1xuQEAgLTE2MzcsOCArMTc4Nyw2IEBAIHN0YXRpYyBpbnQgaXA2bXJfc2tfaW5pdChzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNvY2sgKnNrKVxuIFx0XHRcdFx0XHQgICAgIE5FVENPTkZBX01DX0ZPUldBUkRJTkcsXG4gXHRcdFx0XHRcdCAgICAgTkVUQ09ORkFfSUZJTkRFWF9BTEwsXG4gXHRcdFx0XHRcdCAgICAgbmV0LVx1MDAzZWlwdjYuZGV2Y29uZl9hbGwpO1xuLVx0cnRubF91bmxvY2soKTtcbi1cbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuQEAgLTE2NzcsNiArMTgyNSw3IEBAIGludCBpcDZtcl9za19kb25lKHN0cnVjdCBzb2NrICpzaylcbiBcdFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgTVJUNl9GTFVTSF9NSUZTIHwgTVJUNl9GTFVTSF9NRkMsXG4gXHRcdFx0XHRcdCAgICBcdTAwMjZkZXZfa2lsbF9saXN0KTtcbiBcdFx0XHRlcnIgPSAwO1xuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuIFx0fVxuQEAgLTE3MjMsMjcgKzE4NzIsNDUgQEAgaW50IGlwNl9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBzb2NrcHRyX3Qgb3B0dmFsLFxuIFx0ICAgIGluZXRfc2soc2spLVx1MDAzZWluZXRfbnVtICE9IElQUFJPVE9fSUNNUFY2KVxuIFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gXG4tXHRtcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS1cdTAwM2VpcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpO1xuLVx0aWYgKCFtcnQpXG4tXHRcdHJldHVybiAtRU5PRU5UO1xuLVxuIFx0aWYgKG9wdG5hbWUgIT0gTVJUNl9JTklUKSB7XG4tXHRcdGlmIChzayAhPSByY3VfYWNjZXNzX3BvaW50ZXIobXJ0LVx1MDAzZW1yb3V0ZV9zaykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAhbnNfY2FwYWJsZShuZXQtXHUwMDNldXNlcl9ucywgQ0FQX05FVF9BRE1JTikpXG4rXHRcdGJvb2wgaXNfbXJvdXRlX3NrID0gZmFsc2U7XG4rXG4rXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKG1ydCBcdTAwMjZcdTAwMjYgc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spKVxuK1x0XHRcdGlzX21yb3V0ZV9zayA9IHRydWU7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1xuK1x0XHRpZiAoIWlzX21yb3V0ZV9zayBcdTAwMjZcdTAwMjYgIW5zX2NhcGFibGUobmV0LVx1MDAzZXVzZXJfbnMsIENBUF9ORVRfQURNSU4pKVxuIFx0XHRcdHJldHVybiAtRUFDQ0VTO1xuIFx0fVxuIFxuIFx0c3dpdGNoIChvcHRuYW1lKSB7XG4tXHRjYXNlIE1SVDZfSU5JVDpcbitcdGNhc2UgTVJUNl9JTklUOiB7XG4rXHRcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4gXHRcdGlmIChvcHRsZW4gXHUwMDNjIHNpemVvZihpbnQpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0XHRyZXR1cm4gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcbitcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKTtcbitcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtcnQpO1xuK1x0XHR9XG4rXHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbitcdFx0cmV0ID0gaXA2bXJfc2tfaW5pdChtcnQsIHNrKTtcbitcdFx0cmV0ID0gaXA2bXJfZmluaXNoX25ld190YWJsZShtcnQsIG5ld190YWJsZSwgcmV0KTtcbitcdFx0cnRubF91bmxvY2soKTtcbitcdFx0cmV0dXJuIHJldDtcbitcdH1cbiBcbiBcdGNhc2UgTVJUNl9ET05FOlxuIFx0XHRyZXR1cm4gaXA2bXJfc2tfZG9uZShzayk7XG4gXG4tXHRjYXNlIE1SVDZfQUREX01JRjpcbitcdGNhc2UgTVJUNl9BRERfTUlGOiB7XG4rXHRcdGJvb2wgbmV3X3RhYmxlID0gZmFsc2U7XG4rXG4gXHRcdGlmIChvcHRsZW4gXHUwMDNjIHNpemVvZih2aWYpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFx0XHRpZiAoY29weV9mcm9tX3NvY2twdHIoXHUwMDI2dmlmLCBvcHR2YWwsIHNpemVvZih2aWYpKSlcbkBAIC0xNzUxLDEwICsxOTE4LDE4IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHZpZi5taWY2Y19taWZpIFx1MDAzZT0gTUFYTUlGUylcbiBcdFx0XHRyZXR1cm4gLUVORklMRTtcbiBcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKTtcbitcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtcnQpO1xuK1x0XHR9XG4rXHRcdGlwNm1yX3B1Ymxpc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlKTtcbiBcdFx0cmV0ID0gbWlmNl9hZGQobmV0LCBtcnQsIFx1MDAyNnZpZixcbiBcdFx0XHQgICAgICAgc2sgPT0gcnRubF9kZXJlZmVyZW5jZShtcnQtXHUwMDNlbXJvdXRlX3NrKSk7XG4rXHRcdHJldCA9IGlwNm1yX2ZpbmlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUsIHJldCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4rXHR9XG4gXG4gXHRjYXNlIE1SVDZfREVMX01JRjpcbiBcdFx0aWYgKG9wdGxlbiBcdTAwM2Mgc2l6ZW9mKG1pZmlfdCkpXG5AQCAtMTc2Miw3ICsxOTM3LDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKGNvcHlfZnJvbV9zb2NrcHRyKFx1MDAyNm1pZmksIG9wdHZhbCwgc2l6ZW9mKG1pZmlfdCkpKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIFx0XHRydG5sX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4gXHRcdHJldCA9IG1pZjZfZGVsZXRlKG1ydCwgbWlmaSwgMCwgTlVMTCk7XG4rXHRcdGlmICghcmV0KVxuK1x0XHRcdGlwNm1yX21heWJlX2Rlc3Ryb3lfdGFibGUobXJ0KTtcbiBcdFx0cnRubF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNzgzLDE3ICsxOTY1LDM5IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0aWYgKHBhcmVudCA9PSAwKVxuIFx0XHRcdHBhcmVudCA9IG1mYy5tZjZjY19wYXJlbnQ7XG4gXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbitcdFx0cnRubF9sb2NrKCk7XG4rXHRcdGlmIChvcHRuYW1lID09IE1SVDZfREVMX01GQyB8fCBvcHRuYW1lID09IE1SVDZfREVMX01GQ19QUk9YWSkge1xuK1x0XHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRcdHJ0bmxfdW5sb2NrKCk7XG4rXHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0Ym9vbCBuZXdfdGFibGUgPSBmYWxzZTtcbiBcbi1cdFx0aWYgKG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDIHx8IG9wdG5hbWUgPT0gTVJUNl9ERUxfTUZDX1BST1hZKVxuLVx0XHRcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcdTAwMjZtZmMsIHBhcmVudCk7XG4tXHRcdGVsc2VcbitcdFx0XHRtcnQgPSBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGUoc2ssIFx1MDAyNm5ld190YWJsZSk7XG4rXHRcdFx0aWYgKElTX0VSUihtcnQpKSB7XG4rXHRcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdFx0cmV0dXJuIFBUUl9FUlIobXJ0KTtcbitcdFx0XHR9XG4rXHRcdFx0aXA2bXJfcHVibGlzaF9uZXdfdGFibGUobXJ0LCBuZXdfdGFibGUpO1xuK1x0XHRcdG11dGV4X2xvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbiBcdFx0XHRyZXQgPSBpcDZtcl9tZmNfYWRkKG5ldCwgbXJ0LCBcdTAwMjZtZmMsXG4gXHRcdFx0XHRcdCAgICBzayA9PVxuIFx0XHRcdFx0XHQgICAgcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spLFxuIFx0XHRcdFx0XHQgICAgcGFyZW50KTtcbitcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bmV0LVx1MDAzZWlwdjYubWZjX211dGV4KTtcbitcdFx0XHRyZXQgPSBpcDZtcl9maW5pc2hfbmV3X3RhYmxlKG1ydCwgbmV3X3RhYmxlLCByZXQpO1xuK1x0XHRcdHJ0bmxfdW5sb2NrKCk7XG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuIFxuK1x0XHRtdXRleF9sb2NrKFx1MDAyNm5ldC1cdTAwM2VpcHY2Lm1mY19tdXRleCk7XG4rXHRcdHJldCA9IGlwNm1yX21mY19kZWxldGUobXJ0LCBcdTAwMjZtZmMsIHBhcmVudCk7XG4gXHRcdG11dGV4X3VubG9jayhcdTAwMjZuZXQtXHUwMDNlaXB2Ni5tZmNfbXV0ZXgpO1xuK1x0XHRpZiAoIXJldClcbitcdFx0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4rXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiByZXQ7XG4gXG4gXHRjYXNlIE1SVDZfRkxVU0g6XG5AQCAtMTgwNyw4ICsyMDExLDE0IEBAIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgc29ja3B0cl90IG9wdHZhbCxcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcbiBcdFx0cnRubF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdGlmICghbXJ0KSB7XG4rXHRcdFx0cnRubF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRtcm91dGVfY2xlYW5fdGFibGVzKG1ydCwgZmxhZ3MsIFx1MDAyNmRldl9raWxsX2xpc3QpO1xuIFx0XHR1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KFx1MDAyNmRldl9raWxsX2xpc3QpO1xuK1x0XHRpcDZtcl9tYXliZV9kZXN0cm95X3RhYmxlKG1ydCk7XG4gXHRcdHJ0bmxfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAwO1xuIFx0fVxuQEAgLTE4MjQsNyArMjAzNCwxNCBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZ2LCBvcHR2YWwsIHNpemVvZih2KSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRXUklURV9PTkNFKG1ydC1cdTAwM2Vtcm91dGVfZG9fYXNzZXJ0LCB2KTtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAwO1xuIFx0fVxuIFxuQEAgLTE4NDIsNiArMjA1OSwxMSBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdGRvX3dybWlmd2hvbGUgPSAodiA9PSBNUlQ2TVNHX1dSTUlGV0hPTEUpO1xuIFx0XHR2ID0gISF2O1xuIFx0XHRydG5sX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRydG5sX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4gXHRcdHJldCA9IDA7XG4gXHRcdGlmICh2ICE9IG1ydC1cdTAwM2Vtcm91dGVfZG9fcGltKSB7XG4gXHRcdFx0V1JJVEVfT05DRShtcnQtXHUwMDNlbXJvdXRlX2RvX3BpbSwgdik7XG5AQCAtMTg2NSwxOCArMjA4NywxNiBAQCBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdC8qIFwicGltNnJlZyV1XCIgc2hvdWxkIG5vdCBleGNlZWQgMTYgYnl0ZXMgKElGTkFNU0laKSAqL1xuIFx0XHRpZiAodiAhPSBSVF9UQUJMRV9ERUZBVUxUIFx1MDAyNlx1MDAyNiB2IFx1MDAzZT0gMTAwMDAwMDAwKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuLVx0XHRpZiAoc2sgPT0gcmN1X2FjY2Vzc19wb2ludGVyKG1ydC1cdTAwM2Vtcm91dGVfc2spKVxuK1x0XHRyY3VfcmVhZF9sb2NrKCk7XG4rXHRcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRcdGlmIChtcnQgXHUwMDI2XHUwMDI2IHNrID09IHJjdV9hY2Nlc3NfcG9pbnRlcihtcnQtXHUwMDNlbXJvdXRlX3NrKSkge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdH1cbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXG4tXHRcdHJ0bmxfbG9jaygpO1xuLVx0XHRyZXQgPSAwO1xuLVx0XHRtcnQgPSBpcDZtcl9uZXdfdGFibGUobmV0LCB2KTtcbi1cdFx0aWYgKElTX0VSUihtcnQpKVxuLVx0XHRcdHJldCA9IFBUUl9FUlIobXJ0KTtcbi1cdFx0ZWxzZVxuLVx0XHRcdHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID0gdjtcbi1cdFx0cnRubF91bmxvY2soKTtcbi1cdFx0cmV0dXJuIHJldDtcbitcdFx0cmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPSB2O1xuK1x0XHRyZXR1cm4gMDtcbiBcdH1cbiAjZW5kaWZcbiBcdC8qXG5AQCAtMTg5NywxNiArMjExNywxOCBAQCBpbnQgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4ge1xuIFx0aW50IG9scjtcbiBcdGludCB2YWw7XG4tXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4gXHRzdHJ1Y3QgbXJfdGFibGUgKm1ydDtcbiBcbiBcdGlmIChzay1cdTAwM2Vza190eXBlICE9IFNPQ0tfUkFXIHx8XG4gXHQgICAgaW5ldF9zayhzayktXHUwMDNlaW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpXG4gXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiBcbi1cdG1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7XG4tXHRpZiAoIW1ydClcbitcdHJjdV9yZWFkX2xvY2soKTtcbitcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XG4rXHRpZiAoIW1ydCkge1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4gXG4gXHRzd2l0Y2ggKG9wdG5hbWUpIHtcbiBcdGNhc2UgTVJUNl9WRVJTSU9OOlxuQEAgLTE5MjEsOCArMjE0MywxMCBAQCBpbnQgaXA2X21yb3V0ZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHNvY2twdHJfdCBvcHR2YWwsXG4gXHRcdHZhbCA9IFJFQURfT05DRShtcnQtXHUwMDNlbXJvdXRlX2RvX2Fzc2VydCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdHJldHVybiAtRU5PUFJPVE9PUFQ7XG4gXHR9XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiBcdGlmIChjb3B5X2Zyb21fc29ja3B0cihcdTAwMjZvbHIsIG9wdGxlbiwgc2l6ZW9mKGludCkpKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbkBAIC0xOTQ3LDIwICsyMTcxLDIzIEBAIGludCBpcDZtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgKmFyZylcbiBcdHN0cnVjdCBzaW9jX21pZl9yZXE2ICp2cjtcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XG4gXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcbi1cdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbiBcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuIFxuLVx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcbi1cdGlmICghbXJ0KVxuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdGlmICghbXJ0KSB7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdH1cbiBcbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHR2ciA9IChzdHJ1Y3Qgc2lvY19taWZfcmVxNiAqKWFyZztcbi1cdFx0aWYgKHZyLVx1MDAzZW1pZmkgXHUwMDNlPSBtcnQtXHUwMDNlbWF4dmlmKVxuK1x0XHRpZiAodnItXHUwMDNlbWlmaSBcdTAwM2U9IG1ydC1cdTAwM2VtYXh2aWYpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0fVxuIFx0XHR2ci1cdTAwM2VtaWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLVx1MDAzZW1pZmksIG1ydC1cdTAwM2VtYXh2aWYpO1xuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdHZpZiA9IFx1MDAyNm1ydC1cdTAwM2V2aWZfdGFibGVbdnItXHUwMDNlbWlmaV07XG4gXHRcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnItXHUwMDNlbWlmaSkpIHtcbiBcdFx0XHR2ci1cdTAwM2VpY291bnQgPSBSRUFEX09OQ0UodmlmLVx1MDAzZXBrdF9pbik7XG5AQCAtMTk3NCw4ICsyMjAxLDYgQEAgaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCAqYXJnKVxuIFx0XHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XG4gXHRjYXNlIFNJT0NHRVRTR0NOVF9JTjY6XG4gXHRcdHNyID0gKHN0cnVjdCBzaW9jX3NnX3JlcTYgKilhcmc7XG4tXG4tXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0YyA9IGlwNm1yX2NhY2hlX2ZpbmQobXJ0LCBcdTAwMjZzci1cdTAwM2VzcmMuc2luNl9hZGRyLFxuIFx0XHRcdFx0ICAgICBcdTAwMjZzci1cdTAwM2VncnAuc2luNl9hZGRyKTtcbiBcdFx0aWYgKGMpIHtcbkBAIC0xOTg4LDYgKzIyMTMsNyBAQCBpbnQgaXA2bXJfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkICphcmcpXG4gXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XG4gXHRkZWZhdWx0OlxuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0cmV0dXJuIC1FTk9JT0NUTENNRDtcbiBcdH1cbiB9XG5AQCAtMjAxNSwyMSArMjI0MSwyMyBAQCBpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcbiBcdHN0cnVjdCBjb21wYXRfc2lvY19taWZfcmVxNiB2cjtcbiBcdHN0cnVjdCB2aWZfZGV2aWNlICp2aWY7XG4gXHRzdHJ1Y3QgbWZjNl9jYWNoZSAqYztcbi1cdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcbiBcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xuIFxuLVx0bXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktXHUwMDNlaXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTtcbi1cdGlmICghbXJ0KVxuLVx0XHRyZXR1cm4gLUVOT0VOVDtcbi1cbiBcdHN3aXRjaCAoY21kKSB7XG4gXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxuIFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dnIsIGFyZywgc2l6ZW9mKHZyKSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4tXHRcdGlmICh2ci5taWZpIFx1MDAzZT0gbXJ0LVx1MDAzZW1heHZpZilcbitcdFx0cmN1X3JlYWRfbG9jaygpO1xuK1x0XHRtcnQgPSBpcDZtcl9sb29rdXBfc2tfdGFibGUoc2spO1xuK1x0XHRpZiAoIW1ydCkge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHRcdHJldHVybiAtRU5PRU5UO1xuK1x0XHR9XG4rXHRcdGlmICh2ci5taWZpIFx1MDAzZT0gbXJ0LVx1MDAzZW1heHZpZikge1xuK1x0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0XHR9XG4gXHRcdHZyLm1pZmkgPSBhcnJheV9pbmRleF9ub3NwZWModnIubWlmaSwgbXJ0LVx1MDAzZW1heHZpZik7XG4tXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0dmlmID0gXHUwMDI2bXJ0LVx1MDAzZXZpZl90YWJsZVt2ci5taWZpXTtcbiBcdFx0aWYgKFZJRl9FWElTVFMobXJ0LCB2ci5taWZpKSkge1xuIFx0XHRcdHZyLmljb3VudCA9IFJFQURfT05DRSh2aWYtXHUwMDNlcGt0X2luKTtcbkBAIC0yMDQ5LDYgKzIyNzcsMTEgQEAgaW50IGlwNm1yX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG4gXHRcdHJjdV9yZWFkX2xvY2soKTtcbitcdFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcbitcdFx0aWYgKCFtcnQpIHtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbitcdFx0fVxuIFx0XHRjID0gaXA2bXJfY2FjaGVfZmluZChtcnQsIFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFx1MDAyNnNyLmdycC5zaW42X2FkZHIpO1xuIFx0XHRpZiAoYykge1xuIFx0XHRcdHNyLnBrdGNudCA9IGF0b21pY19sb25nX3JlYWQoXHUwMDI2Yy1cdTAwM2VfYy5tZmNfdW4ucmVzLnBrdCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoxNC40NjY3NjkwNzFaIiwiU2VxIjoxMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Nzc1MDM1ODQ2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBGdXp6aW5nIFNlc3Npb24gQXNzZXNzbWVudCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBwYXRjaCBhbmQgc2VlIGlmIGl0IHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2VzLiBJdCdzIHRvdWNoaW5nIGBuZXQvaXB2Ni9pcDZtci5jYCwgd2hpY2ggdGVsbHMgbWUgdGhpcyBjb25jZXJucyBJUHY2IG11bHRpY2FzdCByb3V0aW5nLlxuXG5Ob3csIGZvY3VzaW5nIG9uIHRoZSBjb3JlIGNoYW5nZXMsIGl0IGFwcGVhcnMgdGhpcyBwYXRjaCBpcyBhYm91dCBkeW5hbWljIHRhYmxlIG1hbmFnZW1lbnQgZm9yIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgKGBpcDZtcmApLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIGJlIG1vdmluZyBmcm9tIHByZS1hbGxvY2F0aW9uIG9yIGFsbG9jYXRpb24gZHVyaW5nIGBNUlQ2X1RBQkxFYCB0byBkeW5hbWljIGFsbG9jYXRpb24gdXNpbmcgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZWAgd2hlbiBgc2V0c29ja29wdGAgY2FsbHMgbGlrZSBgTVJUNl9JTklUYCwgYE1SVDZfQUREX01JRmAsIGFuZCBgTVJUNl9BRERfTUZDYCBhcmUgbWFkZS4gVGhlIHBhdGNoIGFsc28gaW50cm9kdWNlcyBkeW5hbWljIHRhYmxlIGRlc3RydWN0aW9uIChgaXA2bXJfbWF5YmVfZGVzdHJveV90YWJsZWAsIGBpcDZtcl9xdWV1ZV9tYXliZV9kZXN0cm95YCkgd2hlbiB0YWJsZXMgYXJlIGVtcHR5LCB1bnJlZ2lzdGVyZWQsIG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkLlxuXG5JJ20gbm90aW5nIHRoYXQgd2l0aGluIGBpcDZfbXJvdXRlX3NldHNvY2tvcHRgIHdpdGggYE1SVDZfVEFCTEVgLCB0aGUgY29kZSBub3cgKmp1c3QqIHNldHMgdGhlIHBvaW50ZXIgYHJhdzZfc2soc2spLVx1MDAzZWlwNm1yX3RhYmxlID0gdjtgIHdpdGhvdXQgaW1tZWRpYXRlbHkgYWxsb2NhdGluZyB0aGUgdGFibGUsIGZ1cnRoZXIgcmVpbmZvcmNpbmcgdGhpcyBkeW5hbWljIGJlaGF2aW9yLiBBbHNvLCBpbiBgaXA2bXJfaW9jdGxgIGFuZCBgaXA2bXJfY29tcGF0X2lvY3RsYCwgaXQgbm93IGxvb2tzIHVwIHRoZSB0YWJsZSB1c2luZyBgaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKWAgdW5kZXIgYHJjdV9yZWFkX2xvY2soKWAgcmF0aGVyIHRoYW4gYW4gdXBmcm9udCBsb29rdXAuIExhc3RseSwgSSBzZWUgY2hhbmdlcyB0byBsb2NraW5nIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCwgd2l0aCBgaXA2bXJfZGVzdHJveV93b3JrYCBub3cgYmVpbmcgYWxsb2NhdGVkIHZpYSBga21hbGxvY19vYmooKmR3LCBHRlBfQVRPTUlDKWAuXG5cbk15IG5leHQgbWFqb3IgY29uY2VybiBpcyB1bmluaXRpYWxpemVkIG1lbW9yeS4gTGV0J3MgZGlnIGluIGhlcmUuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGNoZWNrIHRoZSBhbGxvY2F0aW9uIGFuZCB1c2Ugb2YgYGttYWxsb2Nfb2JqKCpkdywgR0ZQX0FUT01JQylgIHdpdGhpbiBgaXA2bXJfcXVldWVfbWF5YmVfZGVzdHJveWAuIEZyb20gd2hhdCBJIHNlZSBpbiB0aGF0IGNvZGUsIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBgaXA2bXJfZGVzdHJveV93b3JrYCBzdHJ1Y3QgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkICpiZWZvcmUqIHRoZSB3b3JrIGlzIHF1ZXVlZC4gVGhlIGBpcDZtcl9kZXN0cm95X3dvcmtmbmAgb25seSByZWFkcyBgZHctXHUwMDNlbmV0YCBhbmQgYGR3LVx1MDAzZWlkYCwgdGhlbiBmcmVlcyBgZHdgLiBUaGF0IGxvb2tzIHNhZmUuXG5cbkknbGwgYWxzbyBxdWlja2x5IGNoZWNrIHRoYXQgYGlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzaywgXHUwMDI2bmV3X3RhYmxlKWAgaW5pdGlhbGl6ZXMgYG5ld190YWJsZWAgdG8gYGZhbHNlYCBhbmQgc2V0cyBpdCB0byBgdHJ1ZWAgb24gYWxsb2NhdGlvbiBzdWNjZXNzLiBJJ20gYWxzbyBnbGFuY2luZyBhdCBgaXBtcl9leHBpcmVfcHJvY2Vzc2AsIHdoaWNoIGluaXRpYWxpemVzIGEgYm9vbGVhbiBgZW1wdHlgIGFuZCB0aGVuIGFzc2lnbnMgaXQgYmFzZWQgb24gYGxpc3RfZW1wdHlgIGNhbGxzIG9yIHNldHMgdG8gYHRydWVgLiBTaW1pbGFybHksIGBpcDZtcl9kZXZpY2VfZXZlbnRgIGluaXRpYWxpemVzIGB2aWZfZ29uZSA9IGZhbHNlO2AuXG5cbkZpbmFsbHksIHRoZSBpb2N0bCBhbmQgY29tcGF0IGlvY3RsIGhhbmRsaW5nIGNhdGNoZXMgbXkgYXR0ZW50aW9uLiBJbiB0aGUgcmVndWxhciBpb2N0bCAoYGlwNm1yX2lvY3RsYCksIHRoZSBhcmd1bWVudHMgKGB2cmAgYW5kIGBzcmApIGFyZSBjYXN0LiAgSW4gdGhlIGNvbXBhdCBpb2N0bCAoYGlwNm1yX2NvbXBhdF9pb2N0bGApLCB0aGUgZGF0YSBmcm9tIHVzZXIgc3BhY2UgaXMgY29waWVkIHZpYSBgY29weV9mcm9tX3VzZXJgLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIG1vZGlmaWVkIHZhbHVlcyBhcmUgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZSB1c2luZyBgY29weV90b191c2VyYC4gSSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciB0aGlzIGJlaGF2aW9yIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHJlLXBhdGNoIHZlcnNpb25zIHRvIGFzc2VzcyBhbnkgcG90ZW50aWFsIGlzc3VlcyBoZXJlLiBUaGlzIGRlc2VydmVzIGEgY2xvc2VyIGxvb2sgYXQgdGhlIG9yaWdpbmFsIGNvZGUgdG8gY29uZmlybS5cblxuR2l2ZW4gbXkgYW5hbHlzaXMsIEkgYW0gZ29pbmcgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFuZ2VzIGFyZSBlbm91Z2ggdG8gd2FycmFudCBhIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6ODg2NiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMDUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoyMi4yMTcxMzA1MThaIiwiU2VxIjoxNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2NjE1NjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlwNm1yX2NvbXBhdF9pb2N0bFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvaXB2Ni9pcDZtci5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9pcHY2L2lwNm1yLmM9MjIzMD1zdHJ1Y3QgY29tcGF0X3Npb2NfbWlmX3JlcTYge1xcbi0tXFxubmV0L2lwdjYvaXA2bXIuYy0yMjM3LVxcbm5ldC9pcHY2L2lwNm1yLmM6MjIzODppbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcXG5uZXQvaXB2Ni9pcDZtci5jLTIyMzkte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoyMi4yOTM3NTk1MDdaIiwiU2VxIjoxNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjI2NDcwNjAzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYGlwNm1yX2NvbXBhdF9pb2N0bGAqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSwgYW5kIEkgbmVlZCB0byBtYWtlIGFic29sdXRlbHkgc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGludGVyYWN0aW9uIGFyb3VuZCBgaXA2bXJfY29tcGF0X2lvY3RsYC4gTGV0J3MgemVybyBpbiBvbiB0aGF0IHNlY3Rpb24sIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAyMjM4LiBJJ20gZ29pbmcgdG8gY2FyZWZ1bGx5IHJldmlldyB0aGF0IGZ1bmN0aW9uIHRvIG1ha2UgY2VydGFpbiBJJ20gbm90IG1pc3NpbmcgYW55IHN1YnRsZSBkZXRhaWxzIG9yIHBvdGVudGlhbCBlZGdlIGNhc2VzLiBOZWVkIHRvIGdldCBhIHJlYWxseSBnb29kIGhhbmRsZSBvbiBob3cgdGhpcyB0aGluZyBpcyBhY3R1YWxseSB3b3JraW5nLCBzbyBsZXQncyBzdGFydCB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA3ODcsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoyNC41NTg0NjgzMTJaIiwiU2VxIjoxNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE4MDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9pcHY2L2lwNm1yLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjIzOCxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjIzODpcXHRpbnQgaXA2bXJfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZylcXG4yMjM5OlxcdHtcXG4yMjQwOlxcdFxcdHN0cnVjdCBjb21wYXRfc2lvY19zZ19yZXE2IHNyO1xcbjIyNDE6XFx0XFx0c3RydWN0IGNvbXBhdF9zaW9jX21pZl9yZXE2IHZyO1xcbjIyNDI6XFx0XFx0c3RydWN0IHZpZl9kZXZpY2UgKnZpZjtcXG4yMjQzOlxcdFxcdHN0cnVjdCBtZmM2X2NhY2hlICpjO1xcbjIyNDQ6XFx0XFx0c3RydWN0IG1yX3RhYmxlICptcnQ7XFxuMjI0NTpcXHRcXG4yMjQ2OlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuMjI0NzpcXHRcXHRjYXNlIFNJT0NHRVRNSUZDTlRfSU42OlxcbjIyNDg6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZ2ciwgYXJnLCBzaXplb2YodnIpKSlcXG4yMjQ5OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbjIyNTA6XFx0XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbjIyNTE6XFx0XFx0XFx0bXJ0ID0gaXA2bXJfbG9va3VwX3NrX3RhYmxlKHNrKTtcXG4yMjUyOlxcdFxcdFxcdGlmICghbXJ0KSB7XFxuMjI1MzpcXHRcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4yMjU0OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjIyNTU6XFx0XFx0XFx0fVxcbjIyNTY6XFx0XFx0XFx0aWYgKHZyLm1pZmkgXFx1MDAzZT0gbXJ0LVxcdTAwM2VtYXh2aWYpIHtcXG4yMjU3OlxcdFxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjIyNTg6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjI1OTpcXHRcXHRcXHR9XFxuMjI2MDpcXHRcXHRcXHR2ci5taWZpID0gYXJyYXlfaW5kZXhfbm9zcGVjKHZyLm1pZmksIG1ydC1cXHUwMDNlbWF4dmlmKTtcXG4yMjYxOlxcdFxcdFxcdHZpZiA9IFxcdTAwMjZtcnQtXFx1MDAzZXZpZl90YWJsZVt2ci5taWZpXTtcXG4yMjYyOlxcdFxcdFxcdGlmIChWSUZfRVhJU1RTKG1ydCwgdnIubWlmaSkpIHtcXG4yMjYzOlxcdFxcdFxcdFxcdHZyLmljb3VudCA9IFJFQURfT05DRSh2aWYtXFx1MDAzZXBrdF9pbik7XFxuMjI2NDpcXHRcXHRcXHRcXHR2ci5vY291bnQgPSBSRUFEX09OQ0UodmlmLVxcdTAwM2Vwa3Rfb3V0KTtcXG4yMjY1OlxcdFxcdFxcdFxcdHZyLmlieXRlcyA9IFJFQURfT05DRSh2aWYtXFx1MDAzZWJ5dGVzX2luKTtcXG4yMjY2OlxcdFxcdFxcdFxcdHZyLm9ieXRlcyA9IFJFQURfT05DRSh2aWYtXFx1MDAzZWJ5dGVzX291dCk7XFxuMjI2NzpcXHRcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4yMjY4OlxcdFxcbjIyNjk6XFx0XFx0XFx0XFx0aWYgKGNvcHlfdG9fdXNlcihhcmcsIFxcdTAwMjZ2ciwgc2l6ZW9mKHZyKSkpXFxuMjI3MDpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4yMjcxOlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbjIyNzI6XFx0XFx0XFx0fVxcbjIyNzM6XFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuMjI3NDpcXHRcXHRcXHRyZXR1cm4gLUVBRERSTk9UQVZBSUw7XFxuMjI3NTpcXHRcXHRjYXNlIFNJT0NHRVRTR0NOVF9JTjY6XFxuMjI3NjpcXHRcXHRcXHRpZiAoY29weV9mcm9tX3VzZXIoXFx1MDAyNnNyLCBhcmcsIHNpemVvZihzcikpKVxcbjIyNzc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuMjI3ODpcXHRcXG4yMjc5OlxcdFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4yMjgwOlxcdFxcdFxcdG1ydCA9IGlwNm1yX2xvb2t1cF9za190YWJsZShzayk7XFxuMjI4MTpcXHRcXHRcXHRpZiAoIW1ydCkge1xcbjIyODI6XFx0XFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuMjI4MzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4yMjg0OlxcdFxcdFxcdH1cXG4yMjg1OlxcdFxcdFxcdGMgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwgXFx1MDAyNnNyLnNyYy5zaW42X2FkZHIsIFxcdTAwMjZzci5ncnAuc2luNl9hZGRyKTtcXG4yMjg2OlxcdFxcdFxcdGlmIChjKSB7XFxuMjI4NzpcXHRcXHRcXHRcXHRzci5wa3RjbnQgPSBhdG9taWNfbG9uZ19yZWFkKFxcdTAwMjZjLVxcdTAwM2VfYy5tZmNfdW4ucmVzLnBrdCk7XFxuMjI4ODpcXHRcXHRcXHRcXHRzci5ieXRlY250ID0gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2Yy1cXHUwMDNlX2MubWZjX3VuLnJlcy5ieXRlcyk7XFxuMjI4OTpcXHRcXHRcXHRcXHRzci53cm9uZ19pZiA9IGF0b21pY19sb25nX3JlYWQoXFx1MDAyNmMtXFx1MDAzZV9jLm1mY191bi5yZXMud3JvbmdfaWYpO1xcbjIyOTA6XFx0XFx0XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuMjI5MTpcXHRcXG4yMjkyOlxcdFxcdFxcdFxcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcXHUwMDI2c3IsIHNpemVvZihzcikpKVxcbjIyOTM6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuMjI5NDpcXHRcXHRcXHRcXHRyZXR1cm4gMDtcXG4yMjk1OlxcdFxcdFxcdH1cXG4yMjk2OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjIyOTc6XFx0XFx0XFx0cmV0dXJuIC1FQUREUk5PVEFWQUlMO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjoyNC41NTg2OTAwMDFaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mzc5NDQ4NjI1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgSVB2NiBNdWx0aWNhc3QgUm91dGluZyBDb2RlIENoYW5nZXMqKlxuXG5Pa2F5LCBzbyBsb29raW5nIGF0IHRoaXMgYGlwNm1yX2NvbXBhdF9pb2N0bGAgZnVuY3Rpb24sIHRoZSBjb2RlJ3MgYmVlbiByZW9yZ2FuaXplZC4gSXQgdXNlZCB0byBncmFiIHRoZSBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZSAoYG1ydCA9IGlwNm1yX2dldF90YWJsZSguLi4pYCkgYmVmb3JlIGFueSB1c2VyIGRhdGEgY29weWluZy4gTm93LCBpdCBkb2VzIHRoZSBgY29weV9mcm9tX3VzZXJgICpmaXJzdCosIHRoZW4gbG9ja3MgUkNVLCBmaW5kcyB0aGUgdGFibGUsIGFuZCB0aGVuLCBpZiBpdCBleGlzdHMsIHByb2NlZWRzIHRvIHBvcHVsYXRlIHRoZSB1c2VyLXNwYWNlIGZpZWxkcyBhbmQgY29weSB0aGVtIGJhY2sg4oCTIGVzc2VudGlhbGx5IHRoZSBzYW1lIGVuZCByZXN1bHQgYXMgYmVmb3JlLCBqdXN0IGEgcmUtb3JkZXJpbmcuIFRoZSBnb29kIG5ld3MgaXMsIEkgZG9uJ3Qgc2VlIGFueSBvYnZpb3VzIGludHJvZHVjdGlvbiBvZiB1bmluaXRpYWxpemVkIGRhdGEsIHdoaWNoIGlzIGFsd2F5cyBhIGNyaXRpY2FsIGNvbmNlcm4gd2l0aCB0aGVzZSBzb3J0cyBvZiBjaGFuZ2VzLiBUaGF0J3MgYSByZWxpZWYuXG5cbk5vdywgSSB3YW50IHRvIGRyaWxsIGRvd24gZnVydGhlciwgc28gSSBuZWVkIHRvIGNoZWNrIG91dCBgbXJfdGFibGVfYWxsb2NgIGFuZCB0aGUgYGlwNm1yX3RhYmxlX25vX3B1Ymxpc2hgIGZ1bmN0aW9uLiBMZXQncyBzZWUuLi4gbG9va2luZyBhdCB0aGUgY29kZSwgaXQgbG9va3MgbGlrZSBgaXA2bXJfdGFibGVfbm9fcHVibGlzaGAgaXMgYSBjYWxsYmFjayB0aGF0IGRvZXMgbm90aGluZywgd2hpY2ggaXMgZmluZSwgZXNwZWNpYWxseSBpZiBpdCdzIHVzZWQgKndoaWxlKiB0aGUgdGFibGUgaXMgc3RpbGwgdW5wdWJsaXNoZWQsIGFzIHRoZSBjb21tZW50IHN1Z2dlc3RzLiBXZSBjYW4gaWdub3JlIHRoYXQgZm9yIG5vdy5cblxuVGhlbiwgdGhlIGBpcDZtcl9nZXRfb3JfYWxsb2Nfc2tfdGFibGVgIGZ1bmN0aW9uIHVzZXMgYF9faXA2bXJfZ2V0X3RhYmxlYCB0byBnZXQgdGhlIE1SVC4gSWYgaXQncyBub3QgZm91bmQsIGBtcl90YWJsZV9hbGxvY2AgaXMgY2FsbGVkIHRvIGFsbG9jYXRlIGEgbmV3IHRhYmxlLiBBbHJpZ2h0LiBgbXJfdGFibGVfYWxsb2NgIGxvb2tzIGxpa2UgdGhlIHBsYWNlIHdoZXJlIHRoZSBjb3JlIHRhYmxlIGFsbG9jYXRpb24gaGFwcGVucy4gTGV0J3MgZGlnIGRlZXBlci4gSSBuZWVkIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiBgbXJfdGFibGVfYWxsb2NgLCBwcm9iYWJseSBpbiBgbmV0L2lwdjQvaXBtcl9iYXNlLmNgIG9yIGEgc2ltaWxhciBmaWxlLiBJIG5lZWQgdG8gc2VlIGV4YWN0bHkgd2hhdCBtZW1vcnkgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBkdXJpbmcgdGFibGUgY3JlYXRpb24uIEl0J3MgbGlrZWx5IHRoYXQgdGFibGUgYWxsb2NhdGlvbiBkb2VzIHNvbWUgaW5pdGlhbGl6YXRpb24uIEknbGwgbmVlZCB0byB2ZXJpZnkgdGhhdCBpbml0aWFsaXphdGlvbiB0byBjb25maXJtIHRoYXQgdGhlIGNoYW5nZXMgZG9uJ3QgaW50cm9kdWNlIGFueSB2dWxuZXJhYmlsaXRpZXMgdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExOTk0LCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mzk0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjI6MjguMzUzMTc4NjQyWiIsIlNlcSI6MTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMzk0MTI2MTA2LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgbXJfdGFibGUgXFxcXCptcl90YWJsZV9hbGxvY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTU6MjI6MzEuNzQ3MzEyMTE4WiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMxMjA5MDQ5OTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSHVudGluZyBEb3duIGBtcl90YWJsZV9hbGxvY2AqKlxuXG5Pa2F5LCBzbyB0aGUgdGFzayBhdCBoYW5kIGlzIHRvIGxvY2F0ZSBgbXJfdGFibGVfYWxsb2NgLiBJbW1lZGlhdGVseSwgbXkgbWluZCBzdGFydHMgdG8gbWFwIG91dCB0aGUgcG9zc2liaWxpdGllcy4gVGhpcyBpcyBsaWtlbHkgYSBtZW1vcnkgcmVzb3VyY2UgYWxsb2NhdGlvbiBmdW5jdGlvbiwganVkZ2luZyBieSB0aGUgcHJlZml4IFwibXJcIiBhbmQgdGhlIHN1ZmZpeCBcImFsbG9jXCIuIEdpdmVuIHRoZSBwb3RlbnRpYWwgc2NvcGUgb2YgYSBzeXN0ZW0gbGlrZSB0aGlzLCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYmVzdCBhcHByb2FjaCB0byBmaW5kIGl0IGVmZmljaWVudGx5LlxuXG5NeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZW1wbG95IGFsbCBteSB1c3VhbCB0cmlja3MuIFdoZXJlIGRvZXMgdGhpcyBjb2RlYmFzZSBsaWtlbHkgcmVzaWRlPyBXaGF0IGxpYnJhcmllcyB3b3VsZCBiZSBleHBlY3RlZD8gSSdkIGltbWVkaWF0ZWx5IGxlYW4gdG93YXJkcyBleGFtaW5pbmcgaGVhZGVyIGZpbGVzIGZpcnN0LiBBIHF1aWNrIGBncmVwYCAob3IgZXF1aXZhbGVudCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtKSBhY3Jvc3MgdGhlIHByb2plY3Qgd2l0aCBhIHBhdHRlcm4gdGhhdCBsb29rcyBmb3IgYSBkZWNsYXJhdGlvbiB3b3VsZCBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIEknbGwgbmVlZCB0byByZW1lbWJlciB0byBjaGVjayBmb3IgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscyBhcyB3ZWxsLiBNYXliZSBpdCdzIGRlZmluZWQgd2l0aGluIGFuIGAjaWZkZWZgIGJsb2NrLlxuXG5JZiB0aGUgZnVuY3Rpb24gaXNuJ3QgcmVhZGlseSBhcHBhcmVudCBpbiB0aGUgaGVhZGVycywgSSdsbCBzd2l0Y2ggdG8gbG9va2luZyBhdCB0aGUgc291cmNlIGZpbGVzIHRoZW1zZWx2ZXMuIEdpdmVuIGl0cyBuYW1lLCBpdCdzIGxpa2VseSBhIHJlbGF0aXZlbHkgbG93LWxldmVsIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9uLCBzbyBJJ2xsIHByaW9yaXRpemUgZXhhbWluaW5nIG1vZHVsZXMgcmVsYXRlZCB0byB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLCB0YWJsZSBzdHJ1Y3R1cmVzLCBhbmQgYW55IGFzc29jaWF0ZWQgcmVzb3VyY2UgbWFuYWdlbWVudCBvciBhbGxvY2F0aW9uIGxheWVycy4gSSdsbCBoYXZlIHRvIGtlZXAgaW4gbWluZCwgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0sIGl0IG1heSBiZSBhIG1vcmUgZ2VuZXJhbC1wdXJwb3NlIHJvdXRpbmUuXG5cbkkgc2hvdWxkIGFsc28gY29uc2lkZXIgd2hldGhlciBpdCdzIHBhcnQgb2YgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5LiBJZiBzbywgSeKAmWxsIG5lZWQgdG8gZmFtaWxpYXJpemUgbXlzZWxmIHdpdGggaXRzIGRvY3VtZW50YXRpb24gYW5kIGJ1aWxkIHByb2Nlc3MgdG8gc2VlIGlmIEkgY2FuIG5hcnJvdyBkb3duIHdoZXJlIGl0J3MgaW5jbHVkZWQuXG5cbkkgY2FuIGFsc28gaW1hZ2luZSB0aGVyZSBhcmUgc3RhdGljIGFuYWx5c2lzIHRvb2xzIHRoYXQgY291bGQgYXNzaXN0LiBBIHN5bWJvbCBsb29rdXAgZnJvbSBhIGRlYnVnZ2VyIGlmIHRoYXQncyBhdmFpbGFibGUgd291bGQgc3BlZWQgdGhpbmdzIGFsb25nLiBUaGUgZ29hbCBoZXJlIGlzIGVmZmljaWVuY3kgYW5kIHByZWNpc2lvbi4gSSdsbCBuZWVkIHRvIGJhbGFuY2Ugc3BlZWQgYW5kIGFjY3VyYWN5IGluIG15IHNlYXJjaC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gY29uc2lkZXIgdGhlIGNvbnRleHQgb2YgdGhlIHVzYWdlIGFzIHRoYXQgd2lsbCBhbHNvIGxpa2VseSBndWlkZSBteSBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjg1MSwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjM0Ljg2ODIyMTUyOVoiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzM4MzM2MDM1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtcl90YWJsZV9hbGxvY1xcXFwoXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvbXJvdXRlX2Jhc2UuaD0yODA9c3RydWN0IG1yX3RhYmxlICpcXG5pbmNsdWRlL2xpbnV4L21yb3V0ZV9iYXNlLmg6MjgxOm1yX3RhYmxlX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkLFxcbmluY2x1ZGUvbGludXgvbXJvdXRlX2Jhc2UuaC0yODItXFx0ICAgICAgIHN0cnVjdCBtcl90YWJsZV9vcHMgKm9wcyxcXG4tLVxcbm5ldC9pcHY0L2lwbXIuYz00MjY9c3RhdGljIHN0cnVjdCBtcl90YWJsZSAqaXBtcl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXFxuLS1cXG5uZXQvaXB2NC9pcG1yLmMtNDM3LVxcbm5ldC9pcHY0L2lwbXIuYzo0Mzg6XFx0cmV0dXJuIG1yX3RhYmxlX2FsbG9jKG5ldCwgaWQsIFxcdTAwMjZpcG1yX21yX3RhYmxlX29wcyxcXG5uZXQvaXB2NC9pcG1yLmMtNDM5LVxcdFxcdFxcdCAgICAgIGlwbXJfZXhwaXJlX3Byb2Nlc3MsIGlwbXJfbmV3X3RhYmxlX3NldCk7XFxuLS1cXG5uZXQvaXB2NC9pcG1yX2Jhc2UuYz00NT1zdHJ1Y3QgbXJfdGFibGUgKlxcbm5ldC9pcHY0L2lwbXJfYmFzZS5jOjQ2Om1yX3RhYmxlX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGlkLFxcbm5ldC9pcHY0L2lwbXJfYmFzZS5jLTQ3LVxcdCAgICAgICBzdHJ1Y3QgbXJfdGFibGVfb3BzICpvcHMsXFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jPTQxNT1zdGF0aWMgc3RydWN0IG1yX3RhYmxlICppcDZtcl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpXFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jLTQyMi1cXG5uZXQvaXB2Ni9pcDZtci5jOjQyMzpcXHRyZXR1cm4gbXJfdGFibGVfYWxsb2MobmV0LCBpZCwgXFx1MDAyNmlwNm1yX21yX3RhYmxlX29wcyxcXG5uZXQvaXB2Ni9pcDZtci5jLTQyNC1cXHRcXHRcXHQgICAgICBpcG1yX2V4cGlyZV9wcm9jZXNzLCBpcDZtcl9uZXdfdGFibGVfc2V0KTtcXG4tLVxcbm5ldC9pcHY2L2lwNm1yLmM9NDMyPXN0YXRpYyBzdHJ1Y3QgbXJfdGFibGUgKmlwNm1yX2dldF9vcl9hbGxvY19za190YWJsZShzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvaXB2Ni9pcDZtci5jLTQ0NS1cXG5uZXQvaXB2Ni9pcDZtci5jOjQ0NjpcXHRtcnQgPSBtcl90YWJsZV9hbGxvYyhuZXQsIGlkLCBcXHUwMDI2aXA2bXJfbXJfdGFibGVfb3BzLFxcbm5ldC9pcHY2L2lwNm1yLmMtNDQ3LVxcdFxcdFxcdCAgICAgaXBtcl9leHBpcmVfcHJvY2VzcywgaXA2bXJfdGFibGVfbm9fcHVibGlzaCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE1OjIyOjM4LjI1MTU5MDY0NloiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTk2MDAwMjc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipEaXZpbmcgaW50byB0aGUgSVB2NCBNdWx0aWNhc3QgUm91dGVyIENvZGUqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIHRoaXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtdWx0aWNhc3Qgcm91dGluZyB0YWJsZXMgYXJlIGFsbG9jYXRlZCwgc28gbGV0J3MgemVybyBpbiBvbiBgbXJfdGFibGVfYWxsb2NgLiBUaGF0J3MgdGhlIGZ1bmN0aW9uIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSwgYW5kIGl0IGxpdmVzIGluIGBuZXQvaXB2NC9pcG1yX2Jhc2UuY2AuIEknbSBnb2luZyB0byBzdGFydCB0aGVyZSBhbmQgc2VlIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIHdoYXQgaXQgaW50ZXJhY3RzIHdpdGgsIGFuZCBob3cgaXQgaGFuZGxlcyBtZW1vcnkgYWxsb2NhdGlvbiwgYW55IHNwaW5sb2NrcywgYW5kIG90aGVyIGNvbmN1cnJlbnQgYWNjZXNzLiBJIGV4cGVjdCB0byBiZSBkaWdnaW5nIGRlZXAgaW50byB0aGUgaW50cmljYWNpZXMgb2Yga2VybmVsIGRhdGEgc3RydWN0dXJlcyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdG8gZ2V0IGEgY29tcGxldGUgcGljdHVyZS4gVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCB3b3JrIGJlZ2lucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM4NjEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjo0MC40NDc1OTUzNzFaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAwMDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9pcHY0L2lwbXJfYmFzZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQ1LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDQ1OlxcdHN0cnVjdCBtcl90YWJsZSAqXFxuICA0NjpcXHRtcl90YWJsZV9hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBpZCxcXG4gIDQ3OlxcdFxcdCAgICAgICBzdHJ1Y3QgbXJfdGFibGVfb3BzICpvcHMsXFxuICA0ODpcXHRcXHQgICAgICAgdm9pZCAoKmV4cGlyZV9mdW5jKShzdHJ1Y3QgdGltZXJfbGlzdCAqdCksXFxuICA0OTpcXHRcXHQgICAgICAgdm9pZCAoKnRhYmxlX3NldCkoc3RydWN0IG1yX3RhYmxlICptcnQsXFxuICA1MDpcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG5ldCAqbmV0KSlcXG4gIDUxOlxcdHtcXG4gIDUyOlxcdFxcdHN0cnVjdCBtcl90YWJsZSAqbXJ0O1xcbiAgNTM6XFx0XFx0aW50IGVycjtcXG4gIDU0OlxcdFxcbiAgNTU6XFx0XFx0bXJ0ID0ga3phbGxvY19vYmooKm1ydCk7XFxuICA1NjpcXHRcXHRpZiAoIW1ydClcXG4gIDU3OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiAgNTg6XFx0XFx0bXJ0LVxcdTAwM2VpZCA9IGlkO1xcbiAgNTk6XFx0XFx0d3JpdGVfcG5ldChcXHUwMDI2bXJ0LVxcdTAwM2VuZXQsIG5ldCk7XFxuICA2MDpcXHRcXG4gIDYxOlxcdFxcdG1ydC1cXHUwMDNlb3BzID0gKm9wcztcXG4gIDYyOlxcdFxcdGVyciA9IHJobHRhYmxlX2luaXQoXFx1MDAyNm1ydC1cXHUwMDNlbWZjX2hhc2gsIG1ydC1cXHUwMDNlb3BzLnJodF9wYXJhbXMpO1xcbiAgNjM6XFx0XFx0aWYgKGVycikge1xcbiAgNjQ6XFx0XFx0XFx0a2ZyZWUobXJ0KTtcXG4gIDY1OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuICA2NjpcXHRcXHR9XFxuICA2NzpcXHRcXG4gIDY4OlxcdFxcdElOSVRfUkNVX1dPUksoXFx1MDAyNm1ydC1cXHUwMDNld29yaywgX19tcl9mcmVlX3RhYmxlKTtcXG4gIDY5OlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtcnQtXFx1MDAzZW1mY19jYWNoZV9saXN0KTtcXG4gIDcwOlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtcnQtXFx1MDAzZW1mY191bnJlc19xdWV1ZSk7XFxuICA3MTpcXHRcXG4gIDcyOlxcdFxcdHRpbWVyX3NldHVwKFxcdTAwMjZtcnQtXFx1MDAzZWlwbXJfZXhwaXJlX3RpbWVyLCBleHBpcmVfZnVuYywgMCk7XFxuICA3MzpcXHRcXG4gIDc0OlxcdFxcdG1ydC1cXHUwMDNlbXJvdXRlX3JlZ192aWZfbnVtID0gLTE7XFxuICA3NTpcXHRcXHR0YWJsZV9zZXQobXJ0LCBuZXQpO1xcbiAgNzY6XFx0XFx0cmV0dXJuIG1ydDtcXG4gIDc3OlxcdH1cXG4gIDc4OlxcdFxcbiAgNzk6XFx0dm9pZCAqbXJfbWZjX2ZpbmRfcGFyZW50KHN0cnVjdCBtcl90YWJsZSAqbXJ0LCB2b2lkICpoYXNoYXJnLCBpbnQgcGFyZW50KVxcbiAgODA6XFx0e1xcbiAgODE6XFx0XFx0c3RydWN0IHJobGlzdF9oZWFkICp0bXAsICpsaXN0O1xcbiAgODI6XFx0XFx0c3RydWN0IG1yX21mYyAqYztcXG4gIDgzOlxcdFxcbiAgODQ6XFx0XFx0bGlzdCA9IHJobHRhYmxlX2xvb2t1cChcXHUwMDI2bXJ0LVxcdTAwM2VtZmNfaGFzaCwgaGFzaGFyZywgKm1ydC1cXHUwMDNlb3BzLnJodF9wYXJhbXMpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjo0MC40NDc2OTgxMDFaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzgyNjcxMDU0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBgbXJfdGFibGVgIENoYW5nZXMqKlxuXG5Pa2F5LCBzbyBgbXJfdGFibGVfYWxsb2NgIHVzZXMgYGt6YWxsb2Nfb2JqYCBvbiB0aGUgYHN0cnVjdCBtcl90YWJsZWAuIFRoYXQncyBnb29kIOKAkyBpdCBtZWFucyB0aGUgZW50aXJlIHN0cnVjdHVyZSBpcyB6ZXJvLWluaXRpYWxpemVkIHJpZ2h0IG9mZiB0aGUgYmF0LiBObyB1bmluaXRpYWxpemVkIGdhcmJhZ2UgbGVmdCBsaW5nZXJpbmcgdGhlcmUuIE5vdywgbGV0J3MgdGhpbmsgYWJvdXQgd2hlcmUgZWxzZSB0aGlzIHRoaW5nIGlzIHRvdWNoZWQuIERlc3RydWN0aW9uLCByZWZjb3VudGluZywgUkNVLCBsb2NraW5nLCBsaXN0IG1hbmFnZW1lbnTigKYgY2xhc3NpYyBtZW1vcnkgbGlmZXRpbWUgaXNzdWVzLCBzeW5jaHJvbml6YXRpb24sIGFuZCBSQ1UgbWFuYWdlbWVudCBmaXhlcywgYXMgZXhwZWN0ZWQuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgcHJldmVudGluZyBtZW1vcnkgbGVha3Mgb3IgdXNlLWFmdGVyLWZyZWUgc2l0dWF0aW9ucyB3aGVuIG11bHRpY2FzdCB0YWJsZXMgYXJlIG5vIGxvbmdlciBuZWVkZWQuXG5cbkFueSBidWdzIHRoYXQgKmNvdWxkKiBwb3AgdXAgaGVyZSB3b3VsZCBsaWtlbHkgYmUgc3RhbmRhcmQ6IHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZS1mcmVlLCB3aGljaCBLQVNBTiBzaG91bGQgbmFpbDsgbG9ja2luZyBwcm9ibGVtcyBvciBkZWFkbG9ja3MsIExPQ0tERVAgd2lsbCBjYXRjaCB0aG9zZTsgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlcyBvciBkb2RneSBlcnJvciBoYW5kbGluZywgc3RhbmRhcmQga2VybmVsIGNoZWNrcyBhbmQgS0FTQU4gd291bGQgdGFrZSBjYXJlIG9mIHRoYXQ7IGFuZCwgZmluYWxseSwgbWVtb3J5IGxlYWtzLCB3aGljaCBLTUVNTEVBSyBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZXhwb3NlLlxuXG5DcnVjaWFsbHksIGZyb20gbXkgZXhwZXJ0IHBvaW50IG9mIHZpZXcsIG5vbmUgb2YgdGhlc2UgY2hhbmdlcyBzZWVtIHRvIGludHJvZHVjZSAqYW55KiByaXNrcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBhbnkgcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UuIEFsbCB0aGUgbmV3IG9yIG1vZGlmaWVkIHZhcmlhYmxlcyDigJMgc3RhY2sgYW5kIGhlYXAg4oCTIGFyZSBmdWxseSBpbml0aWFsaXplZC4gYGttYWxsb2Nfb2JqYCB3aXRoIGV4cGxpY2l0IGZpZWxkIGluaXRpYWxpemF0aW9uLCBga3phbGxvY19vYmpgLCBvciB6ZXJvLWluaXRpYWxpemVkIHByaW1pdGl2ZXMuIFNvLCBubyBzdXJwcmlzZXMgdGhlcmUuXG5cblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBkb2Vzbid0IHRyaWdnZXIgYW55IG9mIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBwaXRmYWxscyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4ncyBhdHRlbnRpb24uIEknbSBjb25maWRlbnQgdGhhdCBzdGFuZGFyZCBLQVNBTiBhbmQgTE9DS0RFUCB0ZXN0aW5nIGFyZSBtb3JlIHRoYW4gc3VmZmljaWVudCB0byBjb3ZlciB0aGlzLiBJJ20gZ29pbmcgdG8gc2V0IGBOZWVkc0tNU0FOPWZhbHNlYCB3aXRoIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24uIFRoYXQncyBteSBjYWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDY4OSwiT3V0cHV0VG9rZW5zIjoyNzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNzMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNToyMjo0OC4yNzQ0MTE4OThaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMzgxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCAobmV0L2lwdjYvaXA2bXIuYykgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgdGFibGVzIG9uIGRlbWFuZCB3aGVuIHNvY2tldCBvcHRpb25zIGFyZSBjb25maWd1cmVkIGFuZCB0byBkZXN0cm95IHRoZW0gd2hlbiB0aGV5IGJlY29tZSB1bnJlZmVyZW5jZWQgb3IgZW1wdHkuXFxuXFxuLSBNZW1vcnkgQWxsb2NhdGlvbnM6IE5ldyBkeW5hbWljIGFsbG9jYXRpb25zIChzdWNoIGFzIGBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrYCBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jX29iamApIGhhdmUgYWxsIG1lbWJlciBmaWVsZHMgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFRoZSB1bmRlcmx5aW5nIG11bHRpY2FzdCB0YWJsZXMgYWxsb2NhdGVkIHZpYSBgbXJfdGFibGVfYWxsb2MoKWAgdXNlIGBremFsbG9jX29iaigpYC5cXG4tIERhdGEgc2VudCB0byB1c2VyIHNwYWNlOiBpb2N0bC9jb21wYXRfaW9jdGwgYW5kIGdldHNvY2tvcHQgaGFuZGxlcnMgb25seSBjb3B5IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgZmllbGRzIG9yIGRhdGEgY29waWVkIGZyb20gdXNlciBzcGFjZSBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBsZWF2aW5nIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciByZWFkaW5nIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS5cXG4tIENvbnRyb2wgZmxvdyBhbmQgTGlmZXRpbWVzOiBDaGFuZ2VzIGFmZmVjdCB0YWJsZSBsaWZlY3ljbGUsIFJDVSBzeW5jaHJvbml6YXRpb24sIGxpc3QgbWFuaXB1bGF0aW9ucywgYW5kIGxvY2tpbmcgKFJUTkwvbXJ0X2xvY2spLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoZXNlIHBhdGhzIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgYWNjZXNzLCBvciBtZW1vcnkgbGVha3MsIHdoaWNoIGFyZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgS01FTUxFQUsuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIGludHJvZHVjZWQsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIElQdjYgbXVsdGljYXN0IHJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCAobmV0L2lwdjYvaXA2bXIuYykgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgdGFibGVzIG9uIGRlbWFuZCB3aGVuIHNvY2tldCBvcHRpb25zIGFyZSBjb25maWd1cmVkIGFuZCB0byBkZXN0cm95IHRoZW0gd2hlbiB0aGV5IGJlY29tZSB1bnJlZmVyZW5jZWQgb3IgZW1wdHkuXFxuXFxuLSBNZW1vcnkgQWxsb2NhdGlvbnM6IE5ldyBkeW5hbWljIGFsbG9jYXRpb25zIChzdWNoIGFzIGBzdHJ1Y3QgaXA2bXJfZGVzdHJveV93b3JrYCBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jX29iamApIGhhdmUgYWxsIG1lbWJlciBmaWVsZHMgKGB3b3JrYCwgYG5ldGAsIGBpZGApIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFRoZSB1bmRlcmx5aW5nIG11bHRpY2FzdCB0YWJsZXMgYWxsb2NhdGVkIHZpYSBgbXJfdGFibGVfYWxsb2MoKWAgdXNlIGBremFsbG9jX29iaigpYC5cXG4tIERhdGEgc2VudCB0byB1c2VyIHNwYWNlOiBpb2N0bC9jb21wYXRfaW9jdGwgYW5kIGdldHNvY2tvcHQgaGFuZGxlcnMgb25seSBjb3B5IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgZmllbGRzIG9yIGRhdGEgY29waWVkIGZyb20gdXNlciBzcGFjZSBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBsZWF2aW5nIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciByZWFkaW5nIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS5cXG4tIENvbnRyb2wgZmxvdyBhbmQgTGlmZXRpbWVzOiBDaGFuZ2VzIGFmZmVjdCB0YWJsZSBsaWZlY3ljbGUsIFJDVSBzeW5jaHJvbml6YXRpb24sIGxpc3QgbWFuaXB1bGF0aW9ucywgYW5kIGxvY2tpbmcgKFJUTkwvbXJ0X2xvY2spLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoZXNlIHBhdGhzIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgYWNjZXNzLCBvciBtZW1vcnkgbGVha3MsIHdoaWNoIGFyZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgS01FTUxFQUsuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIGludHJvZHVjZWQsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow7lp9l[1] Phase: Succeeded StartedAt: 2026-09-06 15:22:59 +0000 UTC FinishedAt: 2026-09-06 15:22:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-06 15:22:59 +0000 UTC FinishedAt: 2026-09-06 15:22:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2] Phase: Succeeded StartedAt: 2026-09-06 15:22:59 +0000 UTC FinishedAt: 2026-09-06 19:06:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-06 15:22:59 +0000 UTC FinishedAt: 2026-09-06 19:06:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-06 15:22:59 +0000 UTC FinishedAt: 2026-09-06 15:23:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-06 15:22:59 +0000 UTC FinishedAt: 2026-09-06 15:23:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow7lp9l/series-workflow7lp9l-convert-artifact-249824942/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-06 15:23:09 +0000 UTC FinishedAt: 2026-09-06 15:43:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-06 15:23:09 +0000 UTC FinishedAt: 2026-09-06 15:43: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:*c98e9ca8-7aed-4e4e-bb33-f48852b11002,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-workflow7lp9l/series-workflow7lp9l-convert-artifact-249824942/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": "bfa52c7a-e1bb-4c1d-b29c-7e4da7026052", "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-workflow7lp9l/series-workflow7lp9l-build-action-1878141460/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-06 15:23:09 +0000 UTC FinishedAt: 2026-09-06 15:43:38 +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:*c98e9ca8-7aed-4e4e-bb33-f48852b11002,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-workflow7lp9l/series-workflow7lp9l-convert-artifact-249824942/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": "bfa52c7a-e1bb-4c1d-b29c-7e4da7026052", "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-workflow7lp9l/series-workflow7lp9l-build-action-1878141460/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-06 15:43:57 +0000 UTC FinishedAt: 2026-09-06 15:43:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-06 15:43:57 +0000 UTC FinishedAt: 2026-09-06 15:43:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-06 15:43:57 +0000 UTC FinishedAt: 2026-09-06 15:44:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-06 15:43:57 +0000 UTC FinishedAt: 2026-09-06 15:44:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow7lp9l/series-workflow7lp9l-convert-artifact-2099513249/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-06 15:44:07 +0000 UTC FinishedAt: 2026-09-06 15:45:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-06 15:44:07 +0000 UTC FinishedAt: 2026-09-06 15:45:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*bfa52c7a-e1bb-4c1d-b29c-7e4da7026052,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-workflow7lp9l/series-workflow7lp9l-build-action-1878141460/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-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-06 15:45:37 +0000 UTC FinishedAt: 2026-09-06 15:45:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-06 15:45:37 +0000 UTC FinishedAt: 2026-09-06 15:45:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-06 15:45:37 +0000 UTC FinishedAt: 2026-09-06 16:01:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-06 15:45:37 +0000 UTC FinishedAt: 2026-09-06 16:01:31 +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:*c98e9ca8-7aed-4e4e-bb33-f48852b11002,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-workflow7lp9l/series-workflow7lp9l-convert-artifact-2099513249/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": "0c2a1f20-132e-4433-9ffb-fc2140d327c2", "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-workflow7lp9l/series-workflow7lp9l-build-action-4087231149/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-06 15:45:37 +0000 UTC FinishedAt: 2026-09-06 16:01:21 +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:*c98e9ca8-7aed-4e4e-bb33-f48852b11002,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-workflow7lp9l/series-workflow7lp9l-convert-artifact-2099513249/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": "0c2a1f20-132e-4433-9ffb-fc2140d327c2", "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-workflow7lp9l/series-workflow7lp9l-build-action-4087231149/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-06 16:01:31 +0000 UTC FinishedAt: 2026-09-06 16:01:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-06 16:01:31 +0000 UTC FinishedAt: 2026-09-06 16:01:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-06 16:01:31 +0000 UTC FinishedAt: 2026-09-06 16:03:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-06 16:01:31 +0000 UTC FinishedAt: 2026-09-06 16:03:17 +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:*0c2a1f20-132e-4433-9ffb-fc2140d327c2,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-workflow7lp9l/series-workflow7lp9l-build-action-4087231149/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-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-06 16:03:26 +0000 UTC FinishedAt: 2026-09-06 19:06:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-06 16:03:26 +0000 UTC FinishedAt: 2026-09-06 19:06:12 +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-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"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:*bfa52c7a-e1bb-4c1d-b29c-7e4da7026052,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*0c2a1f20-132e-4433-9ffb-fc2140d327c2,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-workflow7lp9l/series-workflow7lp9l-build-action-1878141460/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-workflow7lp9l/series-workflow7lp9l-build-action-4087231149/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-06 16:03:26 +0000 UTC FinishedAt: 2026-09-06 16:03:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-06 16:03:26 +0000 UTC FinishedAt: 2026-09-06 16:03:31 +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-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"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-workflow7lp9l/series-workflow7lp9l-convert-artifact-517068342/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-06 16:03:26 +0000 UTC FinishedAt: 2026-09-06 16:03:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-06 16:03:26 +0000 UTC FinishedAt: 2026-09-06 16:03:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-06 16:03:26 +0000 UTC FinishedAt: 2026-09-06 16:03:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-06 16:03:36 +0000 UTC FinishedAt: 2026-09-06 19:06:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7lp9l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ip6_mroute_setsockopt","ip6_mroute_getsockopt","ip6mr_ioctl","ip6mr_compat_ioctl","ip6mr_sk_done","ip6mr_get_or_alloc_sk_table","ip6mr_maybe_destroy_table","ip6mr_destroy_workfn","ip6mr_device_event","ipmr_expire_process"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"641d03105cc0d2437e32fdeec164f91a4ccef6c4","config_name":"upstream-apparmor-kasan.config","enable_configs":["IPV6","IPV6_MROUTE","IPV6_MROUTE_MULTIPLE_TABLES"],"series_id":"aaa7c65c-7234-4ec7-83fb-134e1137c61c","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-06 16:03:36 +0000 UTC FinishedAt: 2026-09-06 19:06:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*bfa52c7a-e1bb-4c1d-b29c-7e4da7026052,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*0c2a1f20-132e-4433-9ffb-fc2140d327c2,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-workflow7lp9l/series-workflow7lp9l-build-action-1878141460/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-workflow7lp9l/series-workflow7lp9l-build-action-4087231149/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-workflow7lp9l/series-workflow7lp9l-convert-artifact-517068342/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,}