Name: series-workflowkwqbs Phase: Running StartedAt: 2026-09-10 15:03:19 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkwqbs[0] Phase: Running StartedAt: 2026-09-10 15:03:19 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkwqbs[0].run-triage Phase: Running StartedAt: 2026-09-10 15:03:19 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkwqbs[0].run-triage(0) Phase: Running StartedAt: 2026-09-10 15:03:19 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "f217004a40c49e787372e798785aecb983828d35", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SKB_EXT", "BPF_SYSCALL", "NET" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "f217004a40c49e787372e798785aecb983828d35", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SKB_EXT", "BPF_SYSCALL", "NET" ], "series_id": "b4d57e3e-d4dd-4dc1-b210-86c63ec26257" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "net" ], "focus_symbols": [ "bpf_dynptr_from_skb_ext", "bpf_skb_ext_pointer", "__bpf_skb_ext_load_bytes", "__bpf_skb_ext_store_bytes", "skb_ext_scrub" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE1OjIzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TS0JfRVhUJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O05FVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9keW5wdHJfZnJvbV9za2JfZXh0JiMzNDssCiAgICAmIzM0O2JwZl9za2JfZXh0X3BvaW50ZXImIzM0OywKICAgICYjMzQ7X19icGZfc2tiX2V4dF9sb2FkX2J5dGVzJiMzNDssCiAgICAmIzM0O19fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMmIzM0OywKICAgICYjMzQ7c2tiX2V4dF9zY3J1YiYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgQlBGIHNvY2tldCBidWZmZXIgbWV0YWRhdGEgZXh0ZW5zaW9ucyAoU0tCX0VYVF9CUEYpIGFjY2Vzc2libGUgdmlhIEJQRiBkeW5wdHJzIChgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRgKSwgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIHZlcmlmaWVyIGNoZWNrcywgaGVscGVyIGZ1bmN0aW9ucywgYW5kIHNrYiBleHRlbnNpb24gc2NydWJiaW5nIGxvZ2ljLlxuXG5Bc3Nlc3NtZW50IG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2s6XG4xLiBNZW1vcnkgSW5pdGlhbGl6YXRpb246IFdoZW4gYSBuZXcgYHN0cnVjdCBicGZfc2tiX2V4dGAgaXMgYWRkZWQgdG8gYW4gc2tiIHZpYSBgc2tiX2V4dF9hZGQoKWAsIGBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpYCBleHBsaWNpdGx5IHplcm9lcyB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZSB1c2luZyBgbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKWAuIFdoZW4gZXJyb3IgY29uZGl0aW9ucyBhcmUgZW5jb3VudGVyZWQsIHRoZSBkeW5wdHIgaXMgc2FmZWx5IGNsZWFyZWQgd2l0aCBgYnBmX2R5bnB0cl9zZXRfbnVsbCgpYC5cbjIuIEJvdW5kcyBhbmQgT2Zmc2V0czogVGhlIGJ1ZmZlciBsZW5ndGggaXMgc3RyaWN0bHkgY2hlY2tlZCBhZ2FpbnN0IGBDT05GSUdfQlBGX1NLQl9FWFRfU0laRWAgKGBBUlJBWV9TSVpFKGV4dC1cdTAwM2VidWYpYCksIGFuZCBhbGwgc3Vic2VxdWVudCBkeW5wdHIgb3BlcmF0aW9ucyAoYGJwZl9keW5wdHJfcmVhZGAsIGBicGZfZHlucHRyX3dyaXRlYCwgYGJwZl9keW5wdHJfc2xpY2VgKSBlbmZvcmNlIGJvdW5kcyB2aWEgYGJwZl9keW5wdHJfY2hlY2tfb2ZmX2xlbigpYCwgcHJldmVudGluZyByZWFkcyBiZXlvbmQgdGhlIGluaXRpYWxpemVkIHJlZ2lvbi5cbjMuIEluZm8gTGVha3M6IE5vIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBvciBwYWRkaW5nIGlzIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciBhY3Jvc3Mga2VybmVsIGJvdW5kYXJpZXMuXG5cblRoZSBwcmltYXJ5IGJ1ZyBzdXJmYWNlcyBmb3IgdGhlc2UgY2hhbmdlcyBhcmUgQlBGIHZlcmlmaWVyIHNhZmV0eSwgcmVmY291bnQvQ09XIHNlbWFudGljcyBvbiBjbG9uZWQgc2ticywgYW5kIGJ1ZmZlciBib3VuZHMgY2hlY2tpbmcsIGFsbCBvZiB3aGljaCBhcmUgZWZmZWN0aXZlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHNhbml0aXplcnMgcmF0aGVyIHRoYW4gS01TQU4uIEEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgdGhlcmVmb3JlIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc2tfYnVmZiBleHRlbnNpb24gZm9yIEJQRiBtZXRhZGF0YSAoQ09ORklHX0JQRl9TS0JfRVhUKSBhbG9uZyB3aXRoIHRoZSBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCBrZnVuYyBhbmQgcmVsYXRlZCBkeW5wdHIgaGFuZGxpbmcgaW4gaGVscGVycyBhbmQgdGhlIEJQRiB2ZXJpZmllci4gSXQgYWxzbyBtb2RpZmllcyBwYWNrZXQgc2NydWJiaW5nIGFuZCBleHRlbnNpb24gbGlmZXRpbWUgbG9naWMgaW4gY29yZSBuZXR3b3JraW5nIHBhdGhzLiBUaGVzZSBjaGFuZ2VzIGFyZSBpbiByZWFjaGFibGUgY29yZSBzdWJzeXN0ZW1zIGFuZCB3YXJyYW50IGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBhMGUwNDViZDU5MDdkMjZmZTZlZGNlNzZmMWYyMTZjYzI0MjcwYTQ3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMTAgMTU6MjM6MTggMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmhcbmluZGV4IGZmYTU2MjY0MTFhYzIuLjZjMzVmOGM3NDE0NzQgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2JwZi5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JwZi5oXG5AQCAtMTQ4MSw2ICYjNDM7MTQ4MSw4IEBAIGVudW0gYnBmX2R5bnB0cl90eXBlIHtcbiBcdEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQSxcbiBcdC8qIFVuZGVybHlpbmcgZGF0YSBpcyBhIGZpbGUgKi9cbiBcdEJQRl9EWU5QVFJfVFlQRV9GSUxFLFxuJiM0MztcdC8qIFVuZGVybHlpbmcgZGF0YSBpcyBhIGJwZl9za2JfZXh0IGNodW5rICovXG4mIzQzO1x0QlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQsXG4gfTtcbiBcbiBpbnQgYnBmX2R5bnB0cl9jaGVja19zaXplKHU2NCBzaXplKTtcbkBAIC00MjE2LDQgJiM0Mzs0MjE4LDEyIEBAIHN0YXRpYyBpbmxpbmUgaW50IGJwZl9tYXBfY2hlY2tfb3BfZmxhZ3Moc3RydWN0IGJwZl9tYXAgKm1hcCwgdTY0IGZsYWdzLCB1NjQgYWxsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfc2tiX2V4dCB7XG4mIzQzO1x0dTggYnVmW0NPTkZJR19CUEZfU0tCX0VYVF9TSVpFXSBfX2FsaWduZWQoOCk7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogQ09ORklHX0JQRl9TS0JfRVhUICovXG4mIzQzO1xuICNlbmRpZiAvKiBfTElOVVhfQlBGX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaFxuaW5kZXggNGE5YmM2YTg0OGYyZS4uZTlhOTM0OTIyNTNiYSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZmlsdGVyLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZmlsdGVyLmhcbkBAIC0xOTU4LDQgJiM0MzsxOTU4LDMxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqYnBmX3NrYl9tZXRhX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldClcbiB9XG4gI2VuZGlmIC8qIENPTkZJR19ORVQgKi9cbiBcbiYjNDM7I2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxuJiM0Mzt2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIGJvb2wgd3IpO1xuJiM0MztpbnQgX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIHZvaWQgKnRvLFxuJiM0MztcdFx0XHQgICAgIHUzMiBsZW4pO1xuJiM0MztpbnQgX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCBjb25zdCB2b2lkICpmcm9tLFxuJiM0MztcdFx0XHQgICAgICB1MzIgbGVuLCB1NjQgZmxhZ3MpO1xuJiM0MzsjZWxzZSAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi9cbiYjNDM7c3RhdGljIGlubGluZSB2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsXG4mIzQzO1x0XHRcdFx0XHRib29sIHdyKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuJiM0MztcdFx0XHRcdFx0ICAgdTMyIG9mZnNldCwgdm9pZCAqdG8sIHUzMiBsZW4pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IF9fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCxcbiYjNDM7XHRcdFx0XHRcdCAgICBjb25zdCB2b2lkICpmcm9tLCB1MzIgbGVuLFxuJiM0MztcdFx0XHRcdFx0ICAgIHU2NCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7fVxuJiM0MzsjZW5kaWYgLyogQ09ORklHX0JQRl9TS0JfRVhUICovXG4mIzQzO1xuICNlbmRpZiAvKiBfX0xJTlVYX0ZJTFRFUl9IX18gKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaFxuaW5kZXggNDIxZjZmYzQ1NDUxMS4uNTA5ZDQ0NzE3OWUxMyAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmhcbkBAIC01MDYxLDYgJiM0Mzs1MDYxLDkgQEAgZW51bSBza2JfZXh0X2lkIHtcbiAjZW5kaWZcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQ0FOKVxuIFx0U0tCX0VYVF9DQU4sXG4mIzQzOyNlbmRpZlxuJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NLQl9FWFQpXG4mIzQzO1x0U0tCX0VYVF9CUEYsXG4gI2VuZGlmXG4gXHRTS0JfRVhUX05VTSwgLyogbXVzdCBiZSBsYXN0ICovXG4gfTtcbkBAIC01MDg4LDYgJiM0Mzs1MDkxLDcgQEAgdm9pZCAqX19za2JfZXh0X3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQsXG4gdm9pZCAqc2tiX2V4dF9hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBza2JfZXh0X2lkIGlkKTtcbiB2b2lkIF9fc2tiX2V4dF9kZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBza2JfZXh0X2lkIGlkKTtcbiB2b2lkIF9fc2tiX2V4dF9wdXQoc3RydWN0IHNrYl9leHQgKmV4dCk7XG4mIzQzO3ZvaWQgc2tiX2V4dF9zY3J1YihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTtcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYilcbiB7XG5AQCAtNTE1MywxNCAmIzQzOzUxNTcsMjMgQEAgc3RhdGljIGlubGluZSBib29sIHNrYl9oYXNfZXh0ZW5zaW9ucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuIHtcbiBcdHJldHVybiB1bmxpa2VseShza2ItXHUwMDNlYWN0aXZlX2V4dGVuc2lvbnMpO1xuIH1cbiYjNDM7XG4mIzQzOy8qIFRydWUgaWYgdGhlIGV4dGVuc2lvbiBibG9jayBpcyBzaGFyZWQgd2l0aCBjbG9uZWQgc2ticyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2V4dF9zaGFyZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBza2ItXHUwMDNlYWN0aXZlX2V4dGVuc2lvbnMgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICAgIHJlZmNvdW50X3JlYWQoXHUwMDI2c2tiLVx1MDAzZWV4dGVuc2lvbnMtXHUwMDNlcmVmY250KSAhPSAxO1xuJiM0Mzt9XG4gI2Vsc2VcbiBzdGF0aWMgaW5saW5lIHZvaWQgX19za2JfZXh0X3B1dChzdHJ1Y3Qgc2tiX2V4dCAqZXh0KSB7fVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3Jlc2V0KHN0cnVjdCBza19idWZmICpza2IpIHt9XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3NjcnViKHN0cnVjdCBza19idWZmICpza2IpIHt9XG4gc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfZGVsKHN0cnVjdCBza19idWZmICpza2IsIGludCB1bnVzZWQpIHt9XG4gc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX2V4dF9jb3B5KHN0cnVjdCBza19idWZmICpkLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqcykge31cbiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9jb3B5KHN0cnVjdCBza19idWZmICpkc3QsIGNvbnN0IHN0cnVjdCBza19idWZmICpzKSB7fVxuIHN0YXRpYyBpbmxpbmUgYm9vbCBza2JfaGFzX2V4dGVuc2lvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYikgeyByZXR1cm4gZmFsc2U7IH1cbiYjNDM7c3RhdGljIGlubGluZSBib29sIHNrYl9leHRfc2hhcmVkKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpIHsgcmV0dXJuIGZhbHNlOyB9XG4gI2VuZGlmIC8qIENPTkZJR19TS0JfRVhURU5TSU9OUyAqL1xuIFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9yZXNldF9jdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxuaW5kZXggNzMyYjM1Y2MwOGQxYy4uYTQ4Mzk5YWZlNDk0OSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXG5AQCAtNzgyNSw0ICYjNDM7NzgyNSw5IEBAIHN0cnVjdCBicGZfaW5zbl9hcnJheV92YWx1ZSB7XG4gXHRfX3UzMiA6MzI7XG4gfTtcbiBcbiYjNDM7LyogRmxhZ3MgdG8gY29udHJvbCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpIGJlaGF2aW9yLiAqL1xuJiM0MztlbnVtIHtcbiYjNDM7XHRCUEZfU0tCX0VYVF9GX0NSRUFURSA9ICgxVUxMIFx1MDAzY1x1MDAzYyAwKSxcbiYjNDM7fTtcbiYjNDM7XG4gI2VuZGlmIC8qIF9VQVBJX19MSU5VWF9CUEZfSF9fICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9oZWxwZXJzLmMgYi9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuaW5kZXggYjNjYzVjOGZjODc1Ni4uY2ZjYjc5Mzk5ZWQwYiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvaGVscGVycy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuQEAgLTE5MjYsNiAmIzQzOzE5MjYsOCBAQCBzdGF0aWMgaW50IF9fYnBmX2R5bnB0cl9yZWFkKHZvaWQgKmRzdCwgdTY0IGxlbiwgY29uc3Qgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqc1xuIFx0XHRyZXR1cm4gMDtcbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6XG4gXHRcdHJldHVybiBicGZfZmlsZV9mZXRjaF9ieXRlcyhzcmMtXHUwMDNlZGF0YSwgb2Zmc2V0LCBkc3QsIGxlbik7XG4mIzQzO1x0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDpcbiYjNDM7XHRcdHJldHVybiBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoc3JjLVx1MDAzZWRhdGEsIHNyYy1cdTAwM2VvZmZzZXQgJiM0Mzsgb2Zmc2V0LCBkc3QsIGxlbik7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OQ0UodHJ1ZSwgXCYjMzQ7YnBmX2R5bnB0cl9yZWFkOiB1bmtub3duIGR5bnB0ciB0eXBlICVkXFxuXCYjMzQ7LCB0eXBlKTtcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG5AQCAtMTk4NSw2ICYjNDM7MTk4Nyw4IEBAIGludCBfX2JwZl9keW5wdHJfd3JpdGUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqZHN0LCB1NjQgb2Zmc2V0LCB2b2lkICpzcmMsXG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQTpcbiBcdFx0cmV0dXJuIF9fYnBmX3NrYl9tZXRhX3N0b3JlX2J5dGVzKGRzdC1cdTAwM2VkYXRhLCBkc3QtXHUwMDNlb2Zmc2V0ICYjNDM7IG9mZnNldCwgc3JjLFxuIFx0XHRcdFx0XHRcdCAgbGVuLCBmbGFncyk7XG4mIzQzO1x0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDpcbiYjNDM7XHRcdHJldHVybiBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKGRzdC1cdTAwM2VkYXRhLCBkc3QtXHUwMDNlb2Zmc2V0ICYjNDM7IG9mZnNldCwgc3JjLCBsZW4sIGZsYWdzKTtcbiBcdGRlZmF1bHQ6XG4gXHRcdFdBUk5fT05DRSh0cnVlLCBcJiMzNDticGZfZHlucHRyX3dyaXRlOiB1bmtub3duIGR5bnB0ciB0eXBlICVkXFxuXCYjMzQ7LCB0eXBlKTtcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG5AQCAtMjAzMiw2ICYjNDM7MjAzNiw3IEBAIEJQRl9DQUxMXzMoYnBmX2R5bnB0cl9kYXRhLCBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICosIHB0ciwgdTY0LCBvZmZzZXQsIHU2XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0I6XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9YRFA6XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQTpcbiYjNDM7XHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxuIFx0XHQvKiBza2IgYW5kIHhkcCBkeW5wdHJzIHNob3VsZCB1c2UgYnBmX2R5bnB0cl9zbGljZSAvIGJwZl9keW5wdHJfc2xpY2VfcmR3ciAqL1xuIFx0XHRyZXR1cm4gMDtcbiBcdGRlZmF1bHQ6XG5AQCAtMzA0OCw4ICYjNDM7MzA1Myw4IEBAIF9fYnBmX2tmdW5jIHN0cnVjdCB0YXNrX3N0cnVjdCAqYnBmX3Rhc2tfZnJvbV92cGlkKHMzMiB2cGlkKVxuICAqIHByb3ZpZGVkIGJ1ZmZlciwgd2l0aCBpdHMgY29udGVudHMgY29udGFpbmluZyB0aGUgZGF0YSwgaWYgdW5hYmxlIHRvIG9idGFpblxuICAqIGRpcmVjdCBwb2ludGVyKVxuICAqL1xuLV9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsXG4tXHRcdFx0XHQgICB2b2lkICpidWZmZXJfX251bGxhYmxlLCB1NjQgYnVmZmVyX19zemspXG4mIzQzO3N0YXRpYyB2b2lkICpfX2JwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsXG4mIzQzO1x0XHRcdFx0dm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prLCBib29sIHdyKVxuIHtcbiBcdGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0ciA9IChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICopcDtcbiBcdGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGU7XG5AQCAtMzA4Nyw2ICYjNDM7MzA5Miw4IEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsXG4gXHR9XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQTpcbiBcdFx0cmV0dXJuIGJwZl9za2JfbWV0YV9wb2ludGVyKHB0ci1cdTAwM2VkYXRhLCBwdHItXHUwMDNlb2Zmc2V0ICYjNDM7IG9mZnNldCk7XG4mIzQzO1x0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDpcbiYjNDM7XHRcdHJldHVybiBicGZfc2tiX2V4dF9wb2ludGVyKHB0ci1cdTAwM2VkYXRhLCBwdHItXHUwMDNlb2Zmc2V0ICYjNDM7IG9mZnNldCwgd3IpO1xuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfRklMRTpcbiBcdFx0ZXJyID0gYnBmX2ZpbGVfZmV0Y2hfYnl0ZXMocHRyLVx1MDAzZWRhdGEsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemspO1xuIFx0XHRyZXR1cm4gZXJyID8gTlVMTCA6IGJ1ZmZlcl9fbnVsbGFibGU7XG5AQCAtMzA5Niw2ICYjNDM7MzEwMywxMyBAQCBfX2JwZl9rZnVuYyB2b2lkICpicGZfZHlucHRyX3NsaWNlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgb2Zmc2V0LFxuIFx0fVxuIH1cbiBcbiYjNDM7X19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCxcbiYjNDM7XHRcdFx0XHQgICB2b2lkICpidWZmZXJfX251bGxhYmxlLCB1NjQgYnVmZmVyX19zemspXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gX19icGZfZHlucHRyX3NsaWNlKHAsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemssXG4mIzQzO1x0XHRcdFx0ICBmYWxzZSk7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogYnBmX2R5bnB0cl9zbGljZV9yZHdyKCkgLSBPYnRhaW4gYSB3cml0YWJsZSBwb2ludGVyIHRvIHRoZSBkeW5wdHIgZGF0YS5cbiAgKiBAcDogVGhlIGR5bnB0ciB3aG9zZSBkYXRhIHNsaWNlIHRvIHJldHJpZXZlXG5AQCAtMzE2OCw3ICYjNDM7MzE4Miw4IEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2VfcmR3cihjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCxcbiBcdCAqIHdpbGwgYmUgY29waWVkIG91dCBpbnRvIHRoZSBidWZmZXIgYW5kIHRoZSB1c2VyIHdpbGwgbmVlZCB0byBjYWxsXG4gXHQgKiBicGZfZHlucHRyX3dyaXRlKCkgdG8gY29tbWl0IGNoYW5nZXMuXG4gXHQgKi9cbi1cdHJldHVybiBicGZfZHlucHRyX3NsaWNlKHAsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemspO1xuJiM0MztcdHJldHVybiBfX2JwZl9keW5wdHJfc2xpY2UocCwgb2Zmc2V0LCBidWZmZXJfX251bGxhYmxlLCBidWZmZXJfX3N6ayxcbiYjNDM7XHRcdFx0XHQgIHRydWUpO1xuIH1cbiBcbiBfX2JwZl9rZnVuYyBpbnQgYnBmX2R5bnB0cl9hZGp1c3Qoc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBzdGFydCwgdTY0IGVuZClcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2xvZy5jIGIva2VybmVsL2JwZi9sb2cuY1xuaW5kZXggNTg5NzcwY2EzZDNhMC4uMDJmOWJmNzJhYzA3YyAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvbG9nLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvbG9nLmNcbkBAIC00NjIsNiAmIzQzOzQ2Miw4IEBAIGNvbnN0IGNoYXIgKmR5bnB0cl90eXBlX3N0cihlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlKVxuIFx0XHRyZXR1cm4gXCYjMzQ7c2tiX21ldGFcJiMzNDs7XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9GSUxFOlxuIFx0XHRyZXR1cm4gXCYjMzQ7ZmlsZVwmIzM0OztcbiYjNDM7XHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3NrYl9leHRcJiMzNDs7XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9JTlZBTElEOlxuIFx0XHRyZXR1cm4gXCYjMzQ7XHUwMDNjaW52YWxpZFx1MDAzZVwmIzM0OztcbiBcdGRlZmF1bHQ6XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCBlNDIxZWEyYjgwYzNhLi5lODJlMGI0ZGQyY2UwIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbkBAIC02MjEsNiAmIzQzOzYyMSw3IEBAIHN0YXRpYyBlbnVtIGJwZl90eXBlX2ZsYWcgZ2V0X2R5bnB0cl90eXBlX2ZsYWcoZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZSlcbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1hEUDpcbiBcdFx0cmV0dXJuIERZTlBUUl9UWVBFX1hEUDtcbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBOlxuJiM0MztcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQ6XG4gXHRcdHJldHVybiBEWU5QVFJfVFlQRV9TS0JfTUVUQTtcbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6XG4gXHRcdHJldHVybiBEWU5QVFJfVFlQRV9GSUxFO1xuQEAgLTU4OTAsNiAmIzQzOzU4OTEsMTAgQEAgQlRGX1RZUEVfU0FGRV9UUlVTVEVEX09SX05VTEwoc3RydWN0IHZtX2FyZWFfc3RydWN0KSB7XG4gXHRzdHJ1Y3QgZmlsZSAqdm1fZmlsZTtcbiB9O1xuIFxuJiM0MztCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgYnBmX3NvY2tfb3BzX2tlcm4pIHtcbiYjNDM7XHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xuJiM0Mzt9O1xuJiM0MztcbiBzdGF0aWMgYm9vbCB0eXBlX2lzX3JjdShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuIFx0XHRcdHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsXG4gXHRcdFx0Y29uc3QgY2hhciAqZmllbGRfbmFtZSwgdTMyIGJ0Zl9pZClcbkBAIC01OTMyLDYgJiM0Mzs1OTM3LDcgQEAgc3RhdGljIGJvb2wgdHlwZV9pc190cnVzdGVkX29yX251bGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdEJURl9UWVBFX0VNSVQoQlRGX1RZUEVfU0FGRV9UUlVTVEVEX09SX05VTEwoc3RydWN0IHNvY2tldCkpO1xuIFx0QlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgZGVudHJ5KSk7XG4gXHRCVEZfVFlQRV9FTUlUKEJURl9UWVBFX1NBRkVfVFJVU1RFRF9PUl9OVUxMKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCkpO1xuJiM0MztcdEJURl9UWVBFX0VNSVQoQlRGX1RZUEVfU0FGRV9UUlVTVEVEX09SX05VTEwoc3RydWN0IGJwZl9zb2NrX29wc19rZXJuKSk7XG4gXG4gXHRyZXR1cm4gYnRmX25lc3RlZF90eXBlX2lzX3RydXN0ZWQoXHUwMDI2ZW52LVx1MDAzZWxvZywgcmVnLCBmaWVsZF9uYW1lLCBidGZfaWQsXG4gXHRcdFx0XHRcdCAgXCYjMzQ7X19zYWZlX3RydXN0ZWRfb3JfbnVsbFwmIzM0Oyk7XG5AQCAtMTE2MTUsNiAmIzQzOzExNjIxLDcgQEAgZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUge1xuIFx0S0ZfYnBmX2R5bnB0cl9mcm9tX3hkcCxcbiBcdEtGX2JwZl9keW5wdHJfZnJvbV9za2JfbWV0YSxcbiBcdEtGX2JwZl94ZHBfcHVsbF9kYXRhLFxuJiM0MztcdEtGX2JwZl9keW5wdHJfZnJvbV9za2JfZXh0LFxuIFx0S0ZfYnBmX2R5bnB0cl9zbGljZSxcbiBcdEtGX2JwZl9keW5wdHJfc2xpY2VfcmR3cixcbiBcdEtGX2JwZl9keW5wdHJfY2xvbmUsXG5AQCAtMTE2OTIsNiAmIzQzOzExNjk5LDExIEBAIEJURl9JRF9VTlVTRURcbiBCVEZfSURfVU5VU0VEXG4gQlRGX0lEX1VOVVNFRFxuICNlbmRpZlxuJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXG4mIzQzO0JURl9JRChmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dClcbiYjNDM7I2Vsc2VcbiYjNDM7QlRGX0lEX1VOVVNFRFxuJiM0MzsjZW5kaWZcbiBCVEZfSUQoZnVuYywgYnBmX2R5bnB0cl9zbGljZSlcbiBCVEZfSUQoZnVuYywgYnBmX2R5bnB0cl9zbGljZV9yZHdyKVxuIEJURl9JRChmdW5jLCBicGZfZHlucHRyX2Nsb25lKVxuQEAgLTExODI0LDcgJiM0MzsxMTgzNiw4IEBAIHN0YXRpYyBib29sIGlzX2tmdW5jX2JwZl9wcmVlbXB0X2VuYWJsZShzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4gXG4gYm9vbCBicGZfaXNfa2Z1bmNfcGt0X2NoYW5naW5nKHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSlcbiB7XG4tXHRyZXR1cm4gbWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfeGRwX3B1bGxfZGF0YV07XG4mIzQzO1x0cmV0dXJuIG1ldGEtXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3hkcF9wdWxsX2RhdGFdIHx8XG4mIzQzO1x0ICAgICAgIG1ldGEtXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRdO1xuIH1cbiBcbiBzdGF0aWMgaW50XG5AQCAtMTI4MzUsNyAmIzQzOzEyODQ4LDggQEAgc3RhdGljIGludCBjaGVja19rZnVuY19hcmdzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfY2FsbF9hcmdfbWVcbiBcdFx0XHRcdGR5bnB0cl9hcmdfdHlwZSB8PSBEWU5QVFJfVFlQRV9TS0I7XG4gXHRcdFx0fSBlbHNlIGlmIChtZXRhLVx1MDAzZWZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV94ZHBdKSB7XG4gXHRcdFx0XHRkeW5wdHJfYXJnX3R5cGUgfD0gRFlOUFRSX1RZUEVfWERQO1xuLVx0XHRcdH0gZWxzZSBpZiAobWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGFdKSB7XG4mIzQzO1x0XHRcdH0gZWxzZSBpZiAobWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGFdIHx8XG4mIzQzO1x0XHRcdFx0ICAgbWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX2V4dF0pIHtcbiBcdFx0XHRcdGR5bnB0cl9hcmdfdHlwZSB8PSBEWU5QVFJfVFlQRV9TS0JfTUVUQTtcbiBcdFx0XHR9IGVsc2UgaWYgKG1ldGEtXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX2ZpbGVdKSB7XG4gXHRcdFx0XHRkeW5wdHJfYXJnX3R5cGUgfD0gRFlOUFRSX1RZUEVfRklMRTtcbkBAIC0xMzc2Myw2ICYjNDM7MTM3NzcsMTMgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcbiBcdFx0fVxuIFx0fVxuIFxuJiM0MztcdGlmIChtZXRhLmZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV9za2JfZXh0XSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgKHByb2dfdHlwZSA9PSBCUEZfUFJPR19UWVBFX0xTTSB8fCBwcm9nX3R5cGUgPT0gQlBGX1BST0dfVFlQRV9UUkFDSU5HKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgKG1ldGEuYXJnX2NvbnN0YW50LnZhbHVlIFx1MDAyNiBCUEZfU0tCX0VYVF9GX0NSRUFURSkpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtCUEZfU0tCX0VYVF9GX0NSRUFURSBpcyBub3QgYWxsb3dlZCBpbiBsc20vdHJhY2luZyBwcm9ncmFtc1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKGlzX2JwZl9yYnRyZWVfYWRkX2tmdW5jKG1ldGEuZnVuY19pZCkpIHtcbiBcdFx0ZXJyID0gcHVzaF9jYWxsYmFja19jYWxsKGVudiwgaW5zbiwgaW5zbl9pZHgsIG1ldGEuc3VicHJvZ25vLFxuIFx0XHRcdFx0XHQgc2V0X3JidHJlZV9hZGRfY2FsbGJhY2tfc3RhdGUpO1xuZGlmZiAtLWdpdCBhL25ldC9LY29uZmlnIGIvbmV0L0tjb25maWdcbmluZGV4IGUzODQ3NzM5MzU1MTUuLjZkNTczMjBkZmVhMzkgMTAwNjQ0XG4tLS0gYS9uZXQvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L0tjb25maWdcbkBAIC01NDAsNCAmIzQzOzU0MCwyNCBAQCBjb25maWcgTkVUX1RFU1RcbiBcbiBcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiBcbiYjNDM7Y29uZmlnIEJQRl9TS0JfRVhUXG4mIzQzO1x0Ym9vbCBcJiMzNDtza2IgZXh0ZW5zaW9uIGZvciBCUEYgbWV0YWRhdGFcJiMzNDtcbiYjNDM7XHRkZXBlbmRzIG9uIEJQRl9TWVNDQUxMXG4mIzQzO1x0c2VsZWN0IFNLQl9FWFRFTlNJT05TXG4mIzQzO1x0aGVscFxuJiM0MztcdCAgRW5hYmxlIGFuIHNrX2J1ZmYgZXh0ZW5zaW9uIGZvciBzdG9yaW5nIEJQRiBtZXRhZGF0YS4gVGhpcyBhbGxvd3MgQlBGXG4mIzQzO1x0ICBwcm9ncmFtcyB0byBhc3NvY2lhdGUgYXJiaXRyYXJ5IGRhdGEgd2l0aCBpbmRpdmlkdWFsIHBhY2tldHMgYXMgdGhleVxuJiM0MztcdCAgdHJhdmVyc2UgdGhlIG5ldHdvcmsgc3RhY2suIFRoZSBzdG9yYWdlIGlzIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlblxuJiM0MztcdCAgdGhlIHNrX2J1ZmYgaXMgZnJlZWQuXG4mIzQzO1xuJiM0Mztjb25maWcgQlBGX1NLQl9FWFRfU0laRVxuJiM0MztcdGludCBcJiMzNDtTaXplIG9mIHRoZSBCUEYgc2tiIGV4dGVuc2lvbiBtZXRhZGF0YSBidWZmZXJcJiMzNDtcbiYjNDM7XHRkZXBlbmRzIG9uIEJQRl9TS0JfRVhUXG4mIzQzO1x0cmFuZ2UgMSAyNTZcbiYjNDM7XHRkZWZhdWx0IDY0XG4mIzQzO1x0aGVscFxuJiM0MztcdCAgQ29uZmlndXJlcyB0aGUgc2l6ZSBvZiB0aGUgaW5saW5lIG1ldGFkYXRhIGJ1ZmZlciBpbiBzdHJ1Y3RcbiYjNDM7XHQgIGJwZl9za2JfZXh0LCB3aGljaCBpcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSBhIEJQRiBwcm9ncmFtIGNhblxuJiM0MztcdCAgc3RvcmUgb3IgcmV0cmlldmUgd2l0aCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpLlxuJiM0MztcbiBlbmRpZiAgICMgaWYgTkVUXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmlsdGVyLmMgYi9uZXQvY29yZS9maWx0ZXIuY1xuaW5kZXggNjE5NDBlNzUzNTUyMy4uYmY3NTRmMzMwMzQ2MyAxMDA2NDRcbi0tLSBhL25ldC9jb3JlL2ZpbHRlci5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvY29yZS9maWx0ZXIuY1xuQEAgLTEyNDE4LDYgJiM0MzsxMjQxOCw1NCBAQCBpbnQgX19icGZfc2tiX21ldGFfc3RvcmVfYnl0ZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCxcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7I2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxuJiM0Mzt2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIGJvb2wgd3IpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX3NrYl9leHQgKmV4dDtcbiYjNDM7XG4mIzQzO1x0ZXh0ID0gc2tiX2V4dF9maW5kKHNrYiwgU0tCX0VYVF9CUEYpO1xuJiM0MztcdGlmICghZXh0KVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0MztcdGlmICh3ciBcdTAwMjZcdTAwMjYgc2tiX2V4dF9zaGFyZWQoc2tiKSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gZXh0LVx1MDAzZWJ1ZiAmIzQzOyBvZmZzZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCwgdm9pZCAqdG8sXG4mIzQzO1x0XHRcdCAgICAgdTMyIGxlbilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfc2tiX2V4dCAqZXh0O1xuJiM0MztcbiYjNDM7XHRleHQgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX0JQRik7XG4mIzQzO1x0aWYgKCFleHQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XG4mIzQzO1x0bWVtbW92ZSh0bywgZXh0LVx1MDAzZWJ1ZiAmIzQzOyBvZmZzZXQsIGxlbik7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsXG4mIzQzO1x0XHRcdCAgICAgIGNvbnN0IHZvaWQgKmZyb20sIHUzMiBsZW4sIHU2NCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfc2tiX2V4dCAqZXh0O1xuJiM0MztcbiYjNDM7XHRpZiAodW5saWtlbHkoZmxhZ3MpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdGV4dCA9IHNrYl9leHRfZmluZChza2IsIFNLQl9FWFRfQlBGKTtcbiYjNDM7XHRpZiAoIWV4dClcbiYjNDM7XHRcdHJldHVybiAtRU5PRU5UO1xuJiM0MztcbiYjNDM7XHRpZiAoc2tiX2V4dF9zaGFyZWQoc2tiKSlcbiYjNDM7XHRcdHJldHVybiAtRUJVU1k7XG4mIzQzO1xuJiM0MztcdG1lbW1vdmUoZXh0LVx1MDAzZWJ1ZiAmIzQzOyBvZmZzZXQsIGZyb20sIGxlbik7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7I2VuZGlmIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqL1xuJiM0MztcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4gX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2Ioc3RydWN0IF9fc2tfYnVmZiAqcywgdTY0IGZsYWdzLFxuIFx0XHRcdFx0ICAgIHN0cnVjdCBicGZfZHlucHRyICpwdHJfX3VuaW5pdClcbkBAIC0xMjQzNSw2ICYjNDM7MTI0ODMsNzkgQEAgX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2Ioc3RydWN0IF9fc2tfYnVmZiAqcywgdTY0IGZsYWdzLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpIC0gSW5pdGlhbGl6ZSBhIGR5bnB0ciB0byB0aGUgc2tiX2V4dCBCUEYgYXJlYS5cbiYjNDM7ICogQHNrYl86IHNvY2tldCBidWZmZXIgdG8gYXR0YWNoIHRoZSBleHRlbnNpb24gdG9cbiYjNDM7ICogQHNpemU6IGR5bnB0ciBzaXplIGluIGJ5dGVzLCAwIGZvciBtYXhpbXVtIChDT05GSUdfQlBGX1NLQl9FWFRfU0laRSlcbiYjNDM7ICogQGZsYWdzX19rOiBCUEZfU0tCX0VYVF9GX0NSRUFURSB0byBjcmVhdGUvQ09XIChyZWFkLXdyaXRlKSwgMCB0byBmaW5kXG4mIzQzOyAqICAgICAgICAgICAgKHJlYWQtb25seSlcbiYjNDM7ICogQHB0cl9fdW5pbml0OiBkeW5wdHIgdG8gaW5pdGlhbGl6ZVxuJiM0MzsgKlxuJiM0MzsgKiBXcml0ZXMgdG8gdGhlIGR5bnB0ciAoYnBmX2R5bnB0cl93cml0ZSgpLCBicGZfZHlucHRyX3NsaWNlX3Jkd3IoKSkgZmFpbCB3aXRoXG4mIzQzOyAqICUtRUJVU1kgb3IgTlVMTCBpZiB0aGUgZXh0ZW5zaW9uIGNodW5rIGlzIHNoYXJlZCB3aXRoIGNsb25lcywgZS5nLiBhZnRlclxuJiM0MzsgKiBicGZfY2xvbmVfcmVkaXJlY3QoKS4gUmUtYWNxdWlyZSB0aGUgZHlucHRyIHdpdGggQlBGX1NLQl9FWFRfRl9DUkVBVEUgdG8gZ2V0XG4mIzQzOyAqIGEgd3JpdGFibGUgcHJpdmF0ZSBjb3B5LlxuJiM0MzsgKlxuJiM0MzsgKiBCUEZfU0tCX0VYVF9GX0NSRUFURSBpcyBub3QgYWxsb3dlZCBpbiB0cmFjaW5nIGFuZCBMU00gcHJvZ3JhbXMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjpcbiYjNDM7ICogKiAlMCAgICAgICAgIC0gZHlucHRyIHJlYWR5IHRvIHVzZVxuJiM0MzsgKiAqICUtRU5PRU5UICAgLSBleHRlbnNpb24gbm90IGZvdW5kICh3aGVuIG5vdCBjcmVhdGluZylcbiYjNDM7ICogKiAlLUVOT01FTSAgIC0gYWxsb2NhdGlvbiBmYWlsZWRcbiYjNDM7ICogKiAlLUVJTlZBTCAgIC0gaW52YWxpZCBmbGFnc1xuJiM0MzsgKiAqICUtRTJCSUcgICAgLSBzaXplIGV4Y2VlZHMgQ09ORklHX0JQRl9TS0JfRVhUX1NJWkVcbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dChzdHJ1Y3QgX19za19idWZmICpza2JfLCB1MzIgc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdHU2NCBmbGFnc19fayxcbiYjNDM7XHRcdFx0XHRcdHN0cnVjdCBicGZfZHlucHRyICpwdHJfX3VuaW5pdClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0ciA9IChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICopcHRyX191bmluaXQ7XG4mIzQzO1x0c3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYl87XG4mIzQzO1x0Ym9vbCBjcmVhdGUgPSBmbGFnc19fayBcdTAwMjYgQlBGX1NLQl9FWFRfRl9DUkVBVEU7XG4mIzQzO1x0c3RydWN0IGJwZl9za2JfZXh0ICpleHQ7XG4mIzQzO1x0Ym9vbCBleGlzdHM7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0aWYgKGZsYWdzX19rIFx1MDAyNiB+QlBGX1NLQl9FWFRfRl9DUkVBVEUpIHtcbiYjNDM7XHRcdGVyciA9IC1FSU5WQUw7XG4mIzQzO1x0XHRnb3RvIGVycm9yO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHNpemUgXHUwMDNlIEFSUkFZX1NJWkUoZXh0LVx1MDAzZWJ1ZikpIHtcbiYjNDM7XHRcdGVyciA9IC1FMkJJRztcbiYjNDM7XHRcdGdvdG8gZXJyb3I7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghc2l6ZSlcbiYjNDM7XHRcdHNpemUgPSBBUlJBWV9TSVpFKGV4dC1cdTAwM2VidWYpO1xuJiM0MztcbiYjNDM7XHRleGlzdHMgPSBza2JfZXh0X2V4aXN0KHNrYiwgU0tCX0VYVF9CUEYpO1xuJiM0MztcdGlmICghY3JlYXRlKSB7XG4mIzQzO1x0XHRpZiAoIWV4aXN0cykge1xuJiM0MztcdFx0XHRlcnIgPSAtRU5PRU5UO1xuJiM0MztcdFx0XHRnb3RvIGVycm9yO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRleHQgPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfQlBGKTtcbiYjNDM7XHRpZiAoIWV4dCkge1xuJiM0MztcdFx0ZXJyID0gLUVOT01FTTtcbiYjNDM7XHRcdGdvdG8gZXJyb3I7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghZXhpc3RzKVxuJiM0MztcdFx0bWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTtcbiYjNDM7b3V0OlxuJiM0MztcdGJwZl9keW5wdHJfaW5pdChwdHIsIHNrYiwgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQsIDAsIHNpemUpO1xuJiM0MztcdGlmICghY3JlYXRlKVxuJiM0MztcdFx0YnBmX2R5bnB0cl9zZXRfcmRvbmx5KHB0cik7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO2Vycm9yOlxuJiM0MztcdGJwZl9keW5wdHJfc2V0X251bGwocHRyKTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi9cbiYjNDM7XG4gLyoqXG4gICogYnBmX2R5bnB0cl9mcm9tX3NrYl9tZXRhKCkgLSBJbml0aWFsaXplIGEgZHlucHRyIHRvIHRoZSBza2IgbWV0YWRhdGEgYXJlYS5cbiAgKiBAc2tiXzogc29ja2V0IGJ1ZmZlciBjYXJyeWluZyB0aGUgbWV0YWRhdGFcbkBAIC0xMjgxNiw2ICYjNDM7MTI5MzcsMTIgQEAgQlRGX0tGVU5DU19TVEFSVChicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9tZXRhKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX21ldGEpXG4gQlRGX0tGVU5DU19FTkQoYnBmX2tmdW5jX2NoZWNrX3NldF9za2JfbWV0YSlcbiBcbiYjNDM7I2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGJwZl9rZnVuY19jaGVja19zZXRfc2tiX2V4dClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KVxuJiM0MztCVEZfS0ZVTkNTX0VORChicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9leHQpXG4mIzQzOyNlbmRpZlxuJiM0MztcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9rZnVuY19jaGVja19zZXRfeGRwKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfZHlucHRyX2Zyb21feGRwKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfeGRwX3B1bGxfZGF0YSlcbkBAIC0xMjg0Nyw2ICYjNDM7MTI5NzQsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfc2tiX21ldGEgPSB7XG4gXHQuc2V0ID0gXHUwMDI2YnBmX2tmdW5jX2NoZWNrX3NldF9za2JfbWV0YSxcbiB9O1xuIFxuJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfa2Z1bmNfc2V0X3NrYl9leHQgPSB7XG4mIzQzO1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4mIzQzO1x0LnNldCA9IFx1MDAyNmJwZl9rZnVuY19jaGVja19zZXRfc2tiX2V4dCxcbiYjNDM7fTtcbiYjNDM7I2VuZGlmXG4mIzQzO1xuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfa2Z1bmNfc2V0X3hkcCA9IHtcbiBcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuIFx0LnNldCA9IFx1MDAyNmJwZl9rZnVuY19jaGVja19zZXRfeGRwLFxuQEAgLTEyODg5LDYgJiM0MzsxMzAyMywyMSBAQCBzdGF0aWMgaW50IF9faW5pdCBicGZfa2Z1bmNfaW5pdCh2b2lkKVxuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYik7XG4gXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfbWV0YSk7XG4gXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfbWV0YSk7XG4mIzQzOyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcbiYjNDM7XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbiYjNDM7XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbiYjNDM7XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TS0IsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4mIzQzO1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TT0NLX09QUywgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbiYjNDM7XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NLX1NLQiwgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbiYjNDM7XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4mIzQzO1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MV1RfT1VULCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuJiM0MztcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTFdUX0lOLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuJiM0MztcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTFdUX1hNSVQsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4mIzQzO1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MV1RfU0VHNkxPQ0FMLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuJiM0MztcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTkVURklMVEVSLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuJiM0MztcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTFNNLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuJiM0MztcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORywgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbiYjNDM7I2VuZGlmXG4gXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1hEUCwgXHUwMDI2YnBmX2tmdW5jX3NldF94ZHApO1xuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9DR1JPVVBfU09DS19BRERSLFxuIFx0XHRcdFx0XHQgICAgICAgXHUwMDI2YnBmX2tmdW5jX3NldF9zb2NrX2FkZHIpO1xuZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmNcbmluZGV4IGFiMTk1Yjk5Yzg1MzAuLmE0NzllMjVkZTU2NDggMTAwNjQ0XG4tLS0gYS9uZXQvY29yZS9za2J1ZmYuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvc2tidWZmLmNcbkBAIC04Myw2ICYjNDM7ODMsNyBAQFxuICNpbmNsdWRlIFx1MDAzY25ldC9wYWdlX3Bvb2wvaGVscGVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0L3BzcC90eXBlcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0L2Ryb3ByZWFzb24uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC94ZHBfc29jay5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdWFjY2Vzcy5oXHUwMDNlXG5AQCAtNTE2OSw2ICYjNDM7NTE3MCw5IEBAIHN0YXRpYyBjb25zdCB1OCBza2JfZXh0X3R5cGVfbGVuW10gPSB7XG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0NBTilcbiBcdFtTS0JfRVhUX0NBTl0gPSBTS0JfRVhUX0NIVU5LU0laRU9GKHN0cnVjdCBjYW5fc2tiX2V4dCksXG4gI2VuZGlmXG4mIzQzOyNpZiBJU19FTkFCTEVEKENPTkZJR19CUEZfU0tCX0VYVClcbiYjNDM7XHRbU0tCX0VYVF9CUEZdID0gU0tCX0VYVF9DSFVOS1NJWkVPRihzdHJ1Y3QgYnBmX3NrYl9leHQpLFxuJiM0MzsjZW5kaWZcbiB9O1xuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgX19ub19wcm9maWxlIHVuc2lnbmVkIGludCBza2JfZXh0X3RvdGFsX2xlbmd0aCh2b2lkKVxuQEAgLTYyODcsNyAmIzQzOzYyOTEsOCBAQCBFWFBPUlRfU1lNQk9MKHNrYl90cnlfY29hbGVzY2UpO1xuICAqIG9wZXJhdGlvbnMuXG4gICogc2tiX3NjcnViX3BhY2tldCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNsZWFuIGEgc2tiIGJlZm9yZSBpbmplY3RpbmcgaXQgaW5cbiAgKiBhbm90aGVyIG5hbWVzcGFjZSAoQHhuZXQgPT0gdHJ1ZSkuIFdlIGhhdmUgdG8gY2xlYXIgYWxsIGluZm9ybWF0aW9uIGluIHRoZVxuLSAqIHNrYiB0aGF0IGNvdWxkIGltcGFjdCBuYW1lc3BhY2UgaXNvbGF0aW9uLlxuJiM0MzsgKiBza2IgdGhhdCBjb3VsZCBpbXBhY3QgbmFtZXNwYWNlIGlzb2xhdGlvbi4gTm90ZSB0aGF0IEJQRiBza2IgZXh0ZW5zaW9uIGlzXG4mIzQzOyAqIG1lYW50IHRvIGNhcnJ5IGluZm9ybWF0aW9uIGFjcm9zcyBuYW1lc3BhY2VzIGJ5IGRlc2lnbi5cbiAgKi9cbiB2b2lkIHNrYl9zY3J1Yl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB4bmV0KVxuIHtcbkBAIC02Mjk1LDcgJiM0Mzs2MzAwLDcgQEAgdm9pZCBza2Jfc2NydWJfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgeG5ldClcbiBcdHNrYi1cdTAwM2Vza2JfaWlmID0gMDtcbiBcdHNrYi1cdTAwM2VpZ25vcmVfZGYgPSAwO1xuIFx0c2tiX2RzdF9kcm9wKHNrYik7XG4tXHRza2JfZXh0X3Jlc2V0KHNrYik7XG4mIzQzO1x0c2tiX2V4dF9zY3J1Yihza2IpO1xuIFx0bmZfcmVzZXRfY3Qoc2tiKTtcbiBcdG5mX3Jlc2V0X3RyYWNlKHNrYik7XG4gXG5AQCAtNzMwNCw2ICYjNDM7NzMwOSwyNCBAQCB2b2lkIF9fc2tiX2V4dF9wdXQoc3RydWN0IHNrYl9leHQgKmV4dClcbiBcdGttZW1fY2FjaGVfZnJlZShza2J1ZmZfZXh0X2NhY2hlLCBleHQpO1xuIH1cbiBFWFBPUlRfU1lNQk9MKF9fc2tiX2V4dF9wdXQpO1xuJiM0MztcbiYjNDM7dm9pZCBza2JfZXh0X3NjcnViKHN0cnVjdCBza19idWZmICpza2IpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaWQ7XG4mIzQzO1xuJiM0MztcdGlmIChsaWtlbHkoIXNrYi1cdTAwM2VhY3RpdmVfZXh0ZW5zaW9ucykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGZvciAoaWQgPSAwOyBpZCBcdTAwM2MgU0tCX0VYVF9OVU07IGlkJiM0MzsmIzQzOykge1xuJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NLQl9FWFQpXG4mIzQzO1x0XHRpZiAoaWQgPT0gU0tCX0VYVF9CUEYpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MzsjZW5kaWZcbiYjNDM7XHRcdHNrYl9leHRfZGVsKHNrYiwgaWQpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MKHNrYl9leHRfc2NydWIpO1xuJiM0MztcbiAjZW5kaWYgLyogQ09ORklHX1NLQl9FWFRFTlNJT05TICovXG4gXG4gc3RhdGljIHZvaWQga2ZyZWVfc2tiX25hcGlfY2FjaGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcbmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jXG5pbmRleCBiMzg4N2M0MmFkZmRiLi5jZjA5M2IwZDY2YzU4IDEwMDY0NFxuLS0tIGEvbmV0L2lwdjQvdWRwLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9pcHY0L3VkcC5jXG5AQCAtMTU0MCw4ICYjNDM7MTU0MCw2IEBAIHZvaWQgdWRwX3NwbGljZV9lb2Yoc3RydWN0IHNvY2tldCAqc29jaylcbiAgKlxuICAqIFdlIG5lZWQgdG8gcHJlc2VydmUgc2VjcGF0aCwgaWYgcHJlc2VudCwgdG8gZXZlbnR1YWxseSBwcm9jZXNzXG4gICogSVBfQ01TR19QQVNTU0VDIGF0IHJlY3Ztc2coKSB0aW1lLlxuLSAqXG4tICogT3RoZXIgZXh0ZW5zaW9ucyBjYW4gYmUgY2xlYXJlZC5cbiAgKi9cbiBzdGF0aWMgYm9vbCB1ZHBfdHJ5X21ha2Vfc3RhdGVsZXNzKHN0cnVjdCBza19idWZmICpza2IpXG4ge1xuQEAgLTE1NDksOCAmIzQzOzE1NDcsOCBAQCBzdGF0aWMgYm9vbCB1ZHBfdHJ5X21ha2Vfc3RhdGVsZXNzKHN0cnVjdCBza19idWZmICpza2IpXG4gXHRcdHJldHVybiB0cnVlO1xuIFxuIFx0aWYgKCFzZWNwYXRoX2V4aXN0cyhza2IpKSB7XG4tXHRcdHNrYl9leHRfcmVzZXQoc2tiKTtcbi1cdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHRza2JfZXh0X3NjcnViKHNrYik7XG4mIzQzO1x0XHRyZXR1cm4gIXNrYl9oYXNfZXh0ZW5zaW9ucyhza2IpO1xuIFx0fVxuIFxuIFx0cmV0dXJuIGZhbHNlO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5pbmRleCBlYTcwNDRmMzBhZGMzLi45YmJmYTM1MWJjZWRjIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuQEAgLTcsNiAmIzQzOzcsNyBAQCBDT05GSUdfQlBGX0pJVD15XG4gQ09ORklHX0JQRl9LUFJPQkVfT1ZFUlJJREU9eVxuIENPTkZJR19CUEZfTElSQ19NT0RFMj15XG4gQ09ORklHX0JQRl9MU009eVxuJiM0MztDT05GSUdfQlBGX1NLQl9FWFQ9eVxuIENPTkZJR19CUEZfU1RSRUFNX1BBUlNFUj15XG4gQ09ORklHX0JQRl9TWVNDQUxMPXlcbiAjIENPTkZJR19CUEZfVU5QUklWX0RFRkFVTFRfT0ZGIGlzIG5vdCBzZXRcbkBAIC0xMzYsMyAmIzQzOzEzNyw0IEBAIENPTkZJR19TTUNfSFNfQ1RSTF9CUEY9eVxuIENPTkZJR19ESUJTPXlcbiBDT05GSUdfRElCU19MTz15XG4gQ09ORklHX1BNX1dBS0VMT0NLUz15XG4mIzQzO0NPTkZJR19ORVRfU0NIX05FVEVNPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zb2NrZXRfaGVscGVycy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc29ja2V0X2hlbHBlcnMuaFxuaW5kZXggMGQ1OTUwM2EwYzczZS4uZWIxMTRhNmVhNmY5MiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NvY2tldF9oZWxwZXJzLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NvY2tldF9oZWxwZXJzLmhcbkBAIC0zLDYgJiM0MzszLDcgQEBcbiAjaWZuZGVmIF9fU09DS0VUX0hFTFBFUlNfX1xuICNkZWZpbmUgX19TT0NLRVRfSEVMUEVSU19fXG4gXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2Vycm9yLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvdW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZtX3NvY2tldHMuaFx1MDAzZVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmaWVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZmllci5jXG5pbmRleCA2NGFjNDlhZDY3ZTYzLi43NzI0ZTgyZmNlNjZhIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZpZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZpZXIuY1xuQEAgLTk0LDYgJiM0Mzs5NCw3IEBAXG4gI2luY2x1ZGUgXCYjMzQ7dmVyaWZpZXJfc2NhbGFyX2lkcy5za2VsLmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDt2ZXJpZmllcl9zZGl2LnNrZWwuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O3ZlcmlmaWVyX3NlYXJjaF9wcnVuaW5nLnNrZWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2ZXJpZmllcl9za2JfZXh0LnNrZWwuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O3ZlcmlmaWVyX3NvY2suc2tlbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7dmVyaWZpZXJfc29ja19hZGRyLnNrZWwuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O3ZlcmlmaWVyX3NvY2ttYXBfbXV0YXRlLnNrZWwuaFwmIzM0O1xuQEAgLTI1Niw2ICYjNDM7MjU3LDcgQEAgdm9pZCB0ZXN0X3ZlcmlmaWVyX3J1bnRpbWVfaml0KHZvaWQpICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3J1bnRpbWVfaml0KTsgfVxuIHZvaWQgdGVzdF92ZXJpZmllcl9zY2FsYXJfaWRzKHZvaWQpICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9zY2FsYXJfaWRzKTsgfVxuIHZvaWQgdGVzdF92ZXJpZmllcl9zZGl2KHZvaWQpICAgICAgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9zZGl2KTsgfVxuIHZvaWQgdGVzdF92ZXJpZmllcl9zZWFyY2hfcHJ1bmluZyh2b2lkKSAgICAgICB7IFJVTih2ZXJpZmllcl9zZWFyY2hfcHJ1bmluZyk7IH1cbiYjNDM7dm9pZCB0ZXN0X3ZlcmlmaWVyX3NrYl9leHQodm9pZCkgICAgICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3NrYl9leHQpOyB9XG4gdm9pZCB0ZXN0X3ZlcmlmaWVyX3NvY2sodm9pZCkgICAgICAgICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3NvY2spOyB9XG4gdm9pZCB0ZXN0X3ZlcmlmaWVyX3NvY2tfYWRkcih2b2lkKSAgICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3NvY2tfYWRkcik7IH1cbiB2b2lkIHRlc3RfdmVyaWZpZXJfc29ja21hcF9tdXRhdGUodm9pZCkgICAgICAgeyBSVU4odmVyaWZpZXJfc29ja21hcF9tdXRhdGUpOyB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMveGRwX2NvbnRleHRfdGVzdF9ydW4uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3hkcF9jb250ZXh0X3Rlc3RfcnVuLmNcbmluZGV4IDQ0ODgwNzY3NjE3NmMuLjljYmI4MzlhNTVjY2UgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy94ZHBfY29udGV4dF90ZXN0X3J1bi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy94ZHBfY29udGV4dF90ZXN0X3J1bi5jXG5AQCAtMiw3ICYjNDM7Miw5IEBAXG4gI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0d29ya19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pcHY2LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbmV0ZmlsdGVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NhcnBhL2luZXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDtzb2NrZXRfaGVscGVycy5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7dGVzdF94ZHBfY29udGV4dF90ZXN0X3J1bi5za2VsLmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDt0ZXN0X3hkcF9tZXRhLnNrZWwuaFwmIzM0O1xuIFxuQEAgLTE2LDEzICYjNDM7MTgsMTQgQEBcbiAjZGVmaW5lIERVTU1ZX05BTUUgXCYjMzQ7ZHVtMFwmIzM0O1xuICNkZWZpbmUgVEFQX05FVE5TIFwmIzM0O3hkcF9jb250ZXh0X3R1bnRhcFwmIzM0O1xuICNkZWZpbmUgTFdUX05FVE5TIFwmIzM0O3hkcF9jb250ZXh0X2x3dFwmIzM0O1xuJiM0MzsjZGVmaW5lIFNLQl9FWFRfTkVUTlMgXCYjMzQ7c2tiX2V4dF90dW50YXBcJiMzNDtcbiBcbiAjZGVmaW5lIFRFU1RfUEFZTE9BRF9MRU4gMzJcbiBzdGF0aWMgY29uc3QgX191OCB0ZXN0X3BheWxvYWRbVEVTVF9QQVlMT0FEX0xFTl0gPSB7XG4tXHQweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LFxuLVx0MHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCxcbi1cdDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsXG4tXHQweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LFxuJiM0MztcdDB4NDksIDB4MjAsIDB4NjMsIDB4NzIsIDB4NmYsIDB4NzMsIDB4NzMsIDB4NjUsXG4mIzQzO1x0MHg2NCwgMHgyMCwgMHg2OCwgMHg2ZiwgMHg2ZiwgMHg2YiwgMHg3MywgMHgyMCxcbiYjNDM7XHQweDI2LCAweDIwLCAweDZjLCAweDY5LCAweDc2LCAweDY1LCAweDY0LCAweDIwLFxuJiM0MztcdDB4NzQsIDB4NmYsIDB4MjAsIDB4NzQsIDB4NjUsIDB4NmMsIDB4NmMsIDB4MjEsXG4gfTtcbiBcbiB2b2lkIHRlc3RfeGRwX2NvbnRleHRfZXJyb3IoaW50IHByb2dfZmQsIHN0cnVjdCBicGZfdGVzdF9ydW5fb3B0cyBvcHRzLFxuQEAgLTMzMSwxMCAmIzQzOzMzNCwxMSBAQCB2b2lkIHRlc3RfeGRwX2NvbnRleHRfdmV0aCh2b2lkKVxuIFx0bmV0bnNfZnJlZSh0eF9ucyk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHRlc3RfdHVudGFwKHN0cnVjdCBicGZfcHJvZ3JhbSAqeGRwX3Byb2csXG4tXHRcdFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZyxcbi1cdFx0XHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMl9wcm9nLFxuLVx0XHRcdGJvb2wgKnRlc3RfcGFzcylcbiYjNDM7c3RhdGljIHZvaWQgX190ZXN0X3R1bnRhcChjb25zdCBjaGFyICpuc25hbWUsXG4mIzQzO1x0XHRcdCAgc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZyxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMV9wcm9nLFxuJiM0MztcdFx0XHQgIHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18yX3Byb2csXG4mIzQzO1x0XHRcdCAgYm9vbCAqdGVzdF9wYXNzKVxuIHtcbiBcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuIFx0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbkBAIC0zNDUsNyAmIzQzOzM0OSw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfdHVudGFwKHN0cnVjdCBicGZfcHJvZ3JhbSAqeGRwX3Byb2csXG4gXG4gXHQqdGVzdF9wYXNzID0gZmFsc2U7XG4gXG4tXHRucyA9IG5ldG5zX25ldyhUQVBfTkVUTlMsIHRydWUpO1xuJiM0MztcdG5zID0gbmV0bnNfbmV3KG5zbmFtZSwgdHJ1ZSk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwmIzM0O2NyZWF0ZSBhbmQgb3BlbiBuc1wmIzM0OykpXG4gXHRcdHJldHVybjtcbiBcbkBAIC0zOTYsNiAmIzQzOzQwMCwxNSBAQCBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLFxuIFx0bmV0bnNfZnJlZShucyk7XG4gfVxuIFxuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLFxuJiM0MztcdFx0XHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMV9wcm9nLFxuJiM0MztcdFx0XHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMl9wcm9nLFxuJiM0MztcdFx0XHRib29sICp0ZXN0X3Bhc3MpXG4mIzQzO3tcbiYjNDM7XHRfX3Rlc3RfdHVudGFwKFRBUF9ORVROUywgeGRwX3Byb2csIHRjX3ByaW9fMV9wcm9nLCB0Y19wcmlvXzJfcHJvZyxcbiYjNDM7XHRcdCAgICAgIHRlc3RfcGFzcyk7XG4mIzQzO31cbiYjNDM7XG4gLyogV3JpdGUgYSBwYWNrZXQgdG8gYSB0YXAgZGV2IGFuZCBjb3B5IGl0IHRvIGluZ3Jlc3Mgb2YgYSBkdW1teSBkZXYgKi9cbiBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcF9taXJyZWQoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZyxcbiBcdFx0XHQgICAgICAgc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcm9nLFxuQEAgLTY5MywzICYjNDM7NzA2LDEwODkgQEAgdm9pZCB0ZXN0X3hkcF9jb250ZXh0X2x3dF9lbmNhcCh2b2lkKVxuIFxuIFx0dGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTtcbiB9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfdHVudGFwKHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18xX3Byb2csXG4mIzQzO1x0XHRcdFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzJfcHJvZyxcbiYjNDM7XHRcdFx0XHRib29sICp0ZXN0X3Bhc3MpXG4mIzQzO3tcbiYjNDM7XHRfX3Rlc3RfdHVudGFwKFNLQl9FWFRfTkVUTlMsIE5VTEwgLyogeGRwICovLCB0Y19wcmlvXzFfcHJvZyxcbiYjNDM7XHRcdCAgICAgIHRjX3ByaW9fMl9wcm9nLCB0ZXN0X3Bhc3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUZXN0IGlmIHNrYl9leHQgc3Vydml2ZXMgc2tiIGNsb25lICh2aWEgdGMgbWlycmVkKS5cbiYjNDM7ICogZHVtbXlfcHJvZyBydW5zIG9uIHRoZSBjbG9uZSAoZHVtbXkgaW5ncmVzcykuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21pcnJlZF9jbG9uZV9leHQoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmR1bW15X3Byb2cpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuJiM0MztcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbiYjNDM7XHRpbnQgZHVtbXlfaWZpbmRleDtcbiYjNDM7XHRpbnQgdGFwX2lmaW5kZXg7XG4mIzQzO1x0aW50IHRhcF9mZCA9IC0xO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXdyaXRlX2RvbmUgPSBmYWxzZTtcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0bnMgPSBuZXRuc19uZXcoXCYjMzQ7bWlycmVkX2Nsb25lXCYjMzQ7LCB0cnVlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwmIzM0O25ldG5zX25ld1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdC8qIER1bW15IGRldjogYXR0YWNoIHJlYWRlciAqL1xuJiM0MztcdFNZUyhjbG9zZSwgXCYjMzQ7aXAgbGluayBhZGQgbmFtZSBcJiMzNDsgRFVNTVlfTkFNRSBcJiMzNDsgdHlwZSBkdW1teVwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsb3NlLCBcJiMzNDtpcCBsaW5rIHNldCBkZXYgXCYjMzQ7IERVTU1ZX05BTUUgXCYjMzQ7IHVwXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZHVtbXlfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KERVTU1ZX05BTUUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKGR1bW15X2lmaW5kZXgsIDAsIFwmIzM0O2R1bW15X2lmaW5kZXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0dGNfaG9vay5pZmluZGV4ID0gZHVtbXlfaWZpbmRleDtcbiYjNDM7XHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dGNfaG9vayk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtkdW1teV9ob29rX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsb3NlO1xuJiM0MztcbiYjNDM7XHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoZHVtbXlfcHJvZyk7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2R1bW15X2F0dGFjaFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsb3NlO1xuJiM0MztcbiYjNDM7XHQvKiBUQVAgZGV2OiBhdHRhY2ggd3JpdGVyICYjNDM7IG1pcnJlZCB0byBkdW1teSAqL1xuJiM0MztcdHRhcF9mZCA9IG9wZW5fdHVudGFwKFRBUF9OQU1FLCB0cnVlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRSh0YXBfZmQsIDAsIFwmIzM0O29wZW5fdHVudGFwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdFNZUyhjbG9zZSwgXCYjMzQ7aXAgbGluayBzZXQgZGV2IFwmIzM0OyBUQVBfTkFNRSBcJiMzNDsgdXBcJiMzNDspO1xuJiM0MztcbiYjNDM7XHR0YXBfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFRBUF9OQU1FKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCh0YXBfaWZpbmRleCwgMCwgXCYjMzQ7dGFwX2lmaW5kZXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0dGNfaG9vay5pZmluZGV4ID0gdGFwX2lmaW5kZXg7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7dGFwX2hvb2tfY3JlYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdHRjX29wdHMucHJvZ19pZCA9IDA7XG4mIzQzO1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3RhcF9hdHRhY2hcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0U1lTKGNsb3NlLCBcJiMzNDt0YyBmaWx0ZXIgYWRkIGRldiBcJiMzNDsgVEFQX05BTUUgXCYjMzQ7IGluZ3Jlc3MgXCYjMzQ7XG4mIzQzO1x0XHQgICBcJiMzNDtwcm90b2NvbCBhbGwgbWF0Y2hhbGwgXCYjMzQ7XG4mIzQzO1x0XHQgICBcJiMzNDthY3Rpb24gbWlycmVkIGluZ3Jlc3MgbWlycm9yIGRldiBcJiMzNDsgRFVNTVlfTkFNRSk7XG4mIzQzO1xuJiM0MztcdHJldCA9IHdyaXRlX3Rlc3RfcGFja2V0KHRhcF9mZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV90ZXN0X3BhY2tldFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsb3NlO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V3cml0ZV9kb25lLCBcJiMzNDt3cml0ZV9kb25lXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwmIzM0O3Rlc3RfcGFzc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztjbG9zZTpcbiYjNDM7XHRpZiAodGFwX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKHRhcF9mZCk7XG4mIzQzO1x0bmV0bnNfZnJlZShucyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfbWlycmVkX2Nsb25lX2V4dF9jb3coc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2xpbmsgKnRwX2xpbms7XG4mIzQzO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZWNsb25lX2Nvd19kb25lID0gZmFsc2U7XG4mIzQzO1x0dHBfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2goc2tlbC1cdTAwM2Vwcm9ncy50cF9rZnJlZV9za2JfY293X2NoZWNrKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIodHBfbGluaywgXCYjMzQ7YXR0YWNoX3RwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0dGVzdF9taXJyZWRfY2xvbmVfZXh0KHNrZWwsIHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9jbG9uZV9yZWRpcl9jb3cpO1xuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KHRwX2xpbmspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBXcml0ZXIgY2xvbmVzIHZpYSBicGZfY2xvbmVfcmVkaXJlY3QoKSBmcm9tIHRoZSBwcm9nIGl0c2VsZiB0byBsb29wYmFja1xuJiM0MzsgKiB3aG9zZSBuZXRlbSBxZGlzYyBkZWxheXMgdGhlIGNsb25lLCBzbyBpdCBzdGF5cyBxdWV1ZWQgYW5kIGtlZXBzIHNoYXJpbmdcbiYjNDM7ICogdGhlIGV4dCBibG9jayB3aGlsZSB0aGUgcHJvZyB3cml0ZXMgYWdhaW4uIFdoZW4gdGhlIHFkaXNjIGZpbmFsbHkgbGVha3NcbiYjNDM7ICogdGhlIGNsb25lIGJhY2sgdG8gbG8gaW5ncmVzcywgdGhlIHJlYWRlciB0aGVyZSBtdXN0IHN0aWxsIHNlZSB0aGVcbiYjNDM7ICogY2xvbmUtdGltZSBzbmFwc2hvdC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfY2xvbmVfcmVkaXJfZXh0X3dyaXRlX2FmdGVyKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLFxuJiM0MztcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKndyaXRlcilcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XG4mIzQzO1x0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xuJiM0MztcdGludCB0YXBfaWZpbmRleDtcbiYjNDM7XHRpbnQgdGFwX2ZkID0gLTE7XG4mIzQzO1x0aW50IHJldCwgaTtcbiYjNDM7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzID0gZmFsc2U7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNld3JpdGVfYmxvY2tlZCA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRucyA9IG5ldG5zX25ldyhcJiMzNDtjbG9uZV9yZWRpcl9leHRcJiMzNDssIHRydWUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihucywgXCYjMzQ7bmV0bnNfbmV3XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0LyogUmVkaXJlY3QgdGFyZ2V0OiBsbyBoZWxkIGJhY2sgYnkgbmV0ZW0gZGVsYXkgKi9cbiYjNDM7XHRTWVMoY2xvc2UsIFwmIzM0O2lwIGxpbmsgc2V0IGRldiBsbyB1cFwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsb3NlLCBcJiMzNDt0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgNTBtc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qIFJlYWRlciBvbiB0aGUgY2xvbmU6IGxvIGluZ3Jlc3MgKi9cbiYjNDM7XHR0Y19ob29rLmlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChcJiMzNDtsb1wmIzM0Oyk7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7bG9faG9va19jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkKTtcbiYjNDM7XHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7bG9fYXR0YWNoXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdC8qIFRBUCBkZXY6IGF0dGFjaCB3cml0ZXIgd2hpY2ggY2xvbmVfcmVkaXJlY3RzIHRvIGxvICovXG4mIzQzO1x0dGFwX2ZkID0gb3Blbl90dW50YXAoVEFQX05BTUUsIHRydWUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHRhcF9mZCwgMCwgXCYjMzQ7b3Blbl90dW50YXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0U1lTKGNsb3NlLCBcJiMzNDtpcCBsaW5rIHNldCBkZXYgXCYjMzQ7IFRBUF9OQU1FIFwmIzM0OyB1cFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHRhcF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVEFQX05BTUUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHRhcF9pZmluZGV4LCAwLCBcJiMzNDt0YXBfaWZpbmRleFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsb3NlO1xuJiM0MztcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2VjbG9uZV9yZWRpcl9pZmluZGV4ID0gdGNfaG9vay5pZmluZGV4O1xuJiM0MztcbiYjNDM7XHR0Y19ob29rLmlmaW5kZXggPSB0YXBfaWZpbmRleDtcbiYjNDM7XHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dGNfaG9vayk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt0YXBfaG9va19jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0dGNfb3B0cy5wcm9nX2lkID0gMDtcbiYjNDM7XHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQod3JpdGVyKTtcbiYjNDM7XHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7dGFwX2F0dGFjaFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsb3NlO1xuJiM0MztcbiYjNDM7XHRyZXQgPSB3cml0ZV90ZXN0X3BhY2tldCh0YXBfZmQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfdGVzdF9wYWNrZXRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNld3JpdGVfYmxvY2tlZCwgXCYjMzQ7d3JpdGVfYmxvY2tlZFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qIENsb25lIGFycml2ZXMgYWZ0ZXIgdGhlIG5ldGVtIGRlbGF5OyBwb2xsIGV2ZXJ5IDEwIG1zZWMgdXAgdG8gMSBzZWMgKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyAxMDAgXHUwMDI2XHUwMDI2ICFza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3M7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0dXNsZWVwKDEwMDAwKTtcbiYjNDM7XHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwmIzM0O3Rlc3RfcGFzc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztjbG9zZTpcbiYjNDM7XHRpZiAodGFwX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKHRhcF9mZCk7XG4mIzQzO1x0bmV0bnNfZnJlZShucyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFRlc3QgaWYgc2tiX2V4dCBzdXJ2aXZlcyB2ZXRoIGNyb3NzLW5ldG5zIGZvcndhcmQgKi9cbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdHhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19FR1JFU1MpO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0eF9vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHJ4X2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHJ4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbiYjNDM7XHRzdHJ1Y3QgbmV0bnNfb2JqICpyeF9ucyA9IE5VTEwsICp0eF9ucyA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IG5zdG9rZW4gKm5zdG9rZW4gPSBOVUxMO1xuJiM0MztcdGludCByeF9pZmluZGV4LCB0eF9pZmluZGV4O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdHR4X25zID0gbmV0bnNfbmV3KFRYX05FVE5TLCBmYWxzZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHR4X25zLCBcJiMzNDtjcmVhdGUgdHhfbnNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRyeF9ucyA9IG5ldG5zX25ldyhSWF9ORVROUywgZmFsc2UpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihyeF9ucywgXCYjMzQ7Y3JlYXRlIHJ4X25zXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdFNZUyhjbG9zZSwgXCYjMzQ7aXAgbGluayBhZGQgXCYjMzQ7IFJYX05BTUUgXCYjMzQ7IG5ldG5zIFwmIzM0OyBSWF9ORVROU1xuJiM0MztcdCAgICBcJiMzNDsgdHlwZSB2ZXRoIHBlZXIgbmFtZSBcJiMzNDsgVFhfTkFNRSBcJiMzNDsgbmV0bnMgXCYjMzQ7IFRYX05FVE5TKTtcbiYjNDM7XG4mIzQzO1x0LyogU2V0dXAgUlggc2lkZTogVEMgaW5ncmVzcyByZWFkZXIgKi9cbiYjNDM7XHRuc3Rva2VuID0gb3Blbl9uZXRucyhSWF9ORVROUyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sIFwmIzM0O3NldG5zIHJ4X25zXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdFNZUyhjbG9zZSwgXCYjMzQ7aXAgbGluayBzZXQgZGV2IFwmIzM0OyBSWF9OQU1FIFwmIzM0OyB1cFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJ4X2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChSWF9OQU1FKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChyeF9pZmluZGV4LCAwLCBcJiMzNDtpZl9uYW1ldG9pbmRleCByeFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsb3NlO1xuJiM0MztcbiYjNDM7XHRyeF9ob29rLmlmaW5kZXggPSByeF9pZmluZGV4O1xuJiM0MztcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZyeF9ob29rKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2JwZl90Y19ob29rX2NyZWF0ZSByeFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsb3NlO1xuJiM0MztcbiYjNDM7XHRyeF9vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3JlYWQpO1xuJiM0MztcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2cnhfaG9vaywgXHUwMDI2cnhfb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDticGZfdGNfYXR0YWNoIHJ4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xuJiM0MztcbiYjNDM7XHQvKiBTZXR1cCBUWCBzaWRlOiBUQyBlZ3Jlc3Mgd3JpdGVyICovXG4mIzQzO1x0bnN0b2tlbiA9IG9wZW5fbmV0bnMoVFhfTkVUTlMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcJiMzNDtzZXRucyB0eF9uc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsb3NlO1xuJiM0MztcbiYjNDM7XHRTWVMoY2xvc2UsIFwmIzM0O2lwIGxpbmsgc2V0IGRldiBcJiMzNDsgVFhfTkFNRSBcJiMzNDsgdXBcJiMzNDspO1xuJiM0MztcbiYjNDM7XHR0eF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVFhfTkFNRSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QodHhfaWZpbmRleCwgMCwgXCYjMzQ7aWZfbmFtZXRvaW5kZXggdHhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0dHhfaG9vay5pZmluZGV4ID0gdHhfaWZpbmRleDtcbiYjNDM7XHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dHhfaG9vayk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDticGZfdGNfaG9va19jcmVhdGUgdHhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0dHhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0eF9ob29rLCBcdTAwMjZ0eF9vcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2JwZl90Y19hdHRhY2ggdHhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHJldCA9IHNlbmRfdGVzdF9wYWNrZXQodHhfaWZpbmRleCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtzZW5kX3Rlc3RfcGFja2V0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdC8qIFBvbGwgZXZlcnkgMTAgbXNlYyB1cCB0byAxIHNlYyAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDEwMCBcdTAwMjZcdTAwMjYgIXNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzczsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHR1c2xlZXAoMTAwMDApO1xuJiM0MztcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCYjMzQ7dGVzdF9wYXNzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO2Nsb3NlOlxuJiM0MztcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xuJiM0MztcdG5ldG5zX2ZyZWUocnhfbnMpO1xuJiM0MztcdG5ldG5zX2ZyZWUodHhfbnMpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBUZXN0IGlmIHNrYl9leHQgc3Vydml2ZXMgR1JFIHR1bm5lbCBlbmNhcCYjNDM7ZGVjYXAgKi9cbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NjcnViX2dyZShzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0eF9ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0VHUkVTUyk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHR4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgcnhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgcnhfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuJiM0MztcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbiYjNDM7XHRpbnQgdHhfaWZpbmRleDtcbiYjNDM7XHRpbnQgcnhfaWZpbmRleDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0bnMgPSBuZXRuc19uZXcoXCYjMzQ7Z3JlX3Rlc3RcJiMzNDssIHRydWUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihucywgXCYjMzQ7bmV0bnNfbmV3XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0LyogU2V0dXA6IGdyZV90eCAtXHUwMDNlIGxvIC1cdTAwM2UgZ3JlX3J4ICovXG4mIzQzO1x0U1lTKGNsb3NlLCBcJiMzNDtpcCBsaW5rIHNldCBsbyB1cFwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsb3NlLCBcJiMzNDtpcCBsaW5rIGFkZCBncmVfdHggdHlwZSBncmV0YXBcJiMzNDtcbiYjNDM7XHQgICAgXCYjMzQ7IGxvY2FsIDEyNy4wLjAuMSByZW1vdGUgMTI3LjAuMC4yXCYjMzQ7KTtcbiYjNDM7XHRTWVMoY2xvc2UsIFwmIzM0O2lwIGxpbmsgc2V0IGdyZV90eCB1cFwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsb3NlLCBcJiMzNDtpcCBhZGRyIGFkZCAxMjcuMC4wLjIvOCBkZXYgbG9cJiMzNDspO1xuJiM0MztcdFNZUyhjbG9zZSwgXCYjMzQ7aXAgbGluayBhZGQgZ3JlX3J4IHR5cGUgZ3JldGFwXCYjMzQ7XG4mIzQzO1x0ICAgIFwmIzM0OyBsb2NhbCAxMjcuMC4wLjIgcmVtb3RlIDEyNy4wLjAuMVwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsb3NlLCBcJiMzNDtpcCBsaW5rIHNldCBncmVfcnggdXBcJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKiBXcml0ZSBza2JfZXh0IG9uIFRDIGVncmVzcyBvbiBHUkUgdHggKi9cbiYjNDM7XHR0eF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoXCYjMzQ7Z3JlX3R4XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCh0eF9pZmluZGV4LCAwLCBcJiMzNDt0eF9pZmluZGV4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdHR4X2hvb2suaWZpbmRleCA9IHR4X2lmaW5kZXg7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnR4X2hvb2spO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7dHhfaG9va19jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0dHhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0eF9ob29rLCBcdTAwMjZ0eF9vcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3R4X2F0dGFjaFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsb3NlO1xuJiM0MztcbiYjNDM7XHQvKiBSZWFkIHNrYl9leHQgb24gVEMgaW5ncmVzcyBvbiBHUkUgcnggKi9cbiYjNDM7XHRyeF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoXCYjMzQ7Z3JlX3J4XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChyeF9pZmluZGV4LCAwLCBcJiMzNDtyeF9pZmluZGV4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdHJ4X2hvb2suaWZpbmRleCA9IHJ4X2lmaW5kZXg7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnJ4X2hvb2spO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7cnhfaG9va19jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0cnhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkKTtcbiYjNDM7XHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnJ4X2hvb2ssIFx1MDAyNnJ4X29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7cnhfYXR0YWNoXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xvc2U7XG4mIzQzO1xuJiM0MztcdC8qIFRoZW4gdXNlIHNlbmRfdGVzdF9wYWNrZXQgb24gR1JFIHR4ICovXG4mIzQzO1x0cmV0ID0gc2VuZF90ZXN0X3BhY2tldCh0eF9pZmluZGV4KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3NlbmRfdGVzdF9wYWNrZXRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbG9zZTtcbiYjNDM7XG4mIzQzO1x0LyogUG9sbCBldmVyeSAxMCBtc2VjIHVwIHRvIDEgc2VjICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgMTAwIFx1MDAyNlx1MDAyNiAhc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHVzbGVlcCgxMDAwMCk7XG4mIzQzO1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcJiMzNDt0ZXN0X3Bhc3NcJiMzNDspO1xuJiM0MztcbiYjNDM7Y2xvc2U6XG4mIzQzO1x0bmV0bnNfZnJlZShucyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9za2JfZXh0X2Jhc2ljKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSB0ZXN0X3hkcF9tZXRhX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O29wZW4gYW5kIGxvYWQgc2tlbGV0b25cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y193cml0ZV9yZWFkXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlLFxuJiM0MztcdFx0XHRcdCAgICBza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZCxcbiYjNDM7XHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y193cml0ZV9jbG9uZV9yZWFkXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlLFxuJiM0MztcdFx0XHRcdCAgICBza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfY2xvbmVfcmVhZCxcbiYjNDM7XHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y193cml0ZV9zbGljZV9yZWFkXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlLFxuJiM0MztcdFx0XHRcdCAgICBza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfc2xpY2VfcmVhZCxcbiYjNDM7XHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y19zbGljZV93cml0ZV9yZWFkXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3NsaWNlX3dyaXRlLFxuJiM0MztcdFx0XHRcdCAgICBza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZCxcbiYjNDM7XHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y19ub19hbGxvY1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9ub19hbGxvYyxcbiYjNDM7XHRcdFx0XHQgICAgTlVMTCwgLyogdGMgcHJpbyAyICovXG4mIzQzO1x0XHRcdFx0ICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dGNfaW52YWxpZF9mbGFnc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9pbnZhbGlkX2ZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICBOVUxMLCAvKiB0YyBwcmlvIDIgKi9cbiYjNDM7XHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y19yZG9ubHlcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmRvbmx5LFxuJiM0MztcdFx0XHRcdCAgICBOVUxMLCAvKiB0YyBwcmlvIDIgKi9cbiYjNDM7XHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y19kb3VibGVfYWxsb2NcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfZG91YmxlX2FsbG9jLFxuJiM0MztcdFx0XHRcdCAgICBOVUxMLCAvKiB0YyBwcmlvIDIgKi9cbiYjNDM7XHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtjbG9uZV9leHRfcmVhZFwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X21pcnJlZF9jbG9uZV9leHQoc2tlbCwgc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3JlYWQpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2Nsb25lX2V4dF9jb3dcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9taXJyZWRfY2xvbmVfZXh0X2Nvdyhza2VsKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtjbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXJcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXIoc2tlbCxcbiYjNDM7XHRcdFx0XHRcdFx0IHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZV9hZnRlcl9jbG9uZV9yZWRpcik7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7Y2xvbmVfcmVkaXJfZXh0X3NsaWNlX3dyaXRlX2FmdGVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfY2xvbmVfcmVkaXJfZXh0X3dyaXRlX2FmdGVyKHNrZWwsXG4mIzQzO1x0XHRcdFx0XHRcdCBza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfc2xpY2Vfd3JpdGVfYWZ0ZXJfY2xvbmVfcmVkaXIpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3N1cnZpdmVzX3ZldGhcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc2tlbCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c3Vydml2ZXNfZ3JlXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfc2tiX2V4dF9zY3J1Yl9ncmUoc2tlbCk7XG4mIzQzO1xuJiM0MztcdHRlc3RfeGRwX21ldGFfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFNlbmQgdGVzdF9wYXlsb2FkIG92ZXIgbG9vcGJhY2sgVURQIHRvIHJlY3ZfZmQgKi9cbiYjNDM7c3RhdGljIGludCBzZW5kX2xvb3BiYWNrX3VkcChpbnQgcmVjdl9mZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyID0ge1xuJiM0MztcdFx0LnNpbl9mYW1pbHkgPSBBRl9JTkVULFxuJiM0MztcdFx0LnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyksXG4mIzQzO1x0fTtcbiYjNDM7XHRjaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTtcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0aW50IGZkID0gLTE7XG4mIzQzO1x0aW50IHBvcnQ7XG4mIzQzO1xuJiM0MztcdHBvcnQgPSBnZXRfc29ja2V0X2xvY2FsX3BvcnQocmVjdl9mZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocG9ydCwgMCwgXCYjMzQ7Z2V0X3BvcnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtzb2NrZXRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGFkZHIuc2luX3BvcnQgPSBwb3J0O1xuJiM0MztcdHNlbmR0byhmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwLFxuJiM0MztcdCAgICAgICAodm9pZCAqKVx1MDAyNmFkZHIsIHNpemVvZihhZGRyKSk7XG4mIzQzO1x0cmVjdmZyb20ocmVjdl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChmZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7ZW51bSB1ZHBfcmVhZGVyX3R5cGUge1xuJiM0MztcdFJFQURFUl9DR1JQX1NLQixcbiYjNDM7XHRSRUFERVJfU0tfRklMVEVSLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LyogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBpbmdyZXNzIC1cdTAwM2UgVURQIHJlYWRlciBob29rICovXG4mIzQzO3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF91ZHAoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsIGNvbnN0IGNoYXIgKm5hbWUsXG4mIzQzO1x0XHRcdCAgICAgZW51bSB1ZHBfcmVhZGVyX3R5cGUgcmVhZGVyKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssXG4mIzQzO1x0XHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXG4mIzQzO1x0XHQgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuJiM0MztcdHN0cnVjdCBicGZfbGluayAqcmVhZGVyX2xpbmsgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbiYjNDM7XHRpbnQgc2VydmVyX2ZkID0gLTE7XG4mIzQzO1x0aW50IGNncm91cF9mZCA9IC0xO1xuJiM0MztcdGludCBmaWx0ZXJfZmQ7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0bnMgPSBuZXRuc19uZXcobmFtZSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcJiMzNDtuZXRuc19uZXdcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRjZ3JvdXBfZmQgPSB0ZXN0X19qb2luX2Nncm91cChcJiMzNDsvc2tiX2V4dF91ZHBcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGNncm91cF9mZCwgMCwgXCYjMzQ7am9pbl9jZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRzZXJ2ZXJfZmQgPSBzdGFydF9zZXJ2ZXIoQUZfSU5FVCwgU09DS19ER1JBTSwgXCYjMzQ7MTI3LjAuMC4xXCYjMzQ7LCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFwmIzM0O3N0YXJ0X3NlcnZlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dGNfaG9vayk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDticGZfdGNfaG9va19jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlKTtcbiYjNDM7XHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7YnBmX3RjX2F0dGFjaFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAocmVhZGVyKSB7XG4mIzQzO1x0Y2FzZSBSRUFERVJfQ0dSUF9TS0I6XG4mIzQzO1x0XHRyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfY2dyb3VwKHNrZWwtXHUwMDNlcHJvZ3MuY2dycF9za2JfZXh0X3JlYWQsXG4mIzQzO1x0XHRcdFx0XHRcdFx0IGNncm91cF9mZCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssIFwmIzM0O2F0dGFjaF9jZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFJFQURFUl9TS19GSUxURVI6XG4mIzQzO1x0XHRmaWx0ZXJfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5za19maWx0ZXJfc2tiX2V4dF9yZWFkKTtcbiYjNDM7XHRcdHJldCA9IHNldHNvY2tvcHQoc2VydmVyX2ZkLCBTT0xfU09DS0VULCBTT19BVFRBQ0hfQlBGLFxuJiM0MztcdFx0XHRcdCBcdTAwMjZmaWx0ZXJfZmQsIHNpemVvZihmaWx0ZXJfZmQpKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7YXR0YWNoX3NvY2tldF9maWx0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChzZW5kX2xvb3BiYWNrX3VkcChzZXJ2ZXJfZmQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwmIzM0O3Rlc3RfcGFzc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KHJlYWRlcl9saW5rKTtcbiYjNDM7XHRicGZfdGNfaG9va19kZXN0cm95KFx1MDAyNnRjX2hvb2spO1xuJiM0MztcdGlmIChzZXJ2ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uoc2VydmVyX2ZkKTtcbiYjNDM7XHRpZiAoY2dyb3VwX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGNncm91cF9mZCk7XG4mIzQzO1x0bmV0bnNfZnJlZShucyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2VudW0gdGNwX3JlYWRlcl90eXBlIHtcbiYjNDM7XHRSRUFERVJfU0tPUFMsXG4mIzQzO1x0UkVBREVSX0xTTSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgaW5ncmVzcyAtXHUwMDNlIFRDUCByZWFkZXIgaG9vayAqL1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfdGNwKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lLFxuJiM0MztcdFx0XHQgICAgIGVudW0gdGNwX3JlYWRlcl90eXBlIHJlYWRlcilcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLFxuJiM0MztcdFx0ICAgIC5pZmluZGV4ID0gMSAvKiBJRklOREVYX0xPICovLFxuJiM0MztcdFx0ICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2xpbmsgKnJlYWRlcl9saW5rID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XG4mIzQzO1x0aW50IHNlcnZlcl9mZCA9IC0xO1xuJiM0MztcdGludCBjZ3JvdXBfZmQgPSAtMTtcbiYjNDM7XHRpbnQgY2xpZW50X2ZkID0gLTE7XG4mIzQzO1x0aW50IGNvbm5fZmQgPSAtMTtcbiYjNDM7XHRpbnQgcG9ydDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRucyA9IG5ldG5zX25ldyhuYW1lLCB0cnVlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwmIzM0O25ldG5zX25ld1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGNncm91cF9mZCA9IHRlc3RfX2pvaW5fY2dyb3VwKFwmIzM0Oy9za2JfZXh0X3RjcFwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoY2dyb3VwX2ZkLCAwLCBcJiMzNDtqb2luX2Nncm91cFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVULCBTT0NLX1NUUkVBTSwgXCYjMzQ7MTI3LjAuMC4xXCYjMzQ7LCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFwmIzM0O3N0YXJ0X3NlcnZlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHBvcnQgPSBnZXRfc29ja2V0X2xvY2FsX3BvcnQoc2VydmVyX2ZkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShwb3J0LCAwLCBcJiMzNDtnZXRfcG9ydFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9wb3J0ID0gcG9ydDtcbiYjNDM7XHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7YnBmX3RjX2hvb2tfY3JlYXRlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZV9wb3J0KTtcbiYjNDM7XHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7YnBmX3RjX2F0dGFjaFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAocmVhZGVyKSB7XG4mIzQzO1x0Y2FzZSBSRUFERVJfU0tPUFM6XG4mIzQzO1x0XHRyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfY2dyb3VwKHNrZWwtXHUwMDNlcHJvZ3Muc2tvcHNfc2tiX2V4dF9yZWFkLFxuJiM0MztcdFx0XHRcdFx0XHRcdCBjZ3JvdXBfZmQpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKHJlYWRlcl9saW5rLCBcJiMzNDthdHRhY2hfc2tvcHNcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFJFQURFUl9MU006XG4mIzQzO1x0XHRyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfbHNtKHNrZWwtXHUwMDNlcHJvZ3MubHNtX3NrYl9leHRfcmVhZCk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssIFwmIzM0O2F0dGFjaF9sc21cJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGNsaWVudF9mZCA9IGNvbm5lY3RfdG9fZmQoc2VydmVyX2ZkLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShjbGllbnRfZmQsIDAsIFwmIzM0O2Nvbm5lY3RcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRjb25uX2ZkID0gYWNjZXB0KHNlcnZlcl9mZCwgTlVMTCwgTlVMTCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoY29ubl9mZCwgMCwgXCYjMzQ7YWNjZXB0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcJiMzNDt0ZXN0X3Bhc3NcJiMzNDspO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRpZiAoY29ubl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShjb25uX2ZkKTtcbiYjNDM7XHRpZiAoY2xpZW50X2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGNsaWVudF9mZCk7XG4mIzQzO1x0YnBmX2xpbmtfX2Rlc3Ryb3kocmVhZGVyX2xpbmspO1xuJiM0MztcdGJwZl90Y19ob29rX2Rlc3Ryb3koXHUwMDI2dGNfaG9vayk7XG4mIzQzO1x0aWYgKHNlcnZlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShzZXJ2ZXJfZmQpO1xuJiM0MztcdGlmIChjZ3JvdXBfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoY2dyb3VwX2ZkKTtcbiYjNDM7XHRuZXRuc19mcmVlKG5zKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGVzdCBza2JfZXh0IHN1cnZpdmFsIHVudGlsIHNrYiBmcmVlOiBjZ3JvdXAvc2tiIGVncmVzcyAtXHUwMDNlIGtmcmVlX3NrYi5cbiYjNDM7ICogU2VuZCBVRFAgdG8gYSBjbG9zZWQgcG9ydC4gVGhlIHBhY2tldCBpcyBkcm9wcGVkLCB0cmlnZ2VyaW5nIGtmcmVlX3NrYi5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfY2dycF9lZ3Jlc3NfdG9fa2ZyZWVfc2tiKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNvY2thZGRyX2luIGFkZHIgPSB7XG4mIzQzO1x0XHQuc2luX2ZhbWlseSA9IEFGX0lORVQsXG4mIzQzO1x0XHQuc2luX3BvcnQgPSBodG9ucyg0MzIxKSxcbiYjNDM7XHRcdC5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spLFxuJiM0MztcdH07XG4mIzQzO1x0c3RydWN0IGJwZl9saW5rICpjZ19saW5rID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2xpbmsgKnRwX2xpbmsgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbiYjNDM7XHRpbnQgY2dyb3VwX2ZkID0gLTE7XG4mIzQzO1x0Y2hhciBidWZbMV07XG4mIzQzO1x0aW50IGZkID0gLTE7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0Y2dyb3VwX2ZkID0gdGVzdF9fam9pbl9jZ3JvdXAoXCYjMzQ7L2NncnBfdG9fa2ZyZWVcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGNncm91cF9mZCwgMCwgXCYjMzQ7am9pbl9jZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRucyA9IG5ldG5zX25ldyhcJiMzNDtjZ3JwX3RvX2tmcmVlXCYjMzQ7LCB0cnVlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwmIzM0O25ldG5zX25ld1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRjZ19saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9jZ3JvdXAoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JwX3NrYl9leHRfd3JpdGUsXG4mIzQzO1x0XHRcdFx0XHQgICAgIGNncm91cF9mZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGNnX2xpbmssIFwmIzM0O2F0dGFjaF9jZ3JvdXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHR0cF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLVx1MDAzZXByb2dzLnRwX2tmcmVlX3NrYl9leHRfcmVhZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHRwX2xpbmssIFwmIzM0O2F0dGFjaF90cFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtzb2NrZXRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjb25uZWN0KGZkLCAodm9pZCAqKVx1MDAyNmFkZHIsIHNpemVvZihhZGRyKSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtjb25uZWN0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gc2VuZChmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShyZXQsIFRFU1RfUEFZTE9BRF9MRU4sIFwmIzM0O3NlbmRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHQvKiBXYWl0IGZvciBJQ01QIGVycm9yIC0tIGNvbmZpcm1zIHRoZSBwYWNrZXQgd2FzIGZyZWVkICovXG4mIzQzO1x0cmV0ID0gcmVjdihmZCwgYnVmLCBzaXplb2YoYnVmKSwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEocmV0LCAtMSwgXCYjMzQ7cmVjdlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0QVNTRVJUX0VRKGVycm5vLCBFQ09OTlJFRlVTRUQsIFwmIzM0O3JlY3ZfZWNvbm5yZWZ1c2VkXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcJiMzNDt0ZXN0X3Bhc3NcJiMzNDspO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRpZiAoZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KHRwX2xpbmspO1xuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KGNnX2xpbmspO1xuJiM0MztcdG5ldG5zX2ZyZWUobnMpO1xuJiM0MztcdGlmIChjZ3JvdXBfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoY2dyb3VwX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBpbmdyZXNzIC1cdTAwM2UgbmV0ZmlsdGVyIGhvb2sgKi9cbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X25mKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssXG4mIzQzO1x0XHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXG4mIzQzO1x0XHQgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9uZXRmaWx0ZXJfb3B0cywgbmZfb3B0cyxcbiYjNDM7XHRcdCAgICAucGYgPSBORlBST1RPX0lQVjQsXG4mIzQzO1x0XHQgICAgLmhvb2tudW0gPSBORl9JTkVUX0xPQ0FMX0lOLFxuJiM0MztcdFx0ICAgIC5wcmlvcml0eSA9IDEpO1xuJiM0MztcdHN0cnVjdCBicGZfbGluayAqcmVhZGVyX2xpbmsgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbiYjNDM7XHRpbnQgc2VydmVyX2ZkID0gLTE7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0bnMgPSBuZXRuc19uZXcobmFtZSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcJiMzNDtuZXRuc19uZXdcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzZXJ2ZXJfZmQgPSBzdGFydF9zZXJ2ZXIoQUZfSU5FVCwgU09DS19ER1JBTSwgXCYjMzQ7MTI3LjAuMC4xXCYjMzQ7LCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFwmIzM0O3N0YXJ0X3NlcnZlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dGNfaG9vayk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDticGZfdGNfaG9va19jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlKTtcbiYjNDM7XHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7YnBmX3RjX2F0dGFjaFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJlYWRlcl9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9uZXRmaWx0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5uZl9za2JfZXh0X3JlYWQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBcdTAwMjZuZl9vcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssIFwmIzM0O2F0dGFjaF9uZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGlmIChzZW5kX2xvb3BiYWNrX3VkcChzZXJ2ZXJfZmQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwmIzM0O3Rlc3RfcGFzc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KHJlYWRlcl9saW5rKTtcbiYjNDM7XHRicGZfdGNfaG9va19kZXN0cm95KFx1MDAyNnRjX2hvb2spO1xuJiM0MztcdGlmIChzZXJ2ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uoc2VydmVyX2ZkKTtcbiYjNDM7XHRuZXRuc19mcmVlKG5zKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBMV1RfRVhUX1BJTl9QQVRIIFwmIzM0Oy9zeXMvZnMvYnBmL3NrYl9leHRfbHd0XCYjMzQ7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUZXN0IHNrYl9leHQgYWNyb3NzIExXVCBob29rcyBvbiBsb29wYmFjay5cbiYjNDM7ICpcbiYjNDM7ICogQGx3dF9wcm9nOiAgQlBGIHByb2dyYW0gdG8gcGluIGFuZCBhdHRhY2ggdmlhIGlwIHJvdXRlIGVuY2FwXG4mIzQzOyAqIEBlbmNhcF9kaXI6IFwmIzM0O2luXCYjMzQ7LCBcJiMzNDtvdXRcJiMzNDssIG9yIFwmIzM0O3htaXRcJiMzNDtcbiYjNDM7ICogQHdyaXRlcjogICAgdHJ1ZSBpZiBsd3RfcHJvZyB3cml0ZXMgc2tiX2V4dCAocmVhZGVyIG9uIFRDIGluZ3Jlc3MpLFxuJiM0MzsgKiAgICAgICAgICAgICBmYWxzZSBpZiBsd3RfcHJvZyByZWFkcyBza2JfZXh0ICh3cml0ZXIgb24gVEMgaW5ncmVzcylcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF9sd3Qoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsIGNvbnN0IGNoYXIgKm5hbWUsXG4mIzQzO1x0XHRcdCAgICAgc3RydWN0IGJwZl9wcm9ncmFtICpsd3RfcHJvZyxcbiYjNDM7XHRcdFx0ICAgICBjb25zdCBjaGFyICplbmNhcF9kaXIsIGJvb2wgd3JpdGVyKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssXG4mIzQzO1x0XHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXG4mIzQzO1x0XHQgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyID0ge1xuJiM0MztcdFx0LnNpbl9mYW1pbHkgPSBBRl9JTkVULFxuJiM0MztcdH07XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcm9nO1xuJiM0MztcdGNoYXIgYnVmW1RFU1RfUEFZTE9BRF9MRU5dO1xuJiM0MztcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbiYjNDM7XHRib29sIHBpbm5lZCA9IGZhbHNlO1xuJiM0MztcdGludCBzZXJ2ZXJfZmQgPSAtMTtcbiYjNDM7XHRpbnQgZmQgPSAtMTtcbiYjNDM7XHRpbnQgcG9ydDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHR1bmxpbmsoTFdUX0VYVF9QSU5fUEFUSCk7XG4mIzQzO1x0cmV0ID0gYnBmX3Byb2dyYW1fX3Bpbihsd3RfcHJvZywgTFdUX0VYVF9QSU5fUEFUSCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtwaW4gbHd0XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRwaW5uZWQgPSB0cnVlO1xuJiM0MztcbiYjNDM7XHRucyA9IG5ldG5zX25ldyhuYW1lLCB0cnVlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwmIzM0O25ldG5zX25ld1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfcHJlaG9vaztcbiYjNDM7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIGFkZHIgYWRkIDEwLjAuMC4xLzMyIGRldiBsb1wmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIHJvdXRlIHJlcGxhY2UgdGFibGUgbG9jYWwgbG9jYWwgMTAuMC4wLjEgXCYjMzQ7XG4mIzQzO1x0XHQgICAgIFwmIzM0O2VuY2FwIGJwZiAlcyBwaW5uZWQgXCYjMzQ7IExXVF9FWFRfUElOX1BBVEggXCYjMzQ7IGRldiBsb1wmIzM0OyxcbiYjNDM7XHRcdCAgICAgZW5jYXBfZGlyKTtcbiYjNDM7XG4mIzQzO1x0c2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQsIFNPQ0tfREdSQU0sIFwmIzM0OzEwLjAuMC4xXCYjMzQ7LCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFwmIzM0O3N0YXJ0X3NlcnZlclwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfcHJlaG9vaztcbiYjNDM7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2JwZl90Y19ob29rX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfcHJlaG9vaztcbiYjNDM7XG4mIzQzO1x0LyogV2hlbiBMV1Qgd3JpdGVzLCBUQyBpbmdyZXNzIHJlYWRzOyB3aGVuIExXVCByZWFkcywgVEMgaW5ncmVzcyB3cml0ZXMgKi9cbiYjNDM7XHR0Y19wcm9nID0gd3JpdGVyID8gc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3JlYWRcbiYjNDM7XHRcdFx0IDogc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlO1xuJiM0MztcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZCh0Y19wcm9nKTtcbiYjNDM7XHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7YnBmX3RjX2F0dGFjaFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHBvcnQgPSBnZXRfc29ja2V0X2xvY2FsX3BvcnQoc2VydmVyX2ZkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShwb3J0LCAwLCBcJiMzNDtnZXRfcG9ydFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtzb2NrZXRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRpbmV0X3B0b24oQUZfSU5FVCwgXCYjMzQ7MTAuMC4wLjFcJiMzNDssIFx1MDAyNmFkZHIuc2luX2FkZHIpO1xuJiM0MztcdGFkZHIuc2luX3BvcnQgPSBwb3J0O1xuJiM0MztcdHJldCA9IHNlbmR0byhmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwLFxuJiM0MztcdFx0ICAgICAodm9pZCAqKVx1MDAyNmFkZHIsIHNpemVvZihhZGRyKSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEocmV0LCBURVNUX1BBWUxPQURfTEVOLCBcJiMzNDtzZW5kdG9cJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdHJldCA9IHJlY3Zmcm9tKHNlcnZlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7XG4mIzQzO1x0QVNTRVJUX0VRKHJldCwgVEVTVF9QQVlMT0FEX0xFTiwgXCYjMzQ7cmVjdmZyb21cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwmIzM0O3Rlc3RfcGFzc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGlmIChmZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0YnBmX3RjX2hvb2tfZGVzdHJveShcdTAwMjZ0Y19ob29rKTtcbiYjNDM7Y2xlYW51cF9wcmVob29rOlxuJiM0MztcdGlmIChzZXJ2ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uoc2VydmVyX2ZkKTtcbiYjNDM7XHRuZXRuc19mcmVlKG5zKTtcbiYjNDM7XHRpZiAocGlubmVkKVxuJiM0MztcdFx0dW5saW5rKExXVF9FWFRfUElOX1BBVEgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNFRzZfUElOX1BBVEggXCYjMzQ7L3N5cy9mcy9icGYvc2tiX2V4dF9zZWc2bG9jYWxcJiMzNDtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgZWdyZXNzIC1cdTAwM2Ugc2VnNmxvY2FsIEVuZC5CUEYgaG9vay5cbiYjNDM7ICpcbiYjNDM7ICogVG9wb2xvZ3k6XG4mIzQzOyAqXG4mIzQzOyAqICAgICBOUzEgICAgICAgICAgIE5TMiAgICAgICAgICAgIE5TM1xuJiM0MzsgKiAgIGxvIHZldGgxIFx1MDAzYy1cdTAwM2UgdmV0aDIgdmV0aDMgXHUwMDNjLVx1MDAzZSB2ZXRoNCBsb1xuJiM0MzsgKlxuJiM0MzsgKiBOUzEgZW5jYXBzIGZiMDE6OjIgd2l0aCBTUkggKHNlZ21lbnRzIGZkMDE6OjEsZmQwMTo6Mikgb24gb3V0cHV0IGFuZFxuJiM0MzsgKiB3cml0ZXMgc2tiX2V4dCBhdCBUQyBlZ3Jlc3Mgb24gdmV0aDEuIE5TMiBydW5zIEVuZC5CUEYgZm9yIGZkMDE6OjEsXG4mIzQzOyAqIHdoaWNoIHJlYWRzIHNrYl9leHQsIHRoZW4gZm9yd2FyZHMgdG8gTlMzIChzZWc2X2xvb2t1cF9uZXh0aG9wXG4mIzQzOyAqIHJlamVjdHMgbG9vcGJhY2sgcm91dGVzIHdpdGggbG9jYWxfZGVsaXZlcnk9ZmFsc2UsIHNvIEVuZC5CUEZcbiYjNDM7ICogY2Fubm90IGRlbGl2ZXIgbG9jYWxseSkuIE5TMyBoYXMgZmQwMTo6MiBsb2NhbCwgZGVjYXBzdWxhdGVzLCBhbmRcbiYjNDM7ICogZGVsaXZlcnMgdGhlIGlubmVyIFVEUCAoZHN0PWZiMDE6OjIpIHRvIGEgbG9jYWwgc29ja2V0IGZvciB0ZXN0XG4mIzQzOyAqIHN5bmNocm9uaXphdGlvbi5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIFRDIHByb2dyYW0gZHJvcHMgbm9uLXRlc3QgcGFja2V0cywgc28gTkRQIGlzIGJ5cGFzc2VkIHdpdGggYVxuJiM0MzsgKiBzdGF0aWMgbmVpZ2hib3IgZW50cnkgb24gdGhlIE5TMS1cdTAwM2VOUzIgaG9wLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NlZzZsb2NhbChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0VHUkVTUyk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbiYjNDM7XHRzdHJ1Y3QgbnN0b2tlbiAqbnN0b2tlbiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHNvY2thZGRyX2luNiBkc3QgPSB7fTtcbiYjNDM7XHRjaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTtcbiYjNDM7XHRib29sIHBpbm5lZCA9IGZhbHNlO1xuJiM0MztcdGludCBjbGllbnRfZmQgPSAtMTtcbiYjNDM7XHRpbnQgc2VydmVyX2ZkID0gLTE7XG4mIzQzO1x0c3NpemVfdCBieXRlcztcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHR1bmxpbmsoU0VHNl9QSU5fUEFUSCk7XG4mIzQzO1x0cmV0ID0gYnBmX3Byb2dyYW1fX3Bpbihza2VsLVx1MDAzZXByb2dzLnNlZzZsb2NhbF9za2JfZXh0X3JlYWQsXG4mIzQzO1x0XHRcdCAgICAgICBTRUc2X1BJTl9QQVRIKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3BpbiBzZWc2bG9jYWxcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHBpbm5lZCA9IHRydWU7XG4mIzQzO1xuJiM0MztcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRTWVMoY2xlYW51cCwgXCYjMzQ7aXAgbmV0bnMgYWRkIHNlZzZfMVwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIG5ldG5zIGFkZCBzZWc2XzJcJiMzNDspO1xuJiM0MztcdFNZUyhjbGVhbnVwLCBcJiMzNDtpcCBuZXRucyBhZGQgc2VnNl8zXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogTlMxIFx1MDAzYy1cdTAwM2UgTlMyIHZldGggcGFpcjsgc3RhdGljIE5EUCBzaW5jZSBUQyBkcm9wcyBOUy9OQSAqL1xuJiM0MztcdFNZUyhjbGVhbnVwLCBcJiMzNDtpcCAtbiBzZWc2XzEgbGluayBhZGQgdmV0aDEgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2ZXRoMiBuZXRucyBzZWc2XzJcJiMzNDspO1xuJiM0MztcdFNZUyhjbGVhbnVwLCBcJiMzNDtpcCAtbiBzZWc2XzEgbGluayBzZXQgZGV2IHZldGgxIHVwXCYjMzQ7KTtcbiYjNDM7XHRTWVMoY2xlYW51cCwgXCYjMzQ7aXAgLW4gc2VnNl8yIGxpbmsgc2V0IGRldiB2ZXRoMiBhZGRyZXNzIDAyOjAwOjAwOjAwOjAwOjAyXCYjMzQ7KTtcbiYjNDM7XHRTWVMoY2xlYW51cCwgXCYjMzQ7aXAgLW4gc2VnNl8yIGxpbmsgc2V0IGRldiB2ZXRoMiB1cFwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIC1uIHNlZzZfMSAtNiBhZGRyIGFkZCBmYjAwOjoxMi8xNiBkZXYgdmV0aDEgc2NvcGUgbGluayBub2RhZFwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIC1uIHNlZzZfMiAtNiBhZGRyIGFkZCBmYjAwOjoyMS8xNiBkZXYgdmV0aDIgc2NvcGUgbGluayBub2RhZFwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIC1uIHNlZzZfMSAtNiBuZWlnaCBhZGQgZmIwMDo6MjEgbGxhZGRyIDAyOjAwOjAwOjAwOjAwOjAyIFwmIzM0O1xuJiM0MztcdFx0ICAgICBcJiMzNDtudWQgcGVybWFuZW50IGRldiB2ZXRoMVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qIE5TMiBcdTAwM2MtXHUwMDNlIE5TMyB2ZXRoIHBhaXIgKi9cbiYjNDM7XHRTWVMoY2xlYW51cCwgXCYjMzQ7aXAgLW4gc2VnNl8yIGxpbmsgYWRkIHZldGgzIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDQgbmV0bnMgc2VnNl8zXCYjMzQ7KTtcbiYjNDM7XHRTWVMoY2xlYW51cCwgXCYjMzQ7aXAgLW4gc2VnNl8yIGxpbmsgc2V0IGRldiB2ZXRoMyB1cFwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIC1uIHNlZzZfMyBsaW5rIHNldCBkZXYgdmV0aDQgdXBcJiMzNDspO1xuJiM0MztcdFNZUyhjbGVhbnVwLCBcJiMzNDtpcCAtbiBzZWc2XzIgLTYgYWRkciBhZGQgZmIwMDo6MzQvMTYgZGV2IHZldGgzIHNjb3BlIGxpbmsgbm9kYWRcJiMzNDspO1xuJiM0MztcdFNZUyhjbGVhbnVwLCBcJiMzNDtpcCAtbiBzZWc2XzMgLTYgYWRkciBhZGQgZmIwMDo6NDMvMTYgZGV2IHZldGg0IHNjb3BlIGxpbmsgbm9kYWRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKiBOUzE6IHNvdXJjZSBhZGRyZXNzICYjNDM7IFNSSCBlbmNhcCBvbiBvdXRwdXQgJiM0Mzsgcm91dGUgZm9yIGZkMDE6Oi8xNiAqL1xuJiM0MztcdFNZUyhjbGVhbnVwLCBcJiMzNDtpcCAtbiBzZWc2XzEgbGluayBzZXQgZGV2IGxvIHVwXCYjMzQ7KTtcbiYjNDM7XHRTWVMoY2xlYW51cCwgXCYjMzQ7aXAgLW4gc2VnNl8xIC02IGFkZHIgYWRkIGZiMDE6OjEvMTI4IGRldiBsbyBub2RhZFwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIC1uIHNlZzZfMSAtNiByb3V0ZSBhZGQgZmIwMTo6MiBlbmNhcCBzZWc2IG1vZGUgZW5jYXAgXCYjMzQ7XG4mIzQzO1x0XHQgICAgIFwmIzM0O3NlZ3MgZmQwMTo6MSxmZDAxOjoyIGRldiB2ZXRoMSB2aWEgZmIwMDo6MjFcJiMzNDspO1xuJiM0MztcdFNZUyhjbGVhbnVwLCBcJiMzNDtpcCAtbiBzZWc2XzEgLTYgcm91dGUgYWRkIGZkMDE6Oi8xNiBkZXYgdmV0aDEgdmlhIGZiMDA6OjIxXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogTlMyOiBzZWc2bG9jYWwgRW5kLkJQRiBmb3IgZmQwMTo6MSwgdGhlbiBmb3J3YXJkIHRvIE5TMy5cbiYjNDM7XHQgKiBVc2Ugb3Blbl9uZXRucyBzbyB0aGUgcGlubmVkIHByb2cgb24gYnBmZnMgaXMgYWNjZXNzaWJsZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRuc3Rva2VuID0gb3Blbl9uZXRucyhcJiMzNDtzZWc2XzJcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcJiMzNDtvcGVuIHNlZzZfMlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdFNZUyhjbGVhbnVwLCBcJiMzNDtpcCBsaW5rIHNldCBkZXYgbG8gdXBcJiMzNDspO1xuJiM0MztcdFNZUyhjbGVhbnVwLCBcJiMzNDtzeXNjdGwgLXdxIG5ldC5pcHY2LmNvbmYuYWxsLmZvcndhcmRpbmc9MVwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIC02IHJvdXRlIGFkZCBmZDAxOjoyLzEyOCBkZXYgdmV0aDMgdmlhIGZiMDA6OjQzXCYjMzQ7KTtcbiYjNDM7XHRTWVMoY2xlYW51cCwgXCYjMzQ7aXAgLTYgcm91dGUgYWRkIGZkMDE6OjEgZW5jYXAgc2VnNmxvY2FsIFwmIzM0O1xuJiM0MztcdFx0ICAgICBcJiMzNDthY3Rpb24gRW5kLkJQRiBlbmRwb2ludCBwaW5uZWQgXCYjMzQ7IFNFRzZfUElOX1BBVEggXCYjMzQ7IGRldiB2ZXRoMlwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xuJiM0MztcdG5zdG9rZW4gPSBOVUxMO1xuJiM0MztcbiYjNDM7XHQvKiBOUzM6IGRlY2FwIHBvaW50ICYjNDM7IFVEUCBzZXJ2ZXIuXG4mIzQzO1x0ICogZmQwMTo6MiBsb2NhbCB0cmlnZ2VycyBTUkggZGVjYXAgKHNlZ21lbnRzX2xlZnQ9MCkuXG4mIzQzO1x0ICogZmIwMTo6MiBsb2NhbCBkZWxpdmVycyB0aGUgaW5uZXIgVURQIHRvIHRoZSBzb2NrZXQuXG4mIzQzO1x0ICovXG4mIzQzO1x0bnN0b2tlbiA9IG9wZW5fbmV0bnMoXCYjMzQ7c2VnNl8zXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIobnN0b2tlbiwgXCYjMzQ7b3BlbiBzZWc2XzNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRTWVMoY2xlYW51cCwgXCYjMzQ7aXAgbGluayBzZXQgZGV2IGxvIHVwXCYjMzQ7KTtcbiYjNDM7XHRTWVMoY2xlYW51cCwgXCYjMzQ7c3lzY3RsIC13cSBuZXQuaXB2Ni5jb25mLmFsbC5zZWc2X2VuYWJsZWQ9MVwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O3N5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5sby5zZWc2X2VuYWJsZWQ9MVwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O3N5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi52ZXRoNC5zZWc2X2VuYWJsZWQ9MVwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIC02IGFkZHIgYWRkIGZkMDE6OjIvMTI4IGRldiBsbyBub2RhZFwmIzM0Oyk7XG4mIzQzO1x0U1lTKGNsZWFudXAsIFwmIzM0O2lwIC02IGFkZHIgYWRkIGZiMDE6OjIvMTI4IGRldiBsbyBub2RhZFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVUNiwgU09DS19ER1JBTSwgXCYjMzQ7ZmIwMTo6MlwmIzM0OywgMTIzNCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0Uoc2VydmVyX2ZkLCAwLCBcJiMzNDtzdGFydF9zZXJ2ZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRjbG9zZV9uZXRucyhuc3Rva2VuKTtcbiYjNDM7XHRuc3Rva2VuID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0LyogTlMxOiB3cml0ZSBza2JfZXh0IGF0IFRDIGVncmVzcyBvbiB2ZXRoMSwgdGhlbiBzZW5kLlxuJiM0MztcdCAqIFRDIGVncmVzcyBmaXJlcyBhZnRlciBzZWc2IGVuY2FwLCBvbiB0aGUgZW5jYXBwZWQgcGFja2V0LlxuJiM0MztcdCAqL1xuJiM0MztcdG5zdG9rZW4gPSBvcGVuX25ldG5zKFwmIzM0O3NlZzZfMVwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sIFwmIzM0O29wZW4gc2VnNl8xXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0dGNfaG9vay5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoXCYjMzQ7dmV0aDFcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHRjX2hvb2suaWZpbmRleCwgMCwgXCYjMzQ7aWZpbmRleCB2ZXRoMVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2JwZl90Y19ob29rX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGUpO1xuJiM0MztcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dGNfaG9vaywgXHUwMDI2dGNfb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDticGZfdGNfYXR0YWNoXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0Y2xpZW50X2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShjbGllbnRfZmQsIDAsIFwmIzM0O3NvY2tldFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGRzdC5zaW42X2ZhbWlseSA9IEFGX0lORVQ2O1xuJiM0MztcdGRzdC5zaW42X3BvcnQgPSBodG9ucygxMjM0KTtcbiYjNDM7XHRpbmV0X3B0b24oQUZfSU5FVDYsIFwmIzM0O2ZiMDE6OjJcJiMzNDssIFx1MDAyNmRzdC5zaW42X2FkZHIpO1xuJiM0MztcbiYjNDM7XHRieXRlcyA9IHNlbmR0byhjbGllbnRfZmQsIHRlc3RfcGF5bG9hZCwgVEVTVF9QQVlMT0FEX0xFTiwgMCxcbiYjNDM7XHRcdCAgICAgICAodm9pZCAqKVx1MDAyNmRzdCwgc2l6ZW9mKGRzdCkpO1xuJiM0MztcbiYjNDM7XHRjbG9zZV9uZXRucyhuc3Rva2VuKTtcbiYjNDM7XHRuc3Rva2VuID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoYnl0ZXMsIFRFU1RfUEFZTE9BRF9MRU4sIFwmIzM0O3NlbmR0b1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdC8qIFJlY2VpdmUgZGVjYXBzdWxhdGVkIHBhY2tldCAtLSBzeW5jaHJvbml6ZXMgd2l0aCBzZWc2bG9jYWwgKi9cbiYjNDM7XHRuc3Rva2VuID0gb3Blbl9uZXRucyhcJiMzNDtzZWc2XzNcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcJiMzNDtvcGVuIHNlZzZfM1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGJ5dGVzID0gcmVjdmZyb20oc2VydmVyX2ZkLCBidWYsIHNpemVvZihidWYpLCAwLCBOVUxMLCBOVUxMKTtcbiYjNDM7XHRBU1NFUlRfRVEoYnl0ZXMsIFRFU1RfUEFZTE9BRF9MRU4sIFwmIzM0O3JlY3Zmcm9tXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwmIzM0O3Rlc3RfcGFzc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xuJiM0MztcdGlmIChzZXJ2ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uoc2VydmVyX2ZkKTtcbiYjNDM7XHRpZiAoY2xpZW50X2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGNsaWVudF9mZCk7XG4mIzQzO1x0U1lTX05PRkFJTChcJiMzNDtpcCBuZXRucyBkZWwgc2VnNl8zXCYjMzQ7KTtcbiYjNDM7XHRTWVNfTk9GQUlMKFwmIzM0O2lwIG5ldG5zIGRlbCBzZWc2XzJcJiMzNDspO1xuJiM0MztcdFNZU19OT0ZBSUwoXCYjMzQ7aXAgbmV0bnMgZGVsIHNlZzZfMVwmIzM0Oyk7XG4mIzQzO1x0aWYgKHBpbm5lZClcbiYjNDM7XHRcdHVubGluayhTRUc2X1BJTl9QQVRIKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBpbmdyZXNzIC1cdTAwM2Ugc2tfc2tiIHZlcmRpY3QgaG9vay4gIFRDIGluZ3Jlc3NcbiYjNDM7ICogd3JpdGVzIHNrYl9leHQgb24gbG9vcGJhY2s7IHRoZSB2ZXJkaWN0IHByb2dyYW0gcmVhZHMgaXQgb24gc2tiIGRlbGl2ZXJ5IHRvIGFcbiYjNDM7ICogc29ja2V0IGluIHRoZSBzb2NrbWFwLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NrX3NrYihzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLFxuJiM0MztcdFx0ICAgIC5pZmluZGV4ID0gMSAvKiBJRklOREVYX0xPICovLFxuJiM0MztcdFx0ICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2xpbmsgKnZlcmRpY3RfbGluayA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHNvY2thZGRyX2luIGFkZHI7XG4mIzQzO1x0c29ja2xlbl90IGFkZHJfbGVuID0gc2l6ZW9mKGFkZHIpO1xuJiM0MztcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbiYjNDM7XHRjaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTtcbiYjNDM7XHRpbnQgYzEgPSAtMSwgcDEgPSAtMTtcbiYjNDM7XHRpbnQgbWFwID0gLTEsIHplcm8gPSAwO1xuJiM0MztcdHNzaXplX3QgbjtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRucyA9IG5ldG5zX25ldyhcJiMzNDt0Y190b19za19za2JcJiMzNDssIHRydWUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihucywgXCYjMzQ7bmV0bnNfbmV3XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2JwZl90Y19ob29rX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGVfcG9ydCk7XG4mIzQzO1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2JwZl90Y19hdHRhY2hcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRtYXAgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfU09DS01BUCwgTlVMTCwgc2l6ZW9mKGludCksXG4mIzQzO1x0XHRcdCAgICAgc2l6ZW9mKGludCksIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKG1hcCwgMCwgXCYjMzQ7YnBmX21hcF9jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHR2ZXJkaWN0X2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX3NvY2ttYXAoc2tlbC1cdTAwM2Vwcm9ncy5za19za2Jfc2tiX2V4dF9yZWFkLFxuJiM0MztcdFx0XHRcdFx0XHQgICBtYXApO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUih2ZXJkaWN0X2xpbmssIFwmIzM0O2F0dGFjaF9zb2NrbWFwXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soY3JlYXRlX3BhaXIoQUZfSU5FVCwgU09DS19TVFJFQU0sIFx1MDAyNmMxLCBcdTAwMjZwMSksIFwmIzM0O2NyZWF0ZV9wYWlyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShtYXAsIFx1MDAyNnplcm8sIFx1MDAyNmMxLCBCUEZfTk9FWElTVCksIFwmIzM0O21hcF91cGRhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhnZXRzb2NrbmFtZShjMSwgKHN0cnVjdCBzb2NrYWRkciAqKVx1MDAyNmFkZHIsIFx1MDAyNmFkZHJfbGVuKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtnZXRzb2NrbmFtZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X3BvcnQgPSBhZGRyLnNpbl9wb3J0O1xuJiM0MztcbiYjNDM7XHRuID0gc2VuZChwMSwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShuLCBURVNUX1BBWUxPQURfTEVOLCBcJiMzNDtzZW5kXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0biA9IHJlY3ZfdGltZW91dChjMSwgYnVmLCBzaXplb2YoYnVmKSwgTVNHX0RPTlRXQUlULCBJT19USU1FT1VUX1NFQyk7XG4mIzQzO1x0QVNTRVJUX0VRKG4sIFRFU1RfUEFZTE9BRF9MRU4sIFwmIzM0O3JlY3ZcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCYjMzQ7dGVzdF9wYXNzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0aWYgKGMxIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGMxKTtcbiYjNDM7XHRpZiAocDEgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UocDEpO1xuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KHZlcmRpY3RfbGluayk7XG4mIzQzO1x0aWYgKG1hcCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShtYXApO1xuJiM0MztcdGJwZl90Y19ob29rX2Rlc3Ryb3koXHUwMDI2dGNfaG9vayk7XG4mIzQzO1x0bmV0bnNfZnJlZShucyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9za2JfZXh0X2Nyb3NzX2hvb2sodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IHRlc3RfeGRwX21ldGFfX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7b3BlbiBhbmQgbG9hZCBza2VsZXRvblwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3RjX3RvX2NncnBfaW5ncmVzc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NrYl9leHRfdWRwKHNrZWwsIFwmIzM0O3RjX3RvX2NncnBfaW5ncmVzc1wmIzM0OywgUkVBREVSX0NHUlBfU0tCKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y190b19za19maWx0ZXJcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X3VkcChza2VsLCBcJiMzNDt0Y190b19za19maWx0ZXJcJiMzNDssIFJFQURFUl9TS19GSUxURVIpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3RjX3RvX2xzbVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NrYl9leHRfdGNwKHNrZWwsIFwmIzM0O3RjX3RvX2xzbVwmIzM0OywgUkVBREVSX0xTTSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dGNfdG9fc2tvcHNcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X3RjcChza2VsLCBcJiMzNDt0Y190b19za29wc1wmIzM0OywgUkVBREVSX1NLT1BTKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtjZ3JwX2VncmVzc190b19rZnJlZV9za2JcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9jZ3JwX2VncmVzc190b19rZnJlZV9za2Ioc2tlbCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dGNfdG9fbmZcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X25mKHNrZWwsIFwmIzM0O3RjX3RvX25mXCYjMzQ7KTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y190b19sd3RfaW5cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X2x3dChza2VsLCBcJiMzNDt0Y190b19sd3RfaW5cJiMzNDssXG4mIzQzO1x0XHRcdFx0IHNrZWwtXHUwMDNlcHJvZ3MubHd0X2luX3NrYl9leHRfcmVhZCwgXCYjMzQ7aW5cJiMzNDssIGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtsd3Rfb3V0X3RvX3RjXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfc2tiX2V4dF9sd3Qoc2tlbCwgXCYjMzQ7bHd0X291dF90b190Y1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgc2tlbC1cdTAwM2Vwcm9ncy5sd3Rfb3V0X3NrYl9leHRfd3JpdGUsIFwmIzM0O291dFwmIzM0OywgdHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bHd0X3htaXRfdG9fdGNcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X2x3dChza2VsLCBcJiMzNDtsd3RfeG1pdF90b190Y1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgc2tlbC1cdTAwM2Vwcm9ncy5sd3RfeG1pdF9za2JfZXh0X3dyaXRlLCBcJiMzNDt4bWl0XCYjMzQ7LCB0cnVlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y190b19zZWc2bG9jYWxcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X3NlZzZsb2NhbChza2VsKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt0Y190b19za19za2JcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9za2JfZXh0X3NrX3NrYihza2VsKTtcbiYjNDM7XG4mIzQzO1x0dGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jXG5pbmRleCAwOGIwM2JlMGI4OTFjLi44MGNkZmVlNjE1Y2NiIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuY1xuQEAgLTMsOSAmIzQzOzMsMTEgQEBcbiBcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2VuZGlhbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7YnBmX2tmdW5jcy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9taXNjLmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDticGZfdHJhY2luZ19uZXQuaFwmIzM0O1xuIFxuICNkZWZpbmUgTUVUQV9TSVpFIDMyXG5AQCAtMjIsMTAgJiM0MzsyNCwxMCBAQFxuIGJvb2wgdGVzdF9wYXNzO1xuIFxuIHN0YXRpYyBjb25zdCBfX3U4IG1ldGFfd2FudFtNRVRBX1NJWkVdID0ge1xuLVx0MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCxcbi1cdDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsXG4tXHQweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LFxuLVx0MHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCxcbiYjNDM7XHQweDQ5LCAweDIwLCAweDYzLCAweDcyLCAweDZmLCAweDczLCAweDczLCAweDY1LFxuJiM0MztcdDB4NjQsIDB4MjAsIDB4NjgsIDB4NmYsIDB4NmYsIDB4NmIsIDB4NzMsIDB4MjAsXG4mIzQzO1x0MHgyNiwgMHgyMCwgMHg2YywgMHg2OSwgMHg3NiwgMHg2NSwgMHg2NCwgMHgyMCxcbiYjNDM7XHQweDc0LCAweDZmLCAweDIwLCAweDc0LCAweDY1LCAweDZjLCAweDZjLCAweDIxLFxuIH07XG4gXG4gc3RhdGljIGJvb2wgY2hlY2tfbWV0YWRhdGEoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIF9fdTggKm1ldGFfaGF2ZSlcbkBAIC02ODksNCAmIzQzOzY5MSw1NjMgQEAgaW50IGhlbHBlcl9za2JfY2hhbmdlX3Byb3RvKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbiBcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiB9XG4gXG4mIzQzO2Jvb2wgd3JpdGVfZG9uZTtcbiYjNDM7XG4mIzQzOy8qIFdyaXRlIHRvIHNrYl9leHQgdXNpbmcgYnBmX2R5bnB0cl93cml0ZSBoZWxwZXIgKi9cbiYjNDM7U0VDKFwmIzM0O3RjXCYjMzQ7KVxuJiM0MztpbnQgdGNfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcdGlmIChicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBBUlJBWV9TSVpFKG1ldGFfd2FudCksIDApKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHR3cml0ZV9kb25lID0gdHJ1ZTtcbiYjNDM7XHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVhZCBmcm9tIHNrYi1leHQgbWV0YWRhdGEgdXNpbmcgYnBmX2R5bnB0cl9yZWFkIGhlbHBlciAqL1xuJiM0MztTRUMoXCYjMzQ7dGNcJiMzNDspXG4mIzQzO2ludCB0Y19za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgQVJSQVlfU0laRShtZXRhX2hhdmUpLCBcdTAwMjZtZXRhLCAwLCAwKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1xuJiM0MztcdHRlc3RfcGFzcyA9IHRydWU7XG4mIzQzO1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlYWQgZnJvbSBhIGNsb25lZCBza2JfZXh0IGR5bnB0ciAqL1xuJiM0MztTRUMoXCYjMzQ7dGNcJiMzNDspXG4mIzQzO2ludCB0Y19za2JfZXh0X2Nsb25lX3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YSwgY2xvbmU7XG4mIzQzO1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbiYjNDM7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfY2xvbmUoXHUwMDI2bWV0YSwgXHUwMDI2Y2xvbmUpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBBUlJBWV9TSVpFKG1ldGFfaGF2ZSksIFx1MDAyNmNsb25lLCAwLCAwKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1xuJiM0MztcdHRlc3RfcGFzcyA9IHRydWU7XG4mIzQzO1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlYWQgZnJvbSBza2JfZXh0IHVzaW5nIGJwZl9keW5wdHJfc2xpY2UgKi9cbiYjNDM7U0VDKFwmIzM0O3RjXCYjMzQ7KVxuJiM0MztpbnQgdGNfc2tiX2V4dF9zbGljZV9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4mIzQzO1x0X191OCAqbWV0YV9oYXZlO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XHRtZXRhX2hhdmUgPSBicGZfZHlucHRyX3NsaWNlKFx1MDAyNm1ldGEsIDAsIE5VTEwsIE1FVEFfU0laRSk7XG4mIzQzO1x0aWYgKCFtZXRhX2hhdmUpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHR0ZXN0X3Bhc3MgPSB0cnVlO1xuJiM0MztcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBXcml0ZSB0byBza2JfZXh0IHVzaW5nIGJwZl9keW5wdHJfc2xpY2VfcmR3ciAqL1xuJiM0MztTRUMoXCYjMzQ7dGNcJiMzNDspXG4mIzQzO2ludCB0Y19za2JfZXh0X3NsaWNlX3dyaXRlKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4mIzQzO1x0X191OCAqZHN0O1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcdGRzdCA9IGJwZl9keW5wdHJfc2xpY2VfcmR3cihcdTAwMjZtZXRhLCAwLCBOVUxMLCBNRVRBX1NJWkUpO1xuJiM0MztcdGlmICghZHN0KVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcdF9fYnVpbHRpbl9tZW1jcHkoZHN0LCBtZXRhX3dhbnQsIE1FVEFfU0laRSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBPcGVuaW5nIHNrYl9leHQgd2l0aG91dCBGX0NSRUFURSBvbiBhIGZyZXNoIHNrYiBzaG91bGQgZmFpbCAqL1xuJiM0MztTRUMoXCYjMzQ7dGNcJiMzNDspXG4mIzQzO2ludCB0Y19za2JfZXh0X25vX2FsbG9jKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4mIzQzO1xuJiM0MztcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSAhPSAtRU5PRU5UKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHR0ZXN0X3Bhc3MgPSB0cnVlO1xuJiM0MztcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBJbnZhbGlkIGZsYWdzIGFyZSByZWplY3RlZCAqL1xuJiM0MztTRUMoXCYjMzQ7dGNcJiMzNDspXG4mIzQzO2ludCB0Y19za2JfZXh0X2ludmFsaWRfZmxhZ3Moc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIH4wVUxMLCBcdTAwMjZtZXRhKSAhPSAtRUlOVkFMKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHR0ZXN0X3Bhc3MgPSB0cnVlO1xuJiM0MztcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBXaXRob3V0IEZfQ1JFQVRFIHRoZSBkeW5wdHIgaXMgcmVhZC1vbmx5ICovXG4mIzQzO1NFQyhcJiMzNDt0Y1wmIzM0OylcbiYjNDM7aW50IHRjX3NrYl9leHRfcmRvbmx5KHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbiYjNDM7e1xuJiM0MztcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4mIzQzO1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHQvKiBDcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBleHQgKi9cbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1xuJiM0MztcdC8qIFJlb3BlbiB3aXRob3V0IEZfQ1JFQVRFIC0tIHNob3VsZCBiZSByZWFkLW9ubHkgKi9cbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XG4mIzQzO1x0LyogVmVyaWZ5IHJlYWQtb25seTogd3JpdGVzIG11c3QgZmFpbCwgcmVhZHMgbXVzdCB3b3JrICovXG4mIzQzO1x0aWYgKCFicGZfZHlucHRyX2lzX3Jkb25seShcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XHRpZiAoIWJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHR0ZXN0X3Bhc3MgPSB0cnVlO1xuJiM0MztcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBEb3VibGUgYWxsb2M6IGRhdGEgZnJvbSBmaXJzdCBhbGxvYyBzdXJ2aXZlcyBzZWNvbmQgc2tiX2V4dF9hZGQgKi9cbiYjNDM7U0VDKFwmIzM0O3RjXCYjMzQ7KVxuJiM0MztpbnQgdGNfc2tiX2V4dF9kb3VibGVfYWxsb2Moc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1xuJiM0MztcdC8qIEZpcnN0IGFsbG9jICYjNDM7IHdyaXRlICovXG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcdGlmIChicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHQvKiBTZWNvbmQgYWxsb2MgLS0gc2tiX2V4dF9hZGQgcmV0dXJucyBleGlzdGluZyBleHQgKi9cbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHR0ZXN0X3Bhc3MgPSB0cnVlO1xuJiM0MztcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgX191OCBtZXRhX3plcm9bTUVUQV9TSVpFXSA9IHt9O1xuJiM0MztcbiYjNDM7Ym9vbCBjbG9uZV9jb3dfZG9uZTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE92ZXJ3cml0ZSBza2JfZXh0IG9uIHRoZSBjbG9uZSB2aWEgRl9DUkVBVEUgKENPVykgLS0gbXVzdCBub3QgYWZmZWN0IG9yaWdpbmFsLlxuJiM0MzsgKiBSdW5zIG9uIHRoZSBkdW1teSBpbmdyZXNzIChjbG9uZSBzaWRlKSwgc3luY2hyb25vdXNseSBkdXJpbmcgdGMgbWlycmVkLlxuJiM0MzsgKi9cbiYjNDM7U0VDKFwmIzM0O3RjXCYjMzQ7KVxuJiM0MztpbnQgdGNfc2tiX2V4dF9jbG9uZV9yZWRpcl9jb3coc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbiYjNDM7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHQvKiBaZXJvIG91dCB0aGUgY2xvbmUmIzM5O3MgZXh0IC0tIG11c3Qgbm90IGFmZmVjdCBvcmlnaW5hbCAqL1xuJiM0MztcdGlmIChicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV96ZXJvLCBNRVRBX1NJWkUsIDApKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHRjbG9uZV9jb3dfZG9uZSA9IHRydWU7XG4mIzQzO1x0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBWZXJpZnkgQ09XIGlzb2xhdGlvbiBhdCBrZnJlZV9za2IgdGltZTogb25jZSBjbG9uZV9jb3dfZG9uZSBpcyBzZXQsXG4mIzQzOyAqIGNoZWNrIHRoYXQgdGhlIG9yaWdpbmFsIHNrYiBzdGlsbCBoYXMgbWV0YV93YW50LlxuJiM0MzsgKi9cbiYjNDM7U0VDKFwmIzM0O3RwX2J0Zi9rZnJlZV9za2JcJiMzNDspXG4mIzQzO2ludCBCUEZfUFJPRyh0cF9rZnJlZV9za2JfY293X2NoZWNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuJiM0Mzt7XG4mIzQzO1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNsb25lX2Nvd19kb25lKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgMCwgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHR0ZXN0X3Bhc3MgPSB0cnVlO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztfX3UzMiBjbG9uZV9yZWRpcl9pZmluZGV4O1xuJiM0Mztib29sIHdyaXRlX2Jsb2NrZWQ7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBXcml0ZSBza2JfZXh0LCBjbG9uZSB0aGUgc2tiIHRvIGEgZGVsYXllZCBxZGlzYyBzbyB0aGUgY2xvbmUga2VlcHMgdGhlIGV4dFxuJiM0MzsgKiBibG9jayBzaGFyZWQsIHRoZW4gdHJ5IHRvIHdyaXRlIHRvIHRoZSBzYW1lIGR5bnB0ciBhZ2Fpbi4gVGhlIHdyaXRlIG11c3QgZmFpbFxuJiM0MzsgKiB3aXRoIC1FQlVTWS4gUmUtYWNxdWlyaW5nIHRoZSBkeW5wdHIgd2l0aCBGX0NSRUFURSBDT1dzIHRoZSBibG9jayBhbmRcbiYjNDM7ICogc3VjY2VlZHMuXG4mIzQzOyAqL1xuJiM0MztTRUMoXCYjMzQ7dGNcJiMzNDspXG4mIzQzO2ludCB0Y19za2JfZXh0X3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4mIzQzO1xuJiM0MztcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XG4mIzQzO1x0aWYgKGJwZl9jbG9uZV9yZWRpcmVjdChjdHgsIGNsb25lX3JlZGlyX2lmaW5kZXgsIDAgLyogZWdyZXNzICovKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XG4mIzQzO1x0LyogZXh0IG5vdyBzaGFyZWQgd2l0aCB0aGUgcXVldWVkIGNsb25lIC0tIHdyaXRlIG11c3QgZmFpbCAqL1xuJiM0MztcdGlmIChicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV96ZXJvLCBNRVRBX1NJWkUsIDApICE9IC1FQlVTWSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XG4mIzQzO1x0LyogUmUtYWNxdWlyaW5nIENPV3MgdGhlIGJsb2NrIC0tIHdyaXRlIG11c3Qgc3VjY2VlZCAqL1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfemVybywgTUVUQV9TSVpFLCAwKSlcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbiYjNDM7XG4mIzQzO1x0d3JpdGVfYmxvY2tlZCA9IHRydWU7XG4mIzQzO1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFNhbWUgYXMgYWJvdmUgYnV0IHVzaW5nIGJwZl9keW5wdHJfc2xpY2VfcmR3ci5cbiYjNDM7ICovXG4mIzQzO1NFQyhcJiMzNDt0Y1wmIzM0OylcbiYjNDM7aW50IHRjX3NrYl9leHRfc2xpY2Vfd3JpdGVfYWZ0ZXJfY2xvbmVfcmVkaXIoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbiYjNDM7XHR2b2lkICpzbGljZTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcdGlmIChicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2Nsb25lX3JlZGlyZWN0KGN0eCwgY2xvbmVfcmVkaXJfaWZpbmRleCwgMCAvKiBlZ3Jlc3MgKi8pKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcbiYjNDM7XHQvKiBleHQgbm93IHNoYXJlZCB3aXRoIHRoZSBxdWV1ZWQgY2xvbmUgLS0gc2xpY2UgbXVzdCBmYWlsICovXG4mIzQzO1x0c2xpY2UgPSBicGZfZHlucHRyX3NsaWNlX3Jkd3IoXHUwMDI2bWV0YSwgMCwgTlVMTCwgTUVUQV9TSVpFKTtcbiYjNDM7XHRpZiAoc2xpY2UpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1xuJiM0MztcdC8qIFJlLWFjcXVpcmluZyBDT1dzIHRoZSBibG9jayAtLSBzbGljZSBtdXN0IHN1Y2NlZWQgKi9cbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4mIzQzO1x0c2xpY2UgPSBicGZfZHlucHRyX3NsaWNlX3Jkd3IoXHUwMDI2bWV0YSwgMCwgTlVMTCwgTUVUQV9TSVpFKTtcbiYjNDM7XHRpZiAoIXNsaWNlKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuJiM0MztcdF9fYnVpbHRpbl9tZW1jcHkoc2xpY2UsIG1ldGFfemVybywgTUVUQV9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0d3JpdGVfYmxvY2tlZCA9IHRydWU7XG4mIzQzO1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlYWQgc2tiX2V4dCBmcm9tIGNncm91cC9za2IgaW5ncmVzcyAtLSB0ZXN0cyBjcm9zcy1ob29rIHN1cnZpdmFsICovXG4mIzQzO1NFQyhcJiMzNDtjZ3JvdXBfc2tiL2luZ3Jlc3NcJiMzNDspXG4mIzQzO2ludCBjZ3JwX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4mIzQzO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0dGVzdF9wYXNzID0gdHJ1ZTtcbiYjNDM7XHRyZXR1cm4gMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7X19iZTE2IHRhcmdldF9wb3J0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBUQ1BWNF9IRFJfT0ZGXHQoc2l6ZW9mKHN0cnVjdCBldGhoZHIpICYjNDM7IHNpemVvZihzdHJ1Y3QgaXBoZHIpKVxuJiM0MzsjZGVmaW5lIFRDUFY0X1NQT1JUX09GRlx0KFRDUFY0X0hEUl9PRkYgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgc291cmNlKSlcbiYjNDM7I2RlZmluZSBUQ1BWNF9EUE9SVF9PRkZcdChUQ1BWNF9IRFJfT0ZGICYjNDM7IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGRlc3QpKVxuJiM0MztcbiYjNDM7LyogV3JpdGUgc2tiX2V4dCBvbiBUQ1AgcGFja2V0cyB0by9mcm9tIHRhcmdldF9wb3J0ICovXG4mIzQzO1NFQyhcJiMzNDt0Y1wmIzM0OylcbiYjNDM7aW50IHRjX3NrYl9leHRfd3JpdGVfcG9ydChzdHJ1Y3QgX19za19idWZmICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcdF9fYmUxNiBzcG9ydCwgZHBvcnQ7XG4mIzQzO1xuJiM0MztcdGlmIChjdHgtXHUwMDNlcHJvdG9jb2wgIT0gX19icGZfY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4mIzQzO1x0aWYgKGJwZl9za2JfbG9hZF9ieXRlcyhjdHgsIFRDUFY0X1NQT1JUX09GRiwgXHUwMDI2c3BvcnQsIHNpemVvZihzcG9ydCkpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4mIzQzO1x0aWYgKGJwZl9za2JfbG9hZF9ieXRlcyhjdHgsIFRDUFY0X0RQT1JUX09GRiwgXHUwMDI2ZHBvcnQsIHNpemVvZihkcG9ydCkpKVxuJiM0MztcdFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4mIzQzO1x0aWYgKHNwb3J0ICE9IHRhcmdldF9wb3J0IFx1MDAyNlx1MDAyNiBkcG9ydCAhPSB0YXJnZXRfcG9ydClcbiYjNDM7XHRcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbiYjNDM7XHRicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVhZCBza2JfZXh0IGZyb20gc29ja19vcHMgcGFzc2l2ZSBlc3RhYmxpc2hlZCAtLSB0ZXN0cyBUQyAtXHUwMDNlIHNvY2tfb3BzIHBhdGggKi9cbiYjNDM7U0VDKFwmIzM0O3NvY2tvcHNcJiMzNDspXG4mIzQzO2ludCBza29wc19za2JfZXh0X3JlYWQoc3RydWN0IGJwZl9zb2NrX29wcyAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9zb2NrX29wc19rZXJuICprY3R4O1xuJiM0MztcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4mIzQzO1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbiYjNDM7XHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xuJiM0MztcbiYjNDM7XHRpZiAoY3R4LVx1MDAzZW9wICE9IEJQRl9TT0NLX09QU19QQVNTSVZFX0VTVEFCTElTSEVEX0NCKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1xuJiM0MztcdGtjdHggPSBicGZfY2FzdF90b19rZXJuX2N0eChjdHgpO1xuJiM0MztcdHNrYiA9IGtjdHgtXHUwMDNlc2tiO1xuJiM0MztcdGlmICghc2tiKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgMCwgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcbiYjNDM7XHR0ZXN0X3Bhc3MgPSB0cnVlO1xuJiM0MztcdHJldHVybiAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBSZWFkIHNrYl9leHQgZnJvbSBMU00gaW5ldF9jb25uX2VzdGFibGlzaGVkIC0tIHRlc3RzIFRDIC1cdTAwM2UgTFNNIHBhdGggKi9cbiYjNDM7U0VDKFwmIzM0O2xzbS9pbmV0X2Nvbm5fZXN0YWJsaXNoZWRcJiMzNDspXG4mIzQzO2ludCBCUEZfUFJPRyhsc21fc2tiX2V4dF9yZWFkLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4mIzQzO3tcbiYjNDM7XHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4mIzQzO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgMCwgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHR0ZXN0X3Bhc3MgPSB0cnVlO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBSZWFkIHNrYl9leHQgZnJvbSBzb2NrZXQgZmlsdGVyIC0tIHRlc3RzIFRDIC1cdTAwM2Ugc2tfZmlsdGVyIHBhdGggKi9cbiYjNDM7U0VDKFwmIzM0O3NvY2tldFwmIzM0OylcbiYjNDM7aW50IHNrX2ZpbHRlcl9za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdHRlc3RfcGFzcyA9IHRydWU7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gY3R4LVx1MDAzZWxlbjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogV3JpdGUgc2tiX2V4dCBmcm9tIGNncm91cC9za2IgZWdyZXNzICovXG4mIzQzO1NFQyhcJiMzNDtjZ3JvdXBfc2tiL2VncmVzc1wmIzM0OylcbiYjNDM7aW50IGNncnBfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1x0YnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDE7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlYWQgc2tiX2V4dCBmcm9tIHRwX2J0Zi9rZnJlZV9za2IgLS0gdGVzdHMgc3Vydml2YWwgdW50aWwgc2tiIGZyZWUgKi9cbiYjNDM7U0VDKFwmIzM0O3RwX2J0Zi9rZnJlZV9za2JcJiMzNDspXG4mIzQzO2ludCBCUEZfUFJPRyh0cF9rZnJlZV9za2JfZXh0X3JlYWQsIHN0cnVjdCBza19idWZmICpza2IpXG4mIzQzO3tcbiYjNDM7XHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4mIzQzO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgMCwgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHR0ZXN0X3Bhc3MgPSB0cnVlO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsjZGVmaW5lIE5GX0FDQ0VQVCAxXG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7bmV0ZmlsdGVyXCYjMzQ7KVxuJiM0MztpbnQgbmZfc2tiX2V4dF9yZWFkKHN0cnVjdCBicGZfbmZfY3R4ICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgX19za19idWZmICpza2IgPSAoc3RydWN0IF9fc2tfYnVmZiAqKWN0eC1cdTAwM2Vza2I7XG4mIzQzO1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoIXNrYilcbiYjNDM7XHRcdHJldHVybiBORl9BQ0NFUFQ7XG4mIzQzO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChza2IsIDAsIDAsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIE5GX0FDQ0VQVDtcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbiYjNDM7XHRcdHJldHVybiBORl9BQ0NFUFQ7XG4mIzQzO1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuJiM0MztcdFx0cmV0dXJuIE5GX0FDQ0VQVDtcbiYjNDM7XG4mIzQzO1x0dGVzdF9wYXNzID0gdHJ1ZTtcbiYjNDM7XHRyZXR1cm4gTkZfQUNDRVBUO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7bHd0X2luXCYjMzQ7KVxuJiM0MztpbnQgbHd0X2luX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4mIzQzO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIEJQRl9PSztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbiYjNDM7XHRcdHJldHVybiBCUEZfT0s7XG4mIzQzO1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuJiM0MztcdFx0cmV0dXJuIEJQRl9PSztcbiYjNDM7XG4mIzQzO1x0dGVzdF9wYXNzID0gdHJ1ZTtcbiYjNDM7XHRyZXR1cm4gQlBGX09LO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7bHd0X291dFwmIzM0OylcbiYjNDM7aW50IGx3dF9vdXRfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4mIzQzO1x0XHRyZXR1cm4gQlBGX09LO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBCUEZfT0s7XG4mIzQzO1x0YnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgQVJSQVlfU0laRShtZXRhX3dhbnQpLCAwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIEJQRl9PSztcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O2x3dF94bWl0XCYjMzQ7KVxuJiM0MztpbnQgbHd0X3htaXRfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4mIzQzO1x0XHRyZXR1cm4gQlBGX09LO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBCUEZfT0s7XG4mIzQzO1x0YnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgQVJSQVlfU0laRShtZXRhX3dhbnQpLCAwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIEJQRl9PSztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVhZCBza2JfZXh0IGZyb20gc2VnNmxvY2FsIEVuZC5CUEYgLS0gdGVzdHMgVEMgLVx1MDAzZSBzZWc2bG9jYWwgcGF0aCAqL1xuJiM0MztTRUMoXCYjMzQ7bHd0X3NlZzZsb2NhbFwmIzM0OylcbiYjNDM7aW50IHNlZzZsb2NhbF9za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBCUEZfT0s7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4mIzQzO1x0XHRyZXR1cm4gQlBGX09LO1xuJiM0MztcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbiYjNDM7XHRcdHJldHVybiBCUEZfT0s7XG4mIzQzO1xuJiM0MztcdHRlc3RfcGFzcyA9IHRydWU7XG4mIzQzO1x0cmV0dXJuIEJQRl9PSztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVhZCBza2JfZXh0IGZyb20gc2tfc2tiIHN0cmVhbSB2ZXJkaWN0IGhvb2sgKi9cbiYjNDM7U0VDKFwmIzM0O3NrX3NrYi9zdHJlYW1fdmVyZGljdFwmIzM0OylcbiYjNDM7aW50IHNrX3NrYl9za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiBTS19QQVNTO1xuJiM0MztcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuJiM0MztcdFx0cmV0dXJuIFNLX1BBU1M7XG4mIzQzO1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuJiM0MztcdFx0cmV0dXJuIFNLX1BBU1M7XG4mIzQzO1xuJiM0MztcdHRlc3RfcGFzcyA9IHRydWU7XG4mIzQzO1x0cmV0dXJuIFNLX1BBU1M7XG4mIzQzO31cbiYjNDM7XG4gY2hhciBfbGljZW5zZVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfc2tiX2V4dC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX3NrYl9leHQuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmMyNjExYzkzMTVhYTdcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9za2JfZXh0LmNcbkBAIC0wLDAgJiM0MzsxLDEyMiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1saW51eC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9taXNjLmhcJiMzNDtcbiYjNDM7XG4mIzQzO19fdTY0IGZsYWdzO1xuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3RjXCYjMzQ7KVxuJiM0MztfX2Rlc2NyaXB0aW9uKFwmIzM0O3NrYl9leHQgc2xpY2UgaXMgaW52YWxpZGF0ZWQgYnkgYnBmX2Nsb25lX3JlZGlyZWN0XCYjMzQ7KVxuJiM0MztfX2ZhaWx1cmVcbiYjNDM7aW50IHNrYl9leHRfc3RhbGVfc2xpY2VfYWZ0ZXJfY2xvbmVfcmVkaXJlY3Qoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbiYjNDM7XHRfX3U4ICpzbGljZTtcbiYjNDM7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHNsaWNlID0gYnBmX2R5bnB0cl9zbGljZV9yZHdyKFx1MDAyNm1ldGEsIDAsIE5VTEwsIDgpO1xuJiM0MztcdGlmICghc2xpY2UpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0YnBmX2Nsb25lX3JlZGlyZWN0KGN0eCwgMSwgMCk7XG4mIzQzO1xuJiM0MztcdC8qIFN0YWxlOiB0aGUgY2xvbmUgc2hhcmVzIHRoZSBleHQgYmxvY2sgdGhlIHNsaWNlIHBvaW50cyBpbnRvLiAqL1xuJiM0MztcdCpzbGljZSA9IDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7dGNcJiMzNDspXG4mIzQzO19fZGVzY3JpcHRpb24oXCYjMzQ7c2tiX2V4dCBzbGljZSBpcyBpbnZhbGlkYXRlZCB3aGVuIGV4dCBpcyByZS1vcGVuZWQgd2l0aCBGX0NSRUFURVwmIzM0OylcbiYjNDM7X19mYWlsdXJlXG4mIzQzO2ludCBza2JfZXh0X3N0YWxlX3NsaWNlX2FmdGVyX3JlY3JlYXRlKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIGQxLCBkMjtcbiYjNDM7XHRfX3U4ICpzbGljZTtcbiYjNDM7XG4mIzQzO1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2ZDEpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHNsaWNlID0gYnBmX2R5bnB0cl9zbGljZShcdTAwMjZkMSwgMCwgTlVMTCwgOCk7XG4mIzQzO1x0aWYgKCFzbGljZSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHQvKiBNYXkgQ09XIHRoZSBleHQgYmxvY2ssIGxlYXZpbmcgdGhlIHNsaWNlIHBvaW50aW5nIGF0IHRoZSBvbGQgb25lLiAqL1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZkMikpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuICpzbGljZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3RwX2J0Zi9rZnJlZV9za2JcJiMzNDspXG4mIzQzO19fZGVzY3JpcHRpb24oXCYjMzQ7Rl9DUkVBVEUgaXMgcmVqZWN0ZWQgaW4gdHJhY2luZyBwcm9ncmFtc1wmIzM0OylcbiYjNDM7X19mYWlsdXJlIF9fbXNnKFwmIzM0O2lzIG5vdCBhbGxvd2VkIGluIGxzbS90cmFjaW5nIHByb2dyYW1zXCYjMzQ7KVxuJiM0MztpbnQgQlBGX1BST0codHBfc2tiX2V4dF9jcmVhdGUsIHN0cnVjdCBza19idWZmICpza2IpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsXG4mIzQzO1x0XHRcdFx0ICAgIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3RwX2J0Zi9rZnJlZV9za2JcJiMzNDspXG4mIzQzO19fZGVzY3JpcHRpb24oXCYjMzQ7bm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZCBpbiB0cmFjaW5nIHByb2dyYW1zXCYjMzQ7KVxuJiM0MztfX2ZhaWx1cmUgX19tc2coXCYjMzQ7bXVzdCBiZSBhIGtub3duIGNvbnN0YW50XCYjMzQ7KVxuJiM0MztpbnQgQlBGX1BST0codHBfc2tiX2V4dF92YXJfZmxhZ3MsIHN0cnVjdCBza19idWZmICpza2IpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsIGZsYWdzLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3RjXCYjMzQ7KVxuJiM0MztfX2Rlc2NyaXB0aW9uKFwmIzM0O25vbi1jb25zdGFudCBmbGFncyBhcmUgcmVqZWN0ZWRcJiMzNDspXG4mIzQzO19fZmFpbHVyZSBfX21zZyhcJiMzNDttdXN0IGJlIGEga25vd24gY29uc3RhbnRcJiMzNDspXG4mIzQzO2ludCBza2JfZXh0X3Zhcl9mbGFncyhzdHJ1Y3QgX19za19idWZmICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBmbGFncywgXHUwMDI2bWV0YSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtsc20vaW5ldF9jb25uX2VzdGFibGlzaGVkXCYjMzQ7KVxuJiM0MztfX2Rlc2NyaXB0aW9uKFwmIzM0O0ZfQ1JFQVRFIGlzIHJlamVjdGVkIGluIExTTSBwcm9ncmFtc1wmIzM0OylcbiYjNDM7X19mYWlsdXJlIF9fbXNnKFwmIzM0O2lzIG5vdCBhbGxvd2VkIGluIGxzbS90cmFjaW5nIHByb2dyYW1zXCYjMzQ7KVxuJiM0MztpbnQgQlBGX1BST0cobHNtX3NrYl9leHRfY3JlYXRlLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsXG4mIzQzO1x0XHRcdFx0ICAgIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O2xzbS9pbmV0X2Nvbm5fZXN0YWJsaXNoZWRcJiMzNDspXG4mIzQzO19fZGVzY3JpcHRpb24oXCYjMzQ7bm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZCBpbiBMU00gcHJvZ3JhbXNcJiMzNDspXG4mIzQzO19fZmFpbHVyZSBfX21zZyhcJiMzNDttdXN0IGJlIGEga25vd24gY29uc3RhbnRcJiMzNDspXG4mIzQzO2ludCBCUEZfUFJPRyhsc21fc2tiX2V4dF92YXJfZmxhZ3MsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4mIzQzO1xuJiM0MztcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgZmxhZ3MsIFx1MDAyNm1ldGEpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE1OjIzPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TS0JfRVhUJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O05FVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9keW5wdHJfZnJvbV9za2JfZXh0JiMzNDssCiAgICAmIzM0O2JwZl9za2JfZXh0X3BvaW50ZXImIzM0OywKICAgICYjMzQ7X19icGZfc2tiX2V4dF9sb2FkX2J5dGVzJiMzNDssCiAgICAmIzM0O19fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMmIzM0OywKICAgICYjMzQ7c2tiX2V4dF9zY3J1YiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHNrX2J1ZmYgZXh0ZW5zaW9uIGZvciBCUEYgbWV0YWRhdGEgKENPTkZJR19CUEZfU0tCX0VYVCkgYWxvbmcgd2l0aCB0aGUgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQga2Z1bmMgYW5kIHJlbGF0ZWQgZHlucHRyIGhhbmRsaW5nIGluIGhlbHBlcnMgYW5kIHRoZSBCUEYgdmVyaWZpZXIuIEl0IGFsc28gbW9kaWZpZXMgcGFja2V0IHNjcnViYmluZyBhbmQgZXh0ZW5zaW9uIGxpZmV0aW1lIGxvZ2ljIGluIGNvcmUgbmV0d29ya2luZyBwYXRocy4gVGhlc2UgY2hhbmdlcyBhcmUgaW4gcmVhY2hhYmxlIGNvcmUgc3Vic3lzdGVtcyBhbmQgd2FycmFudCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYTBlMDQ1YmQ1OTA3ZDI2ZmU2ZWRjZTc2ZjFmMjE2Y2MyNDI3MGE0NwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgU2VwIDEwIDE1OjIzOjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmgKaW5kZXggZmZhNTYyNjQxMWFjMi4uNmMzNWY4Yzc0MTQ3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JwZi5oCkBAIC0xNDgxLDYgJiM0MzsxNDgxLDggQEAgZW51bSBicGZfZHlucHRyX3R5cGUgewogCUJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQSwKIAkvKiBVbmRlcmx5aW5nIGRhdGEgaXMgYSBmaWxlICovCiAJQlBGX0RZTlBUUl9UWVBFX0ZJTEUsCiYjNDM7CS8qIFVuZGVybHlpbmcgZGF0YSBpcyBhIGJwZl9za2JfZXh0IGNodW5rICovCiYjNDM7CUJQRl9EWU5QVFJfVFlQRV9TS0JfRVhULAogfTsKIAogaW50IGJwZl9keW5wdHJfY2hlY2tfc2l6ZSh1NjQgc2l6ZSk7CkBAIC00MjE2LDQgJiM0Mzs0MjE4LDEyIEBAIHN0YXRpYyBpbmxpbmUgaW50IGJwZl9tYXBfY2hlY2tfb3BfZmxhZ3Moc3RydWN0IGJwZl9tYXAgKm1hcCwgdTY0IGZsYWdzLCB1NjQgYWxsCiAJcmV0dXJuIDA7CiB9CiAKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUCiYjNDM7CiYjNDM7c3RydWN0IGJwZl9za2JfZXh0IHsKJiM0MzsJdTggYnVmW0NPTkZJR19CUEZfU0tCX0VYVF9TSVpFXSBfX2FsaWduZWQoOCk7CiYjNDM7fTsKJiM0MzsKJiM0MzsjZW5kaWYgLyogQ09ORklHX0JQRl9TS0JfRVhUICovCiYjNDM7CiAjZW5kaWYgLyogX0xJTlVYX0JQRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaAppbmRleCA0YTliYzZhODQ4ZjJlLi5lOWE5MzQ5MjI1M2JhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKQEAgLTE5NTgsNCAmIzQzOzE5NTgsMzEgQEAgc3RhdGljIGlubGluZSB2b2lkICpicGZfc2tiX21ldGFfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0KQogfQogI2VuZGlmIC8qIENPTkZJR19ORVQgKi8KIAomIzQzOyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFQKJiM0Mzt2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIGJvb2wgd3IpOwomIzQzO2ludCBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCwgdm9pZCAqdG8sCiYjNDM7CQkJICAgICB1MzIgbGVuKTsKJiM0MztpbnQgX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCBjb25zdCB2b2lkICpmcm9tLAomIzQzOwkJCSAgICAgIHUzMiBsZW4sIHU2NCBmbGFncyk7CiYjNDM7I2Vsc2UgLyogQ09ORklHX0JQRl9TS0JfRVhUICovCiYjNDM7c3RhdGljIGlubGluZSB2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsCiYjNDM7CQkJCQlib29sIHdyKQomIzQzO3sKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAomIzQzOwkJCQkJICAgdTMyIG9mZnNldCwgdm9pZCAqdG8sIHUzMiBsZW4pCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IF9fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCwKJiM0MzsJCQkJCSAgICBjb25zdCB2b2lkICpmcm9tLCB1MzIgbGVuLAomIzQzOwkJCQkJICAgIHU2NCBmbGFncykKJiM0Mzt7CiYjNDM7CXJldHVybiAtRU9QTk9UU1VQUDsKJiM0Mzt9CiYjNDM7I2VuZGlmIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqLwomIzQzOwogI2VuZGlmIC8qIF9fTElOVVhfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNDIxZjZmYzQ1NDUxMS4uNTA5ZDQ0NzE3OWUxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC01MDYxLDYgJiM0Mzs1MDYxLDkgQEAgZW51bSBza2JfZXh0X2lkIHsKICNlbmRpZgogI2lmIElTX0VOQUJMRUQoQ09ORklHX0NBTikKIAlTS0JfRVhUX0NBTiwKJiM0MzsjZW5kaWYKJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NLQl9FWFQpCiYjNDM7CVNLQl9FWFRfQlBGLAogI2VuZGlmCiAJU0tCX0VYVF9OVU0sIC8qIG11c3QgYmUgbGFzdCAqLwogfTsKQEAgLTUwODgsNiAmIzQzOzUwOTEsNyBAQCB2b2lkICpfX3NrYl9leHRfc2V0KHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZCwKIHZvaWQgKnNrYl9leHRfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZCk7CiB2b2lkIF9fc2tiX2V4dF9kZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBza2JfZXh0X2lkIGlkKTsKIHZvaWQgX19za2JfZXh0X3B1dChzdHJ1Y3Qgc2tiX2V4dCAqZXh0KTsKJiM0Mzt2b2lkIHNrYl9leHRfc2NydWIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNTE1MywxNCAmIzQzOzUxNTcsMjMgQEAgc3RhdGljIGlubGluZSBib29sIHNrYl9oYXNfZXh0ZW5zaW9ucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiB1bmxpa2VseShza2ItJmd0O2FjdGl2ZV9leHRlbnNpb25zKTsKIH0KJiM0MzsKJiM0MzsvKiBUcnVlIGlmIHRoZSBleHRlbnNpb24gYmxvY2sgaXMgc2hhcmVkIHdpdGggY2xvbmVkIHNrYnMgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2V4dF9zaGFyZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKJiM0Mzt7CiYjNDM7CXJldHVybiBza2ItJmd0O2FjdGl2ZV9leHRlbnNpb25zICZhbXA7JmFtcDsKJiM0MzsJICAgICAgIHJlZmNvdW50X3JlYWQoJmFtcDtza2ItJmd0O2V4dGVuc2lvbnMtJmd0O3JlZmNudCkgIT0gMTsKJiM0Mzt9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX2V4dF9wdXQoc3RydWN0IHNrYl9leHQgKmV4dCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikge30KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9zY3J1YihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfZGVsKHN0cnVjdCBza19idWZmICpza2IsIGludCB1bnVzZWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgX19za2JfZXh0X2NvcHkoc3RydWN0IHNrX2J1ZmYgKmQsIGNvbnN0IHN0cnVjdCBza19idWZmICpzKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfY29weShzdHJ1Y3Qgc2tfYnVmZiAqZHN0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqcykge30KIHN0YXRpYyBpbmxpbmUgYm9vbCBza2JfaGFzX2V4dGVuc2lvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYikgeyByZXR1cm4gZmFsc2U7IH0KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2V4dF9zaGFyZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikgeyByZXR1cm4gZmFsc2U7IH0KICNlbmRpZiAvKiBDT05GSUdfU0tCX0VYVEVOU0lPTlMgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIG5mX3Jlc2V0X2N0KHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgKaW5kZXggNzMyYjM1Y2MwOGQxYy4uYTQ4Mzk5YWZlNDk0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaApAQCAtNzgyNSw0ICYjNDM7NzgyNSw5IEBAIHN0cnVjdCBicGZfaW5zbl9hcnJheV92YWx1ZSB7CiAJX191MzIgOjMyOwogfTsKIAomIzQzOy8qIEZsYWdzIHRvIGNvbnRyb2wgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKSBiZWhhdmlvci4gKi8KJiM0MztlbnVtIHsKJiM0MzsJQlBGX1NLQl9FWFRfRl9DUkVBVEUgPSAoMVVMTCAmbHQ7Jmx0OyAwKSwKJiM0Mzt9OwomIzQzOwogI2VuZGlmIC8qIF9VQVBJX19MSU5VWF9CUEZfSF9fICovCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hlbHBlcnMuYyBiL2tlcm5lbC9icGYvaGVscGVycy5jCmluZGV4IGIzY2M1YzhmYzg3NTYuLmNmY2I3OTM5OWVkMGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvaGVscGVycy5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvaGVscGVycy5jCkBAIC0xOTI2LDYgJiM0MzsxOTI2LDggQEAgc3RhdGljIGludCBfX2JwZl9keW5wdHJfcmVhZCh2b2lkICpkc3QsIHU2NCBsZW4sIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnMKIAkJcmV0dXJuIDA7CiAJY2FzZSBCUEZfRFlOUFRSX1RZUEVfRklMRToKIAkJcmV0dXJuIGJwZl9maWxlX2ZldGNoX2J5dGVzKHNyYy0mZ3Q7ZGF0YSwgb2Zmc2V0LCBkc3QsIGxlbik7CiYjNDM7CWNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQ6CiYjNDM7CQlyZXR1cm4gX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzKHNyYy0mZ3Q7ZGF0YSwgc3JjLSZndDtvZmZzZXQgJiM0Mzsgb2Zmc2V0LCBkc3QsIGxlbik7CiAJZGVmYXVsdDoKIAkJV0FSTl9PTkNFKHRydWUsICYjMzQ7YnBmX2R5bnB0cl9yZWFkOiB1bmtub3duIGR5bnB0ciB0eXBlICVkXG4mIzM0OywgdHlwZSk7CiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTk4NSw2ICYjNDM7MTk4Nyw4IEBAIGludCBfX2JwZl9keW5wdHJfd3JpdGUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqZHN0LCB1NjQgb2Zmc2V0LCB2b2lkICpzcmMsCiAJY2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEE6CiAJCXJldHVybiBfX2JwZl9za2JfbWV0YV9zdG9yZV9ieXRlcyhkc3QtJmd0O2RhdGEsIGRzdC0mZ3Q7b2Zmc2V0ICYjNDM7IG9mZnNldCwgc3JjLAogCQkJCQkJICBsZW4sIGZsYWdzKTsKJiM0MzsJY2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDoKJiM0MzsJCXJldHVybiBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKGRzdC0mZ3Q7ZGF0YSwgZHN0LSZndDtvZmZzZXQgJiM0Mzsgb2Zmc2V0LCBzcmMsIGxlbiwgZmxhZ3MpOwogCWRlZmF1bHQ6CiAJCVdBUk5fT05DRSh0cnVlLCAmIzM0O2JwZl9keW5wdHJfd3JpdGU6IHVua25vd24gZHlucHRyIHR5cGUgJWRcbiYjMzQ7LCB0eXBlKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yMDMyLDYgJiM0MzsyMDM2LDcgQEAgQlBGX0NBTExfMyhicGZfZHlucHRyX2RhdGEsIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKiwgcHRyLCB1NjQsIG9mZnNldCwgdTYKIAljYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0I6CiAJY2FzZSBCUEZfRFlOUFRSX1RZUEVfWERQOgogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBOgomIzQzOwljYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOgogCQkvKiBza2IgYW5kIHhkcCBkeW5wdHJzIHNob3VsZCB1c2UgYnBmX2R5bnB0cl9zbGljZSAvIGJwZl9keW5wdHJfc2xpY2VfcmR3ciAqLwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgpAQCAtMzA0OCw4ICYjNDM7MzA1Myw4IEBAIF9fYnBmX2tmdW5jIHN0cnVjdCB0YXNrX3N0cnVjdCAqYnBmX3Rhc2tfZnJvbV92cGlkKHMzMiB2cGlkKQogICogcHJvdmlkZWQgYnVmZmVyLCB3aXRoIGl0cyBjb250ZW50cyBjb250YWluaW5nIHRoZSBkYXRhLCBpZiB1bmFibGUgdG8gb2J0YWluCiAgKiBkaXJlY3QgcG9pbnRlcikKICAqLwotX19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCwKLQkJCQkgICB2b2lkICpidWZmZXJfX251bGxhYmxlLCB1NjQgYnVmZmVyX19zemspCiYjNDM7c3RhdGljIHZvaWQgKl9fYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCwKJiM0MzsJCQkJdm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prLCBib29sIHdyKQogewogCWNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0ciA9IChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICopcDsKIAllbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlOwpAQCAtMzA4Nyw2ICYjNDM7MzA5Miw4IEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsCiAJfQogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBOgogCQlyZXR1cm4gYnBmX3NrYl9tZXRhX3BvaW50ZXIocHRyLSZndDtkYXRhLCBwdHItJmd0O29mZnNldCAmIzQzOyBvZmZzZXQpOwomIzQzOwljYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOgomIzQzOwkJcmV0dXJuIGJwZl9za2JfZXh0X3BvaW50ZXIocHRyLSZndDtkYXRhLCBwdHItJmd0O29mZnNldCAmIzQzOyBvZmZzZXQsIHdyKTsKIAljYXNlIEJQRl9EWU5QVFJfVFlQRV9GSUxFOgogCQllcnIgPSBicGZfZmlsZV9mZXRjaF9ieXRlcyhwdHItJmd0O2RhdGEsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemspOwogCQlyZXR1cm4gZXJyID8gTlVMTCA6IGJ1ZmZlcl9fbnVsbGFibGU7CkBAIC0zMDk2LDYgJiM0MzszMTAzLDEzIEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsCiAJfQogfQogCiYjNDM7X19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCwKJiM0MzsJCQkJICAgdm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prKQomIzQzO3sKJiM0MzsJcmV0dXJuIF9fYnBmX2R5bnB0cl9zbGljZShwLCBvZmZzZXQsIGJ1ZmZlcl9fbnVsbGFibGUsIGJ1ZmZlcl9fc3prLAomIzQzOwkJCQkgIGZhbHNlKTsKJiM0Mzt9CiYjNDM7CiAvKioKICAqIGJwZl9keW5wdHJfc2xpY2VfcmR3cigpIC0gT2J0YWluIGEgd3JpdGFibGUgcG9pbnRlciB0byB0aGUgZHlucHRyIGRhdGEuCiAgKiBAcDogVGhlIGR5bnB0ciB3aG9zZSBkYXRhIHNsaWNlIHRvIHJldHJpZXZlCkBAIC0zMTY4LDcgJiM0MzszMTgyLDggQEAgX19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZV9yZHdyKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgb2Zmc2V0LAogCSAqIHdpbGwgYmUgY29waWVkIG91dCBpbnRvIHRoZSBidWZmZXIgYW5kIHRoZSB1c2VyIHdpbGwgbmVlZCB0byBjYWxsCiAJICogYnBmX2R5bnB0cl93cml0ZSgpIHRvIGNvbW1pdCBjaGFuZ2VzLgogCSAqLwotCXJldHVybiBicGZfZHlucHRyX3NsaWNlKHAsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemspOwomIzQzOwlyZXR1cm4gX19icGZfZHlucHRyX3NsaWNlKHAsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemssCiYjNDM7CQkJCSAgdHJ1ZSk7CiB9CiAKIF9fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2FkanVzdChzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IHN0YXJ0LCB1NjQgZW5kKQpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9sb2cuYyBiL2tlcm5lbC9icGYvbG9nLmMKaW5kZXggNTg5NzcwY2EzZDNhMC4uMDJmOWJmNzJhYzA3YyAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9sb2cuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2xvZy5jCkBAIC00NjIsNiAmIzQzOzQ2Miw4IEBAIGNvbnN0IGNoYXIgKmR5bnB0cl90eXBlX3N0cihlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlKQogCQlyZXR1cm4gJiMzNDtza2JfbWV0YSYjMzQ7OwogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6CiAJCXJldHVybiAmIzM0O2ZpbGUmIzM0OzsKJiM0MzsJY2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDoKJiM0MzsJCXJldHVybiAmIzM0O3NrYl9leHQmIzM0OzsKIAljYXNlIEJQRl9EWU5QVFJfVFlQRV9JTlZBTElEOgogCQlyZXR1cm4gJiMzNDsmbHQ7aW52YWxpZCZndDsmIzM0OzsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jCmluZGV4IGU0MjFlYTJiODBjM2EuLmU4MmUwYjRkZDJjZTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTYyMSw2ICYjNDM7NjIxLDcgQEAgc3RhdGljIGVudW0gYnBmX3R5cGVfZmxhZyBnZXRfZHlucHRyX3R5cGVfZmxhZyhlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlKQogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX1hEUDoKIAkJcmV0dXJuIERZTlBUUl9UWVBFX1hEUDsKIAljYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQToKJiM0MzsJY2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDoKIAkJcmV0dXJuIERZTlBUUl9UWVBFX1NLQl9NRVRBOwogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6CiAJCXJldHVybiBEWU5QVFJfVFlQRV9GSUxFOwpAQCAtNTg5MCw2ICYjNDM7NTg5MSwxMCBAQCBCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpIHsKIAlzdHJ1Y3QgZmlsZSAqdm1fZmlsZTsKIH07CiAKJiM0MztCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgYnBmX3NvY2tfb3BzX2tlcm4pIHsKJiM0MzsJc3RydWN0IHNrX2J1ZmYgKnNrYjsKJiM0Mzt9OwomIzQzOwogc3RhdGljIGJvb2wgdHlwZV9pc19yY3Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAkJCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsCiAJCQljb25zdCBjaGFyICpmaWVsZF9uYW1lLCB1MzIgYnRmX2lkKQpAQCAtNTkzMiw2ICYjNDM7NTkzNyw3IEBAIHN0YXRpYyBib29sIHR5cGVfaXNfdHJ1c3RlZF9vcl9udWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCiAJQlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgc29ja2V0KSk7CiAJQlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgZGVudHJ5KSk7CiAJQlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpKTsKJiM0MzsJQlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgYnBmX3NvY2tfb3BzX2tlcm4pKTsKIAogCXJldHVybiBidGZfbmVzdGVkX3R5cGVfaXNfdHJ1c3RlZCgmYW1wO2Vudi0mZ3Q7bG9nLCByZWcsIGZpZWxkX25hbWUsIGJ0Zl9pZCwKIAkJCQkJICAmIzM0O19fc2FmZV90cnVzdGVkX29yX251bGwmIzM0Oyk7CkBAIC0xMTYxNSw2ICYjNDM7MTE2MjEsNyBAQCBlbnVtIHNwZWNpYWxfa2Z1bmNfdHlwZSB7CiAJS0ZfYnBmX2R5bnB0cl9mcm9tX3hkcCwKIAlLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGEsCiAJS0ZfYnBmX3hkcF9wdWxsX2RhdGEsCiYjNDM7CUtGX2JwZl9keW5wdHJfZnJvbV9za2JfZXh0LAogCUtGX2JwZl9keW5wdHJfc2xpY2UsCiAJS0ZfYnBmX2R5bnB0cl9zbGljZV9yZHdyLAogCUtGX2JwZl9keW5wdHJfY2xvbmUsCkBAIC0xMTY5Miw2ICYjNDM7MTE2OTksMTEgQEAgQlRGX0lEX1VOVVNFRAogQlRGX0lEX1VOVVNFRAogQlRGX0lEX1VOVVNFRAogI2VuZGlmCiYjNDM7I2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVAomIzQzO0JURl9JRChmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCkKJiM0MzsjZWxzZQomIzQzO0JURl9JRF9VTlVTRUQKJiM0MzsjZW5kaWYKIEJURl9JRChmdW5jLCBicGZfZHlucHRyX3NsaWNlKQogQlRGX0lEKGZ1bmMsIGJwZl9keW5wdHJfc2xpY2VfcmR3cikKIEJURl9JRChmdW5jLCBicGZfZHlucHRyX2Nsb25lKQpAQCAtMTE4MjQsNyAmIzQzOzExODM2LDggQEAgc3RhdGljIGJvb2wgaXNfa2Z1bmNfYnBmX3ByZWVtcHRfZW5hYmxlKHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSkKIAogYm9vbCBicGZfaXNfa2Z1bmNfcGt0X2NoYW5naW5nKHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSkKIHsKLQlyZXR1cm4gbWV0YS0mZ3Q7ZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3hkcF9wdWxsX2RhdGFdOwomIzQzOwlyZXR1cm4gbWV0YS0mZ3Q7ZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3hkcF9wdWxsX2RhdGFdIHx8CiYjNDM7CSAgICAgICBtZXRhLSZndDtmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX2V4dF07CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEyODM1LDcgJiM0MzsxMjg0OCw4IEBAIHN0YXRpYyBpbnQgY2hlY2tfa2Z1bmNfYXJncyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21lCiAJCQkJZHlucHRyX2FyZ190eXBlIHw9IERZTlBUUl9UWVBFX1NLQjsKIAkJCX0gZWxzZSBpZiAobWV0YS0mZ3Q7ZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX3hkcF0pIHsKIAkJCQlkeW5wdHJfYXJnX3R5cGUgfD0gRFlOUFRSX1RZUEVfWERQOwotCQkJfSBlbHNlIGlmIChtZXRhLSZndDtmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGFdKSB7CiYjNDM7CQkJfSBlbHNlIGlmIChtZXRhLSZndDtmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGFdIHx8CiYjNDM7CQkJCSAgIG1ldGEtJmd0O2Z1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV9za2JfZXh0XSkgewogCQkJCWR5bnB0cl9hcmdfdHlwZSB8PSBEWU5QVFJfVFlQRV9TS0JfTUVUQTsKIAkJCX0gZWxzZSBpZiAobWV0YS0mZ3Q7ZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX2ZpbGVdKSB7CiAJCQkJZHlucHRyX2FyZ190eXBlIHw9IERZTlBUUl9UWVBFX0ZJTEU7CkBAIC0xMzc2Myw2ICYjNDM7MTM3NzcsMTMgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbiwKIAkJfQogCX0KIAomIzQzOwlpZiAobWV0YS5mdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX2V4dF0gJmFtcDsmYW1wOwomIzQzOwkgICAgKHByb2dfdHlwZSA9PSBCUEZfUFJPR19UWVBFX0xTTSB8fCBwcm9nX3R5cGUgPT0gQlBGX1BST0dfVFlQRV9UUkFDSU5HKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAobWV0YS5hcmdfY29uc3RhbnQudmFsdWUgJmFtcDsgQlBGX1NLQl9FWFRfRl9DUkVBVEUpKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtCUEZfU0tCX0VYVF9GX0NSRUFURSBpcyBub3QgYWxsb3dlZCBpbiBsc20vdHJhY2luZyBwcm9ncmFtc1xuJiMzNDspOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKIAlpZiAoaXNfYnBmX3JidHJlZV9hZGRfa2Z1bmMobWV0YS5mdW5jX2lkKSkgewogCQllcnIgPSBwdXNoX2NhbGxiYWNrX2NhbGwoZW52LCBpbnNuLCBpbnNuX2lkeCwgbWV0YS5zdWJwcm9nbm8sCiAJCQkJCSBzZXRfcmJ0cmVlX2FkZF9jYWxsYmFja19zdGF0ZSk7CmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IGUzODQ3NzM5MzU1MTUuLjZkNTczMjBkZmVhMzkgMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9LY29uZmlnCkBAIC01NDAsNCAmIzQzOzU0MCwyNCBAQCBjb25maWcgTkVUX1RFU1QKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAomIzQzO2NvbmZpZyBCUEZfU0tCX0VYVAomIzQzOwlib29sICYjMzQ7c2tiIGV4dGVuc2lvbiBmb3IgQlBGIG1ldGFkYXRhJiMzNDsKJiM0MzsJZGVwZW5kcyBvbiBCUEZfU1lTQ0FMTAomIzQzOwlzZWxlY3QgU0tCX0VYVEVOU0lPTlMKJiM0MzsJaGVscAomIzQzOwkgIEVuYWJsZSBhbiBza19idWZmIGV4dGVuc2lvbiBmb3Igc3RvcmluZyBCUEYgbWV0YWRhdGEuIFRoaXMgYWxsb3dzIEJQRgomIzQzOwkgIHByb2dyYW1zIHRvIGFzc29jaWF0ZSBhcmJpdHJhcnkgZGF0YSB3aXRoIGluZGl2aWR1YWwgcGFja2V0cyBhcyB0aGV5CiYjNDM7CSAgdHJhdmVyc2UgdGhlIG5ldHdvcmsgc3RhY2suIFRoZSBzdG9yYWdlIGlzIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbgomIzQzOwkgIHRoZSBza19idWZmIGlzIGZyZWVkLgomIzQzOwomIzQzO2NvbmZpZyBCUEZfU0tCX0VYVF9TSVpFCiYjNDM7CWludCAmIzM0O1NpemUgb2YgdGhlIEJQRiBza2IgZXh0ZW5zaW9uIG1ldGFkYXRhIGJ1ZmZlciYjMzQ7CiYjNDM7CWRlcGVuZHMgb24gQlBGX1NLQl9FWFQKJiM0MzsJcmFuZ2UgMSAyNTYKJiM0MzsJZGVmYXVsdCA2NAomIzQzOwloZWxwCiYjNDM7CSAgQ29uZmlndXJlcyB0aGUgc2l6ZSBvZiB0aGUgaW5saW5lIG1ldGFkYXRhIGJ1ZmZlciBpbiBzdHJ1Y3QKJiM0MzsJICBicGZfc2tiX2V4dCwgd2hpY2ggaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgYSBCUEYgcHJvZ3JhbSBjYW4KJiM0MzsJICBzdG9yZSBvciByZXRyaWV2ZSB3aXRoIGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KCkuCiYjNDM7CiBlbmRpZiAgICMgaWYgTkVUCmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWx0ZXIuYyBiL25ldC9jb3JlL2ZpbHRlci5jCmluZGV4IDYxOTQwZTc1MzU1MjMuLmJmNzU0ZjMzMDM0NjMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2ZpbHRlci5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9jb3JlL2ZpbHRlci5jCkBAIC0xMjQxOCw2ICYjNDM7MTI0MTgsNTQgQEAgaW50IF9fYnBmX3NrYl9tZXRhX3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsCiAJcmV0dXJuIDA7CiB9CiAKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUCiYjNDM7dm9pZCAqYnBmX3NrYl9leHRfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCBib29sIHdyKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9za2JfZXh0ICpleHQ7CiYjNDM7CiYjNDM7CWV4dCA9IHNrYl9leHRfZmluZChza2IsIFNLQl9FWFRfQlBGKTsKJiM0MzsJaWYgKCFleHQpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKHdyICZhbXA7JmFtcDsgc2tiX2V4dF9zaGFyZWQoc2tiKSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlyZXR1cm4gZXh0LSZndDtidWYgJiM0Mzsgb2Zmc2V0OwomIzQzO30KJiM0MzsKJiM0MztpbnQgX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIHZvaWQgKnRvLAomIzQzOwkJCSAgICAgdTMyIGxlbikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfc2tiX2V4dCAqZXh0OwomIzQzOwomIzQzOwlleHQgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX0JQRik7CiYjNDM7CWlmICghZXh0KQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CW1lbW1vdmUodG8sIGV4dC0mZ3Q7YnVmICYjNDM7IG9mZnNldCwgbGVuKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO2ludCBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsCiYjNDM7CQkJICAgICAgY29uc3Qgdm9pZCAqZnJvbSwgdTMyIGxlbiwgdTY0IGZsYWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9za2JfZXh0ICpleHQ7CiYjNDM7CiYjNDM7CWlmICh1bmxpa2VseShmbGFncykpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJZXh0ID0gc2tiX2V4dF9maW5kKHNrYiwgU0tCX0VYVF9CUEYpOwomIzQzOwlpZiAoIWV4dCkKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwomIzQzOwlpZiAoc2tiX2V4dF9zaGFyZWQoc2tiKSkKJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CiYjNDM7CW1lbW1vdmUoZXh0LSZndDtidWYgJiM0Mzsgb2Zmc2V0LCBmcm9tLCBsZW4pOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7I2VuZGlmIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqLwomIzQzOwogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwogX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2Ioc3RydWN0IF9fc2tfYnVmZiAqcywgdTY0IGZsYWdzLAogCQkJCSAgICBzdHJ1Y3QgYnBmX2R5bnB0ciAqcHRyX191bmluaXQpCkBAIC0xMjQzNSw2ICYjNDM7MTI0ODMsNzkgQEAgX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2Ioc3RydWN0IF9fc2tfYnVmZiAqcywgdTY0IGZsYWdzLAogCXJldHVybiAwOwogfQogCiYjNDM7I2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVAomIzQzOy8qKgomIzQzOyAqIGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KCkgLSBJbml0aWFsaXplIGEgZHlucHRyIHRvIHRoZSBza2JfZXh0IEJQRiBhcmVhLgomIzQzOyAqIEBza2JfOiBzb2NrZXQgYnVmZmVyIHRvIGF0dGFjaCB0aGUgZXh0ZW5zaW9uIHRvCiYjNDM7ICogQHNpemU6IGR5bnB0ciBzaXplIGluIGJ5dGVzLCAwIGZvciBtYXhpbXVtIChDT05GSUdfQlBGX1NLQl9FWFRfU0laRSkKJiM0MzsgKiBAZmxhZ3NfX2s6IEJQRl9TS0JfRVhUX0ZfQ1JFQVRFIHRvIGNyZWF0ZS9DT1cgKHJlYWQtd3JpdGUpLCAwIHRvIGZpbmQKJiM0MzsgKiAgICAgICAgICAgIChyZWFkLW9ubHkpCiYjNDM7ICogQHB0cl9fdW5pbml0OiBkeW5wdHIgdG8gaW5pdGlhbGl6ZQomIzQzOyAqCiYjNDM7ICogV3JpdGVzIHRvIHRoZSBkeW5wdHIgKGJwZl9keW5wdHJfd3JpdGUoKSwgYnBmX2R5bnB0cl9zbGljZV9yZHdyKCkpIGZhaWwgd2l0aAomIzQzOyAqICUtRUJVU1kgb3IgTlVMTCBpZiB0aGUgZXh0ZW5zaW9uIGNodW5rIGlzIHNoYXJlZCB3aXRoIGNsb25lcywgZS5nLiBhZnRlcgomIzQzOyAqIGJwZl9jbG9uZV9yZWRpcmVjdCgpLiBSZS1hY3F1aXJlIHRoZSBkeW5wdHIgd2l0aCBCUEZfU0tCX0VYVF9GX0NSRUFURSB0byBnZXQKJiM0MzsgKiBhIHdyaXRhYmxlIHByaXZhdGUgY29weS4KJiM0MzsgKgomIzQzOyAqIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFIGlzIG5vdCBhbGxvd2VkIGluIHRyYWNpbmcgYW5kIExTTSBwcm9ncmFtcy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiAqICUwICAgICAgICAgLSBkeW5wdHIgcmVhZHkgdG8gdXNlCiYjNDM7ICogKiAlLUVOT0VOVCAgIC0gZXh0ZW5zaW9uIG5vdCBmb3VuZCAod2hlbiBub3QgY3JlYXRpbmcpCiYjNDM7ICogKiAlLUVOT01FTSAgIC0gYWxsb2NhdGlvbiBmYWlsZWQKJiM0MzsgKiAqICUtRUlOVkFMICAgLSBpbnZhbGlkIGZsYWdzCiYjNDM7ICogKiAlLUUyQklHICAgIC0gc2l6ZSBleGNlZWRzIENPTkZJR19CUEZfU0tCX0VYVF9TSVpFCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KHN0cnVjdCBfX3NrX2J1ZmYgKnNrYl8sIHUzMiBzaXplLAomIzQzOwkJCQkJdTY0IGZsYWdzX19rLAomIzQzOwkJCQkJc3RydWN0IGJwZl9keW5wdHIgKnB0cl9fdW5pbml0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilwdHJfX3VuaW5pdDsKJiM0MzsJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYl87CiYjNDM7CWJvb2wgY3JlYXRlID0gZmxhZ3NfX2sgJmFtcDsgQlBGX1NLQl9FWFRfRl9DUkVBVEU7CiYjNDM7CXN0cnVjdCBicGZfc2tiX2V4dCAqZXh0OwomIzQzOwlib29sIGV4aXN0czsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKGZsYWdzX19rICZhbXA7IH5CUEZfU0tCX0VYVF9GX0NSRUFURSkgewomIzQzOwkJZXJyID0gLUVJTlZBTDsKJiM0MzsJCWdvdG8gZXJyb3I7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKHNpemUgJmd0OyBBUlJBWV9TSVpFKGV4dC0mZ3Q7YnVmKSkgewomIzQzOwkJZXJyID0gLUUyQklHOwomIzQzOwkJZ290byBlcnJvcjsKJiM0MzsJfQomIzQzOwlpZiAoIXNpemUpCiYjNDM7CQlzaXplID0gQVJSQVlfU0laRShleHQtJmd0O2J1Zik7CiYjNDM7CiYjNDM7CWV4aXN0cyA9IHNrYl9leHRfZXhpc3Qoc2tiLCBTS0JfRVhUX0JQRik7CiYjNDM7CWlmICghY3JlYXRlKSB7CiYjNDM7CQlpZiAoIWV4aXN0cykgewomIzQzOwkJCWVyciA9IC1FTk9FTlQ7CiYjNDM7CQkJZ290byBlcnJvcjsKJiM0MzsJCX0KJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWV4dCA9IHNrYl9leHRfYWRkKHNrYiwgU0tCX0VYVF9CUEYpOwomIzQzOwlpZiAoIWV4dCkgewomIzQzOwkJZXJyID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gZXJyb3I7CiYjNDM7CX0KJiM0MzsJaWYgKCFleGlzdHMpCiYjNDM7CQltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOwomIzQzO291dDoKJiM0MzsJYnBmX2R5bnB0cl9pbml0KHB0ciwgc2tiLCBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVCwgMCwgc2l6ZSk7CiYjNDM7CWlmICghY3JlYXRlKQomIzQzOwkJYnBmX2R5bnB0cl9zZXRfcmRvbmx5KHB0cik7CiYjNDM7CXJldHVybiAwOwomIzQzO2Vycm9yOgomIzQzOwlicGZfZHlucHRyX3NldF9udWxsKHB0cik7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOyNlbmRpZiAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi8KJiM0MzsKIC8qKgogICogYnBmX2R5bnB0cl9mcm9tX3NrYl9tZXRhKCkgLSBJbml0aWFsaXplIGEgZHlucHRyIHRvIHRoZSBza2IgbWV0YWRhdGEgYXJlYS4KICAqIEBza2JfOiBzb2NrZXQgYnVmZmVyIGNhcnJ5aW5nIHRoZSBtZXRhZGF0YQpAQCAtMTI4MTYsNiAmIzQzOzEyOTM3LDEyIEBAIEJURl9LRlVOQ1NfU1RBUlQoYnBmX2tmdW5jX2NoZWNrX3NldF9za2JfbWV0YSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX21ldGEpCiBCVEZfS0ZVTkNTX0VORChicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9tZXRhKQogCiYjNDM7I2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVAomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX2tmdW5jX2NoZWNrX3NldF9za2JfZXh0KQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCkKJiM0MztCVEZfS0ZVTkNTX0VORChicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9leHQpCiYjNDM7I2VuZGlmCiYjNDM7CiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9rZnVuY19jaGVja19zZXRfeGRwKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9keW5wdHJfZnJvbV94ZHApCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX3hkcF9wdWxsX2RhdGEpCkBAIC0xMjg0Nyw2ICYjNDM7MTI5NzQsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfc2tiX21ldGEgPSB7CiAJLnNldCA9ICZhbXA7YnBmX2tmdW5jX2NoZWNrX3NldF9za2JfbWV0YSwKIH07CiAKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUCiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfc2tiX2V4dCA9IHsKJiM0MzsJLm93bmVyID0gVEhJU19NT0RVTEUsCiYjNDM7CS5zZXQgPSAmYW1wO2JwZl9rZnVuY19jaGVja19zZXRfc2tiX2V4dCwKJiM0Mzt9OwomIzQzOyNlbmRpZgomIzQzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfeGRwID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5zZXQgPSAmYW1wO2JwZl9rZnVuY19jaGVja19zZXRfeGRwLApAQCAtMTI4ODksNiAmIzQzOzEzMDIzLDIxIEBAIHN0YXRpYyBpbnQgX19pbml0IGJwZl9rZnVuY19pbml0KHZvaWQpCiAJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiKTsKIAlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9tZXRhKTsKIAlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9tZXRhKTsKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUCiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQUNULCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfQ0dST1VQX1NLQiwgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9leHQpOwomIzQzOwlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NPQ0tfT1BTLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0tfU0tCLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU09DS0VUX0ZJTFRFUiwgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9leHQpOwomIzQzOwlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9PVVQsICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MV1RfSU4sICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MV1RfWE1JVCwgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9leHQpOwomIzQzOwlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9TRUc2TE9DQUwsICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9ORVRGSUxURVIsICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MU00sICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7I2VuZGlmCiAJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsICZhbXA7YnBmX2tmdW5jX3NldF94ZHApOwogCXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfQ0dST1VQX1NPQ0tfQUREUiwKIAkJCQkJICAgICAgICZhbXA7YnBmX2tmdW5jX3NldF9zb2NrX2FkZHIpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCBhYjE5NWI5OWM4NTMwLi5hNDc5ZTI1ZGU1NjQ4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtODMsNiAmIzQzOzgzLDcgQEAKICNpbmNsdWRlICZsdDtuZXQvcGFnZV9wb29sL2hlbHBlcnMuaCZndDsKICNpbmNsdWRlICZsdDtuZXQvcHNwL3R5cGVzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L2Ryb3ByZWFzb24uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L3hkcF9zb2NrLmgmZ3Q7CiAKICNpbmNsdWRlICZsdDtsaW51eC91YWNjZXNzLmgmZ3Q7CkBAIC01MTY5LDYgJiM0Mzs1MTcwLDkgQEAgc3RhdGljIGNvbnN0IHU4IHNrYl9leHRfdHlwZV9sZW5bXSA9IHsKICNpZiBJU19FTkFCTEVEKENPTkZJR19DQU4pCiAJW1NLQl9FWFRfQ0FOXSA9IFNLQl9FWFRfQ0hVTktTSVpFT0Yoc3RydWN0IGNhbl9za2JfZXh0KSwKICNlbmRpZgomIzQzOyNpZiBJU19FTkFCTEVEKENPTkZJR19CUEZfU0tCX0VYVCkKJiM0MzsJW1NLQl9FWFRfQlBGXSA9IFNLQl9FWFRfQ0hVTktTSVpFT0Yoc3RydWN0IGJwZl9za2JfZXh0KSwKJiM0MzsjZW5kaWYKIH07CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgX19ub19wcm9maWxlIHVuc2lnbmVkIGludCBza2JfZXh0X3RvdGFsX2xlbmd0aCh2b2lkKQpAQCAtNjI4Nyw3ICYjNDM7NjI5MSw4IEBAIEVYUE9SVF9TWU1CT0woc2tiX3RyeV9jb2FsZXNjZSk7CiAgKiBvcGVyYXRpb25zLgogICogc2tiX3NjcnViX3BhY2tldCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNsZWFuIGEgc2tiIGJlZm9yZSBpbmplY3RpbmcgaXQgaW4KICAqIGFub3RoZXIgbmFtZXNwYWNlIChAeG5ldCA9PSB0cnVlKS4gV2UgaGF2ZSB0byBjbGVhciBhbGwgaW5mb3JtYXRpb24gaW4gdGhlCi0gKiBza2IgdGhhdCBjb3VsZCBpbXBhY3QgbmFtZXNwYWNlIGlzb2xhdGlvbi4KJiM0MzsgKiBza2IgdGhhdCBjb3VsZCBpbXBhY3QgbmFtZXNwYWNlIGlzb2xhdGlvbi4gTm90ZSB0aGF0IEJQRiBza2IgZXh0ZW5zaW9uIGlzCiYjNDM7ICogbWVhbnQgdG8gY2FycnkgaW5mb3JtYXRpb24gYWNyb3NzIG5hbWVzcGFjZXMgYnkgZGVzaWduLgogICovCiB2b2lkIHNrYl9zY3J1Yl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB4bmV0KQogewpAQCAtNjI5NSw3ICYjNDM7NjMwMCw3IEBAIHZvaWQgc2tiX3NjcnViX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHhuZXQpCiAJc2tiLSZndDtza2JfaWlmID0gMDsKIAlza2ItJmd0O2lnbm9yZV9kZiA9IDA7CiAJc2tiX2RzdF9kcm9wKHNrYik7Ci0Jc2tiX2V4dF9yZXNldChza2IpOwomIzQzOwlza2JfZXh0X3NjcnViKHNrYik7CiAJbmZfcmVzZXRfY3Qoc2tiKTsKIAluZl9yZXNldF90cmFjZShza2IpOwogCkBAIC03MzA0LDYgJiM0Mzs3MzA5LDI0IEBAIHZvaWQgX19za2JfZXh0X3B1dChzdHJ1Y3Qgc2tiX2V4dCAqZXh0KQogCWttZW1fY2FjaGVfZnJlZShza2J1ZmZfZXh0X2NhY2hlLCBleHQpOwogfQogRVhQT1JUX1NZTUJPTChfX3NrYl9leHRfcHV0KTsKJiM0MzsKJiM0Mzt2b2lkIHNrYl9leHRfc2NydWIoc3RydWN0IHNrX2J1ZmYgKnNrYikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBpZDsKJiM0MzsKJiM0MzsJaWYgKGxpa2VseSghc2tiLSZndDthY3RpdmVfZXh0ZW5zaW9ucykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWZvciAoaWQgPSAwOyBpZCAmbHQ7IFNLQl9FWFRfTlVNOyBpZCYjNDM7JiM0MzspIHsKJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NLQl9FWFQpCiYjNDM7CQlpZiAoaWQgPT0gU0tCX0VYVF9CUEYpCiYjNDM7CQkJY29udGludWU7CiYjNDM7I2VuZGlmCiYjNDM7CQlza2JfZXh0X2RlbChza2IsIGlkKTsKJiM0MzsJfQomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MKHNrYl9leHRfc2NydWIpOwomIzQzOwogI2VuZGlmIC8qIENPTkZJR19TS0JfRVhURU5TSU9OUyAqLwogCiBzdGF0aWMgdm9pZCBrZnJlZV9za2JfbmFwaV9jYWNoZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBiMzg4N2M0MmFkZmRiLi5jZjA5M2IwZDY2YzU4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvaXB2NC91ZHAuYwpAQCAtMTU0MCw4ICYjNDM7MTU0MCw2IEBAIHZvaWQgdWRwX3NwbGljZV9lb2Yoc3RydWN0IHNvY2tldCAqc29jaykKICAqCiAgKiBXZSBuZWVkIHRvIHByZXNlcnZlIHNlY3BhdGgsIGlmIHByZXNlbnQsIHRvIGV2ZW50dWFsbHkgcHJvY2VzcwogICogSVBfQ01TR19QQVNTU0VDIGF0IHJlY3Ztc2coKSB0aW1lLgotICoKLSAqIE90aGVyIGV4dGVuc2lvbnMgY2FuIGJlIGNsZWFyZWQuCiAgKi8KIHN0YXRpYyBib29sIHVkcF90cnlfbWFrZV9zdGF0ZWxlc3Moc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTE1NDksOCAmIzQzOzE1NDcsOCBAQCBzdGF0aWMgYm9vbCB1ZHBfdHJ5X21ha2Vfc3RhdGVsZXNzKHN0cnVjdCBza19idWZmICpza2IpCiAJCXJldHVybiB0cnVlOwogCiAJaWYgKCFzZWNwYXRoX2V4aXN0cyhza2IpKSB7Ci0JCXNrYl9leHRfcmVzZXQoc2tiKTsKLQkJcmV0dXJuIHRydWU7CiYjNDM7CQlza2JfZXh0X3NjcnViKHNrYik7CiYjNDM7CQlyZXR1cm4gIXNrYl9oYXNfZXh0ZW5zaW9ucyhza2IpOwogCX0KIAogCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCmluZGV4IGVhNzA0NGYzMGFkYzMuLjliYmZhMzUxYmNlZGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwpAQCAtNyw2ICYjNDM7Nyw3IEBAIENPTkZJR19CUEZfSklUPXkKIENPTkZJR19CUEZfS1BST0JFX09WRVJSSURFPXkKIENPTkZJR19CUEZfTElSQ19NT0RFMj15CiBDT05GSUdfQlBGX0xTTT15CiYjNDM7Q09ORklHX0JQRl9TS0JfRVhUPXkKIENPTkZJR19CUEZfU1RSRUFNX1BBUlNFUj15CiBDT05GSUdfQlBGX1NZU0NBTEw9eQogIyBDT05GSUdfQlBGX1VOUFJJVl9ERUZBVUxUX09GRiBpcyBub3Qgc2V0CkBAIC0xMzYsMyAmIzQzOzEzNyw0IEBAIENPTkZJR19TTUNfSFNfQ1RSTF9CUEY9eQogQ09ORklHX0RJQlM9eQogQ09ORklHX0RJQlNfTE89eQogQ09ORklHX1BNX1dBS0VMT0NLUz15CiYjNDM7Q09ORklHX05FVF9TQ0hfTkVURU09eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc29ja2V0X2hlbHBlcnMuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NvY2tldF9oZWxwZXJzLmgKaW5kZXggMGQ1OTUwM2EwYzczZS4uZWIxMTRhNmVhNmY5MiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc29ja2V0X2hlbHBlcnMuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zb2NrZXRfaGVscGVycy5oCkBAIC0zLDYgJiM0MzszLDcgQEAKICNpZm5kZWYgX19TT0NLRVRfSEVMUEVSU19fCiAjZGVmaW5lIF9fU09DS0VUX0hFTFBFUlNfXwogCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm9yLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3VuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvdm1fc29ja2V0cy5oJmd0OwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZmllci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZpZXIuYwppbmRleCA2NGFjNDlhZDY3ZTYzLi43NzI0ZTgyZmNlNjZhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZmllci5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmaWVyLmMKQEAgLTk0LDYgJiM0Mzs5NCw3IEBACiAjaW5jbHVkZSAmIzM0O3ZlcmlmaWVyX3NjYWxhcl9pZHMuc2tlbC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7dmVyaWZpZXJfc2Rpdi5za2VsLmgmIzM0OwogI2luY2x1ZGUgJiMzNDt2ZXJpZmllcl9zZWFyY2hfcHJ1bmluZy5za2VsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dmVyaWZpZXJfc2tiX2V4dC5za2VsLmgmIzM0OwogI2luY2x1ZGUgJiMzNDt2ZXJpZmllcl9zb2NrLnNrZWwuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3ZlcmlmaWVyX3NvY2tfYWRkci5za2VsLmgmIzM0OwogI2luY2x1ZGUgJiMzNDt2ZXJpZmllcl9zb2NrbWFwX211dGF0ZS5za2VsLmgmIzM0OwpAQCAtMjU2LDYgJiM0MzsyNTcsNyBAQCB2b2lkIHRlc3RfdmVyaWZpZXJfcnVudGltZV9qaXQodm9pZCkgICAgICAgICAgeyBSVU4odmVyaWZpZXJfcnVudGltZV9qaXQpOyB9CiB2b2lkIHRlc3RfdmVyaWZpZXJfc2NhbGFyX2lkcyh2b2lkKSAgICAgICAgICAgeyBSVU4odmVyaWZpZXJfc2NhbGFyX2lkcyk7IH0KIHZvaWQgdGVzdF92ZXJpZmllcl9zZGl2KHZvaWQpICAgICAgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9zZGl2KTsgfQogdm9pZCB0ZXN0X3ZlcmlmaWVyX3NlYXJjaF9wcnVuaW5nKHZvaWQpICAgICAgIHsgUlVOKHZlcmlmaWVyX3NlYXJjaF9wcnVuaW5nKTsgfQomIzQzO3ZvaWQgdGVzdF92ZXJpZmllcl9za2JfZXh0KHZvaWQpICAgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9za2JfZXh0KTsgfQogdm9pZCB0ZXN0X3ZlcmlmaWVyX3NvY2sodm9pZCkgICAgICAgICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3NvY2spOyB9CiB2b2lkIHRlc3RfdmVyaWZpZXJfc29ja19hZGRyKHZvaWQpICAgICAgICAgICAgeyBSVU4odmVyaWZpZXJfc29ja19hZGRyKTsgfQogdm9pZCB0ZXN0X3ZlcmlmaWVyX3NvY2ttYXBfbXV0YXRlKHZvaWQpICAgICAgIHsgUlVOKHZlcmlmaWVyX3NvY2ttYXBfbXV0YXRlKTsgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMveGRwX2NvbnRleHRfdGVzdF9ydW4uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3hkcF9jb250ZXh0X3Rlc3RfcnVuLmMKaW5kZXggNDQ4ODA3Njc2MTc2Yy4uOWNiYjgzOWE1NWNjZSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMveGRwX2NvbnRleHRfdGVzdF9ydW4uYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy94ZHBfY29udGV4dF90ZXN0X3J1bi5jCkBAIC0yLDcgJiM0MzsyLDkgQEAKICNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0d29ya19oZWxwZXJzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvaXB2Ni5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9uZXRmaWx0ZXIuaCZndDsKICNpbmNsdWRlICZsdDthcnBhL2luZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O3NvY2tldF9oZWxwZXJzLmgmIzM0OwogI2luY2x1ZGUgJiMzNDt0ZXN0X3hkcF9jb250ZXh0X3Rlc3RfcnVuLnNrZWwuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3Rlc3RfeGRwX21ldGEuc2tlbC5oJiMzNDsKIApAQCAtMTYsMTMgJiM0MzsxOCwxNCBAQAogI2RlZmluZSBEVU1NWV9OQU1FICYjMzQ7ZHVtMCYjMzQ7CiAjZGVmaW5lIFRBUF9ORVROUyAmIzM0O3hkcF9jb250ZXh0X3R1bnRhcCYjMzQ7CiAjZGVmaW5lIExXVF9ORVROUyAmIzM0O3hkcF9jb250ZXh0X2x3dCYjMzQ7CiYjNDM7I2RlZmluZSBTS0JfRVhUX05FVE5TICYjMzQ7c2tiX2V4dF90dW50YXAmIzM0OwogCiAjZGVmaW5lIFRFU1RfUEFZTE9BRF9MRU4gMzIKIHN0YXRpYyBjb25zdCBfX3U4IHRlc3RfcGF5bG9hZFtURVNUX1BBWUxPQURfTEVOXSA9IHsKLQkweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAotCTB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsCi0JMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKLQkweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LAomIzQzOwkweDQ5LCAweDIwLCAweDYzLCAweDcyLCAweDZmLCAweDczLCAweDczLCAweDY1LAomIzQzOwkweDY0LCAweDIwLCAweDY4LCAweDZmLCAweDZmLCAweDZiLCAweDczLCAweDIwLAomIzQzOwkweDI2LCAweDIwLCAweDZjLCAweDY5LCAweDc2LCAweDY1LCAweDY0LCAweDIwLAomIzQzOwkweDc0LCAweDZmLCAweDIwLCAweDc0LCAweDY1LCAweDZjLCAweDZjLCAweDIxLAogfTsKIAogdm9pZCB0ZXN0X3hkcF9jb250ZXh0X2Vycm9yKGludCBwcm9nX2ZkLCBzdHJ1Y3QgYnBmX3Rlc3RfcnVuX29wdHMgb3B0cywKQEAgLTMzMSwxMCAmIzQzOzMzNCwxMSBAQCB2b2lkIHRlc3RfeGRwX2NvbnRleHRfdmV0aCh2b2lkKQogCW5ldG5zX2ZyZWUodHhfbnMpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLAotCQkJc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZywKLQkJCXN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18yX3Byb2csCi0JCQlib29sICp0ZXN0X3Bhc3MpCiYjNDM7c3RhdGljIHZvaWQgX190ZXN0X3R1bnRhcChjb25zdCBjaGFyICpuc25hbWUsCiYjNDM7CQkJICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLAomIzQzOwkJCSAgc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZywKJiM0MzsJCQkgIHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18yX3Byb2csCiYjNDM7CQkJICBib29sICp0ZXN0X3Bhc3MpCiB7CiAJTElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7CiAJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKQEAgLTM0NSw3ICYjNDM7MzQ5LDcgQEAgc3RhdGljIHZvaWQgdGVzdF90dW50YXAoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZywKIAogCSp0ZXN0X3Bhc3MgPSBmYWxzZTsKIAotCW5zID0gbmV0bnNfbmV3KFRBUF9ORVROUywgdHJ1ZSk7CiYjNDM7CW5zID0gbmV0bnNfbmV3KG5zbmFtZSwgdHJ1ZSk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKG5zLCAmIzM0O2NyZWF0ZSBhbmQgb3BlbiBucyYjMzQ7KSkKIAkJcmV0dXJuOwogCkBAIC0zOTYsNiAmIzQzOzQwMCwxNSBAQCBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLAogCW5ldG5zX2ZyZWUobnMpOwogfQogCiYjNDM7c3RhdGljIHZvaWQgdGVzdF90dW50YXAoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZywKJiM0MzsJCQlzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMV9wcm9nLAomIzQzOwkJCXN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18yX3Byb2csCiYjNDM7CQkJYm9vbCAqdGVzdF9wYXNzKQomIzQzO3sKJiM0MzsJX190ZXN0X3R1bnRhcChUQVBfTkVUTlMsIHhkcF9wcm9nLCB0Y19wcmlvXzFfcHJvZywgdGNfcHJpb18yX3Byb2csCiYjNDM7CQkgICAgICB0ZXN0X3Bhc3MpOwomIzQzO30KJiM0MzsKIC8qIFdyaXRlIGEgcGFja2V0IHRvIGEgdGFwIGRldiBhbmQgY29weSBpdCB0byBpbmdyZXNzIG9mIGEgZHVtbXkgZGV2ICovCiBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcF9taXJyZWQoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZywKIAkJCSAgICAgICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3Byb2csCkBAIC02OTMsMyAmIzQzOzcwNiwxMDg5IEBAIHZvaWQgdGVzdF94ZHBfY29udGV4dF9sd3RfZW5jYXAodm9pZCkKIAogCXRlc3RfeGRwX21ldGFfX2Rlc3Ryb3koc2tlbCk7CiB9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMV9wcm9nLAomIzQzOwkJCQlzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMl9wcm9nLAomIzQzOwkJCQlib29sICp0ZXN0X3Bhc3MpCiYjNDM7ewomIzQzOwlfX3Rlc3RfdHVudGFwKFNLQl9FWFRfTkVUTlMsIE5VTEwgLyogeGRwICovLCB0Y19wcmlvXzFfcHJvZywKJiM0MzsJCSAgICAgIHRjX3ByaW9fMl9wcm9nLCB0ZXN0X3Bhc3MpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3QgaWYgc2tiX2V4dCBzdXJ2aXZlcyBza2IgY2xvbmUgKHZpYSB0YyBtaXJyZWQpLgomIzQzOyAqIGR1bW15X3Byb2cgcnVucyBvbiB0aGUgY2xvbmUgKGR1bW15IGluZ3Jlc3MpLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfbWlycmVkX2Nsb25lX2V4dChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCwKJiM0MzsJCQkJICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmR1bW15X3Byb2cpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwlpbnQgZHVtbXlfaWZpbmRleDsKJiM0MzsJaW50IHRhcF9pZmluZGV4OwomIzQzOwlpbnQgdGFwX2ZkID0gLTE7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7d3JpdGVfZG9uZSA9IGZhbHNlOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlucyA9IG5ldG5zX25ldygmIzM0O21pcnJlZF9jbG9uZSYjMzQ7LCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG5zLCAmIzM0O25ldG5zX25ldyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJLyogRHVtbXkgZGV2OiBhdHRhY2ggcmVhZGVyICovCiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIGFkZCBuYW1lICYjMzQ7IERVTU1ZX05BTUUgJiMzNDsgdHlwZSBkdW1teSYjMzQ7KTsKJiM0MzsJU1lTKGNsb3NlLCAmIzM0O2lwIGxpbmsgc2V0IGRldiAmIzM0OyBEVU1NWV9OQU1FICYjMzQ7IHVwJiMzNDspOwomIzQzOwomIzQzOwlkdW1teV9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoRFVNTVlfTkFNRSk7CiYjNDM7CWlmICghQVNTRVJUX0dUKGR1bW15X2lmaW5kZXgsIDAsICYjMzQ7ZHVtbXlfaWZpbmRleCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXRjX2hvb2suaWZpbmRleCA9IGR1bW15X2lmaW5kZXg7CiYjNDM7CXJldCA9IGJwZl90Y19ob29rX2NyZWF0ZSgmYW1wO3RjX2hvb2spOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZHVtbXlfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoZHVtbXlfcHJvZyk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0Y19ob29rLCAmYW1wO3RjX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZHVtbXlfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJLyogVEFQIGRldjogYXR0YWNoIHdyaXRlciAmIzQzOyBtaXJyZWQgdG8gZHVtbXkgKi8KJiM0MzsJdGFwX2ZkID0gb3Blbl90dW50YXAoVEFQX05BTUUsIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRSh0YXBfZmQsIDAsICYjMzQ7b3Blbl90dW50YXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwlTWVMoY2xvc2UsICYjMzQ7aXAgbGluayBzZXQgZGV2ICYjMzQ7IFRBUF9OQU1FICYjMzQ7IHVwJiMzNDspOwomIzQzOwomIzQzOwl0YXBfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFRBUF9OQU1FKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QodGFwX2lmaW5kZXgsIDAsICYjMzQ7dGFwX2lmaW5kZXgmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0Y19ob29rLmlmaW5kZXggPSB0YXBfaWZpbmRleDsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt0YXBfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfaWQgPSAwOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0Y19ob29rLCAmYW1wO3RjX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7dGFwX2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDt0YyBmaWx0ZXIgYWRkIGRldiAmIzM0OyBUQVBfTkFNRSAmIzM0OyBpbmdyZXNzICYjMzQ7CiYjNDM7CQkgICAmIzM0O3Byb3RvY29sIGFsbCBtYXRjaGFsbCAmIzM0OwomIzQzOwkJICAgJiMzNDthY3Rpb24gbWlycmVkIGluZ3Jlc3MgbWlycm9yIGRldiAmIzM0OyBEVU1NWV9OQU1FKTsKJiM0MzsKJiM0MzsJcmV0ID0gd3JpdGVfdGVzdF9wYWNrZXQodGFwX2ZkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX3Rlc3RfcGFja2V0JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt3cml0ZV9kb25lLCAmIzM0O3dyaXRlX2RvbmUmIzM0Oyk7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzLCAmIzM0O3Rlc3RfcGFzcyYjMzQ7KTsKJiM0MzsKJiM0MztjbG9zZToKJiM0MzsJaWYgKHRhcF9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UodGFwX2ZkKTsKJiM0MzsJbmV0bnNfZnJlZShucyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfbWlycmVkX2Nsb25lX2V4dF9jb3coc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2xpbmsgKnRwX2xpbms7CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7Y2xvbmVfY293X2RvbmUgPSBmYWxzZTsKJiM0MzsJdHBfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2goc2tlbC0mZ3Q7cHJvZ3MudHBfa2ZyZWVfc2tiX2Nvd19jaGVjayk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUih0cF9saW5rLCAmIzM0O2F0dGFjaF90cCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJdGVzdF9taXJyZWRfY2xvbmVfZXh0KHNrZWwsIHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfY2xvbmVfcmVkaXJfY293KTsKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kodHBfbGluayk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogV3JpdGVyIGNsb25lcyB2aWEgYnBmX2Nsb25lX3JlZGlyZWN0KCkgZnJvbSB0aGUgcHJvZyBpdHNlbGYgdG8gbG9vcGJhY2sKJiM0MzsgKiB3aG9zZSBuZXRlbSBxZGlzYyBkZWxheXMgdGhlIGNsb25lLCBzbyBpdCBzdGF5cyBxdWV1ZWQgYW5kIGtlZXBzIHNoYXJpbmcKJiM0MzsgKiB0aGUgZXh0IGJsb2NrIHdoaWxlIHRoZSBwcm9nIHdyaXRlcyBhZ2Fpbi4gV2hlbiB0aGUgcWRpc2MgZmluYWxseSBsZWFrcwomIzQzOyAqIHRoZSBjbG9uZSBiYWNrIHRvIGxvIGluZ3Jlc3MsIHRoZSByZWFkZXIgdGhlcmUgbXVzdCBzdGlsbCBzZWUgdGhlCiYjNDM7ICogY2xvbmUtdGltZSBzbmFwc2hvdC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2Nsb25lX3JlZGlyX2V4dF93cml0ZV9hZnRlcihzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCwKJiM0MzsJCQkJCSAgICAgc3RydWN0IGJwZl9wcm9ncmFtICp3cml0ZXIpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwlpbnQgdGFwX2lmaW5kZXg7CiYjNDM7CWludCB0YXBfZmQgPSAtMTsKJiM0MzsJaW50IHJldCwgaTsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MgPSBmYWxzZTsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt3cml0ZV9ibG9ja2VkID0gZmFsc2U7CiYjNDM7CiYjNDM7CW5zID0gbmV0bnNfbmV3KCYjMzQ7Y2xvbmVfcmVkaXJfZXh0JiMzNDssIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKiBSZWRpcmVjdCB0YXJnZXQ6IGxvIGhlbGQgYmFjayBieSBuZXRlbSBkZWxheSAqLwomIzQzOwlTWVMoY2xvc2UsICYjMzQ7aXAgbGluayBzZXQgZGV2IGxvIHVwJiMzNDspOwomIzQzOwlTWVMoY2xvc2UsICYjMzQ7dGMgcWRpc2MgYWRkIGRldiBsbyByb290IG5ldGVtIGRlbGF5IDUwbXMmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIFJlYWRlciBvbiB0aGUgY2xvbmU6IGxvIGluZ3Jlc3MgKi8KJiM0MzsJdGNfaG9vay5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoJiMzNDtsbyYjMzQ7KTsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtsb19ob29rX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3JlYWQpOwomIzQzOwlyZXQgPSBicGZfdGNfYXR0YWNoKCZhbXA7dGNfaG9vaywgJmFtcDt0Y19vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2xvX2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CS8qIFRBUCBkZXY6IGF0dGFjaCB3cml0ZXIgd2hpY2ggY2xvbmVfcmVkaXJlY3RzIHRvIGxvICovCiYjNDM7CXRhcF9mZCA9IG9wZW5fdHVudGFwKFRBUF9OQU1FLCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UodGFwX2ZkLCAwLCAmIzM0O29wZW5fdHVudGFwJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJU1lTKGNsb3NlLCAmIzM0O2lwIGxpbmsgc2V0IGRldiAmIzM0OyBUQVBfTkFNRSAmIzM0OyB1cCYjMzQ7KTsKJiM0MzsKJiM0MzsJdGFwX2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChUQVBfTkFNRSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHRhcF9pZmluZGV4LCAwLCAmIzM0O3RhcF9pZmluZGV4JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtjbG9uZV9yZWRpcl9pZmluZGV4ID0gdGNfaG9vay5pZmluZGV4OwomIzQzOwomIzQzOwl0Y19ob29rLmlmaW5kZXggPSB0YXBfaWZpbmRleDsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt0YXBfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfaWQgPSAwOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQod3JpdGVyKTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3RjX2hvb2ssICZhbXA7dGNfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt0YXBfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJcmV0ID0gd3JpdGVfdGVzdF9wYWNrZXQodGFwX2ZkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX3Rlc3RfcGFja2V0JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt3cml0ZV9ibG9ja2VkLCAmIzM0O3dyaXRlX2Jsb2NrZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIENsb25lIGFycml2ZXMgYWZ0ZXIgdGhlIG5ldGVtIGRlbGF5OyBwb2xsIGV2ZXJ5IDEwIG1zZWMgdXAgdG8gMSBzZWMgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDEwMCAmYW1wOyZhbXA7ICFza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzczsgaSYjNDM7JiM0MzspCiYjNDM7CQl1c2xlZXAoMTAwMDApOwomIzQzOwlBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcywgJiMzNDt0ZXN0X3Bhc3MmIzM0Oyk7CiYjNDM7CiYjNDM7Y2xvc2U6CiYjNDM7CWlmICh0YXBfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHRhcF9mZCk7CiYjNDM7CW5ldG5zX2ZyZWUobnMpOwomIzQzO30KJiM0MzsKJiM0MzsvKiBUZXN0IGlmIHNrYl9leHQgc3Vydml2ZXMgdmV0aCBjcm9zcy1uZXRucyBmb3J3YXJkICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdHhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19FR1JFU1MpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdHhfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgcnhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHJ4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqcnhfbnMgPSBOVUxMLCAqdHhfbnMgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbnN0b2tlbiAqbnN0b2tlbiA9IE5VTEw7CiYjNDM7CWludCByeF9pZmluZGV4LCB0eF9pZmluZGV4OwomIzQzOwlpbnQgcmV0OwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJdHhfbnMgPSBuZXRuc19uZXcoVFhfTkVUTlMsIGZhbHNlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHR4X25zLCAmIzM0O2NyZWF0ZSB0eF9ucyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJcnhfbnMgPSBuZXRuc19uZXcoUlhfTkVUTlMsIGZhbHNlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHJ4X25zLCAmIzM0O2NyZWF0ZSByeF9ucyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIGFkZCAmIzM0OyBSWF9OQU1FICYjMzQ7IG5ldG5zICYjMzQ7IFJYX05FVE5TCiYjNDM7CSAgICAmIzM0OyB0eXBlIHZldGggcGVlciBuYW1lICYjMzQ7IFRYX05BTUUgJiMzNDsgbmV0bnMgJiMzNDsgVFhfTkVUTlMpOwomIzQzOwomIzQzOwkvKiBTZXR1cCBSWCBzaWRlOiBUQyBpbmdyZXNzIHJlYWRlciAqLwomIzQzOwluc3Rva2VuID0gb3Blbl9uZXRucyhSWF9ORVROUyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCAmIzM0O3NldG5zIHJ4X25zJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJU1lTKGNsb3NlLCAmIzM0O2lwIGxpbmsgc2V0IGRldiAmIzM0OyBSWF9OQU1FICYjMzQ7IHVwJiMzNDspOwomIzQzOwomIzQzOwlyeF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoUlhfTkFNRSk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHJ4X2lmaW5kZXgsIDAsICYjMzQ7aWZfbmFtZXRvaW5kZXggcngmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwlyeF9ob29rLmlmaW5kZXggPSByeF9pZmluZGV4OwomIzQzOwlyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoJmFtcDtyeF9ob29rKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19ob29rX2NyZWF0ZSByeCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXJ4X29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3JlYWQpOwomIzQzOwlyZXQgPSBicGZfdGNfYXR0YWNoKCZhbXA7cnhfaG9vaywgJmFtcDtyeF9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19hdHRhY2ggcngmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwljbG9zZV9uZXRucyhuc3Rva2VuKTsKJiM0MzsKJiM0MzsJLyogU2V0dXAgVFggc2lkZTogVEMgZWdyZXNzIHdyaXRlciAqLwomIzQzOwluc3Rva2VuID0gb3Blbl9uZXRucyhUWF9ORVROUyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCAmIzM0O3NldG5zIHR4X25zJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJU1lTKGNsb3NlLCAmIzM0O2lwIGxpbmsgc2V0IGRldiAmIzM0OyBUWF9OQU1FICYjMzQ7IHVwJiMzNDspOwomIzQzOwomIzQzOwl0eF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVFhfTkFNRSk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHR4X2lmaW5kZXgsIDAsICYjMzQ7aWZfbmFtZXRvaW5kZXggdHgmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0eF9ob29rLmlmaW5kZXggPSB0eF9pZmluZGV4OwomIzQzOwlyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoJmFtcDt0eF9ob29rKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19ob29rX2NyZWF0ZSB0eCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXR4X29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3dyaXRlKTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3R4X2hvb2ssICZhbXA7dHhfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfYXR0YWNoIHR4JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MgPSBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0ID0gc2VuZF90ZXN0X3BhY2tldCh0eF9pZmluZGV4KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3NlbmRfdGVzdF9wYWNrZXQmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwkvKiBQb2xsIGV2ZXJ5IDEwIG1zZWMgdXAgdG8gMSBzZWMgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDEwMCAmYW1wOyZhbXA7ICFza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzczsgaSYjNDM7JiM0MzspCiYjNDM7CQl1c2xlZXAoMTAwMDApOwomIzQzOwlBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcywgJiMzNDt0ZXN0X3Bhc3MmIzM0Oyk7CiYjNDM7CiYjNDM7Y2xvc2U6CiYjNDM7CWNsb3NlX25ldG5zKG5zdG9rZW4pOwomIzQzOwluZXRuc19mcmVlKHJ4X25zKTsKJiM0MzsJbmV0bnNfZnJlZSh0eF9ucyk7CiYjNDM7fQomIzQzOwomIzQzOy8qIFRlc3QgaWYgc2tiX2V4dCBzdXJ2aXZlcyBHUkUgdHVubmVsIGVuY2FwJiM0MztkZWNhcCAqLwomIzQzO3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF9zY3J1Yl9ncmUoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdHhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19FR1JFU1MpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdHhfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgcnhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHJ4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwlpbnQgdHhfaWZpbmRleDsKJiM0MzsJaW50IHJ4X2lmaW5kZXg7CiYjNDM7CWludCByZXQ7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlucyA9IG5ldG5zX25ldygmIzM0O2dyZV90ZXN0JiMzNDssIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKiBTZXR1cDogZ3JlX3R4IC0mZ3Q7IGxvIC0mZ3Q7IGdyZV9yeCAqLwomIzQzOwlTWVMoY2xvc2UsICYjMzQ7aXAgbGluayBzZXQgbG8gdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIGFkZCBncmVfdHggdHlwZSBncmV0YXAmIzM0OwomIzQzOwkgICAgJiMzNDsgbG9jYWwgMTI3LjAuMC4xIHJlbW90ZSAxMjcuMC4wLjImIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIHNldCBncmVfdHggdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBhZGRyIGFkZCAxMjcuMC4wLjIvOCBkZXYgbG8mIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIGFkZCBncmVfcnggdHlwZSBncmV0YXAmIzM0OwomIzQzOwkgICAgJiMzNDsgbG9jYWwgMTI3LjAuMC4yIHJlbW90ZSAxMjcuMC4wLjEmIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIHNldCBncmVfcnggdXAmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIFdyaXRlIHNrYl9leHQgb24gVEMgZWdyZXNzIG9uIEdSRSB0eCAqLwomIzQzOwl0eF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoJiMzNDtncmVfdHgmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHR4X2lmaW5kZXgsIDAsICYjMzQ7dHhfaWZpbmRleCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXR4X2hvb2suaWZpbmRleCA9IHR4X2lmaW5kZXg7CiYjNDM7CXJldCA9IGJwZl90Y19ob29rX2NyZWF0ZSgmYW1wO3R4X2hvb2spOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7dHhfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0eF9vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0eF9ob29rLCAmYW1wO3R4X29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7dHhfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJLyogUmVhZCBza2JfZXh0IG9uIFRDIGluZ3Jlc3Mgb24gR1JFIHJ4ICovCiYjNDM7CXJ4X2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleCgmIzM0O2dyZV9yeCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QocnhfaWZpbmRleCwgMCwgJiMzNDtyeF9pZmluZGV4JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJcnhfaG9vay5pZmluZGV4ID0gcnhfaWZpbmRleDsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7cnhfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtyeF9ob29rX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXJ4X29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3JlYWQpOwomIzQzOwlyZXQgPSBicGZfdGNfYXR0YWNoKCZhbXA7cnhfaG9vaywgJmFtcDtyeF9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3J4X2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CS8qIFRoZW4gdXNlIHNlbmRfdGVzdF9wYWNrZXQgb24gR1JFIHR4ICovCiYjNDM7CXJldCA9IHNlbmRfdGVzdF9wYWNrZXQodHhfaWZpbmRleCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZW5kX3Rlc3RfcGFja2V0JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJLyogUG9sbCBldmVyeSAxMCBtc2VjIHVwIHRvIDEgc2VjICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyAxMDAgJmFtcDsmYW1wOyAhc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3M7IGkmIzQzOyYjNDM7KQomIzQzOwkJdXNsZWVwKDEwMDAwKTsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MsICYjMzQ7dGVzdF9wYXNzJiMzNDspOwomIzQzOwomIzQzO2Nsb3NlOgomIzQzOwluZXRuc19mcmVlKG5zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X3NrYl9leHRfYmFzaWModm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsID0gTlVMTDsKJiM0MzsKJiM0MzsJc2tlbCA9IHRlc3RfeGRwX21ldGFfX29wZW5fYW5kX2xvYWQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7b3BlbiBhbmQgbG9hZCBza2VsZXRvbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0Y193cml0ZV9yZWFkJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3R1bnRhcChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3dyaXRlLAomIzQzOwkJCQkgICAgc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF9yZWFkLAomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfd3JpdGVfY2xvbmVfcmVhZCYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZSwKJiM0MzsJCQkJICAgIHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfY2xvbmVfcmVhZCwKJiM0MzsJCQkJICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3dyaXRlX3NsaWNlX3JlYWQmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfd3JpdGUsCiYjNDM7CQkJCSAgICBza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3NsaWNlX3JlYWQsCiYjNDM7CQkJCSAgICAmYW1wO3NrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0Y19zbGljZV93cml0ZV9yZWFkJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3R1bnRhcChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3NsaWNlX3dyaXRlLAomIzQzOwkJCQkgICAgc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF9yZWFkLAomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfbm9fYWxsb2MmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfbm9fYWxsb2MsCiYjNDM7CQkJCSAgICBOVUxMLCAvKiB0YyBwcmlvIDIgKi8KJiM0MzsJCQkJICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX2ludmFsaWRfZmxhZ3MmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfaW52YWxpZF9mbGFncywKJiM0MzsJCQkJICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqLwomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfcmRvbmx5JiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3R1bnRhcChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3Jkb25seSwKJiM0MzsJCQkJICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqLwomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfZG91YmxlX2FsbG9jJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3R1bnRhcChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X2RvdWJsZV9hbGxvYywKJiM0MzsJCQkJICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqLwomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2xvbmVfZXh0X3JlYWQmIzM0OykpCiYjNDM7CQl0ZXN0X21pcnJlZF9jbG9uZV9leHQoc2tlbCwgc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF9yZWFkKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjbG9uZV9leHRfY293JiMzNDspKQomIzQzOwkJdGVzdF9taXJyZWRfY2xvbmVfZXh0X2Nvdyhza2VsKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXImIzM0OykpCiYjNDM7CQl0ZXN0X2Nsb25lX3JlZGlyX2V4dF93cml0ZV9hZnRlcihza2VsLAomIzQzOwkJCQkJCSBza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjbG9uZV9yZWRpcl9leHRfc2xpY2Vfd3JpdGVfYWZ0ZXImIzM0OykpCiYjNDM7CQl0ZXN0X2Nsb25lX3JlZGlyX2V4dF93cml0ZV9hZnRlcihza2VsLAomIzQzOwkJCQkJCSBza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3NsaWNlX3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzdXJ2aXZlc192ZXRoJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc2tlbCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c3Vydml2ZXNfZ3JlJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3NjcnViX2dyZShza2VsKTsKJiM0MzsKJiM0MzsJdGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogU2VuZCB0ZXN0X3BheWxvYWQgb3ZlciBsb29wYmFjayBVRFAgdG8gcmVjdl9mZCAqLwomIzQzO3N0YXRpYyBpbnQgc2VuZF9sb29wYmFja191ZHAoaW50IHJlY3ZfZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHsKJiM0MzsJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKJiM0MzsJCS5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spLAomIzQzOwl9OwomIzQzOwljaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlpbnQgZmQgPSAtMTsKJiM0MzsJaW50IHBvcnQ7CiYjNDM7CiYjNDM7CXBvcnQgPSBnZXRfc29ja2V0X2xvY2FsX3BvcnQocmVjdl9mZCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHBvcnQsIDAsICYjMzQ7Z2V0X3BvcnQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O3NvY2tldCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlhZGRyLnNpbl9wb3J0ID0gcG9ydDsKJiM0MzsJc2VuZHRvKGZkLCB0ZXN0X3BheWxvYWQsIFRFU1RfUEFZTE9BRF9MRU4sIDAsCiYjNDM7CSAgICAgICAodm9pZCAqKSZhbXA7YWRkciwgc2l6ZW9mKGFkZHIpKTsKJiM0MzsJcmVjdmZyb20ocmVjdl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7CiYjNDM7CXJldCA9IDA7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7ZW51bSB1ZHBfcmVhZGVyX3R5cGUgewomIzQzOwlSRUFERVJfQ0dSUF9TS0IsCiYjNDM7CVJFQURFUl9TS19GSUxURVIsCiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgYWNyb3NzIFRDIGluZ3Jlc3MgLSZndDsgVURQIHJlYWRlciBob29rICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3VkcChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCwgY29uc3QgY2hhciAqbmFtZSwKJiM0MzsJCQkgICAgIGVudW0gdWRwX3JlYWRlcl90eXBlIHJlYWRlcikKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLAomIzQzOwkJICAgIC5pZmluZGV4ID0gMSAvKiBJRklOREVYX0xPICovLAomIzQzOwkJICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqcmVhZGVyX2xpbmsgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7CiYjNDM7CWludCBzZXJ2ZXJfZmQgPSAtMTsKJiM0MzsJaW50IGNncm91cF9mZCA9IC0xOwomIzQzOwlpbnQgZmlsdGVyX2ZkOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlucyA9IG5ldG5zX25ldyhuYW1lLCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG5zLCAmIzM0O25ldG5zX25ldyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJY2dyb3VwX2ZkID0gdGVzdF9fam9pbl9jZ3JvdXAoJiMzNDsvc2tiX2V4dF91ZHAmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGNncm91cF9mZCwgMCwgJiMzNDtqb2luX2Nncm91cCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQsIFNPQ0tfREdSQU0sICYjMzQ7MTI3LjAuMC4xJiMzNDssIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsICYjMzQ7c3RhcnRfc2VydmVyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoJmFtcDt0Y19ob29rKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19ob29rX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJdGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfd3JpdGUpOwomIzQzOwlyZXQgPSBicGZfdGNfYXR0YWNoKCZhbXA7dGNfaG9vaywgJmFtcDt0Y19vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19hdHRhY2gmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXN3aXRjaCAocmVhZGVyKSB7CiYjNDM7CWNhc2UgUkVBREVSX0NHUlBfU0tCOgomIzQzOwkJcmVhZGVyX2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2Nncm91cChza2VsLSZndDtwcm9ncy5jZ3JwX3NrYl9leHRfcmVhZCwKJiM0MzsJCQkJCQkJIGNncm91cF9mZCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssICYjMzQ7YXR0YWNoX2Nncm91cCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBSRUFERVJfU0tfRklMVEVSOgomIzQzOwkJZmlsdGVyX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnNrX2ZpbHRlcl9za2JfZXh0X3JlYWQpOwomIzQzOwkJcmV0ID0gc2V0c29ja29wdChzZXJ2ZXJfZmQsIFNPTF9TT0NLRVQsIFNPX0FUVEFDSF9CUEYsCiYjNDM7CQkJCSAmYW1wO2ZpbHRlcl9mZCwgc2l6ZW9mKGZpbHRlcl9mZCkpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2F0dGFjaF9zb2NrZXRfZmlsdGVyJiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChzZW5kX2xvb3BiYWNrX3VkcChzZXJ2ZXJfZmQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcywgJiMzNDt0ZXN0X3Bhc3MmIzM0Oyk7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kocmVhZGVyX2xpbmspOwomIzQzOwlicGZfdGNfaG9va19kZXN0cm95KCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmIChzZXJ2ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHNlcnZlcl9mZCk7CiYjNDM7CWlmIChjZ3JvdXBfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGNncm91cF9mZCk7CiYjNDM7CW5ldG5zX2ZyZWUobnMpOwomIzQzO30KJiM0MzsKJiM0MztlbnVtIHRjcF9yZWFkZXJfdHlwZSB7CiYjNDM7CVJFQURFUl9TS09QUywKJiM0MzsJUkVBREVSX0xTTSwKJiM0Mzt9OwomIzQzOwomIzQzOy8qIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgaW5ncmVzcyAtJmd0OyBUQ1AgcmVhZGVyIGhvb2sgKi8KJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfdGNwKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lLAomIzQzOwkJCSAgICAgZW51bSB0Y3BfcmVhZGVyX3R5cGUgcmVhZGVyKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssCiYjNDM7CQkgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sCiYjNDM7CQkgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IGJwZl9saW5rICpyZWFkZXJfbGluayA9IE5VTEw7CiYjNDM7CXN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDsKJiM0MzsJaW50IHNlcnZlcl9mZCA9IC0xOwomIzQzOwlpbnQgY2dyb3VwX2ZkID0gLTE7CiYjNDM7CWludCBjbGllbnRfZmQgPSAtMTsKJiM0MzsJaW50IGNvbm5fZmQgPSAtMTsKJiM0MzsJaW50IHBvcnQ7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CW5zID0gbmV0bnNfbmV3KG5hbWUsIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwljZ3JvdXBfZmQgPSB0ZXN0X19qb2luX2Nncm91cCgmIzM0Oy9za2JfZXh0X3RjcCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoY2dyb3VwX2ZkLCAwLCAmIzM0O2pvaW5fY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzZXJ2ZXJfZmQgPSBzdGFydF9zZXJ2ZXIoQUZfSU5FVCwgU09DS19TVFJFQU0sICYjMzQ7MTI3LjAuMC4xJiMzNDssIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsICYjMzQ7c3RhcnRfc2VydmVyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlwb3J0ID0gZ2V0X3NvY2tldF9sb2NhbF9wb3J0KHNlcnZlcl9mZCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHBvcnQsIDAsICYjMzQ7Z2V0X3BvcnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGFyZ2V0X3BvcnQgPSBwb3J0OwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoJmFtcDt0Y19ob29rKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19ob29rX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJdGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfd3JpdGVfcG9ydCk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0Y19ob29rLCAmYW1wO3RjX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7YnBmX3RjX2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc3dpdGNoIChyZWFkZXIpIHsKJiM0MzsJY2FzZSBSRUFERVJfU0tPUFM6CiYjNDM7CQlyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfY2dyb3VwKHNrZWwtJmd0O3Byb2dzLnNrb3BzX3NrYl9leHRfcmVhZCwKJiM0MzsJCQkJCQkJIGNncm91cF9mZCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssICYjMzQ7YXR0YWNoX3Nrb3BzJiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJFQURFUl9MU006CiYjNDM7CQlyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfbHNtKHNrZWwtJmd0O3Byb2dzLmxzbV9za2JfZXh0X3JlYWQpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfUFRSKHJlYWRlcl9saW5rLCAmIzM0O2F0dGFjaF9sc20mIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY2xpZW50X2ZkID0gY29ubmVjdF90b19mZChzZXJ2ZXJfZmQsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShjbGllbnRfZmQsIDAsICYjMzQ7Y29ubmVjdCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJY29ubl9mZCA9IGFjY2VwdChzZXJ2ZXJfZmQsIE5VTEwsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShjb25uX2ZkLCAwLCAmIzM0O2FjY2VwdCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MsICYjMzQ7dGVzdF9wYXNzJiMzNDspOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWlmIChjb25uX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShjb25uX2ZkKTsKJiM0MzsJaWYgKGNsaWVudF9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoY2xpZW50X2ZkKTsKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kocmVhZGVyX2xpbmspOwomIzQzOwlicGZfdGNfaG9va19kZXN0cm95KCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmIChzZXJ2ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHNlcnZlcl9mZCk7CiYjNDM7CWlmIChjZ3JvdXBfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGNncm91cF9mZCk7CiYjNDM7CW5ldG5zX2ZyZWUobnMpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCB1bnRpbCBza2IgZnJlZTogY2dyb3VwL3NrYiBlZ3Jlc3MgLSZndDsga2ZyZWVfc2tiLgomIzQzOyAqIFNlbmQgVURQIHRvIGEgY2xvc2VkIHBvcnQuIFRoZSBwYWNrZXQgaXMgZHJvcHBlZCwgdHJpZ2dlcmluZyBrZnJlZV9za2IuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9jZ3JwX2VncmVzc190b19rZnJlZV9za2Ioc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHsKJiM0MzsJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKJiM0MzsJCS5zaW5fcG9ydCA9IGh0b25zKDQzMjEpLAomIzQzOwkJLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyksCiYjNDM7CX07CiYjNDM7CXN0cnVjdCBicGZfbGluayAqY2dfbGluayA9IE5VTEw7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqdHBfbGluayA9IE5VTEw7CiYjNDM7CXN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDsKJiM0MzsJaW50IGNncm91cF9mZCA9IC0xOwomIzQzOwljaGFyIGJ1ZlsxXTsKJiM0MzsJaW50IGZkID0gLTE7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWNncm91cF9mZCA9IHRlc3RfX2pvaW5fY2dyb3VwKCYjMzQ7L2NncnBfdG9fa2ZyZWUmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGNncm91cF9mZCwgMCwgJiMzNDtqb2luX2Nncm91cCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJbnMgPSBuZXRuc19uZXcoJiMzNDtjZ3JwX3RvX2tmcmVlJiMzNDssIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwljZ19saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9jZ3JvdXAoc2tlbC0mZ3Q7cHJvZ3MuY2dycF9za2JfZXh0X3dyaXRlLAomIzQzOwkJCQkJICAgICBjZ3JvdXBfZmQpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoY2dfbGluaywgJiMzNDthdHRhY2hfY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwl0cF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLSZndDtwcm9ncy50cF9rZnJlZV9za2JfZXh0X3JlYWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIodHBfbGluaywgJiMzNDthdHRhY2hfdHAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtzb2NrZXQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNvbm5lY3QoZmQsICh2b2lkICopJmFtcDthZGRyLCBzaXplb2YoYWRkcikpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7Y29ubmVjdCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gc2VuZChmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEocmV0LCBURVNUX1BBWUxPQURfTEVOLCAmIzM0O3NlbmQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CS8qIFdhaXQgZm9yIElDTVAgZXJyb3IgLS0gY29uZmlybXMgdGhlIHBhY2tldCB3YXMgZnJlZWQgKi8KJiM0MzsJcmV0ID0gcmVjdihmZCwgYnVmLCBzaXplb2YoYnVmKSwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJldCwgLTEsICYjMzQ7cmVjdiYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJQVNTRVJUX0VRKGVycm5vLCBFQ09OTlJFRlVTRUQsICYjMzQ7cmVjdl9lY29ubnJlZnVzZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzLCAmIzM0O3Rlc3RfcGFzcyYjMzQ7KTsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kodHBfbGluayk7CiYjNDM7CWJwZl9saW5rX19kZXN0cm95KGNnX2xpbmspOwomIzQzOwluZXRuc19mcmVlKG5zKTsKJiM0MzsJaWYgKGNncm91cF9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoY2dyb3VwX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBpbmdyZXNzIC0mZ3Q7IG5ldGZpbHRlciBob29rICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X25mKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssCiYjNDM7CQkgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sCiYjNDM7CQkgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX25ldGZpbHRlcl9vcHRzLCBuZl9vcHRzLAomIzQzOwkJICAgIC5wZiA9IE5GUFJPVE9fSVBWNCwKJiM0MzsJCSAgICAuaG9va251bSA9IE5GX0lORVRfTE9DQUxfSU4sCiYjNDM7CQkgICAgLnByaW9yaXR5ID0gMSk7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqcmVhZGVyX2xpbmsgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7CiYjNDM7CWludCBzZXJ2ZXJfZmQgPSAtMTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJbnMgPSBuZXRuc19uZXcobmFtZSwgdHJ1ZSk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihucywgJiMzNDtuZXRuc19uZXcmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVULCBTT0NLX0RHUkFNLCAmIzM0OzEyNy4wLjAuMSYjMzQ7LCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0Uoc2VydmVyX2ZkLCAwLCAmIzM0O3N0YXJ0X3NlcnZlciYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MgPSBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3dyaXRlKTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3RjX2hvb2ssICZhbXA7dGNfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfbmV0ZmlsdGVyKHNrZWwtJmd0O3Byb2dzLm5mX3NrYl9leHRfcmVhZCwKJiM0MzsJCQkJCQkgICAgJmFtcDtuZl9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHJlYWRlcl9saW5rLCAmIzM0O2F0dGFjaF9uZiYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKHNlbmRfbG9vcGJhY2tfdWRwKHNlcnZlcl9mZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzLCAmIzM0O3Rlc3RfcGFzcyYjMzQ7KTsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwlicGZfbGlua19fZGVzdHJveShyZWFkZXJfbGluayk7CiYjNDM7CWJwZl90Y19ob29rX2Rlc3Ryb3koJmFtcDt0Y19ob29rKTsKJiM0MzsJaWYgKHNlcnZlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uoc2VydmVyX2ZkKTsKJiM0MzsJbmV0bnNfZnJlZShucyk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgTFdUX0VYVF9QSU5fUEFUSCAmIzM0Oy9zeXMvZnMvYnBmL3NrYl9leHRfbHd0JiMzNDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3Qgc2tiX2V4dCBhY3Jvc3MgTFdUIGhvb2tzIG9uIGxvb3BiYWNrLgomIzQzOyAqCiYjNDM7ICogQGx3dF9wcm9nOiAgQlBGIHByb2dyYW0gdG8gcGluIGFuZCBhdHRhY2ggdmlhIGlwIHJvdXRlIGVuY2FwCiYjNDM7ICogQGVuY2FwX2RpcjogJiMzNDtpbiYjMzQ7LCAmIzM0O291dCYjMzQ7LCBvciAmIzM0O3htaXQmIzM0OwomIzQzOyAqIEB3cml0ZXI6ICAgIHRydWUgaWYgbHd0X3Byb2cgd3JpdGVzIHNrYl9leHQgKHJlYWRlciBvbiBUQyBpbmdyZXNzKSwKJiM0MzsgKiAgICAgICAgICAgICBmYWxzZSBpZiBsd3RfcHJvZyByZWFkcyBza2JfZXh0ICh3cml0ZXIgb24gVEMgaW5ncmVzcykKJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfbHd0KHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lLAomIzQzOwkJCSAgICAgc3RydWN0IGJwZl9wcm9ncmFtICpsd3RfcHJvZywKJiM0MzsJCQkgICAgIGNvbnN0IGNoYXIgKmVuY2FwX2RpciwgYm9vbCB3cml0ZXIpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywKJiM0MzsJCSAgICAuaWZpbmRleCA9IDEgLyogSUZJTkRFWF9MTyAqLywKJiM0MzsJCSAgICAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpOwomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHsKJiM0MzsJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKJiM0MzsJfTsKJiM0MzsJc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcm9nOwomIzQzOwljaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwlib29sIHBpbm5lZCA9IGZhbHNlOwomIzQzOwlpbnQgc2VydmVyX2ZkID0gLTE7CiYjNDM7CWludCBmZCA9IC0xOwomIzQzOwlpbnQgcG9ydDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJdW5saW5rKExXVF9FWFRfUElOX1BBVEgpOwomIzQzOwlyZXQgPSBicGZfcHJvZ3JhbV9fcGluKGx3dF9wcm9nLCBMV1RfRVhUX1BJTl9QQVRIKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3BpbiBsd3QmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXBpbm5lZCA9IHRydWU7CiYjNDM7CiYjNDM7CW5zID0gbmV0bnNfbmV3KG5hbWUsIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX3ByZWhvb2s7CiYjNDM7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIGFkZHIgYWRkIDEwLjAuMC4xLzMyIGRldiBsbyYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgcm91dGUgcmVwbGFjZSB0YWJsZSBsb2NhbCBsb2NhbCAxMC4wLjAuMSAmIzM0OwomIzQzOwkJICAgICAmIzM0O2VuY2FwIGJwZiAlcyBwaW5uZWQgJiMzNDsgTFdUX0VYVF9QSU5fUEFUSCAmIzM0OyBkZXYgbG8mIzM0OywKJiM0MzsJCSAgICAgZW5jYXBfZGlyKTsKJiM0MzsKJiM0MzsJc2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQsIFNPQ0tfREdSQU0sICYjMzQ7MTAuMC4wLjEmIzM0OywgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHNlcnZlcl9mZCwgMCwgJiMzNDtzdGFydF9zZXJ2ZXImIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfcHJlaG9vazsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MgPSBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfcHJlaG9vazsKJiM0MzsKJiM0MzsJLyogV2hlbiBMV1Qgd3JpdGVzLCBUQyBpbmdyZXNzIHJlYWRzOyB3aGVuIExXVCByZWFkcywgVEMgaW5ncmVzcyB3cml0ZXMgKi8KJiM0MzsJdGNfcHJvZyA9IHdyaXRlciA/IHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfcmVhZAomIzQzOwkJCSA6IHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfd3JpdGU7CiYjNDM7CXRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZCh0Y19wcm9nKTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3RjX2hvb2ssICZhbXA7dGNfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlwb3J0ID0gZ2V0X3NvY2tldF9sb2NhbF9wb3J0KHNlcnZlcl9mZCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHBvcnQsIDAsICYjMzQ7Z2V0X3BvcnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtzb2NrZXQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWluZXRfcHRvbihBRl9JTkVULCAmIzM0OzEwLjAuMC4xJiMzNDssICZhbXA7YWRkci5zaW5fYWRkcik7CiYjNDM7CWFkZHIuc2luX3BvcnQgPSBwb3J0OwomIzQzOwlyZXQgPSBzZW5kdG8oZmQsIHRlc3RfcGF5bG9hZCwgVEVTVF9QQVlMT0FEX0xFTiwgMCwKJiM0MzsJCSAgICAgKHZvaWQgKikmYW1wO2FkZHIsIHNpemVvZihhZGRyKSk7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJldCwgVEVTVF9QQVlMT0FEX0xFTiwgJiMzNDtzZW5kdG8mIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CXJldCA9IHJlY3Zmcm9tKHNlcnZlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7CiYjNDM7CUFTU0VSVF9FUShyZXQsIFRFU1RfUEFZTE9BRF9MRU4sICYjMzQ7cmVjdmZyb20mIzM0Oyk7CiYjNDM7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzLCAmIzM0O3Rlc3RfcGFzcyYjMzQ7KTsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJYnBmX3RjX2hvb2tfZGVzdHJveSgmYW1wO3RjX2hvb2spOwomIzQzO2NsZWFudXBfcHJlaG9vazoKJiM0MzsJaWYgKHNlcnZlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uoc2VydmVyX2ZkKTsKJiM0MzsJbmV0bnNfZnJlZShucyk7CiYjNDM7CWlmIChwaW5uZWQpCiYjNDM7CQl1bmxpbmsoTFdUX0VYVF9QSU5fUEFUSCk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgU0VHNl9QSU5fUEFUSCAmIzM0Oy9zeXMvZnMvYnBmL3NrYl9leHRfc2VnNmxvY2FsJiMzNDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgZWdyZXNzIC0mZ3Q7IHNlZzZsb2NhbCBFbmQuQlBGIGhvb2suCiYjNDM7ICoKJiM0MzsgKiBUb3BvbG9neToKJiM0MzsgKgomIzQzOyAqICAgICBOUzEgICAgICAgICAgIE5TMiAgICAgICAgICAgIE5TMwomIzQzOyAqICAgbG8gdmV0aDEgJmx0Oy0mZ3Q7IHZldGgyIHZldGgzICZsdDstJmd0OyB2ZXRoNCBsbwomIzQzOyAqCiYjNDM7ICogTlMxIGVuY2FwcyBmYjAxOjoyIHdpdGggU1JIIChzZWdtZW50cyBmZDAxOjoxLGZkMDE6OjIpIG9uIG91dHB1dCBhbmQKJiM0MzsgKiB3cml0ZXMgc2tiX2V4dCBhdCBUQyBlZ3Jlc3Mgb24gdmV0aDEuIE5TMiBydW5zIEVuZC5CUEYgZm9yIGZkMDE6OjEsCiYjNDM7ICogd2hpY2ggcmVhZHMgc2tiX2V4dCwgdGhlbiBmb3J3YXJkcyB0byBOUzMgKHNlZzZfbG9va3VwX25leHRob3AKJiM0MzsgKiByZWplY3RzIGxvb3BiYWNrIHJvdXRlcyB3aXRoIGxvY2FsX2RlbGl2ZXJ5PWZhbHNlLCBzbyBFbmQuQlBGCiYjNDM7ICogY2Fubm90IGRlbGl2ZXIgbG9jYWxseSkuIE5TMyBoYXMgZmQwMTo6MiBsb2NhbCwgZGVjYXBzdWxhdGVzLCBhbmQKJiM0MzsgKiBkZWxpdmVycyB0aGUgaW5uZXIgVURQIChkc3Q9ZmIwMTo6MikgdG8gYSBsb2NhbCBzb2NrZXQgZm9yIHRlc3QKJiM0MzsgKiBzeW5jaHJvbml6YXRpb24uCiYjNDM7ICoKJiM0MzsgKiBUaGUgVEMgcHJvZ3JhbSBkcm9wcyBub24tdGVzdCBwYWNrZXRzLCBzbyBORFAgaXMgYnlwYXNzZWQgd2l0aCBhCiYjNDM7ICogc3RhdGljIG5laWdoYm9yIGVudHJ5IG9uIHRoZSBOUzEtJmd0O05TMiBob3AuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NlZzZsb2NhbChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0VHUkVTUyk7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7CiYjNDM7CXN0cnVjdCBuc3Rva2VuICpuc3Rva2VuID0gTlVMTDsKJiM0MzsJc3RydWN0IHNvY2thZGRyX2luNiBkc3QgPSB7fTsKJiM0MzsJY2hhciBidWZbVEVTVF9QQVlMT0FEX0xFTl07CiYjNDM7CWJvb2wgcGlubmVkID0gZmFsc2U7CiYjNDM7CWludCBjbGllbnRfZmQgPSAtMTsKJiM0MzsJaW50IHNlcnZlcl9mZCA9IC0xOwomIzQzOwlzc2l6ZV90IGJ5dGVzOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwl1bmxpbmsoU0VHNl9QSU5fUEFUSCk7CiYjNDM7CXJldCA9IGJwZl9wcm9ncmFtX19waW4oc2tlbC0mZ3Q7cHJvZ3Muc2VnNmxvY2FsX3NrYl9leHRfcmVhZCwKJiM0MzsJCQkgICAgICAgU0VHNl9QSU5fUEFUSCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtwaW4gc2VnNmxvY2FsJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlwaW5uZWQgPSB0cnVlOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBuZXRucyBhZGQgc2VnNl8xJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBuZXRucyBhZGQgc2VnNl8yJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBuZXRucyBhZGQgc2VnNl8zJiMzNDspOwomIzQzOwomIzQzOwkvKiBOUzEgJmx0Oy0mZ3Q7IE5TMiB2ZXRoIHBhaXI7IHN0YXRpYyBORFAgc2luY2UgVEMgZHJvcHMgTlMvTkEgKi8KJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8xIGxpbmsgYWRkIHZldGgxIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDIgbmV0bnMgc2VnNl8yJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzEgbGluayBzZXQgZGV2IHZldGgxIHVwJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzIgbGluayBzZXQgZGV2IHZldGgyIGFkZHJlc3MgMDI6MDA6MDA6MDA6MDA6MDImIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC1uIHNlZzZfMiBsaW5rIHNldCBkZXYgdmV0aDIgdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC1uIHNlZzZfMSAtNiBhZGRyIGFkZCBmYjAwOjoxMi8xNiBkZXYgdmV0aDEgc2NvcGUgbGluayBub2RhZCYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8yIC02IGFkZHIgYWRkIGZiMDA6OjIxLzE2IGRldiB2ZXRoMiBzY29wZSBsaW5rIG5vZGFkJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzEgLTYgbmVpZ2ggYWRkIGZiMDA6OjIxIGxsYWRkciAwMjowMDowMDowMDowMDowMiAmIzM0OwomIzQzOwkJICAgICAmIzM0O251ZCBwZXJtYW5lbnQgZGV2IHZldGgxJiMzNDspOwomIzQzOwomIzQzOwkvKiBOUzIgJmx0Oy0mZ3Q7IE5TMyB2ZXRoIHBhaXIgKi8KJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8yIGxpbmsgYWRkIHZldGgzIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDQgbmV0bnMgc2VnNl8zJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzIgbGluayBzZXQgZGV2IHZldGgzIHVwJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzMgbGluayBzZXQgZGV2IHZldGg0IHVwJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzIgLTYgYWRkciBhZGQgZmIwMDo6MzQvMTYgZGV2IHZldGgzIHNjb3BlIGxpbmsgbm9kYWQmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC1uIHNlZzZfMyAtNiBhZGRyIGFkZCBmYjAwOjo0My8xNiBkZXYgdmV0aDQgc2NvcGUgbGluayBub2RhZCYjMzQ7KTsKJiM0MzsKJiM0MzsJLyogTlMxOiBzb3VyY2UgYWRkcmVzcyAmIzQzOyBTUkggZW5jYXAgb24gb3V0cHV0ICYjNDM7IHJvdXRlIGZvciBmZDAxOjovMTYgKi8KJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8xIGxpbmsgc2V0IGRldiBsbyB1cCYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8xIC02IGFkZHIgYWRkIGZiMDE6OjEvMTI4IGRldiBsbyBub2RhZCYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8xIC02IHJvdXRlIGFkZCBmYjAxOjoyIGVuY2FwIHNlZzYgbW9kZSBlbmNhcCAmIzM0OwomIzQzOwkJICAgICAmIzM0O3NlZ3MgZmQwMTo6MSxmZDAxOjoyIGRldiB2ZXRoMSB2aWEgZmIwMDo6MjEmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC1uIHNlZzZfMSAtNiByb3V0ZSBhZGQgZmQwMTo6LzE2IGRldiB2ZXRoMSB2aWEgZmIwMDo6MjEmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIE5TMjogc2VnNmxvY2FsIEVuZC5CUEYgZm9yIGZkMDE6OjEsIHRoZW4gZm9yd2FyZCB0byBOUzMuCiYjNDM7CSAqIFVzZSBvcGVuX25ldG5zIHNvIHRoZSBwaW5uZWQgcHJvZyBvbiBicGZmcyBpcyBhY2Nlc3NpYmxlLgomIzQzOwkgKi8KJiM0MzsJbnN0b2tlbiA9IG9wZW5fbmV0bnMoJiMzNDtzZWc2XzImIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCAmIzM0O29wZW4gc2VnNl8yJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBsaW5rIHNldCBkZXYgbG8gdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O3N5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5hbGwuZm9yd2FyZGluZz0xJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtNiByb3V0ZSBhZGQgZmQwMTo6Mi8xMjggZGV2IHZldGgzIHZpYSBmYjAwOjo0MyYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLTYgcm91dGUgYWRkIGZkMDE6OjEgZW5jYXAgc2VnNmxvY2FsICYjMzQ7CiYjNDM7CQkgICAgICYjMzQ7YWN0aW9uIEVuZC5CUEYgZW5kcG9pbnQgcGlubmVkICYjMzQ7IFNFRzZfUElOX1BBVEggJiMzNDsgZGV2IHZldGgyJiMzNDspOwomIzQzOwomIzQzOwljbG9zZV9uZXRucyhuc3Rva2VuKTsKJiM0MzsJbnN0b2tlbiA9IE5VTEw7CiYjNDM7CiYjNDM7CS8qIE5TMzogZGVjYXAgcG9pbnQgJiM0MzsgVURQIHNlcnZlci4KJiM0MzsJICogZmQwMTo6MiBsb2NhbCB0cmlnZ2VycyBTUkggZGVjYXAgKHNlZ21lbnRzX2xlZnQ9MCkuCiYjNDM7CSAqIGZiMDE6OjIgbG9jYWwgZGVsaXZlcnMgdGhlIGlubmVyIFVEUCB0byB0aGUgc29ja2V0LgomIzQzOwkgKi8KJiM0MzsJbnN0b2tlbiA9IG9wZW5fbmV0bnMoJiMzNDtzZWc2XzMmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCAmIzM0O29wZW4gc2VnNl8zJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBsaW5rIHNldCBkZXYgbG8gdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O3N5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5hbGwuc2VnNl9lbmFibGVkPTEmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O3N5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5sby5zZWc2X2VuYWJsZWQ9MSYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7c3lzY3RsIC13cSBuZXQuaXB2Ni5jb25mLnZldGg0LnNlZzZfZW5hYmxlZD0xJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtNiBhZGRyIGFkZCBmZDAxOjoyLzEyOCBkZXYgbG8gbm9kYWQmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC02IGFkZHIgYWRkIGZiMDE6OjIvMTI4IGRldiBsbyBub2RhZCYjMzQ7KTsKJiM0MzsKJiM0MzsJc2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAmIzM0O2ZiMDE6OjImIzM0OywgMTIzNCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHNlcnZlcl9mZCwgMCwgJiMzNDtzdGFydF9zZXJ2ZXImIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWNsb3NlX25ldG5zKG5zdG9rZW4pOwomIzQzOwluc3Rva2VuID0gTlVMTDsKJiM0MzsKJiM0MzsJLyogTlMxOiB3cml0ZSBza2JfZXh0IGF0IFRDIGVncmVzcyBvbiB2ZXRoMSwgdGhlbiBzZW5kLgomIzQzOwkgKiBUQyBlZ3Jlc3MgZmlyZXMgYWZ0ZXIgc2VnNiBlbmNhcCwgb24gdGhlIGVuY2FwcGVkIHBhY2tldC4KJiM0MzsJICovCiYjNDM7CW5zdG9rZW4gPSBvcGVuX25ldG5zKCYjMzQ7c2VnNl8xJiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnN0b2tlbiwgJiMzNDtvcGVuIHNlZzZfMSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJdGNfaG9vay5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoJiMzNDt2ZXRoMSYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QodGNfaG9vay5pZmluZGV4LCAwLCAmIzM0O2lmaW5kZXggdmV0aDEmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90Y19ob29rX2NyZWF0ZSgmYW1wO3RjX2hvb2spOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7YnBmX3RjX2hvb2tfY3JlYXRlJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0Y19ob29rLCAmYW1wO3RjX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7YnBmX3RjX2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJY2xpZW50X2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoY2xpZW50X2ZkLCAwLCAmIzM0O3NvY2tldCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJZHN0LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiYjNDM7CWRzdC5zaW42X3BvcnQgPSBodG9ucygxMjM0KTsKJiM0MzsJaW5ldF9wdG9uKEFGX0lORVQ2LCAmIzM0O2ZiMDE6OjImIzM0OywgJmFtcDtkc3Quc2luNl9hZGRyKTsKJiM0MzsKJiM0MzsJYnl0ZXMgPSBzZW5kdG8oY2xpZW50X2ZkLCB0ZXN0X3BheWxvYWQsIFRFU1RfUEFZTE9BRF9MRU4sIDAsCiYjNDM7CQkgICAgICAgKHZvaWQgKikmYW1wO2RzdCwgc2l6ZW9mKGRzdCkpOwomIzQzOwomIzQzOwljbG9zZV9uZXRucyhuc3Rva2VuKTsKJiM0MzsJbnN0b2tlbiA9IE5VTEw7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX0VRKGJ5dGVzLCBURVNUX1BBWUxPQURfTEVOLCAmIzM0O3NlbmR0byYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJLyogUmVjZWl2ZSBkZWNhcHN1bGF0ZWQgcGFja2V0IC0tIHN5bmNocm9uaXplcyB3aXRoIHNlZzZsb2NhbCAqLwomIzQzOwluc3Rva2VuID0gb3Blbl9uZXRucygmIzM0O3NlZzZfMyYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sICYjMzQ7b3BlbiBzZWc2XzMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWJ5dGVzID0gcmVjdmZyb20oc2VydmVyX2ZkLCBidWYsIHNpemVvZihidWYpLCAwLCBOVUxMLCBOVUxMKTsKJiM0MzsJQVNTRVJUX0VRKGJ5dGVzLCBURVNUX1BBWUxPQURfTEVOLCAmIzM0O3JlY3Zmcm9tJiMzNDspOwomIzQzOwlBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcywgJiMzNDt0ZXN0X3Bhc3MmIzM0Oyk7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xvc2VfbmV0bnMobnN0b2tlbik7CiYjNDM7CWlmIChzZXJ2ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHNlcnZlcl9mZCk7CiYjNDM7CWlmIChjbGllbnRfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGNsaWVudF9mZCk7CiYjNDM7CVNZU19OT0ZBSUwoJiMzNDtpcCBuZXRucyBkZWwgc2VnNl8zJiMzNDspOwomIzQzOwlTWVNfTk9GQUlMKCYjMzQ7aXAgbmV0bnMgZGVsIHNlZzZfMiYjMzQ7KTsKJiM0MzsJU1lTX05PRkFJTCgmIzM0O2lwIG5ldG5zIGRlbCBzZWc2XzEmIzM0Oyk7CiYjNDM7CWlmIChwaW5uZWQpCiYjNDM7CQl1bmxpbmsoU0VHNl9QSU5fUEFUSCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBpbmdyZXNzIC0mZ3Q7IHNrX3NrYiB2ZXJkaWN0IGhvb2suICBUQyBpbmdyZXNzCiYjNDM7ICogd3JpdGVzIHNrYl9leHQgb24gbG9vcGJhY2s7IHRoZSB2ZXJkaWN0IHByb2dyYW0gcmVhZHMgaXQgb24gc2tiIGRlbGl2ZXJ5IHRvIGEKJiM0MzsgKiBzb2NrZXQgaW4gdGhlIHNvY2ttYXAuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NrX3NrYihzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLAomIzQzOwkJICAgIC5pZmluZGV4ID0gMSAvKiBJRklOREVYX0xPICovLAomIzQzOwkJICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqdmVyZGljdF9saW5rID0gTlVMTDsKJiM0MzsJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CiYjNDM7CXNvY2tsZW5fdCBhZGRyX2xlbiA9IHNpemVvZihhZGRyKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwljaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTsKJiM0MzsJaW50IGMxID0gLTEsIHAxID0gLTE7CiYjNDM7CWludCBtYXAgPSAtMSwgemVybyA9IDA7CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJbnMgPSBuZXRuc19uZXcoJiMzNDt0Y190b19za19za2ImIzM0OywgdHJ1ZSk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihucywgJiMzNDtuZXRuc19uZXcmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzID0gZmFsc2U7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90Y19ob29rX2NyZWF0ZSgmYW1wO3RjX2hvb2spOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7YnBmX3RjX2hvb2tfY3JlYXRlJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZV9wb3J0KTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3RjX2hvb2ssICZhbXA7dGNfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwltYXAgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfU09DS01BUCwgTlVMTCwgc2l6ZW9mKGludCksCiYjNDM7CQkJICAgICBzaXplb2YoaW50KSwgMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKG1hcCwgMCwgJiMzNDticGZfbWFwX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJdmVyZGljdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9zb2NrbWFwKHNrZWwtJmd0O3Byb2dzLnNrX3NrYl9za2JfZXh0X3JlYWQsCiYjNDM7CQkJCQkJICAgbWFwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHZlcmRpY3RfbGluaywgJiMzNDthdHRhY2hfc29ja21hcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0soY3JlYXRlX3BhaXIoQUZfSU5FVCwgU09DS19TVFJFQU0sICZhbXA7YzEsICZhbXA7cDEpLCAmIzM0O2NyZWF0ZV9wYWlyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcCwgJmFtcDt6ZXJvLCAmYW1wO2MxLCBCUEZfTk9FWElTVCksICYjMzQ7bWFwX3VwZGF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0c29ja25hbWUoYzEsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYW1wO2FkZHIsICZhbXA7YWRkcl9sZW4pLAomIzQzOwkJICAgICAgICYjMzQ7Z2V0c29ja25hbWUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGFyZ2V0X3BvcnQgPSBhZGRyLnNpbl9wb3J0OwomIzQzOwomIzQzOwluID0gc2VuZChwMSwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEobiwgVEVTVF9QQVlMT0FEX0xFTiwgJiMzNDtzZW5kJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwluID0gcmVjdl90aW1lb3V0KGMxLCBidWYsIHNpemVvZihidWYpLCBNU0dfRE9OVFdBSVQsIElPX1RJTUVPVVRfU0VDKTsKJiM0MzsJQVNTRVJUX0VRKG4sIFRFU1RfUEFZTE9BRF9MRU4sICYjMzQ7cmVjdiYjMzQ7KTsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MsICYjMzQ7dGVzdF9wYXNzJiMzNDspOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWlmIChjMSAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoYzEpOwomIzQzOwlpZiAocDEgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHAxKTsKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kodmVyZGljdF9saW5rKTsKJiM0MzsJaWYgKG1hcCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UobWFwKTsKJiM0MzsJYnBmX3RjX2hvb2tfZGVzdHJveSgmYW1wO3RjX2hvb2spOwomIzQzOwluZXRuc19mcmVlKG5zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X3NrYl9leHRfY3Jvc3NfaG9vayh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwlza2VsID0gdGVzdF94ZHBfbWV0YV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtvcGVuIGFuZCBsb2FkIHNrZWxldG9uJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3RvX2NncnBfaW5ncmVzcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF91ZHAoc2tlbCwgJiMzNDt0Y190b19jZ3JwX2luZ3Jlc3MmIzM0OywgUkVBREVSX0NHUlBfU0tCKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0Y190b19za19maWx0ZXImIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdWRwKHNrZWwsICYjMzQ7dGNfdG9fc2tfZmlsdGVyJiMzNDssIFJFQURFUl9TS19GSUxURVIpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3RvX2xzbSYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF90Y3Aoc2tlbCwgJiMzNDt0Y190b19sc20mIzM0OywgUkVBREVSX0xTTSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfdG9fc2tvcHMmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdGNwKHNrZWwsICYjMzQ7dGNfdG9fc2tvcHMmIzM0OywgUkVBREVSX1NLT1BTKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JwX2VncmVzc190b19rZnJlZV9za2ImIzM0OykpCiYjNDM7CQl0ZXN0X2NncnBfZWdyZXNzX3RvX2tmcmVlX3NrYihza2VsKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0Y190b19uZiYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF9uZihza2VsLCAmIzM0O3RjX3RvX25mJiMzNDspOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3RvX2x3dF9pbiYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF9sd3Qoc2tlbCwgJiMzNDt0Y190b19sd3RfaW4mIzM0OywKJiM0MzsJCQkJIHNrZWwtJmd0O3Byb2dzLmx3dF9pbl9za2JfZXh0X3JlYWQsICYjMzQ7aW4mIzM0OywgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2x3dF9vdXRfdG9fdGMmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfbHd0KHNrZWwsICYjMzQ7bHd0X291dF90b190YyYjMzQ7LAomIzQzOwkJCQkgc2tlbC0mZ3Q7cHJvZ3MubHd0X291dF9za2JfZXh0X3dyaXRlLCAmIzM0O291dCYjMzQ7LCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtsd3RfeG1pdF90b190YyYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF9sd3Qoc2tlbCwgJiMzNDtsd3RfeG1pdF90b190YyYjMzQ7LAomIzQzOwkJCQkgc2tlbC0mZ3Q7cHJvZ3MubHd0X3htaXRfc2tiX2V4dF93cml0ZSwgJiMzNDt4bWl0JiMzNDssIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3RvX3NlZzZsb2NhbCYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF9zZWc2bG9jYWwoc2tlbCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfdG9fc2tfc2tiJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3NrX3NrYihza2VsKTsKJiM0MzsKJiM0MzsJdGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYwppbmRleCAwOGIwM2JlMGI4OTFjLi44MGNkZmVlNjE1Y2NiIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmMKQEAgLTMsOSAmIzQzOzMsMTEgQEAKIAogI2luY2x1ZGUgJmx0O2JwZi9icGZfZW5kaWFuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwogI2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7YnBmX2tmdW5jcy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9taXNjLmgmIzM0OwogI2luY2x1ZGUgJiMzNDticGZfdHJhY2luZ19uZXQuaCYjMzQ7CiAKICNkZWZpbmUgTUVUQV9TSVpFIDMyCkBAIC0yMiwxMCAmIzQzOzI0LDEwIEBACiBib29sIHRlc3RfcGFzczsKIAogc3RhdGljIGNvbnN0IF9fdTggbWV0YV93YW50W01FVEFfU0laRV0gPSB7Ci0JMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKLQkweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LAotCTB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCi0JMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKJiM0MzsJMHg0OSwgMHgyMCwgMHg2MywgMHg3MiwgMHg2ZiwgMHg3MywgMHg3MywgMHg2NSwKJiM0MzsJMHg2NCwgMHgyMCwgMHg2OCwgMHg2ZiwgMHg2ZiwgMHg2YiwgMHg3MywgMHgyMCwKJiM0MzsJMHgyNiwgMHgyMCwgMHg2YywgMHg2OSwgMHg3NiwgMHg2NSwgMHg2NCwgMHgyMCwKJiM0MzsJMHg3NCwgMHg2ZiwgMHgyMCwgMHg3NCwgMHg2NSwgMHg2YywgMHg2YywgMHgyMSwKIH07CiAKIHN0YXRpYyBib29sIGNoZWNrX21ldGFkYXRhKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBfX3U4ICptZXRhX2hhdmUpCkBAIC02ODksNCAmIzQzOzY5MSw1NjMgQEAgaW50IGhlbHBlcl9za2JfY2hhbmdlX3Byb3RvKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKIAlyZXR1cm4gVENfQUNUX1NIT1Q7CiB9CiAKJiM0Mztib29sIHdyaXRlX2RvbmU7CiYjNDM7CiYjNDM7LyogV3JpdGUgdG8gc2tiX2V4dCB1c2luZyBicGZfZHlucHRyX3dyaXRlIGhlbHBlciAqLwomIzQzO1NFQygmIzM0O3RjJiMzNDspCiYjNDM7aW50IHRjX3NrYl9leHRfd3JpdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfd3JpdGUoJmFtcDttZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgQVJSQVlfU0laRShtZXRhX3dhbnQpLCAwKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJd3JpdGVfZG9uZSA9IHRydWU7CiYjNDM7CXJldHVybiBUQ19BQ1RfVU5TUEVDOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWFkIGZyb20gc2tiLWV4dCBtZXRhZGF0YSB1c2luZyBicGZfZHlucHRyX3JlYWQgaGVscGVyICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CV9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBBUlJBWV9TSVpFKG1ldGFfaGF2ZSksICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgZnJvbSBhIGNsb25lZCBza2JfZXh0IGR5bnB0ciAqLwomIzQzO1NFQygmIzM0O3RjJiMzNDspCiYjNDM7aW50IHRjX3NrYl9leHRfY2xvbmVfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhLCBjbG9uZTsKJiM0MzsJX191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfY2xvbmUoJmFtcDttZXRhLCAmYW1wO2Nsb25lKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIEFSUkFZX1NJWkUobWV0YV9oYXZlKSwgJmFtcDtjbG9uZSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgZnJvbSBza2JfZXh0IHVzaW5nIGJwZl9keW5wdHJfc2xpY2UgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X3NsaWNlX3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsJX191OCAqbWV0YV9oYXZlOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwltZXRhX2hhdmUgPSBicGZfZHlucHRyX3NsaWNlKCZhbXA7bWV0YSwgMCwgTlVMTCwgTUVUQV9TSVpFKTsKJiM0MzsJaWYgKCFtZXRhX2hhdmUpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzOy8qIFdyaXRlIHRvIHNrYl9leHQgdXNpbmcgYnBmX2R5bnB0cl9zbGljZV9yZHdyICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF9zbGljZV93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwlfX3U4ICpkc3Q7CiYjNDM7CiYjNDM7CWlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWRzdCA9IGJwZl9keW5wdHJfc2xpY2VfcmR3cigmYW1wO21ldGEsIDAsIE5VTEwsIE1FVEFfU0laRSk7CiYjNDM7CWlmICghZHN0KQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlfX2J1aWx0aW5fbWVtY3B5KGRzdCwgbWV0YV93YW50LCBNRVRBX1NJWkUpOwomIzQzOwomIzQzOwlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogT3BlbmluZyBza2JfZXh0IHdpdGhvdXQgRl9DUkVBVEUgb24gYSBmcmVzaCBza2Igc2hvdWxkIGZhaWwgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X25vX2FsbG9jKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgJmFtcDttZXRhKSAhPSAtRU5PRU5UKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwl0ZXN0X3Bhc3MgPSB0cnVlOwomIzQzOwlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogSW52YWxpZCBmbGFncyBhcmUgcmVqZWN0ZWQgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X2ludmFsaWRfZmxhZ3Moc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCB+MFVMTCwgJmFtcDttZXRhKSAhPSAtRUlOVkFMKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwl0ZXN0X3Bhc3MgPSB0cnVlOwomIzQzOwlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogV2l0aG91dCBGX0NSRUFURSB0aGUgZHlucHRyIGlzIHJlYWQtb25seSAqLwomIzQzO1NFQygmIzM0O3RjJiMzNDspCiYjNDM7aW50IHRjX3NrYl9leHRfcmRvbmx5KHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CV9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJLyogQ3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgZXh0ICovCiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwkvKiBSZW9wZW4gd2l0aG91dCBGX0NSRUFURSAtLSBzaG91bGQgYmUgcmVhZC1vbmx5ICovCiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIFZlcmlmeSByZWFkLW9ubHk6IHdyaXRlcyBtdXN0IGZhaWwsIHJlYWRzIG11c3Qgd29yayAqLwomIzQzOwlpZiAoIWJwZl9keW5wdHJfaXNfcmRvbmx5KCZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCAmYW1wO21ldGEsIDAsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiBUQ19BQ1RfVU5TUEVDOwomIzQzO30KJiM0MzsKJiM0MzsvKiBEb3VibGUgYWxsb2M6IGRhdGEgZnJvbSBmaXJzdCBhbGxvYyBzdXJ2aXZlcyBzZWNvbmQgc2tiX2V4dF9hZGQgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X2RvdWJsZV9hbGxvYyhzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIEZpcnN0IGFsbG9jICYjNDM7IHdyaXRlICovCiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwkvKiBTZWNvbmQgYWxsb2MgLS0gc2tiX2V4dF9hZGQgcmV0dXJucyBleGlzdGluZyBleHQgKi8KJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBfX3U4IG1ldGFfemVyb1tNRVRBX1NJWkVdID0ge307CiYjNDM7CiYjNDM7Ym9vbCBjbG9uZV9jb3dfZG9uZTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE92ZXJ3cml0ZSBza2JfZXh0IG9uIHRoZSBjbG9uZSB2aWEgRl9DUkVBVEUgKENPVykgLS0gbXVzdCBub3QgYWZmZWN0IG9yaWdpbmFsLgomIzQzOyAqIFJ1bnMgb24gdGhlIGR1bW15IGluZ3Jlc3MgKGNsb25lIHNpZGUpLCBzeW5jaHJvbm91c2x5IGR1cmluZyB0YyBtaXJyZWQuCiYjNDM7ICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF9jbG9uZV9yZWRpcl9jb3coc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIFplcm8gb3V0IHRoZSBjbG9uZSYjMzk7cyBleHQgLS0gbXVzdCBub3QgYWZmZWN0IG9yaWdpbmFsICovCiYjNDM7CWlmIChicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3plcm8sIE1FVEFfU0laRSwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CWNsb25lX2Nvd19kb25lID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFZlcmlmeSBDT1cgaXNvbGF0aW9uIGF0IGtmcmVlX3NrYiB0aW1lOiBvbmNlIGNsb25lX2Nvd19kb25lIGlzIHNldCwKJiM0MzsgKiBjaGVjayB0aGF0IHRoZSBvcmlnaW5hbCBza2Igc3RpbGwgaGFzIG1ldGFfd2FudC4KJiM0MzsgKi8KJiM0MztTRUMoJiMzNDt0cF9idGYva2ZyZWVfc2tiJiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKHRwX2tmcmVlX3NrYl9jb3dfY2hlY2ssIHN0cnVjdCBza19idWZmICpza2IpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoIWNsb25lX2Nvd19kb25lKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgMCwgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCAmYW1wO21ldGEsIDAsIDApKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwl0ZXN0X3Bhc3MgPSB0cnVlOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7X191MzIgY2xvbmVfcmVkaXJfaWZpbmRleDsKJiM0Mztib29sIHdyaXRlX2Jsb2NrZWQ7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBXcml0ZSBza2JfZXh0LCBjbG9uZSB0aGUgc2tiIHRvIGEgZGVsYXllZCBxZGlzYyBzbyB0aGUgY2xvbmUga2VlcHMgdGhlIGV4dAomIzQzOyAqIGJsb2NrIHNoYXJlZCwgdGhlbiB0cnkgdG8gd3JpdGUgdG8gdGhlIHNhbWUgZHlucHRyIGFnYWluLiBUaGUgd3JpdGUgbXVzdCBmYWlsCiYjNDM7ICogd2l0aCAtRUJVU1kuIFJlLWFjcXVpcmluZyB0aGUgZHlucHRyIHdpdGggRl9DUkVBVEUgQ09XcyB0aGUgYmxvY2sgYW5kCiYjNDM7ICogc3VjY2VlZHMuCiYjNDM7ICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF93cml0ZV9hZnRlcl9jbG9uZV9yZWRpcihzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmIChicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CWlmIChicGZfY2xvbmVfcmVkaXJlY3QoY3R4LCBjbG9uZV9yZWRpcl9pZmluZGV4LCAwIC8qIGVncmVzcyAqLykpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIGV4dCBub3cgc2hhcmVkIHdpdGggdGhlIHF1ZXVlZCBjbG9uZSAtLSB3cml0ZSBtdXN0IGZhaWwgKi8KJiM0MzsJaWYgKGJwZl9keW5wdHJfd3JpdGUoJmFtcDttZXRhLCAwLCAodm9pZCAqKW1ldGFfemVybywgTUVUQV9TSVpFLCAwKSAhPSAtRUJVU1kpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIFJlLWFjcXVpcmluZyBDT1dzIHRoZSBibG9jayAtLSB3cml0ZSBtdXN0IHN1Y2NlZWQgKi8KJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmIChicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3plcm8sIE1FVEFfU0laRSwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CXdyaXRlX2Jsb2NrZWQgPSB0cnVlOwomIzQzOwlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTYW1lIGFzIGFib3ZlIGJ1dCB1c2luZyBicGZfZHlucHRyX3NsaWNlX3Jkd3IuCiYjNDM7ICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF9zbGljZV93cml0ZV9hZnRlcl9jbG9uZV9yZWRpcihzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwl2b2lkICpzbGljZTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwlpZiAoYnBmX2Nsb25lX3JlZGlyZWN0KGN0eCwgY2xvbmVfcmVkaXJfaWZpbmRleCwgMCAvKiBlZ3Jlc3MgKi8pKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwkvKiBleHQgbm93IHNoYXJlZCB3aXRoIHRoZSBxdWV1ZWQgY2xvbmUgLS0gc2xpY2UgbXVzdCBmYWlsICovCiYjNDM7CXNsaWNlID0gYnBmX2R5bnB0cl9zbGljZV9yZHdyKCZhbXA7bWV0YSwgMCwgTlVMTCwgTUVUQV9TSVpFKTsKJiM0MzsJaWYgKHNsaWNlKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwkvKiBSZS1hY3F1aXJpbmcgQ09XcyB0aGUgYmxvY2sgLS0gc2xpY2UgbXVzdCBzdWNjZWVkICovCiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlzbGljZSA9IGJwZl9keW5wdHJfc2xpY2VfcmR3cigmYW1wO21ldGEsIDAsIE5VTEwsIE1FVEFfU0laRSk7CiYjNDM7CWlmICghc2xpY2UpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CV9fYnVpbHRpbl9tZW1jcHkoc2xpY2UsIG1ldGFfemVybywgTUVUQV9TSVpFKTsKJiM0MzsKJiM0MzsJd3JpdGVfYmxvY2tlZCA9IHRydWU7CiYjNDM7CXJldHVybiBUQ19BQ1RfVU5TUEVDOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWFkIHNrYl9leHQgZnJvbSBjZ3JvdXAvc2tiIGluZ3Jlc3MgLS0gdGVzdHMgY3Jvc3MtaG9vayBzdXJ2aXZhbCAqLwomIzQzO1NFQygmIzM0O2Nncm91cF9za2IvaW5ncmVzcyYjMzQ7KQomIzQzO2ludCBjZ3JwX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiAxOwomIzQzO30KJiM0MzsKJiM0MztfX2JlMTYgdGFyZ2V0X3BvcnQ7CiYjNDM7CiYjNDM7I2RlZmluZSBUQ1BWNF9IRFJfT0ZGCShzaXplb2Yoc3RydWN0IGV0aGhkcikgJiM0Mzsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiYjNDM7I2RlZmluZSBUQ1BWNF9TUE9SVF9PRkYJKFRDUFY0X0hEUl9PRkYgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgc291cmNlKSkKJiM0MzsjZGVmaW5lIFRDUFY0X0RQT1JUX09GRgkoVENQVjRfSERSX09GRiAmIzQzOyBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBkZXN0KSkKJiM0MzsKJiM0MzsvKiBXcml0ZSBza2JfZXh0IG9uIFRDUCBwYWNrZXRzIHRvL2Zyb20gdGFyZ2V0X3BvcnQgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X3dyaXRlX3BvcnQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsJX19iZTE2IHNwb3J0LCBkcG9ydDsKJiM0MzsKJiM0MzsJaWYgKGN0eC0mZ3Q7cHJvdG9jb2wgIT0gX19icGZfY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWlmIChicGZfc2tiX2xvYWRfYnl0ZXMoY3R4LCBUQ1BWNF9TUE9SVF9PRkYsICZhbXA7c3BvcnQsIHNpemVvZihzcG9ydCkpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWlmIChicGZfc2tiX2xvYWRfYnl0ZXMoY3R4LCBUQ1BWNF9EUE9SVF9PRkYsICZhbXA7ZHBvcnQsIHNpemVvZihkcG9ydCkpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWlmIChzcG9ydCAhPSB0YXJnZXRfcG9ydCAmYW1wOyZhbXA7IGRwb3J0ICE9IHRhcmdldF9wb3J0KQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWJwZl9keW5wdHJfd3JpdGUoJmFtcDttZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgc2tiX2V4dCBmcm9tIHNvY2tfb3BzIHBhc3NpdmUgZXN0YWJsaXNoZWQgLS0gdGVzdHMgVEMgLSZndDsgc29ja19vcHMgcGF0aCAqLwomIzQzO1NFQygmIzM0O3NvY2tvcHMmIzM0OykKJiM0MztpbnQgc2tvcHNfc2tiX2V4dF9yZWFkKHN0cnVjdCBicGZfc29ja19vcHMgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfc29ja19vcHNfa2VybiAqa2N0eDsKJiM0MzsJX191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTsKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsJc3RydWN0IHNrX2J1ZmYgKnNrYjsKJiM0MzsKJiM0MzsJaWYgKGN0eC0mZ3Q7b3AgIT0gQlBGX1NPQ0tfT1BTX1BBU1NJVkVfRVNUQUJMSVNIRURfQ0IpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJa2N0eCA9IGJwZl9jYXN0X3RvX2tlcm5fY3R4KGN0eCk7CiYjNDM7CXNrYiA9IGtjdHgtJmd0O3NrYjsKJiM0MzsJaWYgKCFza2IpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiAxOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWFkIHNrYl9leHQgZnJvbSBMU00gaW5ldF9jb25uX2VzdGFibGlzaGVkIC0tIHRlc3RzIFRDIC0mZ3Q7IExTTSBwYXRoICovCiYjNDM7U0VDKCYjMzQ7bHNtL2luZXRfY29ubl9lc3RhYmxpc2hlZCYjMzQ7KQomIzQzO2ludCBCUEZfUFJPRyhsc21fc2tiX2V4dF9yZWFkLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgJmFtcDttZXRhLCAwLCAwKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgc2tiX2V4dCBmcm9tIHNvY2tldCBmaWx0ZXIgLS0gdGVzdHMgVEMgLSZndDsgc2tfZmlsdGVyIHBhdGggKi8KJiM0MztTRUMoJiMzNDtzb2NrZXQmIzM0OykKJiM0MztpbnQgc2tfZmlsdGVyX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gY3R4LSZndDtsZW47CiYjNDM7fQomIzQzOwomIzQzOy8qIFdyaXRlIHNrYl9leHQgZnJvbSBjZ3JvdXAvc2tiIGVncmVzcyAqLwomIzQzO1NFQygmIzM0O2Nncm91cF9za2IvZWdyZXNzJiMzNDspCiYjNDM7aW50IGNncnBfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApOwomIzQzOwomIzQzOwlyZXR1cm4gMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVhZCBza2JfZXh0IGZyb20gdHBfYnRmL2tmcmVlX3NrYiAtLSB0ZXN0cyBzdXJ2aXZhbCB1bnRpbCBza2IgZnJlZSAqLwomIzQzO1NFQygmIzM0O3RwX2J0Zi9rZnJlZV9za2ImIzM0OykKJiM0MztpbnQgQlBGX1BST0codHBfa2ZyZWVfc2tiX2V4dF9yZWFkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJX191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTsKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIE5GX0FDQ0VQVCAxCiYjNDM7CiYjNDM7U0VDKCYjMzQ7bmV0ZmlsdGVyJiMzNDspCiYjNDM7aW50IG5mX3NrYl9leHRfcmVhZChzdHJ1Y3QgYnBmX25mX2N0eCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IF9fc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBfX3NrX2J1ZmYgKiljdHgtJmd0O3NrYjsKJiM0MzsJX191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTsKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFza2IpCiYjNDM7CQlyZXR1cm4gTkZfQUNDRVBUOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoc2tiLCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIE5GX0FDQ0VQVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgJmFtcDttZXRhLCAwLCAwKSkKJiM0MzsJCXJldHVybiBORl9BQ0NFUFQ7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBORl9BQ0NFUFQ7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiBORl9BQ0NFUFQ7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2x3dF9pbiYjMzQ7KQomIzQzO2ludCBsd3RfaW5fc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CV9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gQlBGX09LOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCAmYW1wO21ldGEsIDAsIDApKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIEJQRl9PSzsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7bHd0X291dCYjMzQ7KQomIzQzO2ludCBsd3Rfb3V0X3NrYl9leHRfd3JpdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gQlBGX09LOwomIzQzOwlicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIEFSUkFZX1NJWkUobWV0YV93YW50KSwgMCk7CiYjNDM7CiYjNDM7CXJldHVybiBCUEZfT0s7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2x3dF94bWl0JiMzNDspCiYjNDM7aW50IGx3dF94bWl0X3NrYl9leHRfd3JpdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gQlBGX09LOwomIzQzOwlicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIEFSUkFZX1NJWkUobWV0YV93YW50KSwgMCk7CiYjNDM7CiYjNDM7CXJldHVybiBCUEZfT0s7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgc2tiX2V4dCBmcm9tIHNlZzZsb2NhbCBFbmQuQlBGIC0tIHRlc3RzIFRDIC0mZ3Q7IHNlZzZsb2NhbCBwYXRoICovCiYjNDM7U0VDKCYjMzQ7bHd0X3NlZzZsb2NhbCYjMzQ7KQomIzQzO2ludCBzZWc2bG9jYWxfc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CV9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gQlBGX09LOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCAmYW1wO21ldGEsIDAsIDApKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIEJQRl9PSzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVhZCBza2JfZXh0IGZyb20gc2tfc2tiIHN0cmVhbSB2ZXJkaWN0IGhvb2sgKi8KJiM0MztTRUMoJiMzNDtza19za2Ivc3RyZWFtX3ZlcmRpY3QmIzM0OykKJiM0MztpbnQgc2tfc2tiX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFNLX1BBU1M7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gU0tfUEFTUzsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIFNLX1BBU1M7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiBTS19QQVNTOwomIzQzO30KJiM0MzsKIGNoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9za2JfZXh0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfc2tiX2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmMyNjExYzkzMTVhYTcKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfc2tiX2V4dC5jCkBAIC0wLDAgJiM0MzsxLDEyMiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfbWlzYy5oJiMzNDsKJiM0MzsKJiM0MztfX3U2NCBmbGFnczsKJiM0MzsKJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO19fZGVzY3JpcHRpb24oJiMzNDtza2JfZXh0IHNsaWNlIGlzIGludmFsaWRhdGVkIGJ5IGJwZl9jbG9uZV9yZWRpcmVjdCYjMzQ7KQomIzQzO19fZmFpbHVyZQomIzQzO2ludCBza2JfZXh0X3N0YWxlX3NsaWNlX2FmdGVyX2Nsb25lX3JlZGlyZWN0KHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CV9fdTggKnNsaWNlOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlzbGljZSA9IGJwZl9keW5wdHJfc2xpY2VfcmR3cigmYW1wO21ldGEsIDAsIE5VTEwsIDgpOwomIzQzOwlpZiAoIXNsaWNlKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWJwZl9jbG9uZV9yZWRpcmVjdChjdHgsIDEsIDApOwomIzQzOwomIzQzOwkvKiBTdGFsZTogdGhlIGNsb25lIHNoYXJlcyB0aGUgZXh0IGJsb2NrIHRoZSBzbGljZSBwb2ludHMgaW50by4gKi8KJiM0MzsJKnNsaWNlID0gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3RjJiMzNDspCiYjNDM7X19kZXNjcmlwdGlvbigmIzM0O3NrYl9leHQgc2xpY2UgaXMgaW52YWxpZGF0ZWQgd2hlbiBleHQgaXMgcmUtb3BlbmVkIHdpdGggRl9DUkVBVEUmIzM0OykKJiM0MztfX2ZhaWx1cmUKJiM0MztpbnQgc2tiX2V4dF9zdGFsZV9zbGljZV9hZnRlcl9yZWNyZWF0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBkMSwgZDI7CiYjNDM7CV9fdTggKnNsaWNlOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO2QxKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlzbGljZSA9IGJwZl9keW5wdHJfc2xpY2UoJmFtcDtkMSwgMCwgTlVMTCwgOCk7CiYjNDM7CWlmICghc2xpY2UpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJLyogTWF5IENPVyB0aGUgZXh0IGJsb2NrLCBsZWF2aW5nIHRoZSBzbGljZSBwb2ludGluZyBhdCB0aGUgb2xkIG9uZS4gKi8KJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7ZDIpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiAqc2xpY2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3RwX2J0Zi9rZnJlZV9za2ImIzM0OykKJiM0MztfX2Rlc2NyaXB0aW9uKCYjMzQ7Rl9DUkVBVEUgaXMgcmVqZWN0ZWQgaW4gdHJhY2luZyBwcm9ncmFtcyYjMzQ7KQomIzQzO19fZmFpbHVyZSBfX21zZygmIzM0O2lzIG5vdCBhbGxvd2VkIGluIGxzbS90cmFjaW5nIHByb2dyYW1zJiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKHRwX3NrYl9leHRfY3JlYXRlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLAomIzQzOwkJCQkgICAgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3RwX2J0Zi9rZnJlZV9za2ImIzM0OykKJiM0MztfX2Rlc2NyaXB0aW9uKCYjMzQ7bm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZCBpbiB0cmFjaW5nIHByb2dyYW1zJiMzNDspCiYjNDM7X19mYWlsdXJlIF9fbXNnKCYjMzQ7bXVzdCBiZSBhIGtub3duIGNvbnN0YW50JiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKHRwX3NrYl9leHRfdmFyX2ZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCBmbGFncywgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztfX2Rlc2NyaXB0aW9uKCYjMzQ7bm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZCYjMzQ7KQomIzQzO19fZmFpbHVyZSBfX21zZygmIzM0O211c3QgYmUgYSBrbm93biBjb25zdGFudCYjMzQ7KQomIzQzO2ludCBza2JfZXh0X3Zhcl9mbGFncyhzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBmbGFncywgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7bHNtL2luZXRfY29ubl9lc3RhYmxpc2hlZCYjMzQ7KQomIzQzO19fZGVzY3JpcHRpb24oJiMzNDtGX0NSRUFURSBpcyByZWplY3RlZCBpbiBMU00gcHJvZ3JhbXMmIzM0OykKJiM0MztfX2ZhaWx1cmUgX19tc2coJiMzNDtpcyBub3QgYWxsb3dlZCBpbiBsc20vdHJhY2luZyBwcm9ncmFtcyYjMzQ7KQomIzQzO2ludCBCUEZfUFJPRyhsc21fc2tiX2V4dF9jcmVhdGUsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwKJiM0MzsJCQkJICAgIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtsc20vaW5ldF9jb25uX2VzdGFibGlzaGVkJiMzNDspCiYjNDM7X19kZXNjcmlwdGlvbigmIzM0O25vbi1jb25zdGFudCBmbGFncyBhcmUgcmVqZWN0ZWQgaW4gTFNNIHByb2dyYW1zJiMzNDspCiYjNDM7X19mYWlsdXJlIF9fbXNnKCYjMzQ7bXVzdCBiZSBhIGtub3duIGNvbnN0YW50JiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKGxzbV9za2JfZXh0X3Zhcl9mbGFncywgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCBmbGFncywgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNzg4MQoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDMwOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBCUEZfU0tCX0VYVCBQYXRjaCoqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGludHJvZHVjaW5nIGBCUEZfU0tCX0VYVGAsIHdoaWNoIHNvdW5kcyBsaWtlIGEgc2lnbmlmaWNhbnQgZW5oYW5jZW1lbnQgZm9yIEJQRiwgc3BlY2lmaWNhbGx5IGFyb3VuZCBleHRlbmRpbmcgU0tCcyB3aXRoIG1ldGFkYXRhLiBJdCBzZWVtcyB0byBoYXZlIHNldmVyYWwga2V5IGNvbXBvbmVudHM6IG5ldyBkeW5wdHIgaGVscGVycyBhbmQga2Z1bmNzIChgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRgLCBgYnBmX3NrYl9leHRfcG9pbnRlcmAsIGFuZCB0aG9zZSBsb2FkL3N0b3JlIGZ1bmN0aW9ucyksIHBsdXMgY2hhbmdlcyB0byB0aGUgdmVyaWZpZXIsIFNLQiBleHRlbnNpb25zIHRoZW1zZWx2ZXMsIGFuZCBvdGhlciByZWxhdGVkIGFyZWFzLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgKnNob3VsZCogd2UgZnV6eiB0aGlzPyBMZXQmIzM5O3MgYnJlYWsgaXQgZG93bjoKCjEuICAqKkNvcmUgU3lzdGVtcyBJbnZvbHZlZDoqKiBUaGlzIGlzIHRvdWNoaW5nIHNvbWUgcmVhbGx5IGltcG9ydGFudCBwaWVjZXMuIEkgc2VlIHRoZSBCUEYgdmVyaWZpZXIgKGFsd2F5cyBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nISksIEJQRiBkeW5wdHIgaGVscGVycyAobmV3IGNvZGUsIHBvdGVudGlhbCBmb3IgaXNzdWVzKSwgYW5kIG1vZGlmaWNhdGlvbnMgdG8gY29yZSBuZXR3b3JraW5nIGZpbGVzIGxpa2UgYG5ldC9jb3JlL2ZpbHRlci5jYCwgYG5ldC9jb3JlL3NrYnVmZi5jYCwgYW5kIGV2ZW4gYG5ldC9pcHY0L3VkcC5jYC4gVGhhdCYjMzk7cyBhIHByZXR0eSBicm9hZCBzY29wZSwgd2hpY2ggdXN1YWxseSBtZWFucyBpdCYjMzk7cyBhbiBhcmVhIHdpdGggYSBsb3Qgb2YgY29tcGxleGl0eS4KCjIuICAqKlJlYWNoYWJpbGl0eToqKiBUaGlzIGlzIGV4Y2VsbGVudC4gQlBGIGlzIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgYGJwZigpYCBzeXNjYWxsLCBlQlBGIHByb2dyYW1zLCBhbmQgbXVsdGlwbGUgc3Vic3lzdGVtcyAoVEMsIExTTSwgY2dyb3VwXF9za2IsIHRyYWNpbmcsIHNvY2tldCBmaWx0ZXJzLCBOZXRmaWx0ZXIsIGFuZCBvdGhlcnMpLiBNb3JlIHRvIHRoZSBwb2ludCwgdGhpcyBpcyBjb21wbGV0ZWx5IHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBRRU1VLCBtYWtpbmcgaXQgaWRlYWwgZm9yIHJvYnVzdCBhbmQgZWZmaWNpZW50IGZ1enppbmcuCgozLiAgKipXb3J0aEZ1enppbmc/OioqICAqQWJzb2x1dGVseSouIEdpdmVuIHRoZSBicmVhZHRoIG9mIHRoZSBjaGFuZ2VzLCB0aGUgaW52b2x2ZW1lbnQgb2YgdGhlIHZlcmlmaWVyLCBhbmQgdGhlIHdpZGUgYXR0YWNrIHN1cmZhY2UsIHRoaXMgc2NyZWFtcyAmIzM0O2hpZ2ggcHJpb3JpdHkgZm9yIGZ1enppbmcmIzM0Oy4gYFdvcnRoRnV6emluZyA9IHRydWVgLgoKTmV4dCwgSSBuZWVkIHRvIGNoZWNrIHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEkgc2VlIHRoYXQgd2UgbmVlZCB0byBoYXZlIGBCUEZfU0tCX0VYVGAgZW5hYmxlZCAod2hpY2gsIHNlbnNpYmx5LCBkZXBlbmRzIG9uIGJvdGggYEJQRl9TWVNDQUxMYCBhbmQgc2VsZWN0cyBgU0tCX0VYVEVOU0lPTlNgKSwgcGx1cyBgQlBGX1NZU0NBTExgIGFuZCB0aGUgYE5FVGAgb3B0aW9uIG11c3QgYmUgY29uZmlndXJlZCBhcyB3ZWxsLiBUaW1lIHRvIHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBgS2NvbmZpZ2AgZmlsZXMgYW5kIHNvdXJjZSBjb2RlIGRldGFpbHMsIG1heWJlIHVzaW5nIGBncmVwcGVyYCBvciBqdXN0IHJlYWRpbmcgdGhlbSBkaXJlY3RseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlBGX1NLQl9FWFQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L0tjb25maWc9NTM0PWNvbmZpZyBORVRfVEVTVFxuLS1cbm5ldC9LY29uZmlnLTU0Mi1cbm5ldC9LY29uZmlnOjU0Mzpjb25maWcgQlBGX1NLQl9FWFRcbm5ldC9LY29uZmlnLTU0NC1cdGJvb2wgXCYjMzQ7c2tiIGV4dGVuc2lvbiBmb3IgQlBGIG1ldGFkYXRhXCYjMzQ7XG4tLVxubmV0L0tjb25maWctNTUyLVxubmV0L0tjb25maWc6NTUzOmNvbmZpZyBCUEZfU0tCX0VYVF9TSVpFXG5uZXQvS2NvbmZpZy01NTQtXHRpbnQgXCYjMzQ7U2l6ZSBvZiB0aGUgQlBGIHNrYiBleHRlbnNpb24gbWV0YWRhdGEgYnVmZmVyXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzg4MjIKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBMYW5kc2NhcGUqKgoKT2theSwgc28gSSYjMzk7bSB0cnlpbmcgdG8gcGlucG9pbnQgc29tZXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBNeSBpbml0aWFsIGh1bmNoIGlzIHRoYXQgaXQmIzM5O3MgbGlrZWx5IGRlZmluZWQgd2l0aGluIHRoZSBtYWluIGBuZXQvS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDU0MC4gSXQgY291bGQgYmUgYSBtYWNybywgYSBjb25maWd1cmF0aW9uIG9wdGlvbiwgb3Igc29tZXRoaW5nIG1vcmUgY29tcGxleCwgYnV0IHRoYXQmIzM5O3Mgd2hlcmUgSSYjMzk7bSBnb2luZyB0byBzdGFydCBkaWdnaW5nLiBUaGlzIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIHBsYWNlIHRvIGJlZ2luIG15IGludmVzdGlnYXRpb24sIGdpdmVuIHRoZSBjb250ZXh0LiBOb3cgbGV0JiMzOTtzIHNlZSB3aGF0IHRoYXQgc2VjdGlvbiBhY3R1YWxseSBob2xkcy4uLiBJIGV4cGVjdCB0byBmaW5kIHRoZSBuZWNlc3NhcnkgY2x1ZXMgdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDUzNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTM1Olx0XHR0cmlzdGF0ZSBcJiMzNDtLVW5pdCB0ZXN0cyBmb3IgbmV0d29ya2luZ1wmIzM0OyBpZiAhS1VOSVRfQUxMX1RFU1RTXG4gNTM2Olx0XHRkZXBlbmRzIG9uIEtVTklUXG4gNTM3Olx0XHRkZWZhdWx0IEtVTklUX0FMTF9URVNUU1xuIDUzODpcdFx0aGVscFxuIDUzOTpcdFx0ICBLVW5pdCB0ZXN0cyBjb3ZlcmluZyBjb3JlIG5ldHdvcmtpbmcgaW5mcmEsIHN1Y2ggYXMgc2tfYnVmZi5cbiA1NDA6XHRcbiA1NDE6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiA1NDI6XHRcbiA1NDM6XHRjb25maWcgQlBGX1NLQl9FWFRcbiA1NDQ6XHRcdGJvb2wgXCYjMzQ7c2tiIGV4dGVuc2lvbiBmb3IgQlBGIG1ldGFkYXRhXCYjMzQ7XG4gNTQ1Olx0XHRkZXBlbmRzIG9uIEJQRl9TWVNDQUxMXG4gNTQ2Olx0XHRzZWxlY3QgU0tCX0VYVEVOU0lPTlNcbiA1NDc6XHRcdGhlbHBcbiA1NDg6XHRcdCAgRW5hYmxlIGFuIHNrX2J1ZmYgZXh0ZW5zaW9uIGZvciBzdG9yaW5nIEJQRiBtZXRhZGF0YS4gVGhpcyBhbGxvd3MgQlBGXG4gNTQ5Olx0XHQgIHByb2dyYW1zIHRvIGFzc29jaWF0ZSBhcmJpdHJhcnkgZGF0YSB3aXRoIGluZGl2aWR1YWwgcGFja2V0cyBhcyB0aGV5XG4gNTUwOlx0XHQgIHRyYXZlcnNlIHRoZSBuZXR3b3JrIHN0YWNrLiBUaGUgc3RvcmFnZSBpcyBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW5cbiA1NTE6XHRcdCAgdGhlIHNrX2J1ZmYgaXMgZnJlZWQuXG4gNTUyOlx0XG4gNTUzOlx0Y29uZmlnIEJQRl9TS0JfRVhUX1NJWkVcbiA1NTQ6XHRcdGludCBcJiMzNDtTaXplIG9mIHRoZSBCUEYgc2tiIGV4dGVuc2lvbiBtZXRhZGF0YSBidWZmZXJcJiMzNDtcbiA1NTU6XHRcdGRlcGVuZHMgb24gQlBGX1NLQl9FWFRcbiA1NTY6XHRcdHJhbmdlIDEgMjU2XG4gNTU3Olx0XHRkZWZhdWx0IDY0XG4gNTU4Olx0XHRoZWxwXG4gNTU5Olx0XHQgIENvbmZpZ3VyZXMgdGhlIHNpemUgb2YgdGhlIGlubGluZSBtZXRhZGF0YSBidWZmZXIgaW4gc3RydWN0XG4gNTYwOlx0XHQgIGJwZl9za2JfZXh0LCB3aGljaCBpcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSBhIEJQRiBwcm9ncmFtIGNhblxuIDU2MTpcdFx0ICBzdG9yZSBvciByZXRyaWV2ZSB3aXRoIGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KCkuXG4gNTYyOlx0XG4gNTYzOlx0ZW5kaWYgICAjIGlmIE5FVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE1OjIzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM5NDU5CgkJCQkJCQlvdXRwdXQ6IDIwMAoJCQkJCQkJdGhvdWdodHM6IDgzOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipQYXRjaCBBbmFseXNpcyBhbmQgRnV6emluZyBTdHJhdGVneSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoaXMgcGF0Y2guIEkgc2VlIGEgc3Vic3RhbnRpYWwgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0b3VjaGVkLCBzcHJlYWQgYWNyb3NzIHNldmVyYWwgY3JpdGljYWwgYXJlYXM6IGBuZXQvY29yZS9maWx0ZXIuY2AsIGBuZXQvY29yZS9za2J1ZmYuY2AsIGBuZXQvaXB2NC91ZHAuY2AsIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AsIGFuZCBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gVGhpcyBpbW1lZGlhdGVseSByYWlzZXMgYSBmbGFnLgoKSSYjMzk7bSB6ZXJvaW5nIGluIG9uIHRoZSBuZXcgYW5kIG1vZGlmaWVkIGZ1bmN0aW9ucy4gU3BlY2lmaWNhbGx5OgoKKiAgICoqQ29yZSBCUEYgRHlucHRyIEZ1bmN0aW9uYWxpdHk6KiogSSBzZWUgdGhlIGFkZGl0aW9uIG9mIGBicGZfc2tiX2V4dF9wb2ludGVyYCwgYF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlc2AsIGBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzYCwgYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YC4gVGhlc2UgcG9pbnQgdG8gZXh0ZW5zaW9ucyBvZiBCUEYmIzM5O3MgZHluYW1pYyBwb2ludGVyIGNhcGFiaWxpdGllcyBkaXJlY3RseSBpbnRlcmFjdGluZyB3aXRoIGBza2JgIGV4dGVuc2lvbnMuIFRoaXMgaXMga2V5LgoqICAgKipTS0IgTWFuYWdlbWVudDoqKiBUaGUgY2hhbmdlcyB0byBgc2tiX2V4dF9zY3J1YmAgYW5kIGBza2Jfc2NydWJfcGFja2V0YCBpbiBgbmV0L2NvcmUvc2tidWZmLmNgIGFyZSBpbXBvcnRhbnQgYXMgdGhleSByZWxhdGUgdG8gYHNrYmAgZXh0ZW5zaW9uIG1ldGFkYXRhIG1hbmFnZW1lbnQuCiogICAqKlZlcmlmaWVyIENoYW5nZXM6KiogVGhlIGVkaXRzIGluIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgIChgZ2V0X2R5bnB0cl90eXBlX2ZsYWdgLCBgYnBmX2lzX2tmdW5jX3BrdF9jaGFuZ2luZ2AsIGBjaGVja19rZnVuY19hcmdzYCwgYGNoZWNrX2tmdW5jX2NhbGxgKSB0ZWxsIG1lIHRoZXJlJiMzOTtzIGJlZW4gd29yayBkb25lIHRvIGVuc3VyZSBjb3JyZWN0bmVzcyBhbmQgc2VjdXJpdHkgd2hlbiBoYW5kbGluZyB0aGVzZSBuZXcgb3BlcmF0aW9ucyB3aXRoaW4gQlBGIHByb2dyYW1zLgoqICAgKipVRFAgTG9naWM6KiogSSYjMzk7bSBhbHNvIG5vdGluZyB0aGUgY2hhbmdlIHRvIGB1ZHBfdHJ5X21ha2Vfc3RhdGVsZXNzYCBidXQgSSBzZWUgbm8gY29ubmVjdGlvbiB0byBCUEYsIGFuZCBzbyBpdCBpcyB1bmxpa2VseSB0byBiZSByZWxldmFudCB0byB0aGUgZnV6emluZyBvZiB0aGlzIHBhcnRpY3VsYXIgcGF0Y2gsIGJ1dCBJIHdpbGwgbWFrZSBhIG5vdGUgb2YgaXQuCgpOb3csIGxldCYjMzk7cyBzb2xpZGlmeSB0aGUgY29yZSBmb2N1cy4gVGhlIHByaW1hcnkgc3ltYm9scyB0aGF0IGltcGxlbWVudCBhbmQgZXhwb3NlIHRoZSBhZGRlZCBmdW5jdGlvbmFsaXR5IGFyZTogYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCwgYGJwZl9za2JfZXh0X3BvaW50ZXJgLCBgX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzYCwgYF9fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXNgLCBhbmQgYHNrYl9leHRfc2NydWJgLiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IGEgZnV6emVyIHNob3VsZCBzcGVjaWZpY2FsbHkgdGFyZ2V0LgoKSSBhbHNvIGtub3cgSSBzaG91bGQgbG9vayBmb3IgdGhlIGBDT05GSUdgIG9wdGlvbnMgdGhhdCBtdXN0IGJlIHNldC4gSSBzZWUgYEJQRl9TS0JfRVhUYCwgYEJQRl9TWVNDQUxMYCwgYW5kIGBORVRgLiBUaGVzZSBhcmUgZXNzZW50aWFsLCBhbmQgdGhlIGZ1enplciBuZWVkcyB0byBiZSBjb25maWd1cmVkIHRvIGVuYWJsZSB0aGVtLgoKRmluYWxseSwgZG9lcyB0aGlzIHdhcnJhbnQgZnV6emluZz8gQWJzb2x1dGVseS4gVGhpcyBwYXRjaCBpcyBpbmplY3RpbmcgYSAqbG90KiBvZiBuZXcsIGNvcmUgbmV0d29ya2luZyBhbmQgQlBGIGZ1bmN0aW9uYWxpdHkuIFNwZWNpZmljYWxseSwgdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyBgc2tfYnVmZmAgZXh0ZW5zaW9uIHR5cGUgZm9yIEJQRiBkYXRhLCB0aGUgYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCBrZnVuYywgYW5kIGFzc29jaWF0ZWQgb3BlcmF0aW9ucyAoZHlucHRyLCBjbG9uaW5nLCBzY3J1YmJpbmcpIGNyZWF0ZXMgbnVtZXJvdXMgbmV3IGF0dGFjayBzdXJmYWNlcy4gVGhpcyBpcyBhIHByaW1lIHRhcmdldC4gVGhlIGNoYW5nZXMgdG91Y2ggYm90aCB0aGUgdXNlci1zcGFjZSBpbnRlcmZhY2UgKHZpYSBgQlBGX1NZU0NBTExgKSBhbmQgdGhlIGtlcm5lbCBpbnRlcm5hbHMsIGluY3JlYXNpbmcgdGhlIGNoYW5jZXMgb2YgbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3RoZXIgaXNzdWVzLiBUaGUgZHluYW1pYyBuYXR1cmUgb2YgYHNrYmAgZXh0ZW5zaW9ucyBhbmQgZHlucHRyIGludGVyYWN0aW9ucywgcGFydGljdWxhcmx5IGluIHRoZSBjb250ZXh0IG9mIG5ldHdvcmsgcGFja2V0IHByb2Nlc3NpbmcsIG1ha2VzIHRoaXMgcGF0Y2ggZXhjZXB0aW9uYWxseSBhcHBlYWxpbmcgdG8gYSBmdXp6ZXIuCgpTbywgbGV0JiMzOTtzIGJ1aWxkIHRoZSBgc2V0LXJlc3VsdHNgIHBhcmFtZXRlcnM6CgoqICAgYFdvcnRoRnV6emluZ2A6IGB0cnVlYAoqICAgYFJlYXNvbmluZ2A6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgYHNrX2J1ZmZgIGV4dGVuc2lvbiBmb3IgQlBGIG1ldGFkYXRhIChgQ09ORklHX0JQRl9TS0JfRVhUYCkgYWxvbmcgd2l0aCB0aGUgYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCBrZnVuYyBhbmQgZHlucHRyIG9wZXJhdGlvbnMuIEl0IG1vZGlmaWVzIHRoZSBCUEYgdmVyaWZpZXIsIGR5bnB0ciBoZWxwZXJzLCBhbmQgc2tiIGV4dGVuc2lvbiBsaWZldGltZS9zY3J1YmJpbmcgYWNyb3NzIG5ldHdvcmsgc3RhY2sgb3BlcmF0aW9ucyBhbmQgY2xvbmVzLiBUaGlzIHJlYWNoYWJsZSBjb3JlIEJQRiBhbmQgbmV0d29ya2luZyBsb2dpYyB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7CiogICBgRm9jdXNTeW1ib2xzYDogYFsmIzM0O2JwZl9keW5wdHJfZnJvbV9za2JfZXh0JiMzNDssICYjMzQ7YnBmX3NrYl9leHRfcG9pbnRlciYjMzQ7LCAmIzM0O19fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyYjMzQ7LCAmIzM0O19fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMmIzM0OywgJiMzNDtza2JfZXh0X3NjcnViJiMzNDtdYAoqICAgYEVuYWJsZUNvbmZpZ3NgOiBgWyYjMzQ7QlBGX1NLQl9FWFQmIzM0OywgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LCAmIzM0O05FVCYjMzQ7XWAKCk5vdywgbGV0JiMzOTtzIGV4ZWN1dGUgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NLQl9FWFQmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7TkVUJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2R5bnB0cl9mcm9tX3NrYl9leHQmIzM0OywKICAgICYjMzQ7YnBmX3NrYl9leHRfcG9pbnRlciYjMzQ7LAogICAgJiMzNDtfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMmIzM0OywKICAgICYjMzQ7X19icGZfc2tiX2V4dF9zdG9yZV9ieXRlcyYjMzQ7LAogICAgJiMzNDtza2JfZXh0X3NjcnViJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc2tfYnVmZiBleHRlbnNpb24gZm9yIEJQRiBtZXRhZGF0YSAoQ09ORklHX0JQRl9TS0JfRVhUKSBhbG9uZyB3aXRoIHRoZSBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCBrZnVuYyBhbmQgcmVsYXRlZCBkeW5wdHIgaGFuZGxpbmcgaW4gaGVscGVycyBhbmQgdGhlIEJQRiB2ZXJpZmllci4gSXQgYWxzbyBtb2RpZmllcyBwYWNrZXQgc2NydWJiaW5nIGFuZCBleHRlbnNpb24gbGlmZXRpbWUgbG9naWMgaW4gY29yZSBuZXR3b3JraW5nIHBhdGhzLiBUaGVzZSBjaGFuZ2VzIGFyZSBpbiByZWFjaGFibGUgY29yZSBzdWJzeXN0ZW1zIGFuZCB3YXJyYW50IGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TS0JfRVhUJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O05FVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9keW5wdHJfZnJvbV9za2JfZXh0JiMzNDssCiAgICAmIzM0O2JwZl9za2JfZXh0X3BvaW50ZXImIzM0OywKICAgICYjMzQ7X19icGZfc2tiX2V4dF9sb2FkX2J5dGVzJiMzNDssCiAgICAmIzM0O19fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMmIzM0OywKICAgICYjMzQ7c2tiX2V4dF9zY3J1YiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHNrX2J1ZmYgZXh0ZW5zaW9uIGZvciBCUEYgbWV0YWRhdGEgKENPTkZJR19CUEZfU0tCX0VYVCkgYWxvbmcgd2l0aCB0aGUgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQga2Z1bmMgYW5kIHJlbGF0ZWQgZHlucHRyIGhhbmRsaW5nIGluIGhlbHBlcnMgYW5kIHRoZSBCUEYgdmVyaWZpZXIuIEl0IGFsc28gbW9kaWZpZXMgcGFja2V0IHNjcnViYmluZyBhbmQgZXh0ZW5zaW9uIGxpZmV0aW1lIGxvZ2ljIGluIGNvcmUgbmV0d29ya2luZyBwYXRocy4gVGhlc2UgY2hhbmdlcyBhcmUgaW4gcmVhY2hhYmxlIGNvcmUgc3Vic3lzdGVtcyBhbmQgd2FycmFudCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE1OjIzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIEJQRiBzb2NrZXQgYnVmZmVyIG1ldGFkYXRhIGV4dGVuc2lvbnMgKFNLQl9FWFRfQlBGKSBhY2Nlc3NpYmxlIHZpYSBCUEYgZHlucHRycyAoYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCksIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyB2ZXJpZmllciBjaGVja3MsIGhlbHBlciBmdW5jdGlvbnMsIGFuZCBza2IgZXh0ZW5zaW9uIHNjcnViYmluZyBsb2dpYy5cblxuQXNzZXNzbWVudCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrOlxuMS4gTWVtb3J5IEluaXRpYWxpemF0aW9uOiBXaGVuIGEgbmV3IGBzdHJ1Y3QgYnBmX3NrYl9leHRgIGlzIGFkZGVkIHRvIGFuIHNrYiB2aWEgYHNrYl9leHRfYWRkKClgLCBgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKWAgZXhwbGljaXRseSB6ZXJvZXMgdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdXNpbmcgYG1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSlgLiBXaGVuIGVycm9yIGNvbmRpdGlvbnMgYXJlIGVuY291bnRlcmVkLCB0aGUgZHlucHRyIGlzIHNhZmVseSBjbGVhcmVkIHdpdGggYGJwZl9keW5wdHJfc2V0X251bGwoKWAuXG4yLiBCb3VuZHMgYW5kIE9mZnNldHM6IFRoZSBidWZmZXIgbGVuZ3RoIGlzIHN0cmljdGx5IGNoZWNrZWQgYWdhaW5zdCBgQ09ORklHX0JQRl9TS0JfRVhUX1NJWkVgIChgQVJSQVlfU0laRShleHQtXHUwMDNlYnVmKWApLCBhbmQgYWxsIHN1YnNlcXVlbnQgZHlucHRyIG9wZXJhdGlvbnMgKGBicGZfZHlucHRyX3JlYWRgLCBgYnBmX2R5bnB0cl93cml0ZWAsIGBicGZfZHlucHRyX3NsaWNlYCkgZW5mb3JjZSBib3VuZHMgdmlhIGBicGZfZHlucHRyX2NoZWNrX29mZl9sZW4oKWAsIHByZXZlbnRpbmcgcmVhZHMgYmV5b25kIHRoZSBpbml0aWFsaXplZCByZWdpb24uXG4zLiBJbmZvIExlYWtzOiBObyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkgb3IgcGFkZGluZyBpcyBleHBvc2VkIHRvIHVzZXIgc3BhY2Ugb3IgYWNyb3NzIGtlcm5lbCBib3VuZGFyaWVzLlxuXG5UaGUgcHJpbWFyeSBidWcgc3VyZmFjZXMgZm9yIHRoZXNlIGNoYW5nZXMgYXJlIEJQRiB2ZXJpZmllciBzYWZldHksIHJlZmNvdW50L0NPVyBzZW1hbnRpY3Mgb24gY2xvbmVkIHNrYnMsIGFuZCBidWZmZXIgYm91bmRzIGNoZWNraW5nLCBhbGwgb2Ygd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBzYW5pdGl6ZXJzIHJhdGhlciB0aGFuIEtNU0FOLiBBIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIHRoZXJlZm9yZSBub3QganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYTBlMDQ1YmQ1OTA3ZDI2ZmU2ZWRjZTc2ZjFmMjE2Y2MyNDI3MGE0NwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgU2VwIDEwIDE1OjIzOjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmgKaW5kZXggZmZhNTYyNjQxMWFjMi4uNmMzNWY4Yzc0MTQ3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JwZi5oCkBAIC0xNDgxLDYgJiM0MzsxNDgxLDggQEAgZW51bSBicGZfZHlucHRyX3R5cGUgewogCUJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQSwKIAkvKiBVbmRlcmx5aW5nIGRhdGEgaXMgYSBmaWxlICovCiAJQlBGX0RZTlBUUl9UWVBFX0ZJTEUsCiYjNDM7CS8qIFVuZGVybHlpbmcgZGF0YSBpcyBhIGJwZl9za2JfZXh0IGNodW5rICovCiYjNDM7CUJQRl9EWU5QVFJfVFlQRV9TS0JfRVhULAogfTsKIAogaW50IGJwZl9keW5wdHJfY2hlY2tfc2l6ZSh1NjQgc2l6ZSk7CkBAIC00MjE2LDQgJiM0Mzs0MjE4LDEyIEBAIHN0YXRpYyBpbmxpbmUgaW50IGJwZl9tYXBfY2hlY2tfb3BfZmxhZ3Moc3RydWN0IGJwZl9tYXAgKm1hcCwgdTY0IGZsYWdzLCB1NjQgYWxsCiAJcmV0dXJuIDA7CiB9CiAKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUCiYjNDM7CiYjNDM7c3RydWN0IGJwZl9za2JfZXh0IHsKJiM0MzsJdTggYnVmW0NPTkZJR19CUEZfU0tCX0VYVF9TSVpFXSBfX2FsaWduZWQoOCk7CiYjNDM7fTsKJiM0MzsKJiM0MzsjZW5kaWYgLyogQ09ORklHX0JQRl9TS0JfRVhUICovCiYjNDM7CiAjZW5kaWYgLyogX0xJTlVYX0JQRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaAppbmRleCA0YTliYzZhODQ4ZjJlLi5lOWE5MzQ5MjI1M2JhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKQEAgLTE5NTgsNCAmIzQzOzE5NTgsMzEgQEAgc3RhdGljIGlubGluZSB2b2lkICpicGZfc2tiX21ldGFfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0KQogfQogI2VuZGlmIC8qIENPTkZJR19ORVQgKi8KIAomIzQzOyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFQKJiM0Mzt2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIGJvb2wgd3IpOwomIzQzO2ludCBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCwgdm9pZCAqdG8sCiYjNDM7CQkJICAgICB1MzIgbGVuKTsKJiM0MztpbnQgX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCBjb25zdCB2b2lkICpmcm9tLAomIzQzOwkJCSAgICAgIHUzMiBsZW4sIHU2NCBmbGFncyk7CiYjNDM7I2Vsc2UgLyogQ09ORklHX0JQRl9TS0JfRVhUICovCiYjNDM7c3RhdGljIGlubGluZSB2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsCiYjNDM7CQkJCQlib29sIHdyKQomIzQzO3sKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAomIzQzOwkJCQkJICAgdTMyIG9mZnNldCwgdm9pZCAqdG8sIHUzMiBsZW4pCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IF9fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCwKJiM0MzsJCQkJCSAgICBjb25zdCB2b2lkICpmcm9tLCB1MzIgbGVuLAomIzQzOwkJCQkJICAgIHU2NCBmbGFncykKJiM0Mzt7CiYjNDM7CXJldHVybiAtRU9QTk9UU1VQUDsKJiM0Mzt9CiYjNDM7I2VuZGlmIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqLwomIzQzOwogI2VuZGlmIC8qIF9fTElOVVhfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNDIxZjZmYzQ1NDUxMS4uNTA5ZDQ0NzE3OWUxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC01MDYxLDYgJiM0Mzs1MDYxLDkgQEAgZW51bSBza2JfZXh0X2lkIHsKICNlbmRpZgogI2lmIElTX0VOQUJMRUQoQ09ORklHX0NBTikKIAlTS0JfRVhUX0NBTiwKJiM0MzsjZW5kaWYKJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NLQl9FWFQpCiYjNDM7CVNLQl9FWFRfQlBGLAogI2VuZGlmCiAJU0tCX0VYVF9OVU0sIC8qIG11c3QgYmUgbGFzdCAqLwogfTsKQEAgLTUwODgsNiAmIzQzOzUwOTEsNyBAQCB2b2lkICpfX3NrYl9leHRfc2V0KHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZCwKIHZvaWQgKnNrYl9leHRfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZCk7CiB2b2lkIF9fc2tiX2V4dF9kZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBza2JfZXh0X2lkIGlkKTsKIHZvaWQgX19za2JfZXh0X3B1dChzdHJ1Y3Qgc2tiX2V4dCAqZXh0KTsKJiM0Mzt2b2lkIHNrYl9leHRfc2NydWIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNTE1MywxNCAmIzQzOzUxNTcsMjMgQEAgc3RhdGljIGlubGluZSBib29sIHNrYl9oYXNfZXh0ZW5zaW9ucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiB1bmxpa2VseShza2ItJmd0O2FjdGl2ZV9leHRlbnNpb25zKTsKIH0KJiM0MzsKJiM0MzsvKiBUcnVlIGlmIHRoZSBleHRlbnNpb24gYmxvY2sgaXMgc2hhcmVkIHdpdGggY2xvbmVkIHNrYnMgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2V4dF9zaGFyZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKJiM0Mzt7CiYjNDM7CXJldHVybiBza2ItJmd0O2FjdGl2ZV9leHRlbnNpb25zICZhbXA7JmFtcDsKJiM0MzsJICAgICAgIHJlZmNvdW50X3JlYWQoJmFtcDtza2ItJmd0O2V4dGVuc2lvbnMtJmd0O3JlZmNudCkgIT0gMTsKJiM0Mzt9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX2V4dF9wdXQoc3RydWN0IHNrYl9leHQgKmV4dCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikge30KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9zY3J1YihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfZGVsKHN0cnVjdCBza19idWZmICpza2IsIGludCB1bnVzZWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgX19za2JfZXh0X2NvcHkoc3RydWN0IHNrX2J1ZmYgKmQsIGNvbnN0IHN0cnVjdCBza19idWZmICpzKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfY29weShzdHJ1Y3Qgc2tfYnVmZiAqZHN0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqcykge30KIHN0YXRpYyBpbmxpbmUgYm9vbCBza2JfaGFzX2V4dGVuc2lvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYikgeyByZXR1cm4gZmFsc2U7IH0KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2V4dF9zaGFyZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikgeyByZXR1cm4gZmFsc2U7IH0KICNlbmRpZiAvKiBDT05GSUdfU0tCX0VYVEVOU0lPTlMgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIG5mX3Jlc2V0X2N0KHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgKaW5kZXggNzMyYjM1Y2MwOGQxYy4uYTQ4Mzk5YWZlNDk0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaApAQCAtNzgyNSw0ICYjNDM7NzgyNSw5IEBAIHN0cnVjdCBicGZfaW5zbl9hcnJheV92YWx1ZSB7CiAJX191MzIgOjMyOwogfTsKIAomIzQzOy8qIEZsYWdzIHRvIGNvbnRyb2wgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKSBiZWhhdmlvci4gKi8KJiM0MztlbnVtIHsKJiM0MzsJQlBGX1NLQl9FWFRfRl9DUkVBVEUgPSAoMVVMTCAmbHQ7Jmx0OyAwKSwKJiM0Mzt9OwomIzQzOwogI2VuZGlmIC8qIF9VQVBJX19MSU5VWF9CUEZfSF9fICovCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hlbHBlcnMuYyBiL2tlcm5lbC9icGYvaGVscGVycy5jCmluZGV4IGIzY2M1YzhmYzg3NTYuLmNmY2I3OTM5OWVkMGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvaGVscGVycy5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvaGVscGVycy5jCkBAIC0xOTI2LDYgJiM0MzsxOTI2LDggQEAgc3RhdGljIGludCBfX2JwZl9keW5wdHJfcmVhZCh2b2lkICpkc3QsIHU2NCBsZW4sIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnMKIAkJcmV0dXJuIDA7CiAJY2FzZSBCUEZfRFlOUFRSX1RZUEVfRklMRToKIAkJcmV0dXJuIGJwZl9maWxlX2ZldGNoX2J5dGVzKHNyYy0mZ3Q7ZGF0YSwgb2Zmc2V0LCBkc3QsIGxlbik7CiYjNDM7CWNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQ6CiYjNDM7CQlyZXR1cm4gX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzKHNyYy0mZ3Q7ZGF0YSwgc3JjLSZndDtvZmZzZXQgJiM0Mzsgb2Zmc2V0LCBkc3QsIGxlbik7CiAJZGVmYXVsdDoKIAkJV0FSTl9PTkNFKHRydWUsICYjMzQ7YnBmX2R5bnB0cl9yZWFkOiB1bmtub3duIGR5bnB0ciB0eXBlICVkXG4mIzM0OywgdHlwZSk7CiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTk4NSw2ICYjNDM7MTk4Nyw4IEBAIGludCBfX2JwZl9keW5wdHJfd3JpdGUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqZHN0LCB1NjQgb2Zmc2V0LCB2b2lkICpzcmMsCiAJY2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEE6CiAJCXJldHVybiBfX2JwZl9za2JfbWV0YV9zdG9yZV9ieXRlcyhkc3QtJmd0O2RhdGEsIGRzdC0mZ3Q7b2Zmc2V0ICYjNDM7IG9mZnNldCwgc3JjLAogCQkJCQkJICBsZW4sIGZsYWdzKTsKJiM0MzsJY2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDoKJiM0MzsJCXJldHVybiBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKGRzdC0mZ3Q7ZGF0YSwgZHN0LSZndDtvZmZzZXQgJiM0Mzsgb2Zmc2V0LCBzcmMsIGxlbiwgZmxhZ3MpOwogCWRlZmF1bHQ6CiAJCVdBUk5fT05DRSh0cnVlLCAmIzM0O2JwZl9keW5wdHJfd3JpdGU6IHVua25vd24gZHlucHRyIHR5cGUgJWRcbiYjMzQ7LCB0eXBlKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yMDMyLDYgJiM0MzsyMDM2LDcgQEAgQlBGX0NBTExfMyhicGZfZHlucHRyX2RhdGEsIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKiwgcHRyLCB1NjQsIG9mZnNldCwgdTYKIAljYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0I6CiAJY2FzZSBCUEZfRFlOUFRSX1RZUEVfWERQOgogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBOgomIzQzOwljYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOgogCQkvKiBza2IgYW5kIHhkcCBkeW5wdHJzIHNob3VsZCB1c2UgYnBmX2R5bnB0cl9zbGljZSAvIGJwZl9keW5wdHJfc2xpY2VfcmR3ciAqLwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgpAQCAtMzA0OCw4ICYjNDM7MzA1Myw4IEBAIF9fYnBmX2tmdW5jIHN0cnVjdCB0YXNrX3N0cnVjdCAqYnBmX3Rhc2tfZnJvbV92cGlkKHMzMiB2cGlkKQogICogcHJvdmlkZWQgYnVmZmVyLCB3aXRoIGl0cyBjb250ZW50cyBjb250YWluaW5nIHRoZSBkYXRhLCBpZiB1bmFibGUgdG8gb2J0YWluCiAgKiBkaXJlY3QgcG9pbnRlcikKICAqLwotX19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCwKLQkJCQkgICB2b2lkICpidWZmZXJfX251bGxhYmxlLCB1NjQgYnVmZmVyX19zemspCiYjNDM7c3RhdGljIHZvaWQgKl9fYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCwKJiM0MzsJCQkJdm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prLCBib29sIHdyKQogewogCWNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0ciA9IChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICopcDsKIAllbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlOwpAQCAtMzA4Nyw2ICYjNDM7MzA5Miw4IEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsCiAJfQogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBOgogCQlyZXR1cm4gYnBmX3NrYl9tZXRhX3BvaW50ZXIocHRyLSZndDtkYXRhLCBwdHItJmd0O29mZnNldCAmIzQzOyBvZmZzZXQpOwomIzQzOwljYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOgomIzQzOwkJcmV0dXJuIGJwZl9za2JfZXh0X3BvaW50ZXIocHRyLSZndDtkYXRhLCBwdHItJmd0O29mZnNldCAmIzQzOyBvZmZzZXQsIHdyKTsKIAljYXNlIEJQRl9EWU5QVFJfVFlQRV9GSUxFOgogCQllcnIgPSBicGZfZmlsZV9mZXRjaF9ieXRlcyhwdHItJmd0O2RhdGEsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemspOwogCQlyZXR1cm4gZXJyID8gTlVMTCA6IGJ1ZmZlcl9fbnVsbGFibGU7CkBAIC0zMDk2LDYgJiM0MzszMTAzLDEzIEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsCiAJfQogfQogCiYjNDM7X19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCwKJiM0MzsJCQkJICAgdm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prKQomIzQzO3sKJiM0MzsJcmV0dXJuIF9fYnBmX2R5bnB0cl9zbGljZShwLCBvZmZzZXQsIGJ1ZmZlcl9fbnVsbGFibGUsIGJ1ZmZlcl9fc3prLAomIzQzOwkJCQkgIGZhbHNlKTsKJiM0Mzt9CiYjNDM7CiAvKioKICAqIGJwZl9keW5wdHJfc2xpY2VfcmR3cigpIC0gT2J0YWluIGEgd3JpdGFibGUgcG9pbnRlciB0byB0aGUgZHlucHRyIGRhdGEuCiAgKiBAcDogVGhlIGR5bnB0ciB3aG9zZSBkYXRhIHNsaWNlIHRvIHJldHJpZXZlCkBAIC0zMTY4LDcgJiM0MzszMTgyLDggQEAgX19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZV9yZHdyKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgb2Zmc2V0LAogCSAqIHdpbGwgYmUgY29waWVkIG91dCBpbnRvIHRoZSBidWZmZXIgYW5kIHRoZSB1c2VyIHdpbGwgbmVlZCB0byBjYWxsCiAJICogYnBmX2R5bnB0cl93cml0ZSgpIHRvIGNvbW1pdCBjaGFuZ2VzLgogCSAqLwotCXJldHVybiBicGZfZHlucHRyX3NsaWNlKHAsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemspOwomIzQzOwlyZXR1cm4gX19icGZfZHlucHRyX3NsaWNlKHAsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemssCiYjNDM7CQkJCSAgdHJ1ZSk7CiB9CiAKIF9fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2FkanVzdChzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IHN0YXJ0LCB1NjQgZW5kKQpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9sb2cuYyBiL2tlcm5lbC9icGYvbG9nLmMKaW5kZXggNTg5NzcwY2EzZDNhMC4uMDJmOWJmNzJhYzA3YyAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9sb2cuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2xvZy5jCkBAIC00NjIsNiAmIzQzOzQ2Miw4IEBAIGNvbnN0IGNoYXIgKmR5bnB0cl90eXBlX3N0cihlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlKQogCQlyZXR1cm4gJiMzNDtza2JfbWV0YSYjMzQ7OwogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6CiAJCXJldHVybiAmIzM0O2ZpbGUmIzM0OzsKJiM0MzsJY2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDoKJiM0MzsJCXJldHVybiAmIzM0O3NrYl9leHQmIzM0OzsKIAljYXNlIEJQRl9EWU5QVFJfVFlQRV9JTlZBTElEOgogCQlyZXR1cm4gJiMzNDsmbHQ7aW52YWxpZCZndDsmIzM0OzsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jCmluZGV4IGU0MjFlYTJiODBjM2EuLmU4MmUwYjRkZDJjZTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTYyMSw2ICYjNDM7NjIxLDcgQEAgc3RhdGljIGVudW0gYnBmX3R5cGVfZmxhZyBnZXRfZHlucHRyX3R5cGVfZmxhZyhlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlKQogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX1hEUDoKIAkJcmV0dXJuIERZTlBUUl9UWVBFX1hEUDsKIAljYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQToKJiM0MzsJY2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDoKIAkJcmV0dXJuIERZTlBUUl9UWVBFX1NLQl9NRVRBOwogCWNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6CiAJCXJldHVybiBEWU5QVFJfVFlQRV9GSUxFOwpAQCAtNTg5MCw2ICYjNDM7NTg5MSwxMCBAQCBCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpIHsKIAlzdHJ1Y3QgZmlsZSAqdm1fZmlsZTsKIH07CiAKJiM0MztCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgYnBmX3NvY2tfb3BzX2tlcm4pIHsKJiM0MzsJc3RydWN0IHNrX2J1ZmYgKnNrYjsKJiM0Mzt9OwomIzQzOwogc3RhdGljIGJvb2wgdHlwZV9pc19yY3Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAkJCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsCiAJCQljb25zdCBjaGFyICpmaWVsZF9uYW1lLCB1MzIgYnRmX2lkKQpAQCAtNTkzMiw2ICYjNDM7NTkzNyw3IEBAIHN0YXRpYyBib29sIHR5cGVfaXNfdHJ1c3RlZF9vcl9udWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCiAJQlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgc29ja2V0KSk7CiAJQlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgZGVudHJ5KSk7CiAJQlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpKTsKJiM0MzsJQlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgYnBmX3NvY2tfb3BzX2tlcm4pKTsKIAogCXJldHVybiBidGZfbmVzdGVkX3R5cGVfaXNfdHJ1c3RlZCgmYW1wO2Vudi0mZ3Q7bG9nLCByZWcsIGZpZWxkX25hbWUsIGJ0Zl9pZCwKIAkJCQkJICAmIzM0O19fc2FmZV90cnVzdGVkX29yX251bGwmIzM0Oyk7CkBAIC0xMTYxNSw2ICYjNDM7MTE2MjEsNyBAQCBlbnVtIHNwZWNpYWxfa2Z1bmNfdHlwZSB7CiAJS0ZfYnBmX2R5bnB0cl9mcm9tX3hkcCwKIAlLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGEsCiAJS0ZfYnBmX3hkcF9wdWxsX2RhdGEsCiYjNDM7CUtGX2JwZl9keW5wdHJfZnJvbV9za2JfZXh0LAogCUtGX2JwZl9keW5wdHJfc2xpY2UsCiAJS0ZfYnBmX2R5bnB0cl9zbGljZV9yZHdyLAogCUtGX2JwZl9keW5wdHJfY2xvbmUsCkBAIC0xMTY5Miw2ICYjNDM7MTE2OTksMTEgQEAgQlRGX0lEX1VOVVNFRAogQlRGX0lEX1VOVVNFRAogQlRGX0lEX1VOVVNFRAogI2VuZGlmCiYjNDM7I2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVAomIzQzO0JURl9JRChmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCkKJiM0MzsjZWxzZQomIzQzO0JURl9JRF9VTlVTRUQKJiM0MzsjZW5kaWYKIEJURl9JRChmdW5jLCBicGZfZHlucHRyX3NsaWNlKQogQlRGX0lEKGZ1bmMsIGJwZl9keW5wdHJfc2xpY2VfcmR3cikKIEJURl9JRChmdW5jLCBicGZfZHlucHRyX2Nsb25lKQpAQCAtMTE4MjQsNyAmIzQzOzExODM2LDggQEAgc3RhdGljIGJvb2wgaXNfa2Z1bmNfYnBmX3ByZWVtcHRfZW5hYmxlKHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSkKIAogYm9vbCBicGZfaXNfa2Z1bmNfcGt0X2NoYW5naW5nKHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSkKIHsKLQlyZXR1cm4gbWV0YS0mZ3Q7ZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3hkcF9wdWxsX2RhdGFdOwomIzQzOwlyZXR1cm4gbWV0YS0mZ3Q7ZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3hkcF9wdWxsX2RhdGFdIHx8CiYjNDM7CSAgICAgICBtZXRhLSZndDtmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX2V4dF07CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEyODM1LDcgJiM0MzsxMjg0OCw4IEBAIHN0YXRpYyBpbnQgY2hlY2tfa2Z1bmNfYXJncyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21lCiAJCQkJZHlucHRyX2FyZ190eXBlIHw9IERZTlBUUl9UWVBFX1NLQjsKIAkJCX0gZWxzZSBpZiAobWV0YS0mZ3Q7ZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX3hkcF0pIHsKIAkJCQlkeW5wdHJfYXJnX3R5cGUgfD0gRFlOUFRSX1RZUEVfWERQOwotCQkJfSBlbHNlIGlmIChtZXRhLSZndDtmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGFdKSB7CiYjNDM7CQkJfSBlbHNlIGlmIChtZXRhLSZndDtmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGFdIHx8CiYjNDM7CQkJCSAgIG1ldGEtJmd0O2Z1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV9za2JfZXh0XSkgewogCQkJCWR5bnB0cl9hcmdfdHlwZSB8PSBEWU5QVFJfVFlQRV9TS0JfTUVUQTsKIAkJCX0gZWxzZSBpZiAobWV0YS0mZ3Q7ZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX2ZpbGVdKSB7CiAJCQkJZHlucHRyX2FyZ190eXBlIHw9IERZTlBUUl9UWVBFX0ZJTEU7CkBAIC0xMzc2Myw2ICYjNDM7MTM3NzcsMTMgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbiwKIAkJfQogCX0KIAomIzQzOwlpZiAobWV0YS5mdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX2V4dF0gJmFtcDsmYW1wOwomIzQzOwkgICAgKHByb2dfdHlwZSA9PSBCUEZfUFJPR19UWVBFX0xTTSB8fCBwcm9nX3R5cGUgPT0gQlBGX1BST0dfVFlQRV9UUkFDSU5HKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAobWV0YS5hcmdfY29uc3RhbnQudmFsdWUgJmFtcDsgQlBGX1NLQl9FWFRfRl9DUkVBVEUpKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtCUEZfU0tCX0VYVF9GX0NSRUFURSBpcyBub3QgYWxsb3dlZCBpbiBsc20vdHJhY2luZyBwcm9ncmFtc1xuJiMzNDspOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKIAlpZiAoaXNfYnBmX3JidHJlZV9hZGRfa2Z1bmMobWV0YS5mdW5jX2lkKSkgewogCQllcnIgPSBwdXNoX2NhbGxiYWNrX2NhbGwoZW52LCBpbnNuLCBpbnNuX2lkeCwgbWV0YS5zdWJwcm9nbm8sCiAJCQkJCSBzZXRfcmJ0cmVlX2FkZF9jYWxsYmFja19zdGF0ZSk7CmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IGUzODQ3NzM5MzU1MTUuLjZkNTczMjBkZmVhMzkgMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9LY29uZmlnCkBAIC01NDAsNCAmIzQzOzU0MCwyNCBAQCBjb25maWcgTkVUX1RFU1QKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAomIzQzO2NvbmZpZyBCUEZfU0tCX0VYVAomIzQzOwlib29sICYjMzQ7c2tiIGV4dGVuc2lvbiBmb3IgQlBGIG1ldGFkYXRhJiMzNDsKJiM0MzsJZGVwZW5kcyBvbiBCUEZfU1lTQ0FMTAomIzQzOwlzZWxlY3QgU0tCX0VYVEVOU0lPTlMKJiM0MzsJaGVscAomIzQzOwkgIEVuYWJsZSBhbiBza19idWZmIGV4dGVuc2lvbiBmb3Igc3RvcmluZyBCUEYgbWV0YWRhdGEuIFRoaXMgYWxsb3dzIEJQRgomIzQzOwkgIHByb2dyYW1zIHRvIGFzc29jaWF0ZSBhcmJpdHJhcnkgZGF0YSB3aXRoIGluZGl2aWR1YWwgcGFja2V0cyBhcyB0aGV5CiYjNDM7CSAgdHJhdmVyc2UgdGhlIG5ldHdvcmsgc3RhY2suIFRoZSBzdG9yYWdlIGlzIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbgomIzQzOwkgIHRoZSBza19idWZmIGlzIGZyZWVkLgomIzQzOwomIzQzO2NvbmZpZyBCUEZfU0tCX0VYVF9TSVpFCiYjNDM7CWludCAmIzM0O1NpemUgb2YgdGhlIEJQRiBza2IgZXh0ZW5zaW9uIG1ldGFkYXRhIGJ1ZmZlciYjMzQ7CiYjNDM7CWRlcGVuZHMgb24gQlBGX1NLQl9FWFQKJiM0MzsJcmFuZ2UgMSAyNTYKJiM0MzsJZGVmYXVsdCA2NAomIzQzOwloZWxwCiYjNDM7CSAgQ29uZmlndXJlcyB0aGUgc2l6ZSBvZiB0aGUgaW5saW5lIG1ldGFkYXRhIGJ1ZmZlciBpbiBzdHJ1Y3QKJiM0MzsJICBicGZfc2tiX2V4dCwgd2hpY2ggaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgYSBCUEYgcHJvZ3JhbSBjYW4KJiM0MzsJICBzdG9yZSBvciByZXRyaWV2ZSB3aXRoIGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KCkuCiYjNDM7CiBlbmRpZiAgICMgaWYgTkVUCmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWx0ZXIuYyBiL25ldC9jb3JlL2ZpbHRlci5jCmluZGV4IDYxOTQwZTc1MzU1MjMuLmJmNzU0ZjMzMDM0NjMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2ZpbHRlci5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9jb3JlL2ZpbHRlci5jCkBAIC0xMjQxOCw2ICYjNDM7MTI0MTgsNTQgQEAgaW50IF9fYnBmX3NrYl9tZXRhX3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsCiAJcmV0dXJuIDA7CiB9CiAKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUCiYjNDM7dm9pZCAqYnBmX3NrYl9leHRfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCBib29sIHdyKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9za2JfZXh0ICpleHQ7CiYjNDM7CiYjNDM7CWV4dCA9IHNrYl9leHRfZmluZChza2IsIFNLQl9FWFRfQlBGKTsKJiM0MzsJaWYgKCFleHQpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJaWYgKHdyICZhbXA7JmFtcDsgc2tiX2V4dF9zaGFyZWQoc2tiKSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlyZXR1cm4gZXh0LSZndDtidWYgJiM0Mzsgb2Zmc2V0OwomIzQzO30KJiM0MzsKJiM0MztpbnQgX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIHZvaWQgKnRvLAomIzQzOwkJCSAgICAgdTMyIGxlbikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfc2tiX2V4dCAqZXh0OwomIzQzOwomIzQzOwlleHQgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX0JQRik7CiYjNDM7CWlmICghZXh0KQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CW1lbW1vdmUodG8sIGV4dC0mZ3Q7YnVmICYjNDM7IG9mZnNldCwgbGVuKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO2ludCBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsCiYjNDM7CQkJICAgICAgY29uc3Qgdm9pZCAqZnJvbSwgdTMyIGxlbiwgdTY0IGZsYWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9za2JfZXh0ICpleHQ7CiYjNDM7CiYjNDM7CWlmICh1bmxpa2VseShmbGFncykpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJZXh0ID0gc2tiX2V4dF9maW5kKHNrYiwgU0tCX0VYVF9CUEYpOwomIzQzOwlpZiAoIWV4dCkKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwomIzQzOwlpZiAoc2tiX2V4dF9zaGFyZWQoc2tiKSkKJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CiYjNDM7CW1lbW1vdmUoZXh0LSZndDtidWYgJiM0Mzsgb2Zmc2V0LCBmcm9tLCBsZW4pOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7I2VuZGlmIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqLwomIzQzOwogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwogX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2Ioc3RydWN0IF9fc2tfYnVmZiAqcywgdTY0IGZsYWdzLAogCQkJCSAgICBzdHJ1Y3QgYnBmX2R5bnB0ciAqcHRyX191bmluaXQpCkBAIC0xMjQzNSw2ICYjNDM7MTI0ODMsNzkgQEAgX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2Ioc3RydWN0IF9fc2tfYnVmZiAqcywgdTY0IGZsYWdzLAogCXJldHVybiAwOwogfQogCiYjNDM7I2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVAomIzQzOy8qKgomIzQzOyAqIGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KCkgLSBJbml0aWFsaXplIGEgZHlucHRyIHRvIHRoZSBza2JfZXh0IEJQRiBhcmVhLgomIzQzOyAqIEBza2JfOiBzb2NrZXQgYnVmZmVyIHRvIGF0dGFjaCB0aGUgZXh0ZW5zaW9uIHRvCiYjNDM7ICogQHNpemU6IGR5bnB0ciBzaXplIGluIGJ5dGVzLCAwIGZvciBtYXhpbXVtIChDT05GSUdfQlBGX1NLQl9FWFRfU0laRSkKJiM0MzsgKiBAZmxhZ3NfX2s6IEJQRl9TS0JfRVhUX0ZfQ1JFQVRFIHRvIGNyZWF0ZS9DT1cgKHJlYWQtd3JpdGUpLCAwIHRvIGZpbmQKJiM0MzsgKiAgICAgICAgICAgIChyZWFkLW9ubHkpCiYjNDM7ICogQHB0cl9fdW5pbml0OiBkeW5wdHIgdG8gaW5pdGlhbGl6ZQomIzQzOyAqCiYjNDM7ICogV3JpdGVzIHRvIHRoZSBkeW5wdHIgKGJwZl9keW5wdHJfd3JpdGUoKSwgYnBmX2R5bnB0cl9zbGljZV9yZHdyKCkpIGZhaWwgd2l0aAomIzQzOyAqICUtRUJVU1kgb3IgTlVMTCBpZiB0aGUgZXh0ZW5zaW9uIGNodW5rIGlzIHNoYXJlZCB3aXRoIGNsb25lcywgZS5nLiBhZnRlcgomIzQzOyAqIGJwZl9jbG9uZV9yZWRpcmVjdCgpLiBSZS1hY3F1aXJlIHRoZSBkeW5wdHIgd2l0aCBCUEZfU0tCX0VYVF9GX0NSRUFURSB0byBnZXQKJiM0MzsgKiBhIHdyaXRhYmxlIHByaXZhdGUgY29weS4KJiM0MzsgKgomIzQzOyAqIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFIGlzIG5vdCBhbGxvd2VkIGluIHRyYWNpbmcgYW5kIExTTSBwcm9ncmFtcy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiAqICUwICAgICAgICAgLSBkeW5wdHIgcmVhZHkgdG8gdXNlCiYjNDM7ICogKiAlLUVOT0VOVCAgIC0gZXh0ZW5zaW9uIG5vdCBmb3VuZCAod2hlbiBub3QgY3JlYXRpbmcpCiYjNDM7ICogKiAlLUVOT01FTSAgIC0gYWxsb2NhdGlvbiBmYWlsZWQKJiM0MzsgKiAqICUtRUlOVkFMICAgLSBpbnZhbGlkIGZsYWdzCiYjNDM7ICogKiAlLUUyQklHICAgIC0gc2l6ZSBleGNlZWRzIENPTkZJR19CUEZfU0tCX0VYVF9TSVpFCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KHN0cnVjdCBfX3NrX2J1ZmYgKnNrYl8sIHUzMiBzaXplLAomIzQzOwkJCQkJdTY0IGZsYWdzX19rLAomIzQzOwkJCQkJc3RydWN0IGJwZl9keW5wdHIgKnB0cl9fdW5pbml0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilwdHJfX3VuaW5pdDsKJiM0MzsJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYl87CiYjNDM7CWJvb2wgY3JlYXRlID0gZmxhZ3NfX2sgJmFtcDsgQlBGX1NLQl9FWFRfRl9DUkVBVEU7CiYjNDM7CXN0cnVjdCBicGZfc2tiX2V4dCAqZXh0OwomIzQzOwlib29sIGV4aXN0czsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJaWYgKGZsYWdzX19rICZhbXA7IH5CUEZfU0tCX0VYVF9GX0NSRUFURSkgewomIzQzOwkJZXJyID0gLUVJTlZBTDsKJiM0MzsJCWdvdG8gZXJyb3I7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKHNpemUgJmd0OyBBUlJBWV9TSVpFKGV4dC0mZ3Q7YnVmKSkgewomIzQzOwkJZXJyID0gLUUyQklHOwomIzQzOwkJZ290byBlcnJvcjsKJiM0MzsJfQomIzQzOwlpZiAoIXNpemUpCiYjNDM7CQlzaXplID0gQVJSQVlfU0laRShleHQtJmd0O2J1Zik7CiYjNDM7CiYjNDM7CWV4aXN0cyA9IHNrYl9leHRfZXhpc3Qoc2tiLCBTS0JfRVhUX0JQRik7CiYjNDM7CWlmICghY3JlYXRlKSB7CiYjNDM7CQlpZiAoIWV4aXN0cykgewomIzQzOwkJCWVyciA9IC1FTk9FTlQ7CiYjNDM7CQkJZ290byBlcnJvcjsKJiM0MzsJCX0KJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWV4dCA9IHNrYl9leHRfYWRkKHNrYiwgU0tCX0VYVF9CUEYpOwomIzQzOwlpZiAoIWV4dCkgewomIzQzOwkJZXJyID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gZXJyb3I7CiYjNDM7CX0KJiM0MzsJaWYgKCFleGlzdHMpCiYjNDM7CQltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOwomIzQzO291dDoKJiM0MzsJYnBmX2R5bnB0cl9pbml0KHB0ciwgc2tiLCBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVCwgMCwgc2l6ZSk7CiYjNDM7CWlmICghY3JlYXRlKQomIzQzOwkJYnBmX2R5bnB0cl9zZXRfcmRvbmx5KHB0cik7CiYjNDM7CXJldHVybiAwOwomIzQzO2Vycm9yOgomIzQzOwlicGZfZHlucHRyX3NldF9udWxsKHB0cik7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOyNlbmRpZiAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi8KJiM0MzsKIC8qKgogICogYnBmX2R5bnB0cl9mcm9tX3NrYl9tZXRhKCkgLSBJbml0aWFsaXplIGEgZHlucHRyIHRvIHRoZSBza2IgbWV0YWRhdGEgYXJlYS4KICAqIEBza2JfOiBzb2NrZXQgYnVmZmVyIGNhcnJ5aW5nIHRoZSBtZXRhZGF0YQpAQCAtMTI4MTYsNiAmIzQzOzEyOTM3LDEyIEBAIEJURl9LRlVOQ1NfU1RBUlQoYnBmX2tmdW5jX2NoZWNrX3NldF9za2JfbWV0YSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX21ldGEpCiBCVEZfS0ZVTkNTX0VORChicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9tZXRhKQogCiYjNDM7I2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVAomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX2tmdW5jX2NoZWNrX3NldF9za2JfZXh0KQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCkKJiM0MztCVEZfS0ZVTkNTX0VORChicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9leHQpCiYjNDM7I2VuZGlmCiYjNDM7CiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9rZnVuY19jaGVja19zZXRfeGRwKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9keW5wdHJfZnJvbV94ZHApCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX3hkcF9wdWxsX2RhdGEpCkBAIC0xMjg0Nyw2ICYjNDM7MTI5NzQsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfc2tiX21ldGEgPSB7CiAJLnNldCA9ICZhbXA7YnBmX2tmdW5jX2NoZWNrX3NldF9za2JfbWV0YSwKIH07CiAKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUCiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfc2tiX2V4dCA9IHsKJiM0MzsJLm93bmVyID0gVEhJU19NT0RVTEUsCiYjNDM7CS5zZXQgPSAmYW1wO2JwZl9rZnVuY19jaGVja19zZXRfc2tiX2V4dCwKJiM0Mzt9OwomIzQzOyNlbmRpZgomIzQzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfeGRwID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5zZXQgPSAmYW1wO2JwZl9rZnVuY19jaGVja19zZXRfeGRwLApAQCAtMTI4ODksNiAmIzQzOzEzMDIzLDIxIEBAIHN0YXRpYyBpbnQgX19pbml0IGJwZl9rZnVuY19pbml0KHZvaWQpCiAJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiKTsKIAlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9tZXRhKTsKIAlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9tZXRhKTsKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUCiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQUNULCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfQ0dST1VQX1NLQiwgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9leHQpOwomIzQzOwlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NPQ0tfT1BTLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0tfU0tCLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7CXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU09DS0VUX0ZJTFRFUiwgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9leHQpOwomIzQzOwlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9PVVQsICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MV1RfSU4sICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MV1RfWE1JVCwgJmFtcDticGZfa2Z1bmNfc2V0X3NrYl9leHQpOwomIzQzOwlyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9TRUc2TE9DQUwsICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9ORVRGSUxURVIsICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MU00sICZhbXA7YnBmX2tmdW5jX3NldF9za2JfZXh0KTsKJiM0MzsJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCAmYW1wO2JwZl9rZnVuY19zZXRfc2tiX2V4dCk7CiYjNDM7I2VuZGlmCiAJcmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsICZhbXA7YnBmX2tmdW5jX3NldF94ZHApOwogCXJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfQ0dST1VQX1NPQ0tfQUREUiwKIAkJCQkJICAgICAgICZhbXA7YnBmX2tmdW5jX3NldF9zb2NrX2FkZHIpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCBhYjE5NWI5OWM4NTMwLi5hNDc5ZTI1ZGU1NjQ4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtODMsNiAmIzQzOzgzLDcgQEAKICNpbmNsdWRlICZsdDtuZXQvcGFnZV9wb29sL2hlbHBlcnMuaCZndDsKICNpbmNsdWRlICZsdDtuZXQvcHNwL3R5cGVzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L2Ryb3ByZWFzb24uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L3hkcF9zb2NrLmgmZ3Q7CiAKICNpbmNsdWRlICZsdDtsaW51eC91YWNjZXNzLmgmZ3Q7CkBAIC01MTY5LDYgJiM0Mzs1MTcwLDkgQEAgc3RhdGljIGNvbnN0IHU4IHNrYl9leHRfdHlwZV9sZW5bXSA9IHsKICNpZiBJU19FTkFCTEVEKENPTkZJR19DQU4pCiAJW1NLQl9FWFRfQ0FOXSA9IFNLQl9FWFRfQ0hVTktTSVpFT0Yoc3RydWN0IGNhbl9za2JfZXh0KSwKICNlbmRpZgomIzQzOyNpZiBJU19FTkFCTEVEKENPTkZJR19CUEZfU0tCX0VYVCkKJiM0MzsJW1NLQl9FWFRfQlBGXSA9IFNLQl9FWFRfQ0hVTktTSVpFT0Yoc3RydWN0IGJwZl9za2JfZXh0KSwKJiM0MzsjZW5kaWYKIH07CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgX19ub19wcm9maWxlIHVuc2lnbmVkIGludCBza2JfZXh0X3RvdGFsX2xlbmd0aCh2b2lkKQpAQCAtNjI4Nyw3ICYjNDM7NjI5MSw4IEBAIEVYUE9SVF9TWU1CT0woc2tiX3RyeV9jb2FsZXNjZSk7CiAgKiBvcGVyYXRpb25zLgogICogc2tiX3NjcnViX3BhY2tldCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNsZWFuIGEgc2tiIGJlZm9yZSBpbmplY3RpbmcgaXQgaW4KICAqIGFub3RoZXIgbmFtZXNwYWNlIChAeG5ldCA9PSB0cnVlKS4gV2UgaGF2ZSB0byBjbGVhciBhbGwgaW5mb3JtYXRpb24gaW4gdGhlCi0gKiBza2IgdGhhdCBjb3VsZCBpbXBhY3QgbmFtZXNwYWNlIGlzb2xhdGlvbi4KJiM0MzsgKiBza2IgdGhhdCBjb3VsZCBpbXBhY3QgbmFtZXNwYWNlIGlzb2xhdGlvbi4gTm90ZSB0aGF0IEJQRiBza2IgZXh0ZW5zaW9uIGlzCiYjNDM7ICogbWVhbnQgdG8gY2FycnkgaW5mb3JtYXRpb24gYWNyb3NzIG5hbWVzcGFjZXMgYnkgZGVzaWduLgogICovCiB2b2lkIHNrYl9zY3J1Yl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB4bmV0KQogewpAQCAtNjI5NSw3ICYjNDM7NjMwMCw3IEBAIHZvaWQgc2tiX3NjcnViX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHhuZXQpCiAJc2tiLSZndDtza2JfaWlmID0gMDsKIAlza2ItJmd0O2lnbm9yZV9kZiA9IDA7CiAJc2tiX2RzdF9kcm9wKHNrYik7Ci0Jc2tiX2V4dF9yZXNldChza2IpOwomIzQzOwlza2JfZXh0X3NjcnViKHNrYik7CiAJbmZfcmVzZXRfY3Qoc2tiKTsKIAluZl9yZXNldF90cmFjZShza2IpOwogCkBAIC03MzA0LDYgJiM0Mzs3MzA5LDI0IEBAIHZvaWQgX19za2JfZXh0X3B1dChzdHJ1Y3Qgc2tiX2V4dCAqZXh0KQogCWttZW1fY2FjaGVfZnJlZShza2J1ZmZfZXh0X2NhY2hlLCBleHQpOwogfQogRVhQT1JUX1NZTUJPTChfX3NrYl9leHRfcHV0KTsKJiM0MzsKJiM0Mzt2b2lkIHNrYl9leHRfc2NydWIoc3RydWN0IHNrX2J1ZmYgKnNrYikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBpZDsKJiM0MzsKJiM0MzsJaWYgKGxpa2VseSghc2tiLSZndDthY3RpdmVfZXh0ZW5zaW9ucykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWZvciAoaWQgPSAwOyBpZCAmbHQ7IFNLQl9FWFRfTlVNOyBpZCYjNDM7JiM0MzspIHsKJiM0MzsjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NLQl9FWFQpCiYjNDM7CQlpZiAoaWQgPT0gU0tCX0VYVF9CUEYpCiYjNDM7CQkJY29udGludWU7CiYjNDM7I2VuZGlmCiYjNDM7CQlza2JfZXh0X2RlbChza2IsIGlkKTsKJiM0MzsJfQomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MKHNrYl9leHRfc2NydWIpOwomIzQzOwogI2VuZGlmIC8qIENPTkZJR19TS0JfRVhURU5TSU9OUyAqLwogCiBzdGF0aWMgdm9pZCBrZnJlZV9za2JfbmFwaV9jYWNoZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBiMzg4N2M0MmFkZmRiLi5jZjA5M2IwZDY2YzU4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvaXB2NC91ZHAuYwpAQCAtMTU0MCw4ICYjNDM7MTU0MCw2IEBAIHZvaWQgdWRwX3NwbGljZV9lb2Yoc3RydWN0IHNvY2tldCAqc29jaykKICAqCiAgKiBXZSBuZWVkIHRvIHByZXNlcnZlIHNlY3BhdGgsIGlmIHByZXNlbnQsIHRvIGV2ZW50dWFsbHkgcHJvY2VzcwogICogSVBfQ01TR19QQVNTU0VDIGF0IHJlY3Ztc2coKSB0aW1lLgotICoKLSAqIE90aGVyIGV4dGVuc2lvbnMgY2FuIGJlIGNsZWFyZWQuCiAgKi8KIHN0YXRpYyBib29sIHVkcF90cnlfbWFrZV9zdGF0ZWxlc3Moc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTE1NDksOCAmIzQzOzE1NDcsOCBAQCBzdGF0aWMgYm9vbCB1ZHBfdHJ5X21ha2Vfc3RhdGVsZXNzKHN0cnVjdCBza19idWZmICpza2IpCiAJCXJldHVybiB0cnVlOwogCiAJaWYgKCFzZWNwYXRoX2V4aXN0cyhza2IpKSB7Ci0JCXNrYl9leHRfcmVzZXQoc2tiKTsKLQkJcmV0dXJuIHRydWU7CiYjNDM7CQlza2JfZXh0X3NjcnViKHNrYik7CiYjNDM7CQlyZXR1cm4gIXNrYl9oYXNfZXh0ZW5zaW9ucyhza2IpOwogCX0KIAogCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCmluZGV4IGVhNzA0NGYzMGFkYzMuLjliYmZhMzUxYmNlZGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwpAQCAtNyw2ICYjNDM7Nyw3IEBAIENPTkZJR19CUEZfSklUPXkKIENPTkZJR19CUEZfS1BST0JFX09WRVJSSURFPXkKIENPTkZJR19CUEZfTElSQ19NT0RFMj15CiBDT05GSUdfQlBGX0xTTT15CiYjNDM7Q09ORklHX0JQRl9TS0JfRVhUPXkKIENPTkZJR19CUEZfU1RSRUFNX1BBUlNFUj15CiBDT05GSUdfQlBGX1NZU0NBTEw9eQogIyBDT05GSUdfQlBGX1VOUFJJVl9ERUZBVUxUX09GRiBpcyBub3Qgc2V0CkBAIC0xMzYsMyAmIzQzOzEzNyw0IEBAIENPTkZJR19TTUNfSFNfQ1RSTF9CUEY9eQogQ09ORklHX0RJQlM9eQogQ09ORklHX0RJQlNfTE89eQogQ09ORklHX1BNX1dBS0VMT0NLUz15CiYjNDM7Q09ORklHX05FVF9TQ0hfTkVURU09eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc29ja2V0X2hlbHBlcnMuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NvY2tldF9oZWxwZXJzLmgKaW5kZXggMGQ1OTUwM2EwYzczZS4uZWIxMTRhNmVhNmY5MiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc29ja2V0X2hlbHBlcnMuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zb2NrZXRfaGVscGVycy5oCkBAIC0zLDYgJiM0MzszLDcgQEAKICNpZm5kZWYgX19TT0NLRVRfSEVMUEVSU19fCiAjZGVmaW5lIF9fU09DS0VUX0hFTFBFUlNfXwogCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm9yLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3VuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvdm1fc29ja2V0cy5oJmd0OwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZmllci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZpZXIuYwppbmRleCA2NGFjNDlhZDY3ZTYzLi43NzI0ZTgyZmNlNjZhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZmllci5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmaWVyLmMKQEAgLTk0LDYgJiM0Mzs5NCw3IEBACiAjaW5jbHVkZSAmIzM0O3ZlcmlmaWVyX3NjYWxhcl9pZHMuc2tlbC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7dmVyaWZpZXJfc2Rpdi5za2VsLmgmIzM0OwogI2luY2x1ZGUgJiMzNDt2ZXJpZmllcl9zZWFyY2hfcHJ1bmluZy5za2VsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dmVyaWZpZXJfc2tiX2V4dC5za2VsLmgmIzM0OwogI2luY2x1ZGUgJiMzNDt2ZXJpZmllcl9zb2NrLnNrZWwuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3ZlcmlmaWVyX3NvY2tfYWRkci5za2VsLmgmIzM0OwogI2luY2x1ZGUgJiMzNDt2ZXJpZmllcl9zb2NrbWFwX211dGF0ZS5za2VsLmgmIzM0OwpAQCAtMjU2LDYgJiM0MzsyNTcsNyBAQCB2b2lkIHRlc3RfdmVyaWZpZXJfcnVudGltZV9qaXQodm9pZCkgICAgICAgICAgeyBSVU4odmVyaWZpZXJfcnVudGltZV9qaXQpOyB9CiB2b2lkIHRlc3RfdmVyaWZpZXJfc2NhbGFyX2lkcyh2b2lkKSAgICAgICAgICAgeyBSVU4odmVyaWZpZXJfc2NhbGFyX2lkcyk7IH0KIHZvaWQgdGVzdF92ZXJpZmllcl9zZGl2KHZvaWQpICAgICAgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9zZGl2KTsgfQogdm9pZCB0ZXN0X3ZlcmlmaWVyX3NlYXJjaF9wcnVuaW5nKHZvaWQpICAgICAgIHsgUlVOKHZlcmlmaWVyX3NlYXJjaF9wcnVuaW5nKTsgfQomIzQzO3ZvaWQgdGVzdF92ZXJpZmllcl9za2JfZXh0KHZvaWQpICAgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9za2JfZXh0KTsgfQogdm9pZCB0ZXN0X3ZlcmlmaWVyX3NvY2sodm9pZCkgICAgICAgICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3NvY2spOyB9CiB2b2lkIHRlc3RfdmVyaWZpZXJfc29ja19hZGRyKHZvaWQpICAgICAgICAgICAgeyBSVU4odmVyaWZpZXJfc29ja19hZGRyKTsgfQogdm9pZCB0ZXN0X3ZlcmlmaWVyX3NvY2ttYXBfbXV0YXRlKHZvaWQpICAgICAgIHsgUlVOKHZlcmlmaWVyX3NvY2ttYXBfbXV0YXRlKTsgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMveGRwX2NvbnRleHRfdGVzdF9ydW4uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3hkcF9jb250ZXh0X3Rlc3RfcnVuLmMKaW5kZXggNDQ4ODA3Njc2MTc2Yy4uOWNiYjgzOWE1NWNjZSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMveGRwX2NvbnRleHRfdGVzdF9ydW4uYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy94ZHBfY29udGV4dF90ZXN0X3J1bi5jCkBAIC0yLDcgJiM0MzsyLDkgQEAKICNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0d29ya19oZWxwZXJzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvaXB2Ni5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9uZXRmaWx0ZXIuaCZndDsKICNpbmNsdWRlICZsdDthcnBhL2luZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O3NvY2tldF9oZWxwZXJzLmgmIzM0OwogI2luY2x1ZGUgJiMzNDt0ZXN0X3hkcF9jb250ZXh0X3Rlc3RfcnVuLnNrZWwuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3Rlc3RfeGRwX21ldGEuc2tlbC5oJiMzNDsKIApAQCAtMTYsMTMgJiM0MzsxOCwxNCBAQAogI2RlZmluZSBEVU1NWV9OQU1FICYjMzQ7ZHVtMCYjMzQ7CiAjZGVmaW5lIFRBUF9ORVROUyAmIzM0O3hkcF9jb250ZXh0X3R1bnRhcCYjMzQ7CiAjZGVmaW5lIExXVF9ORVROUyAmIzM0O3hkcF9jb250ZXh0X2x3dCYjMzQ7CiYjNDM7I2RlZmluZSBTS0JfRVhUX05FVE5TICYjMzQ7c2tiX2V4dF90dW50YXAmIzM0OwogCiAjZGVmaW5lIFRFU1RfUEFZTE9BRF9MRU4gMzIKIHN0YXRpYyBjb25zdCBfX3U4IHRlc3RfcGF5bG9hZFtURVNUX1BBWUxPQURfTEVOXSA9IHsKLQkweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAotCTB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsCi0JMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKLQkweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LAomIzQzOwkweDQ5LCAweDIwLCAweDYzLCAweDcyLCAweDZmLCAweDczLCAweDczLCAweDY1LAomIzQzOwkweDY0LCAweDIwLCAweDY4LCAweDZmLCAweDZmLCAweDZiLCAweDczLCAweDIwLAomIzQzOwkweDI2LCAweDIwLCAweDZjLCAweDY5LCAweDc2LCAweDY1LCAweDY0LCAweDIwLAomIzQzOwkweDc0LCAweDZmLCAweDIwLCAweDc0LCAweDY1LCAweDZjLCAweDZjLCAweDIxLAogfTsKIAogdm9pZCB0ZXN0X3hkcF9jb250ZXh0X2Vycm9yKGludCBwcm9nX2ZkLCBzdHJ1Y3QgYnBmX3Rlc3RfcnVuX29wdHMgb3B0cywKQEAgLTMzMSwxMCAmIzQzOzMzNCwxMSBAQCB2b2lkIHRlc3RfeGRwX2NvbnRleHRfdmV0aCh2b2lkKQogCW5ldG5zX2ZyZWUodHhfbnMpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLAotCQkJc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZywKLQkJCXN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18yX3Byb2csCi0JCQlib29sICp0ZXN0X3Bhc3MpCiYjNDM7c3RhdGljIHZvaWQgX190ZXN0X3R1bnRhcChjb25zdCBjaGFyICpuc25hbWUsCiYjNDM7CQkJICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLAomIzQzOwkJCSAgc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZywKJiM0MzsJCQkgIHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18yX3Byb2csCiYjNDM7CQkJICBib29sICp0ZXN0X3Bhc3MpCiB7CiAJTElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7CiAJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKQEAgLTM0NSw3ICYjNDM7MzQ5LDcgQEAgc3RhdGljIHZvaWQgdGVzdF90dW50YXAoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZywKIAogCSp0ZXN0X3Bhc3MgPSBmYWxzZTsKIAotCW5zID0gbmV0bnNfbmV3KFRBUF9ORVROUywgdHJ1ZSk7CiYjNDM7CW5zID0gbmV0bnNfbmV3KG5zbmFtZSwgdHJ1ZSk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKG5zLCAmIzM0O2NyZWF0ZSBhbmQgb3BlbiBucyYjMzQ7KSkKIAkJcmV0dXJuOwogCkBAIC0zOTYsNiAmIzQzOzQwMCwxNSBAQCBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLAogCW5ldG5zX2ZyZWUobnMpOwogfQogCiYjNDM7c3RhdGljIHZvaWQgdGVzdF90dW50YXAoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZywKJiM0MzsJCQlzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMV9wcm9nLAomIzQzOwkJCXN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18yX3Byb2csCiYjNDM7CQkJYm9vbCAqdGVzdF9wYXNzKQomIzQzO3sKJiM0MzsJX190ZXN0X3R1bnRhcChUQVBfTkVUTlMsIHhkcF9wcm9nLCB0Y19wcmlvXzFfcHJvZywgdGNfcHJpb18yX3Byb2csCiYjNDM7CQkgICAgICB0ZXN0X3Bhc3MpOwomIzQzO30KJiM0MzsKIC8qIFdyaXRlIGEgcGFja2V0IHRvIGEgdGFwIGRldiBhbmQgY29weSBpdCB0byBpbmdyZXNzIG9mIGEgZHVtbXkgZGV2ICovCiBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcF9taXJyZWQoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZywKIAkJCSAgICAgICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3Byb2csCkBAIC02OTMsMyAmIzQzOzcwNiwxMDg5IEBAIHZvaWQgdGVzdF94ZHBfY29udGV4dF9sd3RfZW5jYXAodm9pZCkKIAogCXRlc3RfeGRwX21ldGFfX2Rlc3Ryb3koc2tlbCk7CiB9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMV9wcm9nLAomIzQzOwkJCQlzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMl9wcm9nLAomIzQzOwkJCQlib29sICp0ZXN0X3Bhc3MpCiYjNDM7ewomIzQzOwlfX3Rlc3RfdHVudGFwKFNLQl9FWFRfTkVUTlMsIE5VTEwgLyogeGRwICovLCB0Y19wcmlvXzFfcHJvZywKJiM0MzsJCSAgICAgIHRjX3ByaW9fMl9wcm9nLCB0ZXN0X3Bhc3MpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3QgaWYgc2tiX2V4dCBzdXJ2aXZlcyBza2IgY2xvbmUgKHZpYSB0YyBtaXJyZWQpLgomIzQzOyAqIGR1bW15X3Byb2cgcnVucyBvbiB0aGUgY2xvbmUgKGR1bW15IGluZ3Jlc3MpLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfbWlycmVkX2Nsb25lX2V4dChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCwKJiM0MzsJCQkJICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmR1bW15X3Byb2cpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwlpbnQgZHVtbXlfaWZpbmRleDsKJiM0MzsJaW50IHRhcF9pZmluZGV4OwomIzQzOwlpbnQgdGFwX2ZkID0gLTE7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7d3JpdGVfZG9uZSA9IGZhbHNlOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlucyA9IG5ldG5zX25ldygmIzM0O21pcnJlZF9jbG9uZSYjMzQ7LCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG5zLCAmIzM0O25ldG5zX25ldyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJLyogRHVtbXkgZGV2OiBhdHRhY2ggcmVhZGVyICovCiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIGFkZCBuYW1lICYjMzQ7IERVTU1ZX05BTUUgJiMzNDsgdHlwZSBkdW1teSYjMzQ7KTsKJiM0MzsJU1lTKGNsb3NlLCAmIzM0O2lwIGxpbmsgc2V0IGRldiAmIzM0OyBEVU1NWV9OQU1FICYjMzQ7IHVwJiMzNDspOwomIzQzOwomIzQzOwlkdW1teV9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoRFVNTVlfTkFNRSk7CiYjNDM7CWlmICghQVNTRVJUX0dUKGR1bW15X2lmaW5kZXgsIDAsICYjMzQ7ZHVtbXlfaWZpbmRleCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXRjX2hvb2suaWZpbmRleCA9IGR1bW15X2lmaW5kZXg7CiYjNDM7CXJldCA9IGJwZl90Y19ob29rX2NyZWF0ZSgmYW1wO3RjX2hvb2spOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZHVtbXlfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoZHVtbXlfcHJvZyk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0Y19ob29rLCAmYW1wO3RjX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZHVtbXlfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJLyogVEFQIGRldjogYXR0YWNoIHdyaXRlciAmIzQzOyBtaXJyZWQgdG8gZHVtbXkgKi8KJiM0MzsJdGFwX2ZkID0gb3Blbl90dW50YXAoVEFQX05BTUUsIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRSh0YXBfZmQsIDAsICYjMzQ7b3Blbl90dW50YXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwlTWVMoY2xvc2UsICYjMzQ7aXAgbGluayBzZXQgZGV2ICYjMzQ7IFRBUF9OQU1FICYjMzQ7IHVwJiMzNDspOwomIzQzOwomIzQzOwl0YXBfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFRBUF9OQU1FKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QodGFwX2lmaW5kZXgsIDAsICYjMzQ7dGFwX2lmaW5kZXgmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0Y19ob29rLmlmaW5kZXggPSB0YXBfaWZpbmRleDsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt0YXBfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfaWQgPSAwOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0Y19ob29rLCAmYW1wO3RjX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7dGFwX2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDt0YyBmaWx0ZXIgYWRkIGRldiAmIzM0OyBUQVBfTkFNRSAmIzM0OyBpbmdyZXNzICYjMzQ7CiYjNDM7CQkgICAmIzM0O3Byb3RvY29sIGFsbCBtYXRjaGFsbCAmIzM0OwomIzQzOwkJICAgJiMzNDthY3Rpb24gbWlycmVkIGluZ3Jlc3MgbWlycm9yIGRldiAmIzM0OyBEVU1NWV9OQU1FKTsKJiM0MzsKJiM0MzsJcmV0ID0gd3JpdGVfdGVzdF9wYWNrZXQodGFwX2ZkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX3Rlc3RfcGFja2V0JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt3cml0ZV9kb25lLCAmIzM0O3dyaXRlX2RvbmUmIzM0Oyk7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzLCAmIzM0O3Rlc3RfcGFzcyYjMzQ7KTsKJiM0MzsKJiM0MztjbG9zZToKJiM0MzsJaWYgKHRhcF9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UodGFwX2ZkKTsKJiM0MzsJbmV0bnNfZnJlZShucyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfbWlycmVkX2Nsb25lX2V4dF9jb3coc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2xpbmsgKnRwX2xpbms7CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7Y2xvbmVfY293X2RvbmUgPSBmYWxzZTsKJiM0MzsJdHBfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2goc2tlbC0mZ3Q7cHJvZ3MudHBfa2ZyZWVfc2tiX2Nvd19jaGVjayk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUih0cF9saW5rLCAmIzM0O2F0dGFjaF90cCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJdGVzdF9taXJyZWRfY2xvbmVfZXh0KHNrZWwsIHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfY2xvbmVfcmVkaXJfY293KTsKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kodHBfbGluayk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogV3JpdGVyIGNsb25lcyB2aWEgYnBmX2Nsb25lX3JlZGlyZWN0KCkgZnJvbSB0aGUgcHJvZyBpdHNlbGYgdG8gbG9vcGJhY2sKJiM0MzsgKiB3aG9zZSBuZXRlbSBxZGlzYyBkZWxheXMgdGhlIGNsb25lLCBzbyBpdCBzdGF5cyBxdWV1ZWQgYW5kIGtlZXBzIHNoYXJpbmcKJiM0MzsgKiB0aGUgZXh0IGJsb2NrIHdoaWxlIHRoZSBwcm9nIHdyaXRlcyBhZ2Fpbi4gV2hlbiB0aGUgcWRpc2MgZmluYWxseSBsZWFrcwomIzQzOyAqIHRoZSBjbG9uZSBiYWNrIHRvIGxvIGluZ3Jlc3MsIHRoZSByZWFkZXIgdGhlcmUgbXVzdCBzdGlsbCBzZWUgdGhlCiYjNDM7ICogY2xvbmUtdGltZSBzbmFwc2hvdC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB0ZXN0X2Nsb25lX3JlZGlyX2V4dF93cml0ZV9hZnRlcihzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCwKJiM0MzsJCQkJCSAgICAgc3RydWN0IGJwZl9wcm9ncmFtICp3cml0ZXIpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwlpbnQgdGFwX2lmaW5kZXg7CiYjNDM7CWludCB0YXBfZmQgPSAtMTsKJiM0MzsJaW50IHJldCwgaTsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MgPSBmYWxzZTsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt3cml0ZV9ibG9ja2VkID0gZmFsc2U7CiYjNDM7CiYjNDM7CW5zID0gbmV0bnNfbmV3KCYjMzQ7Y2xvbmVfcmVkaXJfZXh0JiMzNDssIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKiBSZWRpcmVjdCB0YXJnZXQ6IGxvIGhlbGQgYmFjayBieSBuZXRlbSBkZWxheSAqLwomIzQzOwlTWVMoY2xvc2UsICYjMzQ7aXAgbGluayBzZXQgZGV2IGxvIHVwJiMzNDspOwomIzQzOwlTWVMoY2xvc2UsICYjMzQ7dGMgcWRpc2MgYWRkIGRldiBsbyByb290IG5ldGVtIGRlbGF5IDUwbXMmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIFJlYWRlciBvbiB0aGUgY2xvbmU6IGxvIGluZ3Jlc3MgKi8KJiM0MzsJdGNfaG9vay5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoJiMzNDtsbyYjMzQ7KTsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtsb19ob29rX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3JlYWQpOwomIzQzOwlyZXQgPSBicGZfdGNfYXR0YWNoKCZhbXA7dGNfaG9vaywgJmFtcDt0Y19vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2xvX2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CS8qIFRBUCBkZXY6IGF0dGFjaCB3cml0ZXIgd2hpY2ggY2xvbmVfcmVkaXJlY3RzIHRvIGxvICovCiYjNDM7CXRhcF9mZCA9IG9wZW5fdHVudGFwKFRBUF9OQU1FLCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UodGFwX2ZkLCAwLCAmIzM0O29wZW5fdHVudGFwJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJU1lTKGNsb3NlLCAmIzM0O2lwIGxpbmsgc2V0IGRldiAmIzM0OyBUQVBfTkFNRSAmIzM0OyB1cCYjMzQ7KTsKJiM0MzsKJiM0MzsJdGFwX2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChUQVBfTkFNRSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHRhcF9pZmluZGV4LCAwLCAmIzM0O3RhcF9pZmluZGV4JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDtjbG9uZV9yZWRpcl9pZmluZGV4ID0gdGNfaG9vay5pZmluZGV4OwomIzQzOwomIzQzOwl0Y19ob29rLmlmaW5kZXggPSB0YXBfaWZpbmRleDsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt0YXBfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfaWQgPSAwOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQod3JpdGVyKTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3RjX2hvb2ssICZhbXA7dGNfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt0YXBfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJcmV0ID0gd3JpdGVfdGVzdF9wYWNrZXQodGFwX2ZkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX3Rlc3RfcGFja2V0JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt3cml0ZV9ibG9ja2VkLCAmIzM0O3dyaXRlX2Jsb2NrZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIENsb25lIGFycml2ZXMgYWZ0ZXIgdGhlIG5ldGVtIGRlbGF5OyBwb2xsIGV2ZXJ5IDEwIG1zZWMgdXAgdG8gMSBzZWMgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDEwMCAmYW1wOyZhbXA7ICFza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzczsgaSYjNDM7JiM0MzspCiYjNDM7CQl1c2xlZXAoMTAwMDApOwomIzQzOwlBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcywgJiMzNDt0ZXN0X3Bhc3MmIzM0Oyk7CiYjNDM7CiYjNDM7Y2xvc2U6CiYjNDM7CWlmICh0YXBfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHRhcF9mZCk7CiYjNDM7CW5ldG5zX2ZyZWUobnMpOwomIzQzO30KJiM0MzsKJiM0MzsvKiBUZXN0IGlmIHNrYl9leHQgc3Vydml2ZXMgdmV0aCBjcm9zcy1uZXRucyBmb3J3YXJkICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdHhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19FR1JFU1MpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdHhfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgcnhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHJ4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqcnhfbnMgPSBOVUxMLCAqdHhfbnMgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbnN0b2tlbiAqbnN0b2tlbiA9IE5VTEw7CiYjNDM7CWludCByeF9pZmluZGV4LCB0eF9pZmluZGV4OwomIzQzOwlpbnQgcmV0OwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJdHhfbnMgPSBuZXRuc19uZXcoVFhfTkVUTlMsIGZhbHNlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHR4X25zLCAmIzM0O2NyZWF0ZSB0eF9ucyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJcnhfbnMgPSBuZXRuc19uZXcoUlhfTkVUTlMsIGZhbHNlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHJ4X25zLCAmIzM0O2NyZWF0ZSByeF9ucyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIGFkZCAmIzM0OyBSWF9OQU1FICYjMzQ7IG5ldG5zICYjMzQ7IFJYX05FVE5TCiYjNDM7CSAgICAmIzM0OyB0eXBlIHZldGggcGVlciBuYW1lICYjMzQ7IFRYX05BTUUgJiMzNDsgbmV0bnMgJiMzNDsgVFhfTkVUTlMpOwomIzQzOwomIzQzOwkvKiBTZXR1cCBSWCBzaWRlOiBUQyBpbmdyZXNzIHJlYWRlciAqLwomIzQzOwluc3Rva2VuID0gb3Blbl9uZXRucyhSWF9ORVROUyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCAmIzM0O3NldG5zIHJ4X25zJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJU1lTKGNsb3NlLCAmIzM0O2lwIGxpbmsgc2V0IGRldiAmIzM0OyBSWF9OQU1FICYjMzQ7IHVwJiMzNDspOwomIzQzOwomIzQzOwlyeF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoUlhfTkFNRSk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHJ4X2lmaW5kZXgsIDAsICYjMzQ7aWZfbmFtZXRvaW5kZXggcngmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwlyeF9ob29rLmlmaW5kZXggPSByeF9pZmluZGV4OwomIzQzOwlyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoJmFtcDtyeF9ob29rKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19ob29rX2NyZWF0ZSByeCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXJ4X29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3JlYWQpOwomIzQzOwlyZXQgPSBicGZfdGNfYXR0YWNoKCZhbXA7cnhfaG9vaywgJmFtcDtyeF9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19hdHRhY2ggcngmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwljbG9zZV9uZXRucyhuc3Rva2VuKTsKJiM0MzsKJiM0MzsJLyogU2V0dXAgVFggc2lkZTogVEMgZWdyZXNzIHdyaXRlciAqLwomIzQzOwluc3Rva2VuID0gb3Blbl9uZXRucyhUWF9ORVROUyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCAmIzM0O3NldG5zIHR4X25zJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJU1lTKGNsb3NlLCAmIzM0O2lwIGxpbmsgc2V0IGRldiAmIzM0OyBUWF9OQU1FICYjMzQ7IHVwJiMzNDspOwomIzQzOwomIzQzOwl0eF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVFhfTkFNRSk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHR4X2lmaW5kZXgsIDAsICYjMzQ7aWZfbmFtZXRvaW5kZXggdHgmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0eF9ob29rLmlmaW5kZXggPSB0eF9pZmluZGV4OwomIzQzOwlyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoJmFtcDt0eF9ob29rKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19ob29rX2NyZWF0ZSB0eCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXR4X29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3dyaXRlKTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3R4X2hvb2ssICZhbXA7dHhfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfYXR0YWNoIHR4JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MgPSBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0ID0gc2VuZF90ZXN0X3BhY2tldCh0eF9pZmluZGV4KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3NlbmRfdGVzdF9wYWNrZXQmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwkvKiBQb2xsIGV2ZXJ5IDEwIG1zZWMgdXAgdG8gMSBzZWMgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDEwMCAmYW1wOyZhbXA7ICFza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzczsgaSYjNDM7JiM0MzspCiYjNDM7CQl1c2xlZXAoMTAwMDApOwomIzQzOwlBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcywgJiMzNDt0ZXN0X3Bhc3MmIzM0Oyk7CiYjNDM7CiYjNDM7Y2xvc2U6CiYjNDM7CWNsb3NlX25ldG5zKG5zdG9rZW4pOwomIzQzOwluZXRuc19mcmVlKHJ4X25zKTsKJiM0MzsJbmV0bnNfZnJlZSh0eF9ucyk7CiYjNDM7fQomIzQzOwomIzQzOy8qIFRlc3QgaWYgc2tiX2V4dCBzdXJ2aXZlcyBHUkUgdHVubmVsIGVuY2FwJiM0MztkZWNhcCAqLwomIzQzO3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF9zY3J1Yl9ncmUoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdHhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19FR1JFU1MpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdHhfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgcnhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHJ4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwlpbnQgdHhfaWZpbmRleDsKJiM0MzsJaW50IHJ4X2lmaW5kZXg7CiYjNDM7CWludCByZXQ7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlucyA9IG5ldG5zX25ldygmIzM0O2dyZV90ZXN0JiMzNDssIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKiBTZXR1cDogZ3JlX3R4IC0mZ3Q7IGxvIC0mZ3Q7IGdyZV9yeCAqLwomIzQzOwlTWVMoY2xvc2UsICYjMzQ7aXAgbGluayBzZXQgbG8gdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIGFkZCBncmVfdHggdHlwZSBncmV0YXAmIzM0OwomIzQzOwkgICAgJiMzNDsgbG9jYWwgMTI3LjAuMC4xIHJlbW90ZSAxMjcuMC4wLjImIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIHNldCBncmVfdHggdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBhZGRyIGFkZCAxMjcuMC4wLjIvOCBkZXYgbG8mIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIGFkZCBncmVfcnggdHlwZSBncmV0YXAmIzM0OwomIzQzOwkgICAgJiMzNDsgbG9jYWwgMTI3LjAuMC4yIHJlbW90ZSAxMjcuMC4wLjEmIzM0Oyk7CiYjNDM7CVNZUyhjbG9zZSwgJiMzNDtpcCBsaW5rIHNldCBncmVfcnggdXAmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIFdyaXRlIHNrYl9leHQgb24gVEMgZWdyZXNzIG9uIEdSRSB0eCAqLwomIzQzOwl0eF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoJiMzNDtncmVfdHgmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHR4X2lmaW5kZXgsIDAsICYjMzQ7dHhfaWZpbmRleCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXR4X2hvb2suaWZpbmRleCA9IHR4X2lmaW5kZXg7CiYjNDM7CXJldCA9IGJwZl90Y19ob29rX2NyZWF0ZSgmYW1wO3R4X2hvb2spOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7dHhfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsb3NlOwomIzQzOwomIzQzOwl0eF9vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0eF9ob29rLCAmYW1wO3R4X29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7dHhfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJLyogUmVhZCBza2JfZXh0IG9uIFRDIGluZ3Jlc3Mgb24gR1JFIHJ4ICovCiYjNDM7CXJ4X2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleCgmIzM0O2dyZV9yeCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QocnhfaWZpbmRleCwgMCwgJiMzNDtyeF9pZmluZGV4JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJcnhfaG9vay5pZmluZGV4ID0gcnhfaWZpbmRleDsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7cnhfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtyeF9ob29rX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CXJ4X29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3JlYWQpOwomIzQzOwlyZXQgPSBicGZfdGNfYXR0YWNoKCZhbXA7cnhfaG9vaywgJmFtcDtyeF9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3J4X2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xvc2U7CiYjNDM7CiYjNDM7CS8qIFRoZW4gdXNlIHNlbmRfdGVzdF9wYWNrZXQgb24gR1JFIHR4ICovCiYjNDM7CXJldCA9IHNlbmRfdGVzdF9wYWNrZXQodHhfaWZpbmRleCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZW5kX3Rlc3RfcGFja2V0JiMzNDspKQomIzQzOwkJZ290byBjbG9zZTsKJiM0MzsKJiM0MzsJLyogUG9sbCBldmVyeSAxMCBtc2VjIHVwIHRvIDEgc2VjICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyAxMDAgJmFtcDsmYW1wOyAhc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3M7IGkmIzQzOyYjNDM7KQomIzQzOwkJdXNsZWVwKDEwMDAwKTsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MsICYjMzQ7dGVzdF9wYXNzJiMzNDspOwomIzQzOwomIzQzO2Nsb3NlOgomIzQzOwluZXRuc19mcmVlKG5zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X3NrYl9leHRfYmFzaWModm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsID0gTlVMTDsKJiM0MzsKJiM0MzsJc2tlbCA9IHRlc3RfeGRwX21ldGFfX29wZW5fYW5kX2xvYWQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7b3BlbiBhbmQgbG9hZCBza2VsZXRvbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0Y193cml0ZV9yZWFkJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3R1bnRhcChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3dyaXRlLAomIzQzOwkJCQkgICAgc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF9yZWFkLAomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfd3JpdGVfY2xvbmVfcmVhZCYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZSwKJiM0MzsJCQkJICAgIHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfY2xvbmVfcmVhZCwKJiM0MzsJCQkJICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3dyaXRlX3NsaWNlX3JlYWQmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfd3JpdGUsCiYjNDM7CQkJCSAgICBza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3NsaWNlX3JlYWQsCiYjNDM7CQkJCSAgICAmYW1wO3NrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0Y19zbGljZV93cml0ZV9yZWFkJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3R1bnRhcChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3NsaWNlX3dyaXRlLAomIzQzOwkJCQkgICAgc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF9yZWFkLAomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfbm9fYWxsb2MmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfbm9fYWxsb2MsCiYjNDM7CQkJCSAgICBOVUxMLCAvKiB0YyBwcmlvIDIgKi8KJiM0MzsJCQkJICAgICZhbXA7c2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX2ludmFsaWRfZmxhZ3MmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfaW52YWxpZF9mbGFncywKJiM0MzsJCQkJICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqLwomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfcmRvbmx5JiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3R1bnRhcChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3Jkb25seSwKJiM0MzsJCQkJICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqLwomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfZG91YmxlX2FsbG9jJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3R1bnRhcChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X2RvdWJsZV9hbGxvYywKJiM0MzsJCQkJICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqLwomIzQzOwkJCQkgICAgJmFtcDtza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7Y2xvbmVfZXh0X3JlYWQmIzM0OykpCiYjNDM7CQl0ZXN0X21pcnJlZF9jbG9uZV9leHQoc2tlbCwgc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF9yZWFkKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjbG9uZV9leHRfY293JiMzNDspKQomIzQzOwkJdGVzdF9taXJyZWRfY2xvbmVfZXh0X2Nvdyhza2VsKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXImIzM0OykpCiYjNDM7CQl0ZXN0X2Nsb25lX3JlZGlyX2V4dF93cml0ZV9hZnRlcihza2VsLAomIzQzOwkJCQkJCSBza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjbG9uZV9yZWRpcl9leHRfc2xpY2Vfd3JpdGVfYWZ0ZXImIzM0OykpCiYjNDM7CQl0ZXN0X2Nsb25lX3JlZGlyX2V4dF93cml0ZV9hZnRlcihza2VsLAomIzQzOwkJCQkJCSBza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3NsaWNlX3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzdXJ2aXZlc192ZXRoJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc2tlbCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c3Vydml2ZXNfZ3JlJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3NjcnViX2dyZShza2VsKTsKJiM0MzsKJiM0MzsJdGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogU2VuZCB0ZXN0X3BheWxvYWQgb3ZlciBsb29wYmFjayBVRFAgdG8gcmVjdl9mZCAqLwomIzQzO3N0YXRpYyBpbnQgc2VuZF9sb29wYmFja191ZHAoaW50IHJlY3ZfZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHsKJiM0MzsJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKJiM0MzsJCS5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spLAomIzQzOwl9OwomIzQzOwljaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlpbnQgZmQgPSAtMTsKJiM0MzsJaW50IHBvcnQ7CiYjNDM7CiYjNDM7CXBvcnQgPSBnZXRfc29ja2V0X2xvY2FsX3BvcnQocmVjdl9mZCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHBvcnQsIDAsICYjMzQ7Z2V0X3BvcnQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O3NvY2tldCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlhZGRyLnNpbl9wb3J0ID0gcG9ydDsKJiM0MzsJc2VuZHRvKGZkLCB0ZXN0X3BheWxvYWQsIFRFU1RfUEFZTE9BRF9MRU4sIDAsCiYjNDM7CSAgICAgICAodm9pZCAqKSZhbXA7YWRkciwgc2l6ZW9mKGFkZHIpKTsKJiM0MzsJcmVjdmZyb20ocmVjdl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7CiYjNDM7CXJldCA9IDA7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7ZW51bSB1ZHBfcmVhZGVyX3R5cGUgewomIzQzOwlSRUFERVJfQ0dSUF9TS0IsCiYjNDM7CVJFQURFUl9TS19GSUxURVIsCiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgYWNyb3NzIFRDIGluZ3Jlc3MgLSZndDsgVURQIHJlYWRlciBob29rICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3VkcChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCwgY29uc3QgY2hhciAqbmFtZSwKJiM0MzsJCQkgICAgIGVudW0gdWRwX3JlYWRlcl90eXBlIHJlYWRlcikKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLAomIzQzOwkJICAgIC5pZmluZGV4ID0gMSAvKiBJRklOREVYX0xPICovLAomIzQzOwkJICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqcmVhZGVyX2xpbmsgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7CiYjNDM7CWludCBzZXJ2ZXJfZmQgPSAtMTsKJiM0MzsJaW50IGNncm91cF9mZCA9IC0xOwomIzQzOwlpbnQgZmlsdGVyX2ZkOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlucyA9IG5ldG5zX25ldyhuYW1lLCB0cnVlKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG5zLCAmIzM0O25ldG5zX25ldyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJY2dyb3VwX2ZkID0gdGVzdF9fam9pbl9jZ3JvdXAoJiMzNDsvc2tiX2V4dF91ZHAmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGNncm91cF9mZCwgMCwgJiMzNDtqb2luX2Nncm91cCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQsIFNPQ0tfREdSQU0sICYjMzQ7MTI3LjAuMC4xJiMzNDssIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsICYjMzQ7c3RhcnRfc2VydmVyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoJmFtcDt0Y19ob29rKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19ob29rX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJdGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfd3JpdGUpOwomIzQzOwlyZXQgPSBicGZfdGNfYXR0YWNoKCZhbXA7dGNfaG9vaywgJmFtcDt0Y19vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19hdHRhY2gmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXN3aXRjaCAocmVhZGVyKSB7CiYjNDM7CWNhc2UgUkVBREVSX0NHUlBfU0tCOgomIzQzOwkJcmVhZGVyX2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2Nncm91cChza2VsLSZndDtwcm9ncy5jZ3JwX3NrYl9leHRfcmVhZCwKJiM0MzsJCQkJCQkJIGNncm91cF9mZCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssICYjMzQ7YXR0YWNoX2Nncm91cCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBSRUFERVJfU0tfRklMVEVSOgomIzQzOwkJZmlsdGVyX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnNrX2ZpbHRlcl9za2JfZXh0X3JlYWQpOwomIzQzOwkJcmV0ID0gc2V0c29ja29wdChzZXJ2ZXJfZmQsIFNPTF9TT0NLRVQsIFNPX0FUVEFDSF9CUEYsCiYjNDM7CQkJCSAmYW1wO2ZpbHRlcl9mZCwgc2l6ZW9mKGZpbHRlcl9mZCkpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2F0dGFjaF9zb2NrZXRfZmlsdGVyJiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChzZW5kX2xvb3BiYWNrX3VkcChzZXJ2ZXJfZmQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcywgJiMzNDt0ZXN0X3Bhc3MmIzM0Oyk7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kocmVhZGVyX2xpbmspOwomIzQzOwlicGZfdGNfaG9va19kZXN0cm95KCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmIChzZXJ2ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHNlcnZlcl9mZCk7CiYjNDM7CWlmIChjZ3JvdXBfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGNncm91cF9mZCk7CiYjNDM7CW5ldG5zX2ZyZWUobnMpOwomIzQzO30KJiM0MzsKJiM0MztlbnVtIHRjcF9yZWFkZXJfdHlwZSB7CiYjNDM7CVJFQURFUl9TS09QUywKJiM0MzsJUkVBREVSX0xTTSwKJiM0Mzt9OwomIzQzOwomIzQzOy8qIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgaW5ncmVzcyAtJmd0OyBUQ1AgcmVhZGVyIGhvb2sgKi8KJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfdGNwKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lLAomIzQzOwkJCSAgICAgZW51bSB0Y3BfcmVhZGVyX3R5cGUgcmVhZGVyKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssCiYjNDM7CQkgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sCiYjNDM7CQkgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJc3RydWN0IGJwZl9saW5rICpyZWFkZXJfbGluayA9IE5VTEw7CiYjNDM7CXN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDsKJiM0MzsJaW50IHNlcnZlcl9mZCA9IC0xOwomIzQzOwlpbnQgY2dyb3VwX2ZkID0gLTE7CiYjNDM7CWludCBjbGllbnRfZmQgPSAtMTsKJiM0MzsJaW50IGNvbm5fZmQgPSAtMTsKJiM0MzsJaW50IHBvcnQ7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CW5zID0gbmV0bnNfbmV3KG5hbWUsIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwljZ3JvdXBfZmQgPSB0ZXN0X19qb2luX2Nncm91cCgmIzM0Oy9za2JfZXh0X3RjcCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoY2dyb3VwX2ZkLCAwLCAmIzM0O2pvaW5fY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzZXJ2ZXJfZmQgPSBzdGFydF9zZXJ2ZXIoQUZfSU5FVCwgU09DS19TVFJFQU0sICYjMzQ7MTI3LjAuMC4xJiMzNDssIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsICYjMzQ7c3RhcnRfc2VydmVyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlwb3J0ID0gZ2V0X3NvY2tldF9sb2NhbF9wb3J0KHNlcnZlcl9mZCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHBvcnQsIDAsICYjMzQ7Z2V0X3BvcnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGFyZ2V0X3BvcnQgPSBwb3J0OwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoJmFtcDt0Y19ob29rKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2JwZl90Y19ob29rX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJdGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfd3JpdGVfcG9ydCk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0Y19ob29rLCAmYW1wO3RjX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7YnBmX3RjX2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc3dpdGNoIChyZWFkZXIpIHsKJiM0MzsJY2FzZSBSRUFERVJfU0tPUFM6CiYjNDM7CQlyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfY2dyb3VwKHNrZWwtJmd0O3Byb2dzLnNrb3BzX3NrYl9leHRfcmVhZCwKJiM0MzsJCQkJCQkJIGNncm91cF9mZCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssICYjMzQ7YXR0YWNoX3Nrb3BzJiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJFQURFUl9MU006CiYjNDM7CQlyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfbHNtKHNrZWwtJmd0O3Byb2dzLmxzbV9za2JfZXh0X3JlYWQpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfUFRSKHJlYWRlcl9saW5rLCAmIzM0O2F0dGFjaF9sc20mIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY2xpZW50X2ZkID0gY29ubmVjdF90b19mZChzZXJ2ZXJfZmQsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShjbGllbnRfZmQsIDAsICYjMzQ7Y29ubmVjdCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJY29ubl9mZCA9IGFjY2VwdChzZXJ2ZXJfZmQsIE5VTEwsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShjb25uX2ZkLCAwLCAmIzM0O2FjY2VwdCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MsICYjMzQ7dGVzdF9wYXNzJiMzNDspOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWlmIChjb25uX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShjb25uX2ZkKTsKJiM0MzsJaWYgKGNsaWVudF9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoY2xpZW50X2ZkKTsKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kocmVhZGVyX2xpbmspOwomIzQzOwlicGZfdGNfaG9va19kZXN0cm95KCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmIChzZXJ2ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHNlcnZlcl9mZCk7CiYjNDM7CWlmIChjZ3JvdXBfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGNncm91cF9mZCk7CiYjNDM7CW5ldG5zX2ZyZWUobnMpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCB1bnRpbCBza2IgZnJlZTogY2dyb3VwL3NrYiBlZ3Jlc3MgLSZndDsga2ZyZWVfc2tiLgomIzQzOyAqIFNlbmQgVURQIHRvIGEgY2xvc2VkIHBvcnQuIFRoZSBwYWNrZXQgaXMgZHJvcHBlZCwgdHJpZ2dlcmluZyBrZnJlZV9za2IuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9jZ3JwX2VncmVzc190b19rZnJlZV9za2Ioc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHsKJiM0MzsJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKJiM0MzsJCS5zaW5fcG9ydCA9IGh0b25zKDQzMjEpLAomIzQzOwkJLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyksCiYjNDM7CX07CiYjNDM7CXN0cnVjdCBicGZfbGluayAqY2dfbGluayA9IE5VTEw7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqdHBfbGluayA9IE5VTEw7CiYjNDM7CXN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDsKJiM0MzsJaW50IGNncm91cF9mZCA9IC0xOwomIzQzOwljaGFyIGJ1ZlsxXTsKJiM0MzsJaW50IGZkID0gLTE7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWNncm91cF9mZCA9IHRlc3RfX2pvaW5fY2dyb3VwKCYjMzQ7L2NncnBfdG9fa2ZyZWUmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGNncm91cF9mZCwgMCwgJiMzNDtqb2luX2Nncm91cCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJbnMgPSBuZXRuc19uZXcoJiMzNDtjZ3JwX3RvX2tmcmVlJiMzNDssIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwljZ19saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9jZ3JvdXAoc2tlbC0mZ3Q7cHJvZ3MuY2dycF9za2JfZXh0X3dyaXRlLAomIzQzOwkJCQkJICAgICBjZ3JvdXBfZmQpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoY2dfbGluaywgJiMzNDthdHRhY2hfY2dyb3VwJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwl0cF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLSZndDtwcm9ncy50cF9rZnJlZV9za2JfZXh0X3JlYWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIodHBfbGluaywgJiMzNDthdHRhY2hfdHAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtzb2NrZXQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNvbm5lY3QoZmQsICh2b2lkICopJmFtcDthZGRyLCBzaXplb2YoYWRkcikpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7Y29ubmVjdCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gc2VuZChmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEocmV0LCBURVNUX1BBWUxPQURfTEVOLCAmIzM0O3NlbmQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CS8qIFdhaXQgZm9yIElDTVAgZXJyb3IgLS0gY29uZmlybXMgdGhlIHBhY2tldCB3YXMgZnJlZWQgKi8KJiM0MzsJcmV0ID0gcmVjdihmZCwgYnVmLCBzaXplb2YoYnVmKSwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJldCwgLTEsICYjMzQ7cmVjdiYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJQVNTRVJUX0VRKGVycm5vLCBFQ09OTlJFRlVTRUQsICYjMzQ7cmVjdl9lY29ubnJlZnVzZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzLCAmIzM0O3Rlc3RfcGFzcyYjMzQ7KTsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kodHBfbGluayk7CiYjNDM7CWJwZl9saW5rX19kZXN0cm95KGNnX2xpbmspOwomIzQzOwluZXRuc19mcmVlKG5zKTsKJiM0MzsJaWYgKGNncm91cF9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoY2dyb3VwX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBpbmdyZXNzIC0mZ3Q7IG5ldGZpbHRlciBob29rICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X25mKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssCiYjNDM7CQkgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sCiYjNDM7CQkgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX25ldGZpbHRlcl9vcHRzLCBuZl9vcHRzLAomIzQzOwkJICAgIC5wZiA9IE5GUFJPVE9fSVBWNCwKJiM0MzsJCSAgICAuaG9va251bSA9IE5GX0lORVRfTE9DQUxfSU4sCiYjNDM7CQkgICAgLnByaW9yaXR5ID0gMSk7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqcmVhZGVyX2xpbmsgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7CiYjNDM7CWludCBzZXJ2ZXJfZmQgPSAtMTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJbnMgPSBuZXRuc19uZXcobmFtZSwgdHJ1ZSk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihucywgJiMzNDtuZXRuc19uZXcmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVULCBTT0NLX0RHUkFNLCAmIzM0OzEyNy4wLjAuMSYjMzQ7LCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0Uoc2VydmVyX2ZkLCAwLCAmIzM0O3N0YXJ0X3NlcnZlciYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MgPSBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy50Y19za2JfZXh0X3dyaXRlKTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3RjX2hvb2ssICZhbXA7dGNfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfbmV0ZmlsdGVyKHNrZWwtJmd0O3Byb2dzLm5mX3NrYl9leHRfcmVhZCwKJiM0MzsJCQkJCQkgICAgJmFtcDtuZl9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHJlYWRlcl9saW5rLCAmIzM0O2F0dGFjaF9uZiYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKHNlbmRfbG9vcGJhY2tfdWRwKHNlcnZlcl9mZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzLCAmIzM0O3Rlc3RfcGFzcyYjMzQ7KTsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwlicGZfbGlua19fZGVzdHJveShyZWFkZXJfbGluayk7CiYjNDM7CWJwZl90Y19ob29rX2Rlc3Ryb3koJmFtcDt0Y19ob29rKTsKJiM0MzsJaWYgKHNlcnZlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uoc2VydmVyX2ZkKTsKJiM0MzsJbmV0bnNfZnJlZShucyk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgTFdUX0VYVF9QSU5fUEFUSCAmIzM0Oy9zeXMvZnMvYnBmL3NrYl9leHRfbHd0JiMzNDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3Qgc2tiX2V4dCBhY3Jvc3MgTFdUIGhvb2tzIG9uIGxvb3BiYWNrLgomIzQzOyAqCiYjNDM7ICogQGx3dF9wcm9nOiAgQlBGIHByb2dyYW0gdG8gcGluIGFuZCBhdHRhY2ggdmlhIGlwIHJvdXRlIGVuY2FwCiYjNDM7ICogQGVuY2FwX2RpcjogJiMzNDtpbiYjMzQ7LCAmIzM0O291dCYjMzQ7LCBvciAmIzM0O3htaXQmIzM0OwomIzQzOyAqIEB3cml0ZXI6ICAgIHRydWUgaWYgbHd0X3Byb2cgd3JpdGVzIHNrYl9leHQgKHJlYWRlciBvbiBUQyBpbmdyZXNzKSwKJiM0MzsgKiAgICAgICAgICAgICBmYWxzZSBpZiBsd3RfcHJvZyByZWFkcyBza2JfZXh0ICh3cml0ZXIgb24gVEMgaW5ncmVzcykKJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfbHd0KHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lLAomIzQzOwkJCSAgICAgc3RydWN0IGJwZl9wcm9ncmFtICpsd3RfcHJvZywKJiM0MzsJCQkgICAgIGNvbnN0IGNoYXIgKmVuY2FwX2RpciwgYm9vbCB3cml0ZXIpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywKJiM0MzsJCSAgICAuaWZpbmRleCA9IDEgLyogSUZJTkRFWF9MTyAqLywKJiM0MzsJCSAgICAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpOwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpOwomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHsKJiM0MzsJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKJiM0MzsJfTsKJiM0MzsJc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcm9nOwomIzQzOwljaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwlib29sIHBpbm5lZCA9IGZhbHNlOwomIzQzOwlpbnQgc2VydmVyX2ZkID0gLTE7CiYjNDM7CWludCBmZCA9IC0xOwomIzQzOwlpbnQgcG9ydDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJdW5saW5rKExXVF9FWFRfUElOX1BBVEgpOwomIzQzOwlyZXQgPSBicGZfcHJvZ3JhbV9fcGluKGx3dF9wcm9nLCBMV1RfRVhUX1BJTl9QQVRIKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3BpbiBsd3QmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXBpbm5lZCA9IHRydWU7CiYjNDM7CiYjNDM7CW5zID0gbmV0bnNfbmV3KG5hbWUsIHRydWUpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnMsICYjMzQ7bmV0bnNfbmV3JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwX3ByZWhvb2s7CiYjNDM7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIGFkZHIgYWRkIDEwLjAuMC4xLzMyIGRldiBsbyYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgcm91dGUgcmVwbGFjZSB0YWJsZSBsb2NhbCBsb2NhbCAxMC4wLjAuMSAmIzM0OwomIzQzOwkJICAgICAmIzM0O2VuY2FwIGJwZiAlcyBwaW5uZWQgJiMzNDsgTFdUX0VYVF9QSU5fUEFUSCAmIzM0OyBkZXYgbG8mIzM0OywKJiM0MzsJCSAgICAgZW5jYXBfZGlyKTsKJiM0MzsKJiM0MzsJc2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQsIFNPQ0tfREdSQU0sICYjMzQ7MTAuMC4wLjEmIzM0OywgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHNlcnZlcl9mZCwgMCwgJiMzNDtzdGFydF9zZXJ2ZXImIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfcHJlaG9vazsKJiM0MzsKJiM0MzsJc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MgPSBmYWxzZTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKCZhbXA7dGNfaG9vayk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfaG9va19jcmVhdGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXBfcHJlaG9vazsKJiM0MzsKJiM0MzsJLyogV2hlbiBMV1Qgd3JpdGVzLCBUQyBpbmdyZXNzIHJlYWRzOyB3aGVuIExXVCByZWFkcywgVEMgaW5ncmVzcyB3cml0ZXMgKi8KJiM0MzsJdGNfcHJvZyA9IHdyaXRlciA/IHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfcmVhZAomIzQzOwkJCSA6IHNrZWwtJmd0O3Byb2dzLnRjX3NrYl9leHRfd3JpdGU7CiYjNDM7CXRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZCh0Y19wcm9nKTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3RjX2hvb2ssICZhbXA7dGNfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlwb3J0ID0gZ2V0X3NvY2tldF9sb2NhbF9wb3J0KHNlcnZlcl9mZCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHBvcnQsIDAsICYjMzQ7Z2V0X3BvcnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtzb2NrZXQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWluZXRfcHRvbihBRl9JTkVULCAmIzM0OzEwLjAuMC4xJiMzNDssICZhbXA7YWRkci5zaW5fYWRkcik7CiYjNDM7CWFkZHIuc2luX3BvcnQgPSBwb3J0OwomIzQzOwlyZXQgPSBzZW5kdG8oZmQsIHRlc3RfcGF5bG9hZCwgVEVTVF9QQVlMT0FEX0xFTiwgMCwKJiM0MzsJCSAgICAgKHZvaWQgKikmYW1wO2FkZHIsIHNpemVvZihhZGRyKSk7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJldCwgVEVTVF9QQVlMT0FEX0xFTiwgJiMzNDtzZW5kdG8mIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CXJldCA9IHJlY3Zmcm9tKHNlcnZlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7CiYjNDM7CUFTU0VSVF9FUShyZXQsIFRFU1RfUEFZTE9BRF9MRU4sICYjMzQ7cmVjdmZyb20mIzM0Oyk7CiYjNDM7CiYjNDM7CUFTU0VSVF9UUlVFKHNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzLCAmIzM0O3Rlc3RfcGFzcyYjMzQ7KTsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJYnBmX3RjX2hvb2tfZGVzdHJveSgmYW1wO3RjX2hvb2spOwomIzQzO2NsZWFudXBfcHJlaG9vazoKJiM0MzsJaWYgKHNlcnZlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uoc2VydmVyX2ZkKTsKJiM0MzsJbmV0bnNfZnJlZShucyk7CiYjNDM7CWlmIChwaW5uZWQpCiYjNDM7CQl1bmxpbmsoTFdUX0VYVF9QSU5fUEFUSCk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgU0VHNl9QSU5fUEFUSCAmIzM0Oy9zeXMvZnMvYnBmL3NrYl9leHRfc2VnNmxvY2FsJiMzNDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgZWdyZXNzIC0mZ3Q7IHNlZzZsb2NhbCBFbmQuQlBGIGhvb2suCiYjNDM7ICoKJiM0MzsgKiBUb3BvbG9neToKJiM0MzsgKgomIzQzOyAqICAgICBOUzEgICAgICAgICAgIE5TMiAgICAgICAgICAgIE5TMwomIzQzOyAqICAgbG8gdmV0aDEgJmx0Oy0mZ3Q7IHZldGgyIHZldGgzICZsdDstJmd0OyB2ZXRoNCBsbwomIzQzOyAqCiYjNDM7ICogTlMxIGVuY2FwcyBmYjAxOjoyIHdpdGggU1JIIChzZWdtZW50cyBmZDAxOjoxLGZkMDE6OjIpIG9uIG91dHB1dCBhbmQKJiM0MzsgKiB3cml0ZXMgc2tiX2V4dCBhdCBUQyBlZ3Jlc3Mgb24gdmV0aDEuIE5TMiBydW5zIEVuZC5CUEYgZm9yIGZkMDE6OjEsCiYjNDM7ICogd2hpY2ggcmVhZHMgc2tiX2V4dCwgdGhlbiBmb3J3YXJkcyB0byBOUzMgKHNlZzZfbG9va3VwX25leHRob3AKJiM0MzsgKiByZWplY3RzIGxvb3BiYWNrIHJvdXRlcyB3aXRoIGxvY2FsX2RlbGl2ZXJ5PWZhbHNlLCBzbyBFbmQuQlBGCiYjNDM7ICogY2Fubm90IGRlbGl2ZXIgbG9jYWxseSkuIE5TMyBoYXMgZmQwMTo6MiBsb2NhbCwgZGVjYXBzdWxhdGVzLCBhbmQKJiM0MzsgKiBkZWxpdmVycyB0aGUgaW5uZXIgVURQIChkc3Q9ZmIwMTo6MikgdG8gYSBsb2NhbCBzb2NrZXQgZm9yIHRlc3QKJiM0MzsgKiBzeW5jaHJvbml6YXRpb24uCiYjNDM7ICoKJiM0MzsgKiBUaGUgVEMgcHJvZ3JhbSBkcm9wcyBub24tdGVzdCBwYWNrZXRzLCBzbyBORFAgaXMgYnlwYXNzZWQgd2l0aCBhCiYjNDM7ICogc3RhdGljIG5laWdoYm9yIGVudHJ5IG9uIHRoZSBOUzEtJmd0O05TMiBob3AuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NlZzZsb2NhbChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0VHUkVTUyk7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7CiYjNDM7CXN0cnVjdCBuc3Rva2VuICpuc3Rva2VuID0gTlVMTDsKJiM0MzsJc3RydWN0IHNvY2thZGRyX2luNiBkc3QgPSB7fTsKJiM0MzsJY2hhciBidWZbVEVTVF9QQVlMT0FEX0xFTl07CiYjNDM7CWJvb2wgcGlubmVkID0gZmFsc2U7CiYjNDM7CWludCBjbGllbnRfZmQgPSAtMTsKJiM0MzsJaW50IHNlcnZlcl9mZCA9IC0xOwomIzQzOwlzc2l6ZV90IGJ5dGVzOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwl1bmxpbmsoU0VHNl9QSU5fUEFUSCk7CiYjNDM7CXJldCA9IGJwZl9wcm9ncmFtX19waW4oc2tlbC0mZ3Q7cHJvZ3Muc2VnNmxvY2FsX3NrYl9leHRfcmVhZCwKJiM0MzsJCQkgICAgICAgU0VHNl9QSU5fUEFUSCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtwaW4gc2VnNmxvY2FsJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlwaW5uZWQgPSB0cnVlOwomIzQzOwomIzQzOwlza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcyA9IGZhbHNlOwomIzQzOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBuZXRucyBhZGQgc2VnNl8xJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBuZXRucyBhZGQgc2VnNl8yJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBuZXRucyBhZGQgc2VnNl8zJiMzNDspOwomIzQzOwomIzQzOwkvKiBOUzEgJmx0Oy0mZ3Q7IE5TMiB2ZXRoIHBhaXI7IHN0YXRpYyBORFAgc2luY2UgVEMgZHJvcHMgTlMvTkEgKi8KJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8xIGxpbmsgYWRkIHZldGgxIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDIgbmV0bnMgc2VnNl8yJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzEgbGluayBzZXQgZGV2IHZldGgxIHVwJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzIgbGluayBzZXQgZGV2IHZldGgyIGFkZHJlc3MgMDI6MDA6MDA6MDA6MDA6MDImIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC1uIHNlZzZfMiBsaW5rIHNldCBkZXYgdmV0aDIgdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC1uIHNlZzZfMSAtNiBhZGRyIGFkZCBmYjAwOjoxMi8xNiBkZXYgdmV0aDEgc2NvcGUgbGluayBub2RhZCYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8yIC02IGFkZHIgYWRkIGZiMDA6OjIxLzE2IGRldiB2ZXRoMiBzY29wZSBsaW5rIG5vZGFkJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzEgLTYgbmVpZ2ggYWRkIGZiMDA6OjIxIGxsYWRkciAwMjowMDowMDowMDowMDowMiAmIzM0OwomIzQzOwkJICAgICAmIzM0O251ZCBwZXJtYW5lbnQgZGV2IHZldGgxJiMzNDspOwomIzQzOwomIzQzOwkvKiBOUzIgJmx0Oy0mZ3Q7IE5TMyB2ZXRoIHBhaXIgKi8KJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8yIGxpbmsgYWRkIHZldGgzIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDQgbmV0bnMgc2VnNl8zJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzIgbGluayBzZXQgZGV2IHZldGgzIHVwJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzMgbGluayBzZXQgZGV2IHZldGg0IHVwJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtbiBzZWc2XzIgLTYgYWRkciBhZGQgZmIwMDo6MzQvMTYgZGV2IHZldGgzIHNjb3BlIGxpbmsgbm9kYWQmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC1uIHNlZzZfMyAtNiBhZGRyIGFkZCBmYjAwOjo0My8xNiBkZXYgdmV0aDQgc2NvcGUgbGluayBub2RhZCYjMzQ7KTsKJiM0MzsKJiM0MzsJLyogTlMxOiBzb3VyY2UgYWRkcmVzcyAmIzQzOyBTUkggZW5jYXAgb24gb3V0cHV0ICYjNDM7IHJvdXRlIGZvciBmZDAxOjovMTYgKi8KJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8xIGxpbmsgc2V0IGRldiBsbyB1cCYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8xIC02IGFkZHIgYWRkIGZiMDE6OjEvMTI4IGRldiBsbyBub2RhZCYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLW4gc2VnNl8xIC02IHJvdXRlIGFkZCBmYjAxOjoyIGVuY2FwIHNlZzYgbW9kZSBlbmNhcCAmIzM0OwomIzQzOwkJICAgICAmIzM0O3NlZ3MgZmQwMTo6MSxmZDAxOjoyIGRldiB2ZXRoMSB2aWEgZmIwMDo6MjEmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC1uIHNlZzZfMSAtNiByb3V0ZSBhZGQgZmQwMTo6LzE2IGRldiB2ZXRoMSB2aWEgZmIwMDo6MjEmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIE5TMjogc2VnNmxvY2FsIEVuZC5CUEYgZm9yIGZkMDE6OjEsIHRoZW4gZm9yd2FyZCB0byBOUzMuCiYjNDM7CSAqIFVzZSBvcGVuX25ldG5zIHNvIHRoZSBwaW5uZWQgcHJvZyBvbiBicGZmcyBpcyBhY2Nlc3NpYmxlLgomIzQzOwkgKi8KJiM0MzsJbnN0b2tlbiA9IG9wZW5fbmV0bnMoJiMzNDtzZWc2XzImIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCAmIzM0O29wZW4gc2VnNl8yJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBsaW5rIHNldCBkZXYgbG8gdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O3N5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5hbGwuZm9yd2FyZGluZz0xJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtNiByb3V0ZSBhZGQgZmQwMTo6Mi8xMjggZGV2IHZldGgzIHZpYSBmYjAwOjo0MyYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7aXAgLTYgcm91dGUgYWRkIGZkMDE6OjEgZW5jYXAgc2VnNmxvY2FsICYjMzQ7CiYjNDM7CQkgICAgICYjMzQ7YWN0aW9uIEVuZC5CUEYgZW5kcG9pbnQgcGlubmVkICYjMzQ7IFNFRzZfUElOX1BBVEggJiMzNDsgZGV2IHZldGgyJiMzNDspOwomIzQzOwomIzQzOwljbG9zZV9uZXRucyhuc3Rva2VuKTsKJiM0MzsJbnN0b2tlbiA9IE5VTEw7CiYjNDM7CiYjNDM7CS8qIE5TMzogZGVjYXAgcG9pbnQgJiM0MzsgVURQIHNlcnZlci4KJiM0MzsJICogZmQwMTo6MiBsb2NhbCB0cmlnZ2VycyBTUkggZGVjYXAgKHNlZ21lbnRzX2xlZnQ9MCkuCiYjNDM7CSAqIGZiMDE6OjIgbG9jYWwgZGVsaXZlcnMgdGhlIGlubmVyIFVEUCB0byB0aGUgc29ja2V0LgomIzQzOwkgKi8KJiM0MzsJbnN0b2tlbiA9IG9wZW5fbmV0bnMoJiMzNDtzZWc2XzMmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCAmIzM0O29wZW4gc2VnNl8zJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCBsaW5rIHNldCBkZXYgbG8gdXAmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O3N5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5hbGwuc2VnNl9lbmFibGVkPTEmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O3N5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5sby5zZWc2X2VuYWJsZWQ9MSYjMzQ7KTsKJiM0MzsJU1lTKGNsZWFudXAsICYjMzQ7c3lzY3RsIC13cSBuZXQuaXB2Ni5jb25mLnZldGg0LnNlZzZfZW5hYmxlZD0xJiMzNDspOwomIzQzOwlTWVMoY2xlYW51cCwgJiMzNDtpcCAtNiBhZGRyIGFkZCBmZDAxOjoyLzEyOCBkZXYgbG8gbm9kYWQmIzM0Oyk7CiYjNDM7CVNZUyhjbGVhbnVwLCAmIzM0O2lwIC02IGFkZHIgYWRkIGZiMDE6OjIvMTI4IGRldiBsbyBub2RhZCYjMzQ7KTsKJiM0MzsKJiM0MzsJc2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAmIzM0O2ZiMDE6OjImIzM0OywgMTIzNCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKHNlcnZlcl9mZCwgMCwgJiMzNDtzdGFydF9zZXJ2ZXImIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWNsb3NlX25ldG5zKG5zdG9rZW4pOwomIzQzOwluc3Rva2VuID0gTlVMTDsKJiM0MzsKJiM0MzsJLyogTlMxOiB3cml0ZSBza2JfZXh0IGF0IFRDIGVncmVzcyBvbiB2ZXRoMSwgdGhlbiBzZW5kLgomIzQzOwkgKiBUQyBlZ3Jlc3MgZmlyZXMgYWZ0ZXIgc2VnNiBlbmNhcCwgb24gdGhlIGVuY2FwcGVkIHBhY2tldC4KJiM0MzsJICovCiYjNDM7CW5zdG9rZW4gPSBvcGVuX25ldG5zKCYjMzQ7c2VnNl8xJiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIobnN0b2tlbiwgJiMzNDtvcGVuIHNlZzZfMSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJdGNfaG9vay5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoJiMzNDt2ZXRoMSYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QodGNfaG9vay5pZmluZGV4LCAwLCAmIzM0O2lmaW5kZXggdmV0aDEmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90Y19ob29rX2NyZWF0ZSgmYW1wO3RjX2hvb2spOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7YnBmX3RjX2hvb2tfY3JlYXRlJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7CiYjNDM7CXJldCA9IGJwZl90Y19hdHRhY2goJmFtcDt0Y19ob29rLCAmYW1wO3RjX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7YnBmX3RjX2F0dGFjaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJY2xpZW50X2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoY2xpZW50X2ZkLCAwLCAmIzM0O3NvY2tldCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJZHN0LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiYjNDM7CWRzdC5zaW42X3BvcnQgPSBodG9ucygxMjM0KTsKJiM0MzsJaW5ldF9wdG9uKEFGX0lORVQ2LCAmIzM0O2ZiMDE6OjImIzM0OywgJmFtcDtkc3Quc2luNl9hZGRyKTsKJiM0MzsKJiM0MzsJYnl0ZXMgPSBzZW5kdG8oY2xpZW50X2ZkLCB0ZXN0X3BheWxvYWQsIFRFU1RfUEFZTE9BRF9MRU4sIDAsCiYjNDM7CQkgICAgICAgKHZvaWQgKikmYW1wO2RzdCwgc2l6ZW9mKGRzdCkpOwomIzQzOwomIzQzOwljbG9zZV9uZXRucyhuc3Rva2VuKTsKJiM0MzsJbnN0b2tlbiA9IE5VTEw7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX0VRKGJ5dGVzLCBURVNUX1BBWUxPQURfTEVOLCAmIzM0O3NlbmR0byYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJLyogUmVjZWl2ZSBkZWNhcHN1bGF0ZWQgcGFja2V0IC0tIHN5bmNocm9uaXplcyB3aXRoIHNlZzZsb2NhbCAqLwomIzQzOwluc3Rva2VuID0gb3Blbl9uZXRucygmIzM0O3NlZzZfMyYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sICYjMzQ7b3BlbiBzZWc2XzMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWJ5dGVzID0gcmVjdmZyb20oc2VydmVyX2ZkLCBidWYsIHNpemVvZihidWYpLCAwLCBOVUxMLCBOVUxMKTsKJiM0MzsJQVNTRVJUX0VRKGJ5dGVzLCBURVNUX1BBWUxPQURfTEVOLCAmIzM0O3JlY3Zmcm9tJiMzNDspOwomIzQzOwlBU1NFUlRfVFJVRShza2VsLSZndDtic3MtJmd0O3Rlc3RfcGFzcywgJiMzNDt0ZXN0X3Bhc3MmIzM0Oyk7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xvc2VfbmV0bnMobnN0b2tlbik7CiYjNDM7CWlmIChzZXJ2ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHNlcnZlcl9mZCk7CiYjNDM7CWlmIChjbGllbnRfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGNsaWVudF9mZCk7CiYjNDM7CVNZU19OT0ZBSUwoJiMzNDtpcCBuZXRucyBkZWwgc2VnNl8zJiMzNDspOwomIzQzOwlTWVNfTk9GQUlMKCYjMzQ7aXAgbmV0bnMgZGVsIHNlZzZfMiYjMzQ7KTsKJiM0MzsJU1lTX05PRkFJTCgmIzM0O2lwIG5ldG5zIGRlbCBzZWc2XzEmIzM0Oyk7CiYjNDM7CWlmIChwaW5uZWQpCiYjNDM7CQl1bmxpbmsoU0VHNl9QSU5fUEFUSCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBpbmdyZXNzIC0mZ3Q7IHNrX3NrYiB2ZXJkaWN0IGhvb2suICBUQyBpbmdyZXNzCiYjNDM7ICogd3JpdGVzIHNrYl9leHQgb24gbG9vcGJhY2s7IHRoZSB2ZXJkaWN0IHByb2dyYW0gcmVhZHMgaXQgb24gc2tiIGRlbGl2ZXJ5IHRvIGEKJiM0MzsgKiBzb2NrZXQgaW4gdGhlIHNvY2ttYXAuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NrX3NrYihzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLAomIzQzOwkJICAgIC5pZmluZGV4ID0gMSAvKiBJRklOREVYX0xPICovLAomIzQzOwkJICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7CiYjNDM7CXN0cnVjdCBicGZfbGluayAqdmVyZGljdF9saW5rID0gTlVMTDsKJiM0MzsJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CiYjNDM7CXNvY2tsZW5fdCBhZGRyX2xlbiA9IHNpemVvZihhZGRyKTsKJiM0MzsJc3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMOwomIzQzOwljaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTsKJiM0MzsJaW50IGMxID0gLTEsIHAxID0gLTE7CiYjNDM7CWludCBtYXAgPSAtMSwgemVybyA9IDA7CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJbnMgPSBuZXRuc19uZXcoJiMzNDt0Y190b19za19za2ImIzM0OywgdHJ1ZSk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihucywgJiMzNDtuZXRuc19uZXcmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGVzdF9wYXNzID0gZmFsc2U7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90Y19ob29rX2NyZWF0ZSgmYW1wO3RjX2hvb2spOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7YnBmX3RjX2hvb2tfY3JlYXRlJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwl0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MudGNfc2tiX2V4dF93cml0ZV9wb3J0KTsKJiM0MzsJcmV0ID0gYnBmX3RjX2F0dGFjaCgmYW1wO3RjX2hvb2ssICZhbXA7dGNfb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDticGZfdGNfYXR0YWNoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwltYXAgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfU09DS01BUCwgTlVMTCwgc2l6ZW9mKGludCksCiYjNDM7CQkJICAgICBzaXplb2YoaW50KSwgMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKG1hcCwgMCwgJiMzNDticGZfbWFwX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJdmVyZGljdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9zb2NrbWFwKHNrZWwtJmd0O3Byb2dzLnNrX3NrYl9za2JfZXh0X3JlYWQsCiYjNDM7CQkJCQkJICAgbWFwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHZlcmRpY3RfbGluaywgJiMzNDthdHRhY2hfc29ja21hcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0soY3JlYXRlX3BhaXIoQUZfSU5FVCwgU09DS19TVFJFQU0sICZhbXA7YzEsICZhbXA7cDEpLCAmIzM0O2NyZWF0ZV9wYWlyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcCwgJmFtcDt6ZXJvLCAmYW1wO2MxLCBCUEZfTk9FWElTVCksICYjMzQ7bWFwX3VwZGF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0c29ja25hbWUoYzEsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYW1wO2FkZHIsICZhbXA7YWRkcl9sZW4pLAomIzQzOwkJICAgICAgICYjMzQ7Z2V0c29ja25hbWUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CXNrZWwtJmd0O2Jzcy0mZ3Q7dGFyZ2V0X3BvcnQgPSBhZGRyLnNpbl9wb3J0OwomIzQzOwomIzQzOwluID0gc2VuZChwMSwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEobiwgVEVTVF9QQVlMT0FEX0xFTiwgJiMzNDtzZW5kJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwluID0gcmVjdl90aW1lb3V0KGMxLCBidWYsIHNpemVvZihidWYpLCBNU0dfRE9OVFdBSVQsIElPX1RJTUVPVVRfU0VDKTsKJiM0MzsJQVNTRVJUX0VRKG4sIFRFU1RfUEFZTE9BRF9MRU4sICYjMzQ7cmVjdiYjMzQ7KTsKJiM0MzsJQVNTRVJUX1RSVUUoc2tlbC0mZ3Q7YnNzLSZndDt0ZXN0X3Bhc3MsICYjMzQ7dGVzdF9wYXNzJiMzNDspOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWlmIChjMSAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoYzEpOwomIzQzOwlpZiAocDEgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHAxKTsKJiM0MzsJYnBmX2xpbmtfX2Rlc3Ryb3kodmVyZGljdF9saW5rKTsKJiM0MzsJaWYgKG1hcCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UobWFwKTsKJiM0MzsJYnBmX3RjX2hvb2tfZGVzdHJveSgmYW1wO3RjX2hvb2spOwomIzQzOwluZXRuc19mcmVlKG5zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X3NrYl9leHRfY3Jvc3NfaG9vayh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwlza2VsID0gdGVzdF94ZHBfbWV0YV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtvcGVuIGFuZCBsb2FkIHNrZWxldG9uJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3RvX2NncnBfaW5ncmVzcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF91ZHAoc2tlbCwgJiMzNDt0Y190b19jZ3JwX2luZ3Jlc3MmIzM0OywgUkVBREVSX0NHUlBfU0tCKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0Y190b19za19maWx0ZXImIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdWRwKHNrZWwsICYjMzQ7dGNfdG9fc2tfZmlsdGVyJiMzNDssIFJFQURFUl9TS19GSUxURVIpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3RvX2xzbSYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF90Y3Aoc2tlbCwgJiMzNDt0Y190b19sc20mIzM0OywgUkVBREVSX0xTTSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfdG9fc2tvcHMmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfdGNwKHNrZWwsICYjMzQ7dGNfdG9fc2tvcHMmIzM0OywgUkVBREVSX1NLT1BTKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtjZ3JwX2VncmVzc190b19rZnJlZV9za2ImIzM0OykpCiYjNDM7CQl0ZXN0X2NncnBfZWdyZXNzX3RvX2tmcmVlX3NrYihza2VsKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0Y190b19uZiYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF9uZihza2VsLCAmIzM0O3RjX3RvX25mJiMzNDspOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3RvX2x3dF9pbiYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF9sd3Qoc2tlbCwgJiMzNDt0Y190b19sd3RfaW4mIzM0OywKJiM0MzsJCQkJIHNrZWwtJmd0O3Byb2dzLmx3dF9pbl9za2JfZXh0X3JlYWQsICYjMzQ7aW4mIzM0OywgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2x3dF9vdXRfdG9fdGMmIzM0OykpCiYjNDM7CQl0ZXN0X3NrYl9leHRfbHd0KHNrZWwsICYjMzQ7bHd0X291dF90b190YyYjMzQ7LAomIzQzOwkJCQkgc2tlbC0mZ3Q7cHJvZ3MubHd0X291dF9za2JfZXh0X3dyaXRlLCAmIzM0O291dCYjMzQ7LCB0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtsd3RfeG1pdF90b190YyYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF9sd3Qoc2tlbCwgJiMzNDtsd3RfeG1pdF90b190YyYjMzQ7LAomIzQzOwkJCQkgc2tlbC0mZ3Q7cHJvZ3MubHd0X3htaXRfc2tiX2V4dF93cml0ZSwgJiMzNDt4bWl0JiMzNDssIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3RjX3RvX3NlZzZsb2NhbCYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2tiX2V4dF9zZWc2bG9jYWwoc2tlbCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dGNfdG9fc2tfc2tiJiMzNDspKQomIzQzOwkJdGVzdF9za2JfZXh0X3NrX3NrYihza2VsKTsKJiM0MzsKJiM0MzsJdGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYwppbmRleCAwOGIwM2JlMGI4OTFjLi44MGNkZmVlNjE1Y2NiIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmMKQEAgLTMsOSAmIzQzOzMsMTEgQEAKIAogI2luY2x1ZGUgJmx0O2JwZi9icGZfZW5kaWFuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwogI2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7YnBmX2tmdW5jcy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9taXNjLmgmIzM0OwogI2luY2x1ZGUgJiMzNDticGZfdHJhY2luZ19uZXQuaCYjMzQ7CiAKICNkZWZpbmUgTUVUQV9TSVpFIDMyCkBAIC0yMiwxMCAmIzQzOzI0LDEwIEBACiBib29sIHRlc3RfcGFzczsKIAogc3RhdGljIGNvbnN0IF9fdTggbWV0YV93YW50W01FVEFfU0laRV0gPSB7Ci0JMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKLQkweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LAotCTB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCi0JMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKJiM0MzsJMHg0OSwgMHgyMCwgMHg2MywgMHg3MiwgMHg2ZiwgMHg3MywgMHg3MywgMHg2NSwKJiM0MzsJMHg2NCwgMHgyMCwgMHg2OCwgMHg2ZiwgMHg2ZiwgMHg2YiwgMHg3MywgMHgyMCwKJiM0MzsJMHgyNiwgMHgyMCwgMHg2YywgMHg2OSwgMHg3NiwgMHg2NSwgMHg2NCwgMHgyMCwKJiM0MzsJMHg3NCwgMHg2ZiwgMHgyMCwgMHg3NCwgMHg2NSwgMHg2YywgMHg2YywgMHgyMSwKIH07CiAKIHN0YXRpYyBib29sIGNoZWNrX21ldGFkYXRhKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBfX3U4ICptZXRhX2hhdmUpCkBAIC02ODksNCAmIzQzOzY5MSw1NjMgQEAgaW50IGhlbHBlcl9za2JfY2hhbmdlX3Byb3RvKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKIAlyZXR1cm4gVENfQUNUX1NIT1Q7CiB9CiAKJiM0Mztib29sIHdyaXRlX2RvbmU7CiYjNDM7CiYjNDM7LyogV3JpdGUgdG8gc2tiX2V4dCB1c2luZyBicGZfZHlucHRyX3dyaXRlIGhlbHBlciAqLwomIzQzO1NFQygmIzM0O3RjJiMzNDspCiYjNDM7aW50IHRjX3NrYl9leHRfd3JpdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfd3JpdGUoJmFtcDttZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgQVJSQVlfU0laRShtZXRhX3dhbnQpLCAwKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJd3JpdGVfZG9uZSA9IHRydWU7CiYjNDM7CXJldHVybiBUQ19BQ1RfVU5TUEVDOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWFkIGZyb20gc2tiLWV4dCBtZXRhZGF0YSB1c2luZyBicGZfZHlucHRyX3JlYWQgaGVscGVyICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CV9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBBUlJBWV9TSVpFKG1ldGFfaGF2ZSksICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgZnJvbSBhIGNsb25lZCBza2JfZXh0IGR5bnB0ciAqLwomIzQzO1NFQygmIzM0O3RjJiMzNDspCiYjNDM7aW50IHRjX3NrYl9leHRfY2xvbmVfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhLCBjbG9uZTsKJiM0MzsJX191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfY2xvbmUoJmFtcDttZXRhLCAmYW1wO2Nsb25lKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIEFSUkFZX1NJWkUobWV0YV9oYXZlKSwgJmFtcDtjbG9uZSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgZnJvbSBza2JfZXh0IHVzaW5nIGJwZl9keW5wdHJfc2xpY2UgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X3NsaWNlX3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsJX191OCAqbWV0YV9oYXZlOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwltZXRhX2hhdmUgPSBicGZfZHlucHRyX3NsaWNlKCZhbXA7bWV0YSwgMCwgTlVMTCwgTUVUQV9TSVpFKTsKJiM0MzsJaWYgKCFtZXRhX2hhdmUpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzOy8qIFdyaXRlIHRvIHNrYl9leHQgdXNpbmcgYnBmX2R5bnB0cl9zbGljZV9yZHdyICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF9zbGljZV93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwlfX3U4ICpkc3Q7CiYjNDM7CiYjNDM7CWlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWRzdCA9IGJwZl9keW5wdHJfc2xpY2VfcmR3cigmYW1wO21ldGEsIDAsIE5VTEwsIE1FVEFfU0laRSk7CiYjNDM7CWlmICghZHN0KQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlfX2J1aWx0aW5fbWVtY3B5KGRzdCwgbWV0YV93YW50LCBNRVRBX1NJWkUpOwomIzQzOwomIzQzOwlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogT3BlbmluZyBza2JfZXh0IHdpdGhvdXQgRl9DUkVBVEUgb24gYSBmcmVzaCBza2Igc2hvdWxkIGZhaWwgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X25vX2FsbG9jKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgJmFtcDttZXRhKSAhPSAtRU5PRU5UKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwl0ZXN0X3Bhc3MgPSB0cnVlOwomIzQzOwlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogSW52YWxpZCBmbGFncyBhcmUgcmVqZWN0ZWQgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X2ludmFsaWRfZmxhZ3Moc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCB+MFVMTCwgJmFtcDttZXRhKSAhPSAtRUlOVkFMKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwl0ZXN0X3Bhc3MgPSB0cnVlOwomIzQzOwlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogV2l0aG91dCBGX0NSRUFURSB0aGUgZHlucHRyIGlzIHJlYWQtb25seSAqLwomIzQzO1NFQygmIzM0O3RjJiMzNDspCiYjNDM7aW50IHRjX3NrYl9leHRfcmRvbmx5KHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CV9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJLyogQ3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgZXh0ICovCiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwkvKiBSZW9wZW4gd2l0aG91dCBGX0NSRUFURSAtLSBzaG91bGQgYmUgcmVhZC1vbmx5ICovCiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIFZlcmlmeSByZWFkLW9ubHk6IHdyaXRlcyBtdXN0IGZhaWwsIHJlYWRzIG11c3Qgd29yayAqLwomIzQzOwlpZiAoIWJwZl9keW5wdHJfaXNfcmRvbmx5KCZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCAmYW1wO21ldGEsIDAsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiBUQ19BQ1RfVU5TUEVDOwomIzQzO30KJiM0MzsKJiM0MzsvKiBEb3VibGUgYWxsb2M6IGRhdGEgZnJvbSBmaXJzdCBhbGxvYyBzdXJ2aXZlcyBzZWNvbmQgc2tiX2V4dF9hZGQgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X2RvdWJsZV9hbGxvYyhzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIEZpcnN0IGFsbG9jICYjNDM7IHdyaXRlICovCiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwkvKiBTZWNvbmQgYWxsb2MgLS0gc2tiX2V4dF9hZGQgcmV0dXJucyBleGlzdGluZyBleHQgKi8KJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBUQ19BQ1RfU0hPVDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBfX3U4IG1ldGFfemVyb1tNRVRBX1NJWkVdID0ge307CiYjNDM7CiYjNDM7Ym9vbCBjbG9uZV9jb3dfZG9uZTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE92ZXJ3cml0ZSBza2JfZXh0IG9uIHRoZSBjbG9uZSB2aWEgRl9DUkVBVEUgKENPVykgLS0gbXVzdCBub3QgYWZmZWN0IG9yaWdpbmFsLgomIzQzOyAqIFJ1bnMgb24gdGhlIGR1bW15IGluZ3Jlc3MgKGNsb25lIHNpZGUpLCBzeW5jaHJvbm91c2x5IGR1cmluZyB0YyBtaXJyZWQuCiYjNDM7ICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF9jbG9uZV9yZWRpcl9jb3coc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIFplcm8gb3V0IHRoZSBjbG9uZSYjMzk7cyBleHQgLS0gbXVzdCBub3QgYWZmZWN0IG9yaWdpbmFsICovCiYjNDM7CWlmIChicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3plcm8sIE1FVEFfU0laRSwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CWNsb25lX2Nvd19kb25lID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFZlcmlmeSBDT1cgaXNvbGF0aW9uIGF0IGtmcmVlX3NrYiB0aW1lOiBvbmNlIGNsb25lX2Nvd19kb25lIGlzIHNldCwKJiM0MzsgKiBjaGVjayB0aGF0IHRoZSBvcmlnaW5hbCBza2Igc3RpbGwgaGFzIG1ldGFfd2FudC4KJiM0MzsgKi8KJiM0MztTRUMoJiMzNDt0cF9idGYva2ZyZWVfc2tiJiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKHRwX2tmcmVlX3NrYl9jb3dfY2hlY2ssIHN0cnVjdCBza19idWZmICpza2IpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoIWNsb25lX2Nvd19kb25lKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgMCwgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCAmYW1wO21ldGEsIDAsIDApKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwl0ZXN0X3Bhc3MgPSB0cnVlOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7X191MzIgY2xvbmVfcmVkaXJfaWZpbmRleDsKJiM0Mztib29sIHdyaXRlX2Jsb2NrZWQ7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBXcml0ZSBza2JfZXh0LCBjbG9uZSB0aGUgc2tiIHRvIGEgZGVsYXllZCBxZGlzYyBzbyB0aGUgY2xvbmUga2VlcHMgdGhlIGV4dAomIzQzOyAqIGJsb2NrIHNoYXJlZCwgdGhlbiB0cnkgdG8gd3JpdGUgdG8gdGhlIHNhbWUgZHlucHRyIGFnYWluLiBUaGUgd3JpdGUgbXVzdCBmYWlsCiYjNDM7ICogd2l0aCAtRUJVU1kuIFJlLWFjcXVpcmluZyB0aGUgZHlucHRyIHdpdGggRl9DUkVBVEUgQ09XcyB0aGUgYmxvY2sgYW5kCiYjNDM7ICogc3VjY2VlZHMuCiYjNDM7ICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF93cml0ZV9hZnRlcl9jbG9uZV9yZWRpcihzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmIChicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CWlmIChicGZfY2xvbmVfcmVkaXJlY3QoY3R4LCBjbG9uZV9yZWRpcl9pZmluZGV4LCAwIC8qIGVncmVzcyAqLykpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIGV4dCBub3cgc2hhcmVkIHdpdGggdGhlIHF1ZXVlZCBjbG9uZSAtLSB3cml0ZSBtdXN0IGZhaWwgKi8KJiM0MzsJaWYgKGJwZl9keW5wdHJfd3JpdGUoJmFtcDttZXRhLCAwLCAodm9pZCAqKW1ldGFfemVybywgTUVUQV9TSVpFLCAwKSAhPSAtRUJVU1kpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CS8qIFJlLWFjcXVpcmluZyBDT1dzIHRoZSBibG9jayAtLSB3cml0ZSBtdXN0IHN1Y2NlZWQgKi8KJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CWlmIChicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3plcm8sIE1FVEFfU0laRSwgMCkpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CiYjNDM7CXdyaXRlX2Jsb2NrZWQgPSB0cnVlOwomIzQzOwlyZXR1cm4gVENfQUNUX1VOU1BFQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTYW1lIGFzIGFib3ZlIGJ1dCB1c2luZyBicGZfZHlucHRyX3NsaWNlX3Jkd3IuCiYjNDM7ICovCiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztpbnQgdGNfc2tiX2V4dF9zbGljZV93cml0ZV9hZnRlcl9jbG9uZV9yZWRpcihzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwl2b2lkICpzbGljZTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlpZiAoYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwlpZiAoYnBmX2Nsb25lX3JlZGlyZWN0KGN0eCwgY2xvbmVfcmVkaXJfaWZpbmRleCwgMCAvKiBlZ3Jlc3MgKi8pKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwkvKiBleHQgbm93IHNoYXJlZCB3aXRoIHRoZSBxdWV1ZWQgY2xvbmUgLS0gc2xpY2UgbXVzdCBmYWlsICovCiYjNDM7CXNsaWNlID0gYnBmX2R5bnB0cl9zbGljZV9yZHdyKCZhbXA7bWV0YSwgMCwgTlVMTCwgTUVUQV9TSVpFKTsKJiM0MzsJaWYgKHNsaWNlKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwomIzQzOwkvKiBSZS1hY3F1aXJpbmcgQ09XcyB0aGUgYmxvY2sgLS0gc2xpY2UgbXVzdCBzdWNjZWVkICovCiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9TSE9UOwomIzQzOwlzbGljZSA9IGJwZl9keW5wdHJfc2xpY2VfcmR3cigmYW1wO21ldGEsIDAsIE5VTEwsIE1FVEFfU0laRSk7CiYjNDM7CWlmICghc2xpY2UpCiYjNDM7CQlyZXR1cm4gVENfQUNUX1NIT1Q7CiYjNDM7CV9fYnVpbHRpbl9tZW1jcHkoc2xpY2UsIG1ldGFfemVybywgTUVUQV9TSVpFKTsKJiM0MzsKJiM0MzsJd3JpdGVfYmxvY2tlZCA9IHRydWU7CiYjNDM7CXJldHVybiBUQ19BQ1RfVU5TUEVDOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWFkIHNrYl9leHQgZnJvbSBjZ3JvdXAvc2tiIGluZ3Jlc3MgLS0gdGVzdHMgY3Jvc3MtaG9vayBzdXJ2aXZhbCAqLwomIzQzO1NFQygmIzM0O2Nncm91cF9za2IvaW5ncmVzcyYjMzQ7KQomIzQzO2ludCBjZ3JwX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiAxOwomIzQzO30KJiM0MzsKJiM0MztfX2JlMTYgdGFyZ2V0X3BvcnQ7CiYjNDM7CiYjNDM7I2RlZmluZSBUQ1BWNF9IRFJfT0ZGCShzaXplb2Yoc3RydWN0IGV0aGhkcikgJiM0Mzsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiYjNDM7I2RlZmluZSBUQ1BWNF9TUE9SVF9PRkYJKFRDUFY0X0hEUl9PRkYgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgc291cmNlKSkKJiM0MzsjZGVmaW5lIFRDUFY0X0RQT1JUX09GRgkoVENQVjRfSERSX09GRiAmIzQzOyBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBkZXN0KSkKJiM0MzsKJiM0MzsvKiBXcml0ZSBza2JfZXh0IG9uIFRDUCBwYWNrZXRzIHRvL2Zyb20gdGFyZ2V0X3BvcnQgKi8KJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO2ludCB0Y19za2JfZXh0X3dyaXRlX3BvcnQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsJX19iZTE2IHNwb3J0LCBkcG9ydDsKJiM0MzsKJiM0MzsJaWYgKGN0eC0mZ3Q7cHJvdG9jb2wgIT0gX19icGZfY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWlmIChicGZfc2tiX2xvYWRfYnl0ZXMoY3R4LCBUQ1BWNF9TUE9SVF9PRkYsICZhbXA7c3BvcnQsIHNpemVvZihzcG9ydCkpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWlmIChicGZfc2tiX2xvYWRfYnl0ZXMoY3R4LCBUQ1BWNF9EUE9SVF9PRkYsICZhbXA7ZHBvcnQsIHNpemVvZihkcG9ydCkpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWlmIChzcG9ydCAhPSB0YXJnZXRfcG9ydCAmYW1wOyZhbXA7IGRwb3J0ICE9IHRhcmdldF9wb3J0KQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7CWJwZl9keW5wdHJfd3JpdGUoJmFtcDttZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgc2tiX2V4dCBmcm9tIHNvY2tfb3BzIHBhc3NpdmUgZXN0YWJsaXNoZWQgLS0gdGVzdHMgVEMgLSZndDsgc29ja19vcHMgcGF0aCAqLwomIzQzO1NFQygmIzM0O3NvY2tvcHMmIzM0OykKJiM0MztpbnQgc2tvcHNfc2tiX2V4dF9yZWFkKHN0cnVjdCBicGZfc29ja19vcHMgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfc29ja19vcHNfa2VybiAqa2N0eDsKJiM0MzsJX191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTsKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsJc3RydWN0IHNrX2J1ZmYgKnNrYjsKJiM0MzsKJiM0MzsJaWYgKGN0eC0mZ3Q7b3AgIT0gQlBGX1NPQ0tfT1BTX1BBU1NJVkVfRVNUQUJMSVNIRURfQ0IpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJa2N0eCA9IGJwZl9jYXN0X3RvX2tlcm5fY3R4KGN0eCk7CiYjNDM7CXNrYiA9IGtjdHgtJmd0O3NrYjsKJiM0MzsJaWYgKCFza2IpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiAxOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWFkIHNrYl9leHQgZnJvbSBMU00gaW5ldF9jb25uX2VzdGFibGlzaGVkIC0tIHRlc3RzIFRDIC0mZ3Q7IExTTSBwYXRoICovCiYjNDM7U0VDKCYjMzQ7bHNtL2luZXRfY29ubl9lc3RhYmxpc2hlZCYjMzQ7KQomIzQzO2ludCBCUEZfUFJPRyhsc21fc2tiX2V4dF9yZWFkLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgJmFtcDttZXRhLCAwLCAwKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgc2tiX2V4dCBmcm9tIHNvY2tldCBmaWx0ZXIgLS0gdGVzdHMgVEMgLSZndDsgc2tfZmlsdGVyIHBhdGggKi8KJiM0MztTRUMoJiMzNDtzb2NrZXQmIzM0OykKJiM0MztpbnQgc2tfZmlsdGVyX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gY3R4LSZndDtsZW47CiYjNDM7fQomIzQzOwomIzQzOy8qIFdyaXRlIHNrYl9leHQgZnJvbSBjZ3JvdXAvc2tiIGVncmVzcyAqLwomIzQzO1NFQygmIzM0O2Nncm91cF9za2IvZWdyZXNzJiMzNDspCiYjNDM7aW50IGNncnBfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJYnBmX2R5bnB0cl93cml0ZSgmYW1wO21ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApOwomIzQzOwomIzQzOwlyZXR1cm4gMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVhZCBza2JfZXh0IGZyb20gdHBfYnRmL2tmcmVlX3NrYiAtLSB0ZXN0cyBzdXJ2aXZhbCB1bnRpbCBza2IgZnJlZSAqLwomIzQzO1NFQygmIzM0O3RwX2J0Zi9rZnJlZV9za2ImIzM0OykKJiM0MztpbnQgQlBGX1BST0codHBfa2ZyZWVfc2tiX2V4dF9yZWFkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJX191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTsKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIE5GX0FDQ0VQVCAxCiYjNDM7CiYjNDM7U0VDKCYjMzQ7bmV0ZmlsdGVyJiMzNDspCiYjNDM7aW50IG5mX3NrYl9leHRfcmVhZChzdHJ1Y3QgYnBmX25mX2N0eCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IF9fc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBfX3NrX2J1ZmYgKiljdHgtJmd0O3NrYjsKJiM0MzsJX191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTsKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFza2IpCiYjNDM7CQlyZXR1cm4gTkZfQUNDRVBUOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoc2tiLCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIE5GX0FDQ0VQVDsKJiM0MzsJaWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgJmFtcDttZXRhLCAwLCAwKSkKJiM0MzsJCXJldHVybiBORl9BQ0NFUFQ7CiYjNDM7CWlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSkKJiM0MzsJCXJldHVybiBORl9BQ0NFUFQ7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiBORl9BQ0NFUFQ7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2x3dF9pbiYjMzQ7KQomIzQzO2ludCBsd3RfaW5fc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CV9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gQlBGX09LOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCAmYW1wO21ldGEsIDAsIDApKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIEJQRl9PSzsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7bHd0X291dCYjMzQ7KQomIzQzO2ludCBsd3Rfb3V0X3NrYl9leHRfd3JpdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gQlBGX09LOwomIzQzOwlicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIEFSUkFZX1NJWkUobWV0YV93YW50KSwgMCk7CiYjNDM7CiYjNDM7CXJldHVybiBCUEZfT0s7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O2x3dF94bWl0JiMzNDspCiYjNDM7aW50IGx3dF94bWl0X3NrYl9leHRfd3JpdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gQlBGX09LOwomIzQzOwlicGZfZHlucHRyX3dyaXRlKCZhbXA7bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIEFSUkFZX1NJWkUobWV0YV93YW50KSwgMCk7CiYjNDM7CiYjNDM7CXJldHVybiBCUEZfT0s7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQgc2tiX2V4dCBmcm9tIHNlZzZsb2NhbCBFbmQuQlBGIC0tIHRlc3RzIFRDIC0mZ3Q7IHNlZzZsb2NhbCBwYXRoICovCiYjNDM7U0VDKCYjMzQ7bHd0X3NlZzZsb2NhbCYjMzQ7KQomIzQzO2ludCBzZWc2bG9jYWxfc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CV9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gQlBGX09LOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCAmYW1wO21ldGEsIDAsIDApKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIEJQRl9PSzsKJiM0MzsKJiM0MzsJdGVzdF9wYXNzID0gdHJ1ZTsKJiM0MzsJcmV0dXJuIEJQRl9PSzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVhZCBza2JfZXh0IGZyb20gc2tfc2tiIHN0cmVhbSB2ZXJkaWN0IGhvb2sgKi8KJiM0MztTRUMoJiMzNDtza19za2Ivc3RyZWFtX3ZlcmRpY3QmIzM0OykKJiM0MztpbnQgc2tfc2tiX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIFNLX1BBU1M7CiYjNDM7CWlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsICZhbXA7bWV0YSwgMCwgMCkpCiYjNDM7CQlyZXR1cm4gU0tfUEFTUzsKJiM0MzsJaWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKQomIzQzOwkJcmV0dXJuIFNLX1BBU1M7CiYjNDM7CiYjNDM7CXRlc3RfcGFzcyA9IHRydWU7CiYjNDM7CXJldHVybiBTS19QQVNTOwomIzQzO30KJiM0MzsKIGNoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9za2JfZXh0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfc2tiX2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmMyNjExYzkzMTVhYTcKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfc2tiX2V4dC5jCkBAIC0wLDAgJiM0MzsxLDEyMiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfbWlzYy5oJiMzNDsKJiM0MzsKJiM0MztfX3U2NCBmbGFnczsKJiM0MzsKJiM0MztTRUMoJiMzNDt0YyYjMzQ7KQomIzQzO19fZGVzY3JpcHRpb24oJiMzNDtza2JfZXh0IHNsaWNlIGlzIGludmFsaWRhdGVkIGJ5IGJwZl9jbG9uZV9yZWRpcmVjdCYjMzQ7KQomIzQzO19fZmFpbHVyZQomIzQzO2ludCBza2JfZXh0X3N0YWxlX3NsaWNlX2FmdGVyX2Nsb25lX3JlZGlyZWN0KHN0cnVjdCBfX3NrX2J1ZmYgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CV9fdTggKnNsaWNlOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlzbGljZSA9IGJwZl9keW5wdHJfc2xpY2VfcmR3cigmYW1wO21ldGEsIDAsIE5VTEwsIDgpOwomIzQzOwlpZiAoIXNsaWNlKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWJwZl9jbG9uZV9yZWRpcmVjdChjdHgsIDEsIDApOwomIzQzOwomIzQzOwkvKiBTdGFsZTogdGhlIGNsb25lIHNoYXJlcyB0aGUgZXh0IGJsb2NrIHRoZSBzbGljZSBwb2ludHMgaW50by4gKi8KJiM0MzsJKnNsaWNlID0gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3RjJiMzNDspCiYjNDM7X19kZXNjcmlwdGlvbigmIzM0O3NrYl9leHQgc2xpY2UgaXMgaW52YWxpZGF0ZWQgd2hlbiBleHQgaXMgcmUtb3BlbmVkIHdpdGggRl9DUkVBVEUmIzM0OykKJiM0MztfX2ZhaWx1cmUKJiM0MztpbnQgc2tiX2V4dF9zdGFsZV9zbGljZV9hZnRlcl9yZWNyZWF0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBkMSwgZDI7CiYjNDM7CV9fdTggKnNsaWNlOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCAmYW1wO2QxKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlzbGljZSA9IGJwZl9keW5wdHJfc2xpY2UoJmFtcDtkMSwgMCwgTlVMTCwgOCk7CiYjNDM7CWlmICghc2xpY2UpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJLyogTWF5IENPVyB0aGUgZXh0IGJsb2NrLCBsZWF2aW5nIHRoZSBzbGljZSBwb2ludGluZyBhdCB0aGUgb2xkIG9uZS4gKi8KJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7ZDIpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiAqc2xpY2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3RwX2J0Zi9rZnJlZV9za2ImIzM0OykKJiM0MztfX2Rlc2NyaXB0aW9uKCYjMzQ7Rl9DUkVBVEUgaXMgcmVqZWN0ZWQgaW4gdHJhY2luZyBwcm9ncmFtcyYjMzQ7KQomIzQzO19fZmFpbHVyZSBfX21zZygmIzM0O2lzIG5vdCBhbGxvd2VkIGluIGxzbS90cmFjaW5nIHByb2dyYW1zJiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKHRwX3NrYl9leHRfY3JlYXRlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLAomIzQzOwkJCQkgICAgQlBGX1NLQl9FWFRfRl9DUkVBVEUsICZhbXA7bWV0YSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3RwX2J0Zi9rZnJlZV9za2ImIzM0OykKJiM0MztfX2Rlc2NyaXB0aW9uKCYjMzQ7bm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZCBpbiB0cmFjaW5nIHByb2dyYW1zJiMzNDspCiYjNDM7X19mYWlsdXJlIF9fbXNnKCYjMzQ7bXVzdCBiZSBhIGtub3duIGNvbnN0YW50JiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKHRwX3NrYl9leHRfdmFyX2ZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCBmbGFncywgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7dGMmIzM0OykKJiM0MztfX2Rlc2NyaXB0aW9uKCYjMzQ7bm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZCYjMzQ7KQomIzQzO19fZmFpbHVyZSBfX21zZygmIzM0O211c3QgYmUgYSBrbm93biBjb25zdGFudCYjMzQ7KQomIzQzO2ludCBza2JfZXh0X3Zhcl9mbGFncyhzdHJ1Y3QgX19za19idWZmICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhOwomIzQzOwomIzQzOwlpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBmbGFncywgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7bHNtL2luZXRfY29ubl9lc3RhYmxpc2hlZCYjMzQ7KQomIzQzO19fZGVzY3JpcHRpb24oJiMzNDtGX0NSRUFURSBpcyByZWplY3RlZCBpbiBMU00gcHJvZ3JhbXMmIzM0OykKJiM0MztfX2ZhaWx1cmUgX19tc2coJiMzNDtpcyBub3QgYWxsb3dlZCBpbiBsc20vdHJhY2luZyBwcm9ncmFtcyYjMzQ7KQomIzQzO2ludCBCUEZfUFJPRyhsc21fc2tiX2V4dF9jcmVhdGUsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfZHlucHRyIG1ldGE7CiYjNDM7CiYjNDM7CWlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwKJiM0MzsJCQkJICAgIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCAmYW1wO21ldGEpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtsc20vaW5ldF9jb25uX2VzdGFibGlzaGVkJiMzNDspCiYjNDM7X19kZXNjcmlwdGlvbigmIzM0O25vbi1jb25zdGFudCBmbGFncyBhcmUgcmVqZWN0ZWQgaW4gTFNNIHByb2dyYW1zJiMzNDspCiYjNDM7X19mYWlsdXJlIF9fbXNnKCYjMzQ7bXVzdCBiZSBhIGtub3duIGNvbnN0YW50JiMzNDspCiYjNDM7aW50IEJQRl9QUk9HKGxzbV9za2JfZXh0X3Zhcl9mbGFncywgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9keW5wdHIgbWV0YTsKJiM0MzsKJiM0MzsJaWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCBmbGFncywgJmFtcDttZXRhKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzcwOTMKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAxMzYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgc2VlIGlmIHdlIG5lZWQgdG8gZmlyZSB1cCBhIEtNU0FOIHNlc3Npb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBjYXJlZnVsbHkgYW5hbHl6ZSB0aGlzIG5ldyBjb2RlLCBsaW5lIGJ5IGxpbmUsIHRvIHVuZGVyc3RhbmQgaXRzIGRhdGEgZmxvd3MgYW5kIGlkZW50aWZ5IGFueSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmVzLgoKRmlyc3QsIEkgc2VlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUYCBhbmQgYHN0cnVjdCBicGZfc2tiX2V4dGAuIFRoaXMgc3VnZ2VzdHMgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBhbiBleHRlbnNpb24gdG8gdGhlIEJQRiBpbmZyYXN0cnVjdHVyZSBzcGVjaWZpY2FsbHkgZm9yIFNLQnMsIHdoaWNoIHdhcnJhbnRzIGEgYml0IG9mIGZvY3VzZWQgYXR0ZW50aW9uLCBhcyB0aGVzZSBleHRlbnNpb25zIGNhbiBzb21ldGltZXMgYmUgdHJpY2t5LiBJJiMzOTttIG5vdGluZyB0aGUgYnVmZmVyIHNpemUgYENPTkZJR19CUEZfU0tCX0VYVF9TSVpFYCwgYXMgdGhhdCB3aWxsIGluZmx1ZW5jZSBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93cyBvciByZWFkLWFmdGVyLXdyaXRlIHNpdHVhdGlvbnMuCgpOZXh0LCB0aGUgZGVjbGFyYXRpb25zIG9mIGBicGZfc2tiX2V4dF9wb2ludGVyYCwgYF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlc2AsIGFuZCBgX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlc2AgYXJlIGltcG9ydGFudC4gSSYjMzk7bGwgbmVlZCB0byBzY3J1dGluaXplIHRoZXNlIGZvciBob3cgdGhleSBhY2Nlc3MgdGhlIGV4dGVuc2lvbiBkYXRhIGFuZCBpZiB0aGVyZSBpcyBhbnkgc2FuaXRpemF0aW9uIG9yIGJvdW5kcyBjaGVja2luZy4KCk5vdywgdGhlIGBza2JfZXh0X3NjcnViYCBhbmQgYHNrYl9leHRfc2hhcmVkYCBhZGRpdGlvbnMgdG8gYHNrYnVmZi5oYCB0ZWxsIG1lIHRoZXJlJiMzOTtzIGV4cGxpY2l0IGhhbmRsaW5nIG9mIHNoYXJlZCBTS0IgZXh0ZW5zaW9ucywgd2hpY2ggY2FuIGJlIGEga2V5IGluZGljYXRvciBmb3IgY29uY3VycmVuY3kgaXNzdWVzIG9yIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSBzY2VuYXJpb3MuCgpUaGUgYEJQRl9TS0JfRVhUX0ZfQ1JFQVRFYCBmbGFnIGluIGB1YXBpL2xpbnV4L2JwZi5oYCBpcyBpbnRlcmVzdGluZy4gVGhlIHByZXNlbmNlIG9mIGEgJiMzNDtjcmVhdGUmIzM0OyBmbGFnIGFsd2F5cyBkZW1hbmRzIHNvbWUgZXh0cmEgY2FyZS4gSXMgaXQgdXNlZD8gSG93IGlzIHRoZSBleHRlbnNpb24gY3JlYXRlZD8KCk1vdmluZyBvbiB0byBgaGVscGVycy5jYCwgaXQmIzM5O3MgZ29vZCB0aGF0IGR5bnB0ciByZWFkL3dyaXRlIGhlbHBlcnMgc3VwcG9ydCBgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFRgLCB3aGljaCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGluaXRpYWwgcHJlbWlzZS4gQWxzbywgaXTigJlzIGdvb2QgdG8gc2VlIHRoYXQgdGhlIHZlcmlmaWVyIGhhbmRsZXMgdGhlIG5ldyB0eXBlLCBhbmQgcGFydGljdWxhcmx5IHRoYXQgYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCBpcyBmbGFnZ2VkIGFzIGEgcGFja2V0LWNoYW5naW5nIGtmdW5jLiBUaGlzIGlzIGEgdmVyeSBnb29kIHNpZ24sIGFzIHRoZSB2ZXJpZmllciBpcyB0eXBpY2FsbHkgYSBmaXJzdCBsaW5lIG9mIGRlZmVuY2UgYWdhaW5zdCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbiBCUEYuCgpOb3cgdG8gdGhlIGNyaXRpY2FsIHBhcnRzLCB0aGUgYG5ldC9jb3JlL2ZpbHRlci5jYCBmdW5jdGlvbnMuIFJlYWRpbmcgYGJwZl9za2JfZXh0X3BvaW50ZXJgLCB0aGUgbG9naWMgdG8gcmV0cmlldmUgdGhlIGV4dGVuc2lvbiBsb29rcyBzb3VuZCwgYnV0IEkgbXVzdCBwYXkgYXR0ZW50aW9uIHRvIGFueSB3cml0ZSBhY2Nlc3MgaW4gdGhlIHNoYXJlZCBidWZmZXIgY2FzZSB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4uIFRoZSBzYW1lIGhvbGRzIHRydWUgZm9yIGBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXNgIGFuZCBgX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlc2AsIGVzcGVjaWFsbHkgdGhlIGJvdW5kcyBjaGVja2luZyBhbmQgZXJyb3IgaGFuZGxpbmcuIE5vdGUgdGhhdCB0aGUgZmxhZ3MgY2hlY2sgaXMgZ29vZC4KCk9rYXksIGxldCYjMzk7cyBnZXQgaW50byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlcjogYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YC4gVGhlIGBjcmVhdGVgIGZsYWcgaXMgY3J1Y2lhbCBoZXJlOyBgc2tiX2V4dF9hZGRgIGlzIHRoZSBrZXkuIFRoZSBmdW5jdGlvbiBzZXRzIHNpemUgdG8gdGhlIGBBUlJBWV9TSVpFYCBpZiBzaXplIGlzIG5vdCBwcm92aWRlZC4gSXQgY2hlY2tzIGZvciBleGlzdGVuY2UgYmVmb3JlIHBvdGVudGlhbGx5IGNyZWF0aW5nLCBzZXRzIGZsYWdzLCBhbmQgdGhlbiBpbml0aWFsaXplcyB0aGUgZHlucHRyLiBDcnVjaWFsbHksIHRoZSBjb2RlIGNoZWNrcyBmb3IgYGV4aXN0c2AgYW5kIHRoZW4gY2FsbHMgYG1lbXNldGAgdG8gemVybyBtZW1vcnkgZm9yIGEgbm9uLWV4aXN0aW5nIGV4dGVuc2lvbi4gU28gaXQgaW5pdGlhbGl6ZXMgdGhlIG1lbW9yeS4gVGhpcyBpcyBjcml0aWNhbC4KCkFoYSEgTm93IEkgc2VlIHRoZSBgc2tiX2V4dF9hZGRgLiBUaGlzIGlzIHRoZSBwYXJ0IEkgbmVlZCB0byB2ZXJpZnkuIFNpbmNlIEkmIzM5O20gdmVyeSBmYW1pbGlhciB3aXRoIHRoZSBza2IgY29kZSwgSSYjMzk7bSBnb2luZyB0byBxdWlja2x5IHF1ZXJ5IGl0IHVzaW5nIGdyZXAgKG9yLCBteSBwcmVmZXJyZWQgdG9vbCwgZ3JlcHBlcikuIEkgaGF2ZSB0byBlbnN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgdGhlIGFsbG9jYXRpb24sIG9yIHRoYXQgaXTigJlzIG5vdCBsZWFraW5nIG1lbW9yeS4gTm93IEkgYW0gZ29pbmcgdG8gbG9vayB0aHJvdWdoIHRoZSBgc2tiX2V4dF9hZGRgIGNhbGwgaW4gYG5ldC9jb3JlL3NrYnVmZi5jYC4KCk9uY2UgSSBzZWUgdGhhdCBgc2tiX2V4dF9hZGRgIGlzIHNhZmUsIHRoZW4gSSBhbSBjb25maWRlbnQgdGhhdCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE1OjIzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NrYl9leHRfYWRkJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmM9MjE1PXN0cnVjdCBza19idWZmICphbGxvY19jYW5fc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBjYW5fZnJhbWUgKipjZilcbi0tXG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jLTIyMy1cbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmM6MjI0Olx0Y3N4ID0gY2FuX3NrYl9leHRfYWRkKHNrYik7XG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jLTIyNS1cdGlmICghY3N4KSB7XG4tLVxuZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYz0yNDU9c3RydWN0IHNrX2J1ZmYgKmFsbG9jX2NhbmZkX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuLS1cbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmMtMjU0LVxuZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYzoyNTU6XHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQoc2tiKTtcbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmMtMjU2LVx0aWYgKCFjc3gpIHtcbi0tXG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jPTI3OT1zdHJ1Y3Qgc2tfYnVmZiAqYWxsb2NfY2FueGxfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXG4tLVxuZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYy0yOTItXG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jOjI5MzpcdGNzeCA9IGNhbl9za2JfZXh0X2FkZChza2IpO1xuZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYy0yOTQtXHRpZiAoIWNzeCkge1xuLS1cbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmM9MzM0PXN0YXRpYyBib29sIGNhbl9za2JfaW5pdF92YWxpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmMtMzQxLVx0XHRpZiAoIWNzeCkge1xuZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYzozNDI6XHRcdFx0Y3N4ID0gY2FuX3NrYl9leHRfYWRkKHNrYik7XG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jLTM0My1cdFx0XHRpZiAoIWNzeClcbi0tXG5kcml2ZXJzL25ldC9jYW4vdnhjYW4uYz0zOT1zdGF0aWMgbmV0ZGV2X3R4X3QgdnhjYW5feG1pdChzdHJ1Y3Qgc2tfYnVmZiAqb3NrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbi0tXG5kcml2ZXJzL25ldC9jYW4vdnhjYW4uYy02OS1cdC8qIHRoZSBjbG9uZWQgc2tiIHBvaW50cyB0byB0aGUgc2tiIGV4dGVuc2lvbiBvZiB0aGUgYWxyZWFkeSBjbG9uZWRcbmRyaXZlcnMvbmV0L2Nhbi92eGNhbi5jOjcwOlx0ICogb3NrYiB3aXRoIGFuIGluY3JlYXNlZCByZWZjb3VudC4gc2tiX2V4dF9hZGQoKSBjcmVhdGVzIGEgY29weSB0b1xuZHJpdmVycy9uZXQvY2FuL3Z4Y2FuLmMtNzEtXHQgKiBzZXBhcmF0ZSB0aGUgc2tiIGV4dGVuc2lvbiBkYXRhIHdoaWNoIGlzIG5lZWRlZCB0byBzdGFydCB3aXRoIGFcbi0tXG5kcml2ZXJzL25ldC9jYW4vdnhjYW4uYy03My1cdCAqL1xuZHJpdmVycy9uZXQvY2FuL3Z4Y2FuLmM6NzQ6XHRjc3ggPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfQ0FOKTtcbmRyaXZlcnMvbmV0L2Nhbi92eGNhbi5jLTc1LVx0aWYgKCFjc3gpIHtcbi0tXG5pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaD0zOT1ib29sIGNhbl9kcm9wcGVkX2ludmFsaWRfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpO1xuaW5jbHVkZS9saW51eC9jYW4vc2tiLmgtNDAtXG5pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaDo0MTpzdGF0aWMgaW5saW5lIHN0cnVjdCBjYW5fc2tiX2V4dCAqY2FuX3NrYl9leHRfYWRkKHN0cnVjdCBza19idWZmICpza2IpXG5pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaC00Mi17XG5pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaDo0MzpcdHN0cnVjdCBjYW5fc2tiX2V4dCAqY3N4ID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX0NBTik7XG5pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaC00NC1cbmluY2x1ZGUvbGludXgvY2FuL3NrYi5oOjQ1Olx0Lyogc2tiX2V4dF9hZGQoKSByZXR1cm5zIHVuaW5pdGlhbGl6ZWQgc3BhY2UgKi9cbmluY2x1ZGUvbGludXgvY2FuL3NrYi5oLTQ2LVx0aWYgKGNzeClcbi0tXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oPTUwODk9dm9pZCAqX19za2JfZXh0X3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQsXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTUwOTAtXHRcdCAgICBzdHJ1Y3Qgc2tiX2V4dCAqZXh0KTtcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6NTA5MTp2b2lkICpza2JfZXh0X2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQpO1xuaW5jbHVkZS9saW51eC9za2J1ZmYuaC01MDkyLXZvaWQgX19za2JfZXh0X2RlbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQpO1xuLS1cbmluY2x1ZGUvbmV0L25ldGZpbHRlci9icl9uZXRmaWx0ZXIuaD05PXN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2VfYWxsb2Moc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvYnJfbmV0ZmlsdGVyLmgtMTEtI2lmIElTX0VOQUJMRUQoQ09ORklHX0JSSURHRV9ORVRGSUxURVIpXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvYnJfbmV0ZmlsdGVyLmg6MTI6XHRzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKmIgPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfQlJJREdFX05GKTtcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9icl9uZXRmaWx0ZXIuaC0xMy1cbi0tXG5pbmNsdWRlL25ldC9wa3RfY2xzLmg9Nzg3PXN0YXRpYyBpbmxpbmUgc3RydWN0IHRjX3NrYl9leHQgKnRjX3NrYl9leHRfYWxsb2Moc3RydWN0IHNrX2J1ZmYgKnNrYilcbmluY2x1ZGUvbmV0L3BrdF9jbHMuaC03ODgte1xuaW5jbHVkZS9uZXQvcGt0X2Nscy5oOjc4OTpcdHN0cnVjdCB0Y19za2JfZXh0ICp0Y19za2JfZXh0ID0gc2tiX2V4dF9hZGQoc2tiLCBUQ19TS0JfRVhUKTtcbmluY2x1ZGUvbmV0L3BrdF9jbHMuaC03OTAtXG4tLVxubmV0L2JyaWRnZS9icl9uZXRmaWx0ZXJfaG9va3MuYz0xNjg9c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZV91bnNoYXJlKHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvYnJpZGdlL2JyX25ldGZpbHRlcl9ob29rcy5jLTE2OS17XG5uZXQvYnJpZGdlL2JyX25ldGZpbHRlcl9ob29rcy5jOjE3MDpcdHJldHVybiBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfQlJJREdFX05GKTtcbm5ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyX2hvb2tzLmMtMTcxLX1cbi0tXG5uZXQvY2FuL2JjbS5jPTMyMT1zdGF0aWMgdm9pZCBiY21fY2FuX3R4KHN0cnVjdCBiY21fb3AgKm9wLCBzdHJ1Y3QgY2FuZmRfZnJhbWUgKmNmKVxuLS1cbm5ldC9jYW4vYmNtLmMtMzUzLVxubmV0L2Nhbi9iY20uYzozNTQ6XHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQoc2tiKTtcbm5ldC9jYW4vYmNtLmMtMzU1LVx0aWYgKCFjc3gpIHtcbi0tXG5uZXQvY2FuL2JjbS5jPTE2MDI9c3RhdGljIGludCBiY21fdHhfc2VuZChzdHJ1Y3QgbXNnaGRyICptc2csIGludCBpZmluZGV4LCBzdHJ1Y3Qgc29jayAqc2ssXG4tLVxubmV0L2Nhbi9iY20uYy0xNjE3LVxubmV0L2Nhbi9iY20uYzoxNjE4Olx0Y3N4ID0gY2FuX3NrYl9leHRfYWRkKHNrYik7XG5uZXQvY2FuL2JjbS5jLTE2MTktXHRpZiAoIWNzeCkge1xuLS1cbm5ldC9jYW4vZ3cuYz00NTg9c3RhdGljIHZvaWQgY2FuX2Nhbl9nd19yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9pZCAqZGF0YSlcbi0tXG5uZXQvY2FuL2d3LmMtNTE2LVx0LyogdGhlIGNsb25lZC9jb3BpZWQgbnNrYiBwb2ludHMgdG8gdGhlIHNrYiBleHRlbnNpb24gb2YgdGhlIG9yaWdpbmFsXG5uZXQvY2FuL2d3LmM6NTE3Olx0ICogc2tiIHdpdGggYW4gaW5jcmVhc2VkIHJlZmNvdW50LiBza2JfZXh0X2FkZCgpIGNyZWF0ZXMgYSBjb3B5IHRvXG5uZXQvY2FuL2d3LmMtNTE4LVx0ICogc2VwYXJhdGUgdGhlIHNrYiBleHRlbnNpb24gZGF0YSB0byBtb2RpZnkgdGhlIGNhbl9nd19ob3BzLlxubmV0L2Nhbi9ndy5jLTUxOS1cdCAqL1xubmV0L2Nhbi9ndy5jOjUyMDpcdG5jc3ggPSBza2JfZXh0X2FkZChuc2tiLCBTS0JfRVhUX0NBTik7XG5uZXQvY2FuL2d3LmMtNTIxLVx0aWYgKCFuY3N4KSB7XG4tLVxubmV0L2Nhbi9pc290cC5jPTI4Nj1zdGF0aWMgaW50IGlzb3RwX3NlbmRfZmMoc3RydWN0IHNvY2sgKnNrLCBpbnQgYWUsIHU4IGZsb3dzdGF0dXMpXG4tLVxubmV0L2Nhbi9pc290cC5jLTI5OC1cbm5ldC9jYW4vaXNvdHAuYzoyOTk6XHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQobnNrYik7XG5uZXQvY2FuL2lzb3RwLmMtMzAwLVx0aWYgKCFjc3gpIHtcbi0tXG5uZXQvY2FuL2lzb3RwLmM9ODYzPXN0YXRpYyB2b2lkIGlzb3RwX3NlbmRfY2ZyYW1lKHN0cnVjdCBpc290cF9zb2NrICpzbylcbi0tXG5uZXQvY2FuL2lzb3RwLmMtODgzLVxubmV0L2Nhbi9pc290cC5jOjg4NDpcdGNzeCA9IGNhbl9za2JfZXh0X2FkZChza2IpO1xubmV0L2Nhbi9pc290cC5jLTg4NS1cdGlmICghY3N4KSB7XG4tLVxubmV0L2Nhbi9pc290cC5jPTExMDQ9c3RhdGljIGludCBpc290cF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpXG4tLVxubmV0L2Nhbi9pc290cC5jLTEyMTMtXG5uZXQvY2FuL2lzb3RwLmM6MTIxNDpcdGNzeCA9IGNhbl9za2JfZXh0X2FkZChza2IpO1xubmV0L2Nhbi9pc290cC5jLTEyMTUtXHRpZiAoIWNzeCkge1xuLS1cbm5ldC9jYW4vajE5Mzkvc29ja2V0LmM9ODgxPXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqajE5Mzlfc2tfYWxsb2Nfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LFxuLS1cbm5ldC9jYW4vajE5Mzkvc29ja2V0LmMtODk5LVxubmV0L2Nhbi9qMTkzOS9zb2NrZXQuYzo5MDA6XHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQoc2tiKTtcbm5ldC9jYW4vajE5Mzkvc29ja2V0LmMtOTAxLVx0aWYgKCFjc3gpIHtcbi0tXG5uZXQvY2FuL2oxOTM5L3RyYW5zcG9ydC5jPTYwMT1za19idWZmICpqMTkzOV90cF90eF9kYXRfbmV3KHN0cnVjdCBqMTkzOV9wcml2ICpwcml2LFxuLS1cbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmMtNjEzLVxubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYzo2MTQ6XHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQoc2tiKTtcbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmMtNjE1LVx0aWYgKCFjc3gpIHtcbi0tXG5uZXQvY2FuL2oxOTM5L3RyYW5zcG9ydC5jPTEwNTY9c3RhdGljIGludCBqMTkzOV9zaW1wbGVfdHhuZXh0KHN0cnVjdCBqMTkzOV9zZXNzaW9uICpzZXNzaW9uKVxuLS1cbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmMtMTA3Mi1cdC8qIHRoZSBjbG9uZWQgc2tiIHBvaW50cyB0byB0aGUgc2tiIGV4dGVuc2lvbiBvZiB0aGUgb3JpZ2luYWwgc2Vfc2tiXG5uZXQvY2FuL2oxOTM5L3RyYW5zcG9ydC5jOjEwNzM6XHQgKiB3aXRoIGFuIGluY3JlYXNlZCByZWZjb3VudC4gc2tiX2V4dF9hZGQoKSBjcmVhdGVzIGEgY29weSB0b1xubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYy0xMDc0LVx0ICogc2VwYXJhdGUgdGhlIHNrYiBleHRlbnNpb24gZGF0YSB3aGljaCBpcyBuZWVkZWQgdG8gbW9kaWZ5IHRoZVxuLS1cbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmMtMTA3Ni1cdCAqL1xubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYzoxMDc3Olx0aWYgKCFza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfQ0FOKSkge1xubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYy0xMDc4LVx0XHRrZnJlZV9za2Ioc2tiKTtcbi0tXG5uZXQvY2FuL2oxOTM5L3RyYW5zcG9ydC5jPTE1NTM9ajE5Mzlfc2Vzc2lvbiAqajE5Mzlfc2Vzc2lvbl9mcmVzaF9uZXcoc3RydWN0IGoxOTM5X3ByaXYgKnByaXYsXG4tLVxubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYy0xNTY1LVxubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYzoxNTY2Olx0Y3N4ID0gY2FuX3NrYl9leHRfYWRkKHNrYik7XG5uZXQvY2FuL2oxOTM5L3RyYW5zcG9ydC5jLTE1NjctXHRpZiAoIWNzeCkge1xuLS1cbm5ldC9jYW4vcmF3LmM9OTE4PXN0YXRpYyBpbnQgcmF3X3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSlcbi0tXG5uZXQvY2FuL3Jhdy5jLTk2Mi1cbm5ldC9jYW4vcmF3LmM6OTYzOlx0Y3N4ID0gY2FuX3NrYl9leHRfYWRkKHNrYik7XG5uZXQvY2FuL3Jhdy5jLTk2NC1cdGlmICghY3N4KSB7XG4tLVxubmV0L2NvcmUvZmlsdGVyLmM9MTI1MDk9X19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KHN0cnVjdCBfX3NrX2J1ZmYgKnNrYl8sIHUzMiBzaXplLFxuLS1cbm5ldC9jb3JlL2ZpbHRlci5jLTEyNTQwLVxubmV0L2NvcmUvZmlsdGVyLmM6MTI1NDE6XHRleHQgPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfQlBGKTtcbm5ldC9jb3JlL2ZpbHRlci5jLTEyNTQyLVx0aWYgKCFleHQpIHtcbi0tXG5uZXQvY29yZS9za2J1ZmYuYz03MTg4PUVYUE9SVF9TWU1CT0xfTlNfR1BMKF9fc2tiX2V4dF9zZXQsIFwmIzM0O05FVERFVl9JTlRFUk5BTFwmIzM0Oyk7XG4tLVxubmV0L2NvcmUvc2tidWZmLmMtNzE5MC0vKipcbm5ldC9jb3JlL3NrYnVmZi5jOjcxOTE6ICogc2tiX2V4dF9hZGQgLSBhbGxvY2F0ZSBzcGFjZSBmb3IgZ2l2ZW4gZXh0ZW5zaW9uLCBDT1cgaWYgbmVlZGVkXG5uZXQvY29yZS9za2J1ZmYuYy03MTkyLSAqIEBza2I6IGJ1ZmZlclxuLS1cbm5ldC9jb3JlL3NrYnVmZi5jLTcyMDMtICovXG5uZXQvY29yZS9za2J1ZmYuYzo3MjA0OnZvaWQgKnNrYl9leHRfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZClcbm5ldC9jb3JlL3NrYnVmZi5jLTcyMDUte1xuLS1cbm5ldC9jb3JlL3NrYnVmZi5jLTcyMzYtfVxubmV0L2NvcmUvc2tidWZmLmM6NzIzNzpFWFBPUlRfU1lNQk9MKHNrYl9leHRfYWRkKTtcbm5ldC9jb3JlL3NrYnVmZi5jLTcyMzgtXG4tLVxubmV0L2lwdjQvZXNwNF9vZmZsb2FkLmM9MjY1PXN0YXRpYyBpbnQgZXNwX3htaXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IsICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcylcbi0tXG5uZXQvaXB2NC9lc3A0X29mZmxvYWQuYy0zNTQtXHRpZiAoaHdfb2ZmbG9hZCkge1xubmV0L2lwdjQvZXNwNF9vZmZsb2FkLmM6MzU1Olx0XHRpZiAoIXNrYl9leHRfYWRkKHNrYiwgU0tCX0VYVF9TRUNfUEFUSCkpXG5uZXQvaXB2NC9lc3A0X29mZmxvYWQuYy0zNTYtXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4tLVxubmV0L2lwdjYvZXNwNl9vZmZsb2FkLmM9MzAzPXN0YXRpYyBpbnQgZXNwNl94bWl0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpXG4tLVxubmV0L2lwdjYvZXNwNl9vZmZsb2FkLmMtMzc1LVx0aWYgKGh3X29mZmxvYWQpIHtcbm5ldC9pcHY2L2VzcDZfb2ZmbG9hZC5jOjM3NjpcdFx0aWYgKCFza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfU0VDX1BBVEgpKVxubmV0L2lwdjYvZXNwNl9vZmZsb2FkLmMtMzc3LVx0XHRcdHJldHVybiAtRU5PTUVNO1xuLS1cbm5ldC9tY3RwL3JvdXRlLmM9MzQ2PXN0YXRpYyB2b2lkIG1jdHBfc2tiX3NldF9mbG93KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBtY3RwX3NrX2tleSAqa2V5KVxuLS1cbm5ldC9tY3RwL3JvdXRlLmMtMzQ5LVxubmV0L21jdHAvcm91dGUuYzozNTA6XHRmbG93ID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX01DVFApO1xubmV0L21jdHAvcm91dGUuYy0zNTEtXHRpZiAoIWZsb3cpXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYz0xMjIyPWJvb2wgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYy0xMzIyLVxubmV0L21wdGNwL29wdGlvbnMuYzoxMzIzOlx0bXBleHQgPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfTVBUQ1ApO1xubmV0L21wdGNwL29wdGlvbnMuYy0xMzI0LVx0aWYgKCFtcGV4dClcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jPTEyNj1zdGF0aWMgdm9pZCBzdWJmbG93X2FkZF9yZXNldF9yZWFzb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggcmVhc29uKVxubmV0L21wdGNwL3N1YmZsb3cuYy0xMjcte1xubmV0L21wdGNwL3N1YmZsb3cuYzoxMjg6XHRzdHJ1Y3QgbXB0Y3BfZXh0ICptcGV4dCA9IHNrYl9leHRfYWRkKHNrYiwgU0tCX0VYVF9NUFRDUCk7XG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTEyOS1cbi0tXG5uZXQvcHNwL3BzcF9tYWluLmM9MzAyPWludCBwc3BfZGV2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgZGV2X2lkLCB1OCBnZW5lcmF0aW9uLCBib29sIHN0cmlwX2ljdilcbi0tXG5uZXQvcHNwL3BzcF9tYWluLmMtMzY3LVxubmV0L3BzcC9wc3BfbWFpbi5jOjM2ODpcdHBzZSA9IHNrYl9leHRfYWRkKHNrYiwgU0tCX0VYVF9QU1ApO1xubmV0L3BzcC9wc3BfbWFpbi5jLTM2OS1cdGlmICghcHNlKVxuLS1cbm5ldC94ZnJtL3hmcm1faW5wdXQuYz0xMjM9c3RydWN0IHNlY19wYXRoICpzZWNwYXRoX3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC94ZnJtL3hmcm1faW5wdXQuYy0xMjYtXG5uZXQveGZybS94ZnJtX2lucHV0LmM6MTI3Olx0c3AgPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfU0VDX1BBVEgpO1xubmV0L3hmcm0veGZybV9pbnB1dC5jLTEyOC1cdGlmICghc3ApXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYz04MjE9aW50IHRjX3NrYl9leHRfcmRvbmx5KHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jLTg1Mi1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmM6ODUzOi8qIERvdWJsZSBhbGxvYzogZGF0YSBmcm9tIGZpcnN0IGFsbG9jIHN1cnZpdmVzIHNlY29uZCBza2JfZXh0X2FkZCAqL1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYy04NTQtU0VDKFwmIzM0O3RjXCYjMzQ7KVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYz04NTU9aW50IHRjX3NrYl9leHRfZG91YmxlX2FsbG9jKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jLTg2OC1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmM6ODY5Olx0LyogU2Vjb25kIGFsbG9jIC0tIHNrYl9leHRfYWRkIHJldHVybnMgZXhpc3RpbmcgZXh0ICovXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jLTg3MC1cdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDM5MDAKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTttIHRoaW5raW5nIGFib3V0IGl0OgoKKipEaWdnaW5nIGludG8gc2tiX2V4dF9hZGQgaW4gbmV0L2NvcmUvc2tidWZmLmMqKgoKQWxyaWdodCwgSSBuZWVkIHRvIGdldCBhIGJldHRlciBoYW5kbGUgb24gaG93IHRoZXNlIGV4dGVuc2lvbnMgd29yayB3aXRoaW4gdGhlIGBza19idWZmYCBzdHJ1Y3R1cmUuIE15IGdvYWwgaXMgdG8gdW5kZXJzdGFuZCB0aGUgYWxsb2NhdGlvbiwgY29weWluZywgYW5kIGluaXRpYWxpemF0aW9uIHByb2Nlc3NlcyBoYXBwZW5pbmcgd2l0aGluIHRoZSBgc2tiX2V4dF9hZGRgIGZ1bmN0aW9uLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUga2VybmVsIG1hbmFnZXMgdGhlc2UgZXh0ZW5zaW9ucywgYXMgdGhhdCBpcyBjcml0aWNhbCB0byBtYW5hZ2luZyBtZW1vcnkgd2l0aGluIHRoZSBrZXJuZWwuIEkgYW0gZ29pbmcgdG8gZm9jdXMgbXkgcmVhZGluZyBvbiB0aGF0IGFyZWEgb2YgdGhlIHNvdXJjZSBjb2RlLCBhcyB0aGF0IHdpbGwgZ2l2ZSBtZSB0aGUgaW5mb3JtYXRpb24gdGhhdCBJIG5lZWQuIFRoaXMga25vd2xlZGdlIHdpbGwgYmUgaW52YWx1YWJsZSBmb3Igb3B0aW1pemluZyBuZXR3b3JrIHBlcmZvcm1hbmNlIGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50LCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIGNvbXBsZXggcGFja2V0IG1hbmlwdWxhdGlvbnMuIExldCYjMzk7cyBzZWUgaG93IHRoZXNlIGV4dGVuc2lvbnMgZml0IGludG8gdGhlIGxhcmdlciBwaWN0dXJlIG9mIFNLQiBsaWZlY3ljbGUgbWFuYWdlbWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvY29yZS9za2J1ZmYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcxOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NzE5MDpcdC8qKlxuNzE5MTpcdCAqIHNrYl9leHRfYWRkIC0gYWxsb2NhdGUgc3BhY2UgZm9yIGdpdmVuIGV4dGVuc2lvbiwgQ09XIGlmIG5lZWRlZFxuNzE5MjpcdCAqIEBza2I6IGJ1ZmZlclxuNzE5MzpcdCAqIEBpZDogZXh0ZW5zaW9uIHRvIGFsbG9jYXRlIHNwYWNlIGZvclxuNzE5NDpcdCAqXG43MTk1Olx0ICogQWxsb2NhdGVzIGVub3VnaCBzcGFjZSBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvbi5cbjcxOTY6XHQgKiBJZiB0aGUgZXh0ZW5zaW9uIGlzIGFscmVhZHkgcHJlc2VudCwgYSBwb2ludGVyIHRvIHRoYXQgZXh0ZW5zaW9uXG43MTk3Olx0ICogaXMgcmV0dXJuZWQuXG43MTk4Olx0ICpcbjcxOTk6XHQgKiBJZiB0aGUgc2tiIHdhcyBjbG9uZWQsIENPVyBhcHBsaWVzIGFuZCB0aGUgcmV0dXJuZWQgbWVtb3J5IGNhbiBiZVxuNzIwMDpcdCAqIG1vZGlmaWVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGV4dGVuc2lvbiBzcGFjZSBvZiBjbG9uZXMgYnVmZmVycy5cbjcyMDE6XHQgKlxuNzIwMjpcdCAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgZXh0ZW5zaW9uIG9yIE5VTEwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLlxuNzIwMzpcdCAqL1xuNzIwNDpcdHZvaWQgKnNrYl9leHRfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZClcbjcyMDU6XHR7XG43MjA2Olx0XHRzdHJ1Y3Qgc2tiX2V4dCAqbmV3LCAqb2xkID0gTlVMTDtcbjcyMDc6XHRcdHVuc2lnbmVkIGludCBuZXdsZW4sIG5ld29mZjtcbjcyMDg6XHRcbjcyMDk6XHRcdGlmIChza2ItXHUwMDNlYWN0aXZlX2V4dGVuc2lvbnMpIHtcbjcyMTA6XHRcdFx0b2xkID0gc2tiLVx1MDAzZWV4dGVuc2lvbnM7XG43MjExOlx0XG43MjEyOlx0XHRcdG5ldyA9IHNrYl9leHRfbWF5YmVfY293KG9sZCwgc2tiLVx1MDAzZWFjdGl2ZV9leHRlbnNpb25zKTtcbjcyMTM6XHRcdFx0aWYgKCFuZXcpXG43MjE0Olx0XHRcdFx0cmV0dXJuIE5VTEw7XG43MjE1Olx0XG43MjE2Olx0XHRcdGlmIChfX3NrYl9leHRfZXhpc3QobmV3LCBpZCkpXG43MjE3Olx0XHRcdFx0Z290byBzZXRfYWN0aXZlO1xuNzIxODpcdFxuNzIxOTpcdFx0XHRuZXdvZmYgPSBuZXctXHUwMDNlY2h1bmtzO1xuNzIyMDpcdFx0fSBlbHNlIHtcbjcyMjE6XHRcdFx0bmV3b2ZmID0gU0tCX0VYVF9DSFVOS1NJWkVPRigqbmV3KTtcbjcyMjI6XHRcbjcyMjM6XHRcdFx0bmV3ID0gX19za2JfZXh0X2FsbG9jKEdGUF9BVE9NSUMpO1xuNzIyNDpcdFx0XHRpZiAoIW5ldylcbjcyMjU6XHRcdFx0XHRyZXR1cm4gTlVMTDtcbjcyMjY6XHRcdH1cbjcyMjc6XHRcbjcyMjg6XHRcdG5ld2xlbiA9IG5ld29mZiAmIzQzOyBza2JfZXh0X3R5cGVfbGVuW2lkXTtcbjcyMjk6XHRcdG5ldy1cdTAwM2VjaHVua3MgPSBuZXdsZW47XG43MjMwOlx0XHRuZXctXHUwMDNlb2Zmc2V0W2lkXSA9IG5ld29mZjtcbjcyMzE6XHRzZXRfYWN0aXZlOlxuNzIzMjpcdFx0c2tiLVx1MDAzZXNsb3dfZ3JvID0gMTtcbjcyMzM6XHRcdHNrYi1cdTAwM2VleHRlbnNpb25zID0gbmV3O1xuNzIzNDpcdFx0c2tiLVx1MDAzZWFjdGl2ZV9leHRlbnNpb25zIHw9IDEgXHUwMDNjXHUwMDNjIGlkO1xuNzIzNTpcdFx0cmV0dXJuIHNrYl9leHRfZ2V0X3B0cihuZXcsIGlkKTtcbjcyMzY6XHR9XG43MjM3Olx0RVhQT1JUX1NZTUJPTChza2JfZXh0X2FkZCk7XG43MjM4Olx0XG43MjM5Olx0I2lmZGVmIENPTkZJR19YRlJNXG43MjQwOlx0c3RhdGljIHZvaWQgc2tiX2V4dF9wdXRfc3Aoc3RydWN0IHNlY19wYXRoICpzcClcbjcyNDE6XHR7XG43MjQyOlx0XHR1bnNpZ25lZCBpbnQgaTtcbjcyNDM6XHRcbjcyNDQ6XHRcdGlmICghc3AtXHUwMDNlbGVuKVxuNzI0NTpcdFx0XHRyZXR1cm47XG43MjQ2Olx0XG43MjQ3Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzcC1cdTAwM2VsZW47IGkmIzQzOyYjNDM7KVxuNzI0ODpcdFx0XHR4ZnJtX3N0YXRlX3B1dChzcC1cdTAwM2V4dmVjW2ldKTtcbjcyNDk6XHRcdHNwLVx1MDAzZWxlbiA9IDA7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE1OjIzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ1MDExCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMzAyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIGBuZXQvY29yZS9maWx0ZXIuY2AgLSBTcGVjaWZpY2FsbHkgdGhlIEJQRiBFeHRlbnNpb24gSGFuZGxpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSW4gYG5ldC9jb3JlL2ZpbHRlci5jYCwgc3BlY2lmaWNhbGx5IGxvb2tpbmcgYXQgaG93IEJQRiBleHRlbnNpb25zIGFyZSBoYW5kbGVkIHdpdGhpbiB0aGUgYHNrYmAgKHNvY2tldCBidWZmZXIpIGNvbnRleHQuICBUaGUgY29kZSBzbmlwcGV0IGlzIHByZXR0eSBjbGVhciwgYnV0IGxldCYjMzk7cyBtYWtlIHN1cmUgd2UmIzM5O3JlIG9uIHRoZSBzYW1lIHBhZ2UuCgpGaXJzdCwgdGhlIGNvZGUgY2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgQlBGIGV4dGVuc2lvbi4gVGhlbiwgYSBmZXcgbGluZXMgbGF0ZXIsIHRoZSBjb2RlIGNhbGxzIGBza2JfZXh0X2FkZGAuIFRoaXMgaXMgdGhlIHBhcnQgSSB3YW50IHRvIGZvY3VzIG9uLiBTbywgaWYgYGNyZWF0ZWAgaXMgdHJ1ZSwgdGhlbiBgc2tiX2V4dF9hZGRgIGlzIGNhbGxlZC4gSWYgdGhhdCBoYXBwZW5zLCB0aGVuIGBleHRgIGlzIGFsbG9jYXRlZC4gVGhlIGxpbmUsIGBpZiAoIWV4aXN0cykgbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKWAgaXMgd2hhdCBJJiMzOTttIGhvbWluZyBpbiBvbi4KCklmIHRoZSBleHRlbnNpb24gKmRpZG4mIzM5O3QqIGV4aXN0IGJlZm9yZSwgYSBuZXcgb25lIGlzIGJlaW5nIGFkZGVkIHZpYSBgc2tiX2V4dF9hZGRgLCBhbmQgdGhlbiBgbWVtc2V0YCBpcyB1c2VkIHRvIHplcm8gb3V0IHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgbmV3IGV4dGVuc2lvbi4gVGhhdCYjMzk7cyBzdHJhaWdodGZvcndhcmQgZW5vdWdoOiBzZXR0aW5nIHVwIGEgY2xlYW4gc2xhdGUuCgpCdXQgdGhlIG51YW5jZSBsaWVzIGluIHRoZSAqb3RoZXIqIGNhc2U6IHdoZW4gdGhlIGV4dGVuc2lvbiAqZGlkKiBhbHJlYWR5IGV4aXN0IChgZXhpc3RzYCB3YXMgYHRydWVgKS4gIEluIHRoaXMgY2FzZSwgYHNrYl9leHRfYWRkYCBpcyAqc3RpbGwqIGNhbGxlZC4gQnV0IHdoYXQgc3RhdGUgaXMgYGV4dGAgaW4/IEl0IGNvdWxkIGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyLCBvciBwZXJoYXBzIGl0IHdhcyBhIGNvcHktb24td3JpdGUgKENPVykgc2l0dWF0aW9uIGZyb20gYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGV4dGVuc2lvbi4gU28sIGluIHRoZSBgZXhpc3RzID0gdHJ1ZWAgc2l0dWF0aW9uLCB0aGUgbWVtb3J5IGlzICpub3QqIHplcm9lZCBvdXQuIFRoaXMgbWVhbnMgaXQgY2FycmllcyB0aGUgcHJldmlvdXMgc3RhdGUuCgpMZXQmIzM5O3MgcXVpY2tseSBjaGVjayBgc2tiX2V4dF9tYXliZV9jb3dgIHRvIGJlIGNvbXBsZXRlbHkgc3VyZS4gVGhhdCBjb25maXJtcyBpdCwgdGhlIHByZXZpb3VzIHN0YXRlIGlzIG1haW50YWluZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE1OjI0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NrYl9leHRfbWF5YmVfY293JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9jb3JlL3NrYnVmZi5jPTcxMTc9c3RydWN0IHNrYl9leHQgKl9fc2tiX2V4dF9hbGxvYyhnZnBfdCBmbGFncylcbi0tXG5uZXQvY29yZS9za2J1ZmYuYy03MTI4LVxubmV0L2NvcmUvc2tidWZmLmM6NzEyOTpzdGF0aWMgc3RydWN0IHNrYl9leHQgKnNrYl9leHRfbWF5YmVfY293KHN0cnVjdCBza2JfZXh0ICpvbGQsXG5uZXQvY29yZS9za2J1ZmYuYy03MTMwLVx0XHRcdFx0XHQgdW5zaWduZWQgaW50IG9sZF9hY3RpdmUpXG4tLVxubmV0L2NvcmUvc2tidWZmLmM9NzIwND12b2lkICpza2JfZXh0X2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQpXG4tLVxubmV0L2NvcmUvc2tidWZmLmMtNzIxMS1cbm5ldC9jb3JlL3NrYnVmZi5jOjcyMTI6XHRcdG5ldyA9IHNrYl9leHRfbWF5YmVfY293KG9sZCwgc2tiLVx1MDAzZWFjdGl2ZV9leHRlbnNpb25zKTtcbm5ldC9jb3JlL3NrYnVmZi5jLTcyMTMtXHRcdGlmICghbmV3KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0NTk2NQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byBnZXQgYSBmaXJtIHVuZGVyc3RhbmRpbmcgb2YgYHNrYl9leHRfbWF5YmVfY293YCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIG5ldHdvcmtpbmcgY29yZS4gVG8gZG8gdGhhdCBwcm9wZXJseSwgSSYjMzk7bSBnb2luZyB0byBqdW1wIHN0cmFpZ2h0IGludG8gYG5ldC9jb3JlL3NrYnVmZi5jYCBhbmQgZm9jdXMgb24gbGluZXMgNzEyNSB0aHJvdWdoIDcxODUuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCB3aW5kb3cgaW50byB0aGUgZnVuY3Rpb24mIzM5O3MgaW50ZXJuYWwgd29ya2luZ3MuIEkga25vdyB0aGUgU0tCIChTb2NrZXQgQnVmZmVyKSBhcmNoaXRlY3R1cmUgcHJldHR5IHdlbGwsIGFuZCBJJiMzOTttIGludGVyZXN0ZWQgdG8gc2VlIGhvdyBpdCBoYW5kbGVzIHBvc3NpYmxlIENvcHktT24tV3JpdGUgKENPVykgc2NlbmFyaW9zIHdpdGggdGhlIGV4dGVuZGVkIFNLQiBkYXRhLiBJJiMzOTttIGV4cGVjdGluZyB0aGlzIHNlY3Rpb24gdG8gcmV2ZWFsIHRoZSBwcmVjaXNlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggZGF0YSBtaWdodCBiZSBkdXBsaWNhdGVkLCBhbmQgd2hhdCBjcml0ZXJpYSBkZXRlcm1pbmUgd2hlbiBhIGNvcHkgaXMgYWN0dWFsbHkgbmVjZXNzYXJ5IHZlcnN1cyB3aGVuIHRoZSBkYXRhIGNhbiBiZSBzYWZlbHkgc2hhcmVkLiBVbmRlcnN0YW5kaW5nIHRoZSBzdWJ0bGV0aWVzIG9mIENPVyBpbiB0aGlzIGNvbnRleHQgaXMgY3J1Y2lhbCBmb3Igb3B0aW1pemluZyBuZXR3b3JrIHBlcmZvcm1hbmNlIGFuZCBhdm9pZGluZyB1bm5lY2Vzc2FyeSBtZW1vcnkgb3ZlcmhlYWQsIHBhcnRpY3VsYXJseSBpbiBoaWdoLXRocm91Z2hwdXQgZW52aXJvbm1lbnRzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGV5JiMzOTtyZSBoYW5kbGluZyByZWZlcmVuY2UgY291bnRzLCBmbGFncywgYW5kIG1lbW9yeSBhbGxvY2F0aW9uLiBJdCYjMzk7cyBhIGtleSBwaWVjZSBvZiB0aGUgcHV6emxlIGZvciB1bmRlcnN0YW5kaW5nIGRhdGEgc2hhcmluZyBpbiB0aGUga2VybmVsJiMzOTtzIG5ldHdvcmsgc3RhY2suIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IGFuZCBleGFtaW5lIHRoZSBhY3R1YWwgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvY29yZS9za2J1ZmYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcxMjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NzEyNTpcdFxuNzEyNjpcdFx0cmV0dXJuIG5ldztcbjcxMjc6XHR9XG43MTI4Olx0XG43MTI5Olx0c3RhdGljIHN0cnVjdCBza2JfZXh0ICpza2JfZXh0X21heWJlX2NvdyhzdHJ1Y3Qgc2tiX2V4dCAqb2xkLFxuNzEzMDpcdFx0XHRcdFx0XHQgdW5zaWduZWQgaW50IG9sZF9hY3RpdmUpXG43MTMxOlx0e1xuNzEzMjpcdFx0c3RydWN0IHNrYl9leHQgKm5ldztcbjcxMzM6XHRcbjcxMzQ6XHRcdGlmIChyZWZjb3VudF9yZWFkKFx1MDAyNm9sZC1cdTAwM2VyZWZjbnQpID09IDEpXG43MTM1Olx0XHRcdHJldHVybiBvbGQ7XG43MTM2Olx0XG43MTM3Olx0XHRuZXcgPSBrbWVtX2NhY2hlX2FsbG9jKHNrYnVmZl9leHRfY2FjaGUsIEdGUF9BVE9NSUMpO1xuNzEzODpcdFx0aWYgKCFuZXcpXG43MTM5Olx0XHRcdHJldHVybiBOVUxMO1xuNzE0MDpcdFxuNzE0MTpcdFx0bWVtY3B5KG5ldywgb2xkLCBvbGQtXHUwMDNlY2h1bmtzICogU0tCX0VYVF9BTElHTl9WQUxVRSk7XG43MTQyOlx0XHRyZWZjb3VudF9zZXQoXHUwMDI2bmV3LVx1MDAzZXJlZmNudCwgMSk7XG43MTQzOlx0XG43MTQ0Olx0I2lmZGVmIENPTkZJR19YRlJNXG43MTQ1Olx0XHRpZiAob2xkX2FjdGl2ZSBcdTAwMjYgKDEgXHUwMDNjXHUwMDNjIFNLQl9FWFRfU0VDX1BBVEgpKSB7XG43MTQ2Olx0XHRcdHN0cnVjdCBzZWNfcGF0aCAqc3AgPSBza2JfZXh0X2dldF9wdHIob2xkLCBTS0JfRVhUX1NFQ19QQVRIKTtcbjcxNDc6XHRcdFx0dW5zaWduZWQgaW50IGk7XG43MTQ4Olx0XG43MTQ5Olx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHNwLVx1MDAzZWxlbjsgaSYjNDM7JiM0MzspXG43MTUwOlx0XHRcdFx0eGZybV9zdGF0ZV9ob2xkKHNwLVx1MDAzZXh2ZWNbaV0pO1xuNzE1MTpcdFx0fVxuNzE1MjpcdCNlbmRpZlxuNzE1MzpcdCNpZmRlZiBDT05GSUdfTUNUUF9GTE9XU1xuNzE1NDpcdFx0aWYgKG9sZF9hY3RpdmUgXHUwMDI2ICgxIFx1MDAzY1x1MDAzYyBTS0JfRVhUX01DVFApKSB7XG43MTU1Olx0XHRcdHN0cnVjdCBtY3RwX2Zsb3cgKmZsb3cgPSBza2JfZXh0X2dldF9wdHIob2xkLCBTS0JfRVhUX01DVFApO1xuNzE1NjpcdFxuNzE1NzpcdFx0XHRpZiAoZmxvdy1cdTAwM2VrZXkpXG43MTU4Olx0XHRcdFx0cmVmY291bnRfaW5jKFx1MDAyNmZsb3ctXHUwMDNla2V5LVx1MDAzZXJlZnMpO1xuNzE1OTpcdFx0fVxuNzE2MDpcdCNlbmRpZlxuNzE2MTpcdFx0X19za2JfZXh0X3B1dChvbGQpO1xuNzE2MjpcdFx0cmV0dXJuIG5ldztcbjcxNjM6XHR9XG43MTY0Olx0XG43MTY1Olx0LyoqXG43MTY2Olx0ICogX19za2JfZXh0X3NldCAtIGF0dGFjaCB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbiBzdG9yYWdlIHRvIHRoaXMgc2tiXG43MTY3Olx0ICogQHNrYjogYnVmZmVyXG43MTY4Olx0ICogQGlkOiBleHRlbnNpb24gaWRcbjcxNjk6XHQgKiBAZXh0OiBleHRlbnNpb24gc3RvcmFnZSBwcmV2aW91c2x5IGFsbG9jYXRlZCB2aWEgX19za2JfZXh0X2FsbG9jKClcbjcxNzA6XHQgKlxuNzE3MTpcdCAqIEV4aXN0aW5nIGV4dGVuc2lvbnMsIGlmIGFueSwgYXJlIGNsZWFyZWQuXG43MTcyOlx0ICpcbjcxNzM6XHQgKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBleHRlbnNpb24uXG43MTc0Olx0ICovXG43MTc1Olx0dm9pZCAqX19za2JfZXh0X3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQsXG43MTc2Olx0XHRcdCAgICBzdHJ1Y3Qgc2tiX2V4dCAqZXh0KVxuNzE3NzpcdHtcbjcxNzg6XHRcdHVuc2lnbmVkIGludCBuZXdsZW4sIG5ld29mZiA9IFNLQl9FWFRfQ0hVTktTSVpFT0YoKmV4dCk7XG43MTc5Olx0XG43MTgwOlx0XHRza2JfZXh0X3B1dChza2IpO1xuNzE4MTpcdFx0bmV3bGVuID0gbmV3b2ZmICYjNDM7IHNrYl9leHRfdHlwZV9sZW5baWRdO1xuNzE4MjpcdFx0ZXh0LVx1MDAzZWNodW5rcyA9IG5ld2xlbjtcbjcxODM6XHRcdGV4dC1cdTAwM2VvZmZzZXRbaWRdID0gbmV3b2ZmO1xuNzE4NDpcdFx0c2tiLVx1MDAzZWV4dGVuc2lvbnMgPSBleHQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE1OjI0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3MTk3CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogOTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgY29uc2lkZXJpbmcgbXkgZXhwZXJ0aXNlOgoKKipDaGVja2luZyB0aGUgRHlucHRyIE9wZXJhdGlvbnMgYW5kIFZlcmlmaWVyIEltcGFjdHMqKgoKUmlnaHQsIGxldCYjMzk7cyBkaXZlIGluLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBkeW5wdHIgb3BlcmF0aW9ucyBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkLCBwYXJ0aWN1bGFybHkgaW4gbGlnaHQgb2YgdGhlIHZlcmlmaWVyIGNoYW5nZXMgd2UmIzM5O3ZlIGJlZW4gc2VlaW5nLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IGJ5IHJldmlld2luZyB0aGUgY29yZSBmdW5jdGlvbnMuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiBob3cgdGhlIGR5bmFtaWMgcG9pbnRlciBtZWNoYW5pc20sIGBicGZfZHlucHRyYCwgaXMgaW5pdGlhbGl6ZWQsIGFuZCBob3cgaXRzIHNpemUgaXMgc3Vic2VxdWVudGx5IGNoZWNrZWQuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgY2FsbCBzZXF1ZW5jZToKCmBicGZfZHlucHRyX2luaXQocHRyLCBza2IsIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhULCAwLCBzaXplKTtgCmFuZApgYnBmX2R5bnB0cl9jaGVja19zaXplKHU2NCBzaXplKTtgCgpJJiMzOTtsbCBiZSBzcGVjaWZpY2FsbHkgbG9va2luZyBhdCB0aGUgYXJndW1lbnRzIGhlcmUgYW5kIHdoYXQgdGhleSYjMzk7cmUgZG9pbmcgd2l0aCB0aGUgc2tiIGV4dGVuc2lvbnMuIFdoYXQmIzM5O3MgdGhlIGNvbnRleHQsIHRoZSBpbXBsaWNhdGlvbnMgZm9yIHNlY3VyaXR5LCBhbmQgZWZmaWNpZW5jeT8gVGhlbiwgSSByZWFsbHkgbmVlZCB0byBkcmlsbCBkb3duIGludG8gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgYGJwZl9keW5wdHJfaW5pdGAuIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIHJ1YmJlciBtZWV0cyB0aGUgcm9hZCwgc28gdG8gc3BlYWsuIFVuZGVyc3RhbmRpbmcgKmhvdyogaXQmIzM5O3MgZG9uZSB3aWxsIHJldmVhbCB0aGUgc3VidGxldGllcyBvZiBpdHMgb3BlcmF0aW9uIGFuZCBhbnkgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy4gVGhhdCB3aWxsIGdpdmUgbWUgYSBjbGVhciBwaWN0dXJlIG9mIGhvdyB0aGVzZSBjaGFuZ2VzIGFyZSBpbXBhY3RpbmcgdGhlIG92ZXJhbGwgQlBGIGxhbmRzY2FwZSBhbmQgaG93IHRvIGhhbmRsZSBpdCBpbiBmdXR1cmUgaXRlcmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnBmX2R5bnB0cl9pbml0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvYnBmLmg9MzIxNz12b2lkIG5vdHJhY2UgYnBmX3Byb2dfaW5jX21pc3Nlc19jb3VudGVyKHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XG5pbmNsdWRlL2xpbnV4L2JwZi5oLTMyMTgtXG5pbmNsdWRlL2xpbnV4L2JwZi5oOjMyMTk6dm9pZCBicGZfZHlucHRyX2luaXQoc3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyLCB2b2lkICpkYXRhLFxuaW5jbHVkZS9saW51eC9icGYuaC0zMjIwLVx0XHQgICAgIGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGUsIHUzMiBvZmZzZXQsIHUzMiBzaXplKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2JwZi5oPTM1NDY9c3RhdGljIGlubGluZSB2b2lkIGJwZl9jZ3JwX3N0b3JhZ2VfZnJlZShzdHJ1Y3QgY2dyb3VwICpjZ3JvdXApXG4tLVxuaW5jbHVkZS9saW51eC9icGYuaC0zNTQ5LVxuaW5jbHVkZS9saW51eC9icGYuaDozNTUwOnN0YXRpYyBpbmxpbmUgdm9pZCBicGZfZHlucHRyX2luaXQoc3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyLCB2b2lkICpkYXRhLFxuaW5jbHVkZS9saW51eC9icGYuaC0zNTUxLVx0XHRcdFx0ICAgZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZSwgdTMyIG9mZnNldCwgdTMyIHNpemUpXG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmM9MTgyOD1zdGF0aWMgaW50IGJwZl9maWxlX2ZldGNoX2J5dGVzKHN0cnVjdCBicGZfZHlucHRyX2ZpbGVfaW1wbCAqZGYsIHU2NCBvZmZzZXQsIHZvaWQgKmJ1ZiwgdTY0IGxlbilcbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy0xODQ2LVxua2VybmVsL2JwZi9oZWxwZXJzLmM6MTg0Nzp2b2lkIGJwZl9keW5wdHJfaW5pdChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICpwdHIsIHZvaWQgKmRhdGEsXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy0xODQ4LVx0XHQgICAgIGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGUsIHUzMiBvZmZzZXQsIHUzMiBzaXplKVxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jPTE4NjE9QlBGX0NBTExfNChicGZfZHlucHRyX2Zyb21fbWVtLCB2b2lkICosIGRhdGEsIHU2NCwgc2l6ZSwgdTY0LCBmbGFncywgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqLCBwdHIpXG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmMtMTg3Ni1cbmtlcm5lbC9icGYvaGVscGVycy5jOjE4Nzc6XHRicGZfZHlucHRyX2luaXQocHRyLCBkYXRhLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsIHNpemUpO1xua2VybmVsL2JwZi9oZWxwZXJzLmMtMTg3OC1cbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYz00Njk0PXN0YXRpYyBpbnQgbWFrZV9maWxlX2R5bnB0cihzdHJ1Y3QgZmlsZSAqZmlsZSwgdTMyIGZsYWdzLCBib29sIG1heV9zbGVlcCxcbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00NzEyLVx0ZnJlYWRlcl9pbml0X2Zyb21fZmlsZShcdTAwMjZzdGF0ZS1cdTAwM2VmcmVhZGVyLCBOVUxMLCAwLCBmaWxlLCBtYXlfc2xlZXApO1xua2VybmVsL2JwZi9oZWxwZXJzLmM6NDcxMzpcdGJwZl9keW5wdHJfaW5pdChwdHIsIHN0YXRlLCBCUEZfRFlOUFRSX1RZUEVfRklMRSwgMCwgMCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00NzE0LVx0YnBmX2R5bnB0cl9zZXRfcmRvbmx5KHB0cik7XG4tLVxua2VybmVsL2JwZi9yaW5nYnVmLmM9NjcwPUJQRl9DQUxMXzQoYnBmX3JpbmdidWZfcmVzZXJ2ZV9keW5wdHIsIHN0cnVjdCBicGZfbWFwICosIG1hcCwgdTMyLCBzaXplLCB1NjQsIGZsYWdzLFxuLS1cbmtlcm5lbC9icGYvcmluZ2J1Zi5jLTY5NS1cbmtlcm5lbC9icGYvcmluZ2J1Zi5jOjY5NjpcdGJwZl9keW5wdHJfaW5pdChwdHIsIHNhbXBsZSwgQlBGX0RZTlBUUl9UWVBFX1JJTkdCVUYsIDAsIHNpemUpO1xua2VybmVsL2JwZi9yaW5nYnVmLmMtNjk3LVxuLS1cbmtlcm5lbC9icGYvcmluZ2J1Zi5jPTgxNz1CUEZfQ0FMTF80KGJwZl91c2VyX3JpbmdidWZfZHJhaW4sIHN0cnVjdCBicGZfbWFwICosIG1hcCxcbi0tXG5rZXJuZWwvYnBmL3JpbmdidWYuYy04NTMtXG5rZXJuZWwvYnBmL3JpbmdidWYuYzo4NTQ6XHRcdGJwZl9keW5wdHJfaW5pdChcdTAwMjZkeW5wdHIsIHNhbXBsZSwgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLCBzaXplKTtcbmtlcm5lbC9icGYvcmluZ2J1Zi5jLTg1NS1cdFx0cmV0ID0gY2FsbGJhY2soKHVpbnRwdHJfdClcdTAwMjZkeW5wdHIsICh1aW50cHRyX3QpY2FsbGJhY2tfY3R4LCAwLCAwLCAwKTtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjA4ODA9c3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTIwOTc1LVxua2VybmVsL2JwZi92ZXJpZmllci5jOjIwOTc2Olx0YnBmX2R5bnB0cl9pbml0KFx1MDAyNmRhdGFfcHRyLCBkYXRhLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsIGRhdGFfc3opO1xua2VybmVsL2JwZi92ZXJpZmllci5jOjIwOTc3Olx0YnBmX2R5bnB0cl9pbml0KFx1MDAyNnNpZ19wdHIsIHNpZywgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLFxua2VybmVsL2JwZi92ZXJpZmllci5jLTIwOTc4LVx0XHRcdGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xuLS1cbm5ldC9jb3JlL2ZpbHRlci5jPTEyNDcwPV9fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2Zyb21fc2tiKHN0cnVjdCBfX3NrX2J1ZmYgKnMsIHU2NCBmbGFncyxcbi0tXG5uZXQvY29yZS9maWx0ZXIuYy0xMjQ4MC1cbm5ldC9jb3JlL2ZpbHRlci5jOjEyNDgxOlx0YnBmX2R5bnB0cl9pbml0KHB0ciwgc2tiLCBCUEZfRFlOUFRSX1RZUEVfU0tCLCAwLCBza2ItXHUwMDNlbGVuKTtcbm5ldC9jb3JlL2ZpbHRlci5jLTEyNDgyLVxuLS1cbm5ldC9jb3JlL2ZpbHRlci5jPTEyNTA5PV9fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dChzdHJ1Y3QgX19za19idWZmICpza2JfLCB1MzIgc2l6ZSxcbi0tXG5uZXQvY29yZS9maWx0ZXIuYy0xMjU0OC1vdXQ6XG5uZXQvY29yZS9maWx0ZXIuYzoxMjU0OTpcdGJwZl9keW5wdHJfaW5pdChwdHIsIHNrYiwgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQsIDAsIHNpemUpO1xubmV0L2NvcmUvZmlsdGVyLmMtMTI1NTAtXHRpZiAoIWNyZWF0ZSlcbi0tXG5uZXQvY29yZS9maWx0ZXIuYz0xMjU3Mz1fX2JwZl9rZnVuYyBpbnQgYnBmX2R5bnB0cl9mcm9tX3NrYl9tZXRhKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYl8sIHU2NCBmbGFncyxcbi0tXG5uZXQvY29yZS9maWx0ZXIuYy0xMjU4My1cbm5ldC9jb3JlL2ZpbHRlci5jOjEyNTg0Olx0YnBmX2R5bnB0cl9pbml0KHB0ciwgc2tiLCBCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEEsIDAsIHNrYl9tZXRhZGF0YV9sZW4oc2tiKSk7XG5uZXQvY29yZS9maWx0ZXIuYy0xMjU4NS1cbi0tXG5uZXQvY29yZS9maWx0ZXIuYz0xMjU4OT1fX2JwZl9rZnVuYyBpbnQgYnBmX2R5bnB0cl9mcm9tX3hkcChzdHJ1Y3QgeGRwX21kICp4LCB1NjQgZmxhZ3MsXG4tLVxubmV0L2NvcmUvZmlsdGVyLmMtMTI1OTktXG5uZXQvY29yZS9maWx0ZXIuYzoxMjYwMDpcdGJwZl9keW5wdHJfaW5pdChwdHIsIHhkcCwgQlBGX0RZTlBUUl9UWVBFX1hEUCwgMCwgeGRwX2dldF9idWZmX2xlbih4ZHApKTtcbm5ldC9jb3JlL2ZpbHRlci5jLTEyNjAxLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0OTMxNAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDMzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggaXQ6CgoqKkRpdmluZyBpbnRvIHRoZSBCUEYgRHluYW1pYyBQb2ludGVyIEluaXRpYWxpemF0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSYjMzk7bSBnb2luZyB0byBqdW1wIGludG8gdGhlIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AgZmlsZSBhbmQgemVybyBpbiBvbiBsaW5lIDE4NDcuIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIGBicGZfZHlucHRyX2luaXRgIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCBpdCYjMzk7cyB0aW1lIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiBob3cgZHluYW1pYyBwb2ludGVycyBnZXQgaW5pdGlhbGl6ZWQgaW4gdGhlIEJQRiB3b3JsZC4gSSB3YW50IHRvIHRob3JvdWdobHkgdW5kZXJzdGFuZCBob3cgdGhpcyBmdW5jdGlvbiBvcGVyYXRlcyBpbiBvcmRlciB0byBiZXR0ZXIgZGVidWcgaXNzdWVzIGFuZCB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgaXQgaGFzLiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIG9mIGR5bmFtaWMgbWVtb3J5IG1hbmFnZW1lbnQsIGF0IGxlYXN0IHRoZSBpbml0aWFsaXphdGlvbiBzdGFnZSwgcmVzaWRlcy4gSSBuZWVkIGEgY2xlYXIgbWVudGFsIHBpY3R1cmUgb2Ygd2hhdCYjMzk7cyBoYXBwZW5pbmcgdW5kZXIgdGhlIGhvb2Qgd2hlbiBhIGR5bmFtaWMgcG9pbnRlciBpcyBmaXJzdCBicm91Z2h0IHRvIGxpZmUgd2l0aGluIGEgQlBGIHByb2dyYW0uIFRpbWUgdG8gc2VlIHdoYXQmIzM5O3Mgd2hhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMTU6MjQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2hlbHBlcnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE4NDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTg0NTpcdH1cbjE4NDY6XHRcbjE4NDc6XHR2b2lkIGJwZl9keW5wdHJfaW5pdChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICpwdHIsIHZvaWQgKmRhdGEsXG4xODQ4Olx0XHRcdCAgICAgZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZSwgdTMyIG9mZnNldCwgdTMyIHNpemUpXG4xODQ5Olx0e1xuMTg1MDpcdFx0cHRyLVx1MDAzZWRhdGEgPSBkYXRhO1xuMTg1MTpcdFx0cHRyLVx1MDAzZW9mZnNldCA9IG9mZnNldDtcbjE4NTI6XHRcdHB0ci1cdTAwM2VzaXplID0gc2l6ZTtcbjE4NTM6XHRcdGJwZl9keW5wdHJfc2V0X3R5cGUocHRyLCB0eXBlKTtcbjE4NTQ6XHR9XG4xODU1Olx0XG4xODU2Olx0dm9pZCBicGZfZHlucHRyX3NldF9udWxsKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0cilcbjE4NTc6XHR7XG4xODU4Olx0XHRtZW1zZXQocHRyLCAwLCBzaXplb2YoKnB0cikpO1xuMTg1OTpcdH1cbjE4NjA6XHRcbjE4NjE6XHRCUEZfQ0FMTF80KGJwZl9keW5wdHJfZnJvbV9tZW0sIHZvaWQgKiwgZGF0YSwgdTY0LCBzaXplLCB1NjQsIGZsYWdzLCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICosIHB0cilcbjE4NjI6XHR7XG4xODYzOlx0XHRpbnQgZXJyO1xuMTg2NDpcdFxuMTg2NTpcdFx0QlRGX1RZUEVfRU1JVChzdHJ1Y3QgYnBmX2R5bnB0cik7XG4xODY2Olx0XG4xODY3Olx0XHRlcnIgPSBicGZfZHlucHRyX2NoZWNrX3NpemUoc2l6ZSk7XG4xODY4Olx0XHRpZiAoZXJyKVxuMTg2OTpcdFx0XHRnb3RvIGVycm9yO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0OTk1OAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIER5bnB0ciBTbGljZSBhbmQgQm91bmQgQ2hlY2tzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gaG93IGBkeW5wdHJgIHNsaWNlIGFuZCByZWFkL3dyaXRlIGJvdW5kcyBjaGVja3MgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBGaXJzdCwgSSYjMzk7bGwgc3RhcnQgYnkgbG9va2luZyBhdCBga2VybmVsL2JwZi9oZWxwZXJzLmNgLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gaW50ZXJlc3RlZCBpbiB0aGUgYF9fYnBmX2R5bnB0cl9yZWFkYCBmdW5jdGlvbi4gSSBzZWUgaXQgaGFuZGxlcyB0aGUgYEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUYCBjYXNlOgoKYGBgYwoJY2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDoKCQlyZXR1cm4gX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzKHNyYy0mZ3Q7ZGF0YSwgc3JjLSZndDtvZmZzZXQgJiM0Mzsgb2Zmc2V0LCBkc3QsIGxlbik7CmBgYAoKUmlnaHQsIHNvIGBzcmNgIGFwcGVhcnMgdG8gYmUgdGhlIHNvdXJjZSwgYW5kIGl0JiMzOTtzIGJlaW5nIGNoZWNrZWQgaW4gYGJwZl9keW5wdHJfcmVhZGAuIEkgc2hvdWxkIHByb2JhYmx5IGxvb2sgYXQgdGhhdCBmdW5jdGlvbiwgdG9vLiBJJiMzOTtsbCB0YWtlIGEgbG9vayBhdCBga2VybmVsL2JwZi9oZWxwZXJzLmNgIGFuZCBmb2N1cyBvbiB0aGUgbGluZXMgYXJvdW5kIDE5MTAgdG8gMTk2MC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgZGV0YWlscyBvZiB0aGUgYm91bmRzIGNoZWNraW5nIGxvZ2ljLiBUaW1lIHRvIGRpZyBpbiBhbmQgc2VlIGhvdyB0aGlzIGFsbCBmaXRzIHRvZ2V0aGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvaGVscGVycy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTkxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0NQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTE1Olx0XHRcdCAqIGNvcHkgdGhlIGRhdGEuIEUuZy4gYnBmX2R5bnB0cl9mcm9tX21lbSBtYXkgY3JlYXRlIHR3byBkeW5wdHJcbjE5MTY6XHRcdFx0ICogcG9pbnRpbmcgdG8gb3ZlcmxhcHBpbmcgUFRSX1RPX01BUF9WQUxVRSByZWdpb25zLlxuMTkxNzpcdFx0XHQgKi9cbjE5MTg6XHRcdFx0bWVtbW92ZShkc3QsIHNyYy1cdTAwM2VkYXRhICYjNDM7IHNyYy1cdTAwM2VvZmZzZXQgJiM0Mzsgb2Zmc2V0LCBsZW4pO1xuMTkxOTpcdFx0XHRyZXR1cm4gMDtcbjE5MjA6XHRcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQjpcbjE5MjE6XHRcdFx0cmV0dXJuIF9fYnBmX3NrYl9sb2FkX2J5dGVzKHNyYy1cdTAwM2VkYXRhLCBzcmMtXHUwMDNlb2Zmc2V0ICYjNDM7IG9mZnNldCwgZHN0LCBsZW4pO1xuMTkyMjpcdFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfWERQOlxuMTkyMzpcdFx0XHRyZXR1cm4gX19icGZfeGRwX2xvYWRfYnl0ZXMoc3JjLVx1MDAzZWRhdGEsIHNyYy1cdTAwM2VvZmZzZXQgJiM0Mzsgb2Zmc2V0LCBkc3QsIGxlbik7XG4xOTI0Olx0XHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQTpcbjE5MjU6XHRcdFx0bWVtbW92ZShkc3QsIGJwZl9za2JfbWV0YV9wb2ludGVyKHNyYy1cdTAwM2VkYXRhLCBzcmMtXHUwMDNlb2Zmc2V0ICYjNDM7IG9mZnNldCksIGxlbik7XG4xOTI2Olx0XHRcdHJldHVybiAwO1xuMTkyNzpcdFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfRklMRTpcbjE5Mjg6XHRcdFx0cmV0dXJuIGJwZl9maWxlX2ZldGNoX2J5dGVzKHNyYy1cdTAwM2VkYXRhLCBvZmZzZXQsIGRzdCwgbGVuKTtcbjE5Mjk6XHRcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQ6XG4xOTMwOlx0XHRcdHJldHVybiBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoc3JjLVx1MDAzZWRhdGEsIHNyYy1cdTAwM2VvZmZzZXQgJiM0Mzsgb2Zmc2V0LCBkc3QsIGxlbik7XG4xOTMxOlx0XHRkZWZhdWx0OlxuMTkzMjpcdFx0XHRXQVJOX09OQ0UodHJ1ZSwgXCYjMzQ7YnBmX2R5bnB0cl9yZWFkOiB1bmtub3duIGR5bnB0ciB0eXBlICVkXFxuXCYjMzQ7LCB0eXBlKTtcbjE5MzM6XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4xOTM0Olx0XHR9XG4xOTM1Olx0fVxuMTkzNjpcdFxuMTkzNzpcdEJQRl9DQUxMXzUoYnBmX2R5bnB0cl9yZWFkLCB2b2lkICosIGRzdCwgdTY0LCBsZW4sIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKiwgc3JjLFxuMTkzODpcdFx0ICAgdTY0LCBvZmZzZXQsIHU2NCwgZmxhZ3MpXG4xOTM5Olx0e1xuMTk0MDpcdFx0cmV0dXJuIF9fYnBmX2R5bnB0cl9yZWFkKGRzdCwgbGVuLCBzcmMsIG9mZnNldCwgZmxhZ3MpO1xuMTk0MTpcdH1cbjE5NDI6XHRcbjE5NDM6XHRzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9keW5wdHJfcmVhZF9wcm90byA9IHtcbjE5NDQ6XHRcdC5mdW5jXHRcdD0gYnBmX2R5bnB0cl9yZWFkLFxuMTk0NTpcdFx0LmdwbF9vbmx5XHQ9IGZhbHNlLFxuMTk0NjpcdFx0LnJldF90eXBlXHQ9IFJFVF9JTlRFR0VSLFxuMTk0NzpcdFx0LmFyZzFfdHlwZVx0PSBBUkdfUFRSX1RPX1VOSU5JVF9NRU0sXG4xOTQ4Olx0XHQuYXJnMl90eXBlXHQ9IEFSR19NRU1fU0laRV9PUl9aRVJPLFxuMTk0OTpcdFx0LmFyZzNfdHlwZVx0PSBBUkdfUFRSX1RPX0RZTlBUUixcbjE5NTA6XHRcdC5hcmc0X3R5cGVcdD0gQVJHX0FOWVRISU5HLFxuMTk1MTpcdFx0LmFyZzVfdHlwZVx0PSBBUkdfQU5ZVEhJTkcsXG4xOTUyOlx0fTtcbjE5NTM6XHRcbjE5NTQ6XHRpbnQgX19icGZfZHlucHRyX3dyaXRlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKmRzdCwgdTY0IG9mZnNldCwgdm9pZCAqc3JjLFxuMTk1NTpcdFx0XHQgICAgICAgdTY0IGxlbiwgdTY0IGZsYWdzKVxuMTk1NjpcdHtcbjE5NTc6XHRcdGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGU7XG4xOTU4Olx0XHRpbnQgZXJyO1xuMTk1OTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MTI2NAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYGJwZl9keW5wdHJfcmVhZGAgZm9yIEJvdW5kYXJ5IENvbmRpdGlvbnMqKgoKT2theSwgYmVmb3JlIEkgZ28gYW55IGZ1cnRoZXIgZG93biB0aGlzIHJhYmJpdCBob2xlLCBJIG5lZWQgdG8gcmV2aXNpdCBgYnBmX2R5bnB0cl9yZWFkYC4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoZXkmIzM5O3JlIGhhbmRsaW5nIGJvdW5kYXJ5IGNoZWNrcyB3aGVuIHJlYWRpbmcgYW5kIHdyaXRpbmcgd2l0aCBkeW5hbWljIHBvaW50ZXJzLiBJIHJlbWVtYmVyIHNlZWluZyBzb21ldGhpbmcgaW4gdGhhdCBmdW5jdGlvbiB0aGF0IEkgbmVlZCB0byBjbGFyaWZ5IGFuZCBjb25maXJtLiBMZXQmIzM5O3Mgc3RhcnQgYnkgY2hlY2tpbmcgdGhlIGNvZGUgYmVmb3JlIGxpbmUgMTkxNSBhbmQgZW5zdXJlIHRoZXJlIGFyZSBubyBzdXJwcmlzZXMgb3IgYXNzdW1wdGlvbnMgYmVpbmcgbWFkZSBpbiB0aGlzIHBhcnQgb2YgdGhlIGJwZiBjb2RlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvaGVscGVycy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTg5NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxODk1Olx0XG4xODk2Olx0c3RhdGljIGludCBfX2JwZl9keW5wdHJfcmVhZCh2b2lkICpkc3QsIHU2NCBsZW4sIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnNyYyxcbjE4OTc6XHRcdFx0XHQgICAgIHU2NCBvZmZzZXQsIHU2NCBmbGFncylcbjE4OTg6XHR7XG4xODk5Olx0XHRlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlO1xuMTkwMDpcdFx0aW50IGVycjtcbjE5MDE6XHRcbjE5MDI6XHRcdGlmICghc3JjLVx1MDAzZWRhdGEgfHwgZmxhZ3MpXG4xOTAzOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuMTkwNDpcdFxuMTkwNTpcdFx0ZXJyID0gYnBmX2R5bnB0cl9jaGVja19vZmZfbGVuKHNyYywgb2Zmc2V0LCBsZW4pO1xuMTkwNjpcdFx0aWYgKGVycilcbjE5MDc6XHRcdFx0cmV0dXJuIGVycjtcbjE5MDg6XHRcbjE5MDk6XHRcdHR5cGUgPSBicGZfZHlucHRyX2dldF90eXBlKHNyYyk7XG4xOTEwOlx0XG4xOTExOlx0XHRzd2l0Y2ggKHR5cGUpIHtcbjE5MTI6XHRcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMOlxuMTkxMzpcdFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfUklOR0JVRjpcbjE5MTQ6XHRcdFx0LyogU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYXkgcG9zc2libHkgb3ZlcmxhcCwgaGVuY2UgdXNlIG1lbW1vdmUgdG9cbjE5MTU6XHRcdFx0ICogY29weSB0aGUgZGF0YS4gRS5nLiBicGZfZHlucHRyX2Zyb21fbWVtIG1heSBjcmVhdGUgdHdvIGR5bnB0clxuMTkxNjpcdFx0XHQgKiBwb2ludGluZyB0byBvdmVybGFwcGluZyBQVFJfVE9fTUFQX1ZBTFVFIHJlZ2lvbnMuXG4xOTE3Olx0XHRcdCAqL1xuMTkxODpcdFx0XHRtZW1tb3ZlKGRzdCwgc3JjLVx1MDAzZWRhdGEgJiM0Mzsgc3JjLVx1MDAzZW9mZnNldCAmIzQzOyBvZmZzZXQsIGxlbik7XG4xOTE5Olx0XHRcdHJldHVybiAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAxNToyNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MTg2MwoJCQkJCQkJb3V0cHV0OiAzNjUKCQkJCQkJCXRob3VnaHRzOiAxNjg4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFzc2Vzc21lbnQ6IE5vIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJlYWQvTGVhayBEZXRlY3RlZCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIHRocm91Z2ggdGhpcyBjb2RlIHdpdGggYSBmaW5lLXRvb3RoIGNvbWIsIGZvY3VzaW5nIHNwZWNpZmljYWxseSBvbiB3aGV0aGVyIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gTXkgYXNzZXNzbWVudCBpcyB0aGF0IGl0IGRvZXNuJiMzOTt0LgoKRmlyc3QsIEkgZXhhbWluZWQgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eTogdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgQlBGIGR5bnB0ciBpbnRlcmZhY2UgdG8gd29yayB3aXRoIGBza2JfZXh0YCBleHRlbnNpb25zLiBUaGUga2V5IGlzIGluIGhvdyB0aGVzZSBgYnBmX3NrYl9leHRgIHN0cnVjdHVyZXMgYXJlIGhhbmRsZWQuIEluIHBhcnRpY3VsYXIsIGBicGZfZHlucHRyX2Zyb21fc2tiX2V4dGAsIHdoZXJlIHRoZXNlIGFyZSBjcmVhdGVkLCBjYWxscyBgbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKWAgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIG5ld2x5IGFsbG9jYXRlZC4gVGhpcyB6ZXJvLWluaXRpYWxpemVzIHRoZSBkeW5wdHImIzM5O3MgYnVmZmVyLiBJIGNoZWNrZWQsIGFuZCB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSBpcyB2YWxpZGF0ZWQgdG8gYmUgdGhlIHNpemUgb2YgdGhlIGFycmF5IGBleHQtJmd0O2J1ZmAgd2hpY2ggaXMgZGVmaW5lZCBhcyBgQ09ORklHX0JQRl9TS0JfRVhUX1NJWkVgLCBzbyBubyBvdmVyZmxvd3MgdGhlcmUuCgpJIHRoZW4gbG9va2VkIGZvciBhbnkgY2FzZXMgd2hlcmUgZXhpc3RpbmcgZXh0ZW5zaW9ucyBjb3VsZCBsZWF2ZSB1bmluaXRpYWxpemVkIG1lbW9yeSwgb3Igd2hlcmUgdGhpcyBwYXRjaCBtaWdodCBpbnRyb2R1Y2UgYSBwYXRoIHRoYXQgcmVhZHMgdW5pbml0aWFsaXplZCBkYXRhLiBTcGVjaWZpY2FsbHksIEkgY2hlY2tlZCBgc2tiX2V4dF9zY3J1YmAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLiBgc2tiX2V4dF9zY3J1YmAgY2xlYW5zIHVwIGV4dGVuc2lvbnMsIGFuZCBteSBhbmFseXNpcyBjb25maXJtZWQgdGhhdCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBgYnBmX2R5bnB0cl9zZXRfbnVsbCgpYCBpcyBhbHNvIGV4cGxpY2l0bHkgY2FsbGVkIG9uIGVycm9yIHBhdGhzLgoKSSBtZXRob2RpY2FsbHkgbG9va2VkIGZvciBmb3VyIHBvdGVudGlhbCByaXNrIGNhdGVnb3JpZXMgdGhhdCBjb3VsZCBsZWFkIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGxlYWtzOgoKMS4gICoqS2VybmVsLXRvLVVzZXIgU3BhY2UgSW5mb3JtYXRpb24gTGVhazoqKiBJIGNoZWNrZWQgdGhlIHN0cnVjdHVyZXMgZ29pbmcgdG8gdXNlcnNwYWNlICh2aWEgYGNvcHlfdG9fdXNlcmAsIGBwdXRfdXNlcmAsIG5ldGxpbmssIGlvY3RsLCBldGMuKS4gSSBmb3VuZCBubyBpbnN0YW5jZXMgd2hlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgZnJvbSB0aGUgYGJwZl9za2JfZXh0YCBpcyBsZWFrZWQuIFRoZSBkeW5wdHIgYnVmZmVycyBhcmUgYWx3YXlzIHplcm9lZCBvbiBjcmVhdGlvbiwgYW5kIGR5bnB0cnMgYXJlIG51bGxlZCBvbiBlcnJvci4KMi4gICoqQ29uZGl0aW9uYWwgTG9naWMgRGVwZW5kZW50IG9uIFVuaW5pdGlhbGl6ZWQgVmFyaWFibGVzOioqIEkgbWFkZSBzdXJlIHRoYXQgY29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoZXMgZG9uJiMzOTt0IGRlcGVuZCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gVGhpcyBwYXRjaCBpbml0aWFsaXplcyBhbGwgc3VjaCB2YXJpYWJsZXMgKGBleGlzdHNgLCBgY3JlYXRlYCwgYGVycmAsIGBzaXplYCwgZXRjLikgYmVmb3JlIHVzaW5nIHRoZW0uCjMuICAqKlVuaW5pdGlhbGl6ZWQgRmllbGRzIGluIENvbXBsZXggRGF0YSBTdHJ1Y3R1cmVzOioqIFRoZSBgYnBmX3NrYl9leHRgIGlzIGFsbG9jYXRlZCBhbmQgemVyb2VkIGltbWVkaWF0ZWx5IHZpYSBgbWVtc2V0YC4gVGhlcmUgYXJlIG5vIGNhc2VzIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCB3aXRob3V0IHByb3BlciBpbml0aWFsaXphdGlvbi4KNC4gICoqQm91bmRzIENoZWNrcyBJc3N1ZXM6KiogQm91bmRzIGNoZWNrcyBpbiBgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRgIGFuZCBgYnBmX2R5bnB0cl9jaGVja19vZmZfbGVuYCBlbnN1cmUgdGhhdCBhY2Nlc3NlcyBzdGF5IHdpdGhpbiB0aGUgaW5pdGlhbGl6ZWQgbWVtb3J5IHJlZ2lvbi4gVGhlIGNoZWNrIGBicGZfZHlucHRyX2NoZWNrX29mZl9sZW5gIGNvbmZpcm1zIHRoYXQgb2Zmc2V0IGFuZCBsZW5ndGggYXJlIHNhZmUgd2l0aGluIHRoZSBzaXplIG9mIHRoZSBpbml0aWFsaXplZCBidWZmZXIsIHdoaWNoIGlzIGNvbnRyb2xsZWQgYnkgYHNpemUgJmx0Oz0gQVJSQVlfU0laRShleHQtJmd0O2J1ZilgLiBgc2tiX2V4dF90eXBlX2xlbltTS0JfRVhUX0JQRl1gIGlzIGFsc28gcHJvcGVybHkgc2V0IHRvIHRoZSBjaHVuayBzaXplLgoKSSBhbHNvIGNvbnNpZGVyZWQgcG90ZW50aWFsIGNvbmN1cnJlbmN5LCBsb2NrLCByZWZjb3VudCwgb3Igc2hhcmluZyBpc3N1ZXMgd2l0aCBjbG9uZWQgYHNrYmBzLCBidXQgdGhvc2UgYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgYHNrYl9leHRfc2hhcmVkYCBjaGVjayBhbmQgQ09XIChjb3B5LW9uLXdyaXRlKS4gVmVyaWZpZXIgdHlwZSBjaGVja2luZyBhbmQgdmFsaWRhdGlvbiBidWdzIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIC8gdGhlIEJQRiB2ZXJpZmllci4gT3V0LW9mLWJvdW5kcyBhY2Nlc3Mgb3IgdXNlLWFmdGVyLWZyZWUgb24gYHNrYmAgb3IgYHNrYl9leHRgIGlzIGNvdmVyZWQgYnkgS0FTQU4uCgpJIGRvdWJsZS1jaGVja2VkIGFsbCB0aGUgbW9kaWZpZWQgZmlsZXM6IGBpbmNsdWRlL2xpbnV4LypgLCBga2VybmVsL2JwZi8qYCwgYG5ldC8qYCwgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8qYC4gSSYjMzk7bSBjb25maWRlbnQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGxlYWtzLgoKU28sIHRoZSByZWFzb25pbmcgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdXBwb3J0IHRvIGBza2JfZXh0YCB2aWEgZHlucHRycywgd2l0aCBoZWxwZXIgZnVuY3Rpb25zLCBhbmQgdmVyaWZpZXIgY2hlY2tzLiBDcnVjaWFsbHksIHRoZSBleHRlbnNpb24gaXMgYWx3YXlzIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZCB2aWEgYG1lbXNldGAgdXBvbiBjcmVhdGlvbi4gRXJyb3IgcGF0aHMgZW5zdXJlIGNsZWFuIGR5bnB0ciBpbml0aWFsaXphdGlvbiB2aWEgYGJwZl9keW5wdHJfc2V0X251bGwoKWAuIEFsbCBtZW1vcnkgYWNjZXNzZXMgYXJlIGNvbnN0cmFpbmVkIGJ5IHZlcmlmaWVkIGJvdW5kcyBjaGVja3MuIEtNU0FOJiMzOTtzIG1haW4gcHVycG9zZSBpcyB0byBjYXRjaCB0aGUgbGVha3MgYW5kIHJlYWRzLCBidXQgdGhpcyBjb2RlIGlzIGRlc2lnbmVkIHRvIGF2b2lkIHRob3NlIGlzc3Vlcy4gVGhlcmVmb3JlLCBubyBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBuZWVkZWQgKE5lZWRzS01TQU49ZmFsc2UpLiBOb3csIGxldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDE1OjI0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgQlBGIHNvY2tldCBidWZmZXIgbWV0YWRhdGEgZXh0ZW5zaW9ucyAoU0tCX0VYVF9CUEYpIGFjY2Vzc2libGUgdmlhIEJQRiBkeW5wdHJzIChgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRgKSwgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIHZlcmlmaWVyIGNoZWNrcywgaGVscGVyIGZ1bmN0aW9ucywgYW5kIHNrYiBleHRlbnNpb24gc2NydWJiaW5nIGxvZ2ljLlxuXG5Bc3Nlc3NtZW50IG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2s6XG4xLiBNZW1vcnkgSW5pdGlhbGl6YXRpb246IFdoZW4gYSBuZXcgYHN0cnVjdCBicGZfc2tiX2V4dGAgaXMgYWRkZWQgdG8gYW4gc2tiIHZpYSBgc2tiX2V4dF9hZGQoKWAsIGBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpYCBleHBsaWNpdGx5IHplcm9lcyB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZSB1c2luZyBgbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKWAuIFdoZW4gZXJyb3IgY29uZGl0aW9ucyBhcmUgZW5jb3VudGVyZWQsIHRoZSBkeW5wdHIgaXMgc2FmZWx5IGNsZWFyZWQgd2l0aCBgYnBmX2R5bnB0cl9zZXRfbnVsbCgpYC5cbjIuIEJvdW5kcyBhbmQgT2Zmc2V0czogVGhlIGJ1ZmZlciBsZW5ndGggaXMgc3RyaWN0bHkgY2hlY2tlZCBhZ2FpbnN0IGBDT05GSUdfQlBGX1NLQl9FWFRfU0laRWAgKGBBUlJBWV9TSVpFKGV4dC1cdTAwM2VidWYpYCksIGFuZCBhbGwgc3Vic2VxdWVudCBkeW5wdHIgb3BlcmF0aW9ucyAoYGJwZl9keW5wdHJfcmVhZGAsIGBicGZfZHlucHRyX3dyaXRlYCwgYGJwZl9keW5wdHJfc2xpY2VgKSBlbmZvcmNlIGJvdW5kcyB2aWEgYGJwZl9keW5wdHJfY2hlY2tfb2ZmX2xlbigpYCwgcHJldmVudGluZyByZWFkcyBiZXlvbmQgdGhlIGluaXRpYWxpemVkIHJlZ2lvbi5cbjMuIEluZm8gTGVha3M6IE5vIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBvciBwYWRkaW5nIGlzIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciBhY3Jvc3Mga2VybmVsIGJvdW5kYXJpZXMuXG5cblRoZSBwcmltYXJ5IGJ1ZyBzdXJmYWNlcyBmb3IgdGhlc2UgY2hhbmdlcyBhcmUgQlBGIHZlcmlmaWVyIHNhZmV0eSwgcmVmY291bnQvQ09XIHNlbWFudGljcyBvbiBjbG9uZWQgc2ticywgYW5kIGJ1ZmZlciBib3VuZHMgY2hlY2tpbmcsIGFsbCBvZiB3aGljaCBhcmUgZWZmZWN0aXZlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHNhbml0aXplcnMgcmF0aGVyIHRoYW4gS01TQU4uIEEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgdGhlcmVmb3JlIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIEJQRiBzb2NrZXQgYnVmZmVyIG1ldGFkYXRhIGV4dGVuc2lvbnMgKFNLQl9FWFRfQlBGKSBhY2Nlc3NpYmxlIHZpYSBCUEYgZHlucHRycyAoYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCksIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyB2ZXJpZmllciBjaGVja3MsIGhlbHBlciBmdW5jdGlvbnMsIGFuZCBza2IgZXh0ZW5zaW9uIHNjcnViYmluZyBsb2dpYy5cblxuQXNzZXNzbWVudCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrOlxuMS4gTWVtb3J5IEluaXRpYWxpemF0aW9uOiBXaGVuIGEgbmV3IGBzdHJ1Y3QgYnBmX3NrYl9leHRgIGlzIGFkZGVkIHRvIGFuIHNrYiB2aWEgYHNrYl9leHRfYWRkKClgLCBgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKWAgZXhwbGljaXRseSB6ZXJvZXMgdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdXNpbmcgYG1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSlgLiBXaGVuIGVycm9yIGNvbmRpdGlvbnMgYXJlIGVuY291bnRlcmVkLCB0aGUgZHlucHRyIGlzIHNhZmVseSBjbGVhcmVkIHdpdGggYGJwZl9keW5wdHJfc2V0X251bGwoKWAuXG4yLiBCb3VuZHMgYW5kIE9mZnNldHM6IFRoZSBidWZmZXIgbGVuZ3RoIGlzIHN0cmljdGx5IGNoZWNrZWQgYWdhaW5zdCBgQ09ORklHX0JQRl9TS0JfRVhUX1NJWkVgIChgQVJSQVlfU0laRShleHQtXHUwMDNlYnVmKWApLCBhbmQgYWxsIHN1YnNlcXVlbnQgZHlucHRyIG9wZXJhdGlvbnMgKGBicGZfZHlucHRyX3JlYWRgLCBgYnBmX2R5bnB0cl93cml0ZWAsIGBicGZfZHlucHRyX3NsaWNlYCkgZW5mb3JjZSBib3VuZHMgdmlhIGBicGZfZHlucHRyX2NoZWNrX29mZl9sZW4oKWAsIHByZXZlbnRpbmcgcmVhZHMgYmV5b25kIHRoZSBpbml0aWFsaXplZCByZWdpb24uXG4zLiBJbmZvIExlYWtzOiBObyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkgb3IgcGFkZGluZyBpcyBleHBvc2VkIHRvIHVzZXIgc3BhY2Ugb3IgYWNyb3NzIGtlcm5lbCBib3VuZGFyaWVzLlxuXG5UaGUgcHJpbWFyeSBidWcgc3VyZmFjZXMgZm9yIHRoZXNlIGNoYW5nZXMgYXJlIEJQRiB2ZXJpZmllciBzYWZldHksIHJlZmNvdW50L0NPVyBzZW1hbnRpY3Mgb24gY2xvbmVkIHNrYnMsIGFuZCBidWZmZXIgYm91bmRzIGNoZWNraW5nLCBhbGwgb2Ygd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBzYW5pdGl6ZXJzIHJhdGhlciB0aGFuIEtNU0FOLiBBIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIHRoZXJlZm9yZSBub3QganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzoxOS41ODc4OTk3NzhaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NTA0Mzk2NTUzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU0tCX0VYVFwiLFxuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIk5FVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9keW5wdHJfZnJvbV9za2JfZXh0XCIsXG4gICAgXCJicGZfc2tiX2V4dF9wb2ludGVyXCIsXG4gICAgXCJfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXNcIixcbiAgICBcIl9fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXNcIixcbiAgICBcInNrYl9leHRfc2NydWJcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgQlBGIHNvY2tldCBidWZmZXIgbWV0YWRhdGEgZXh0ZW5zaW9ucyAoU0tCX0VYVF9CUEYpIGFjY2Vzc2libGUgdmlhIEJQRiBkeW5wdHJzIChgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRgKSwgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIHZlcmlmaWVyIGNoZWNrcywgaGVscGVyIGZ1bmN0aW9ucywgYW5kIHNrYiBleHRlbnNpb24gc2NydWJiaW5nIGxvZ2ljLlxcblxcbkFzc2Vzc21lbnQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlzazpcXG4xLiBNZW1vcnkgSW5pdGlhbGl6YXRpb246IFdoZW4gYSBuZXcgYHN0cnVjdCBicGZfc2tiX2V4dGAgaXMgYWRkZWQgdG8gYW4gc2tiIHZpYSBgc2tiX2V4dF9hZGQoKWAsIGBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpYCBleHBsaWNpdGx5IHplcm9lcyB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZSB1c2luZyBgbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKWAuIFdoZW4gZXJyb3IgY29uZGl0aW9ucyBhcmUgZW5jb3VudGVyZWQsIHRoZSBkeW5wdHIgaXMgc2FmZWx5IGNsZWFyZWQgd2l0aCBgYnBmX2R5bnB0cl9zZXRfbnVsbCgpYC5cXG4yLiBCb3VuZHMgYW5kIE9mZnNldHM6IFRoZSBidWZmZXIgbGVuZ3RoIGlzIHN0cmljdGx5IGNoZWNrZWQgYWdhaW5zdCBgQ09ORklHX0JQRl9TS0JfRVhUX1NJWkVgIChgQVJSQVlfU0laRShleHQtXFx1MDAzZWJ1ZilgKSwgYW5kIGFsbCBzdWJzZXF1ZW50IGR5bnB0ciBvcGVyYXRpb25zIChgYnBmX2R5bnB0cl9yZWFkYCwgYGJwZl9keW5wdHJfd3JpdGVgLCBgYnBmX2R5bnB0cl9zbGljZWApIGVuZm9yY2UgYm91bmRzIHZpYSBgYnBmX2R5bnB0cl9jaGVja19vZmZfbGVuKClgLCBwcmV2ZW50aW5nIHJlYWRzIGJleW9uZCB0aGUgaW5pdGlhbGl6ZWQgcmVnaW9uLlxcbjMuIEluZm8gTGVha3M6IE5vIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSBvciBwYWRkaW5nIGlzIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciBhY3Jvc3Mga2VybmVsIGJvdW5kYXJpZXMuXFxuXFxuVGhlIHByaW1hcnkgYnVnIHN1cmZhY2VzIGZvciB0aGVzZSBjaGFuZ2VzIGFyZSBCUEYgdmVyaWZpZXIgc2FmZXR5LCByZWZjb3VudC9DT1cgc2VtYW50aWNzIG9uIGNsb25lZCBza2JzLCBhbmQgYnVmZmVyIGJvdW5kcyBjaGVja2luZywgYWxsIG9mIHdoaWNoIGFyZSBlZmZlY3RpdmVseSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgc2FuaXRpemVycyByYXRoZXIgdGhhbiBLTVNBTi4gQSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyB0aGVyZWZvcmUgbm90IGp1c3RpZmllZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHNrX2J1ZmYgZXh0ZW5zaW9uIGZvciBCUEYgbWV0YWRhdGEgKENPTkZJR19CUEZfU0tCX0VYVCkgYWxvbmcgd2l0aCB0aGUgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQga2Z1bmMgYW5kIHJlbGF0ZWQgZHlucHRyIGhhbmRsaW5nIGluIGhlbHBlcnMgYW5kIHRoZSBCUEYgdmVyaWZpZXIuIEl0IGFsc28gbW9kaWZpZXMgcGFja2V0IHNjcnViYmluZyBhbmQgZXh0ZW5zaW9uIGxpZmV0aW1lIGxvZ2ljIGluIGNvcmUgbmV0d29ya2luZyBwYXRocy4gVGhlc2UgY2hhbmdlcyBhcmUgaW4gcmVhY2hhYmxlIGNvcmUgc3Vic3lzdGVtcyBhbmQgd2FycmFudCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzoxOS41ODc5MDQ5NDhaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY1MDc5ODkzMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGEwZTA0NWJkNTkwN2QyNmZlNmVkY2U3NmYxZjIxNmNjMjQyNzBhNDdcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBTZXAgMTAgMTU6MjM6MTggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmhcXG5pbmRleCBmZmE1NjI2NDExYWMyLi42YzM1ZjhjNzQxNDc0IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2JwZi5oXFxuQEAgLTE0ODEsNiArMTQ4MSw4IEBAIGVudW0gYnBmX2R5bnB0cl90eXBlIHtcXG4gXFx0QlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBLFxcbiBcXHQvKiBVbmRlcmx5aW5nIGRhdGEgaXMgYSBmaWxlICovXFxuIFxcdEJQRl9EWU5QVFJfVFlQRV9GSUxFLFxcbitcXHQvKiBVbmRlcmx5aW5nIGRhdGEgaXMgYSBicGZfc2tiX2V4dCBjaHVuayAqL1xcbitcXHRCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVCxcXG4gfTtcXG4gXFxuIGludCBicGZfZHlucHRyX2NoZWNrX3NpemUodTY0IHNpemUpO1xcbkBAIC00MjE2LDQgKzQyMTgsMTIgQEAgc3RhdGljIGlubGluZSBpbnQgYnBmX21hcF9jaGVja19vcF9mbGFncyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB1NjQgZmxhZ3MsIHU2NCBhbGxcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuKyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcXG4rXFxuK3N0cnVjdCBicGZfc2tiX2V4dCB7XFxuK1xcdHU4IGJ1ZltDT05GSUdfQlBGX1NLQl9FWFRfU0laRV0gX19hbGlnbmVkKDgpO1xcbit9O1xcbitcXG4rI2VuZGlmIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqL1xcbitcXG4gI2VuZGlmIC8qIF9MSU5VWF9CUEZfSCAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaFxcbmluZGV4IDRhOWJjNmE4NDhmMmUuLmU5YTkzNDkyMjUzYmEgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9maWx0ZXIuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvZmlsdGVyLmhcXG5AQCAtMTk1OCw0ICsxOTU4LDMxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqYnBmX3NrYl9tZXRhX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldClcXG4gfVxcbiAjZW5kaWYgLyogQ09ORklHX05FVCAqL1xcbiBcXG4rI2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxcbit2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIGJvb2wgd3IpO1xcbitpbnQgX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIHZvaWQgKnRvLFxcbitcXHRcXHRcXHQgICAgIHUzMiBsZW4pO1xcbitpbnQgX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCBjb25zdCB2b2lkICpmcm9tLFxcbitcXHRcXHRcXHQgICAgICB1MzIgbGVuLCB1NjQgZmxhZ3MpO1xcbisjZWxzZSAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi9cXG4rc3RhdGljIGlubGluZSB2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsXFxuK1xcdFxcdFxcdFxcdFxcdGJvb2wgd3IpXFxuK3tcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbitcXHRcXHRcXHRcXHRcXHQgICB1MzIgb2Zmc2V0LCB2b2lkICp0bywgdTMyIGxlbilcXG4re1xcbitcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IF9fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIGNvbnN0IHZvaWQgKmZyb20sIHUzMiBsZW4sXFxuK1xcdFxcdFxcdFxcdFxcdCAgICB1NjQgZmxhZ3MpXFxuK3tcXG4rXFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbit9XFxuKyNlbmRpZiAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi9cXG4rXFxuICNlbmRpZiAvKiBfX0xJTlVYX0ZJTFRFUl9IX18gKi9cXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmhcXG5pbmRleCA0MjFmNmZjNDU0NTExLi41MDlkNDQ3MTc5ZTEzIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oXFxuQEAgLTUwNjEsNiArNTA2MSw5IEBAIGVudW0gc2tiX2V4dF9pZCB7XFxuICNlbmRpZlxcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQ0FOKVxcbiBcXHRTS0JfRVhUX0NBTixcXG4rI2VuZGlmXFxuKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUEZfU0tCX0VYVClcXG4rXFx0U0tCX0VYVF9CUEYsXFxuICNlbmRpZlxcbiBcXHRTS0JfRVhUX05VTSwgLyogbXVzdCBiZSBsYXN0ICovXFxuIH07XFxuQEAgLTUwODgsNiArNTA5MSw3IEBAIHZvaWQgKl9fc2tiX2V4dF9zZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBza2JfZXh0X2lkIGlkLFxcbiB2b2lkICpza2JfZXh0X2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQpO1xcbiB2b2lkIF9fc2tiX2V4dF9kZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBza2JfZXh0X2lkIGlkKTtcXG4gdm9pZCBfX3NrYl9leHRfcHV0KHN0cnVjdCBza2JfZXh0ICpleHQpO1xcbit2b2lkIHNrYl9leHRfc2NydWIoc3RydWN0IHNrX2J1ZmYgKnNrYik7XFxuIFxcbiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4ge1xcbkBAIC01MTUzLDE0ICs1MTU3LDIzIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBza2JfaGFzX2V4dGVuc2lvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4ge1xcbiBcXHRyZXR1cm4gdW5saWtlbHkoc2tiLVxcdTAwM2VhY3RpdmVfZXh0ZW5zaW9ucyk7XFxuIH1cXG4rXFxuKy8qIFRydWUgaWYgdGhlIGV4dGVuc2lvbiBibG9jayBpcyBzaGFyZWQgd2l0aCBjbG9uZWQgc2ticyAqL1xcbitzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2V4dF9zaGFyZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4re1xcbitcXHRyZXR1cm4gc2tiLVxcdTAwM2VhY3RpdmVfZXh0ZW5zaW9ucyBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgICAgcmVmY291bnRfcmVhZChcXHUwMDI2c2tiLVxcdTAwM2VleHRlbnNpb25zLVxcdTAwM2VyZWZjbnQpICE9IDE7XFxuK31cXG4gI2Vsc2VcXG4gc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX2V4dF9wdXQoc3RydWN0IHNrYl9leHQgKmV4dCkge31cXG4gc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfcHV0KHN0cnVjdCBza19idWZmICpza2IpIHt9XFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3Jlc2V0KHN0cnVjdCBza19idWZmICpza2IpIHt9XFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3NjcnViKHN0cnVjdCBza19idWZmICpza2IpIHt9XFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X2RlbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdW51c2VkKSB7fVxcbiBzdGF0aWMgaW5saW5lIHZvaWQgX19za2JfZXh0X2NvcHkoc3RydWN0IHNrX2J1ZmYgKmQsIGNvbnN0IHN0cnVjdCBza19idWZmICpzKSB7fVxcbiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9jb3B5KHN0cnVjdCBza19idWZmICpkc3QsIGNvbnN0IHN0cnVjdCBza19idWZmICpzKSB7fVxcbiBzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2hhc19leHRlbnNpb25zKHN0cnVjdCBza19idWZmICpza2IpIHsgcmV0dXJuIGZhbHNlOyB9XFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBza2JfZXh0X3NoYXJlZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7IHJldHVybiBmYWxzZTsgfVxcbiAjZW5kaWYgLyogQ09ORklHX1NLQl9FWFRFTlNJT05TICovXFxuIFxcbiBzdGF0aWMgaW5saW5lIHZvaWQgbmZfcmVzZXRfY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXFxuaW5kZXggNzMyYjM1Y2MwOGQxYy4uYTQ4Mzk5YWZlNDk0OSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcXG5AQCAtNzgyNSw0ICs3ODI1LDkgQEAgc3RydWN0IGJwZl9pbnNuX2FycmF5X3ZhbHVlIHtcXG4gXFx0X191MzIgOjMyO1xcbiB9O1xcbiBcXG4rLyogRmxhZ3MgdG8gY29udHJvbCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpIGJlaGF2aW9yLiAqL1xcbitlbnVtIHtcXG4rXFx0QlBGX1NLQl9FWFRfRl9DUkVBVEUgPSAoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKSxcXG4rfTtcXG4rXFxuICNlbmRpZiAvKiBfVUFQSV9fTElOVVhfQlBGX0hfXyAqL1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hlbHBlcnMuYyBiL2tlcm5lbC9icGYvaGVscGVycy5jXFxuaW5kZXggYjNjYzVjOGZjODc1Ni4uY2ZjYjc5Mzk5ZWQwYiAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2hlbHBlcnMuY1xcbisrKyBiL2tlcm5lbC9icGYvaGVscGVycy5jXFxuQEAgLTE5MjYsNiArMTkyNiw4IEBAIHN0YXRpYyBpbnQgX19icGZfZHlucHRyX3JlYWQodm9pZCAqZHN0LCB1NjQgbGVuLCBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICpzXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9GSUxFOlxcbiBcXHRcXHRyZXR1cm4gYnBmX2ZpbGVfZmV0Y2hfYnl0ZXMoc3JjLVxcdTAwM2VkYXRhLCBvZmZzZXQsIGRzdCwgbGVuKTtcXG4rXFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDpcXG4rXFx0XFx0cmV0dXJuIF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyhzcmMtXFx1MDAzZWRhdGEsIHNyYy1cXHUwMDNlb2Zmc2V0ICsgb2Zmc2V0LCBkc3QsIGxlbik7XFxuIFxcdGRlZmF1bHQ6XFxuIFxcdFxcdFdBUk5fT05DRSh0cnVlLCBcXFwiYnBmX2R5bnB0cl9yZWFkOiB1bmtub3duIGR5bnB0ciB0eXBlICVkXFxcXG5cXFwiLCB0eXBlKTtcXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuQEAgLTE5ODUsNiArMTk4Nyw4IEBAIGludCBfX2JwZl9keW5wdHJfd3JpdGUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqZHN0LCB1NjQgb2Zmc2V0LCB2b2lkICpzcmMsXFxuIFxcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBOlxcbiBcXHRcXHRyZXR1cm4gX19icGZfc2tiX21ldGFfc3RvcmVfYnl0ZXMoZHN0LVxcdTAwM2VkYXRhLCBkc3QtXFx1MDAzZW9mZnNldCArIG9mZnNldCwgc3JjLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgIGxlbiwgZmxhZ3MpO1xcbitcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxcbitcXHRcXHRyZXR1cm4gX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlcyhkc3QtXFx1MDAzZWRhdGEsIGRzdC1cXHUwMDNlb2Zmc2V0ICsgb2Zmc2V0LCBzcmMsIGxlbiwgZmxhZ3MpO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRXQVJOX09OQ0UodHJ1ZSwgXFxcImJwZl9keW5wdHJfd3JpdGU6IHVua25vd24gZHlucHRyIHR5cGUgJWRcXFxcblxcXCIsIHR5cGUpO1xcbiBcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG5AQCAtMjAzMiw2ICsyMDM2LDcgQEAgQlBGX0NBTExfMyhicGZfZHlucHRyX2RhdGEsIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKiwgcHRyLCB1NjQsIG9mZnNldCwgdTZcXG4gXFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCOlxcbiBcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9YRFA6XFxuIFxcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBOlxcbitcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxcbiBcXHRcXHQvKiBza2IgYW5kIHhkcCBkeW5wdHJzIHNob3VsZCB1c2UgYnBmX2R5bnB0cl9zbGljZSAvIGJwZl9keW5wdHJfc2xpY2VfcmR3ciAqL1xcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFx0ZGVmYXVsdDpcXG5AQCAtMzA0OCw4ICszMDUzLDggQEAgX19icGZfa2Z1bmMgc3RydWN0IHRhc2tfc3RydWN0ICpicGZfdGFza19mcm9tX3ZwaWQoczMyIHZwaWQpXFxuICAqIHByb3ZpZGVkIGJ1ZmZlciwgd2l0aCBpdHMgY29udGVudHMgY29udGFpbmluZyB0aGUgZGF0YSwgaWYgdW5hYmxlIHRvIG9idGFpblxcbiAgKiBkaXJlY3QgcG9pbnRlcilcXG4gICovXFxuLV9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsXFxuLVxcdFxcdFxcdFxcdCAgIHZvaWQgKmJ1ZmZlcl9fbnVsbGFibGUsIHU2NCBidWZmZXJfX3N6aylcXG4rc3RhdGljIHZvaWQgKl9fYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCxcXG4rXFx0XFx0XFx0XFx0dm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prLCBib29sIHdyKVxcbiB7XFxuIFxcdGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0ciA9IChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICopcDtcXG4gXFx0ZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZTtcXG5AQCAtMzA4Nyw2ICszMDkyLDggQEAgX19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCxcXG4gXFx0fVxcbiBcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQTpcXG4gXFx0XFx0cmV0dXJuIGJwZl9za2JfbWV0YV9wb2ludGVyKHB0ci1cXHUwMDNlZGF0YSwgcHRyLVxcdTAwM2VvZmZzZXQgKyBvZmZzZXQpO1xcbitcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxcbitcXHRcXHRyZXR1cm4gYnBmX3NrYl9leHRfcG9pbnRlcihwdHItXFx1MDAzZWRhdGEsIHB0ci1cXHUwMDNlb2Zmc2V0ICsgb2Zmc2V0LCB3cik7XFxuIFxcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6XFxuIFxcdFxcdGVyciA9IGJwZl9maWxlX2ZldGNoX2J5dGVzKHB0ci1cXHUwMDNlZGF0YSwgb2Zmc2V0LCBidWZmZXJfX251bGxhYmxlLCBidWZmZXJfX3N6ayk7XFxuIFxcdFxcdHJldHVybiBlcnIgPyBOVUxMIDogYnVmZmVyX19udWxsYWJsZTtcXG5AQCAtMzA5Niw2ICszMTAzLDEzIEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsXFxuIFxcdH1cXG4gfVxcbiBcXG4rX19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCxcXG4rXFx0XFx0XFx0XFx0ICAgdm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prKVxcbit7XFxuK1xcdHJldHVybiBfX2JwZl9keW5wdHJfc2xpY2UocCwgb2Zmc2V0LCBidWZmZXJfX251bGxhYmxlLCBidWZmZXJfX3N6ayxcXG4rXFx0XFx0XFx0XFx0ICBmYWxzZSk7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiBicGZfZHlucHRyX3NsaWNlX3Jkd3IoKSAtIE9idGFpbiBhIHdyaXRhYmxlIHBvaW50ZXIgdG8gdGhlIGR5bnB0ciBkYXRhLlxcbiAgKiBAcDogVGhlIGR5bnB0ciB3aG9zZSBkYXRhIHNsaWNlIHRvIHJldHJpZXZlXFxuQEAgLTMxNjgsNyArMzE4Miw4IEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2VfcmR3cihjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCxcXG4gXFx0ICogd2lsbCBiZSBjb3BpZWQgb3V0IGludG8gdGhlIGJ1ZmZlciBhbmQgdGhlIHVzZXIgd2lsbCBuZWVkIHRvIGNhbGxcXG4gXFx0ICogYnBmX2R5bnB0cl93cml0ZSgpIHRvIGNvbW1pdCBjaGFuZ2VzLlxcbiBcXHQgKi9cXG4tXFx0cmV0dXJuIGJwZl9keW5wdHJfc2xpY2UocCwgb2Zmc2V0LCBidWZmZXJfX251bGxhYmxlLCBidWZmZXJfX3N6ayk7XFxuK1xcdHJldHVybiBfX2JwZl9keW5wdHJfc2xpY2UocCwgb2Zmc2V0LCBidWZmZXJfX251bGxhYmxlLCBidWZmZXJfX3N6ayxcXG4rXFx0XFx0XFx0XFx0ICB0cnVlKTtcXG4gfVxcbiBcXG4gX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfYWRqdXN0KHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgc3RhcnQsIHU2NCBlbmQpXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbG9nLmMgYi9rZXJuZWwvYnBmL2xvZy5jXFxuaW5kZXggNTg5NzcwY2EzZDNhMC4uMDJmOWJmNzJhYzA3YyAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2xvZy5jXFxuKysrIGIva2VybmVsL2JwZi9sb2cuY1xcbkBAIC00NjIsNiArNDYyLDggQEAgY29uc3QgY2hhciAqZHlucHRyX3R5cGVfc3RyKGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGUpXFxuIFxcdFxcdHJldHVybiBcXFwic2tiX21ldGFcXFwiO1xcbiBcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9GSUxFOlxcbiBcXHRcXHRyZXR1cm4gXFxcImZpbGVcXFwiO1xcbitcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxcbitcXHRcXHRyZXR1cm4gXFxcInNrYl9leHRcXFwiO1xcbiBcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9JTlZBTElEOlxcbiBcXHRcXHRyZXR1cm4gXFxcIlxcdTAwM2NpbnZhbGlkXFx1MDAzZVxcXCI7XFxuIFxcdGRlZmF1bHQ6XFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xcbmluZGV4IGU0MjFlYTJiODBjM2EuLmU4MmUwYjRkZDJjZTAgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXFxuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuQEAgLTYyMSw2ICs2MjEsNyBAQCBzdGF0aWMgZW51bSBicGZfdHlwZV9mbGFnIGdldF9keW5wdHJfdHlwZV9mbGFnKGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGUpXFxuIFxcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1hEUDpcXG4gXFx0XFx0cmV0dXJuIERZTlBUUl9UWVBFX1hEUDtcXG4gXFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEE6XFxuK1xcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQ6XFxuIFxcdFxcdHJldHVybiBEWU5QVFJfVFlQRV9TS0JfTUVUQTtcXG4gXFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfRklMRTpcXG4gXFx0XFx0cmV0dXJuIERZTlBUUl9UWVBFX0ZJTEU7XFxuQEAgLTU4OTAsNiArNTg5MSwxMCBAQCBCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpIHtcXG4gXFx0c3RydWN0IGZpbGUgKnZtX2ZpbGU7XFxuIH07XFxuIFxcbitCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgYnBmX3NvY2tfb3BzX2tlcm4pIHtcXG4rXFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcXG4rfTtcXG4rXFxuIHN0YXRpYyBib29sIHR5cGVfaXNfcmN1KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuIFxcdFxcdFxcdHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsXFxuIFxcdFxcdFxcdGNvbnN0IGNoYXIgKmZpZWxkX25hbWUsIHUzMiBidGZfaWQpXFxuQEAgLTU5MzIsNiArNTkzNyw3IEBAIHN0YXRpYyBib29sIHR5cGVfaXNfdHJ1c3RlZF9vcl9udWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuIFxcdEJURl9UWVBFX0VNSVQoQlRGX1RZUEVfU0FGRV9UUlVTVEVEX09SX05VTEwoc3RydWN0IHNvY2tldCkpO1xcbiBcXHRCVEZfVFlQRV9FTUlUKEJURl9UWVBFX1NBRkVfVFJVU1RFRF9PUl9OVUxMKHN0cnVjdCBkZW50cnkpKTtcXG4gXFx0QlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpKTtcXG4rXFx0QlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgYnBmX3NvY2tfb3BzX2tlcm4pKTtcXG4gXFxuIFxcdHJldHVybiBidGZfbmVzdGVkX3R5cGVfaXNfdHJ1c3RlZChcXHUwMDI2ZW52LVxcdTAwM2Vsb2csIHJlZywgZmllbGRfbmFtZSwgYnRmX2lkLFxcbiBcXHRcXHRcXHRcXHRcXHQgIFxcXCJfX3NhZmVfdHJ1c3RlZF9vcl9udWxsXFxcIik7XFxuQEAgLTExNjE1LDYgKzExNjIxLDcgQEAgZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUge1xcbiBcXHRLRl9icGZfZHlucHRyX2Zyb21feGRwLFxcbiBcXHRLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGEsXFxuIFxcdEtGX2JwZl94ZHBfcHVsbF9kYXRhLFxcbitcXHRLRl9icGZfZHlucHRyX2Zyb21fc2tiX2V4dCxcXG4gXFx0S0ZfYnBmX2R5bnB0cl9zbGljZSxcXG4gXFx0S0ZfYnBmX2R5bnB0cl9zbGljZV9yZHdyLFxcbiBcXHRLRl9icGZfZHlucHRyX2Nsb25lLFxcbkBAIC0xMTY5Miw2ICsxMTY5OSwxMSBAQCBCVEZfSURfVU5VU0VEXFxuIEJURl9JRF9VTlVTRURcXG4gQlRGX0lEX1VOVVNFRFxcbiAjZW5kaWZcXG4rI2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxcbitCVEZfSUQoZnVuYywgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQpXFxuKyNlbHNlXFxuK0JURl9JRF9VTlVTRURcXG4rI2VuZGlmXFxuIEJURl9JRChmdW5jLCBicGZfZHlucHRyX3NsaWNlKVxcbiBCVEZfSUQoZnVuYywgYnBmX2R5bnB0cl9zbGljZV9yZHdyKVxcbiBCVEZfSUQoZnVuYywgYnBmX2R5bnB0cl9jbG9uZSlcXG5AQCAtMTE4MjQsNyArMTE4MzYsOCBAQCBzdGF0aWMgYm9vbCBpc19rZnVuY19icGZfcHJlZW1wdF9lbmFibGUoc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhICptZXRhKVxcbiBcXG4gYm9vbCBicGZfaXNfa2Z1bmNfcGt0X2NoYW5naW5nKHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSlcXG4ge1xcbi1cXHRyZXR1cm4gbWV0YS1cXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3hkcF9wdWxsX2RhdGFdO1xcbitcXHRyZXR1cm4gbWV0YS1cXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3hkcF9wdWxsX2RhdGFdIHx8XFxuK1xcdCAgICAgICBtZXRhLVxcdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX2V4dF07XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnRcXG5AQCAtMTI4MzUsNyArMTI4NDgsOCBAQCBzdGF0aWMgaW50IGNoZWNrX2tmdW5jX2FyZ3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9jYWxsX2FyZ19tZVxcbiBcXHRcXHRcXHRcXHRkeW5wdHJfYXJnX3R5cGUgfD0gRFlOUFRSX1RZUEVfU0tCO1xcbiBcXHRcXHRcXHR9IGVsc2UgaWYgKG1ldGEtXFx1MDAzZWZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV94ZHBdKSB7XFxuIFxcdFxcdFxcdFxcdGR5bnB0cl9hcmdfdHlwZSB8PSBEWU5QVFJfVFlQRV9YRFA7XFxuLVxcdFxcdFxcdH0gZWxzZSBpZiAobWV0YS1cXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX3NrYl9tZXRhXSkge1xcbitcXHRcXHRcXHR9IGVsc2UgaWYgKG1ldGEtXFx1MDAzZWZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV9za2JfbWV0YV0gfHxcXG4rXFx0XFx0XFx0XFx0ICAgbWV0YS1cXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRdKSB7XFxuIFxcdFxcdFxcdFxcdGR5bnB0cl9hcmdfdHlwZSB8PSBEWU5QVFJfVFlQRV9TS0JfTUVUQTtcXG4gXFx0XFx0XFx0fSBlbHNlIGlmIChtZXRhLVxcdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fZmlsZV0pIHtcXG4gXFx0XFx0XFx0XFx0ZHlucHRyX2FyZ190eXBlIHw9IERZTlBUUl9UWVBFX0ZJTEU7XFxuQEAgLTEzNzYzLDYgKzEzNzc3LDEzIEBAIHN0YXRpYyBpbnQgY2hlY2tfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24sXFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4rXFx0aWYgKG1ldGEuZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRdIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAocHJvZ190eXBlID09IEJQRl9QUk9HX1RZUEVfTFNNIHx8IHByb2dfdHlwZSA9PSBCUEZfUFJPR19UWVBFX1RSQUNJTkcpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAobWV0YS5hcmdfY29uc3RhbnQudmFsdWUgXFx1MDAyNiBCUEZfU0tCX0VYVF9GX0NSRUFURSkpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJCUEZfU0tCX0VYVF9GX0NSRUFURSBpcyBub3QgYWxsb3dlZCBpbiBsc20vdHJhY2luZyBwcm9ncmFtc1xcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbiBcXHRpZiAoaXNfYnBmX3JidHJlZV9hZGRfa2Z1bmMobWV0YS5mdW5jX2lkKSkge1xcbiBcXHRcXHRlcnIgPSBwdXNoX2NhbGxiYWNrX2NhbGwoZW52LCBpbnNuLCBpbnNuX2lkeCwgbWV0YS5zdWJwcm9nbm8sXFxuIFxcdFxcdFxcdFxcdFxcdCBzZXRfcmJ0cmVlX2FkZF9jYWxsYmFja19zdGF0ZSk7XFxuZGlmZiAtLWdpdCBhL25ldC9LY29uZmlnIGIvbmV0L0tjb25maWdcXG5pbmRleCBlMzg0NzczOTM1NTE1Li42ZDU3MzIwZGZlYTM5IDEwMDY0NFxcbi0tLSBhL25ldC9LY29uZmlnXFxuKysrIGIvbmV0L0tjb25maWdcXG5AQCAtNTQwLDQgKzU0MCwyNCBAQCBjb25maWcgTkVUX1RFU1RcXG4gXFxuIFxcdCAgSWYgdW5zdXJlLCBzYXkgTi5cXG4gXFxuK2NvbmZpZyBCUEZfU0tCX0VYVFxcbitcXHRib29sIFxcXCJza2IgZXh0ZW5zaW9uIGZvciBCUEYgbWV0YWRhdGFcXFwiXFxuK1xcdGRlcGVuZHMgb24gQlBGX1NZU0NBTExcXG4rXFx0c2VsZWN0IFNLQl9FWFRFTlNJT05TXFxuK1xcdGhlbHBcXG4rXFx0ICBFbmFibGUgYW4gc2tfYnVmZiBleHRlbnNpb24gZm9yIHN0b3JpbmcgQlBGIG1ldGFkYXRhLiBUaGlzIGFsbG93cyBCUEZcXG4rXFx0ICBwcm9ncmFtcyB0byBhc3NvY2lhdGUgYXJiaXRyYXJ5IGRhdGEgd2l0aCBpbmRpdmlkdWFsIHBhY2tldHMgYXMgdGhleVxcbitcXHQgIHRyYXZlcnNlIHRoZSBuZXR3b3JrIHN0YWNrLiBUaGUgc3RvcmFnZSBpcyBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW5cXG4rXFx0ICB0aGUgc2tfYnVmZiBpcyBmcmVlZC5cXG4rXFxuK2NvbmZpZyBCUEZfU0tCX0VYVF9TSVpFXFxuK1xcdGludCBcXFwiU2l6ZSBvZiB0aGUgQlBGIHNrYiBleHRlbnNpb24gbWV0YWRhdGEgYnVmZmVyXFxcIlxcbitcXHRkZXBlbmRzIG9uIEJQRl9TS0JfRVhUXFxuK1xcdHJhbmdlIDEgMjU2XFxuK1xcdGRlZmF1bHQgNjRcXG4rXFx0aGVscFxcbitcXHQgIENvbmZpZ3VyZXMgdGhlIHNpemUgb2YgdGhlIGlubGluZSBtZXRhZGF0YSBidWZmZXIgaW4gc3RydWN0XFxuK1xcdCAgYnBmX3NrYl9leHQsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIGEgQlBGIHByb2dyYW0gY2FuXFxuK1xcdCAgc3RvcmUgb3IgcmV0cmlldmUgd2l0aCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpLlxcbitcXG4gZW5kaWYgICAjIGlmIE5FVFxcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWx0ZXIuYyBiL25ldC9jb3JlL2ZpbHRlci5jXFxuaW5kZXggNjE5NDBlNzUzNTUyMy4uYmY3NTRmMzMwMzQ2MyAxMDA2NDRcXG4tLS0gYS9uZXQvY29yZS9maWx0ZXIuY1xcbisrKyBiL25ldC9jb3JlL2ZpbHRlci5jXFxuQEAgLTEyNDE4LDYgKzEyNDE4LDU0IEBAIGludCBfX2JwZl9za2JfbWV0YV9zdG9yZV9ieXRlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rI2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxcbit2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIGJvb2wgd3IpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9za2JfZXh0ICpleHQ7XFxuK1xcbitcXHRleHQgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX0JQRik7XFxuK1xcdGlmICghZXh0KVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdGlmICh3ciBcXHUwMDI2XFx1MDAyNiBza2JfZXh0X3NoYXJlZChza2IpKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdHJldHVybiBleHQtXFx1MDAzZWJ1ZiArIG9mZnNldDtcXG4rfVxcbitcXG4raW50IF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCB2b2lkICp0byxcXG4rXFx0XFx0XFx0ICAgICB1MzIgbGVuKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfc2tiX2V4dCAqZXh0O1xcbitcXG4rXFx0ZXh0ID0gc2tiX2V4dF9maW5kKHNrYiwgU0tCX0VYVF9CUEYpO1xcbitcXHRpZiAoIWV4dClcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcbitcXHRtZW1tb3ZlKHRvLCBleHQtXFx1MDAzZWJ1ZiArIG9mZnNldCwgbGVuKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK2ludCBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsXFxuK1xcdFxcdFxcdCAgICAgIGNvbnN0IHZvaWQgKmZyb20sIHUzMiBsZW4sIHU2NCBmbGFncylcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX3NrYl9leHQgKmV4dDtcXG4rXFxuK1xcdGlmICh1bmxpa2VseShmbGFncykpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0ZXh0ID0gc2tiX2V4dF9maW5kKHNrYiwgU0tCX0VYVF9CUEYpO1xcbitcXHRpZiAoIWV4dClcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcbitcXHRpZiAoc2tiX2V4dF9zaGFyZWQoc2tiKSlcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFxuK1xcdG1lbW1vdmUoZXh0LVxcdTAwM2VidWYgKyBvZmZzZXQsIGZyb20sIGxlbik7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuKyNlbmRpZiAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi9cXG4rXFxuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcXG4gX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2Ioc3RydWN0IF9fc2tfYnVmZiAqcywgdTY0IGZsYWdzLFxcbiBcXHRcXHRcXHRcXHQgICAgc3RydWN0IGJwZl9keW5wdHIgKnB0cl9fdW5pbml0KVxcbkBAIC0xMjQzNSw2ICsxMjQ4Myw3OSBAQCBfX2JwZl9rZnVuYyBpbnQgYnBmX2R5bnB0cl9mcm9tX3NrYihzdHJ1Y3QgX19za19idWZmICpzLCB1NjQgZmxhZ3MsXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbisjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXFxuKy8qKlxcbisgKiBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpIC0gSW5pdGlhbGl6ZSBhIGR5bnB0ciB0byB0aGUgc2tiX2V4dCBCUEYgYXJlYS5cXG4rICogQHNrYl86IHNvY2tldCBidWZmZXIgdG8gYXR0YWNoIHRoZSBleHRlbnNpb24gdG9cXG4rICogQHNpemU6IGR5bnB0ciBzaXplIGluIGJ5dGVzLCAwIGZvciBtYXhpbXVtIChDT05GSUdfQlBGX1NLQl9FWFRfU0laRSlcXG4rICogQGZsYWdzX19rOiBCUEZfU0tCX0VYVF9GX0NSRUFURSB0byBjcmVhdGUvQ09XIChyZWFkLXdyaXRlKSwgMCB0byBmaW5kXFxuKyAqICAgICAgICAgICAgKHJlYWQtb25seSlcXG4rICogQHB0cl9fdW5pbml0OiBkeW5wdHIgdG8gaW5pdGlhbGl6ZVxcbisgKlxcbisgKiBXcml0ZXMgdG8gdGhlIGR5bnB0ciAoYnBmX2R5bnB0cl93cml0ZSgpLCBicGZfZHlucHRyX3NsaWNlX3Jkd3IoKSkgZmFpbCB3aXRoXFxuKyAqICUtRUJVU1kgb3IgTlVMTCBpZiB0aGUgZXh0ZW5zaW9uIGNodW5rIGlzIHNoYXJlZCB3aXRoIGNsb25lcywgZS5nLiBhZnRlclxcbisgKiBicGZfY2xvbmVfcmVkaXJlY3QoKS4gUmUtYWNxdWlyZSB0aGUgZHlucHRyIHdpdGggQlBGX1NLQl9FWFRfRl9DUkVBVEUgdG8gZ2V0XFxuKyAqIGEgd3JpdGFibGUgcHJpdmF0ZSBjb3B5LlxcbisgKlxcbisgKiBCUEZfU0tCX0VYVF9GX0NSRUFURSBpcyBub3QgYWxsb3dlZCBpbiB0cmFjaW5nIGFuZCBMU00gcHJvZ3JhbXMuXFxuKyAqXFxuKyAqIFJldHVybjpcXG4rICogKiAlMCAgICAgICAgIC0gZHlucHRyIHJlYWR5IHRvIHVzZVxcbisgKiAqICUtRU5PRU5UICAgLSBleHRlbnNpb24gbm90IGZvdW5kICh3aGVuIG5vdCBjcmVhdGluZylcXG4rICogKiAlLUVOT01FTSAgIC0gYWxsb2NhdGlvbiBmYWlsZWRcXG4rICogKiAlLUVJTlZBTCAgIC0gaW52YWxpZCBmbGFnc1xcbisgKiAqICUtRTJCSUcgICAgLSBzaXplIGV4Y2VlZHMgQ09ORklHX0JQRl9TS0JfRVhUX1NJWkVcXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dChzdHJ1Y3QgX19za19idWZmICpza2JfLCB1MzIgc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0dTY0IGZsYWdzX19rLFxcbitcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgYnBmX2R5bnB0ciAqcHRyX191bmluaXQpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilwdHJfX3VuaW5pdDtcXG4rXFx0c3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYl87XFxuK1xcdGJvb2wgY3JlYXRlID0gZmxhZ3NfX2sgXFx1MDAyNiBCUEZfU0tCX0VYVF9GX0NSRUFURTtcXG4rXFx0c3RydWN0IGJwZl9za2JfZXh0ICpleHQ7XFxuK1xcdGJvb2wgZXhpc3RzO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0aWYgKGZsYWdzX19rIFxcdTAwMjYgfkJQRl9TS0JfRVhUX0ZfQ1JFQVRFKSB7XFxuK1xcdFxcdGVyciA9IC1FSU5WQUw7XFxuK1xcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChzaXplIFxcdTAwM2UgQVJSQVlfU0laRShleHQtXFx1MDAzZWJ1ZikpIHtcXG4rXFx0XFx0ZXJyID0gLUUyQklHO1xcbitcXHRcXHRnb3RvIGVycm9yO1xcbitcXHR9XFxuK1xcdGlmICghc2l6ZSlcXG4rXFx0XFx0c2l6ZSA9IEFSUkFZX1NJWkUoZXh0LVxcdTAwM2VidWYpO1xcbitcXG4rXFx0ZXhpc3RzID0gc2tiX2V4dF9leGlzdChza2IsIFNLQl9FWFRfQlBGKTtcXG4rXFx0aWYgKCFjcmVhdGUpIHtcXG4rXFx0XFx0aWYgKCFleGlzdHMpIHtcXG4rXFx0XFx0XFx0ZXJyID0gLUVOT0VOVDtcXG4rXFx0XFx0XFx0Z290byBlcnJvcjtcXG4rXFx0XFx0fVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0ZXh0ID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX0JQRik7XFxuK1xcdGlmICghZXh0KSB7XFxuK1xcdFxcdGVyciA9IC1FTk9NRU07XFxuK1xcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdH1cXG4rXFx0aWYgKCFleGlzdHMpXFxuK1xcdFxcdG1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7XFxuK291dDpcXG4rXFx0YnBmX2R5bnB0cl9pbml0KHB0ciwgc2tiLCBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVCwgMCwgc2l6ZSk7XFxuK1xcdGlmICghY3JlYXRlKVxcbitcXHRcXHRicGZfZHlucHRyX3NldF9yZG9ubHkocHRyKTtcXG4rXFx0cmV0dXJuIDA7XFxuK2Vycm9yOlxcbitcXHRicGZfZHlucHRyX3NldF9udWxsKHB0cik7XFxuK1xcdHJldHVybiBlcnI7XFxuK31cXG4rI2VuZGlmIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqL1xcbitcXG4gLyoqXFxuICAqIGJwZl9keW5wdHJfZnJvbV9za2JfbWV0YSgpIC0gSW5pdGlhbGl6ZSBhIGR5bnB0ciB0byB0aGUgc2tiIG1ldGFkYXRhIGFyZWEuXFxuICAqIEBza2JfOiBzb2NrZXQgYnVmZmVyIGNhcnJ5aW5nIHRoZSBtZXRhZGF0YVxcbkBAIC0xMjgxNiw2ICsxMjkzNywxMiBAQCBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9rZnVuY19jaGVja19zZXRfc2tiX21ldGEpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX21ldGEpXFxuIEJURl9LRlVOQ1NfRU5EKGJwZl9rZnVuY19jaGVja19zZXRfc2tiX21ldGEpXFxuIFxcbisjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXFxuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX2tmdW5jX2NoZWNrX3NldF9za2JfZXh0KVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQpXFxuK0JURl9LRlVOQ1NfRU5EKGJwZl9rZnVuY19jaGVja19zZXRfc2tiX2V4dClcXG4rI2VuZGlmXFxuK1xcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9rZnVuY19jaGVja19zZXRfeGRwKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2R5bnB0cl9mcm9tX3hkcClcXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl94ZHBfcHVsbF9kYXRhKVxcbkBAIC0xMjg0Nyw2ICsxMjk3NCwxMyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2tmdW5jX3NldF9za2JfbWV0YSA9IHtcXG4gXFx0LnNldCA9IFxcdTAwMjZicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9tZXRhLFxcbiB9O1xcbiBcXG4rI2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2tmdW5jX3NldF9za2JfZXh0ID0ge1xcbitcXHQub3duZXIgPSBUSElTX01PRFVMRSxcXG4rXFx0LnNldCA9IFxcdTAwMjZicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9leHQsXFxuK307XFxuKyNlbmRpZlxcbitcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfeGRwID0ge1xcbiBcXHQub3duZXIgPSBUSElTX01PRFVMRSxcXG4gXFx0LnNldCA9IFxcdTAwMjZicGZfa2Z1bmNfY2hlY2tfc2V0X3hkcCxcXG5AQCAtMTI4ODksNiArMTMwMjMsMjEgQEAgc3RhdGljIGludCBfX2luaXQgYnBmX2tmdW5jX2luaXQodm9pZClcXG4gXFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCBcXHUwMDI2YnBmX2tmdW5jX3NldF9za2IpO1xcbiBcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgXFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX21ldGEpO1xcbiBcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwgXFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX21ldGEpO1xcbisjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXFxuK1xcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcXG4rXFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9BQ1QsIFxcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xcbitcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TS0IsIFxcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xcbitcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NPQ0tfT1BTLCBcXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcXG4rXFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TS19TS0IsIFxcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xcbitcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIFxcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xcbitcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9PVVQsIFxcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xcbitcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9JTiwgXFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XFxuK1xcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTFdUX1hNSVQsIFxcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xcbitcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9TRUc2TE9DQUwsIFxcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xcbitcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX05FVEZJTFRFUiwgXFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XFxuK1xcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTFNNLCBcXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcXG4rXFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCBcXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcXG4rI2VuZGlmXFxuIFxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfWERQLCBcXHUwMDI2YnBmX2tmdW5jX3NldF94ZHApO1xcbiBcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TT0NLX0FERFIsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2YnBmX2tmdW5jX3NldF9zb2NrX2FkZHIpO1xcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jXFxuaW5kZXggYWIxOTViOTljODUzMC4uYTQ3OWUyNWRlNTY0OCAxMDA2NDRcXG4tLS0gYS9uZXQvY29yZS9za2J1ZmYuY1xcbisrKyBiL25ldC9jb3JlL3NrYnVmZi5jXFxuQEAgLTgzLDYgKzgzLDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY25ldC9wYWdlX3Bvb2wvaGVscGVycy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0L3BzcC90eXBlcy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0L2Ryb3ByZWFzb24uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0L3hkcF9zb2NrLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbkBAIC01MTY5LDYgKzUxNzAsOSBAQCBzdGF0aWMgY29uc3QgdTggc2tiX2V4dF90eXBlX2xlbltdID0ge1xcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQ0FOKVxcbiBcXHRbU0tCX0VYVF9DQU5dID0gU0tCX0VYVF9DSFVOS1NJWkVPRihzdHJ1Y3QgY2FuX3NrYl9leHQpLFxcbiAjZW5kaWZcXG4rI2lmIElTX0VOQUJMRUQoQ09ORklHX0JQRl9TS0JfRVhUKVxcbitcXHRbU0tCX0VYVF9CUEZdID0gU0tCX0VYVF9DSFVOS1NJWkVPRihzdHJ1Y3QgYnBmX3NrYl9leHQpLFxcbisjZW5kaWZcXG4gfTtcXG4gXFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgX19ub19wcm9maWxlIHVuc2lnbmVkIGludCBza2JfZXh0X3RvdGFsX2xlbmd0aCh2b2lkKVxcbkBAIC02Mjg3LDcgKzYyOTEsOCBAQCBFWFBPUlRfU1lNQk9MKHNrYl90cnlfY29hbGVzY2UpO1xcbiAgKiBvcGVyYXRpb25zLlxcbiAgKiBza2Jfc2NydWJfcGFja2V0IGNhbiBhbHNvIGJlIHVzZWQgdG8gY2xlYW4gYSBza2IgYmVmb3JlIGluamVjdGluZyBpdCBpblxcbiAgKiBhbm90aGVyIG5hbWVzcGFjZSAoQHhuZXQgPT0gdHJ1ZSkuIFdlIGhhdmUgdG8gY2xlYXIgYWxsIGluZm9ybWF0aW9uIGluIHRoZVxcbi0gKiBza2IgdGhhdCBjb3VsZCBpbXBhY3QgbmFtZXNwYWNlIGlzb2xhdGlvbi5cXG4rICogc2tiIHRoYXQgY291bGQgaW1wYWN0IG5hbWVzcGFjZSBpc29sYXRpb24uIE5vdGUgdGhhdCBCUEYgc2tiIGV4dGVuc2lvbiBpc1xcbisgKiBtZWFudCB0byBjYXJyeSBpbmZvcm1hdGlvbiBhY3Jvc3MgbmFtZXNwYWNlcyBieSBkZXNpZ24uXFxuICAqL1xcbiB2b2lkIHNrYl9zY3J1Yl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB4bmV0KVxcbiB7XFxuQEAgLTYyOTUsNyArNjMwMCw3IEBAIHZvaWQgc2tiX3NjcnViX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHhuZXQpXFxuIFxcdHNrYi1cXHUwMDNlc2tiX2lpZiA9IDA7XFxuIFxcdHNrYi1cXHUwMDNlaWdub3JlX2RmID0gMDtcXG4gXFx0c2tiX2RzdF9kcm9wKHNrYik7XFxuLVxcdHNrYl9leHRfcmVzZXQoc2tiKTtcXG4rXFx0c2tiX2V4dF9zY3J1Yihza2IpO1xcbiBcXHRuZl9yZXNldF9jdChza2IpO1xcbiBcXHRuZl9yZXNldF90cmFjZShza2IpO1xcbiBcXG5AQCAtNzMwNCw2ICs3MzA5LDI0IEBAIHZvaWQgX19za2JfZXh0X3B1dChzdHJ1Y3Qgc2tiX2V4dCAqZXh0KVxcbiBcXHRrbWVtX2NhY2hlX2ZyZWUoc2tidWZmX2V4dF9jYWNoZSwgZXh0KTtcXG4gfVxcbiBFWFBPUlRfU1lNQk9MKF9fc2tiX2V4dF9wdXQpO1xcbitcXG4rdm9pZCBza2JfZXh0X3NjcnViKHN0cnVjdCBza19idWZmICpza2IpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IGlkO1xcbitcXG4rXFx0aWYgKGxpa2VseSghc2tiLVxcdTAwM2VhY3RpdmVfZXh0ZW5zaW9ucykpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGZvciAoaWQgPSAwOyBpZCBcXHUwMDNjIFNLQl9FWFRfTlVNOyBpZCsrKSB7XFxuKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUEZfU0tCX0VYVClcXG4rXFx0XFx0aWYgKGlkID09IFNLQl9FWFRfQlBGKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rI2VuZGlmXFxuK1xcdFxcdHNrYl9leHRfZGVsKHNrYiwgaWQpO1xcbitcXHR9XFxuK31cXG4rRVhQT1JUX1NZTUJPTChza2JfZXh0X3NjcnViKTtcXG4rXFxuICNlbmRpZiAvKiBDT05GSUdfU0tCX0VYVEVOU0lPTlMgKi9cXG4gXFxuIHN0YXRpYyB2b2lkIGtmcmVlX3NrYl9uYXBpX2NhY2hlKHN0cnVjdCBza19idWZmICpza2IpXFxuZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcC5jIGIvbmV0L2lwdjQvdWRwLmNcXG5pbmRleCBiMzg4N2M0MmFkZmRiLi5jZjA5M2IwZDY2YzU4IDEwMDY0NFxcbi0tLSBhL25ldC9pcHY0L3VkcC5jXFxuKysrIGIvbmV0L2lwdjQvdWRwLmNcXG5AQCAtMTU0MCw4ICsxNTQwLDYgQEAgdm9pZCB1ZHBfc3BsaWNlX2VvZihzdHJ1Y3Qgc29ja2V0ICpzb2NrKVxcbiAgKlxcbiAgKiBXZSBuZWVkIHRvIHByZXNlcnZlIHNlY3BhdGgsIGlmIHByZXNlbnQsIHRvIGV2ZW50dWFsbHkgcHJvY2Vzc1xcbiAgKiBJUF9DTVNHX1BBU1NTRUMgYXQgcmVjdm1zZygpIHRpbWUuXFxuLSAqXFxuLSAqIE90aGVyIGV4dGVuc2lvbnMgY2FuIGJlIGNsZWFyZWQuXFxuICAqL1xcbiBzdGF0aWMgYm9vbCB1ZHBfdHJ5X21ha2Vfc3RhdGVsZXNzKHN0cnVjdCBza19idWZmICpza2IpXFxuIHtcXG5AQCAtMTU0OSw4ICsxNTQ3LDggQEAgc3RhdGljIGJvb2wgdWRwX3RyeV9tYWtlX3N0YXRlbGVzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbiBcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFxuIFxcdGlmICghc2VjcGF0aF9leGlzdHMoc2tiKSkge1xcbi1cXHRcXHRza2JfZXh0X3Jlc2V0KHNrYik7XFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbitcXHRcXHRza2JfZXh0X3NjcnViKHNrYik7XFxuK1xcdFxcdHJldHVybiAhc2tiX2hhc19leHRlbnNpb25zKHNrYik7XFxuIFxcdH1cXG4gXFxuIFxcdHJldHVybiBmYWxzZTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcXG5pbmRleCBlYTcwNDRmMzBhZGMzLi45YmJmYTM1MWJjZWRjIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXFxuQEAgLTcsNiArNyw3IEBAIENPTkZJR19CUEZfSklUPXlcXG4gQ09ORklHX0JQRl9LUFJPQkVfT1ZFUlJJREU9eVxcbiBDT05GSUdfQlBGX0xJUkNfTU9ERTI9eVxcbiBDT05GSUdfQlBGX0xTTT15XFxuK0NPTkZJR19CUEZfU0tCX0VYVD15XFxuIENPTkZJR19CUEZfU1RSRUFNX1BBUlNFUj15XFxuIENPTkZJR19CUEZfU1lTQ0FMTD15XFxuICMgQ09ORklHX0JQRl9VTlBSSVZfREVGQVVMVF9PRkYgaXMgbm90IHNldFxcbkBAIC0xMzYsMyArMTM3LDQgQEAgQ09ORklHX1NNQ19IU19DVFJMX0JQRj15XFxuIENPTkZJR19ESUJTPXlcXG4gQ09ORklHX0RJQlNfTE89eVxcbiBDT05GSUdfUE1fV0FLRUxPQ0tTPXlcXG4rQ09ORklHX05FVF9TQ0hfTkVURU09eVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zb2NrZXRfaGVscGVycy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc29ja2V0X2hlbHBlcnMuaFxcbmluZGV4IDBkNTk1MDNhMGM3M2UuLmViMTE0YTZlYTZmOTIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc29ja2V0X2hlbHBlcnMuaFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NvY2tldF9oZWxwZXJzLmhcXG5AQCAtMyw2ICszLDcgQEBcXG4gI2lmbmRlZiBfX1NPQ0tFVF9IRUxQRVJTX19cXG4gI2RlZmluZSBfX1NPQ0tFVF9IRUxQRVJTX19cXG4gXFxuKyNpbmNsdWRlIFxcdTAwM2NlcnJvci5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL3VuLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC92bV9zb2NrZXRzLmhcXHUwMDNlXFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZmllci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZpZXIuY1xcbmluZGV4IDY0YWM0OWFkNjdlNjMuLjc3MjRlODJmY2U2NmEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZpZXIuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmaWVyLmNcXG5AQCAtOTQsNiArOTQsNyBAQFxcbiAjaW5jbHVkZSBcXFwidmVyaWZpZXJfc2NhbGFyX2lkcy5za2VsLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJ2ZXJpZmllcl9zZGl2LnNrZWwuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInZlcmlmaWVyX3NlYXJjaF9wcnVuaW5nLnNrZWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZlcmlmaWVyX3NrYl9leHQuc2tlbC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwidmVyaWZpZXJfc29jay5za2VsLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJ2ZXJpZmllcl9zb2NrX2FkZHIuc2tlbC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwidmVyaWZpZXJfc29ja21hcF9tdXRhdGUuc2tlbC5oXFxcIlxcbkBAIC0yNTYsNiArMjU3LDcgQEAgdm9pZCB0ZXN0X3ZlcmlmaWVyX3J1bnRpbWVfaml0KHZvaWQpICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3J1bnRpbWVfaml0KTsgfVxcbiB2b2lkIHRlc3RfdmVyaWZpZXJfc2NhbGFyX2lkcyh2b2lkKSAgICAgICAgICAgeyBSVU4odmVyaWZpZXJfc2NhbGFyX2lkcyk7IH1cXG4gdm9pZCB0ZXN0X3ZlcmlmaWVyX3NkaXYodm9pZCkgICAgICAgICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3NkaXYpOyB9XFxuIHZvaWQgdGVzdF92ZXJpZmllcl9zZWFyY2hfcHJ1bmluZyh2b2lkKSAgICAgICB7IFJVTih2ZXJpZmllcl9zZWFyY2hfcHJ1bmluZyk7IH1cXG4rdm9pZCB0ZXN0X3ZlcmlmaWVyX3NrYl9leHQodm9pZCkgICAgICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3NrYl9leHQpOyB9XFxuIHZvaWQgdGVzdF92ZXJpZmllcl9zb2NrKHZvaWQpICAgICAgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9zb2NrKTsgfVxcbiB2b2lkIHRlc3RfdmVyaWZpZXJfc29ja19hZGRyKHZvaWQpICAgICAgICAgICAgeyBSVU4odmVyaWZpZXJfc29ja19hZGRyKTsgfVxcbiB2b2lkIHRlc3RfdmVyaWZpZXJfc29ja21hcF9tdXRhdGUodm9pZCkgICAgICAgeyBSVU4odmVyaWZpZXJfc29ja21hcF9tdXRhdGUpOyB9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3hkcF9jb250ZXh0X3Rlc3RfcnVuLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy94ZHBfY29udGV4dF90ZXN0X3J1bi5jXFxuaW5kZXggNDQ4ODA3Njc2MTc2Yy4uOWNiYjgzOWE1NWNjZSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy94ZHBfY29udGV4dF90ZXN0X3J1bi5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMveGRwX2NvbnRleHRfdGVzdF9ydW4uY1xcbkBAIC0yLDcgKzIsOSBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0d29ya19oZWxwZXJzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9pcHY2LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9uZXRmaWx0ZXIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FycGEvaW5ldC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwic29ja2V0X2hlbHBlcnMuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInRlc3RfeGRwX2NvbnRleHRfdGVzdF9ydW4uc2tlbC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwidGVzdF94ZHBfbWV0YS5za2VsLmhcXFwiXFxuIFxcbkBAIC0xNiwxMyArMTgsMTQgQEBcXG4gI2RlZmluZSBEVU1NWV9OQU1FIFxcXCJkdW0wXFxcIlxcbiAjZGVmaW5lIFRBUF9ORVROUyBcXFwieGRwX2NvbnRleHRfdHVudGFwXFxcIlxcbiAjZGVmaW5lIExXVF9ORVROUyBcXFwieGRwX2NvbnRleHRfbHd0XFxcIlxcbisjZGVmaW5lIFNLQl9FWFRfTkVUTlMgXFxcInNrYl9leHRfdHVudGFwXFxcIlxcbiBcXG4gI2RlZmluZSBURVNUX1BBWUxPQURfTEVOIDMyXFxuIHN0YXRpYyBjb25zdCBfX3U4IHRlc3RfcGF5bG9hZFtURVNUX1BBWUxPQURfTEVOXSA9IHtcXG4tXFx0MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCxcXG4tXFx0MHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCxcXG4tXFx0MHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCxcXG4tXFx0MHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCxcXG4rXFx0MHg0OSwgMHgyMCwgMHg2MywgMHg3MiwgMHg2ZiwgMHg3MywgMHg3MywgMHg2NSxcXG4rXFx0MHg2NCwgMHgyMCwgMHg2OCwgMHg2ZiwgMHg2ZiwgMHg2YiwgMHg3MywgMHgyMCxcXG4rXFx0MHgyNiwgMHgyMCwgMHg2YywgMHg2OSwgMHg3NiwgMHg2NSwgMHg2NCwgMHgyMCxcXG4rXFx0MHg3NCwgMHg2ZiwgMHgyMCwgMHg3NCwgMHg2NSwgMHg2YywgMHg2YywgMHgyMSxcXG4gfTtcXG4gXFxuIHZvaWQgdGVzdF94ZHBfY29udGV4dF9lcnJvcihpbnQgcHJvZ19mZCwgc3RydWN0IGJwZl90ZXN0X3J1bl9vcHRzIG9wdHMsXFxuQEAgLTMzMSwxMCArMzM0LDExIEBAIHZvaWQgdGVzdF94ZHBfY29udGV4dF92ZXRoKHZvaWQpXFxuIFxcdG5ldG5zX2ZyZWUodHhfbnMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLFxcbi1cXHRcXHRcXHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMV9wcm9nLFxcbi1cXHRcXHRcXHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMl9wcm9nLFxcbi1cXHRcXHRcXHRib29sICp0ZXN0X3Bhc3MpXFxuK3N0YXRpYyB2b2lkIF9fdGVzdF90dW50YXAoY29uc3QgY2hhciAqbnNuYW1lLFxcbitcXHRcXHRcXHQgIHN0cnVjdCBicGZfcHJvZ3JhbSAqeGRwX3Byb2csXFxuK1xcdFxcdFxcdCAgc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZyxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMl9wcm9nLFxcbitcXHRcXHRcXHQgIGJvb2wgKnRlc3RfcGFzcylcXG4ge1xcbiBcXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcXG4gXFx0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcXG5AQCAtMzQ1LDcgKzM0OSw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfdHVudGFwKHN0cnVjdCBicGZfcHJvZ3JhbSAqeGRwX3Byb2csXFxuIFxcbiBcXHQqdGVzdF9wYXNzID0gZmFsc2U7XFxuIFxcbi1cXHRucyA9IG5ldG5zX25ldyhUQVBfTkVUTlMsIHRydWUpO1xcbitcXHRucyA9IG5ldG5zX25ldyhuc25hbWUsIHRydWUpO1xcbiBcXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFxcXCJjcmVhdGUgYW5kIG9wZW4gbnNcXFwiKSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG5AQCAtMzk2LDYgKzQwMCwxNSBAQCBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLFxcbiBcXHRuZXRuc19mcmVlKG5zKTtcXG4gfVxcbiBcXG4rc3RhdGljIHZvaWQgdGVzdF90dW50YXAoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZyxcXG4rXFx0XFx0XFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZyxcXG4rXFx0XFx0XFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzJfcHJvZyxcXG4rXFx0XFx0XFx0Ym9vbCAqdGVzdF9wYXNzKVxcbit7XFxuK1xcdF9fdGVzdF90dW50YXAoVEFQX05FVE5TLCB4ZHBfcHJvZywgdGNfcHJpb18xX3Byb2csIHRjX3ByaW9fMl9wcm9nLFxcbitcXHRcXHQgICAgICB0ZXN0X3Bhc3MpO1xcbit9XFxuK1xcbiAvKiBXcml0ZSBhIHBhY2tldCB0byBhIHRhcCBkZXYgYW5kIGNvcHkgaXQgdG8gaW5ncmVzcyBvZiBhIGR1bW15IGRldiAqL1xcbiBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcF9taXJyZWQoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZyxcXG4gXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJvZyxcXG5AQCAtNjkzLDMgKzcwNiwxMDg5IEBAIHZvaWQgdGVzdF94ZHBfY29udGV4dF9sd3RfZW5jYXAodm9pZClcXG4gXFxuIFxcdHRlc3RfeGRwX21ldGFfX2Rlc3Ryb3koc2tlbCk7XFxuIH1cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF90dW50YXAoc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZyxcXG4rXFx0XFx0XFx0XFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzJfcHJvZyxcXG4rXFx0XFx0XFx0XFx0Ym9vbCAqdGVzdF9wYXNzKVxcbit7XFxuK1xcdF9fdGVzdF90dW50YXAoU0tCX0VYVF9ORVROUywgTlVMTCAvKiB4ZHAgKi8sIHRjX3ByaW9fMV9wcm9nLFxcbitcXHRcXHQgICAgICB0Y19wcmlvXzJfcHJvZywgdGVzdF9wYXNzKTtcXG4rfVxcbitcXG4rLypcXG4rICogVGVzdCBpZiBza2JfZXh0IHN1cnZpdmVzIHNrYiBjbG9uZSAodmlhIHRjIG1pcnJlZCkuXFxuKyAqIGR1bW15X3Byb2cgcnVucyBvbiB0aGUgY2xvbmUgKGR1bW15IGluZ3Jlc3MpLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgdGVzdF9taXJyZWRfY2xvbmVfZXh0KHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBicGZfcHJvZ3JhbSAqZHVtbXlfcHJvZylcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcXG4rXFx0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xcbitcXHRpbnQgZHVtbXlfaWZpbmRleDtcXG4rXFx0aW50IHRhcF9pZmluZGV4O1xcbitcXHRpbnQgdGFwX2ZkID0gLTE7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXdyaXRlX2RvbmUgPSBmYWxzZTtcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcXG4rXFxuK1xcdG5zID0gbmV0bnNfbmV3KFxcXCJtaXJyZWRfY2xvbmVcXFwiLCB0cnVlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcXFwibmV0bnNfbmV3XFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdC8qIER1bW15IGRldjogYXR0YWNoIHJlYWRlciAqL1xcbitcXHRTWVMoY2xvc2UsIFxcXCJpcCBsaW5rIGFkZCBuYW1lIFxcXCIgRFVNTVlfTkFNRSBcXFwiIHR5cGUgZHVtbXlcXFwiKTtcXG4rXFx0U1lTKGNsb3NlLCBcXFwiaXAgbGluayBzZXQgZGV2IFxcXCIgRFVNTVlfTkFNRSBcXFwiIHVwXFxcIik7XFxuK1xcbitcXHRkdW1teV9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoRFVNTVlfTkFNRSk7XFxuK1xcdGlmICghQVNTRVJUX0dUKGR1bW15X2lmaW5kZXgsIDAsIFxcXCJkdW1teV9pZmluZGV4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHR0Y19ob29rLmlmaW5kZXggPSBkdW1teV9pZmluZGV4O1xcbitcXHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXFx1MDAyNnRjX2hvb2spO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJkdW1teV9ob29rX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKGR1bW15X3Byb2cpO1xcbitcXHRyZXQgPSBicGZfdGNfYXR0YWNoKFxcdTAwMjZ0Y19ob29rLCBcXHUwMDI2dGNfb3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImR1bW15X2F0dGFjaFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0LyogVEFQIGRldjogYXR0YWNoIHdyaXRlciArIG1pcnJlZCB0byBkdW1teSAqL1xcbitcXHR0YXBfZmQgPSBvcGVuX3R1bnRhcChUQVBfTkFNRSwgdHJ1ZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKHRhcF9mZCwgMCwgXFxcIm9wZW5fdHVudGFwXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHRTWVMoY2xvc2UsIFxcXCJpcCBsaW5rIHNldCBkZXYgXFxcIiBUQVBfTkFNRSBcXFwiIHVwXFxcIik7XFxuK1xcbitcXHR0YXBfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFRBUF9OQU1FKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QodGFwX2lmaW5kZXgsIDAsIFxcXCJ0YXBfaWZpbmRleFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0dGNfaG9vay5pZmluZGV4ID0gdGFwX2lmaW5kZXg7XFxuK1xcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcXHUwMDI2dGNfaG9vayk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInRhcF9ob29rX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0dGNfb3B0cy5wcm9nX2lkID0gMDtcXG4rXFx0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGUpO1xcbitcXHRyZXQgPSBicGZfdGNfYXR0YWNoKFxcdTAwMjZ0Y19ob29rLCBcXHUwMDI2dGNfb3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInRhcF9hdHRhY2hcXFwiKSlcXG4rXFx0XFx0Z290byBjbG9zZTtcXG4rXFxuK1xcdFNZUyhjbG9zZSwgXFxcInRjIGZpbHRlciBhZGQgZGV2IFxcXCIgVEFQX05BTUUgXFxcIiBpbmdyZXNzIFxcXCJcXG4rXFx0XFx0ICAgXFxcInByb3RvY29sIGFsbCBtYXRjaGFsbCBcXFwiXFxuK1xcdFxcdCAgIFxcXCJhY3Rpb24gbWlycmVkIGluZ3Jlc3MgbWlycm9yIGRldiBcXFwiIERVTU1ZX05BTUUpO1xcbitcXG4rXFx0cmV0ID0gd3JpdGVfdGVzdF9wYWNrZXQodGFwX2ZkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfdGVzdF9wYWNrZXRcXFwiKSlcXG4rXFx0XFx0Z290byBjbG9zZTtcXG4rXFxuK1xcdEFTU0VSVF9UUlVFKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNld3JpdGVfZG9uZSwgXFxcIndyaXRlX2RvbmVcXFwiKTtcXG4rXFx0QVNTRVJUX1RSVUUoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MsIFxcXCJ0ZXN0X3Bhc3NcXFwiKTtcXG4rXFxuK2Nsb3NlOlxcbitcXHRpZiAodGFwX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKHRhcF9mZCk7XFxuK1xcdG5ldG5zX2ZyZWUobnMpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X21pcnJlZF9jbG9uZV9leHRfY293KHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbGluayAqdHBfbGluaztcXG4rXFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlY2xvbmVfY293X2RvbmUgPSBmYWxzZTtcXG4rXFx0dHBfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2goc2tlbC1cXHUwMDNlcHJvZ3MudHBfa2ZyZWVfc2tiX2Nvd19jaGVjayk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUih0cF9saW5rLCBcXFwiYXR0YWNoX3RwXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHRlc3RfbWlycmVkX2Nsb25lX2V4dChza2VsLCBza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X2Nsb25lX3JlZGlyX2Nvdyk7XFxuK1xcdGJwZl9saW5rX19kZXN0cm95KHRwX2xpbmspO1xcbit9XFxuK1xcbisvKlxcbisgKiBXcml0ZXIgY2xvbmVzIHZpYSBicGZfY2xvbmVfcmVkaXJlY3QoKSBmcm9tIHRoZSBwcm9nIGl0c2VsZiB0byBsb29wYmFja1xcbisgKiB3aG9zZSBuZXRlbSBxZGlzYyBkZWxheXMgdGhlIGNsb25lLCBzbyBpdCBzdGF5cyBxdWV1ZWQgYW5kIGtlZXBzIHNoYXJpbmdcXG4rICogdGhlIGV4dCBibG9jayB3aGlsZSB0aGUgcHJvZyB3cml0ZXMgYWdhaW4uIFdoZW4gdGhlIHFkaXNjIGZpbmFsbHkgbGVha3NcXG4rICogdGhlIGNsb25lIGJhY2sgdG8gbG8gaW5ncmVzcywgdGhlIHJlYWRlciB0aGVyZSBtdXN0IHN0aWxsIHNlZSB0aGVcXG4rICogY2xvbmUtdGltZSBzbmFwc2hvdC5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHRlc3RfY2xvbmVfcmVkaXJfZXh0X3dyaXRlX2FmdGVyKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBicGZfcHJvZ3JhbSAqd3JpdGVyKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xcbitcXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XFxuK1xcdGludCB0YXBfaWZpbmRleDtcXG4rXFx0aW50IHRhcF9mZCA9IC0xO1xcbitcXHRpbnQgcmV0LCBpO1xcbitcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V3cml0ZV9ibG9ja2VkID0gZmFsc2U7XFxuK1xcbitcXHRucyA9IG5ldG5zX25ldyhcXFwiY2xvbmVfcmVkaXJfZXh0XFxcIiwgdHJ1ZSk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihucywgXFxcIm5ldG5zX25ld1xcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHQvKiBSZWRpcmVjdCB0YXJnZXQ6IGxvIGhlbGQgYmFjayBieSBuZXRlbSBkZWxheSAqL1xcbitcXHRTWVMoY2xvc2UsIFxcXCJpcCBsaW5rIHNldCBkZXYgbG8gdXBcXFwiKTtcXG4rXFx0U1lTKGNsb3NlLCBcXFwidGMgcWRpc2MgYWRkIGRldiBsbyByb290IG5ldGVtIGRlbGF5IDUwbXNcXFwiKTtcXG4rXFxuK1xcdC8qIFJlYWRlciBvbiB0aGUgY2xvbmU6IGxvIGluZ3Jlc3MgKi9cXG4rXFx0dGNfaG9vay5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoXFxcImxvXFxcIik7XFxuK1xcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcXHUwMDI2dGNfaG9vayk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImxvX2hvb2tfY3JlYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkKTtcXG4rXFx0cmV0ID0gYnBmX3RjX2F0dGFjaChcXHUwMDI2dGNfaG9vaywgXFx1MDAyNnRjX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJsb19hdHRhY2hcXFwiKSlcXG4rXFx0XFx0Z290byBjbG9zZTtcXG4rXFxuK1xcdC8qIFRBUCBkZXY6IGF0dGFjaCB3cml0ZXIgd2hpY2ggY2xvbmVfcmVkaXJlY3RzIHRvIGxvICovXFxuK1xcdHRhcF9mZCA9IG9wZW5fdHVudGFwKFRBUF9OQU1FLCB0cnVlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UodGFwX2ZkLCAwLCBcXFwib3Blbl90dW50YXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbG9zZTtcXG4rXFxuK1xcdFNZUyhjbG9zZSwgXFxcImlwIGxpbmsgc2V0IGRldiBcXFwiIFRBUF9OQU1FIFxcXCIgdXBcXFwiKTtcXG4rXFxuK1xcdHRhcF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVEFQX05BTUUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRSh0YXBfaWZpbmRleCwgMCwgXFxcInRhcF9pZmluZGV4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZWNsb25lX3JlZGlyX2lmaW5kZXggPSB0Y19ob29rLmlmaW5kZXg7XFxuK1xcbitcXHR0Y19ob29rLmlmaW5kZXggPSB0YXBfaWZpbmRleDtcXG4rXFx0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFxcdTAwMjZ0Y19ob29rKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwidGFwX2hvb2tfY3JlYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHR0Y19vcHRzLnByb2dfaWQgPSAwO1xcbitcXHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQod3JpdGVyKTtcXG4rXFx0cmV0ID0gYnBmX3RjX2F0dGFjaChcXHUwMDI2dGNfaG9vaywgXFx1MDAyNnRjX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJ0YXBfYXR0YWNoXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHRyZXQgPSB3cml0ZV90ZXN0X3BhY2tldCh0YXBfZmQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJ3cml0ZV90ZXN0X3BhY2tldFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0QVNTRVJUX1RSVUUoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V3cml0ZV9ibG9ja2VkLCBcXFwid3JpdGVfYmxvY2tlZFxcXCIpO1xcbitcXG4rXFx0LyogQ2xvbmUgYXJyaXZlcyBhZnRlciB0aGUgbmV0ZW0gZGVsYXk7IHBvbGwgZXZlcnkgMTAgbXNlYyB1cCB0byAxIHNlYyAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgMTAwIFxcdTAwMjZcXHUwMDI2ICFza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3RfcGFzczsgaSsrKVxcbitcXHRcXHR1c2xlZXAoMTAwMDApO1xcbitcXHRBU1NFUlRfVFJVRShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3RfcGFzcywgXFxcInRlc3RfcGFzc1xcXCIpO1xcbitcXG4rY2xvc2U6XFxuK1xcdGlmICh0YXBfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UodGFwX2ZkKTtcXG4rXFx0bmV0bnNfZnJlZShucyk7XFxuK31cXG4rXFxuKy8qIFRlc3QgaWYgc2tiX2V4dCBzdXJ2aXZlcyB2ZXRoIGNyb3NzLW5ldG5zIGZvcndhcmQgKi9cXG4rc3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHR4X2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfRUdSRVNTKTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHR4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHJ4X2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCByeF9vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XFxuK1xcdHN0cnVjdCBuZXRuc19vYmogKnJ4X25zID0gTlVMTCwgKnR4X25zID0gTlVMTDtcXG4rXFx0c3RydWN0IG5zdG9rZW4gKm5zdG9rZW4gPSBOVUxMO1xcbitcXHRpbnQgcnhfaWZpbmRleCwgdHhfaWZpbmRleDtcXG4rXFx0aW50IHJldDtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHR0eF9ucyA9IG5ldG5zX25ldyhUWF9ORVROUywgZmFsc2UpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIodHhfbnMsIFxcXCJjcmVhdGUgdHhfbnNcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0cnhfbnMgPSBuZXRuc19uZXcoUlhfTkVUTlMsIGZhbHNlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHJ4X25zLCBcXFwiY3JlYXRlIHJ4X25zXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHRTWVMoY2xvc2UsIFxcXCJpcCBsaW5rIGFkZCBcXFwiIFJYX05BTUUgXFxcIiBuZXRucyBcXFwiIFJYX05FVE5TXFxuK1xcdCAgICBcXFwiIHR5cGUgdmV0aCBwZWVyIG5hbWUgXFxcIiBUWF9OQU1FIFxcXCIgbmV0bnMgXFxcIiBUWF9ORVROUyk7XFxuK1xcbitcXHQvKiBTZXR1cCBSWCBzaWRlOiBUQyBpbmdyZXNzIHJlYWRlciAqL1xcbitcXHRuc3Rva2VuID0gb3Blbl9uZXRucyhSWF9ORVROUyk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcXFwic2V0bnMgcnhfbnNcXFwiKSlcXG4rXFx0XFx0Z290byBjbG9zZTtcXG4rXFxuK1xcdFNZUyhjbG9zZSwgXFxcImlwIGxpbmsgc2V0IGRldiBcXFwiIFJYX05BTUUgXFxcIiB1cFxcXCIpO1xcbitcXG4rXFx0cnhfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFJYX05BTUUpO1xcbitcXHRpZiAoIUFTU0VSVF9HVChyeF9pZmluZGV4LCAwLCBcXFwiaWZfbmFtZXRvaW5kZXggcnhcXFwiKSlcXG4rXFx0XFx0Z290byBjbG9zZTtcXG4rXFxuK1xcdHJ4X2hvb2suaWZpbmRleCA9IHJ4X2lmaW5kZXg7XFxuK1xcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcXHUwMDI2cnhfaG9vayk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImJwZl90Y19ob29rX2NyZWF0ZSByeFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0cnhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZCk7XFxuK1xcdHJldCA9IGJwZl90Y19hdHRhY2goXFx1MDAyNnJ4X2hvb2ssIFxcdTAwMjZyeF9vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiYnBmX3RjX2F0dGFjaCByeFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0Y2xvc2VfbmV0bnMobnN0b2tlbik7XFxuK1xcbitcXHQvKiBTZXR1cCBUWCBzaWRlOiBUQyBlZ3Jlc3Mgd3JpdGVyICovXFxuK1xcdG5zdG9rZW4gPSBvcGVuX25ldG5zKFRYX05FVE5TKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sIFxcXCJzZXRucyB0eF9uc1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0U1lTKGNsb3NlLCBcXFwiaXAgbGluayBzZXQgZGV2IFxcXCIgVFhfTkFNRSBcXFwiIHVwXFxcIik7XFxuK1xcbitcXHR0eF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVFhfTkFNRSk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHR4X2lmaW5kZXgsIDAsIFxcXCJpZl9uYW1ldG9pbmRleCB0eFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0dHhfaG9vay5pZmluZGV4ID0gdHhfaWZpbmRleDtcXG4rXFx0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFxcdTAwMjZ0eF9ob29rKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiYnBmX3RjX2hvb2tfY3JlYXRlIHR4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHR0eF9vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XFxuK1xcdHJldCA9IGJwZl90Y19hdHRhY2goXFx1MDAyNnR4X2hvb2ssIFxcdTAwMjZ0eF9vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiYnBmX3RjX2F0dGFjaCB0eFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcXG4rXFxuK1xcdHJldCA9IHNlbmRfdGVzdF9wYWNrZXQodHhfaWZpbmRleCk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInNlbmRfdGVzdF9wYWNrZXRcXFwiKSlcXG4rXFx0XFx0Z290byBjbG9zZTtcXG4rXFxuK1xcdC8qIFBvbGwgZXZlcnkgMTAgbXNlYyB1cCB0byAxIHNlYyAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgMTAwIFxcdTAwMjZcXHUwMDI2ICFza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3RfcGFzczsgaSsrKVxcbitcXHRcXHR1c2xlZXAoMTAwMDApO1xcbitcXHRBU1NFUlRfVFJVRShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3RfcGFzcywgXFxcInRlc3RfcGFzc1xcXCIpO1xcbitcXG4rY2xvc2U6XFxuK1xcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xcbitcXHRuZXRuc19mcmVlKHJ4X25zKTtcXG4rXFx0bmV0bnNfZnJlZSh0eF9ucyk7XFxuK31cXG4rXFxuKy8qIFRlc3QgaWYgc2tiX2V4dCBzdXJ2aXZlcyBHUkUgdHVubmVsIGVuY2FwK2RlY2FwICovXFxuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF9zY3J1Yl9ncmUoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHR4X2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfRUdSRVNTKTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHR4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHJ4X2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCByeF9vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XFxuK1xcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcXG4rXFx0aW50IHR4X2lmaW5kZXg7XFxuK1xcdGludCByeF9pZmluZGV4O1xcbitcXHRpbnQgcmV0O1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzID0gZmFsc2U7XFxuK1xcbitcXHRucyA9IG5ldG5zX25ldyhcXFwiZ3JlX3Rlc3RcXFwiLCB0cnVlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcXFwibmV0bnNfbmV3XFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdC8qIFNldHVwOiBncmVfdHggLVxcdTAwM2UgbG8gLVxcdTAwM2UgZ3JlX3J4ICovXFxuK1xcdFNZUyhjbG9zZSwgXFxcImlwIGxpbmsgc2V0IGxvIHVwXFxcIik7XFxuK1xcdFNZUyhjbG9zZSwgXFxcImlwIGxpbmsgYWRkIGdyZV90eCB0eXBlIGdyZXRhcFxcXCJcXG4rXFx0ICAgIFxcXCIgbG9jYWwgMTI3LjAuMC4xIHJlbW90ZSAxMjcuMC4wLjJcXFwiKTtcXG4rXFx0U1lTKGNsb3NlLCBcXFwiaXAgbGluayBzZXQgZ3JlX3R4IHVwXFxcIik7XFxuK1xcdFNZUyhjbG9zZSwgXFxcImlwIGFkZHIgYWRkIDEyNy4wLjAuMi84IGRldiBsb1xcXCIpO1xcbitcXHRTWVMoY2xvc2UsIFxcXCJpcCBsaW5rIGFkZCBncmVfcnggdHlwZSBncmV0YXBcXFwiXFxuK1xcdCAgICBcXFwiIGxvY2FsIDEyNy4wLjAuMiByZW1vdGUgMTI3LjAuMC4xXFxcIik7XFxuK1xcdFNZUyhjbG9zZSwgXFxcImlwIGxpbmsgc2V0IGdyZV9yeCB1cFxcXCIpO1xcbitcXG4rXFx0LyogV3JpdGUgc2tiX2V4dCBvbiBUQyBlZ3Jlc3Mgb24gR1JFIHR4ICovXFxuK1xcdHR4X2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChcXFwiZ3JlX3R4XFxcIik7XFxuK1xcdGlmICghQVNTRVJUX0dUKHR4X2lmaW5kZXgsIDAsIFxcXCJ0eF9pZmluZGV4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHR0eF9ob29rLmlmaW5kZXggPSB0eF9pZmluZGV4O1xcbitcXHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXFx1MDAyNnR4X2hvb2spO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJ0eF9ob29rX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0dHhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGUpO1xcbitcXHRyZXQgPSBicGZfdGNfYXR0YWNoKFxcdTAwMjZ0eF9ob29rLCBcXHUwMDI2dHhfb3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInR4X2F0dGFjaFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0LyogUmVhZCBza2JfZXh0IG9uIFRDIGluZ3Jlc3Mgb24gR1JFIHJ4ICovXFxuK1xcdHJ4X2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChcXFwiZ3JlX3J4XFxcIik7XFxuK1xcdGlmICghQVNTRVJUX0dUKHJ4X2lmaW5kZXgsIDAsIFxcXCJyeF9pZmluZGV4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHRyeF9ob29rLmlmaW5kZXggPSByeF9pZmluZGV4O1xcbitcXHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXFx1MDAyNnJ4X2hvb2spO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJyeF9ob29rX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIGNsb3NlO1xcbitcXG4rXFx0cnhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZCk7XFxuK1xcdHJldCA9IGJwZl90Y19hdHRhY2goXFx1MDAyNnJ4X2hvb2ssIFxcdTAwMjZyeF9vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwicnhfYXR0YWNoXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHQvKiBUaGVuIHVzZSBzZW5kX3Rlc3RfcGFja2V0IG9uIEdSRSB0eCAqL1xcbitcXHRyZXQgPSBzZW5kX3Rlc3RfcGFja2V0KHR4X2lmaW5kZXgpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJzZW5kX3Rlc3RfcGFja2V0XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xvc2U7XFxuK1xcbitcXHQvKiBQb2xsIGV2ZXJ5IDEwIG1zZWMgdXAgdG8gMSBzZWMgKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIDEwMCBcXHUwMDI2XFx1MDAyNiAhc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3M7IGkrKylcXG4rXFx0XFx0dXNsZWVwKDEwMDAwKTtcXG4rXFx0QVNTRVJUX1RSVUUoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MsIFxcXCJ0ZXN0X3Bhc3NcXFwiKTtcXG4rXFxuK2Nsb3NlOlxcbitcXHRuZXRuc19mcmVlKG5zKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X3NrYl9leHRfYmFzaWModm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCA9IE5VTEw7XFxuK1xcbitcXHRza2VsID0gdGVzdF94ZHBfbWV0YV9fb3Blbl9hbmRfbG9hZCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm9wZW4gYW5kIGxvYWQgc2tlbGV0b25cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInRjX3dyaXRlX3JlYWRcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlLFxcbitcXHRcXHRcXHRcXHQgICAgc2tlbC1cXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkLFxcbitcXHRcXHRcXHRcXHQgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInRjX3dyaXRlX2Nsb25lX3JlYWRcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlLFxcbitcXHRcXHRcXHRcXHQgICAgc2tlbC1cXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9jbG9uZV9yZWFkLFxcbitcXHRcXHRcXHRcXHQgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInRjX3dyaXRlX3NsaWNlX3JlYWRcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlLFxcbitcXHRcXHRcXHRcXHQgICAgc2tlbC1cXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9zbGljZV9yZWFkLFxcbitcXHRcXHRcXHRcXHQgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInRjX3NsaWNlX3dyaXRlX3JlYWRcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3NsaWNlX3dyaXRlLFxcbitcXHRcXHRcXHRcXHQgICAgc2tlbC1cXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkLFxcbitcXHRcXHRcXHRcXHQgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInRjX25vX2FsbG9jXFxcIikpXFxuK1xcdFxcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9ub19hbGxvYyxcXG4rXFx0XFx0XFx0XFx0ICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqL1xcbitcXHRcXHRcXHRcXHQgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInRjX2ludmFsaWRfZmxhZ3NcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X2ludmFsaWRfZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdCAgICBOVUxMLCAvKiB0YyBwcmlvIDIgKi9cXG4rXFx0XFx0XFx0XFx0ICAgIFxcdTAwMjZza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3RfcGFzcyk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0Y19yZG9ubHlcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3Jkb25seSxcXG4rXFx0XFx0XFx0XFx0ICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqL1xcbitcXHRcXHRcXHRcXHQgICAgXFx1MDAyNnNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInRjX2RvdWJsZV9hbGxvY1xcXCIpKVxcbitcXHRcXHR0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtXFx1MDAzZXByb2dzLnRjX3NrYl9leHRfZG91YmxlX2FsbG9jLFxcbitcXHRcXHRcXHRcXHQgICAgTlVMTCwgLyogdGMgcHJpbyAyICovXFxuK1xcdFxcdFxcdFxcdCAgICBcXHUwMDI2c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2xvbmVfZXh0X3JlYWRcXFwiKSlcXG4rXFx0XFx0dGVzdF9taXJyZWRfY2xvbmVfZXh0KHNrZWwsIHNrZWwtXFx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJjbG9uZV9leHRfY293XFxcIikpXFxuK1xcdFxcdHRlc3RfbWlycmVkX2Nsb25lX2V4dF9jb3coc2tlbCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJjbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9jbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXIoc2tlbCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHNrZWwtXFx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGVfYWZ0ZXJfY2xvbmVfcmVkaXIpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiY2xvbmVfcmVkaXJfZXh0X3NsaWNlX3dyaXRlX2FmdGVyXFxcIikpXFxuK1xcdFxcdHRlc3RfY2xvbmVfcmVkaXJfZXh0X3dyaXRlX2FmdGVyKHNrZWwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCBza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3NsaWNlX3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInN1cnZpdmVzX3ZldGhcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc2tlbCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzdXJ2aXZlc19ncmVcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3NjcnViX2dyZShza2VsKTtcXG4rXFxuK1xcdHRlc3RfeGRwX21ldGFfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuKy8qIFNlbmQgdGVzdF9wYXlsb2FkIG92ZXIgbG9vcGJhY2sgVURQIHRvIHJlY3ZfZmQgKi9cXG4rc3RhdGljIGludCBzZW5kX2xvb3BiYWNrX3VkcChpbnQgcmVjdl9mZClcXG4re1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHtcXG4rXFx0XFx0LnNpbl9mYW1pbHkgPSBBRl9JTkVULFxcbitcXHRcXHQuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKSxcXG4rXFx0fTtcXG4rXFx0Y2hhciBidWZbVEVTVF9QQVlMT0FEX0xFTl07XFxuK1xcdGludCByZXQgPSAtMTtcXG4rXFx0aW50IGZkID0gLTE7XFxuK1xcdGludCBwb3J0O1xcbitcXG4rXFx0cG9ydCA9IGdldF9zb2NrZXRfbG9jYWxfcG9ydChyZWN2X2ZkKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocG9ydCwgMCwgXFxcImdldF9wb3J0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwic29ja2V0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0YWRkci5zaW5fcG9ydCA9IHBvcnQ7XFxuK1xcdHNlbmR0byhmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwLFxcbitcXHQgICAgICAgKHZvaWQgKilcXHUwMDI2YWRkciwgc2l6ZW9mKGFkZHIpKTtcXG4rXFx0cmVjdmZyb20ocmVjdl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7XFxuK1xcdHJldCA9IDA7XFxuK291dDpcXG4rXFx0aWYgKGZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rZW51bSB1ZHBfcmVhZGVyX3R5cGUge1xcbitcXHRSRUFERVJfQ0dSUF9TS0IsXFxuK1xcdFJFQURFUl9TS19GSUxURVIsXFxuK307XFxuK1xcbisvKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgYWNyb3NzIFRDIGluZ3Jlc3MgLVxcdTAwM2UgVURQIHJlYWRlciBob29rICovXFxuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF91ZHAoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsIGNvbnN0IGNoYXIgKm5hbWUsXFxuK1xcdFxcdFxcdCAgICAgZW51bSB1ZHBfcmVhZGVyX3R5cGUgcmVhZGVyKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLFxcbitcXHRcXHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXFxuK1xcdFxcdCAgICAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xcbitcXHRzdHJ1Y3QgYnBmX2xpbmsgKnJlYWRlcl9saW5rID0gTlVMTDtcXG4rXFx0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xcbitcXHRpbnQgc2VydmVyX2ZkID0gLTE7XFxuK1xcdGludCBjZ3JvdXBfZmQgPSAtMTtcXG4rXFx0aW50IGZpbHRlcl9mZDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdG5zID0gbmV0bnNfbmV3KG5hbWUsIHRydWUpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFxcXCJuZXRuc19uZXdcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0Y2dyb3VwX2ZkID0gdGVzdF9fam9pbl9jZ3JvdXAoXFxcIi9za2JfZXh0X3VkcFxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShjZ3JvdXBfZmQsIDAsIFxcXCJqb2luX2Nncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRzZXJ2ZXJfZmQgPSBzdGFydF9zZXJ2ZXIoQUZfSU5FVCwgU09DS19ER1JBTSwgXFxcIjEyNy4wLjAuMVxcXCIsIDAsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFxcXCJzdGFydF9zZXJ2ZXJcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcXG4rXFxuK1xcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcXHUwMDI2dGNfaG9vayk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImJwZl90Y19ob29rX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XFxuK1xcdHJldCA9IGJwZl90Y19hdHRhY2goXFx1MDAyNnRjX2hvb2ssIFxcdTAwMjZ0Y19vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiYnBmX3RjX2F0dGFjaFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRzd2l0Y2ggKHJlYWRlcikge1xcbitcXHRjYXNlIFJFQURFUl9DR1JQX1NLQjpcXG4rXFx0XFx0cmVhZGVyX2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2Nncm91cChza2VsLVxcdTAwM2Vwcm9ncy5jZ3JwX3NrYl9leHRfcmVhZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0IGNncm91cF9mZCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihyZWFkZXJfbGluaywgXFxcImF0dGFjaF9jZ3JvdXBcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBSRUFERVJfU0tfRklMVEVSOlxcbitcXHRcXHRmaWx0ZXJfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3Muc2tfZmlsdGVyX3NrYl9leHRfcmVhZCk7XFxuK1xcdFxcdHJldCA9IHNldHNvY2tvcHQoc2VydmVyX2ZkLCBTT0xfU09DS0VULCBTT19BVFRBQ0hfQlBGLFxcbitcXHRcXHRcXHRcXHQgXFx1MDAyNmZpbHRlcl9mZCwgc2l6ZW9mKGZpbHRlcl9mZCkpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJhdHRhY2hfc29ja2V0X2ZpbHRlclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoc2VuZF9sb29wYmFja191ZHAoc2VydmVyX2ZkKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0QVNTRVJUX1RSVUUoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MsIFxcXCJ0ZXN0X3Bhc3NcXFwiKTtcXG4rXFxuK2NsZWFudXA6XFxuK1xcdGJwZl9saW5rX19kZXN0cm95KHJlYWRlcl9saW5rKTtcXG4rXFx0YnBmX3RjX2hvb2tfZGVzdHJveShcXHUwMDI2dGNfaG9vayk7XFxuK1xcdGlmIChzZXJ2ZXJfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2Uoc2VydmVyX2ZkKTtcXG4rXFx0aWYgKGNncm91cF9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShjZ3JvdXBfZmQpO1xcbitcXHRuZXRuc19mcmVlKG5zKTtcXG4rfVxcbitcXG4rZW51bSB0Y3BfcmVhZGVyX3R5cGUge1xcbitcXHRSRUFERVJfU0tPUFMsXFxuK1xcdFJFQURFUl9MU00sXFxuK307XFxuK1xcbisvKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgYWNyb3NzIFRDIGluZ3Jlc3MgLVxcdTAwM2UgVENQIHJlYWRlciBob29rICovXFxuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF90Y3Aoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsIGNvbnN0IGNoYXIgKm5hbWUsXFxuK1xcdFxcdFxcdCAgICAgZW51bSB0Y3BfcmVhZGVyX3R5cGUgcmVhZGVyKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLFxcbitcXHRcXHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXFxuK1xcdFxcdCAgICAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xcbitcXHRzdHJ1Y3QgYnBmX2xpbmsgKnJlYWRlcl9saW5rID0gTlVMTDtcXG4rXFx0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xcbitcXHRpbnQgc2VydmVyX2ZkID0gLTE7XFxuK1xcdGludCBjZ3JvdXBfZmQgPSAtMTtcXG4rXFx0aW50IGNsaWVudF9mZCA9IC0xO1xcbitcXHRpbnQgY29ubl9mZCA9IC0xO1xcbitcXHRpbnQgcG9ydDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdG5zID0gbmV0bnNfbmV3KG5hbWUsIHRydWUpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFxcXCJuZXRuc19uZXdcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0Y2dyb3VwX2ZkID0gdGVzdF9fam9pbl9jZ3JvdXAoXFxcIi9za2JfZXh0X3RjcFxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShjZ3JvdXBfZmQsIDAsIFxcXCJqb2luX2Nncm91cFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRzZXJ2ZXJfZmQgPSBzdGFydF9zZXJ2ZXIoQUZfSU5FVCwgU09DS19TVFJFQU0sIFxcXCIxMjcuMC4wLjFcXFwiLCAwLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0Uoc2VydmVyX2ZkLCAwLCBcXFwic3RhcnRfc2VydmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHBvcnQgPSBnZXRfc29ja2V0X2xvY2FsX3BvcnQoc2VydmVyX2ZkKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocG9ydCwgMCwgXFxcImdldF9wb3J0XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGFyZ2V0X3BvcnQgPSBwb3J0O1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xcbitcXG4rXFx0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFxcdTAwMjZ0Y19ob29rKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiYnBmX3RjX2hvb2tfY3JlYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlX3BvcnQpO1xcbitcXHRyZXQgPSBicGZfdGNfYXR0YWNoKFxcdTAwMjZ0Y19ob29rLCBcXHUwMDI2dGNfb3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImJwZl90Y19hdHRhY2hcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c3dpdGNoIChyZWFkZXIpIHtcXG4rXFx0Y2FzZSBSRUFERVJfU0tPUFM6XFxuK1xcdFxcdHJlYWRlcl9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9jZ3JvdXAoc2tlbC1cXHUwMDNlcHJvZ3Muc2tvcHNfc2tiX2V4dF9yZWFkLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgY2dyb3VwX2ZkKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfUFRSKHJlYWRlcl9saW5rLCBcXFwiYXR0YWNoX3Nrb3BzXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgUkVBREVSX0xTTTpcXG4rXFx0XFx0cmVhZGVyX2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2xzbShza2VsLVxcdTAwM2Vwcm9ncy5sc21fc2tiX2V4dF9yZWFkKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfUFRSKHJlYWRlcl9saW5rLCBcXFwiYXR0YWNoX2xzbVxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcbitcXHRjbGllbnRfZmQgPSBjb25uZWN0X3RvX2ZkKHNlcnZlcl9mZCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGNsaWVudF9mZCwgMCwgXFxcImNvbm5lY3RcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0Y29ubl9mZCA9IGFjY2VwdChzZXJ2ZXJfZmQsIE5VTEwsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShjb25uX2ZkLCAwLCBcXFwiYWNjZXB0XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdEFTU0VSVF9UUlVFKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzLCBcXFwidGVzdF9wYXNzXFxcIik7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRpZiAoY29ubl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShjb25uX2ZkKTtcXG4rXFx0aWYgKGNsaWVudF9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShjbGllbnRfZmQpO1xcbitcXHRicGZfbGlua19fZGVzdHJveShyZWFkZXJfbGluayk7XFxuK1xcdGJwZl90Y19ob29rX2Rlc3Ryb3koXFx1MDAyNnRjX2hvb2spO1xcbitcXHRpZiAoc2VydmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKHNlcnZlcl9mZCk7XFxuK1xcdGlmIChjZ3JvdXBfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoY2dyb3VwX2ZkKTtcXG4rXFx0bmV0bnNfZnJlZShucyk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCB1bnRpbCBza2IgZnJlZTogY2dyb3VwL3NrYiBlZ3Jlc3MgLVxcdTAwM2Uga2ZyZWVfc2tiLlxcbisgKiBTZW5kIFVEUCB0byBhIGNsb3NlZCBwb3J0LiBUaGUgcGFja2V0IGlzIGRyb3BwZWQsIHRyaWdnZXJpbmcga2ZyZWVfc2tiLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgdGVzdF9jZ3JwX2VncmVzc190b19rZnJlZV9za2Ioc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXFxuK3tcXG4rXFx0c3RydWN0IHNvY2thZGRyX2luIGFkZHIgPSB7XFxuK1xcdFxcdC5zaW5fZmFtaWx5ID0gQUZfSU5FVCxcXG4rXFx0XFx0LnNpbl9wb3J0ID0gaHRvbnMoNDMyMSksXFxuK1xcdFxcdC5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spLFxcbitcXHR9O1xcbitcXHRzdHJ1Y3QgYnBmX2xpbmsgKmNnX2xpbmsgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgYnBmX2xpbmsgKnRwX2xpbmsgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XFxuK1xcdGludCBjZ3JvdXBfZmQgPSAtMTtcXG4rXFx0Y2hhciBidWZbMV07XFxuK1xcdGludCBmZCA9IC0xO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0Y2dyb3VwX2ZkID0gdGVzdF9fam9pbl9jZ3JvdXAoXFxcIi9jZ3JwX3RvX2tmcmVlXFxcIik7XFxuK1xcdGlmICghQVNTRVJUX0dFKGNncm91cF9mZCwgMCwgXFxcImpvaW5fY2dyb3VwXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdG5zID0gbmV0bnNfbmV3KFxcXCJjZ3JwX3RvX2tmcmVlXFxcIiwgdHJ1ZSk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihucywgXFxcIm5ldG5zX25ld1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xcbitcXG4rXFx0Y2dfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfY2dyb3VwKHNrZWwtXFx1MDAzZXByb2dzLmNncnBfc2tiX2V4dF93cml0ZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBjZ3JvdXBfZmQpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoY2dfbGluaywgXFxcImF0dGFjaF9jZ3JvdXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0dHBfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfdHJhY2Uoc2tlbC1cXHUwMDNlcHJvZ3MudHBfa2ZyZWVfc2tiX2V4dF9yZWFkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHRwX2xpbmssIFxcXCJhdHRhY2hfdHBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwic29ja2V0XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNvbm5lY3QoZmQsICh2b2lkICopXFx1MDAyNmFkZHIsIHNpemVvZihhZGRyKSk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImNvbm5lY3RcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gc2VuZChmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEocmV0LCBURVNUX1BBWUxPQURfTEVOLCBcXFwic2VuZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHQvKiBXYWl0IGZvciBJQ01QIGVycm9yIC0tIGNvbmZpcm1zIHRoZSBwYWNrZXQgd2FzIGZyZWVkICovXFxuK1xcdHJldCA9IHJlY3YoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIDApO1xcbitcXHRpZiAoIUFTU0VSVF9FUShyZXQsIC0xLCBcXFwicmVjdlxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdEFTU0VSVF9FUShlcnJubywgRUNPTk5SRUZVU0VELCBcXFwicmVjdl9lY29ubnJlZnVzZWRcXFwiKTtcXG4rXFxuK1xcdEFTU0VSVF9UUlVFKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzLCBcXFwidGVzdF9wYXNzXFxcIik7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRpZiAoZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRicGZfbGlua19fZGVzdHJveSh0cF9saW5rKTtcXG4rXFx0YnBmX2xpbmtfX2Rlc3Ryb3koY2dfbGluayk7XFxuK1xcdG5ldG5zX2ZyZWUobnMpO1xcbitcXHRpZiAoY2dyb3VwX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGNncm91cF9mZCk7XFxuK31cXG4rXFxuKy8qIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgaW5ncmVzcyAtXFx1MDAzZSBuZXRmaWx0ZXIgaG9vayAqL1xcbitzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfbmYoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsIGNvbnN0IGNoYXIgKm5hbWUpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssXFxuK1xcdFxcdCAgICAuaWZpbmRleCA9IDEgLyogSUZJTkRFWF9MTyAqLyxcXG4rXFx0XFx0ICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9uZXRmaWx0ZXJfb3B0cywgbmZfb3B0cyxcXG4rXFx0XFx0ICAgIC5wZiA9IE5GUFJPVE9fSVBWNCxcXG4rXFx0XFx0ICAgIC5ob29rbnVtID0gTkZfSU5FVF9MT0NBTF9JTixcXG4rXFx0XFx0ICAgIC5wcmlvcml0eSA9IDEpO1xcbitcXHRzdHJ1Y3QgYnBmX2xpbmsgKnJlYWRlcl9saW5rID0gTlVMTDtcXG4rXFx0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xcbitcXHRpbnQgc2VydmVyX2ZkID0gLTE7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRucyA9IG5ldG5zX25ldyhuYW1lLCB0cnVlKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcXFwibmV0bnNfbmV3XFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVULCBTT0NLX0RHUkFNLCBcXFwiMTI3LjAuMC4xXFxcIiwgMCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKHNlcnZlcl9mZCwgMCwgXFxcInN0YXJ0X3NlcnZlclxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xcbitcXG4rXFx0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFxcdTAwMjZ0Y19ob29rKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiYnBmX3RjX2hvb2tfY3JlYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlKTtcXG4rXFx0cmV0ID0gYnBmX3RjX2F0dGFjaChcXHUwMDI2dGNfaG9vaywgXFx1MDAyNnRjX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJicGZfdGNfYXR0YWNoXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJlYWRlcl9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9uZXRmaWx0ZXIoc2tlbC1cXHUwMDNlcHJvZ3MubmZfc2tiX2V4dF9yZWFkLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgXFx1MDAyNm5mX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssIFxcXCJhdHRhY2hfbmZcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0aWYgKHNlbmRfbG9vcGJhY2tfdWRwKHNlcnZlcl9mZCkpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdEFTU0VSVF9UUlVFKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzLCBcXFwidGVzdF9wYXNzXFxcIik7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRicGZfbGlua19fZGVzdHJveShyZWFkZXJfbGluayk7XFxuK1xcdGJwZl90Y19ob29rX2Rlc3Ryb3koXFx1MDAyNnRjX2hvb2spO1xcbitcXHRpZiAoc2VydmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKHNlcnZlcl9mZCk7XFxuK1xcdG5ldG5zX2ZyZWUobnMpO1xcbit9XFxuK1xcbisjZGVmaW5lIExXVF9FWFRfUElOX1BBVEggXFxcIi9zeXMvZnMvYnBmL3NrYl9leHRfbHd0XFxcIlxcbitcXG4rLypcXG4rICogVGVzdCBza2JfZXh0IGFjcm9zcyBMV1QgaG9va3Mgb24gbG9vcGJhY2suXFxuKyAqXFxuKyAqIEBsd3RfcHJvZzogIEJQRiBwcm9ncmFtIHRvIHBpbiBhbmQgYXR0YWNoIHZpYSBpcCByb3V0ZSBlbmNhcFxcbisgKiBAZW5jYXBfZGlyOiBcXFwiaW5cXFwiLCBcXFwib3V0XFxcIiwgb3IgXFxcInhtaXRcXFwiXFxuKyAqIEB3cml0ZXI6ICAgIHRydWUgaWYgbHd0X3Byb2cgd3JpdGVzIHNrYl9leHQgKHJlYWRlciBvbiBUQyBpbmdyZXNzKSxcXG4rICogICAgICAgICAgICAgZmFsc2UgaWYgbHd0X3Byb2cgcmVhZHMgc2tiX2V4dCAod3JpdGVyIG9uIFRDIGluZ3Jlc3MpXFxuKyAqL1xcbitzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfbHd0KHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lLFxcbitcXHRcXHRcXHQgICAgIHN0cnVjdCBicGZfcHJvZ3JhbSAqbHd0X3Byb2csXFxuK1xcdFxcdFxcdCAgICAgY29uc3QgY2hhciAqZW5jYXBfZGlyLCBib29sIHdyaXRlcilcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vayxcXG4rXFx0XFx0ICAgIC5pZmluZGV4ID0gMSAvKiBJRklOREVYX0xPICovLFxcbitcXHRcXHQgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcXG4rXFx0c3RydWN0IHNvY2thZGRyX2luIGFkZHIgPSB7XFxuK1xcdFxcdC5zaW5fZmFtaWx5ID0gQUZfSU5FVCxcXG4rXFx0fTtcXG4rXFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcm9nO1xcbitcXHRjaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTtcXG4rXFx0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xcbitcXHRib29sIHBpbm5lZCA9IGZhbHNlO1xcbitcXHRpbnQgc2VydmVyX2ZkID0gLTE7XFxuK1xcdGludCBmZCA9IC0xO1xcbitcXHRpbnQgcG9ydDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHVubGluayhMV1RfRVhUX1BJTl9QQVRIKTtcXG4rXFx0cmV0ID0gYnBmX3Byb2dyYW1fX3Bpbihsd3RfcHJvZywgTFdUX0VYVF9QSU5fUEFUSCk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInBpbiBsd3RcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRwaW5uZWQgPSB0cnVlO1xcbitcXG4rXFx0bnMgPSBuZXRuc19uZXcobmFtZSwgdHJ1ZSk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihucywgXFxcIm5ldG5zX25ld1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfcHJlaG9vaztcXG4rXFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgYWRkciBhZGQgMTAuMC4wLjEvMzIgZGV2IGxvXFxcIik7XFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgcm91dGUgcmVwbGFjZSB0YWJsZSBsb2NhbCBsb2NhbCAxMC4wLjAuMSBcXFwiXFxuK1xcdFxcdCAgICAgXFxcImVuY2FwIGJwZiAlcyBwaW5uZWQgXFxcIiBMV1RfRVhUX1BJTl9QQVRIIFxcXCIgZGV2IGxvXFxcIixcXG4rXFx0XFx0ICAgICBlbmNhcF9kaXIpO1xcbitcXG4rXFx0c2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQsIFNPQ0tfREdSQU0sIFxcXCIxMC4wLjAuMVxcXCIsIDAsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFxcXCJzdGFydF9zZXJ2ZXJcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX3ByZWhvb2s7XFxuK1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xcbitcXG4rXFx0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFxcdTAwMjZ0Y19ob29rKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiYnBmX3RjX2hvb2tfY3JlYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9wcmVob29rO1xcbitcXG4rXFx0LyogV2hlbiBMV1Qgd3JpdGVzLCBUQyBpbmdyZXNzIHJlYWRzOyB3aGVuIExXVCByZWFkcywgVEMgaW5ncmVzcyB3cml0ZXMgKi9cXG4rXFx0dGNfcHJvZyA9IHdyaXRlciA/IHNrZWwtXFx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZFxcbitcXHRcXHRcXHQgOiBza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlO1xcbitcXHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQodGNfcHJvZyk7XFxuK1xcdHJldCA9IGJwZl90Y19hdHRhY2goXFx1MDAyNnRjX2hvb2ssIFxcdTAwMjZ0Y19vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiYnBmX3RjX2F0dGFjaFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRwb3J0ID0gZ2V0X3NvY2tldF9sb2NhbF9wb3J0KHNlcnZlcl9mZCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKHBvcnQsIDAsIFxcXCJnZXRfcG9ydFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJzb2NrZXRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0aW5ldF9wdG9uKEFGX0lORVQsIFxcXCIxMC4wLjAuMVxcXCIsIFxcdTAwMjZhZGRyLnNpbl9hZGRyKTtcXG4rXFx0YWRkci5zaW5fcG9ydCA9IHBvcnQ7XFxuK1xcdHJldCA9IHNlbmR0byhmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwLFxcbitcXHRcXHQgICAgICh2b2lkICopXFx1MDAyNmFkZHIsIHNpemVvZihhZGRyKSk7XFxuK1xcdGlmICghQVNTRVJUX0VRKHJldCwgVEVTVF9QQVlMT0FEX0xFTiwgXFxcInNlbmR0b1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdHJldCA9IHJlY3Zmcm9tKHNlcnZlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7XFxuK1xcdEFTU0VSVF9FUShyZXQsIFRFU1RfUEFZTE9BRF9MRU4sIFxcXCJyZWN2ZnJvbVxcXCIpO1xcbitcXG4rXFx0QVNTRVJUX1RSVUUoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MsIFxcXCJ0ZXN0X3Bhc3NcXFwiKTtcXG4rXFxuK2NsZWFudXA6XFxuK1xcdGlmIChmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShmZCk7XFxuK1xcdGJwZl90Y19ob29rX2Rlc3Ryb3koXFx1MDAyNnRjX2hvb2spO1xcbitjbGVhbnVwX3ByZWhvb2s6XFxuK1xcdGlmIChzZXJ2ZXJfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2Uoc2VydmVyX2ZkKTtcXG4rXFx0bmV0bnNfZnJlZShucyk7XFxuK1xcdGlmIChwaW5uZWQpXFxuK1xcdFxcdHVubGluayhMV1RfRVhUX1BJTl9QQVRIKTtcXG4rfVxcbitcXG4rI2RlZmluZSBTRUc2X1BJTl9QQVRIIFxcXCIvc3lzL2ZzL2JwZi9za2JfZXh0X3NlZzZsb2NhbFxcXCJcXG4rXFxuKy8qXFxuKyAqIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgZWdyZXNzIC1cXHUwMDNlIHNlZzZsb2NhbCBFbmQuQlBGIGhvb2suXFxuKyAqXFxuKyAqIFRvcG9sb2d5OlxcbisgKlxcbisgKiAgICAgTlMxICAgICAgICAgICBOUzIgICAgICAgICAgICBOUzNcXG4rICogICBsbyB2ZXRoMSBcXHUwMDNjLVxcdTAwM2UgdmV0aDIgdmV0aDMgXFx1MDAzYy1cXHUwMDNlIHZldGg0IGxvXFxuKyAqXFxuKyAqIE5TMSBlbmNhcHMgZmIwMTo6MiB3aXRoIFNSSCAoc2VnbWVudHMgZmQwMTo6MSxmZDAxOjoyKSBvbiBvdXRwdXQgYW5kXFxuKyAqIHdyaXRlcyBza2JfZXh0IGF0IFRDIGVncmVzcyBvbiB2ZXRoMS4gTlMyIHJ1bnMgRW5kLkJQRiBmb3IgZmQwMTo6MSxcXG4rICogd2hpY2ggcmVhZHMgc2tiX2V4dCwgdGhlbiBmb3J3YXJkcyB0byBOUzMgKHNlZzZfbG9va3VwX25leHRob3BcXG4rICogcmVqZWN0cyBsb29wYmFjayByb3V0ZXMgd2l0aCBsb2NhbF9kZWxpdmVyeT1mYWxzZSwgc28gRW5kLkJQRlxcbisgKiBjYW5ub3QgZGVsaXZlciBsb2NhbGx5KS4gTlMzIGhhcyBmZDAxOjoyIGxvY2FsLCBkZWNhcHN1bGF0ZXMsIGFuZFxcbisgKiBkZWxpdmVycyB0aGUgaW5uZXIgVURQIChkc3Q9ZmIwMTo6MikgdG8gYSBsb2NhbCBzb2NrZXQgZm9yIHRlc3RcXG4rICogc3luY2hyb25pemF0aW9uLlxcbisgKlxcbisgKiBUaGUgVEMgcHJvZ3JhbSBkcm9wcyBub24tdGVzdCBwYWNrZXRzLCBzbyBORFAgaXMgYnlwYXNzZWQgd2l0aCBhXFxuKyAqIHN0YXRpYyBuZWlnaGJvciBlbnRyeSBvbiB0aGUgTlMxLVxcdTAwM2VOUzIgaG9wLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NlZzZsb2NhbChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbClcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19FR1JFU1MpO1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xcbitcXHRzdHJ1Y3QgbnN0b2tlbiAqbnN0b2tlbiA9IE5VTEw7XFxuK1xcdHN0cnVjdCBzb2NrYWRkcl9pbjYgZHN0ID0ge307XFxuK1xcdGNoYXIgYnVmW1RFU1RfUEFZTE9BRF9MRU5dO1xcbitcXHRib29sIHBpbm5lZCA9IGZhbHNlO1xcbitcXHRpbnQgY2xpZW50X2ZkID0gLTE7XFxuK1xcdGludCBzZXJ2ZXJfZmQgPSAtMTtcXG4rXFx0c3NpemVfdCBieXRlcztcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHVubGluayhTRUc2X1BJTl9QQVRIKTtcXG4rXFx0cmV0ID0gYnBmX3Byb2dyYW1fX3Bpbihza2VsLVxcdTAwM2Vwcm9ncy5zZWc2bG9jYWxfc2tiX2V4dF9yZWFkLFxcbitcXHRcXHRcXHQgICAgICAgU0VHNl9QSU5fUEFUSCk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInBpbiBzZWc2bG9jYWxcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRwaW5uZWQgPSB0cnVlO1xcbitcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcXG4rXFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgbmV0bnMgYWRkIHNlZzZfMVxcXCIpO1xcbitcXHRTWVMoY2xlYW51cCwgXFxcImlwIG5ldG5zIGFkZCBzZWc2XzJcXFwiKTtcXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJpcCBuZXRucyBhZGQgc2VnNl8zXFxcIik7XFxuK1xcbitcXHQvKiBOUzEgXFx1MDAzYy1cXHUwMDNlIE5TMiB2ZXRoIHBhaXI7IHN0YXRpYyBORFAgc2luY2UgVEMgZHJvcHMgTlMvTkEgKi9cXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJpcCAtbiBzZWc2XzEgbGluayBhZGQgdmV0aDEgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2ZXRoMiBuZXRucyBzZWc2XzJcXFwiKTtcXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJpcCAtbiBzZWc2XzEgbGluayBzZXQgZGV2IHZldGgxIHVwXFxcIik7XFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgLW4gc2VnNl8yIGxpbmsgc2V0IGRldiB2ZXRoMiBhZGRyZXNzIDAyOjAwOjAwOjAwOjAwOjAyXFxcIik7XFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgLW4gc2VnNl8yIGxpbmsgc2V0IGRldiB2ZXRoMiB1cFxcXCIpO1xcbitcXHRTWVMoY2xlYW51cCwgXFxcImlwIC1uIHNlZzZfMSAtNiBhZGRyIGFkZCBmYjAwOjoxMi8xNiBkZXYgdmV0aDEgc2NvcGUgbGluayBub2RhZFxcXCIpO1xcbitcXHRTWVMoY2xlYW51cCwgXFxcImlwIC1uIHNlZzZfMiAtNiBhZGRyIGFkZCBmYjAwOjoyMS8xNiBkZXYgdmV0aDIgc2NvcGUgbGluayBub2RhZFxcXCIpO1xcbitcXHRTWVMoY2xlYW51cCwgXFxcImlwIC1uIHNlZzZfMSAtNiBuZWlnaCBhZGQgZmIwMDo6MjEgbGxhZGRyIDAyOjAwOjAwOjAwOjAwOjAyIFxcXCJcXG4rXFx0XFx0ICAgICBcXFwibnVkIHBlcm1hbmVudCBkZXYgdmV0aDFcXFwiKTtcXG4rXFxuK1xcdC8qIE5TMiBcXHUwMDNjLVxcdTAwM2UgTlMzIHZldGggcGFpciAqL1xcbitcXHRTWVMoY2xlYW51cCwgXFxcImlwIC1uIHNlZzZfMiBsaW5rIGFkZCB2ZXRoMyB0eXBlIHZldGggcGVlciBuYW1lIHZldGg0IG5ldG5zIHNlZzZfM1xcXCIpO1xcbitcXHRTWVMoY2xlYW51cCwgXFxcImlwIC1uIHNlZzZfMiBsaW5rIHNldCBkZXYgdmV0aDMgdXBcXFwiKTtcXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJpcCAtbiBzZWc2XzMgbGluayBzZXQgZGV2IHZldGg0IHVwXFxcIik7XFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgLW4gc2VnNl8yIC02IGFkZHIgYWRkIGZiMDA6OjM0LzE2IGRldiB2ZXRoMyBzY29wZSBsaW5rIG5vZGFkXFxcIik7XFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgLW4gc2VnNl8zIC02IGFkZHIgYWRkIGZiMDA6OjQzLzE2IGRldiB2ZXRoNCBzY29wZSBsaW5rIG5vZGFkXFxcIik7XFxuK1xcbitcXHQvKiBOUzE6IHNvdXJjZSBhZGRyZXNzICsgU1JIIGVuY2FwIG9uIG91dHB1dCArIHJvdXRlIGZvciBmZDAxOjovMTYgKi9cXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJpcCAtbiBzZWc2XzEgbGluayBzZXQgZGV2IGxvIHVwXFxcIik7XFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgLW4gc2VnNl8xIC02IGFkZHIgYWRkIGZiMDE6OjEvMTI4IGRldiBsbyBub2RhZFxcXCIpO1xcbitcXHRTWVMoY2xlYW51cCwgXFxcImlwIC1uIHNlZzZfMSAtNiByb3V0ZSBhZGQgZmIwMTo6MiBlbmNhcCBzZWc2IG1vZGUgZW5jYXAgXFxcIlxcbitcXHRcXHQgICAgIFxcXCJzZWdzIGZkMDE6OjEsZmQwMTo6MiBkZXYgdmV0aDEgdmlhIGZiMDA6OjIxXFxcIik7XFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgLW4gc2VnNl8xIC02IHJvdXRlIGFkZCBmZDAxOjovMTYgZGV2IHZldGgxIHZpYSBmYjAwOjoyMVxcXCIpO1xcbitcXG4rXFx0LyogTlMyOiBzZWc2bG9jYWwgRW5kLkJQRiBmb3IgZmQwMTo6MSwgdGhlbiBmb3J3YXJkIHRvIE5TMy5cXG4rXFx0ICogVXNlIG9wZW5fbmV0bnMgc28gdGhlIHBpbm5lZCBwcm9nIG9uIGJwZmZzIGlzIGFjY2Vzc2libGUuXFxuK1xcdCAqL1xcbitcXHRuc3Rva2VuID0gb3Blbl9uZXRucyhcXFwic2VnNl8yXFxcIik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcXFwib3BlbiBzZWc2XzJcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJpcCBsaW5rIHNldCBkZXYgbG8gdXBcXFwiKTtcXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJzeXNjdGwgLXdxIG5ldC5pcHY2LmNvbmYuYWxsLmZvcndhcmRpbmc9MVxcXCIpO1xcbitcXHRTWVMoY2xlYW51cCwgXFxcImlwIC02IHJvdXRlIGFkZCBmZDAxOjoyLzEyOCBkZXYgdmV0aDMgdmlhIGZiMDA6OjQzXFxcIik7XFxuK1xcdFNZUyhjbGVhbnVwLCBcXFwiaXAgLTYgcm91dGUgYWRkIGZkMDE6OjEgZW5jYXAgc2VnNmxvY2FsIFxcXCJcXG4rXFx0XFx0ICAgICBcXFwiYWN0aW9uIEVuZC5CUEYgZW5kcG9pbnQgcGlubmVkIFxcXCIgU0VHNl9QSU5fUEFUSCBcXFwiIGRldiB2ZXRoMlxcXCIpO1xcbitcXG4rXFx0Y2xvc2VfbmV0bnMobnN0b2tlbik7XFxuK1xcdG5zdG9rZW4gPSBOVUxMO1xcbitcXG4rXFx0LyogTlMzOiBkZWNhcCBwb2ludCArIFVEUCBzZXJ2ZXIuXFxuK1xcdCAqIGZkMDE6OjIgbG9jYWwgdHJpZ2dlcnMgU1JIIGRlY2FwIChzZWdtZW50c19sZWZ0PTApLlxcbitcXHQgKiBmYjAxOjoyIGxvY2FsIGRlbGl2ZXJzIHRoZSBpbm5lciBVRFAgdG8gdGhlIHNvY2tldC5cXG4rXFx0ICovXFxuK1xcdG5zdG9rZW4gPSBvcGVuX25ldG5zKFxcXCJzZWc2XzNcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sIFxcXCJvcGVuIHNlZzZfM1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRTWVMoY2xlYW51cCwgXFxcImlwIGxpbmsgc2V0IGRldiBsbyB1cFxcXCIpO1xcbitcXHRTWVMoY2xlYW51cCwgXFxcInN5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5hbGwuc2VnNl9lbmFibGVkPTFcXFwiKTtcXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJzeXNjdGwgLXdxIG5ldC5pcHY2LmNvbmYubG8uc2VnNl9lbmFibGVkPTFcXFwiKTtcXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJzeXNjdGwgLXdxIG5ldC5pcHY2LmNvbmYudmV0aDQuc2VnNl9lbmFibGVkPTFcXFwiKTtcXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJpcCAtNiBhZGRyIGFkZCBmZDAxOjoyLzEyOCBkZXYgbG8gbm9kYWRcXFwiKTtcXG4rXFx0U1lTKGNsZWFudXAsIFxcXCJpcCAtNiBhZGRyIGFkZCBmYjAxOjoyLzEyOCBkZXYgbG8gbm9kYWRcXFwiKTtcXG4rXFxuK1xcdHNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVUNiwgU09DS19ER1JBTSwgXFxcImZiMDE6OjJcXFwiLCAxMjM0LCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0Uoc2VydmVyX2ZkLCAwLCBcXFwic3RhcnRfc2VydmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xcbitcXHRuc3Rva2VuID0gTlVMTDtcXG4rXFxuK1xcdC8qIE5TMTogd3JpdGUgc2tiX2V4dCBhdCBUQyBlZ3Jlc3Mgb24gdmV0aDEsIHRoZW4gc2VuZC5cXG4rXFx0ICogVEMgZWdyZXNzIGZpcmVzIGFmdGVyIHNlZzYgZW5jYXAsIG9uIHRoZSBlbmNhcHBlZCBwYWNrZXQuXFxuK1xcdCAqL1xcbitcXHRuc3Rva2VuID0gb3Blbl9uZXRucyhcXFwic2VnNl8xXFxcIik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcXFwib3BlbiBzZWc2XzFcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0dGNfaG9vay5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoXFxcInZldGgxXFxcIik7XFxuK1xcdGlmICghQVNTRVJUX0dUKHRjX2hvb2suaWZpbmRleCwgMCwgXFxcImlmaW5kZXggdmV0aDFcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFxcdTAwMjZ0Y19ob29rKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiYnBmX3RjX2hvb2tfY3JlYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVxcdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlKTtcXG4rXFx0cmV0ID0gYnBmX3RjX2F0dGFjaChcXHUwMDI2dGNfaG9vaywgXFx1MDAyNnRjX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJicGZfdGNfYXR0YWNoXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdGNsaWVudF9mZCA9IHNvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGNsaWVudF9mZCwgMCwgXFxcInNvY2tldFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRkc3Quc2luNl9mYW1pbHkgPSBBRl9JTkVUNjtcXG4rXFx0ZHN0LnNpbjZfcG9ydCA9IGh0b25zKDEyMzQpO1xcbitcXHRpbmV0X3B0b24oQUZfSU5FVDYsIFxcXCJmYjAxOjoyXFxcIiwgXFx1MDAyNmRzdC5zaW42X2FkZHIpO1xcbitcXG4rXFx0Ynl0ZXMgPSBzZW5kdG8oY2xpZW50X2ZkLCB0ZXN0X3BheWxvYWQsIFRFU1RfUEFZTE9BRF9MRU4sIDAsXFxuK1xcdFxcdCAgICAgICAodm9pZCAqKVxcdTAwMjZkc3QsIHNpemVvZihkc3QpKTtcXG4rXFxuK1xcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xcbitcXHRuc3Rva2VuID0gTlVMTDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX0VRKGJ5dGVzLCBURVNUX1BBWUxPQURfTEVOLCBcXFwic2VuZHRvXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdC8qIFJlY2VpdmUgZGVjYXBzdWxhdGVkIHBhY2tldCAtLSBzeW5jaHJvbml6ZXMgd2l0aCBzZWc2bG9jYWwgKi9cXG4rXFx0bnN0b2tlbiA9IG9wZW5fbmV0bnMoXFxcInNlZzZfM1xcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobnN0b2tlbiwgXFxcIm9wZW4gc2VnNl8zXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdGJ5dGVzID0gcmVjdmZyb20oc2VydmVyX2ZkLCBidWYsIHNpemVvZihidWYpLCAwLCBOVUxMLCBOVUxMKTtcXG4rXFx0QVNTRVJUX0VRKGJ5dGVzLCBURVNUX1BBWUxPQURfTEVOLCBcXFwicmVjdmZyb21cXFwiKTtcXG4rXFx0QVNTRVJUX1RSVUUoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MsIFxcXCJ0ZXN0X3Bhc3NcXFwiKTtcXG4rXFxuK2NsZWFudXA6XFxuK1xcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xcbitcXHRpZiAoc2VydmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKHNlcnZlcl9mZCk7XFxuK1xcdGlmIChjbGllbnRfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoY2xpZW50X2ZkKTtcXG4rXFx0U1lTX05PRkFJTChcXFwiaXAgbmV0bnMgZGVsIHNlZzZfM1xcXCIpO1xcbitcXHRTWVNfTk9GQUlMKFxcXCJpcCBuZXRucyBkZWwgc2VnNl8yXFxcIik7XFxuK1xcdFNZU19OT0ZBSUwoXFxcImlwIG5ldG5zIGRlbCBzZWc2XzFcXFwiKTtcXG4rXFx0aWYgKHBpbm5lZClcXG4rXFx0XFx0dW5saW5rKFNFRzZfUElOX1BBVEgpO1xcbit9XFxuK1xcbisvKlxcbisgKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgYWNyb3NzIFRDIGluZ3Jlc3MgLVxcdTAwM2Ugc2tfc2tiIHZlcmRpY3QgaG9vay4gIFRDIGluZ3Jlc3NcXG4rICogd3JpdGVzIHNrYl9leHQgb24gbG9vcGJhY2s7IHRoZSB2ZXJkaWN0IHByb2dyYW0gcmVhZHMgaXQgb24gc2tiIGRlbGl2ZXJ5IHRvIGFcXG4rICogc29ja2V0IGluIHRoZSBzb2NrbWFwLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NrX3NrYihzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbClcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vayxcXG4rXFx0XFx0ICAgIC5pZmluZGV4ID0gMSAvKiBJRklOREVYX0xPICovLFxcbitcXHRcXHQgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcXG4rXFx0c3RydWN0IGJwZl9saW5rICp2ZXJkaWN0X2xpbmsgPSBOVUxMO1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjtcXG4rXFx0c29ja2xlbl90IGFkZHJfbGVuID0gc2l6ZW9mKGFkZHIpO1xcbitcXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XFxuK1xcdGNoYXIgYnVmW1RFU1RfUEFZTE9BRF9MRU5dO1xcbitcXHRpbnQgYzEgPSAtMSwgcDEgPSAtMTtcXG4rXFx0aW50IG1hcCA9IC0xLCB6ZXJvID0gMDtcXG4rXFx0c3NpemVfdCBuO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0bnMgPSBuZXRuc19uZXcoXFxcInRjX3RvX3NrX3NrYlxcXCIsIHRydWUpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFxcXCJuZXRuc19uZXdcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0c2tlbC1cXHUwMDNlYnNzLVxcdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcXG4rXFxuK1xcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcXHUwMDI2dGNfaG9vayk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImJwZl90Y19ob29rX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZV9wb3J0KTtcXG4rXFx0cmV0ID0gYnBmX3RjX2F0dGFjaChcXHUwMDI2dGNfaG9vaywgXFx1MDAyNnRjX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJicGZfdGNfYXR0YWNoXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdG1hcCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9TT0NLTUFQLCBOVUxMLCBzaXplb2YoaW50KSxcXG4rXFx0XFx0XFx0ICAgICBzaXplb2YoaW50KSwgMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKG1hcCwgMCwgXFxcImJwZl9tYXBfY3JlYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHZlcmRpY3RfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfc29ja21hcChza2VsLVxcdTAwM2Vwcm9ncy5za19za2Jfc2tiX2V4dF9yZWFkLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICBtYXApO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIodmVyZGljdF9saW5rLCBcXFwiYXR0YWNoX3NvY2ttYXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0soY3JlYXRlX3BhaXIoQUZfSU5FVCwgU09DS19TVFJFQU0sIFxcdTAwMjZjMSwgXFx1MDAyNnAxKSwgXFxcImNyZWF0ZV9wYWlyXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwLCBcXHUwMDI2emVybywgXFx1MDAyNmMxLCBCUEZfTk9FWElTVCksIFxcXCJtYXBfdXBkYXRlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LKGdldHNvY2tuYW1lKGMxLCAoc3RydWN0IHNvY2thZGRyICopXFx1MDAyNmFkZHIsIFxcdTAwMjZhZGRyX2xlbiksXFxuK1xcdFxcdCAgICAgICBcXFwiZ2V0c29ja25hbWVcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXRhcmdldF9wb3J0ID0gYWRkci5zaW5fcG9ydDtcXG4rXFxuK1xcdG4gPSBzZW5kKHAxLCB0ZXN0X3BheWxvYWQsIFRFU1RfUEFZTE9BRF9MRU4sIDApO1xcbitcXHRpZiAoIUFTU0VSVF9FUShuLCBURVNUX1BBWUxPQURfTEVOLCBcXFwic2VuZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRuID0gcmVjdl90aW1lb3V0KGMxLCBidWYsIHNpemVvZihidWYpLCBNU0dfRE9OVFdBSVQsIElPX1RJTUVPVVRfU0VDKTtcXG4rXFx0QVNTRVJUX0VRKG4sIFRFU1RfUEFZTE9BRF9MRU4sIFxcXCJyZWN2XFxcIik7XFxuK1xcdEFTU0VSVF9UUlVFKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNldGVzdF9wYXNzLCBcXFwidGVzdF9wYXNzXFxcIik7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRpZiAoYzEgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoYzEpO1xcbitcXHRpZiAocDEgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UocDEpO1xcbitcXHRicGZfbGlua19fZGVzdHJveSh2ZXJkaWN0X2xpbmspO1xcbitcXHRpZiAobWFwIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG1hcCk7XFxuK1xcdGJwZl90Y19ob29rX2Rlc3Ryb3koXFx1MDAyNnRjX2hvb2spO1xcbitcXHRuZXRuc19mcmVlKG5zKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X3NrYl9leHRfY3Jvc3NfaG9vayh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsID0gTlVMTDtcXG4rXFxuK1xcdHNrZWwgPSB0ZXN0X3hkcF9tZXRhX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwib3BlbiBhbmQgbG9hZCBza2VsZXRvblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidGNfdG9fY2dycF9pbmdyZXNzXFxcIikpXFxuK1xcdFxcdHRlc3Rfc2tiX2V4dF91ZHAoc2tlbCwgXFxcInRjX3RvX2NncnBfaW5ncmVzc1xcXCIsIFJFQURFUl9DR1JQX1NLQik7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0Y190b19za19maWx0ZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3VkcChza2VsLCBcXFwidGNfdG9fc2tfZmlsdGVyXFxcIiwgUkVBREVSX1NLX0ZJTFRFUik7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0Y190b19sc21cXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3RjcChza2VsLCBcXFwidGNfdG9fbHNtXFxcIiwgUkVBREVSX0xTTSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0Y190b19za29wc1xcXCIpKVxcbitcXHRcXHR0ZXN0X3NrYl9leHRfdGNwKHNrZWwsIFxcXCJ0Y190b19za29wc1xcXCIsIFJFQURFUl9TS09QUyk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJjZ3JwX2VncmVzc190b19rZnJlZV9za2JcXFwiKSlcXG4rXFx0XFx0dGVzdF9jZ3JwX2VncmVzc190b19rZnJlZV9za2Ioc2tlbCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0Y190b19uZlxcXCIpKVxcbitcXHRcXHR0ZXN0X3NrYl9leHRfbmYoc2tlbCwgXFxcInRjX3RvX25mXFxcIik7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0Y190b19sd3RfaW5cXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X2x3dChza2VsLCBcXFwidGNfdG9fbHd0X2luXFxcIixcXG4rXFx0XFx0XFx0XFx0IHNrZWwtXFx1MDAzZXByb2dzLmx3dF9pbl9za2JfZXh0X3JlYWQsIFxcXCJpblxcXCIsIGZhbHNlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImx3dF9vdXRfdG9fdGNcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X2x3dChza2VsLCBcXFwibHd0X291dF90b190Y1xcXCIsXFxuK1xcdFxcdFxcdFxcdCBza2VsLVxcdTAwM2Vwcm9ncy5sd3Rfb3V0X3NrYl9leHRfd3JpdGUsIFxcXCJvdXRcXFwiLCB0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImx3dF94bWl0X3RvX3RjXFxcIikpXFxuK1xcdFxcdHRlc3Rfc2tiX2V4dF9sd3Qoc2tlbCwgXFxcImx3dF94bWl0X3RvX3RjXFxcIixcXG4rXFx0XFx0XFx0XFx0IHNrZWwtXFx1MDAzZXByb2dzLmx3dF94bWl0X3NrYl9leHRfd3JpdGUsIFxcXCJ4bWl0XFxcIiwgdHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0Y190b19zZWc2bG9jYWxcXFwiKSlcXG4rXFx0XFx0dGVzdF9za2JfZXh0X3NlZzZsb2NhbChza2VsKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInRjX3RvX3NrX3NrYlxcXCIpKVxcbitcXHRcXHR0ZXN0X3NrYl9leHRfc2tfc2tiKHNrZWwpO1xcbitcXG4rXFx0dGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuY1xcbmluZGV4IDA4YjAzYmUwYjg5MWMuLjgwY2RmZWU2MTVjY2IgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmNcXG5AQCAtMyw5ICszLDExIEBAXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9lbmRpYW4uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImJwZl9rZnVuY3MuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJwZl9taXNjLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJicGZfdHJhY2luZ19uZXQuaFxcXCJcXG4gXFxuICNkZWZpbmUgTUVUQV9TSVpFIDMyXFxuQEAgLTIyLDEwICsyNCwxMCBAQFxcbiBib29sIHRlc3RfcGFzcztcXG4gXFxuIHN0YXRpYyBjb25zdCBfX3U4IG1ldGFfd2FudFtNRVRBX1NJWkVdID0ge1xcbi1cXHQweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LFxcbi1cXHQweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LFxcbi1cXHQweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LFxcbi1cXHQweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LFxcbitcXHQweDQ5LCAweDIwLCAweDYzLCAweDcyLCAweDZmLCAweDczLCAweDczLCAweDY1LFxcbitcXHQweDY0LCAweDIwLCAweDY4LCAweDZmLCAweDZmLCAweDZiLCAweDczLCAweDIwLFxcbitcXHQweDI2LCAweDIwLCAweDZjLCAweDY5LCAweDc2LCAweDY1LCAweDY0LCAweDIwLFxcbitcXHQweDc0LCAweDZmLCAweDIwLCAweDc0LCAweDY1LCAweDZjLCAweDZjLCAweDIxLFxcbiB9O1xcbiBcXG4gc3RhdGljIGJvb2wgY2hlY2tfbWV0YWRhdGEoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIF9fdTggKm1ldGFfaGF2ZSlcXG5AQCAtNjg5LDQgKzY5MSw1NjMgQEAgaW50IGhlbHBlcl9za2JfY2hhbmdlX3Byb3RvKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4gXFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbiB9XFxuIFxcbitib29sIHdyaXRlX2RvbmU7XFxuK1xcbisvKiBXcml0ZSB0byBza2JfZXh0IHVzaW5nIGJwZl9keW5wdHJfd3JpdGUgaGVscGVyICovXFxuK1NFQyhcXFwidGNcXFwiKVxcbitpbnQgdGNfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmIChicGZfZHlucHRyX3dyaXRlKFxcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgQVJSQVlfU0laRShtZXRhX3dhbnQpLCAwKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0d3JpdGVfZG9uZSA9IHRydWU7XFxuK1xcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xcbit9XFxuK1xcbisvKiBSZWFkIGZyb20gc2tiLWV4dCBtZXRhZGF0YSB1c2luZyBicGZfZHlucHRyX3JlYWQgaGVscGVyICovXFxuK1NFQyhcXFwidGNcXFwiKVxcbitpbnQgdGNfc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4re1xcbitcXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBBUlJBWV9TSVpFKG1ldGFfaGF2ZSksIFxcdTAwMjZtZXRhLCAwLCAwKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFxuK1xcdHRlc3RfcGFzcyA9IHRydWU7XFxuK1xcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xcbit9XFxuK1xcbisvKiBSZWFkIGZyb20gYSBjbG9uZWQgc2tiX2V4dCBkeW5wdHIgKi9cXG4rU0VDKFxcXCJ0Y1xcXCIpXFxuK2ludCB0Y19za2JfZXh0X2Nsb25lX3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfZHlucHRyIG1ldGEsIGNsb25lO1xcbitcXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xcbitcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmIChicGZfZHlucHRyX2Nsb25lKFxcdTAwMjZtZXRhLCBcXHUwMDI2Y2xvbmUpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBBUlJBWV9TSVpFKG1ldGFfaGF2ZSksIFxcdTAwMjZjbG9uZSwgMCwgMCkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFx0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcbitcXHR0ZXN0X3Bhc3MgPSB0cnVlO1xcbitcXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcXG4rfVxcbitcXG4rLyogUmVhZCBmcm9tIHNrYl9leHQgdXNpbmcgYnBmX2R5bnB0cl9zbGljZSAqL1xcbitTRUMoXFxcInRjXFxcIilcXG4raW50IHRjX3NrYl9leHRfc2xpY2VfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFx0X191OCAqbWV0YV9oYXZlO1xcbitcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdG1ldGFfaGF2ZSA9IGJwZl9keW5wdHJfc2xpY2UoXFx1MDAyNm1ldGEsIDAsIE5VTEwsIE1FVEFfU0laRSk7XFxuK1xcdGlmICghbWV0YV9oYXZlKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0dGVzdF9wYXNzID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XFxuK31cXG4rXFxuKy8qIFdyaXRlIHRvIHNrYl9leHQgdXNpbmcgYnBmX2R5bnB0cl9zbGljZV9yZHdyICovXFxuK1NFQyhcXFwidGNcXFwiKVxcbitpbnQgdGNfc2tiX2V4dF9zbGljZV93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFx0X191OCAqZHN0O1xcbitcXG4rXFx0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFx0ZHN0ID0gYnBmX2R5bnB0cl9zbGljZV9yZHdyKFxcdTAwMjZtZXRhLCAwLCBOVUxMLCBNRVRBX1NJWkUpO1xcbitcXHRpZiAoIWRzdClcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXHRfX2J1aWx0aW5fbWVtY3B5KGRzdCwgbWV0YV93YW50LCBNRVRBX1NJWkUpO1xcbitcXG4rXFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XFxuK31cXG4rXFxuKy8qIE9wZW5pbmcgc2tiX2V4dCB3aXRob3V0IEZfQ1JFQVRFIG9uIGEgZnJlc2ggc2tiIHNob3VsZCBmYWlsICovXFxuK1NFQyhcXFwidGNcXFwiKVxcbitpbnQgdGNfc2tiX2V4dF9ub19hbGxvYyhzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcXHUwMDI2bWV0YSkgIT0gLUVOT0VOVClcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0dGVzdF9wYXNzID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XFxuK31cXG4rXFxuKy8qIEludmFsaWQgZmxhZ3MgYXJlIHJlamVjdGVkICovXFxuK1NFQyhcXFwidGNcXFwiKVxcbitpbnQgdGNfc2tiX2V4dF9pbnZhbGlkX2ZsYWdzKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIH4wVUxMLCBcXHUwMDI2bWV0YSkgIT0gLUVJTlZBTClcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0dGVzdF9wYXNzID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XFxuK31cXG4rXFxuKy8qIFdpdGhvdXQgRl9DUkVBVEUgdGhlIGR5bnB0ciBpcyByZWFkLW9ubHkgKi9cXG4rU0VDKFxcXCJ0Y1xcXCIpXFxuK2ludCB0Y19za2JfZXh0X3Jkb25seShzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0LyogQ3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgZXh0ICovXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFx0aWYgKGJwZl9keW5wdHJfd3JpdGUoXFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcbitcXHQvKiBSZW9wZW4gd2l0aG91dCBGX0NSRUFURSAtLSBzaG91bGQgYmUgcmVhZC1vbmx5ICovXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0LyogVmVyaWZ5IHJlYWQtb25seTogd3JpdGVzIG11c3QgZmFpbCwgcmVhZHMgbXVzdCB3b3JrICovXFxuK1xcdGlmICghYnBmX2R5bnB0cl9pc19yZG9ubHkoXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmICghYnBmX2R5bnB0cl93cml0ZShcXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFx0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXFx1MDAyNm1ldGEsIDAsIDApKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0dGVzdF9wYXNzID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XFxuK31cXG4rXFxuKy8qIERvdWJsZSBhbGxvYzogZGF0YSBmcm9tIGZpcnN0IGFsbG9jIHN1cnZpdmVzIHNlY29uZCBza2JfZXh0X2FkZCAqL1xcbitTRUMoXFxcInRjXFxcIilcXG4raW50IHRjX3NrYl9leHRfZG91YmxlX2FsbG9jKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4re1xcbitcXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcbitcXHQvKiBGaXJzdCBhbGxvYyArIHdyaXRlICovXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFx0aWYgKGJwZl9keW5wdHJfd3JpdGUoXFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcbitcXHQvKiBTZWNvbmQgYWxsb2MgLS0gc2tiX2V4dF9hZGQgcmV0dXJucyBleGlzdGluZyBleHQgKi9cXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcXHUwMDI2bWV0YSwgMCwgMCkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFx0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcbitcXHR0ZXN0X3Bhc3MgPSB0cnVlO1xcbitcXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IF9fdTggbWV0YV96ZXJvW01FVEFfU0laRV0gPSB7fTtcXG4rXFxuK2Jvb2wgY2xvbmVfY293X2RvbmU7XFxuK1xcbisvKlxcbisgKiBPdmVyd3JpdGUgc2tiX2V4dCBvbiB0aGUgY2xvbmUgdmlhIEZfQ1JFQVRFIChDT1cpIC0tIG11c3Qgbm90IGFmZmVjdCBvcmlnaW5hbC5cXG4rICogUnVucyBvbiB0aGUgZHVtbXkgaW5ncmVzcyAoY2xvbmUgc2lkZSksIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRjIG1pcnJlZC5cXG4rICovXFxuK1NFQyhcXFwidGNcXFwiKVxcbitpbnQgdGNfc2tiX2V4dF9jbG9uZV9yZWRpcl9jb3coc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XFxuK1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcbitcXHQvKiBaZXJvIG91dCB0aGUgY2xvbmUncyBleHQgLS0gbXVzdCBub3QgYWZmZWN0IG9yaWdpbmFsICovXFxuK1xcdGlmIChicGZfZHlucHRyX3dyaXRlKFxcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfemVybywgTUVUQV9TSVpFLCAwKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0Y2xvbmVfY293X2RvbmUgPSB0cnVlO1xcbitcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFZlcmlmeSBDT1cgaXNvbGF0aW9uIGF0IGtmcmVlX3NrYiB0aW1lOiBvbmNlIGNsb25lX2Nvd19kb25lIGlzIHNldCxcXG4rICogY2hlY2sgdGhhdCB0aGUgb3JpZ2luYWwgc2tiIHN0aWxsIGhhcyBtZXRhX3dhbnQuXFxuKyAqL1xcbitTRUMoXFxcInRwX2J0Zi9rZnJlZV9za2JcXFwiKVxcbitpbnQgQlBGX1BST0codHBfa2ZyZWVfc2tiX2Nvd19jaGVjaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4re1xcbitcXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKCFjbG9uZV9jb3dfZG9uZSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsIDAsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFxcdTAwMjZtZXRhLCAwLCAwKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHR0ZXN0X3Bhc3MgPSB0cnVlO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rX191MzIgY2xvbmVfcmVkaXJfaWZpbmRleDtcXG4rYm9vbCB3cml0ZV9ibG9ja2VkO1xcbitcXG4rLypcXG4rICogV3JpdGUgc2tiX2V4dCwgY2xvbmUgdGhlIHNrYiB0byBhIGRlbGF5ZWQgcWRpc2Mgc28gdGhlIGNsb25lIGtlZXBzIHRoZSBleHRcXG4rICogYmxvY2sgc2hhcmVkLCB0aGVuIHRyeSB0byB3cml0ZSB0byB0aGUgc2FtZSBkeW5wdHIgYWdhaW4uIFRoZSB3cml0ZSBtdXN0IGZhaWxcXG4rICogd2l0aCAtRUJVU1kuIFJlLWFjcXVpcmluZyB0aGUgZHlucHRyIHdpdGggRl9DUkVBVEUgQ09XcyB0aGUgYmxvY2sgYW5kXFxuKyAqIHN1Y2NlZWRzLlxcbisgKi9cXG4rU0VDKFxcXCJ0Y1xcXCIpXFxuK2ludCB0Y19za2JfZXh0X3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXHRpZiAoYnBmX2R5bnB0cl93cml0ZShcXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFxuK1xcdGlmIChicGZfY2xvbmVfcmVkaXJlY3QoY3R4LCBjbG9uZV9yZWRpcl9pZmluZGV4LCAwIC8qIGVncmVzcyAqLykpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFxuK1xcdC8qIGV4dCBub3cgc2hhcmVkIHdpdGggdGhlIHF1ZXVlZCBjbG9uZSAtLSB3cml0ZSBtdXN0IGZhaWwgKi9cXG4rXFx0aWYgKGJwZl9keW5wdHJfd3JpdGUoXFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV96ZXJvLCBNRVRBX1NJWkUsIDApICE9IC1FQlVTWSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0LyogUmUtYWNxdWlyaW5nIENPV3MgdGhlIGJsb2NrIC0tIHdyaXRlIG11c3Qgc3VjY2VlZCAqL1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdGlmIChicGZfZHlucHRyX3dyaXRlKFxcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfemVybywgTUVUQV9TSVpFLCAwKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0d3JpdGVfYmxvY2tlZCA9IHRydWU7XFxuK1xcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xcbit9XFxuK1xcbisvKlxcbisgKiBTYW1lIGFzIGFib3ZlIGJ1dCB1c2luZyBicGZfZHlucHRyX3NsaWNlX3Jkd3IuXFxuKyAqL1xcbitTRUMoXFxcInRjXFxcIilcXG4raW50IHRjX3NrYl9leHRfc2xpY2Vfd3JpdGVfYWZ0ZXJfY2xvbmVfcmVkaXIoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XFxuK1xcdHZvaWQgKnNsaWNlO1xcbitcXG4rXFx0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXHRpZiAoYnBmX2R5bnB0cl93cml0ZShcXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFxuK1xcdGlmIChicGZfY2xvbmVfcmVkaXJlY3QoY3R4LCBjbG9uZV9yZWRpcl9pZmluZGV4LCAwIC8qIGVncmVzcyAqLykpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfU0hPVDtcXG4rXFxuK1xcdC8qIGV4dCBub3cgc2hhcmVkIHdpdGggdGhlIHF1ZXVlZCBjbG9uZSAtLSBzbGljZSBtdXN0IGZhaWwgKi9cXG4rXFx0c2xpY2UgPSBicGZfZHlucHRyX3NsaWNlX3Jkd3IoXFx1MDAyNm1ldGEsIDAsIE5VTEwsIE1FVEFfU0laRSk7XFxuK1xcdGlmIChzbGljZSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xcbitcXG4rXFx0LyogUmUtYWNxdWlyaW5nIENPV3MgdGhlIGJsb2NrIC0tIHNsaWNlIG11c3Qgc3VjY2VlZCAqL1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdHNsaWNlID0gYnBmX2R5bnB0cl9zbGljZV9yZHdyKFxcdTAwMjZtZXRhLCAwLCBOVUxMLCBNRVRBX1NJWkUpO1xcbitcXHRpZiAoIXNsaWNlKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1NIT1Q7XFxuK1xcdF9fYnVpbHRpbl9tZW1jcHkoc2xpY2UsIG1ldGFfemVybywgTUVUQV9TSVpFKTtcXG4rXFxuK1xcdHdyaXRlX2Jsb2NrZWQgPSB0cnVlO1xcbitcXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcXG4rfVxcbitcXG4rLyogUmVhZCBza2JfZXh0IGZyb20gY2dyb3VwL3NrYiBpbmdyZXNzIC0tIHRlc3RzIGNyb3NzLWhvb2sgc3Vydml2YWwgKi9cXG4rU0VDKFxcXCJjZ3JvdXBfc2tiL2luZ3Jlc3NcXFwiKVxcbitpbnQgY2dycF9za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxcbit7XFxuK1xcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XFxuK1xcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XFxuK1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcXHUwMDI2bWV0YSwgMCwgMCkpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXG4rXFx0dGVzdF9wYXNzID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIDE7XFxuK31cXG4rXFxuK19fYmUxNiB0YXJnZXRfcG9ydDtcXG4rXFxuKyNkZWZpbmUgVENQVjRfSERSX09GRlxcdChzaXplb2Yoc3RydWN0IGV0aGhkcikgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSlcXG4rI2RlZmluZSBUQ1BWNF9TUE9SVF9PRkZcXHQoVENQVjRfSERSX09GRiArIG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIHNvdXJjZSkpXFxuKyNkZWZpbmUgVENQVjRfRFBPUlRfT0ZGXFx0KFRDUFY0X0hEUl9PRkYgKyBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBkZXN0KSlcXG4rXFxuKy8qIFdyaXRlIHNrYl9leHQgb24gVENQIHBhY2tldHMgdG8vZnJvbSB0YXJnZXRfcG9ydCAqL1xcbitTRUMoXFxcInRjXFxcIilcXG4raW50IHRjX3NrYl9leHRfd3JpdGVfcG9ydChzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFx0X19iZTE2IHNwb3J0LCBkcG9ydDtcXG4rXFxuK1xcdGlmIChjdHgtXFx1MDAzZXByb3RvY29sICE9IF9fYnBmX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSlcXG4rXFx0XFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XFxuK1xcdGlmIChicGZfc2tiX2xvYWRfYnl0ZXMoY3R4LCBUQ1BWNF9TUE9SVF9PRkYsIFxcdTAwMjZzcG9ydCwgc2l6ZW9mKHNwb3J0KSkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xcbitcXHRpZiAoYnBmX3NrYl9sb2FkX2J5dGVzKGN0eCwgVENQVjRfRFBPUlRfT0ZGLCBcXHUwMDI2ZHBvcnQsIHNpemVvZihkcG9ydCkpKVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcXG4rXFx0aWYgKHNwb3J0ICE9IHRhcmdldF9wb3J0IFxcdTAwMjZcXHUwMDI2IGRwb3J0ICE9IHRhcmdldF9wb3J0KVxcbitcXHRcXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xcbitcXHRicGZfZHlucHRyX3dyaXRlKFxcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKTtcXG4rXFxuK1xcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xcbit9XFxuK1xcbisvKiBSZWFkIHNrYl9leHQgZnJvbSBzb2NrX29wcyBwYXNzaXZlIGVzdGFibGlzaGVkIC0tIHRlc3RzIFRDIC1cXHUwMDNlIHNvY2tfb3BzIHBhdGggKi9cXG4rU0VDKFxcXCJzb2Nrb3BzXFxcIilcXG4raW50IHNrb3BzX3NrYl9leHRfcmVhZChzdHJ1Y3QgYnBmX3NvY2tfb3BzICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9zb2NrX29wc19rZXJuICprY3R4O1xcbitcXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xcbitcXG4rXFx0aWYgKGN0eC1cXHUwMDNlb3AgIT0gQlBGX1NPQ0tfT1BTX1BBU1NJVkVfRVNUQUJMSVNIRURfQ0IpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXG4rXFx0a2N0eCA9IGJwZl9jYXN0X3RvX2tlcm5fY3R4KGN0eCk7XFxuK1xcdHNrYiA9IGtjdHgtXFx1MDAzZXNrYjtcXG4rXFx0aWYgKCFza2IpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCAwLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcXHUwMDI2bWV0YSwgMCwgMCkpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXG4rXFx0dGVzdF9wYXNzID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIDE7XFxuK31cXG4rXFxuKy8qIFJlYWQgc2tiX2V4dCBmcm9tIExTTSBpbmV0X2Nvbm5fZXN0YWJsaXNoZWQgLS0gdGVzdHMgVEMgLVxcdTAwM2UgTFNNIHBhdGggKi9cXG4rU0VDKFxcXCJsc20vaW5ldF9jb25uX2VzdGFibGlzaGVkXFxcIilcXG4raW50IEJQRl9QUk9HKGxzbV9za2JfZXh0X3JlYWQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4re1xcbitcXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCAwLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcXHUwMDI2bWV0YSwgMCwgMCkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0dGVzdF9wYXNzID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIFJlYWQgc2tiX2V4dCBmcm9tIHNvY2tldCBmaWx0ZXIgLS0gdGVzdHMgVEMgLVxcdTAwM2Ugc2tfZmlsdGVyIHBhdGggKi9cXG4rU0VDKFxcXCJzb2NrZXRcXFwiKVxcbitpbnQgc2tfZmlsdGVyX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFxcdTAwMjZtZXRhLCAwLCAwKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHR0ZXN0X3Bhc3MgPSB0cnVlO1xcbitvdXQ6XFxuK1xcdHJldHVybiBjdHgtXFx1MDAzZWxlbjtcXG4rfVxcbitcXG4rLyogV3JpdGUgc2tiX2V4dCBmcm9tIGNncm91cC9za2IgZWdyZXNzICovXFxuK1NFQyhcXFwiY2dyb3VwX3NrYi9lZ3Jlc3NcXFwiKVxcbitpbnQgY2dycF9za2JfZXh0X3dyaXRlKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXHRicGZfZHlucHRyX3dyaXRlKFxcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKTtcXG4rXFxuK1xcdHJldHVybiAxO1xcbit9XFxuK1xcbisvKiBSZWFkIHNrYl9leHQgZnJvbSB0cF9idGYva2ZyZWVfc2tiIC0tIHRlc3RzIHN1cnZpdmFsIHVudGlsIHNrYiBmcmVlICovXFxuK1NFQyhcXFwidHBfYnRmL2tmcmVlX3NrYlxcXCIpXFxuK2ludCBCUEZfUFJPRyh0cF9rZnJlZV9za2JfZXh0X3JlYWQsIHN0cnVjdCBza19idWZmICpza2IpXFxuK3tcXG4rXFx0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgMCwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXFx1MDAyNm1ldGEsIDAsIDApKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHRlc3RfcGFzcyA9IHRydWU7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisjZGVmaW5lIE5GX0FDQ0VQVCAxXFxuK1xcbitTRUMoXFxcIm5ldGZpbHRlclxcXCIpXFxuK2ludCBuZl9za2JfZXh0X3JlYWQoc3RydWN0IGJwZl9uZl9jdHggKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgX19za19idWZmICpza2IgPSAoc3RydWN0IF9fc2tfYnVmZiAqKWN0eC1cXHUwMDNlc2tiO1xcbitcXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKCFza2IpXFxuK1xcdFxcdHJldHVybiBORl9BQ0NFUFQ7XFxuK1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoc2tiLCAwLCAwLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiBORl9BQ0NFUFQ7XFxuK1xcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFxcdTAwMjZtZXRhLCAwLCAwKSlcXG4rXFx0XFx0cmV0dXJuIE5GX0FDQ0VQVDtcXG4rXFx0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxcbitcXHRcXHRyZXR1cm4gTkZfQUNDRVBUO1xcbitcXG4rXFx0dGVzdF9wYXNzID0gdHJ1ZTtcXG4rXFx0cmV0dXJuIE5GX0FDQ0VQVDtcXG4rfVxcbitcXG4rU0VDKFxcXCJsd3RfaW5cXFwiKVxcbitpbnQgbHd0X2luX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIEJQRl9PSztcXG4rXFx0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXFx1MDAyNm1ldGEsIDAsIDApKVxcbitcXHRcXHRyZXR1cm4gQlBGX09LO1xcbitcXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXFxuK1xcdFxcdHJldHVybiBCUEZfT0s7XFxuK1xcbitcXHR0ZXN0X3Bhc3MgPSB0cnVlO1xcbitcXHRyZXR1cm4gQlBGX09LO1xcbit9XFxuK1xcbitTRUMoXFxcImx3dF9vdXRcXFwiKVxcbitpbnQgbHd0X291dF9za2JfZXh0X3dyaXRlKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxcbitcXHRcXHRyZXR1cm4gQlBGX09LO1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gQlBGX09LO1xcbitcXHRicGZfZHlucHRyX3dyaXRlKFxcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgQVJSQVlfU0laRShtZXRhX3dhbnQpLCAwKTtcXG4rXFxuK1xcdHJldHVybiBCUEZfT0s7XFxuK31cXG4rXFxuK1NFQyhcXFwibHd0X3htaXRcXFwiKVxcbitpbnQgbHd0X3htaXRfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcXG4rXFx0XFx0cmV0dXJuIEJQRl9PSztcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIEJQRl9PSztcXG4rXFx0YnBmX2R5bnB0cl93cml0ZShcXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIEFSUkFZX1NJWkUobWV0YV93YW50KSwgMCk7XFxuK1xcbitcXHRyZXR1cm4gQlBGX09LO1xcbit9XFxuK1xcbisvKiBSZWFkIHNrYl9leHQgZnJvbSBzZWc2bG9jYWwgRW5kLkJQRiAtLSB0ZXN0cyBUQyAtXFx1MDAzZSBzZWc2bG9jYWwgcGF0aCAqL1xcbitTRUMoXFxcImx3dF9zZWc2bG9jYWxcXFwiKVxcbitpbnQgc2VnNmxvY2FsX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIEJQRl9PSztcXG4rXFx0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXFx1MDAyNm1ldGEsIDAsIDApKVxcbitcXHRcXHRyZXR1cm4gQlBGX09LO1xcbitcXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXFxuK1xcdFxcdHJldHVybiBCUEZfT0s7XFxuK1xcbitcXHR0ZXN0X3Bhc3MgPSB0cnVlO1xcbitcXHRyZXR1cm4gQlBGX09LO1xcbit9XFxuK1xcbisvKiBSZWFkIHNrYl9leHQgZnJvbSBza19za2Igc3RyZWFtIHZlcmRpY3QgaG9vayAqL1xcbitTRUMoXFxcInNrX3NrYi9zdHJlYW1fdmVyZGljdFxcXCIpXFxuK2ludCBza19za2Jfc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4re1xcbitcXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gU0tfUEFTUztcXG4rXFx0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXFx1MDAyNm1ldGEsIDAsIDApKVxcbitcXHRcXHRyZXR1cm4gU0tfUEFTUztcXG4rXFx0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxcbitcXHRcXHRyZXR1cm4gU0tfUEFTUztcXG4rXFxuK1xcdHRlc3RfcGFzcyA9IHRydWU7XFxuK1xcdHJldHVybiBTS19QQVNTO1xcbit9XFxuK1xcbiBjaGFyIF9saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX3NrYl9leHQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9za2JfZXh0LmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmMyNjExYzkzMTVhYTdcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX3NrYl9leHQuY1xcbkBAIC0wLDAgKzEsMTIyIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuK1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFxcImJwZl9taXNjLmhcXFwiXFxuK1xcbitfX3U2NCBmbGFncztcXG4rXFxuK1NFQyhcXFwidGNcXFwiKVxcbitfX2Rlc2NyaXB0aW9uKFxcXCJza2JfZXh0IHNsaWNlIGlzIGludmFsaWRhdGVkIGJ5IGJwZl9jbG9uZV9yZWRpcmVjdFxcXCIpXFxuK19fZmFpbHVyZVxcbitpbnQgc2tiX2V4dF9zdGFsZV9zbGljZV9hZnRlcl9jbG9uZV9yZWRpcmVjdChzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFx0X191OCAqc2xpY2U7XFxuK1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXFx1MDAyNm1ldGEpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHNsaWNlID0gYnBmX2R5bnB0cl9zbGljZV9yZHdyKFxcdTAwMjZtZXRhLCAwLCBOVUxMLCA4KTtcXG4rXFx0aWYgKCFzbGljZSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRicGZfY2xvbmVfcmVkaXJlY3QoY3R4LCAxLCAwKTtcXG4rXFxuK1xcdC8qIFN0YWxlOiB0aGUgY2xvbmUgc2hhcmVzIHRoZSBleHQgYmxvY2sgdGhlIHNsaWNlIHBvaW50cyBpbnRvLiAqL1xcbitcXHQqc2xpY2UgPSAwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwidGNcXFwiKVxcbitfX2Rlc2NyaXB0aW9uKFxcXCJza2JfZXh0IHNsaWNlIGlzIGludmFsaWRhdGVkIHdoZW4gZXh0IGlzIHJlLW9wZW5lZCB3aXRoIEZfQ1JFQVRFXFxcIilcXG4rX19mYWlsdXJlXFxuK2ludCBza2JfZXh0X3N0YWxlX3NsaWNlX2FmdGVyX3JlY3JlYXRlKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBkMSwgZDI7XFxuK1xcdF9fdTggKnNsaWNlO1xcbitcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXFx1MDAyNmQxKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRzbGljZSA9IGJwZl9keW5wdHJfc2xpY2UoXFx1MDAyNmQxLCAwLCBOVUxMLCA4KTtcXG4rXFx0aWYgKCFzbGljZSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHQvKiBNYXkgQ09XIHRoZSBleHQgYmxvY2ssIGxlYXZpbmcgdGhlIHNsaWNlIHBvaW50aW5nIGF0IHRoZSBvbGQgb25lLiAqL1xcbitcXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXFx1MDAyNmQyKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gKnNsaWNlO1xcbit9XFxuK1xcbitTRUMoXFxcInRwX2J0Zi9rZnJlZV9za2JcXFwiKVxcbitfX2Rlc2NyaXB0aW9uKFxcXCJGX0NSRUFURSBpcyByZWplY3RlZCBpbiB0cmFjaW5nIHByb2dyYW1zXFxcIilcXG4rX19mYWlsdXJlIF9fbXNnKFxcXCJpcyBub3QgYWxsb3dlZCBpbiBsc20vdHJhY2luZyBwcm9ncmFtc1xcXCIpXFxuK2ludCBCUEZfUFJPRyh0cF9za2JfZXh0X2NyZWF0ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xcbitcXG4rXFx0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLFxcbitcXHRcXHRcXHRcXHQgICAgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJ0cF9idGYva2ZyZWVfc2tiXFxcIilcXG4rX19kZXNjcmlwdGlvbihcXFwibm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZCBpbiB0cmFjaW5nIHByb2dyYW1zXFxcIilcXG4rX19mYWlsdXJlIF9fbXNnKFxcXCJtdXN0IGJlIGEga25vd24gY29uc3RhbnRcXFwiKVxcbitpbnQgQlBGX1BST0codHBfc2tiX2V4dF92YXJfZmxhZ3MsIHN0cnVjdCBza19idWZmICpza2IpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgZmxhZ3MsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJ0Y1xcXCIpXFxuK19fZGVzY3JpcHRpb24oXFxcIm5vbi1jb25zdGFudCBmbGFncyBhcmUgcmVqZWN0ZWRcXFwiKVxcbitfX2ZhaWx1cmUgX19tc2coXFxcIm11c3QgYmUgYSBrbm93biBjb25zdGFudFxcXCIpXFxuK2ludCBza2JfZXh0X3Zhcl9mbGFncyhzdHJ1Y3QgX19za19idWZmICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIGZsYWdzLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwibHNtL2luZXRfY29ubl9lc3RhYmxpc2hlZFxcXCIpXFxuK19fZGVzY3JpcHRpb24oXFxcIkZfQ1JFQVRFIGlzIHJlamVjdGVkIGluIExTTSBwcm9ncmFtc1xcXCIpXFxuK19fZmFpbHVyZSBfX21zZyhcXFwiaXMgbm90IGFsbG93ZWQgaW4gbHNtL3RyYWNpbmcgcHJvZ3JhbXNcXFwiKVxcbitpbnQgQlBGX1BST0cobHNtX3NrYl9leHRfY3JlYXRlLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCxcXG4rXFx0XFx0XFx0XFx0ICAgIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcXHUwMDI2bWV0YSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwibHNtL2luZXRfY29ubl9lc3RhYmxpc2hlZFxcXCIpXFxuK19fZGVzY3JpcHRpb24oXFxcIm5vbi1jb25zdGFudCBmbGFncyBhcmUgcmVqZWN0ZWQgaW4gTFNNIHByb2dyYW1zXFxcIilcXG4rX19mYWlsdXJlIF9fbXNnKFxcXCJtdXN0IGJlIGEga25vd24gY29uc3RhbnRcXFwiKVxcbitpbnQgQlBGX1BST0cobHNtX3NrYl9leHRfdmFyX2ZsYWdzLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcXG4rXFxuK1xcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgZmxhZ3MsIFxcdTAwMjZtZXRhKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjIzOjIwLjIzOTQ4Mjg5OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTc5NzIzNzI0MDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NLQl9FWFRcIixcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJORVRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfZHlucHRyX2Zyb21fc2tiX2V4dFwiLFxuICAgIFwiYnBmX3NrYl9leHRfcG9pbnRlclwiLFxuICAgIFwiX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzXCIsXG4gICAgXCJfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzXCIsXG4gICAgXCJza2JfZXh0X3NjcnViXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBza19idWZmIGV4dGVuc2lvbiBmb3IgQlBGIG1ldGFkYXRhIChDT05GSUdfQlBGX1NLQl9FWFQpIGFsb25nIHdpdGggdGhlIGJwZl9keW5wdHJfZnJvbV9za2JfZXh0IGtmdW5jIGFuZCByZWxhdGVkIGR5bnB0ciBoYW5kbGluZyBpbiBoZWxwZXJzIGFuZCB0aGUgQlBGIHZlcmlmaWVyLiBJdCBhbHNvIG1vZGlmaWVzIHBhY2tldCBzY3J1YmJpbmcgYW5kIGV4dGVuc2lvbiBsaWZldGltZSBsb2dpYyBpbiBjb3JlIG5ldHdvcmtpbmcgcGF0aHMuIFRoZXNlIGNoYW5nZXMgYXJlIGluIHJlYWNoYWJsZSBjb3JlIHN1YnN5c3RlbXMgYW5kIHdhcnJhbnQgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhMGUwNDViZDU5MDdkMjZmZTZlZGNlNzZmMWYyMTZjYzI0MjcwYTQ3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMTAgMTU6MjM6MTggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS9saW51eC9icGYuaFxuaW5kZXggZmZhNTYyNjQxMWFjMi4uNmMzNWY4Yzc0MTQ3NCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmhcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmLmhcbkBAIC0xNDgxLDYgKzE0ODEsOCBAQCBlbnVtIGJwZl9keW5wdHJfdHlwZSB7XG4gXHRCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEEsXG4gXHQvKiBVbmRlcmx5aW5nIGRhdGEgaXMgYSBmaWxlICovXG4gXHRCUEZfRFlOUFRSX1RZUEVfRklMRSxcbitcdC8qIFVuZGVybHlpbmcgZGF0YSBpcyBhIGJwZl9za2JfZXh0IGNodW5rICovXG4rXHRCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVCxcbiB9O1xuIFxuIGludCBicGZfZHlucHRyX2NoZWNrX3NpemUodTY0IHNpemUpO1xuQEAgLTQyMTYsNCArNDIxOCwxMiBAQCBzdGF0aWMgaW5saW5lIGludCBicGZfbWFwX2NoZWNrX29wX2ZsYWdzKHN0cnVjdCBicGZfbWFwICptYXAsIHU2NCBmbGFncywgdTY0IGFsbFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcbitcbitzdHJ1Y3QgYnBmX3NrYl9leHQge1xuK1x0dTggYnVmW0NPTkZJR19CUEZfU0tCX0VYVF9TSVpFXSBfX2FsaWduZWQoOCk7XG4rfTtcbitcbisjZW5kaWYgLyogQ09ORklHX0JQRl9TS0JfRVhUICovXG4rXG4gI2VuZGlmIC8qIF9MSU5VWF9CUEZfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlsdGVyLmggYi9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oXG5pbmRleCA0YTliYzZhODQ4ZjJlLi5lOWE5MzQ5MjI1M2JhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9maWx0ZXIuaFxuKysrIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaFxuQEAgLTE5NTgsNCArMTk1OCwzMSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgKmJwZl9za2JfbWV0YV9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQpXG4gfVxuICNlbmRpZiAvKiBDT05GSUdfTkVUICovXG4gXG4rI2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxuK3ZvaWQgKmJwZl9za2JfZXh0X3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCwgYm9vbCB3cik7XG4raW50IF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCB2b2lkICp0byxcbitcdFx0XHQgICAgIHUzMiBsZW4pO1xuK2ludCBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIGNvbnN0IHZvaWQgKmZyb20sXG4rXHRcdFx0ICAgICAgdTMyIGxlbiwgdTY0IGZsYWdzKTtcbisjZWxzZSAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi9cbitzdGF0aWMgaW5saW5lIHZvaWQgKmJwZl9za2JfZXh0X3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCxcbitcdFx0XHRcdFx0Ym9vbCB3cilcbit7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG4rXHRcdFx0XHRcdCAgIHUzMiBvZmZzZXQsIHZvaWQgKnRvLCB1MzIgbGVuKVxuK3tcbitcdHJldHVybiAtRU9QTk9UU1VQUDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LFxuK1x0XHRcdFx0XHQgICAgY29uc3Qgdm9pZCAqZnJvbSwgdTMyIGxlbixcbitcdFx0XHRcdFx0ICAgIHU2NCBmbGFncylcbit7XG4rXHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rfVxuKyNlbmRpZiAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi9cbitcbiAjZW5kaWYgLyogX19MSU5VWF9GSUxURVJfSF9fICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmhcbmluZGV4IDQyMWY2ZmM0NTQ1MTEuLjUwOWQ0NDcxNzllMTMgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oXG5AQCAtNTA2MSw2ICs1MDYxLDkgQEAgZW51bSBza2JfZXh0X2lkIHtcbiAjZW5kaWZcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQ0FOKVxuIFx0U0tCX0VYVF9DQU4sXG4rI2VuZGlmXG4rI2lmIElTX0VOQUJMRUQoQ09ORklHX0JQRl9TS0JfRVhUKVxuK1x0U0tCX0VYVF9CUEYsXG4gI2VuZGlmXG4gXHRTS0JfRVhUX05VTSwgLyogbXVzdCBiZSBsYXN0ICovXG4gfTtcbkBAIC01MDg4LDYgKzUwOTEsNyBAQCB2b2lkICpfX3NrYl9leHRfc2V0KHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZCxcbiB2b2lkICpza2JfZXh0X2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQpO1xuIHZvaWQgX19za2JfZXh0X2RlbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQpO1xuIHZvaWQgX19za2JfZXh0X3B1dChzdHJ1Y3Qgc2tiX2V4dCAqZXh0KTtcbit2b2lkIHNrYl9leHRfc2NydWIoc3RydWN0IHNrX2J1ZmYgKnNrYik7XG4gXG4gc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfcHV0KHN0cnVjdCBza19idWZmICpza2IpXG4ge1xuQEAgLTUxNTMsMTQgKzUxNTcsMjMgQEAgc3RhdGljIGlubGluZSBib29sIHNrYl9oYXNfZXh0ZW5zaW9ucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuIHtcbiBcdHJldHVybiB1bmxpa2VseShza2ItXHUwMDNlYWN0aXZlX2V4dGVuc2lvbnMpO1xuIH1cbitcbisvKiBUcnVlIGlmIHRoZSBleHRlbnNpb24gYmxvY2sgaXMgc2hhcmVkIHdpdGggY2xvbmVkIHNrYnMgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2V4dF9zaGFyZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRyZXR1cm4gc2tiLVx1MDAzZWFjdGl2ZV9leHRlbnNpb25zIFx1MDAyNlx1MDAyNlxuK1x0ICAgICAgIHJlZmNvdW50X3JlYWQoXHUwMDI2c2tiLVx1MDAzZWV4dGVuc2lvbnMtXHUwMDNlcmVmY250KSAhPSAxO1xuK31cbiAjZWxzZVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3NrYl9leHRfcHV0KHN0cnVjdCBza2JfZXh0ICpleHQpIHt9XG4gc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfcHV0KHN0cnVjdCBza19idWZmICpza2IpIHt9XG4gc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikge31cbitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9zY3J1YihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X2RlbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdW51c2VkKSB7fVxuIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3NrYl9leHRfY29weShzdHJ1Y3Qgc2tfYnVmZiAqZCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnMpIHt9XG4gc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfY29weShzdHJ1Y3Qgc2tfYnVmZiAqZHN0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqcykge31cbiBzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2hhc19leHRlbnNpb25zKHN0cnVjdCBza19idWZmICpza2IpIHsgcmV0dXJuIGZhbHNlOyB9XG4rc3RhdGljIGlubGluZSBib29sIHNrYl9leHRfc2hhcmVkKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpIHsgcmV0dXJuIGZhbHNlOyB9XG4gI2VuZGlmIC8qIENPTkZJR19TS0JfRVhURU5TSU9OUyAqL1xuIFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9yZXNldF9jdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxuaW5kZXggNzMyYjM1Y2MwOGQxYy4uYTQ4Mzk5YWZlNDk0OSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXG5AQCAtNzgyNSw0ICs3ODI1LDkgQEAgc3RydWN0IGJwZl9pbnNuX2FycmF5X3ZhbHVlIHtcbiBcdF9fdTMyIDozMjtcbiB9O1xuIFxuKy8qIEZsYWdzIHRvIGNvbnRyb2wgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKSBiZWhhdmlvci4gKi9cbitlbnVtIHtcbitcdEJQRl9TS0JfRVhUX0ZfQ1JFQVRFID0gKDFVTEwgXHUwMDNjXHUwMDNjIDApLFxuK307XG4rXG4gI2VuZGlmIC8qIF9VQVBJX19MSU5VWF9CUEZfSF9fICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9oZWxwZXJzLmMgYi9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuaW5kZXggYjNjYzVjOGZjODc1Ni4uY2ZjYjc5Mzk5ZWQwYiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvaGVscGVycy5jXG4rKysgYi9rZXJuZWwvYnBmL2hlbHBlcnMuY1xuQEAgLTE5MjYsNiArMTkyNiw4IEBAIHN0YXRpYyBpbnQgX19icGZfZHlucHRyX3JlYWQodm9pZCAqZHN0LCB1NjQgbGVuLCBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICpzXG4gXHRcdHJldHVybiAwO1xuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfRklMRTpcbiBcdFx0cmV0dXJuIGJwZl9maWxlX2ZldGNoX2J5dGVzKHNyYy1cdTAwM2VkYXRhLCBvZmZzZXQsIGRzdCwgbGVuKTtcbitcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQ6XG4rXHRcdHJldHVybiBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoc3JjLVx1MDAzZWRhdGEsIHNyYy1cdTAwM2VvZmZzZXQgKyBvZmZzZXQsIGRzdCwgbGVuKTtcbiBcdGRlZmF1bHQ6XG4gXHRcdFdBUk5fT05DRSh0cnVlLCBcImJwZl9keW5wdHJfcmVhZDogdW5rbm93biBkeW5wdHIgdHlwZSAlZFxcblwiLCB0eXBlKTtcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG5AQCAtMTk4NSw2ICsxOTg3LDggQEAgaW50IF9fYnBmX2R5bnB0cl93cml0ZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICpkc3QsIHU2NCBvZmZzZXQsIHZvaWQgKnNyYyxcbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBOlxuIFx0XHRyZXR1cm4gX19icGZfc2tiX21ldGFfc3RvcmVfYnl0ZXMoZHN0LVx1MDAzZWRhdGEsIGRzdC1cdTAwM2VvZmZzZXQgKyBvZmZzZXQsIHNyYyxcbiBcdFx0XHRcdFx0XHQgIGxlbiwgZmxhZ3MpO1xuK1x0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDpcbitcdFx0cmV0dXJuIF9fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMoZHN0LVx1MDAzZWRhdGEsIGRzdC1cdTAwM2VvZmZzZXQgKyBvZmZzZXQsIHNyYywgbGVuLCBmbGFncyk7XG4gXHRkZWZhdWx0OlxuIFx0XHRXQVJOX09OQ0UodHJ1ZSwgXCJicGZfZHlucHRyX3dyaXRlOiB1bmtub3duIGR5bnB0ciB0eXBlICVkXFxuXCIsIHR5cGUpO1xuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbkBAIC0yMDMyLDYgKzIwMzYsNyBAQCBCUEZfQ0FMTF8zKGJwZl9keW5wdHJfZGF0YSwgY29uc3Qgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqLCBwdHIsIHU2NCwgb2Zmc2V0LCB1NlxuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCOlxuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfWERQOlxuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEE6XG4rXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxuIFx0XHQvKiBza2IgYW5kIHhkcCBkeW5wdHJzIHNob3VsZCB1c2UgYnBmX2R5bnB0cl9zbGljZSAvIGJwZl9keW5wdHJfc2xpY2VfcmR3ciAqL1xuIFx0XHRyZXR1cm4gMDtcbiBcdGRlZmF1bHQ6XG5AQCAtMzA0OCw4ICszMDUzLDggQEAgX19icGZfa2Z1bmMgc3RydWN0IHRhc2tfc3RydWN0ICpicGZfdGFza19mcm9tX3ZwaWQoczMyIHZwaWQpXG4gICogcHJvdmlkZWQgYnVmZmVyLCB3aXRoIGl0cyBjb250ZW50cyBjb250YWluaW5nIHRoZSBkYXRhLCBpZiB1bmFibGUgdG8gb2J0YWluXG4gICogZGlyZWN0IHBvaW50ZXIpXG4gICovXG4tX19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCxcbi1cdFx0XHRcdCAgIHZvaWQgKmJ1ZmZlcl9fbnVsbGFibGUsIHU2NCBidWZmZXJfX3N6aylcbitzdGF0aWMgdm9pZCAqX19icGZfZHlucHRyX3NsaWNlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgb2Zmc2V0LFxuK1x0XHRcdFx0dm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prLCBib29sIHdyKVxuIHtcbiBcdGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0ciA9IChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICopcDtcbiBcdGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGU7XG5AQCAtMzA4Nyw2ICszMDkyLDggQEAgX19icGZfa2Z1bmMgdm9pZCAqYnBmX2R5bnB0cl9zbGljZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCxcbiBcdH1cbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9NRVRBOlxuIFx0XHRyZXR1cm4gYnBmX3NrYl9tZXRhX3BvaW50ZXIocHRyLVx1MDAzZWRhdGEsIHB0ci1cdTAwM2VvZmZzZXQgKyBvZmZzZXQpO1xuK1x0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDpcbitcdFx0cmV0dXJuIGJwZl9za2JfZXh0X3BvaW50ZXIocHRyLVx1MDAzZWRhdGEsIHB0ci1cdTAwM2VvZmZzZXQgKyBvZmZzZXQsIHdyKTtcbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6XG4gXHRcdGVyciA9IGJwZl9maWxlX2ZldGNoX2J5dGVzKHB0ci1cdTAwM2VkYXRhLCBvZmZzZXQsIGJ1ZmZlcl9fbnVsbGFibGUsIGJ1ZmZlcl9fc3prKTtcbiBcdFx0cmV0dXJuIGVyciA/IE5VTEwgOiBidWZmZXJfX251bGxhYmxlO1xuQEAgLTMwOTYsNiArMzEwMywxMyBAQCBfX2JwZl9rZnVuYyB2b2lkICpicGZfZHlucHRyX3NsaWNlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgb2Zmc2V0LFxuIFx0fVxuIH1cbiBcbitfX2JwZl9rZnVuYyB2b2lkICpicGZfZHlucHRyX3NsaWNlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgb2Zmc2V0LFxuK1x0XHRcdFx0ICAgdm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prKVxuK3tcbitcdHJldHVybiBfX2JwZl9keW5wdHJfc2xpY2UocCwgb2Zmc2V0LCBidWZmZXJfX251bGxhYmxlLCBidWZmZXJfX3N6ayxcbitcdFx0XHRcdCAgZmFsc2UpO1xuK31cbitcbiAvKipcbiAgKiBicGZfZHlucHRyX3NsaWNlX3Jkd3IoKSAtIE9idGFpbiBhIHdyaXRhYmxlIHBvaW50ZXIgdG8gdGhlIGR5bnB0ciBkYXRhLlxuICAqIEBwOiBUaGUgZHlucHRyIHdob3NlIGRhdGEgc2xpY2UgdG8gcmV0cmlldmVcbkBAIC0zMTY4LDcgKzMxODIsOCBAQCBfX2JwZl9rZnVuYyB2b2lkICpicGZfZHlucHRyX3NsaWNlX3Jkd3IoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsXG4gXHQgKiB3aWxsIGJlIGNvcGllZCBvdXQgaW50byB0aGUgYnVmZmVyIGFuZCB0aGUgdXNlciB3aWxsIG5lZWQgdG8gY2FsbFxuIFx0ICogYnBmX2R5bnB0cl93cml0ZSgpIHRvIGNvbW1pdCBjaGFuZ2VzLlxuIFx0ICovXG4tXHRyZXR1cm4gYnBmX2R5bnB0cl9zbGljZShwLCBvZmZzZXQsIGJ1ZmZlcl9fbnVsbGFibGUsIGJ1ZmZlcl9fc3prKTtcbitcdHJldHVybiBfX2JwZl9keW5wdHJfc2xpY2UocCwgb2Zmc2V0LCBidWZmZXJfX251bGxhYmxlLCBidWZmZXJfX3N6ayxcbitcdFx0XHRcdCAgdHJ1ZSk7XG4gfVxuIFxuIF9fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2FkanVzdChzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IHN0YXJ0LCB1NjQgZW5kKVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbG9nLmMgYi9rZXJuZWwvYnBmL2xvZy5jXG5pbmRleCA1ODk3NzBjYTNkM2EwLi4wMmY5YmY3MmFjMDdjIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9sb2cuY1xuKysrIGIva2VybmVsL2JwZi9sb2cuY1xuQEAgLTQ2Miw2ICs0NjIsOCBAQCBjb25zdCBjaGFyICpkeW5wdHJfdHlwZV9zdHIoZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZSlcbiBcdFx0cmV0dXJuIFwic2tiX21ldGFcIjtcbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6XG4gXHRcdHJldHVybiBcImZpbGVcIjtcbitcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQ6XG4rXHRcdHJldHVybiBcInNrYl9leHRcIjtcbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX0lOVkFMSUQ6XG4gXHRcdHJldHVybiBcIlx1MDAzY2ludmFsaWRcdTAwM2VcIjtcbiBcdGRlZmF1bHQ6XG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCBlNDIxZWEyYjgwYzNhLi5lODJlMGI0ZGQyY2UwIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXG4rKysgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbkBAIC02MjEsNiArNjIxLDcgQEAgc3RhdGljIGVudW0gYnBmX3R5cGVfZmxhZyBnZXRfZHlucHRyX3R5cGVfZmxhZyhlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlKVxuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfWERQOlxuIFx0XHRyZXR1cm4gRFlOUFRSX1RZUEVfWERQO1xuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEE6XG4rXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxuIFx0XHRyZXR1cm4gRFlOUFRSX1RZUEVfU0tCX01FVEE7XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9GSUxFOlxuIFx0XHRyZXR1cm4gRFlOUFRSX1RZUEVfRklMRTtcbkBAIC01ODkwLDYgKzU4OTEsMTAgQEAgQlRGX1RZUEVfU0FGRV9UUlVTVEVEX09SX05VTEwoc3RydWN0IHZtX2FyZWFfc3RydWN0KSB7XG4gXHRzdHJ1Y3QgZmlsZSAqdm1fZmlsZTtcbiB9O1xuIFxuK0JURl9UWVBFX1NBRkVfVFJVU1RFRF9PUl9OVUxMKHN0cnVjdCBicGZfc29ja19vcHNfa2Vybikge1xuK1x0c3RydWN0IHNrX2J1ZmYgKnNrYjtcbit9O1xuK1xuIHN0YXRpYyBib29sIHR5cGVfaXNfcmN1KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRcdFx0c3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZyxcbiBcdFx0XHRjb25zdCBjaGFyICpmaWVsZF9uYW1lLCB1MzIgYnRmX2lkKVxuQEAgLTU5MzIsNiArNTkzNyw3IEBAIHN0YXRpYyBib29sIHR5cGVfaXNfdHJ1c3RlZF9vcl9udWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRCVEZfVFlQRV9FTUlUKEJURl9UWVBFX1NBRkVfVFJVU1RFRF9PUl9OVUxMKHN0cnVjdCBzb2NrZXQpKTtcbiBcdEJURl9UWVBFX0VNSVQoQlRGX1RZUEVfU0FGRV9UUlVTVEVEX09SX05VTEwoc3RydWN0IGRlbnRyeSkpO1xuIFx0QlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpKTtcbitcdEJURl9UWVBFX0VNSVQoQlRGX1RZUEVfU0FGRV9UUlVTVEVEX09SX05VTEwoc3RydWN0IGJwZl9zb2NrX29wc19rZXJuKSk7XG4gXG4gXHRyZXR1cm4gYnRmX25lc3RlZF90eXBlX2lzX3RydXN0ZWQoXHUwMDI2ZW52LVx1MDAzZWxvZywgcmVnLCBmaWVsZF9uYW1lLCBidGZfaWQsXG4gXHRcdFx0XHRcdCAgXCJfX3NhZmVfdHJ1c3RlZF9vcl9udWxsXCIpO1xuQEAgLTExNjE1LDYgKzExNjIxLDcgQEAgZW51bSBzcGVjaWFsX2tmdW5jX3R5cGUge1xuIFx0S0ZfYnBmX2R5bnB0cl9mcm9tX3hkcCxcbiBcdEtGX2JwZl9keW5wdHJfZnJvbV9za2JfbWV0YSxcbiBcdEtGX2JwZl94ZHBfcHVsbF9kYXRhLFxuK1x0S0ZfYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQsXG4gXHRLRl9icGZfZHlucHRyX3NsaWNlLFxuIFx0S0ZfYnBmX2R5bnB0cl9zbGljZV9yZHdyLFxuIFx0S0ZfYnBmX2R5bnB0cl9jbG9uZSxcbkBAIC0xMTY5Miw2ICsxMTY5OSwxMSBAQCBCVEZfSURfVU5VU0VEXG4gQlRGX0lEX1VOVVNFRFxuIEJURl9JRF9VTlVTRURcbiAjZW5kaWZcbisjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXG4rQlRGX0lEKGZ1bmMsIGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KVxuKyNlbHNlXG4rQlRGX0lEX1VOVVNFRFxuKyNlbmRpZlxuIEJURl9JRChmdW5jLCBicGZfZHlucHRyX3NsaWNlKVxuIEJURl9JRChmdW5jLCBicGZfZHlucHRyX3NsaWNlX3Jkd3IpXG4gQlRGX0lEKGZ1bmMsIGJwZl9keW5wdHJfY2xvbmUpXG5AQCAtMTE4MjQsNyArMTE4MzYsOCBAQCBzdGF0aWMgYm9vbCBpc19rZnVuY19icGZfcHJlZW1wdF9lbmFibGUoc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhICptZXRhKVxuIFxuIGJvb2wgYnBmX2lzX2tmdW5jX3BrdF9jaGFuZ2luZyhzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4ge1xuLVx0cmV0dXJuIG1ldGEtXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3hkcF9wdWxsX2RhdGFdO1xuK1x0cmV0dXJuIG1ldGEtXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX3hkcF9wdWxsX2RhdGFdIHx8XG4rXHQgICAgICAgbWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX2V4dF07XG4gfVxuIFxuIHN0YXRpYyBpbnRcbkBAIC0xMjgzNSw3ICsxMjg0OCw4IEBAIHN0YXRpYyBpbnQgY2hlY2tfa2Z1bmNfYXJncyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21lXG4gXHRcdFx0XHRkeW5wdHJfYXJnX3R5cGUgfD0gRFlOUFRSX1RZUEVfU0tCO1xuIFx0XHRcdH0gZWxzZSBpZiAobWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21feGRwXSkge1xuIFx0XHRcdFx0ZHlucHRyX2FyZ190eXBlIHw9IERZTlBUUl9UWVBFX1hEUDtcbi1cdFx0XHR9IGVsc2UgaWYgKG1ldGEtXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX3NrYl9tZXRhXSkge1xuK1x0XHRcdH0gZWxzZSBpZiAobWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGFdIHx8XG4rXHRcdFx0XHQgICBtZXRhLVx1MDAzZWZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV9za2JfZXh0XSkge1xuIFx0XHRcdFx0ZHlucHRyX2FyZ190eXBlIHw9IERZTlBUUl9UWVBFX1NLQl9NRVRBO1xuIFx0XHRcdH0gZWxzZSBpZiAobWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fZmlsZV0pIHtcbiBcdFx0XHRcdGR5bnB0cl9hcmdfdHlwZSB8PSBEWU5QVFJfVFlQRV9GSUxFO1xuQEAgLTEzNzYzLDYgKzEzNzc3LDEzIEBAIHN0YXRpYyBpbnQgY2hlY2tfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24sXG4gXHRcdH1cbiBcdH1cbiBcbitcdGlmIChtZXRhLmZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV9za2JfZXh0XSBcdTAwMjZcdTAwMjZcbitcdCAgICAocHJvZ190eXBlID09IEJQRl9QUk9HX1RZUEVfTFNNIHx8IHByb2dfdHlwZSA9PSBCUEZfUFJPR19UWVBFX1RSQUNJTkcpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChtZXRhLmFyZ19jb25zdGFudC52YWx1ZSBcdTAwMjYgQlBGX1NLQl9FWFRfRl9DUkVBVEUpKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcIkJQRl9TS0JfRVhUX0ZfQ1JFQVRFIGlzIG5vdCBhbGxvd2VkIGluIGxzbS90cmFjaW5nIHByb2dyYW1zXFxuXCIpO1xuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbiBcdGlmIChpc19icGZfcmJ0cmVlX2FkZF9rZnVuYyhtZXRhLmZ1bmNfaWQpKSB7XG4gXHRcdGVyciA9IHB1c2hfY2FsbGJhY2tfY2FsbChlbnYsIGluc24sIGluc25faWR4LCBtZXRhLnN1YnByb2dubyxcbiBcdFx0XHRcdFx0IHNldF9yYnRyZWVfYWRkX2NhbGxiYWNrX3N0YXRlKTtcbmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnXG5pbmRleCBlMzg0NzczOTM1NTE1Li42ZDU3MzIwZGZlYTM5IDEwMDY0NFxuLS0tIGEvbmV0L0tjb25maWdcbisrKyBiL25ldC9LY29uZmlnXG5AQCAtNTQwLDQgKzU0MCwyNCBAQCBjb25maWcgTkVUX1RFU1RcbiBcbiBcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiBcbitjb25maWcgQlBGX1NLQl9FWFRcbitcdGJvb2wgXCJza2IgZXh0ZW5zaW9uIGZvciBCUEYgbWV0YWRhdGFcIlxuK1x0ZGVwZW5kcyBvbiBCUEZfU1lTQ0FMTFxuK1x0c2VsZWN0IFNLQl9FWFRFTlNJT05TXG4rXHRoZWxwXG4rXHQgIEVuYWJsZSBhbiBza19idWZmIGV4dGVuc2lvbiBmb3Igc3RvcmluZyBCUEYgbWV0YWRhdGEuIFRoaXMgYWxsb3dzIEJQRlxuK1x0ICBwcm9ncmFtcyB0byBhc3NvY2lhdGUgYXJiaXRyYXJ5IGRhdGEgd2l0aCBpbmRpdmlkdWFsIHBhY2tldHMgYXMgdGhleVxuK1x0ICB0cmF2ZXJzZSB0aGUgbmV0d29yayBzdGFjay4gVGhlIHN0b3JhZ2UgaXMgYXV0b21hdGljYWxseSBmcmVlZCB3aGVuXG4rXHQgIHRoZSBza19idWZmIGlzIGZyZWVkLlxuK1xuK2NvbmZpZyBCUEZfU0tCX0VYVF9TSVpFXG4rXHRpbnQgXCJTaXplIG9mIHRoZSBCUEYgc2tiIGV4dGVuc2lvbiBtZXRhZGF0YSBidWZmZXJcIlxuK1x0ZGVwZW5kcyBvbiBCUEZfU0tCX0VYVFxuK1x0cmFuZ2UgMSAyNTZcbitcdGRlZmF1bHQgNjRcbitcdGhlbHBcbitcdCAgQ29uZmlndXJlcyB0aGUgc2l6ZSBvZiB0aGUgaW5saW5lIG1ldGFkYXRhIGJ1ZmZlciBpbiBzdHJ1Y3RcbitcdCAgYnBmX3NrYl9leHQsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIGEgQlBGIHByb2dyYW0gY2FuXG4rXHQgIHN0b3JlIG9yIHJldHJpZXZlIHdpdGggYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKS5cbitcbiBlbmRpZiAgICMgaWYgTkVUXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmlsdGVyLmMgYi9uZXQvY29yZS9maWx0ZXIuY1xuaW5kZXggNjE5NDBlNzUzNTUyMy4uYmY3NTRmMzMwMzQ2MyAxMDA2NDRcbi0tLSBhL25ldC9jb3JlL2ZpbHRlci5jXG4rKysgYi9uZXQvY29yZS9maWx0ZXIuY1xuQEAgLTEyNDE4LDYgKzEyNDE4LDU0IEBAIGludCBfX2JwZl9za2JfbWV0YV9zdG9yZV9ieXRlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcbit2b2lkICpicGZfc2tiX2V4dF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIGJvb2wgd3IpXG4re1xuK1x0c3RydWN0IGJwZl9za2JfZXh0ICpleHQ7XG4rXG4rXHRleHQgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX0JQRik7XG4rXHRpZiAoIWV4dClcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRpZiAod3IgXHUwMDI2XHUwMDI2IHNrYl9leHRfc2hhcmVkKHNrYikpXG4rXHRcdHJldHVybiBOVUxMO1xuK1xuK1x0cmV0dXJuIGV4dC1cdTAwM2VidWYgKyBvZmZzZXQ7XG4rfVxuK1xuK2ludCBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCwgdm9pZCAqdG8sXG4rXHRcdFx0ICAgICB1MzIgbGVuKVxuK3tcbitcdHN0cnVjdCBicGZfc2tiX2V4dCAqZXh0O1xuK1xuK1x0ZXh0ID0gc2tiX2V4dF9maW5kKHNrYiwgU0tCX0VYVF9CUEYpO1xuK1x0aWYgKCFleHQpXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0bWVtbW92ZSh0bywgZXh0LVx1MDAzZWJ1ZiArIG9mZnNldCwgbGVuKTtcbitcdHJldHVybiAwO1xuK31cbitcbitpbnQgX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LFxuK1x0XHRcdCAgICAgIGNvbnN0IHZvaWQgKmZyb20sIHUzMiBsZW4sIHU2NCBmbGFncylcbit7XG4rXHRzdHJ1Y3QgYnBmX3NrYl9leHQgKmV4dDtcbitcbitcdGlmICh1bmxpa2VseShmbGFncykpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0ZXh0ID0gc2tiX2V4dF9maW5kKHNrYiwgU0tCX0VYVF9CUEYpO1xuK1x0aWYgKCFleHQpXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0aWYgKHNrYl9leHRfc2hhcmVkKHNrYikpXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXG4rXHRtZW1tb3ZlKGV4dC1cdTAwM2VidWYgKyBvZmZzZXQsIGZyb20sIGxlbik7XG4rXHRyZXR1cm4gMDtcbit9XG4rI2VuZGlmIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqL1xuK1xuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcbiBfX2JwZl9rZnVuYyBpbnQgYnBmX2R5bnB0cl9mcm9tX3NrYihzdHJ1Y3QgX19za19idWZmICpzLCB1NjQgZmxhZ3MsXG4gXHRcdFx0XHQgICAgc3RydWN0IGJwZl9keW5wdHIgKnB0cl9fdW5pbml0KVxuQEAgLTEyNDM1LDYgKzEyNDgzLDc5IEBAIF9fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2Zyb21fc2tiKHN0cnVjdCBfX3NrX2J1ZmYgKnMsIHU2NCBmbGFncyxcbiBcdHJldHVybiAwO1xuIH1cbiBcbisjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXG4rLyoqXG4rICogYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKSAtIEluaXRpYWxpemUgYSBkeW5wdHIgdG8gdGhlIHNrYl9leHQgQlBGIGFyZWEuXG4rICogQHNrYl86IHNvY2tldCBidWZmZXIgdG8gYXR0YWNoIHRoZSBleHRlbnNpb24gdG9cbisgKiBAc2l6ZTogZHlucHRyIHNpemUgaW4gYnl0ZXMsIDAgZm9yIG1heGltdW0gKENPTkZJR19CUEZfU0tCX0VYVF9TSVpFKVxuKyAqIEBmbGFnc19fazogQlBGX1NLQl9FWFRfRl9DUkVBVEUgdG8gY3JlYXRlL0NPVyAocmVhZC13cml0ZSksIDAgdG8gZmluZFxuKyAqICAgICAgICAgICAgKHJlYWQtb25seSlcbisgKiBAcHRyX191bmluaXQ6IGR5bnB0ciB0byBpbml0aWFsaXplXG4rICpcbisgKiBXcml0ZXMgdG8gdGhlIGR5bnB0ciAoYnBmX2R5bnB0cl93cml0ZSgpLCBicGZfZHlucHRyX3NsaWNlX3Jkd3IoKSkgZmFpbCB3aXRoXG4rICogJS1FQlVTWSBvciBOVUxMIGlmIHRoZSBleHRlbnNpb24gY2h1bmsgaXMgc2hhcmVkIHdpdGggY2xvbmVzLCBlLmcuIGFmdGVyXG4rICogYnBmX2Nsb25lX3JlZGlyZWN0KCkuIFJlLWFjcXVpcmUgdGhlIGR5bnB0ciB3aXRoIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFIHRvIGdldFxuKyAqIGEgd3JpdGFibGUgcHJpdmF0ZSBjb3B5LlxuKyAqXG4rICogQlBGX1NLQl9FWFRfRl9DUkVBVEUgaXMgbm90IGFsbG93ZWQgaW4gdHJhY2luZyBhbmQgTFNNIHByb2dyYW1zLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICogJTAgICAgICAgICAtIGR5bnB0ciByZWFkeSB0byB1c2VcbisgKiAqICUtRU5PRU5UICAgLSBleHRlbnNpb24gbm90IGZvdW5kICh3aGVuIG5vdCBjcmVhdGluZylcbisgKiAqICUtRU5PTUVNICAgLSBhbGxvY2F0aW9uIGZhaWxlZFxuKyAqICogJS1FSU5WQUwgICAtIGludmFsaWQgZmxhZ3NcbisgKiAqICUtRTJCSUcgICAgLSBzaXplIGV4Y2VlZHMgQ09ORklHX0JQRl9TS0JfRVhUX1NJWkVcbisgKi9cbitfX2JwZl9rZnVuYyBpbnQgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoc3RydWN0IF9fc2tfYnVmZiAqc2tiXywgdTMyIHNpemUsXG4rXHRcdFx0XHRcdHU2NCBmbGFnc19fayxcbitcdFx0XHRcdFx0c3RydWN0IGJwZl9keW5wdHIgKnB0cl9fdW5pbml0KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0ciA9IChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICopcHRyX191bmluaXQ7XG4rXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopc2tiXztcbitcdGJvb2wgY3JlYXRlID0gZmxhZ3NfX2sgXHUwMDI2IEJQRl9TS0JfRVhUX0ZfQ1JFQVRFO1xuK1x0c3RydWN0IGJwZl9za2JfZXh0ICpleHQ7XG4rXHRib29sIGV4aXN0cztcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoZmxhZ3NfX2sgXHUwMDI2IH5CUEZfU0tCX0VYVF9GX0NSRUFURSkge1xuK1x0XHRlcnIgPSAtRUlOVkFMO1xuK1x0XHRnb3RvIGVycm9yO1xuK1x0fVxuK1xuK1x0aWYgKHNpemUgXHUwMDNlIEFSUkFZX1NJWkUoZXh0LVx1MDAzZWJ1ZikpIHtcbitcdFx0ZXJyID0gLUUyQklHO1xuK1x0XHRnb3RvIGVycm9yO1xuK1x0fVxuK1x0aWYgKCFzaXplKVxuK1x0XHRzaXplID0gQVJSQVlfU0laRShleHQtXHUwMDNlYnVmKTtcbitcbitcdGV4aXN0cyA9IHNrYl9leHRfZXhpc3Qoc2tiLCBTS0JfRVhUX0JQRik7XG4rXHRpZiAoIWNyZWF0ZSkge1xuK1x0XHRpZiAoIWV4aXN0cykge1xuK1x0XHRcdGVyciA9IC1FTk9FTlQ7XG4rXHRcdFx0Z290byBlcnJvcjtcbitcdFx0fVxuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGV4dCA9IHNrYl9leHRfYWRkKHNrYiwgU0tCX0VYVF9CUEYpO1xuK1x0aWYgKCFleHQpIHtcbitcdFx0ZXJyID0gLUVOT01FTTtcbitcdFx0Z290byBlcnJvcjtcbitcdH1cbitcdGlmICghZXhpc3RzKVxuK1x0XHRtZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpO1xuK291dDpcbitcdGJwZl9keW5wdHJfaW5pdChwdHIsIHNrYiwgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQsIDAsIHNpemUpO1xuK1x0aWYgKCFjcmVhdGUpXG4rXHRcdGJwZl9keW5wdHJfc2V0X3Jkb25seShwdHIpO1xuK1x0cmV0dXJuIDA7XG4rZXJyb3I6XG4rXHRicGZfZHlucHRyX3NldF9udWxsKHB0cik7XG4rXHRyZXR1cm4gZXJyO1xuK31cbisjZW5kaWYgLyogQ09ORklHX0JQRl9TS0JfRVhUICovXG4rXG4gLyoqXG4gICogYnBmX2R5bnB0cl9mcm9tX3NrYl9tZXRhKCkgLSBJbml0aWFsaXplIGEgZHlucHRyIHRvIHRoZSBza2IgbWV0YWRhdGEgYXJlYS5cbiAgKiBAc2tiXzogc29ja2V0IGJ1ZmZlciBjYXJyeWluZyB0aGUgbWV0YWRhdGFcbkBAIC0xMjgxNiw2ICsxMjkzNywxMiBAQCBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9rZnVuY19jaGVja19zZXRfc2tiX21ldGEpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9keW5wdHJfZnJvbV9za2JfbWV0YSlcbiBCVEZfS0ZVTkNTX0VORChicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9tZXRhKVxuIFxuKyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9rZnVuY19jaGVja19zZXRfc2tiX2V4dClcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQpXG4rQlRGX0tGVU5DU19FTkQoYnBmX2tmdW5jX2NoZWNrX3NldF9za2JfZXh0KVxuKyNlbmRpZlxuK1xuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX2tmdW5jX2NoZWNrX3NldF94ZHApXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9keW5wdHJfZnJvbV94ZHApXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl94ZHBfcHVsbF9kYXRhKVxuQEAgLTEyODQ3LDYgKzEyOTc0LDEzIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfa2Z1bmNfc2V0X3NrYl9tZXRhID0ge1xuIFx0LnNldCA9IFx1MDAyNmJwZl9rZnVuY19jaGVja19zZXRfc2tiX21ldGEsXG4gfTtcbiBcbisjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfc2tiX2V4dCA9IHtcbitcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuK1x0LnNldCA9IFx1MDAyNmJwZl9rZnVuY19jaGVja19zZXRfc2tiX2V4dCxcbit9O1xuKyNlbmRpZlxuK1xuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfa2Z1bmNfc2V0X3hkcCA9IHtcbiBcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuIFx0LnNldCA9IFx1MDAyNmJwZl9rZnVuY19jaGVja19zZXRfeGRwLFxuQEAgLTEyODg5LDYgKzEzMDIzLDIxIEBAIHN0YXRpYyBpbnQgX19pbml0IGJwZl9rZnVuY19pbml0KHZvaWQpXG4gXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiKTtcbiBcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9tZXRhKTtcbiBcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQUNULCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9tZXRhKTtcbisjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbitcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQUNULCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9DR1JPVVBfU0tCLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TT0NLX09QUywgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbitcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0tfU0tCLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MV1RfT1VULCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MV1RfSU4sIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9YTUlULCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9MV1RfU0VHNkxPQ0FMLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9ORVRGSUxURVIsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xTTSwgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbitcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORywgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbisjZW5kaWZcbiBcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfWERQLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3hkcCk7XG4gXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TT0NLX0FERFIsXG4gXHRcdFx0XHRcdCAgICAgICBcdTAwMjZicGZfa2Z1bmNfc2V0X3NvY2tfYWRkcik7XG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuY1xuaW5kZXggYWIxOTViOTljODUzMC4uYTQ3OWUyNWRlNTY0OCAxMDA2NDRcbi0tLSBhL25ldC9jb3JlL3NrYnVmZi5jXG4rKysgYi9uZXQvY29yZS9za2J1ZmYuY1xuQEAgLTgzLDYgKzgzLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NuZXQvcGFnZV9wb29sL2hlbHBlcnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9wc3AvdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9kcm9wcmVhc29uLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC94ZHBfc29jay5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdWFjY2Vzcy5oXHUwMDNlXG5AQCAtNTE2OSw2ICs1MTcwLDkgQEAgc3RhdGljIGNvbnN0IHU4IHNrYl9leHRfdHlwZV9sZW5bXSA9IHtcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQ0FOKVxuIFx0W1NLQl9FWFRfQ0FOXSA9IFNLQl9FWFRfQ0hVTktTSVpFT0Yoc3RydWN0IGNhbl9za2JfZXh0KSxcbiAjZW5kaWZcbisjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NLQl9FWFQpXG4rXHRbU0tCX0VYVF9CUEZdID0gU0tCX0VYVF9DSFVOS1NJWkVPRihzdHJ1Y3QgYnBmX3NrYl9leHQpLFxuKyNlbmRpZlxuIH07XG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBfX25vX3Byb2ZpbGUgdW5zaWduZWQgaW50IHNrYl9leHRfdG90YWxfbGVuZ3RoKHZvaWQpXG5AQCAtNjI4Nyw3ICs2MjkxLDggQEAgRVhQT1JUX1NZTUJPTChza2JfdHJ5X2NvYWxlc2NlKTtcbiAgKiBvcGVyYXRpb25zLlxuICAqIHNrYl9zY3J1Yl9wYWNrZXQgY2FuIGFsc28gYmUgdXNlZCB0byBjbGVhbiBhIHNrYiBiZWZvcmUgaW5qZWN0aW5nIGl0IGluXG4gICogYW5vdGhlciBuYW1lc3BhY2UgKEB4bmV0ID09IHRydWUpLiBXZSBoYXZlIHRvIGNsZWFyIGFsbCBpbmZvcm1hdGlvbiBpbiB0aGVcbi0gKiBza2IgdGhhdCBjb3VsZCBpbXBhY3QgbmFtZXNwYWNlIGlzb2xhdGlvbi5cbisgKiBza2IgdGhhdCBjb3VsZCBpbXBhY3QgbmFtZXNwYWNlIGlzb2xhdGlvbi4gTm90ZSB0aGF0IEJQRiBza2IgZXh0ZW5zaW9uIGlzXG4rICogbWVhbnQgdG8gY2FycnkgaW5mb3JtYXRpb24gYWNyb3NzIG5hbWVzcGFjZXMgYnkgZGVzaWduLlxuICAqL1xuIHZvaWQgc2tiX3NjcnViX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHhuZXQpXG4ge1xuQEAgLTYyOTUsNyArNjMwMCw3IEBAIHZvaWQgc2tiX3NjcnViX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHhuZXQpXG4gXHRza2ItXHUwMDNlc2tiX2lpZiA9IDA7XG4gXHRza2ItXHUwMDNlaWdub3JlX2RmID0gMDtcbiBcdHNrYl9kc3RfZHJvcChza2IpO1xuLVx0c2tiX2V4dF9yZXNldChza2IpO1xuK1x0c2tiX2V4dF9zY3J1Yihza2IpO1xuIFx0bmZfcmVzZXRfY3Qoc2tiKTtcbiBcdG5mX3Jlc2V0X3RyYWNlKHNrYik7XG4gXG5AQCAtNzMwNCw2ICs3MzA5LDI0IEBAIHZvaWQgX19za2JfZXh0X3B1dChzdHJ1Y3Qgc2tiX2V4dCAqZXh0KVxuIFx0a21lbV9jYWNoZV9mcmVlKHNrYnVmZl9leHRfY2FjaGUsIGV4dCk7XG4gfVxuIEVYUE9SVF9TWU1CT0woX19za2JfZXh0X3B1dCk7XG4rXG4rdm9pZCBza2JfZXh0X3NjcnViKHN0cnVjdCBza19idWZmICpza2IpXG4re1xuK1x0dW5zaWduZWQgaW50IGlkO1xuK1xuK1x0aWYgKGxpa2VseSghc2tiLVx1MDAzZWFjdGl2ZV9leHRlbnNpb25zKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0Zm9yIChpZCA9IDA7IGlkIFx1MDAzYyBTS0JfRVhUX05VTTsgaWQrKykge1xuKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUEZfU0tCX0VYVClcbitcdFx0aWYgKGlkID09IFNLQl9FWFRfQlBGKVxuK1x0XHRcdGNvbnRpbnVlO1xuKyNlbmRpZlxuK1x0XHRza2JfZXh0X2RlbChza2IsIGlkKTtcbitcdH1cbit9XG4rRVhQT1JUX1NZTUJPTChza2JfZXh0X3NjcnViKTtcbitcbiAjZW5kaWYgLyogQ09ORklHX1NLQl9FWFRFTlNJT05TICovXG4gXG4gc3RhdGljIHZvaWQga2ZyZWVfc2tiX25hcGlfY2FjaGUoc3RydWN0IHNrX2J1ZmYgKnNrYilcbmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jXG5pbmRleCBiMzg4N2M0MmFkZmRiLi5jZjA5M2IwZDY2YzU4IDEwMDY0NFxuLS0tIGEvbmV0L2lwdjQvdWRwLmNcbisrKyBiL25ldC9pcHY0L3VkcC5jXG5AQCAtMTU0MCw4ICsxNTQwLDYgQEAgdm9pZCB1ZHBfc3BsaWNlX2VvZihzdHJ1Y3Qgc29ja2V0ICpzb2NrKVxuICAqXG4gICogV2UgbmVlZCB0byBwcmVzZXJ2ZSBzZWNwYXRoLCBpZiBwcmVzZW50LCB0byBldmVudHVhbGx5IHByb2Nlc3NcbiAgKiBJUF9DTVNHX1BBU1NTRUMgYXQgcmVjdm1zZygpIHRpbWUuXG4tICpcbi0gKiBPdGhlciBleHRlbnNpb25zIGNhbiBiZSBjbGVhcmVkLlxuICAqL1xuIHN0YXRpYyBib29sIHVkcF90cnlfbWFrZV9zdGF0ZWxlc3Moc3RydWN0IHNrX2J1ZmYgKnNrYilcbiB7XG5AQCAtMTU0OSw4ICsxNTQ3LDggQEAgc3RhdGljIGJvb2wgdWRwX3RyeV9tYWtlX3N0YXRlbGVzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcbiBcdGlmICghc2VjcGF0aF9leGlzdHMoc2tiKSkge1xuLVx0XHRza2JfZXh0X3Jlc2V0KHNrYik7XG4tXHRcdHJldHVybiB0cnVlO1xuK1x0XHRza2JfZXh0X3NjcnViKHNrYik7XG4rXHRcdHJldHVybiAhc2tiX2hhc19leHRlbnNpb25zKHNrYik7XG4gXHR9XG4gXG4gXHRyZXR1cm4gZmFsc2U7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjliYmZhMzUxYmNlZGMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtNyw2ICs3LDcgQEAgQ09ORklHX0JQRl9KSVQ9eVxuIENPTkZJR19CUEZfS1BST0JFX09WRVJSSURFPXlcbiBDT05GSUdfQlBGX0xJUkNfTU9ERTI9eVxuIENPTkZJR19CUEZfTFNNPXlcbitDT05GSUdfQlBGX1NLQl9FWFQ9eVxuIENPTkZJR19CUEZfU1RSRUFNX1BBUlNFUj15XG4gQ09ORklHX0JQRl9TWVNDQUxMPXlcbiAjIENPTkZJR19CUEZfVU5QUklWX0RFRkFVTFRfT0ZGIGlzIG5vdCBzZXRcbkBAIC0xMzYsMyArMTM3LDQgQEAgQ09ORklHX1NNQ19IU19DVFJMX0JQRj15XG4gQ09ORklHX0RJQlM9eVxuIENPTkZJR19ESUJTX0xPPXlcbiBDT05GSUdfUE1fV0FLRUxPQ0tTPXlcbitDT05GSUdfTkVUX1NDSF9ORVRFTT15XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc29ja2V0X2hlbHBlcnMuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NvY2tldF9oZWxwZXJzLmhcbmluZGV4IDBkNTk1MDNhMGM3M2UuLmViMTE0YTZlYTZmOTIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zb2NrZXRfaGVscGVycy5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zb2NrZXRfaGVscGVycy5oXG5AQCAtMyw2ICszLDcgQEBcbiAjaWZuZGVmIF9fU09DS0VUX0hFTFBFUlNfX1xuICNkZWZpbmUgX19TT0NLRVRfSEVMUEVSU19fXG4gXG4rI2luY2x1ZGUgXHUwMDNjZXJyb3IuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdm1fc29ja2V0cy5oXHUwMDNlXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZpZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmaWVyLmNcbmluZGV4IDY0YWM0OWFkNjdlNjMuLjc3MjRlODJmY2U2NmEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZmllci5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZmllci5jXG5AQCAtOTQsNiArOTQsNyBAQFxuICNpbmNsdWRlIFwidmVyaWZpZXJfc2NhbGFyX2lkcy5za2VsLmhcIlxuICNpbmNsdWRlIFwidmVyaWZpZXJfc2Rpdi5za2VsLmhcIlxuICNpbmNsdWRlIFwidmVyaWZpZXJfc2VhcmNoX3BydW5pbmcuc2tlbC5oXCJcbisjaW5jbHVkZSBcInZlcmlmaWVyX3NrYl9leHQuc2tlbC5oXCJcbiAjaW5jbHVkZSBcInZlcmlmaWVyX3NvY2suc2tlbC5oXCJcbiAjaW5jbHVkZSBcInZlcmlmaWVyX3NvY2tfYWRkci5za2VsLmhcIlxuICNpbmNsdWRlIFwidmVyaWZpZXJfc29ja21hcF9tdXRhdGUuc2tlbC5oXCJcbkBAIC0yNTYsNiArMjU3LDcgQEAgdm9pZCB0ZXN0X3ZlcmlmaWVyX3J1bnRpbWVfaml0KHZvaWQpICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3J1bnRpbWVfaml0KTsgfVxuIHZvaWQgdGVzdF92ZXJpZmllcl9zY2FsYXJfaWRzKHZvaWQpICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9zY2FsYXJfaWRzKTsgfVxuIHZvaWQgdGVzdF92ZXJpZmllcl9zZGl2KHZvaWQpICAgICAgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9zZGl2KTsgfVxuIHZvaWQgdGVzdF92ZXJpZmllcl9zZWFyY2hfcHJ1bmluZyh2b2lkKSAgICAgICB7IFJVTih2ZXJpZmllcl9zZWFyY2hfcHJ1bmluZyk7IH1cbit2b2lkIHRlc3RfdmVyaWZpZXJfc2tiX2V4dCh2b2lkKSAgICAgICAgICAgICAgeyBSVU4odmVyaWZpZXJfc2tiX2V4dCk7IH1cbiB2b2lkIHRlc3RfdmVyaWZpZXJfc29jayh2b2lkKSAgICAgICAgICAgICAgICAgeyBSVU4odmVyaWZpZXJfc29jayk7IH1cbiB2b2lkIHRlc3RfdmVyaWZpZXJfc29ja19hZGRyKHZvaWQpICAgICAgICAgICAgeyBSVU4odmVyaWZpZXJfc29ja19hZGRyKTsgfVxuIHZvaWQgdGVzdF92ZXJpZmllcl9zb2NrbWFwX211dGF0ZSh2b2lkKSAgICAgICB7IFJVTih2ZXJpZmllcl9zb2NrbWFwX211dGF0ZSk7IH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy94ZHBfY29udGV4dF90ZXN0X3J1bi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMveGRwX2NvbnRleHRfdGVzdF9ydW4uY1xuaW5kZXggNDQ4ODA3Njc2MTc2Yy4uOWNiYjgzOWE1NWNjZSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3hkcF9jb250ZXh0X3Rlc3RfcnVuLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3hkcF9jb250ZXh0X3Rlc3RfcnVuLmNcbkBAIC0yLDcgKzIsOSBAQFxuICNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldHdvcmtfaGVscGVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvaXB2Ni5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbmV0ZmlsdGVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NhcnBhL2luZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFwic29ja2V0X2hlbHBlcnMuaFwiXG4gI2luY2x1ZGUgXCJ0ZXN0X3hkcF9jb250ZXh0X3Rlc3RfcnVuLnNrZWwuaFwiXG4gI2luY2x1ZGUgXCJ0ZXN0X3hkcF9tZXRhLnNrZWwuaFwiXG4gXG5AQCAtMTYsMTMgKzE4LDE0IEBAXG4gI2RlZmluZSBEVU1NWV9OQU1FIFwiZHVtMFwiXG4gI2RlZmluZSBUQVBfTkVUTlMgXCJ4ZHBfY29udGV4dF90dW50YXBcIlxuICNkZWZpbmUgTFdUX05FVE5TIFwieGRwX2NvbnRleHRfbHd0XCJcbisjZGVmaW5lIFNLQl9FWFRfTkVUTlMgXCJza2JfZXh0X3R1bnRhcFwiXG4gXG4gI2RlZmluZSBURVNUX1BBWUxPQURfTEVOIDMyXG4gc3RhdGljIGNvbnN0IF9fdTggdGVzdF9wYXlsb2FkW1RFU1RfUEFZTE9BRF9MRU5dID0ge1xuLVx0MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCxcbi1cdDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsXG4tXHQweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LFxuLVx0MHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCxcbitcdDB4NDksIDB4MjAsIDB4NjMsIDB4NzIsIDB4NmYsIDB4NzMsIDB4NzMsIDB4NjUsXG4rXHQweDY0LCAweDIwLCAweDY4LCAweDZmLCAweDZmLCAweDZiLCAweDczLCAweDIwLFxuK1x0MHgyNiwgMHgyMCwgMHg2YywgMHg2OSwgMHg3NiwgMHg2NSwgMHg2NCwgMHgyMCxcbitcdDB4NzQsIDB4NmYsIDB4MjAsIDB4NzQsIDB4NjUsIDB4NmMsIDB4NmMsIDB4MjEsXG4gfTtcbiBcbiB2b2lkIHRlc3RfeGRwX2NvbnRleHRfZXJyb3IoaW50IHByb2dfZmQsIHN0cnVjdCBicGZfdGVzdF9ydW5fb3B0cyBvcHRzLFxuQEAgLTMzMSwxMCArMzM0LDExIEBAIHZvaWQgdGVzdF94ZHBfY29udGV4dF92ZXRoKHZvaWQpXG4gXHRuZXRuc19mcmVlKHR4X25zKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgdGVzdF90dW50YXAoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZyxcbi1cdFx0XHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMV9wcm9nLFxuLVx0XHRcdHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18yX3Byb2csXG4tXHRcdFx0Ym9vbCAqdGVzdF9wYXNzKVxuK3N0YXRpYyB2b2lkIF9fdGVzdF90dW50YXAoY29uc3QgY2hhciAqbnNuYW1lLFxuK1x0XHRcdCAgc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZyxcbitcdFx0XHQgIHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18xX3Byb2csXG4rXHRcdFx0ICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMl9wcm9nLFxuK1x0XHRcdCAgYm9vbCAqdGVzdF9wYXNzKVxuIHtcbiBcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuIFx0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbkBAIC0zNDUsNyArMzQ5LDcgQEAgc3RhdGljIHZvaWQgdGVzdF90dW50YXAoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZyxcbiBcbiBcdCp0ZXN0X3Bhc3MgPSBmYWxzZTtcbiBcbi1cdG5zID0gbmV0bnNfbmV3KFRBUF9ORVROUywgdHJ1ZSk7XG4rXHRucyA9IG5ldG5zX25ldyhuc25hbWUsIHRydWUpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcImNyZWF0ZSBhbmQgb3BlbiBuc1wiKSlcbiBcdFx0cmV0dXJuO1xuIFxuQEAgLTM5Niw2ICs0MDAsMTUgQEAgc3RhdGljIHZvaWQgdGVzdF90dW50YXAoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZyxcbiBcdG5ldG5zX2ZyZWUobnMpO1xuIH1cbiBcbitzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLFxuK1x0XHRcdHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18xX3Byb2csXG4rXHRcdFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzJfcHJvZyxcbitcdFx0XHRib29sICp0ZXN0X3Bhc3MpXG4re1xuK1x0X190ZXN0X3R1bnRhcChUQVBfTkVUTlMsIHhkcF9wcm9nLCB0Y19wcmlvXzFfcHJvZywgdGNfcHJpb18yX3Byb2csXG4rXHRcdCAgICAgIHRlc3RfcGFzcyk7XG4rfVxuK1xuIC8qIFdyaXRlIGEgcGFja2V0IHRvIGEgdGFwIGRldiBhbmQgY29weSBpdCB0byBpbmdyZXNzIG9mIGEgZHVtbXkgZGV2ICovXG4gc3RhdGljIHZvaWQgdGVzdF90dW50YXBfbWlycmVkKHN0cnVjdCBicGZfcHJvZ3JhbSAqeGRwX3Byb2csXG4gXHRcdFx0ICAgICAgIHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJvZyxcbkBAIC02OTMsMyArNzA2LDEwODkgQEAgdm9pZCB0ZXN0X3hkcF9jb250ZXh0X2x3dF9lbmNhcCh2b2lkKVxuIFxuIFx0dGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTtcbiB9XG4rXG4rc3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMV9wcm9nLFxuK1x0XHRcdFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzJfcHJvZyxcbitcdFx0XHRcdGJvb2wgKnRlc3RfcGFzcylcbit7XG4rXHRfX3Rlc3RfdHVudGFwKFNLQl9FWFRfTkVUTlMsIE5VTEwgLyogeGRwICovLCB0Y19wcmlvXzFfcHJvZyxcbitcdFx0ICAgICAgdGNfcHJpb18yX3Byb2csIHRlc3RfcGFzcyk7XG4rfVxuK1xuKy8qXG4rICogVGVzdCBpZiBza2JfZXh0IHN1cnZpdmVzIHNrYiBjbG9uZSAodmlhIHRjIG1pcnJlZCkuXG4rICogZHVtbXlfcHJvZyBydW5zIG9uIHRoZSBjbG9uZSAoZHVtbXkgaW5ncmVzcykuXG4rICovXG4rc3RhdGljIHZvaWQgdGVzdF9taXJyZWRfY2xvbmVfZXh0KHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLFxuK1x0XHRcdFx0ICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmR1bW15X3Byb2cpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuK1x0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xuK1x0aW50IGR1bW15X2lmaW5kZXg7XG4rXHRpbnQgdGFwX2lmaW5kZXg7XG4rXHRpbnQgdGFwX2ZkID0gLTE7XG4rXHRpbnQgcmV0O1xuK1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNld3JpdGVfZG9uZSA9IGZhbHNlO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzID0gZmFsc2U7XG4rXG4rXHRucyA9IG5ldG5zX25ldyhcIm1pcnJlZF9jbG9uZVwiLCB0cnVlKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihucywgXCJuZXRuc19uZXdcIikpXG4rXHRcdHJldHVybjtcbitcbitcdC8qIER1bW15IGRldjogYXR0YWNoIHJlYWRlciAqL1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgYWRkIG5hbWUgXCIgRFVNTVlfTkFNRSBcIiB0eXBlIGR1bW15XCIpO1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgc2V0IGRldiBcIiBEVU1NWV9OQU1FIFwiIHVwXCIpO1xuK1xuK1x0ZHVtbXlfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KERVTU1ZX05BTUUpO1xuK1x0aWYgKCFBU1NFUlRfR1QoZHVtbXlfaWZpbmRleCwgMCwgXCJkdW1teV9pZmluZGV4XCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0dGNfaG9vay5pZmluZGV4ID0gZHVtbXlfaWZpbmRleDtcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJkdW1teV9ob29rX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChkdW1teV9wcm9nKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dGNfaG9vaywgXHUwMDI2dGNfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZHVtbXlfYXR0YWNoXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0LyogVEFQIGRldjogYXR0YWNoIHdyaXRlciArIG1pcnJlZCB0byBkdW1teSAqL1xuK1x0dGFwX2ZkID0gb3Blbl90dW50YXAoVEFQX05BTUUsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfR0UodGFwX2ZkLCAwLCBcIm9wZW5fdHVudGFwXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgc2V0IGRldiBcIiBUQVBfTkFNRSBcIiB1cFwiKTtcbitcbitcdHRhcF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVEFQX05BTUUpO1xuK1x0aWYgKCFBU1NFUlRfR1QodGFwX2lmaW5kZXgsIDAsIFwidGFwX2lmaW5kZXhcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHR0Y19ob29rLmlmaW5kZXggPSB0YXBfaWZpbmRleDtcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ0YXBfaG9va19jcmVhdGVcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHR0Y19vcHRzLnByb2dfaWQgPSAwO1xuK1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XG4rXHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInRhcF9hdHRhY2hcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHRTWVMoY2xvc2UsIFwidGMgZmlsdGVyIGFkZCBkZXYgXCIgVEFQX05BTUUgXCIgaW5ncmVzcyBcIlxuK1x0XHQgICBcInByb3RvY29sIGFsbCBtYXRjaGFsbCBcIlxuK1x0XHQgICBcImFjdGlvbiBtaXJyZWQgaW5ncmVzcyBtaXJyb3IgZGV2IFwiIERVTU1ZX05BTUUpO1xuK1xuK1x0cmV0ID0gd3JpdGVfdGVzdF9wYWNrZXQodGFwX2ZkKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV90ZXN0X3BhY2tldFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXdyaXRlX2RvbmUsIFwid3JpdGVfZG9uZVwiKTtcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCJ0ZXN0X3Bhc3NcIik7XG4rXG4rY2xvc2U6XG4rXHRpZiAodGFwX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UodGFwX2ZkKTtcbitcdG5ldG5zX2ZyZWUobnMpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X21pcnJlZF9jbG9uZV9leHRfY293KHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsKVxuK3tcbitcdHN0cnVjdCBicGZfbGluayAqdHBfbGluaztcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZWNsb25lX2Nvd19kb25lID0gZmFsc2U7XG4rXHR0cF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaChza2VsLVx1MDAzZXByb2dzLnRwX2tmcmVlX3NrYl9jb3dfY2hlY2spO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHRwX2xpbmssIFwiYXR0YWNoX3RwXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHR0ZXN0X21pcnJlZF9jbG9uZV9leHQoc2tlbCwgc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X2Nsb25lX3JlZGlyX2Nvdyk7XG4rXHRicGZfbGlua19fZGVzdHJveSh0cF9saW5rKTtcbit9XG4rXG4rLypcbisgKiBXcml0ZXIgY2xvbmVzIHZpYSBicGZfY2xvbmVfcmVkaXJlY3QoKSBmcm9tIHRoZSBwcm9nIGl0c2VsZiB0byBsb29wYmFja1xuKyAqIHdob3NlIG5ldGVtIHFkaXNjIGRlbGF5cyB0aGUgY2xvbmUsIHNvIGl0IHN0YXlzIHF1ZXVlZCBhbmQga2VlcHMgc2hhcmluZ1xuKyAqIHRoZSBleHQgYmxvY2sgd2hpbGUgdGhlIHByb2cgd3JpdGVzIGFnYWluLiBXaGVuIHRoZSBxZGlzYyBmaW5hbGx5IGxlYWtzXG4rICogdGhlIGNsb25lIGJhY2sgdG8gbG8gaW5ncmVzcywgdGhlIHJlYWRlciB0aGVyZSBtdXN0IHN0aWxsIHNlZSB0aGVcbisgKiBjbG9uZS10aW1lIHNuYXBzaG90LlxuKyAqL1xuK3N0YXRpYyB2b2lkIHRlc3RfY2xvbmVfcmVkaXJfZXh0X3dyaXRlX2FmdGVyKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLFxuK1x0XHRcdFx0XHQgICAgIHN0cnVjdCBicGZfcHJvZ3JhbSAqd3JpdGVyKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbitcdGludCB0YXBfaWZpbmRleDtcbitcdGludCB0YXBfZmQgPSAtMTtcbitcdGludCByZXQsIGk7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXdyaXRlX2Jsb2NrZWQgPSBmYWxzZTtcbitcbitcdG5zID0gbmV0bnNfbmV3KFwiY2xvbmVfcmVkaXJfZXh0XCIsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcIm5ldG5zX25ld1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0LyogUmVkaXJlY3QgdGFyZ2V0OiBsbyBoZWxkIGJhY2sgYnkgbmV0ZW0gZGVsYXkgKi9cbitcdFNZUyhjbG9zZSwgXCJpcCBsaW5rIHNldCBkZXYgbG8gdXBcIik7XG4rXHRTWVMoY2xvc2UsIFwidGMgcWRpc2MgYWRkIGRldiBsbyByb290IG5ldGVtIGRlbGF5IDUwbXNcIik7XG4rXG4rXHQvKiBSZWFkZXIgb24gdGhlIGNsb25lOiBsbyBpbmdyZXNzICovXG4rXHR0Y19ob29rLmlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChcImxvXCIpO1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImxvX2hvb2tfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dGNfaG9vaywgXHUwMDI2dGNfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwibG9fYXR0YWNoXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0LyogVEFQIGRldjogYXR0YWNoIHdyaXRlciB3aGljaCBjbG9uZV9yZWRpcmVjdHMgdG8gbG8gKi9cbitcdHRhcF9mZCA9IG9wZW5fdHVudGFwKFRBUF9OQU1FLCB0cnVlKTtcbitcdGlmICghQVNTRVJUX0dFKHRhcF9mZCwgMCwgXCJvcGVuX3R1bnRhcFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdFNZUyhjbG9zZSwgXCJpcCBsaW5rIHNldCBkZXYgXCIgVEFQX05BTUUgXCIgdXBcIik7XG4rXG4rXHR0YXBfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFRBUF9OQU1FKTtcbitcdGlmICghQVNTRVJUX0dFKHRhcF9pZmluZGV4LCAwLCBcInRhcF9pZmluZGV4XCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNlY2xvbmVfcmVkaXJfaWZpbmRleCA9IHRjX2hvb2suaWZpbmRleDtcbitcbitcdHRjX2hvb2suaWZpbmRleCA9IHRhcF9pZmluZGV4O1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInRhcF9ob29rX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHRjX29wdHMucHJvZ19pZCA9IDA7XG4rXHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQod3JpdGVyKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dGNfaG9vaywgXHUwMDI2dGNfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwidGFwX2F0dGFjaFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHJldCA9IHdyaXRlX3Rlc3RfcGFja2V0KHRhcF9mZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfdGVzdF9wYWNrZXRcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V3cml0ZV9ibG9ja2VkLCBcIndyaXRlX2Jsb2NrZWRcIik7XG4rXG4rXHQvKiBDbG9uZSBhcnJpdmVzIGFmdGVyIHRoZSBuZXRlbSBkZWxheTsgcG9sbCBldmVyeSAxMCBtc2VjIHVwIHRvIDEgc2VjICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyAxMDAgXHUwMDI2XHUwMDI2ICFza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3M7IGkrKylcbitcdFx0dXNsZWVwKDEwMDAwKTtcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCJ0ZXN0X3Bhc3NcIik7XG4rXG4rY2xvc2U6XG4rXHRpZiAodGFwX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UodGFwX2ZkKTtcbitcdG5ldG5zX2ZyZWUobnMpO1xuK31cbitcbisvKiBUZXN0IGlmIHNrYl9leHQgc3Vydml2ZXMgdmV0aCBjcm9zcy1uZXRucyBmb3J3YXJkICovXG4rc3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHR4X2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfRUdSRVNTKTtcbitcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0eF9vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgcnhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcbitcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCByeF9vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XG4rXHRzdHJ1Y3QgbmV0bnNfb2JqICpyeF9ucyA9IE5VTEwsICp0eF9ucyA9IE5VTEw7XG4rXHRzdHJ1Y3QgbnN0b2tlbiAqbnN0b2tlbiA9IE5VTEw7XG4rXHRpbnQgcnhfaWZpbmRleCwgdHhfaWZpbmRleDtcbitcdGludCByZXQ7XG4rXHRpbnQgaTtcbitcbitcdHR4X25zID0gbmV0bnNfbmV3KFRYX05FVE5TLCBmYWxzZSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIodHhfbnMsIFwiY3JlYXRlIHR4X25zXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRyeF9ucyA9IG5ldG5zX25ldyhSWF9ORVROUywgZmFsc2UpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHJ4X25zLCBcImNyZWF0ZSByeF9uc1wiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdFNZUyhjbG9zZSwgXCJpcCBsaW5rIGFkZCBcIiBSWF9OQU1FIFwiIG5ldG5zIFwiIFJYX05FVE5TXG4rXHQgICAgXCIgdHlwZSB2ZXRoIHBlZXIgbmFtZSBcIiBUWF9OQU1FIFwiIG5ldG5zIFwiIFRYX05FVE5TKTtcbitcbitcdC8qIFNldHVwIFJYIHNpZGU6IFRDIGluZ3Jlc3MgcmVhZGVyICovXG4rXHRuc3Rva2VuID0gb3Blbl9uZXRucyhSWF9ORVROUyk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnN0b2tlbiwgXCJzZXRucyByeF9uc1wiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdFNZUyhjbG9zZSwgXCJpcCBsaW5rIHNldCBkZXYgXCIgUlhfTkFNRSBcIiB1cFwiKTtcbitcbitcdHJ4X2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChSWF9OQU1FKTtcbitcdGlmICghQVNTRVJUX0dUKHJ4X2lmaW5kZXgsIDAsIFwiaWZfbmFtZXRvaW5kZXggcnhcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHRyeF9ob29rLmlmaW5kZXggPSByeF9pZmluZGV4O1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnJ4X2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19ob29rX2NyZWF0ZSByeFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHJ4X29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZCk7XG4rXHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnJ4X2hvb2ssIFx1MDAyNnJ4X29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19hdHRhY2ggcnhcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHRjbG9zZV9uZXRucyhuc3Rva2VuKTtcbitcbitcdC8qIFNldHVwIFRYIHNpZGU6IFRDIGVncmVzcyB3cml0ZXIgKi9cbitcdG5zdG9rZW4gPSBvcGVuX25ldG5zKFRYX05FVE5TKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcInNldG5zIHR4X25zXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgc2V0IGRldiBcIiBUWF9OQU1FIFwiIHVwXCIpO1xuK1xuK1x0dHhfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFRYX05BTUUpO1xuK1x0aWYgKCFBU1NFUlRfR1QodHhfaWZpbmRleCwgMCwgXCJpZl9uYW1ldG9pbmRleCB0eFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHR4X2hvb2suaWZpbmRleCA9IHR4X2lmaW5kZXg7XG4rXHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dHhfaG9vayk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiYnBmX3RjX2hvb2tfY3JlYXRlIHR4XCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0dHhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XG4rXHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnR4X2hvb2ssIFx1MDAyNnR4X29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19hdHRhY2ggdHhcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdHJldCA9IHNlbmRfdGVzdF9wYWNrZXQodHhfaWZpbmRleCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwic2VuZF90ZXN0X3BhY2tldFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdC8qIFBvbGwgZXZlcnkgMTAgbXNlYyB1cCB0byAxIHNlYyAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgMTAwIFx1MDAyNlx1MDAyNiAhc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzOyBpKyspXG4rXHRcdHVzbGVlcCgxMDAwMCk7XG4rXHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwidGVzdF9wYXNzXCIpO1xuK1xuK2Nsb3NlOlxuK1x0Y2xvc2VfbmV0bnMobnN0b2tlbik7XG4rXHRuZXRuc19mcmVlKHJ4X25zKTtcbitcdG5ldG5zX2ZyZWUodHhfbnMpO1xuK31cbitcbisvKiBUZXN0IGlmIHNrYl9leHQgc3Vydml2ZXMgR1JFIHR1bm5lbCBlbmNhcCtkZWNhcCAqL1xuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF9zY3J1Yl9ncmUoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHR4X2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfRUdSRVNTKTtcbitcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0eF9vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgcnhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcbitcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCByeF9vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XG4rXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XG4rXHRpbnQgdHhfaWZpbmRleDtcbitcdGludCByeF9pZmluZGV4O1xuK1x0aW50IHJldDtcbitcdGludCBpO1xuK1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzID0gZmFsc2U7XG4rXG4rXHRucyA9IG5ldG5zX25ldyhcImdyZV90ZXN0XCIsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcIm5ldG5zX25ld1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0LyogU2V0dXA6IGdyZV90eCAtXHUwMDNlIGxvIC1cdTAwM2UgZ3JlX3J4ICovXG4rXHRTWVMoY2xvc2UsIFwiaXAgbGluayBzZXQgbG8gdXBcIik7XG4rXHRTWVMoY2xvc2UsIFwiaXAgbGluayBhZGQgZ3JlX3R4IHR5cGUgZ3JldGFwXCJcbitcdCAgICBcIiBsb2NhbCAxMjcuMC4wLjEgcmVtb3RlIDEyNy4wLjAuMlwiKTtcbitcdFNZUyhjbG9zZSwgXCJpcCBsaW5rIHNldCBncmVfdHggdXBcIik7XG4rXHRTWVMoY2xvc2UsIFwiaXAgYWRkciBhZGQgMTI3LjAuMC4yLzggZGV2IGxvXCIpO1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgYWRkIGdyZV9yeCB0eXBlIGdyZXRhcFwiXG4rXHQgICAgXCIgbG9jYWwgMTI3LjAuMC4yIHJlbW90ZSAxMjcuMC4wLjFcIik7XG4rXHRTWVMoY2xvc2UsIFwiaXAgbGluayBzZXQgZ3JlX3J4IHVwXCIpO1xuK1xuK1x0LyogV3JpdGUgc2tiX2V4dCBvbiBUQyBlZ3Jlc3Mgb24gR1JFIHR4ICovXG4rXHR0eF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoXCJncmVfdHhcIik7XG4rXHRpZiAoIUFTU0VSVF9HVCh0eF9pZmluZGV4LCAwLCBcInR4X2lmaW5kZXhcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHR0eF9ob29rLmlmaW5kZXggPSB0eF9pZmluZGV4O1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnR4X2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInR4X2hvb2tfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0dHhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XG4rXHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnR4X2hvb2ssIFx1MDAyNnR4X29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInR4X2F0dGFjaFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdC8qIFJlYWQgc2tiX2V4dCBvbiBUQyBpbmdyZXNzIG9uIEdSRSByeCAqL1xuK1x0cnhfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFwiZ3JlX3J4XCIpO1xuK1x0aWYgKCFBU1NFUlRfR1QocnhfaWZpbmRleCwgMCwgXCJyeF9pZmluZGV4XCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0cnhfaG9vay5pZmluZGV4ID0gcnhfaWZpbmRleDtcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZyeF9ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJyeF9ob29rX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHJ4X29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZCk7XG4rXHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnJ4X2hvb2ssIFx1MDAyNnJ4X29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInJ4X2F0dGFjaFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdC8qIFRoZW4gdXNlIHNlbmRfdGVzdF9wYWNrZXQgb24gR1JFIHR4ICovXG4rXHRyZXQgPSBzZW5kX3Rlc3RfcGFja2V0KHR4X2lmaW5kZXgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNlbmRfdGVzdF9wYWNrZXRcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHQvKiBQb2xsIGV2ZXJ5IDEwIG1zZWMgdXAgdG8gMSBzZWMgKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDEwMCBcdTAwMjZcdTAwMjYgIXNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzczsgaSsrKVxuK1x0XHR1c2xlZXAoMTAwMDApO1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcInRlc3RfcGFzc1wiKTtcbitcbitjbG9zZTpcbitcdG5ldG5zX2ZyZWUobnMpO1xuK31cbitcbit2b2lkIHRlc3Rfc2tiX2V4dF9iYXNpYyh2b2lkKVxuK3tcbitcdHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsID0gTlVMTDtcbitcbitcdHNrZWwgPSB0ZXN0X3hkcF9tZXRhX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJvcGVuIGFuZCBsb2FkIHNrZWxldG9uXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3dyaXRlX3JlYWRcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlLFxuK1x0XHRcdFx0ICAgIHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkLFxuK1x0XHRcdFx0ICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3dyaXRlX2Nsb25lX3JlYWRcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlLFxuK1x0XHRcdFx0ICAgIHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9jbG9uZV9yZWFkLFxuK1x0XHRcdFx0ICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3dyaXRlX3NsaWNlX3JlYWRcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlLFxuK1x0XHRcdFx0ICAgIHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9zbGljZV9yZWFkLFxuK1x0XHRcdFx0ICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3NsaWNlX3dyaXRlX3JlYWRcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3NsaWNlX3dyaXRlLFxuK1x0XHRcdFx0ICAgIHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkLFxuK1x0XHRcdFx0ICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX25vX2FsbG9jXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9ub19hbGxvYyxcbitcdFx0XHRcdCAgICBOVUxMLCAvKiB0YyBwcmlvIDIgKi9cbitcdFx0XHRcdCAgICBcdTAwMjZza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0Y19pbnZhbGlkX2ZsYWdzXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9pbnZhbGlkX2ZsYWdzLFxuK1x0XHRcdFx0ICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqL1xuK1x0XHRcdFx0ICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3Jkb25seVwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmRvbmx5LFxuK1x0XHRcdFx0ICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqL1xuK1x0XHRcdFx0ICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX2RvdWJsZV9hbGxvY1wiKSlcbitcdFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfZG91YmxlX2FsbG9jLFxuK1x0XHRcdFx0ICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqL1xuK1x0XHRcdFx0ICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNsb25lX2V4dF9yZWFkXCIpKVxuK1x0XHR0ZXN0X21pcnJlZF9jbG9uZV9leHQoc2tlbCwgc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3JlYWQpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjbG9uZV9leHRfY293XCIpKVxuK1x0XHR0ZXN0X21pcnJlZF9jbG9uZV9leHRfY293KHNrZWwpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXJcIikpXG4rXHRcdHRlc3RfY2xvbmVfcmVkaXJfZXh0X3dyaXRlX2FmdGVyKHNrZWwsXG4rXHRcdFx0XHRcdFx0IHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZV9hZnRlcl9jbG9uZV9yZWRpcik7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNsb25lX3JlZGlyX2V4dF9zbGljZV93cml0ZV9hZnRlclwiKSlcbitcdFx0dGVzdF9jbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXIoc2tlbCxcbitcdFx0XHRcdFx0XHQgc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3NsaWNlX3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic3Vydml2ZXNfdmV0aFwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3NjcnViX3ZldGgoc2tlbCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInN1cnZpdmVzX2dyZVwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3NjcnViX2dyZShza2VsKTtcbitcbitcdHRlc3RfeGRwX21ldGFfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuK1xuKy8qIFNlbmQgdGVzdF9wYXlsb2FkIG92ZXIgbG9vcGJhY2sgVURQIHRvIHJlY3ZfZmQgKi9cbitzdGF0aWMgaW50IHNlbmRfbG9vcGJhY2tfdWRwKGludCByZWN2X2ZkKVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyID0ge1xuK1x0XHQuc2luX2ZhbWlseSA9IEFGX0lORVQsXG4rXHRcdC5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spLFxuK1x0fTtcbitcdGNoYXIgYnVmW1RFU1RfUEFZTE9BRF9MRU5dO1xuK1x0aW50IHJldCA9IC0xO1xuK1x0aW50IGZkID0gLTE7XG4rXHRpbnQgcG9ydDtcbitcbitcdHBvcnQgPSBnZXRfc29ja2V0X2xvY2FsX3BvcnQocmVjdl9mZCk7XG4rXHRpZiAoIUFTU0VSVF9HRShwb3J0LCAwLCBcImdldF9wb3J0XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwic29ja2V0XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGFkZHIuc2luX3BvcnQgPSBwb3J0O1xuK1x0c2VuZHRvKGZkLCB0ZXN0X3BheWxvYWQsIFRFU1RfUEFZTE9BRF9MRU4sIDAsXG4rXHQgICAgICAgKHZvaWQgKilcdTAwMjZhZGRyLCBzaXplb2YoYWRkcikpO1xuK1x0cmVjdmZyb20ocmVjdl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7XG4rXHRyZXQgPSAwO1xuK291dDpcbitcdGlmIChmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK2VudW0gdWRwX3JlYWRlcl90eXBlIHtcbitcdFJFQURFUl9DR1JQX1NLQixcbitcdFJFQURFUl9TS19GSUxURVIsXG4rfTtcbitcbisvKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgYWNyb3NzIFRDIGluZ3Jlc3MgLVx1MDAzZSBVRFAgcmVhZGVyIGhvb2sgKi9cbitzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfdWRwKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lLFxuK1x0XHRcdCAgICAgZW51bSB1ZHBfcmVhZGVyX3R5cGUgcmVhZGVyKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLFxuK1x0XHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXG4rXHRcdCAgICAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdHN0cnVjdCBicGZfbGluayAqcmVhZGVyX2xpbmsgPSBOVUxMO1xuK1x0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xuK1x0aW50IHNlcnZlcl9mZCA9IC0xO1xuK1x0aW50IGNncm91cF9mZCA9IC0xO1xuK1x0aW50IGZpbHRlcl9mZDtcbitcdGludCByZXQ7XG4rXG4rXHRucyA9IG5ldG5zX25ldyhuYW1lLCB0cnVlKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihucywgXCJuZXRuc19uZXdcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGNncm91cF9mZCA9IHRlc3RfX2pvaW5fY2dyb3VwKFwiL3NrYl9leHRfdWRwXCIpO1xuK1x0aWYgKCFBU1NFUlRfR0UoY2dyb3VwX2ZkLCAwLCBcImpvaW5fY2dyb3VwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzZXJ2ZXJfZmQgPSBzdGFydF9zZXJ2ZXIoQUZfSU5FVCwgU09DS19ER1JBTSwgXCIxMjcuMC4wLjFcIiwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFwic3RhcnRfc2VydmVyXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfaG9va19jcmVhdGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGUpO1xuK1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfYXR0YWNoXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzd2l0Y2ggKHJlYWRlcikge1xuK1x0Y2FzZSBSRUFERVJfQ0dSUF9TS0I6XG4rXHRcdHJlYWRlcl9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9jZ3JvdXAoc2tlbC1cdTAwM2Vwcm9ncy5jZ3JwX3NrYl9leHRfcmVhZCxcbitcdFx0XHRcdFx0XHRcdCBjZ3JvdXBfZmQpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssIFwiYXR0YWNoX2Nncm91cFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBSRUFERVJfU0tfRklMVEVSOlxuK1x0XHRmaWx0ZXJfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5za19maWx0ZXJfc2tiX2V4dF9yZWFkKTtcbitcdFx0cmV0ID0gc2V0c29ja29wdChzZXJ2ZXJfZmQsIFNPTF9TT0NLRVQsIFNPX0FUVEFDSF9CUEYsXG4rXHRcdFx0XHQgXHUwMDI2ZmlsdGVyX2ZkLCBzaXplb2YoZmlsdGVyX2ZkKSk7XG4rXHRcdGlmICghQVNTRVJUX09LKHJldCwgXCJhdHRhY2hfc29ja2V0X2ZpbHRlclwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK1xuK1x0aWYgKHNlbmRfbG9vcGJhY2tfdWRwKHNlcnZlcl9mZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCJ0ZXN0X3Bhc3NcIik7XG4rXG4rY2xlYW51cDpcbitcdGJwZl9saW5rX19kZXN0cm95KHJlYWRlcl9saW5rKTtcbitcdGJwZl90Y19ob29rX2Rlc3Ryb3koXHUwMDI2dGNfaG9vayk7XG4rXHRpZiAoc2VydmVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2Uoc2VydmVyX2ZkKTtcbitcdGlmIChjZ3JvdXBfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShjZ3JvdXBfZmQpO1xuK1x0bmV0bnNfZnJlZShucyk7XG4rfVxuK1xuK2VudW0gdGNwX3JlYWRlcl90eXBlIHtcbitcdFJFQURFUl9TS09QUyxcbitcdFJFQURFUl9MU00sXG4rfTtcbitcbisvKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgYWNyb3NzIFRDIGluZ3Jlc3MgLVx1MDAzZSBUQ1AgcmVhZGVyIGhvb2sgKi9cbitzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfdGNwKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lLFxuK1x0XHRcdCAgICAgZW51bSB0Y3BfcmVhZGVyX3R5cGUgcmVhZGVyKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLFxuK1x0XHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXG4rXHRcdCAgICAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdHN0cnVjdCBicGZfbGluayAqcmVhZGVyX2xpbmsgPSBOVUxMO1xuK1x0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xuK1x0aW50IHNlcnZlcl9mZCA9IC0xO1xuK1x0aW50IGNncm91cF9mZCA9IC0xO1xuK1x0aW50IGNsaWVudF9mZCA9IC0xO1xuK1x0aW50IGNvbm5fZmQgPSAtMTtcbitcdGludCBwb3J0O1xuK1x0aW50IHJldDtcbitcbitcdG5zID0gbmV0bnNfbmV3KG5hbWUsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcIm5ldG5zX25ld1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0Y2dyb3VwX2ZkID0gdGVzdF9fam9pbl9jZ3JvdXAoXCIvc2tiX2V4dF90Y3BcIik7XG4rXHRpZiAoIUFTU0VSVF9HRShjZ3JvdXBfZmQsIDAsIFwiam9pbl9jZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVULCBTT0NLX1NUUkVBTSwgXCIxMjcuMC4wLjFcIiwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFwic3RhcnRfc2VydmVyXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRwb3J0ID0gZ2V0X3NvY2tldF9sb2NhbF9wb3J0KHNlcnZlcl9mZCk7XG4rXHRpZiAoIUFTU0VSVF9HRShwb3J0LCAwLCBcImdldF9wb3J0XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0YXJnZXRfcG9ydCA9IHBvcnQ7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfaG9va19jcmVhdGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGVfcG9ydCk7XG4rXHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19hdHRhY2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHN3aXRjaCAocmVhZGVyKSB7XG4rXHRjYXNlIFJFQURFUl9TS09QUzpcbitcdFx0cmVhZGVyX2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2Nncm91cChza2VsLVx1MDAzZXByb2dzLnNrb3BzX3NrYl9leHRfcmVhZCxcbitcdFx0XHRcdFx0XHRcdCBjZ3JvdXBfZmQpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssIFwiYXR0YWNoX3Nrb3BzXCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQURFUl9MU006XG4rXHRcdHJlYWRlcl9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9sc20oc2tlbC1cdTAwM2Vwcm9ncy5sc21fc2tiX2V4dF9yZWFkKTtcbitcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKHJlYWRlcl9saW5rLCBcImF0dGFjaF9sc21cIikpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0XHRicmVhaztcbitcdH1cbitcbitcdGNsaWVudF9mZCA9IGNvbm5lY3RfdG9fZmQoc2VydmVyX2ZkLCAwKTtcbitcdGlmICghQVNTRVJUX0dFKGNsaWVudF9mZCwgMCwgXCJjb25uZWN0XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRjb25uX2ZkID0gYWNjZXB0KHNlcnZlcl9mZCwgTlVMTCwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9HRShjb25uX2ZkLCAwLCBcImFjY2VwdFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcInRlc3RfcGFzc1wiKTtcbitcbitjbGVhbnVwOlxuK1x0aWYgKGNvbm5fZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShjb25uX2ZkKTtcbitcdGlmIChjbGllbnRfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShjbGllbnRfZmQpO1xuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kocmVhZGVyX2xpbmspO1xuK1x0YnBmX3RjX2hvb2tfZGVzdHJveShcdTAwMjZ0Y19ob29rKTtcbitcdGlmIChzZXJ2ZXJfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShzZXJ2ZXJfZmQpO1xuK1x0aWYgKGNncm91cF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGNncm91cF9mZCk7XG4rXHRuZXRuc19mcmVlKG5zKTtcbit9XG4rXG4rLypcbisgKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgdW50aWwgc2tiIGZyZWU6IGNncm91cC9za2IgZWdyZXNzIC1cdTAwM2Uga2ZyZWVfc2tiLlxuKyAqIFNlbmQgVURQIHRvIGEgY2xvc2VkIHBvcnQuIFRoZSBwYWNrZXQgaXMgZHJvcHBlZCwgdHJpZ2dlcmluZyBrZnJlZV9za2IuXG4rICovXG4rc3RhdGljIHZvaWQgdGVzdF9jZ3JwX2VncmVzc190b19rZnJlZV9za2Ioc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX2luIGFkZHIgPSB7XG4rXHRcdC5zaW5fZmFtaWx5ID0gQUZfSU5FVCxcbitcdFx0LnNpbl9wb3J0ID0gaHRvbnMoNDMyMSksXG4rXHRcdC5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spLFxuK1x0fTtcbitcdHN0cnVjdCBicGZfbGluayAqY2dfbGluayA9IE5VTEw7XG4rXHRzdHJ1Y3QgYnBmX2xpbmsgKnRwX2xpbmsgPSBOVUxMO1xuK1x0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xuK1x0aW50IGNncm91cF9mZCA9IC0xO1xuK1x0Y2hhciBidWZbMV07XG4rXHRpbnQgZmQgPSAtMTtcbitcdGludCByZXQ7XG4rXG4rXHRjZ3JvdXBfZmQgPSB0ZXN0X19qb2luX2Nncm91cChcIi9jZ3JwX3RvX2tmcmVlXCIpO1xuK1x0aWYgKCFBU1NFUlRfR0UoY2dyb3VwX2ZkLCAwLCBcImpvaW5fY2dyb3VwXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRucyA9IG5ldG5zX25ldyhcImNncnBfdG9fa2ZyZWVcIiwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwibmV0bnNfbmV3XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdGNnX2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2Nncm91cChza2VsLVx1MDAzZXByb2dzLmNncnBfc2tiX2V4dF93cml0ZSxcbitcdFx0XHRcdFx0ICAgICBjZ3JvdXBfZmQpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGNnX2xpbmssIFwiYXR0YWNoX2Nncm91cFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0dHBfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfdHJhY2Uoc2tlbC1cdTAwM2Vwcm9ncy50cF9rZnJlZV9za2JfZXh0X3JlYWQpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHRwX2xpbmssIFwiYXR0YWNoX3RwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcInNvY2tldFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY29ubmVjdChmZCwgKHZvaWQgKilcdTAwMjZhZGRyLCBzaXplb2YoYWRkcikpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImNvbm5lY3RcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IHNlbmQoZmQsIHRlc3RfcGF5bG9hZCwgVEVTVF9QQVlMT0FEX0xFTiwgMCk7XG4rXHRpZiAoIUFTU0VSVF9FUShyZXQsIFRFU1RfUEFZTE9BRF9MRU4sIFwic2VuZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LyogV2FpdCBmb3IgSUNNUCBlcnJvciAtLSBjb25maXJtcyB0aGUgcGFja2V0IHdhcyBmcmVlZCAqL1xuK1x0cmV0ID0gcmVjdihmZCwgYnVmLCBzaXplb2YoYnVmKSwgMCk7XG4rXHRpZiAoIUFTU0VSVF9FUShyZXQsIC0xLCBcInJlY3ZcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdEFTU0VSVF9FUShlcnJubywgRUNPTk5SRUZVU0VELCBcInJlY3ZfZWNvbm5yZWZ1c2VkXCIpO1xuK1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcInRlc3RfcGFzc1wiKTtcbitcbitjbGVhbnVwOlxuK1x0aWYgKGZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoZmQpO1xuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kodHBfbGluayk7XG4rXHRicGZfbGlua19fZGVzdHJveShjZ19saW5rKTtcbitcdG5ldG5zX2ZyZWUobnMpO1xuK1x0aWYgKGNncm91cF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGNncm91cF9mZCk7XG4rfVxuK1xuKy8qIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgaW5ncmVzcyAtXHUwMDNlIG5ldGZpbHRlciBob29rICovXG4rc3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X25mKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsLCBjb25zdCBjaGFyICpuYW1lKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLFxuK1x0XHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXG4rXHRcdCAgICAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdExJQkJQRl9PUFRTKGJwZl9uZXRmaWx0ZXJfb3B0cywgbmZfb3B0cyxcbitcdFx0ICAgIC5wZiA9IE5GUFJPVE9fSVBWNCxcbitcdFx0ICAgIC5ob29rbnVtID0gTkZfSU5FVF9MT0NBTF9JTixcbitcdFx0ICAgIC5wcmlvcml0eSA9IDEpO1xuK1x0c3RydWN0IGJwZl9saW5rICpyZWFkZXJfbGluayA9IE5VTEw7XG4rXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XG4rXHRpbnQgc2VydmVyX2ZkID0gLTE7XG4rXHRpbnQgcmV0O1xuK1xuK1x0bnMgPSBuZXRuc19uZXcobmFtZSwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwibmV0bnNfbmV3XCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzZXJ2ZXJfZmQgPSBzdGFydF9zZXJ2ZXIoQUZfSU5FVCwgU09DS19ER1JBTSwgXCIxMjcuMC4wLjFcIiwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFwic3RhcnRfc2VydmVyXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfaG9va19jcmVhdGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGUpO1xuK1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfYXR0YWNoXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfbmV0ZmlsdGVyKHNrZWwtXHUwMDNlcHJvZ3MubmZfc2tiX2V4dF9yZWFkLFxuK1x0XHRcdFx0XHRcdCAgICBcdTAwMjZuZl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihyZWFkZXJfbGluaywgXCJhdHRhY2hfbmZcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzZW5kX2xvb3BiYWNrX3VkcChzZXJ2ZXJfZmQpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwidGVzdF9wYXNzXCIpO1xuK1xuK2NsZWFudXA6XG4rXHRicGZfbGlua19fZGVzdHJveShyZWFkZXJfbGluayk7XG4rXHRicGZfdGNfaG9va19kZXN0cm95KFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKHNlcnZlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHNlcnZlcl9mZCk7XG4rXHRuZXRuc19mcmVlKG5zKTtcbit9XG4rXG4rI2RlZmluZSBMV1RfRVhUX1BJTl9QQVRIIFwiL3N5cy9mcy9icGYvc2tiX2V4dF9sd3RcIlxuK1xuKy8qXG4rICogVGVzdCBza2JfZXh0IGFjcm9zcyBMV1QgaG9va3Mgb24gbG9vcGJhY2suXG4rICpcbisgKiBAbHd0X3Byb2c6ICBCUEYgcHJvZ3JhbSB0byBwaW4gYW5kIGF0dGFjaCB2aWEgaXAgcm91dGUgZW5jYXBcbisgKiBAZW5jYXBfZGlyOiBcImluXCIsIFwib3V0XCIsIG9yIFwieG1pdFwiXG4rICogQHdyaXRlcjogICAgdHJ1ZSBpZiBsd3RfcHJvZyB3cml0ZXMgc2tiX2V4dCAocmVhZGVyIG9uIFRDIGluZ3Jlc3MpLFxuKyAqICAgICAgICAgICAgIGZhbHNlIGlmIGx3dF9wcm9nIHJlYWRzIHNrYl9leHQgKHdyaXRlciBvbiBUQyBpbmdyZXNzKVxuKyAqL1xuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF9sd3Qoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsIGNvbnN0IGNoYXIgKm5hbWUsXG4rXHRcdFx0ICAgICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmx3dF9wcm9nLFxuK1x0XHRcdCAgICAgY29uc3QgY2hhciAqZW5jYXBfZGlyLCBib29sIHdyaXRlcilcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vayxcbitcdFx0ICAgIC5pZmluZGV4ID0gMSAvKiBJRklOREVYX0xPICovLFxuK1x0XHQgICAgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcbitcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XG4rXHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHtcbitcdFx0LnNpbl9mYW1pbHkgPSBBRl9JTkVULFxuK1x0fTtcbitcdHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJvZztcbitcdGNoYXIgYnVmW1RFU1RfUEFZTE9BRF9MRU5dO1xuK1x0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xuK1x0Ym9vbCBwaW5uZWQgPSBmYWxzZTtcbitcdGludCBzZXJ2ZXJfZmQgPSAtMTtcbitcdGludCBmZCA9IC0xO1xuK1x0aW50IHBvcnQ7XG4rXHRpbnQgcmV0O1xuK1xuK1x0dW5saW5rKExXVF9FWFRfUElOX1BBVEgpO1xuK1x0cmV0ID0gYnBmX3Byb2dyYW1fX3Bpbihsd3RfcHJvZywgTFdUX0VYVF9QSU5fUEFUSCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwicGluIGx3dFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0cGlubmVkID0gdHJ1ZTtcbitcbitcdG5zID0gbmV0bnNfbmV3KG5hbWUsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcIm5ldG5zX25ld1wiKSlcbitcdFx0Z290byBjbGVhbnVwX3ByZWhvb2s7XG4rXG4rXHRTWVMoY2xlYW51cCwgXCJpcCBhZGRyIGFkZCAxMC4wLjAuMS8zMiBkZXYgbG9cIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCByb3V0ZSByZXBsYWNlIHRhYmxlIGxvY2FsIGxvY2FsIDEwLjAuMC4xIFwiXG4rXHRcdCAgICAgXCJlbmNhcCBicGYgJXMgcGlubmVkIFwiIExXVF9FWFRfUElOX1BBVEggXCIgZGV2IGxvXCIsXG4rXHRcdCAgICAgZW5jYXBfZGlyKTtcbitcbitcdHNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVULCBTT0NLX0RHUkFNLCBcIjEwLjAuMC4xXCIsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfR0Uoc2VydmVyX2ZkLCAwLCBcInN0YXJ0X3NlcnZlclwiKSlcbitcdFx0Z290byBjbGVhbnVwX3ByZWhvb2s7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfaG9va19jcmVhdGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cF9wcmVob29rO1xuK1xuK1x0LyogV2hlbiBMV1Qgd3JpdGVzLCBUQyBpbmdyZXNzIHJlYWRzOyB3aGVuIExXVCByZWFkcywgVEMgaW5ncmVzcyB3cml0ZXMgKi9cbitcdHRjX3Byb2cgPSB3cml0ZXIgPyBza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZFxuK1x0XHRcdCA6IHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZTtcbitcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZCh0Y19wcm9nKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dGNfaG9vaywgXHUwMDI2dGNfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiYnBmX3RjX2F0dGFjaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cG9ydCA9IGdldF9zb2NrZXRfbG9jYWxfcG9ydChzZXJ2ZXJfZmQpO1xuK1x0aWYgKCFBU1NFUlRfR0UocG9ydCwgMCwgXCJnZXRfcG9ydFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJzb2NrZXRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGluZXRfcHRvbihBRl9JTkVULCBcIjEwLjAuMC4xXCIsIFx1MDAyNmFkZHIuc2luX2FkZHIpO1xuK1x0YWRkci5zaW5fcG9ydCA9IHBvcnQ7XG4rXHRyZXQgPSBzZW5kdG8oZmQsIHRlc3RfcGF5bG9hZCwgVEVTVF9QQVlMT0FEX0xFTiwgMCxcbitcdFx0ICAgICAodm9pZCAqKVx1MDAyNmFkZHIsIHNpemVvZihhZGRyKSk7XG4rXHRpZiAoIUFTU0VSVF9FUShyZXQsIFRFU1RfUEFZTE9BRF9MRU4sIFwic2VuZHRvXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRyZXQgPSByZWN2ZnJvbShzZXJ2ZXJfZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIDAsIE5VTEwsIE5VTEwpO1xuK1x0QVNTRVJUX0VRKHJldCwgVEVTVF9QQVlMT0FEX0xFTiwgXCJyZWN2ZnJvbVwiKTtcbitcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCJ0ZXN0X3Bhc3NcIik7XG4rXG4rY2xlYW51cDpcbitcdGlmIChmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkKTtcbitcdGJwZl90Y19ob29rX2Rlc3Ryb3koXHUwMDI2dGNfaG9vayk7XG4rY2xlYW51cF9wcmVob29rOlxuK1x0aWYgKHNlcnZlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHNlcnZlcl9mZCk7XG4rXHRuZXRuc19mcmVlKG5zKTtcbitcdGlmIChwaW5uZWQpXG4rXHRcdHVubGluayhMV1RfRVhUX1BJTl9QQVRIKTtcbit9XG4rXG4rI2RlZmluZSBTRUc2X1BJTl9QQVRIIFwiL3N5cy9mcy9icGYvc2tiX2V4dF9zZWc2bG9jYWxcIlxuK1xuKy8qXG4rICogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBlZ3Jlc3MgLVx1MDAzZSBzZWc2bG9jYWwgRW5kLkJQRiBob29rLlxuKyAqXG4rICogVG9wb2xvZ3k6XG4rICpcbisgKiAgICAgTlMxICAgICAgICAgICBOUzIgICAgICAgICAgICBOUzNcbisgKiAgIGxvIHZldGgxIFx1MDAzYy1cdTAwM2UgdmV0aDIgdmV0aDMgXHUwMDNjLVx1MDAzZSB2ZXRoNCBsb1xuKyAqXG4rICogTlMxIGVuY2FwcyBmYjAxOjoyIHdpdGggU1JIIChzZWdtZW50cyBmZDAxOjoxLGZkMDE6OjIpIG9uIG91dHB1dCBhbmRcbisgKiB3cml0ZXMgc2tiX2V4dCBhdCBUQyBlZ3Jlc3Mgb24gdmV0aDEuIE5TMiBydW5zIEVuZC5CUEYgZm9yIGZkMDE6OjEsXG4rICogd2hpY2ggcmVhZHMgc2tiX2V4dCwgdGhlbiBmb3J3YXJkcyB0byBOUzMgKHNlZzZfbG9va3VwX25leHRob3BcbisgKiByZWplY3RzIGxvb3BiYWNrIHJvdXRlcyB3aXRoIGxvY2FsX2RlbGl2ZXJ5PWZhbHNlLCBzbyBFbmQuQlBGXG4rICogY2Fubm90IGRlbGl2ZXIgbG9jYWxseSkuIE5TMyBoYXMgZmQwMTo6MiBsb2NhbCwgZGVjYXBzdWxhdGVzLCBhbmRcbisgKiBkZWxpdmVycyB0aGUgaW5uZXIgVURQIChkc3Q9ZmIwMTo6MikgdG8gYSBsb2NhbCBzb2NrZXQgZm9yIHRlc3RcbisgKiBzeW5jaHJvbml6YXRpb24uXG4rICpcbisgKiBUaGUgVEMgcHJvZ3JhbSBkcm9wcyBub24tdGVzdCBwYWNrZXRzLCBzbyBORFAgaXMgYnlwYXNzZWQgd2l0aCBhXG4rICogc3RhdGljIG5laWdoYm9yIGVudHJ5IG9uIHRoZSBOUzEtXHUwMDNlTlMyIGhvcC5cbisgKi9cbitzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfc2VnNmxvY2FsKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0VHUkVTUyk7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuK1x0c3RydWN0IG5zdG9rZW4gKm5zdG9rZW4gPSBOVUxMO1xuK1x0c3RydWN0IHNvY2thZGRyX2luNiBkc3QgPSB7fTtcbitcdGNoYXIgYnVmW1RFU1RfUEFZTE9BRF9MRU5dO1xuK1x0Ym9vbCBwaW5uZWQgPSBmYWxzZTtcbitcdGludCBjbGllbnRfZmQgPSAtMTtcbitcdGludCBzZXJ2ZXJfZmQgPSAtMTtcbitcdHNzaXplX3QgYnl0ZXM7XG4rXHRpbnQgcmV0O1xuK1xuK1x0dW5saW5rKFNFRzZfUElOX1BBVEgpO1xuK1x0cmV0ID0gYnBmX3Byb2dyYW1fX3Bpbihza2VsLVx1MDAzZXByb2dzLnNlZzZsb2NhbF9za2JfZXh0X3JlYWQsXG4rXHRcdFx0ICAgICAgIFNFRzZfUElOX1BBVEgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInBpbiBzZWc2bG9jYWxcIikpXG4rXHRcdHJldHVybjtcbitcdHBpbm5lZCA9IHRydWU7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdFNZUyhjbGVhbnVwLCBcImlwIG5ldG5zIGFkZCBzZWc2XzFcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCBuZXRucyBhZGQgc2VnNl8yXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgbmV0bnMgYWRkIHNlZzZfM1wiKTtcbitcbitcdC8qIE5TMSBcdTAwM2MtXHUwMDNlIE5TMiB2ZXRoIHBhaXI7IHN0YXRpYyBORFAgc2luY2UgVEMgZHJvcHMgTlMvTkEgKi9cbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMSBsaW5rIGFkZCB2ZXRoMSB0eXBlIHZldGggcGVlciBuYW1lIHZldGgyIG5ldG5zIHNlZzZfMlwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMSBsaW5rIHNldCBkZXYgdmV0aDEgdXBcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzIgbGluayBzZXQgZGV2IHZldGgyIGFkZHJlc3MgMDI6MDA6MDA6MDA6MDA6MDJcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzIgbGluayBzZXQgZGV2IHZldGgyIHVwXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8xIC02IGFkZHIgYWRkIGZiMDA6OjEyLzE2IGRldiB2ZXRoMSBzY29wZSBsaW5rIG5vZGFkXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8yIC02IGFkZHIgYWRkIGZiMDA6OjIxLzE2IGRldiB2ZXRoMiBzY29wZSBsaW5rIG5vZGFkXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8xIC02IG5laWdoIGFkZCBmYjAwOjoyMSBsbGFkZHIgMDI6MDA6MDA6MDA6MDA6MDIgXCJcbitcdFx0ICAgICBcIm51ZCBwZXJtYW5lbnQgZGV2IHZldGgxXCIpO1xuK1xuK1x0LyogTlMyIFx1MDAzYy1cdTAwM2UgTlMzIHZldGggcGFpciAqL1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8yIGxpbmsgYWRkIHZldGgzIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDQgbmV0bnMgc2VnNl8zXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8yIGxpbmsgc2V0IGRldiB2ZXRoMyB1cFwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMyBsaW5rIHNldCBkZXYgdmV0aDQgdXBcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzIgLTYgYWRkciBhZGQgZmIwMDo6MzQvMTYgZGV2IHZldGgzIHNjb3BlIGxpbmsgbm9kYWRcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzMgLTYgYWRkciBhZGQgZmIwMDo6NDMvMTYgZGV2IHZldGg0IHNjb3BlIGxpbmsgbm9kYWRcIik7XG4rXG4rXHQvKiBOUzE6IHNvdXJjZSBhZGRyZXNzICsgU1JIIGVuY2FwIG9uIG91dHB1dCArIHJvdXRlIGZvciBmZDAxOjovMTYgKi9cbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMSBsaW5rIHNldCBkZXYgbG8gdXBcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzEgLTYgYWRkciBhZGQgZmIwMTo6MS8xMjggZGV2IGxvIG5vZGFkXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8xIC02IHJvdXRlIGFkZCBmYjAxOjoyIGVuY2FwIHNlZzYgbW9kZSBlbmNhcCBcIlxuK1x0XHQgICAgIFwic2VncyBmZDAxOjoxLGZkMDE6OjIgZGV2IHZldGgxIHZpYSBmYjAwOjoyMVwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMSAtNiByb3V0ZSBhZGQgZmQwMTo6LzE2IGRldiB2ZXRoMSB2aWEgZmIwMDo6MjFcIik7XG4rXG4rXHQvKiBOUzI6IHNlZzZsb2NhbCBFbmQuQlBGIGZvciBmZDAxOjoxLCB0aGVuIGZvcndhcmQgdG8gTlMzLlxuK1x0ICogVXNlIG9wZW5fbmV0bnMgc28gdGhlIHBpbm5lZCBwcm9nIG9uIGJwZmZzIGlzIGFjY2Vzc2libGUuXG4rXHQgKi9cbitcdG5zdG9rZW4gPSBvcGVuX25ldG5zKFwic2VnNl8yXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sIFwib3BlbiBzZWc2XzJcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdFNZUyhjbGVhbnVwLCBcImlwIGxpbmsgc2V0IGRldiBsbyB1cFwiKTtcbitcdFNZUyhjbGVhbnVwLCBcInN5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5hbGwuZm9yd2FyZGluZz0xXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLTYgcm91dGUgYWRkIGZkMDE6OjIvMTI4IGRldiB2ZXRoMyB2aWEgZmIwMDo6NDNcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtNiByb3V0ZSBhZGQgZmQwMTo6MSBlbmNhcCBzZWc2bG9jYWwgXCJcbitcdFx0ICAgICBcImFjdGlvbiBFbmQuQlBGIGVuZHBvaW50IHBpbm5lZCBcIiBTRUc2X1BJTl9QQVRIIFwiIGRldiB2ZXRoMlwiKTtcbitcbitcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xuK1x0bnN0b2tlbiA9IE5VTEw7XG4rXG4rXHQvKiBOUzM6IGRlY2FwIHBvaW50ICsgVURQIHNlcnZlci5cbitcdCAqIGZkMDE6OjIgbG9jYWwgdHJpZ2dlcnMgU1JIIGRlY2FwIChzZWdtZW50c19sZWZ0PTApLlxuK1x0ICogZmIwMTo6MiBsb2NhbCBkZWxpdmVycyB0aGUgaW5uZXIgVURQIHRvIHRoZSBzb2NrZXQuXG4rXHQgKi9cbitcdG5zdG9rZW4gPSBvcGVuX25ldG5zKFwic2VnNl8zXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sIFwib3BlbiBzZWc2XzNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdFNZUyhjbGVhbnVwLCBcImlwIGxpbmsgc2V0IGRldiBsbyB1cFwiKTtcbitcdFNZUyhjbGVhbnVwLCBcInN5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5hbGwuc2VnNl9lbmFibGVkPTFcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJzeXNjdGwgLXdxIG5ldC5pcHY2LmNvbmYubG8uc2VnNl9lbmFibGVkPTFcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJzeXNjdGwgLXdxIG5ldC5pcHY2LmNvbmYudmV0aDQuc2VnNl9lbmFibGVkPTFcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtNiBhZGRyIGFkZCBmZDAxOjoyLzEyOCBkZXYgbG8gbm9kYWRcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtNiBhZGRyIGFkZCBmYjAxOjoyLzEyOCBkZXYgbG8gbm9kYWRcIik7XG4rXG4rXHRzZXJ2ZXJfZmQgPSBzdGFydF9zZXJ2ZXIoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIFwiZmIwMTo6MlwiLCAxMjM0LCAwKTtcbitcdGlmICghQVNTRVJUX0dFKHNlcnZlcl9mZCwgMCwgXCJzdGFydF9zZXJ2ZXJcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xuK1x0bnN0b2tlbiA9IE5VTEw7XG4rXG4rXHQvKiBOUzE6IHdyaXRlIHNrYl9leHQgYXQgVEMgZWdyZXNzIG9uIHZldGgxLCB0aGVuIHNlbmQuXG4rXHQgKiBUQyBlZ3Jlc3MgZmlyZXMgYWZ0ZXIgc2VnNiBlbmNhcCwgb24gdGhlIGVuY2FwcGVkIHBhY2tldC5cbitcdCAqL1xuK1x0bnN0b2tlbiA9IG9wZW5fbmV0bnMoXCJzZWc2XzFcIik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnN0b2tlbiwgXCJvcGVuIHNlZzZfMVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0dGNfaG9vay5pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoXCJ2ZXRoMVwiKTtcbitcdGlmICghQVNTRVJUX0dUKHRjX2hvb2suaWZpbmRleCwgMCwgXCJpZmluZGV4IHZldGgxXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dGNfaG9vayk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiYnBmX3RjX2hvb2tfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dGNfaG9vaywgXHUwMDI2dGNfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiYnBmX3RjX2F0dGFjaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0Y2xpZW50X2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTtcbitcdGlmICghQVNTRVJUX0dFKGNsaWVudF9mZCwgMCwgXCJzb2NrZXRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGRzdC5zaW42X2ZhbWlseSA9IEFGX0lORVQ2O1xuK1x0ZHN0LnNpbjZfcG9ydCA9IGh0b25zKDEyMzQpO1xuK1x0aW5ldF9wdG9uKEFGX0lORVQ2LCBcImZiMDE6OjJcIiwgXHUwMDI2ZHN0LnNpbjZfYWRkcik7XG4rXG4rXHRieXRlcyA9IHNlbmR0byhjbGllbnRfZmQsIHRlc3RfcGF5bG9hZCwgVEVTVF9QQVlMT0FEX0xFTiwgMCxcbitcdFx0ICAgICAgICh2b2lkICopXHUwMDI2ZHN0LCBzaXplb2YoZHN0KSk7XG4rXG4rXHRjbG9zZV9uZXRucyhuc3Rva2VuKTtcbitcdG5zdG9rZW4gPSBOVUxMO1xuK1xuK1x0aWYgKCFBU1NFUlRfRVEoYnl0ZXMsIFRFU1RfUEFZTE9BRF9MRU4sIFwic2VuZHRvXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHQvKiBSZWNlaXZlIGRlY2Fwc3VsYXRlZCBwYWNrZXQgLS0gc3luY2hyb25pemVzIHdpdGggc2VnNmxvY2FsICovXG4rXHRuc3Rva2VuID0gb3Blbl9uZXRucyhcInNlZzZfM1wiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcIm9wZW4gc2VnNl8zXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRieXRlcyA9IHJlY3Zmcm9tKHNlcnZlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7XG4rXHRBU1NFUlRfRVEoYnl0ZXMsIFRFU1RfUEFZTE9BRF9MRU4sIFwicmVjdmZyb21cIik7XG4rXHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwidGVzdF9wYXNzXCIpO1xuK1xuK2NsZWFudXA6XG4rXHRjbG9zZV9uZXRucyhuc3Rva2VuKTtcbitcdGlmIChzZXJ2ZXJfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShzZXJ2ZXJfZmQpO1xuK1x0aWYgKGNsaWVudF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGNsaWVudF9mZCk7XG4rXHRTWVNfTk9GQUlMKFwiaXAgbmV0bnMgZGVsIHNlZzZfM1wiKTtcbitcdFNZU19OT0ZBSUwoXCJpcCBuZXRucyBkZWwgc2VnNl8yXCIpO1xuK1x0U1lTX05PRkFJTChcImlwIG5ldG5zIGRlbCBzZWc2XzFcIik7XG4rXHRpZiAocGlubmVkKVxuK1x0XHR1bmxpbmsoU0VHNl9QSU5fUEFUSCk7XG4rfVxuK1xuKy8qXG4rICogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBpbmdyZXNzIC1cdTAwM2Ugc2tfc2tiIHZlcmRpY3QgaG9vay4gIFRDIGluZ3Jlc3NcbisgKiB3cml0ZXMgc2tiX2V4dCBvbiBsb29wYmFjazsgdGhlIHZlcmRpY3QgcHJvZ3JhbSByZWFkcyBpdCBvbiBza2IgZGVsaXZlcnkgdG8gYVxuKyAqIHNvY2tldCBpbiB0aGUgc29ja21hcC5cbisgKi9cbitzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfc2tfc2tiKHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLFxuK1x0XHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXG4rXHRcdCAgICAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdHN0cnVjdCBicGZfbGluayAqdmVyZGljdF9saW5rID0gTlVMTDtcbitcdHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyO1xuK1x0c29ja2xlbl90IGFkZHJfbGVuID0gc2l6ZW9mKGFkZHIpO1xuK1x0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xuK1x0Y2hhciBidWZbVEVTVF9QQVlMT0FEX0xFTl07XG4rXHRpbnQgYzEgPSAtMSwgcDEgPSAtMTtcbitcdGludCBtYXAgPSAtMSwgemVybyA9IDA7XG4rXHRzc2l6ZV90IG47XG4rXHRpbnQgcmV0O1xuK1xuK1x0bnMgPSBuZXRuc19uZXcoXCJ0Y190b19za19za2JcIiwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwibmV0bnNfbmV3XCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfaG9va19jcmVhdGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGVfcG9ydCk7XG4rXHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19hdHRhY2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdG1hcCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9TT0NLTUFQLCBOVUxMLCBzaXplb2YoaW50KSxcbitcdFx0XHQgICAgIHNpemVvZihpbnQpLCAxLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX0dFKG1hcCwgMCwgXCJicGZfbWFwX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0dmVyZGljdF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9zb2NrbWFwKHNrZWwtXHUwMDNlcHJvZ3Muc2tfc2tiX3NrYl9leHRfcmVhZCxcbitcdFx0XHRcdFx0XHQgICBtYXApO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHZlcmRpY3RfbGluaywgXCJhdHRhY2hfc29ja21hcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0soY3JlYXRlX3BhaXIoQUZfSU5FVCwgU09DS19TVFJFQU0sIFx1MDAyNmMxLCBcdTAwMjZwMSksIFwiY3JlYXRlX3BhaXJcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwLCBcdTAwMjZ6ZXJvLCBcdTAwMjZjMSwgQlBGX05PRVhJU1QpLCBcIm1hcF91cGRhdGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmICghQVNTRVJUX09LKGdldHNvY2tuYW1lKGMxLCAoc3RydWN0IHNvY2thZGRyICopXHUwMDI2YWRkciwgXHUwMDI2YWRkcl9sZW4pLFxuK1x0XHQgICAgICAgXCJnZXRzb2NrbmFtZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNldGFyZ2V0X3BvcnQgPSBhZGRyLnNpbl9wb3J0O1xuK1xuK1x0biA9IHNlbmQocDEsIHRlc3RfcGF5bG9hZCwgVEVTVF9QQVlMT0FEX0xFTiwgMCk7XG4rXHRpZiAoIUFTU0VSVF9FUShuLCBURVNUX1BBWUxPQURfTEVOLCBcInNlbmRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdG4gPSByZWN2X3RpbWVvdXQoYzEsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE1TR19ET05UV0FJVCwgSU9fVElNRU9VVF9TRUMpO1xuK1x0QVNTRVJUX0VRKG4sIFRFU1RfUEFZTE9BRF9MRU4sIFwicmVjdlwiKTtcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCJ0ZXN0X3Bhc3NcIik7XG4rXG4rY2xlYW51cDpcbitcdGlmIChjMSBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGMxKTtcbitcdGlmIChwMSBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHAxKTtcbitcdGJwZl9saW5rX19kZXN0cm95KHZlcmRpY3RfbGluayk7XG4rXHRpZiAobWFwIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UobWFwKTtcbitcdGJwZl90Y19ob29rX2Rlc3Ryb3koXHUwMDI2dGNfaG9vayk7XG4rXHRuZXRuc19mcmVlKG5zKTtcbit9XG4rXG4rdm9pZCB0ZXN0X3NrYl9leHRfY3Jvc3NfaG9vayh2b2lkKVxuK3tcbitcdHN0cnVjdCB0ZXN0X3hkcF9tZXRhICpza2VsID0gTlVMTDtcbitcbitcdHNrZWwgPSB0ZXN0X3hkcF9tZXRhX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJvcGVuIGFuZCBsb2FkIHNrZWxldG9uXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3RvX2NncnBfaW5ncmVzc1wiKSlcbitcdFx0dGVzdF9za2JfZXh0X3VkcChza2VsLCBcInRjX3RvX2NncnBfaW5ncmVzc1wiLCBSRUFERVJfQ0dSUF9TS0IpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0Y190b19za19maWx0ZXJcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF91ZHAoc2tlbCwgXCJ0Y190b19za19maWx0ZXJcIiwgUkVBREVSX1NLX0ZJTFRFUik7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3RvX2xzbVwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3RjcChza2VsLCBcInRjX3RvX2xzbVwiLCBSRUFERVJfTFNNKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfdG9fc2tvcHNcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF90Y3Aoc2tlbCwgXCJ0Y190b19za29wc1wiLCBSRUFERVJfU0tPUFMpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJjZ3JwX2VncmVzc190b19rZnJlZV9za2JcIikpXG4rXHRcdHRlc3RfY2dycF9lZ3Jlc3NfdG9fa2ZyZWVfc2tiKHNrZWwpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0Y190b19uZlwiKSlcbitcdFx0dGVzdF9za2JfZXh0X25mKHNrZWwsIFwidGNfdG9fbmZcIik7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3RvX2x3dF9pblwiKSlcbitcdFx0dGVzdF9za2JfZXh0X2x3dChza2VsLCBcInRjX3RvX2x3dF9pblwiLFxuK1x0XHRcdFx0IHNrZWwtXHUwMDNlcHJvZ3MubHd0X2luX3NrYl9leHRfcmVhZCwgXCJpblwiLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImx3dF9vdXRfdG9fdGNcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF9sd3Qoc2tlbCwgXCJsd3Rfb3V0X3RvX3RjXCIsXG4rXHRcdFx0XHQgc2tlbC1cdTAwM2Vwcm9ncy5sd3Rfb3V0X3NrYl9leHRfd3JpdGUsIFwib3V0XCIsIHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJsd3RfeG1pdF90b190Y1wiKSlcbitcdFx0dGVzdF9za2JfZXh0X2x3dChza2VsLCBcImx3dF94bWl0X3RvX3RjXCIsXG4rXHRcdFx0XHQgc2tlbC1cdTAwM2Vwcm9ncy5sd3RfeG1pdF9za2JfZXh0X3dyaXRlLCBcInhtaXRcIiwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3RvX3NlZzZsb2NhbFwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3NlZzZsb2NhbChza2VsKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfdG9fc2tfc2tiXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfc2tfc2tiKHNrZWwpO1xuK1xuK1x0dGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmNcbmluZGV4IDA4YjAzYmUwYjg5MWMuLjgwY2RmZWU2MTVjY2IgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jXG5AQCAtMyw5ICszLDExIEBAXG4gXG4gI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9lbmRpYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCJicGZfa2Z1bmNzLmhcIlxuKyNpbmNsdWRlIFwiYnBmX21pc2MuaFwiXG4gI2luY2x1ZGUgXCJicGZfdHJhY2luZ19uZXQuaFwiXG4gXG4gI2RlZmluZSBNRVRBX1NJWkUgMzJcbkBAIC0yMiwxMCArMjQsMTAgQEBcbiBib29sIHRlc3RfcGFzcztcbiBcbiBzdGF0aWMgY29uc3QgX191OCBtZXRhX3dhbnRbTUVUQV9TSVpFXSA9IHtcbi1cdDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsXG4tXHQweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LFxuLVx0MHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCxcbi1cdDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsXG4rXHQweDQ5LCAweDIwLCAweDYzLCAweDcyLCAweDZmLCAweDczLCAweDczLCAweDY1LFxuK1x0MHg2NCwgMHgyMCwgMHg2OCwgMHg2ZiwgMHg2ZiwgMHg2YiwgMHg3MywgMHgyMCxcbitcdDB4MjYsIDB4MjAsIDB4NmMsIDB4NjksIDB4NzYsIDB4NjUsIDB4NjQsIDB4MjAsXG4rXHQweDc0LCAweDZmLCAweDIwLCAweDc0LCAweDY1LCAweDZjLCAweDZjLCAweDIxLFxuIH07XG4gXG4gc3RhdGljIGJvb2wgY2hlY2tfbWV0YWRhdGEoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIF9fdTggKm1ldGFfaGF2ZSlcbkBAIC02ODksNCArNjkxLDU2MyBAQCBpbnQgaGVscGVyX3NrYl9jaGFuZ2VfcHJvdG8oc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuIFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuIH1cbiBcbitib29sIHdyaXRlX2RvbmU7XG4rXG4rLyogV3JpdGUgdG8gc2tiX2V4dCB1c2luZyBicGZfZHlucHRyX3dyaXRlIGhlbHBlciAqL1xuK1NFQyhcInRjXCIpXG4raW50IHRjX3NrYl9leHRfd3JpdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIEFSUkFZX1NJWkUobWV0YV93YW50KSwgMCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdHdyaXRlX2RvbmUgPSB0cnVlO1xuK1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rfVxuK1xuKy8qIFJlYWQgZnJvbSBza2ItZXh0IG1ldGFkYXRhIHVzaW5nIGJwZl9keW5wdHJfcmVhZCBoZWxwZXIgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBBUlJBWV9TSVpFKG1ldGFfaGF2ZSksIFx1MDAyNm1ldGEsIDAsIDApKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbit9XG4rXG4rLyogUmVhZCBmcm9tIGEgY2xvbmVkIHNrYl9leHQgZHlucHRyICovXG4rU0VDKFwidGNcIilcbitpbnQgdGNfc2tiX2V4dF9jbG9uZV9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhLCBjbG9uZTtcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKGJwZl9keW5wdHJfY2xvbmUoXHUwMDI2bWV0YSwgXHUwMDI2Y2xvbmUpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgQVJSQVlfU0laRShtZXRhX2hhdmUpLCBcdTAwMjZjbG9uZSwgMCwgMCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK31cbitcbisvKiBSZWFkIGZyb20gc2tiX2V4dCB1c2luZyBicGZfZHlucHRyX3NsaWNlICovXG4rU0VDKFwidGNcIilcbitpbnQgdGNfc2tiX2V4dF9zbGljZV9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1x0X191OCAqbWV0YV9oYXZlO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdG1ldGFfaGF2ZSA9IGJwZl9keW5wdHJfc2xpY2UoXHUwMDI2bWV0YSwgMCwgTlVMTCwgTUVUQV9TSVpFKTtcbitcdGlmICghbWV0YV9oYXZlKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbit9XG4rXG4rLyogV3JpdGUgdG8gc2tiX2V4dCB1c2luZyBicGZfZHlucHRyX3NsaWNlX3Jkd3IgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X3NsaWNlX3dyaXRlKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1x0X191OCAqZHN0O1xuK1xuK1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGRzdCA9IGJwZl9keW5wdHJfc2xpY2VfcmR3cihcdTAwMjZtZXRhLCAwLCBOVUxMLCBNRVRBX1NJWkUpO1xuK1x0aWYgKCFkc3QpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdF9fYnVpbHRpbl9tZW1jcHkoZHN0LCBtZXRhX3dhbnQsIE1FVEFfU0laRSk7XG4rXG4rXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbit9XG4rXG4rLyogT3BlbmluZyBza2JfZXh0IHdpdGhvdXQgRl9DUkVBVEUgb24gYSBmcmVzaCBza2Igc2hvdWxkIGZhaWwgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X25vX2FsbG9jKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSAhPSAtRU5PRU5UKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rfVxuK1xuKy8qIEludmFsaWQgZmxhZ3MgYXJlIHJlamVjdGVkICovXG4rU0VDKFwidGNcIilcbitpbnQgdGNfc2tiX2V4dF9pbnZhbGlkX2ZsYWdzKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCB+MFVMTCwgXHUwMDI2bWV0YSkgIT0gLUVJTlZBTClcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK31cbitcbisvKiBXaXRob3V0IEZfQ1JFQVRFIHRoZSBkeW5wdHIgaXMgcmVhZC1vbmx5ICovXG4rU0VDKFwidGNcIilcbitpbnQgdGNfc2tiX2V4dF9yZG9ubHkoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHQvKiBDcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBleHQgKi9cbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdC8qIFJlb3BlbiB3aXRob3V0IEZfQ1JFQVRFIC0tIHNob3VsZCBiZSByZWFkLW9ubHkgKi9cbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHQvKiBWZXJpZnkgcmVhZC1vbmx5OiB3cml0ZXMgbXVzdCBmYWlsLCByZWFkcyBtdXN0IHdvcmsgKi9cbitcdGlmICghYnBmX2R5bnB0cl9pc19yZG9ubHkoXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmICghYnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK31cbitcbisvKiBEb3VibGUgYWxsb2M6IGRhdGEgZnJvbSBmaXJzdCBhbGxvYyBzdXJ2aXZlcyBzZWNvbmQgc2tiX2V4dF9hZGQgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X2RvdWJsZV9hbGxvYyhzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdC8qIEZpcnN0IGFsbG9jICsgd3JpdGUgKi9cbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdC8qIFNlY29uZCBhbGxvYyAtLSBza2JfZXh0X2FkZCByZXR1cm5zIGV4aXN0aW5nIGV4dCAqL1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBfX3U4IG1ldGFfemVyb1tNRVRBX1NJWkVdID0ge307XG4rXG4rYm9vbCBjbG9uZV9jb3dfZG9uZTtcbitcbisvKlxuKyAqIE92ZXJ3cml0ZSBza2JfZXh0IG9uIHRoZSBjbG9uZSB2aWEgRl9DUkVBVEUgKENPVykgLS0gbXVzdCBub3QgYWZmZWN0IG9yaWdpbmFsLlxuKyAqIFJ1bnMgb24gdGhlIGR1bW15IGluZ3Jlc3MgKGNsb25lIHNpZGUpLCBzeW5jaHJvbm91c2x5IGR1cmluZyB0YyBtaXJyZWQuXG4rICovXG4rU0VDKFwidGNcIilcbitpbnQgdGNfc2tiX2V4dF9jbG9uZV9yZWRpcl9jb3coc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdC8qIFplcm8gb3V0IHRoZSBjbG9uZSdzIGV4dCAtLSBtdXN0IG5vdCBhZmZlY3Qgb3JpZ2luYWwgKi9cbitcdGlmIChicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV96ZXJvLCBNRVRBX1NJWkUsIDApKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHRjbG9uZV9jb3dfZG9uZSA9IHRydWU7XG4rXHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rfVxuK1xuKy8qXG4rICogVmVyaWZ5IENPVyBpc29sYXRpb24gYXQga2ZyZWVfc2tiIHRpbWU6IG9uY2UgY2xvbmVfY293X2RvbmUgaXMgc2V0LFxuKyAqIGNoZWNrIHRoYXQgdGhlIG9yaWdpbmFsIHNrYiBzdGlsbCBoYXMgbWV0YV93YW50LlxuKyAqL1xuK1NFQyhcInRwX2J0Zi9rZnJlZV9za2JcIilcbitpbnQgQlBGX1BST0codHBfa2ZyZWVfc2tiX2Nvd19jaGVjaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmICghY2xvbmVfY293X2RvbmUpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCAwLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiAwO1xuK31cbitcbitfX3UzMiBjbG9uZV9yZWRpcl9pZmluZGV4O1xuK2Jvb2wgd3JpdGVfYmxvY2tlZDtcbitcbisvKlxuKyAqIFdyaXRlIHNrYl9leHQsIGNsb25lIHRoZSBza2IgdG8gYSBkZWxheWVkIHFkaXNjIHNvIHRoZSBjbG9uZSBrZWVwcyB0aGUgZXh0XG4rICogYmxvY2sgc2hhcmVkLCB0aGVuIHRyeSB0byB3cml0ZSB0byB0aGUgc2FtZSBkeW5wdHIgYWdhaW4uIFRoZSB3cml0ZSBtdXN0IGZhaWxcbisgKiB3aXRoIC1FQlVTWS4gUmUtYWNxdWlyaW5nIHRoZSBkeW5wdHIgd2l0aCBGX0NSRUFURSBDT1dzIHRoZSBibG9jayBhbmRcbisgKiBzdWNjZWVkcy5cbisgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdGlmIChicGZfY2xvbmVfcmVkaXJlY3QoY3R4LCBjbG9uZV9yZWRpcl9pZmluZGV4LCAwIC8qIGVncmVzcyAqLykpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdC8qIGV4dCBub3cgc2hhcmVkIHdpdGggdGhlIHF1ZXVlZCBjbG9uZSAtLSB3cml0ZSBtdXN0IGZhaWwgKi9cbitcdGlmIChicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV96ZXJvLCBNRVRBX1NJWkUsIDApICE9IC1FQlVTWSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0LyogUmUtYWNxdWlyaW5nIENPV3MgdGhlIGJsb2NrIC0tIHdyaXRlIG11c3Qgc3VjY2VlZCAqL1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfemVybywgTUVUQV9TSVpFLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0d3JpdGVfYmxvY2tlZCA9IHRydWU7XG4rXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbit9XG4rXG4rLypcbisgKiBTYW1lIGFzIGFib3ZlIGJ1dCB1c2luZyBicGZfZHlucHRyX3NsaWNlX3Jkd3IuXG4rICovXG4rU0VDKFwidGNcIilcbitpbnQgdGNfc2tiX2V4dF9zbGljZV93cml0ZV9hZnRlcl9jbG9uZV9yZWRpcihzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcdHZvaWQgKnNsaWNlO1xuK1xuK1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdGlmIChicGZfY2xvbmVfcmVkaXJlY3QoY3R4LCBjbG9uZV9yZWRpcl9pZmluZGV4LCAwIC8qIGVncmVzcyAqLykpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdC8qIGV4dCBub3cgc2hhcmVkIHdpdGggdGhlIHF1ZXVlZCBjbG9uZSAtLSBzbGljZSBtdXN0IGZhaWwgKi9cbitcdHNsaWNlID0gYnBmX2R5bnB0cl9zbGljZV9yZHdyKFx1MDAyNm1ldGEsIDAsIE5VTEwsIE1FVEFfU0laRSk7XG4rXHRpZiAoc2xpY2UpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdC8qIFJlLWFjcXVpcmluZyBDT1dzIHRoZSBibG9jayAtLSBzbGljZSBtdXN0IHN1Y2NlZWQgKi9cbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0c2xpY2UgPSBicGZfZHlucHRyX3NsaWNlX3Jkd3IoXHUwMDI2bWV0YSwgMCwgTlVMTCwgTUVUQV9TSVpFKTtcbitcdGlmICghc2xpY2UpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdF9fYnVpbHRpbl9tZW1jcHkoc2xpY2UsIG1ldGFfemVybywgTUVUQV9TSVpFKTtcbitcbitcdHdyaXRlX2Jsb2NrZWQgPSB0cnVlO1xuK1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rfVxuK1xuKy8qIFJlYWQgc2tiX2V4dCBmcm9tIGNncm91cC9za2IgaW5ncmVzcyAtLSB0ZXN0cyBjcm9zcy1ob29rIHN1cnZpdmFsICovXG4rU0VDKFwiY2dyb3VwX3NrYi9pbmdyZXNzXCIpXG4raW50IGNncnBfc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gMTtcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuK1x0XHRyZXR1cm4gMTtcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIDE7XG4rfVxuK1xuK19fYmUxNiB0YXJnZXRfcG9ydDtcbitcbisjZGVmaW5lIFRDUFY0X0hEUl9PRkZcdChzaXplb2Yoc3RydWN0IGV0aGhkcikgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSlcbisjZGVmaW5lIFRDUFY0X1NQT1JUX09GRlx0KFRDUFY0X0hEUl9PRkYgKyBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBzb3VyY2UpKVxuKyNkZWZpbmUgVENQVjRfRFBPUlRfT0ZGXHQoVENQVjRfSERSX09GRiArIG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGRlc3QpKVxuK1xuKy8qIFdyaXRlIHNrYl9leHQgb24gVENQIHBhY2tldHMgdG8vZnJvbSB0YXJnZXRfcG9ydCAqL1xuK1NFQyhcInRjXCIpXG4raW50IHRjX3NrYl9leHRfd3JpdGVfcG9ydChzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcdF9fYmUxNiBzcG9ydCwgZHBvcnQ7XG4rXG4rXHRpZiAoY3R4LVx1MDAzZXByb3RvY29sICE9IF9fYnBmX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rXHRpZiAoYnBmX3NrYl9sb2FkX2J5dGVzKGN0eCwgVENQVjRfU1BPUlRfT0ZGLCBcdTAwMjZzcG9ydCwgc2l6ZW9mKHNwb3J0KSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK1x0aWYgKGJwZl9za2JfbG9hZF9ieXRlcyhjdHgsIFRDUFY0X0RQT1JUX09GRiwgXHUwMDI2ZHBvcnQsIHNpemVvZihkcG9ydCkpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbitcdGlmIChzcG9ydCAhPSB0YXJnZXRfcG9ydCBcdTAwMjZcdTAwMjYgZHBvcnQgIT0gdGFyZ2V0X3BvcnQpXG4rXHRcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbitcdGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIE1FVEFfU0laRSwgMCk7XG4rXG4rXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbit9XG4rXG4rLyogUmVhZCBza2JfZXh0IGZyb20gc29ja19vcHMgcGFzc2l2ZSBlc3RhYmxpc2hlZCAtLSB0ZXN0cyBUQyAtXHUwMDNlIHNvY2tfb3BzIHBhdGggKi9cbitTRUMoXCJzb2Nrb3BzXCIpXG4raW50IHNrb3BzX3NrYl9leHRfcmVhZChzdHJ1Y3QgYnBmX3NvY2tfb3BzICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9zb2NrX29wc19rZXJuICprY3R4O1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xuK1xuK1x0aWYgKGN0eC1cdTAwM2VvcCAhPSBCUEZfU09DS19PUFNfUEFTU0lWRV9FU1RBQkxJU0hFRF9DQilcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHRrY3R4ID0gYnBmX2Nhc3RfdG9fa2Vybl9jdHgoY3R4KTtcbitcdHNrYiA9IGtjdHgtXHUwMDNlc2tiO1xuK1x0aWYgKCFza2IpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCAwLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIDE7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbitcdFx0cmV0dXJuIDE7XG4rXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4rXHRcdHJldHVybiAxO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiAxO1xuK31cbitcbisvKiBSZWFkIHNrYl9leHQgZnJvbSBMU00gaW5ldF9jb25uX2VzdGFibGlzaGVkIC0tIHRlc3RzIFRDIC1cdTAwM2UgTFNNIHBhdGggKi9cbitTRUMoXCJsc20vaW5ldF9jb25uX2VzdGFibGlzaGVkXCIpXG4raW50IEJQRl9QUk9HKGxzbV9za2JfZXh0X3JlYWQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAwO1xuK1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4rXHRcdHJldHVybiAwO1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyogUmVhZCBza2JfZXh0IGZyb20gc29ja2V0IGZpbHRlciAtLSB0ZXN0cyBUQyAtXHUwMDNlIHNrX2ZpbHRlciBwYXRoICovXG4rU0VDKFwic29ja2V0XCIpXG4raW50IHNrX2ZpbHRlcl9za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rb3V0OlxuK1x0cmV0dXJuIGN0eC1cdTAwM2VsZW47XG4rfVxuK1xuKy8qIFdyaXRlIHNrYl9leHQgZnJvbSBjZ3JvdXAvc2tiIGVncmVzcyAqL1xuK1NFQyhcImNncm91cF9za2IvZWdyZXNzXCIpXG4raW50IGNncnBfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAxO1xuK1x0YnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKTtcbitcbitcdHJldHVybiAxO1xuK31cbitcbisvKiBSZWFkIHNrYl9leHQgZnJvbSB0cF9idGYva2ZyZWVfc2tiIC0tIHRlc3RzIHN1cnZpdmFsIHVudGlsIHNrYiBmcmVlICovXG4rU0VDKFwidHBfYnRmL2tmcmVlX3NrYlwiKVxuK2ludCBCUEZfUFJPRyh0cF9rZnJlZV9za2JfZXh0X3JlYWQsIHN0cnVjdCBza19idWZmICpza2IpXG4re1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsIDAsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gMDtcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuK1x0XHRyZXR1cm4gMDtcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKyNkZWZpbmUgTkZfQUNDRVBUIDFcbitcbitTRUMoXCJuZXRmaWx0ZXJcIilcbitpbnQgbmZfc2tiX2V4dF9yZWFkKHN0cnVjdCBicGZfbmZfY3R4ICpjdHgpXG4re1xuK1x0c3RydWN0IF9fc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBfX3NrX2J1ZmYgKiljdHgtXHUwMDNlc2tiO1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoIXNrYilcbitcdFx0cmV0dXJuIE5GX0FDQ0VQVDtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChza2IsIDAsIDAsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gTkZfQUNDRVBUO1xuK1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4rXHRcdHJldHVybiBORl9BQ0NFUFQ7XG4rXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4rXHRcdHJldHVybiBORl9BQ0NFUFQ7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIE5GX0FDQ0VQVDtcbit9XG4rXG4rU0VDKFwibHd0X2luXCIpXG4raW50IGx3dF9pbl9za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBCUEZfT0s7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbitcdFx0cmV0dXJuIEJQRl9PSztcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIEJQRl9PSztcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gQlBGX09LO1xuK31cbitcbitTRUMoXCJsd3Rfb3V0XCIpXG4raW50IGx3dF9vdXRfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcbitcdFx0cmV0dXJuIEJQRl9PSztcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIEJQRl9PSztcbitcdGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3dhbnQsIEFSUkFZX1NJWkUobWV0YV93YW50KSwgMCk7XG4rXG4rXHRyZXR1cm4gQlBGX09LO1xuK31cbitcbitTRUMoXCJsd3RfeG1pdFwiKVxuK2ludCBsd3RfeG1pdF9za2JfZXh0X3dyaXRlKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuK1x0XHRyZXR1cm4gQlBGX09LO1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gQlBGX09LO1xuK1x0YnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgQVJSQVlfU0laRShtZXRhX3dhbnQpLCAwKTtcbitcbitcdHJldHVybiBCUEZfT0s7XG4rfVxuK1xuKy8qIFJlYWQgc2tiX2V4dCBmcm9tIHNlZzZsb2NhbCBFbmQuQlBGIC0tIHRlc3RzIFRDIC1cdTAwM2Ugc2VnNmxvY2FsIHBhdGggKi9cbitTRUMoXCJsd3Rfc2VnNmxvY2FsXCIpXG4raW50IHNlZzZsb2NhbF9za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBCUEZfT0s7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbitcdFx0cmV0dXJuIEJQRl9PSztcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIEJQRl9PSztcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gQlBGX09LO1xuK31cbitcbisvKiBSZWFkIHNrYl9leHQgZnJvbSBza19za2Igc3RyZWFtIHZlcmRpY3QgaG9vayAqL1xuK1NFQyhcInNrX3NrYi9zdHJlYW1fdmVyZGljdFwiKVxuK2ludCBza19za2Jfc2tiX2V4dF9yZWFkKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gU0tfUEFTUztcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuK1x0XHRyZXR1cm4gU0tfUEFTUztcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIFNLX1BBU1M7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIFNLX1BBU1M7XG4rfVxuK1xuIGNoYXIgX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfc2tiX2V4dC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX3NrYl9leHQuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmMyNjExYzkzMTVhYTdcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9za2JfZXh0LmNcbkBAIC0wLDAgKzEsMTIyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFwiYnBmX21pc2MuaFwiXG4rXG4rX191NjQgZmxhZ3M7XG4rXG4rU0VDKFwidGNcIilcbitfX2Rlc2NyaXB0aW9uKFwic2tiX2V4dCBzbGljZSBpcyBpbnZhbGlkYXRlZCBieSBicGZfY2xvbmVfcmVkaXJlY3RcIilcbitfX2ZhaWx1cmVcbitpbnQgc2tiX2V4dF9zdGFsZV9zbGljZV9hZnRlcl9jbG9uZV9yZWRpcmVjdChzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcdF9fdTggKnNsaWNlO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHNsaWNlID0gYnBmX2R5bnB0cl9zbGljZV9yZHdyKFx1MDAyNm1ldGEsIDAsIE5VTEwsIDgpO1xuK1x0aWYgKCFzbGljZSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRicGZfY2xvbmVfcmVkaXJlY3QoY3R4LCAxLCAwKTtcbitcbitcdC8qIFN0YWxlOiB0aGUgY2xvbmUgc2hhcmVzIHRoZSBleHQgYmxvY2sgdGhlIHNsaWNlIHBvaW50cyBpbnRvLiAqL1xuK1x0KnNsaWNlID0gMDtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJ0Y1wiKVxuK19fZGVzY3JpcHRpb24oXCJza2JfZXh0IHNsaWNlIGlzIGludmFsaWRhdGVkIHdoZW4gZXh0IGlzIHJlLW9wZW5lZCB3aXRoIEZfQ1JFQVRFXCIpXG4rX19mYWlsdXJlXG4raW50IHNrYl9leHRfc3RhbGVfc2xpY2VfYWZ0ZXJfcmVjcmVhdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIGQxLCBkMjtcbitcdF9fdTggKnNsaWNlO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2ZDEpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHNsaWNlID0gYnBmX2R5bnB0cl9zbGljZShcdTAwMjZkMSwgMCwgTlVMTCwgOCk7XG4rXHRpZiAoIXNsaWNlKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdC8qIE1heSBDT1cgdGhlIGV4dCBibG9jaywgbGVhdmluZyB0aGUgc2xpY2UgcG9pbnRpbmcgYXQgdGhlIG9sZCBvbmUuICovXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2ZDIpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiAqc2xpY2U7XG4rfVxuK1xuK1NFQyhcInRwX2J0Zi9rZnJlZV9za2JcIilcbitfX2Rlc2NyaXB0aW9uKFwiRl9DUkVBVEUgaXMgcmVqZWN0ZWQgaW4gdHJhY2luZyBwcm9ncmFtc1wiKVxuK19fZmFpbHVyZSBfX21zZyhcImlzIG5vdCBhbGxvd2VkIGluIGxzbS90cmFjaW5nIHByb2dyYW1zXCIpXG4raW50IEJQRl9QUk9HKHRwX3NrYl9leHRfY3JlYXRlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsXG4rXHRcdFx0XHQgICAgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJ0cF9idGYva2ZyZWVfc2tiXCIpXG4rX19kZXNjcmlwdGlvbihcIm5vbi1jb25zdGFudCBmbGFncyBhcmUgcmVqZWN0ZWQgaW4gdHJhY2luZyBwcm9ncmFtc1wiKVxuK19fZmFpbHVyZSBfX21zZyhcIm11c3QgYmUgYSBrbm93biBjb25zdGFudFwiKVxuK2ludCBCUEZfUFJPRyh0cF9za2JfZXh0X3Zhcl9mbGFncywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCBmbGFncywgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcInRjXCIpXG4rX19kZXNjcmlwdGlvbihcIm5vbi1jb25zdGFudCBmbGFncyBhcmUgcmVqZWN0ZWRcIilcbitfX2ZhaWx1cmUgX19tc2coXCJtdXN0IGJlIGEga25vd24gY29uc3RhbnRcIilcbitpbnQgc2tiX2V4dF92YXJfZmxhZ3Moc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBmbGFncywgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcImxzbS9pbmV0X2Nvbm5fZXN0YWJsaXNoZWRcIilcbitfX2Rlc2NyaXB0aW9uKFwiRl9DUkVBVEUgaXMgcmVqZWN0ZWQgaW4gTFNNIHByb2dyYW1zXCIpXG4rX19mYWlsdXJlIF9fbXNnKFwiaXMgbm90IGFsbG93ZWQgaW4gbHNtL3RyYWNpbmcgcHJvZ3JhbXNcIilcbitpbnQgQlBGX1BST0cobHNtX3NrYl9leHRfY3JlYXRlLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCxcbitcdFx0XHRcdCAgICBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcImxzbS9pbmV0X2Nvbm5fZXN0YWJsaXNoZWRcIilcbitfX2Rlc2NyaXB0aW9uKFwibm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZCBpbiBMU00gcHJvZ3JhbXNcIilcbitfX2ZhaWx1cmUgX19tc2coXCJtdXN0IGJlIGEga25vd24gY29uc3RhbnRcIilcbitpbnQgQlBGX1BST0cobHNtX3NrYl9leHRfdmFyX2ZsYWdzLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgZmxhZ3MsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzoyMC4yMzk0ODQ4ODhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2NTA4MTkxOTA1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIEJQRl9TS0JfRVhUIFBhdGNoKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyBpbnRyb2R1Y2luZyBgQlBGX1NLQl9FWFRgLCB3aGljaCBzb3VuZHMgbGlrZSBhIHNpZ25pZmljYW50IGVuaGFuY2VtZW50IGZvciBCUEYsIHNwZWNpZmljYWxseSBhcm91bmQgZXh0ZW5kaW5nIFNLQnMgd2l0aCBtZXRhZGF0YS4gSXQgc2VlbXMgdG8gaGF2ZSBzZXZlcmFsIGtleSBjb21wb25lbnRzOiBuZXcgZHlucHRyIGhlbHBlcnMgYW5kIGtmdW5jcyAoYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCwgYGJwZl9za2JfZXh0X3BvaW50ZXJgLCBhbmQgdGhvc2UgbG9hZC9zdG9yZSBmdW5jdGlvbnMpLCBwbHVzIGNoYW5nZXMgdG8gdGhlIHZlcmlmaWVyLCBTS0IgZXh0ZW5zaW9ucyB0aGVtc2VsdmVzLCBhbmQgb3RoZXIgcmVsYXRlZCBhcmVhcy4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICpzaG91bGQqIHdlIGZ1enogdGhpcz8gTGV0J3MgYnJlYWsgaXQgZG93bjpcblxuMS4gICoqQ29yZSBTeXN0ZW1zIEludm9sdmVkOioqIFRoaXMgaXMgdG91Y2hpbmcgc29tZSByZWFsbHkgaW1wb3J0YW50IHBpZWNlcy4gSSBzZWUgdGhlIEJQRiB2ZXJpZmllciAoYWx3YXlzIGEgZ29vZCB0YXJnZXQgZm9yIGZ1enppbmchKSwgQlBGIGR5bnB0ciBoZWxwZXJzIChuZXcgY29kZSwgcG90ZW50aWFsIGZvciBpc3N1ZXMpLCBhbmQgbW9kaWZpY2F0aW9ucyB0byBjb3JlIG5ldHdvcmtpbmcgZmlsZXMgbGlrZSBgbmV0L2NvcmUvZmlsdGVyLmNgLCBgbmV0L2NvcmUvc2tidWZmLmNgLCBhbmQgZXZlbiBgbmV0L2lwdjQvdWRwLmNgLiBUaGF0J3MgYSBwcmV0dHkgYnJvYWQgc2NvcGUsIHdoaWNoIHVzdWFsbHkgbWVhbnMgaXQncyBhbiBhcmVhIHdpdGggYSBsb3Qgb2YgY29tcGxleGl0eS5cblxuMi4gICoqUmVhY2hhYmlsaXR5OioqIFRoaXMgaXMgZXhjZWxsZW50LiBCUEYgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBgYnBmKClgIHN5c2NhbGwsIGVCUEYgcHJvZ3JhbXMsIGFuZCBtdWx0aXBsZSBzdWJzeXN0ZW1zIChUQywgTFNNLCBjZ3JvdXBcXF9za2IsIHRyYWNpbmcsIHNvY2tldCBmaWx0ZXJzLCBOZXRmaWx0ZXIsIGFuZCBvdGhlcnMpLiBNb3JlIHRvIHRoZSBwb2ludCwgdGhpcyBpcyBjb21wbGV0ZWx5IHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBRRU1VLCBtYWtpbmcgaXQgaWRlYWwgZm9yIHJvYnVzdCBhbmQgZWZmaWNpZW50IGZ1enppbmcuXG5cbjMuICAqKldvcnRoRnV6emluZz86KiogICpBYnNvbHV0ZWx5Ki4gR2l2ZW4gdGhlIGJyZWFkdGggb2YgdGhlIGNoYW5nZXMsIHRoZSBpbnZvbHZlbWVudCBvZiB0aGUgdmVyaWZpZXIsIGFuZCB0aGUgd2lkZSBhdHRhY2sgc3VyZmFjZSwgdGhpcyBzY3JlYW1zIFwiaGlnaCBwcmlvcml0eSBmb3IgZnV6emluZ1wiLiBgV29ydGhGdXp6aW5nID0gdHJ1ZWAuXG5cbk5leHQsIEkgbmVlZCB0byBjaGVjayB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBJIHNlZSB0aGF0IHdlIG5lZWQgdG8gaGF2ZSBgQlBGX1NLQl9FWFRgIGVuYWJsZWQgKHdoaWNoLCBzZW5zaWJseSwgZGVwZW5kcyBvbiBib3RoIGBCUEZfU1lTQ0FMTGAgYW5kIHNlbGVjdHMgYFNLQl9FWFRFTlNJT05TYCksIHBsdXMgYEJQRl9TWVNDQUxMYCBhbmQgdGhlIGBORVRgIG9wdGlvbiBtdXN0IGJlIGNvbmZpZ3VyZWQgYXMgd2VsbC4gVGltZSB0byBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGUgYEtjb25maWdgIGZpbGVzIGFuZCBzb3VyY2UgY29kZSBkZXRhaWxzLCBtYXliZSB1c2luZyBgZ3JlcHBlcmAgb3IganVzdCByZWFkaW5nIHRoZW0gZGlyZWN0bHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM3ODgxLCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzA5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMTU6MjM6MjYuNzQ3NjgwNzAzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3ODkyMTIwNDEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEJQRl9TS0JfRVhUXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9LY29uZmlnPTUzND1jb25maWcgTkVUX1RFU1RcXG4tLVxcbm5ldC9LY29uZmlnLTU0Mi1cXG5uZXQvS2NvbmZpZzo1NDM6Y29uZmlnIEJQRl9TS0JfRVhUXFxubmV0L0tjb25maWctNTQ0LVxcdGJvb2wgXFxcInNrYiBleHRlbnNpb24gZm9yIEJQRiBtZXRhZGF0YVxcXCJcXG4tLVxcbm5ldC9LY29uZmlnLTU1Mi1cXG5uZXQvS2NvbmZpZzo1NTM6Y29uZmlnIEJQRl9TS0JfRVhUX1NJWkVcXG5uZXQvS2NvbmZpZy01NTQtXFx0aW50IFxcXCJTaXplIG9mIHRoZSBCUEYgc2tiIGV4dGVuc2lvbiBtZXRhZGF0YSBidWZmZXJcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjIzOjI4LjUzNjg5ODkyNFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyODMzNTU0OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gdGhlIEtlcm5lbCBDb25maWd1cmF0aW9uIExhbmRzY2FwZSoqXG5cbk9rYXksIHNvIEknbSB0cnlpbmcgdG8gcGlucG9pbnQgc29tZXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBNeSBpbml0aWFsIGh1bmNoIGlzIHRoYXQgaXQncyBsaWtlbHkgZGVmaW5lZCB3aXRoaW4gdGhlIG1haW4gYG5ldC9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNTQwLiBJdCBjb3VsZCBiZSBhIG1hY3JvLCBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBvciBzb21ldGhpbmcgbW9yZSBjb21wbGV4LCBidXQgdGhhdCdzIHdoZXJlIEknbSBnb2luZyB0byBzdGFydCBkaWdnaW5nLiBUaGlzIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIHBsYWNlIHRvIGJlZ2luIG15IGludmVzdGlnYXRpb24sIGdpdmVuIHRoZSBjb250ZXh0LiBOb3cgbGV0J3Mgc2VlIHdoYXQgdGhhdCBzZWN0aW9uIGFjdHVhbGx5IGhvbGRzLi4uIEkgZXhwZWN0IHRvIGZpbmQgdGhlIG5lY2Vzc2FyeSBjbHVlcyB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzg4MjIsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzozMC44MjAyNTgwNzdaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NjA4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiA1MzUsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1MzU6XFx0XFx0dHJpc3RhdGUgXFxcIktVbml0IHRlc3RzIGZvciBuZXR3b3JraW5nXFxcIiBpZiAhS1VOSVRfQUxMX1RFU1RTXFxuIDUzNjpcXHRcXHRkZXBlbmRzIG9uIEtVTklUXFxuIDUzNzpcXHRcXHRkZWZhdWx0IEtVTklUX0FMTF9URVNUU1xcbiA1Mzg6XFx0XFx0aGVscFxcbiA1Mzk6XFx0XFx0ICBLVW5pdCB0ZXN0cyBjb3ZlcmluZyBjb3JlIG5ldHdvcmtpbmcgaW5mcmEsIHN1Y2ggYXMgc2tfYnVmZi5cXG4gNTQwOlxcdFxcbiA1NDE6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiA1NDI6XFx0XFxuIDU0MzpcXHRjb25maWcgQlBGX1NLQl9FWFRcXG4gNTQ0OlxcdFxcdGJvb2wgXFxcInNrYiBleHRlbnNpb24gZm9yIEJQRiBtZXRhZGF0YVxcXCJcXG4gNTQ1OlxcdFxcdGRlcGVuZHMgb24gQlBGX1NZU0NBTExcXG4gNTQ2OlxcdFxcdHNlbGVjdCBTS0JfRVhURU5TSU9OU1xcbiA1NDc6XFx0XFx0aGVscFxcbiA1NDg6XFx0XFx0ICBFbmFibGUgYW4gc2tfYnVmZiBleHRlbnNpb24gZm9yIHN0b3JpbmcgQlBGIG1ldGFkYXRhLiBUaGlzIGFsbG93cyBCUEZcXG4gNTQ5OlxcdFxcdCAgcHJvZ3JhbXMgdG8gYXNzb2NpYXRlIGFyYml0cmFyeSBkYXRhIHdpdGggaW5kaXZpZHVhbCBwYWNrZXRzIGFzIHRoZXlcXG4gNTUwOlxcdFxcdCAgdHJhdmVyc2UgdGhlIG5ldHdvcmsgc3RhY2suIFRoZSBzdG9yYWdlIGlzIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlblxcbiA1NTE6XFx0XFx0ICB0aGUgc2tfYnVmZiBpcyBmcmVlZC5cXG4gNTUyOlxcdFxcbiA1NTM6XFx0Y29uZmlnIEJQRl9TS0JfRVhUX1NJWkVcXG4gNTU0OlxcdFxcdGludCBcXFwiU2l6ZSBvZiB0aGUgQlBGIHNrYiBleHRlbnNpb24gbWV0YWRhdGEgYnVmZmVyXFxcIlxcbiA1NTU6XFx0XFx0ZGVwZW5kcyBvbiBCUEZfU0tCX0VYVFxcbiA1NTY6XFx0XFx0cmFuZ2UgMSAyNTZcXG4gNTU3OlxcdFxcdGRlZmF1bHQgNjRcXG4gNTU4OlxcdFxcdGhlbHBcXG4gNTU5OlxcdFxcdCAgQ29uZmlndXJlcyB0aGUgc2l6ZSBvZiB0aGUgaW5saW5lIG1ldGFkYXRhIGJ1ZmZlciBpbiBzdHJ1Y3RcXG4gNTYwOlxcdFxcdCAgYnBmX3NrYl9leHQsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIGEgQlBGIHByb2dyYW0gY2FuXFxuIDU2MTpcXHRcXHQgIHN0b3JlIG9yIHJldHJpZXZlIHdpdGggYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKS5cXG4gNTYyOlxcdFxcbiA1NjM6XFx0ZW5kaWYgICAjIGlmIE5FVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzozMC44MjAzNDg2MzdaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3MzA5NzcyMjYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzIGFuZCBGdXp6aW5nIFN0cmF0ZWd5KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoaXMgcGF0Y2guIEkgc2VlIGEgc3Vic3RhbnRpYWwgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0b3VjaGVkLCBzcHJlYWQgYWNyb3NzIHNldmVyYWwgY3JpdGljYWwgYXJlYXM6IGBuZXQvY29yZS9maWx0ZXIuY2AsIGBuZXQvY29yZS9za2J1ZmYuY2AsIGBuZXQvaXB2NC91ZHAuY2AsIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AsIGFuZCBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gVGhpcyBpbW1lZGlhdGVseSByYWlzZXMgYSBmbGFnLlxuXG5JJ20gemVyb2luZyBpbiBvbiB0aGUgbmV3IGFuZCBtb2RpZmllZCBmdW5jdGlvbnMuIFNwZWNpZmljYWxseTpcblxuKiAgICoqQ29yZSBCUEYgRHlucHRyIEZ1bmN0aW9uYWxpdHk6KiogSSBzZWUgdGhlIGFkZGl0aW9uIG9mIGBicGZfc2tiX2V4dF9wb2ludGVyYCwgYF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlc2AsIGBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzYCwgYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YC4gVGhlc2UgcG9pbnQgdG8gZXh0ZW5zaW9ucyBvZiBCUEYncyBkeW5hbWljIHBvaW50ZXIgY2FwYWJpbGl0aWVzIGRpcmVjdGx5IGludGVyYWN0aW5nIHdpdGggYHNrYmAgZXh0ZW5zaW9ucy4gVGhpcyBpcyBrZXkuXG4qICAgKipTS0IgTWFuYWdlbWVudDoqKiBUaGUgY2hhbmdlcyB0byBgc2tiX2V4dF9zY3J1YmAgYW5kIGBza2Jfc2NydWJfcGFja2V0YCBpbiBgbmV0L2NvcmUvc2tidWZmLmNgIGFyZSBpbXBvcnRhbnQgYXMgdGhleSByZWxhdGUgdG8gYHNrYmAgZXh0ZW5zaW9uIG1ldGFkYXRhIG1hbmFnZW1lbnQuXG4qICAgKipWZXJpZmllciBDaGFuZ2VzOioqIFRoZSBlZGl0cyBpbiBga2VybmVsL2JwZi92ZXJpZmllci5jYCAoYGdldF9keW5wdHJfdHlwZV9mbGFnYCwgYGJwZl9pc19rZnVuY19wa3RfY2hhbmdpbmdgLCBgY2hlY2tfa2Z1bmNfYXJnc2AsIGBjaGVja19rZnVuY19jYWxsYCkgdGVsbCBtZSB0aGVyZSdzIGJlZW4gd29yayBkb25lIHRvIGVuc3VyZSBjb3JyZWN0bmVzcyBhbmQgc2VjdXJpdHkgd2hlbiBoYW5kbGluZyB0aGVzZSBuZXcgb3BlcmF0aW9ucyB3aXRoaW4gQlBGIHByb2dyYW1zLlxuKiAgICoqVURQIExvZ2ljOioqIEknbSBhbHNvIG5vdGluZyB0aGUgY2hhbmdlIHRvIGB1ZHBfdHJ5X21ha2Vfc3RhdGVsZXNzYCBidXQgSSBzZWUgbm8gY29ubmVjdGlvbiB0byBCUEYsIGFuZCBzbyBpdCBpcyB1bmxpa2VseSB0byBiZSByZWxldmFudCB0byB0aGUgZnV6emluZyBvZiB0aGlzIHBhcnRpY3VsYXIgcGF0Y2gsIGJ1dCBJIHdpbGwgbWFrZSBhIG5vdGUgb2YgaXQuXG5cbk5vdywgbGV0J3Mgc29saWRpZnkgdGhlIGNvcmUgZm9jdXMuIFRoZSBwcmltYXJ5IHN5bWJvbHMgdGhhdCBpbXBsZW1lbnQgYW5kIGV4cG9zZSB0aGUgYWRkZWQgZnVuY3Rpb25hbGl0eSBhcmU6IGBicGZfZHlucHRyX2Zyb21fc2tiX2V4dGAsIGBicGZfc2tiX2V4dF9wb2ludGVyYCwgYF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlc2AsIGBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzYCwgYW5kIGBza2JfZXh0X3NjcnViYC4gVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBhIGZ1enplciBzaG91bGQgc3BlY2lmaWNhbGx5IHRhcmdldC5cblxuSSBhbHNvIGtub3cgSSBzaG91bGQgbG9vayBmb3IgdGhlIGBDT05GSUdgIG9wdGlvbnMgdGhhdCBtdXN0IGJlIHNldC4gSSBzZWUgYEJQRl9TS0JfRVhUYCwgYEJQRl9TWVNDQUxMYCwgYW5kIGBORVRgLiBUaGVzZSBhcmUgZXNzZW50aWFsLCBhbmQgdGhlIGZ1enplciBuZWVkcyB0byBiZSBjb25maWd1cmVkIHRvIGVuYWJsZSB0aGVtLlxuXG5GaW5hbGx5LCBkb2VzIHRoaXMgd2FycmFudCBmdXp6aW5nPyBBYnNvbHV0ZWx5LiBUaGlzIHBhdGNoIGlzIGluamVjdGluZyBhICpsb3QqIG9mIG5ldywgY29yZSBuZXR3b3JraW5nIGFuZCBCUEYgZnVuY3Rpb25hbGl0eS4gU3BlY2lmaWNhbGx5LCB0aGUgaW50cm9kdWN0aW9uIG9mIGEgbmV3IGBza19idWZmYCBleHRlbnNpb24gdHlwZSBmb3IgQlBGIGRhdGEsIHRoZSBgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRgIGtmdW5jLCBhbmQgYXNzb2NpYXRlZCBvcGVyYXRpb25zIChkeW5wdHIsIGNsb25pbmcsIHNjcnViYmluZykgY3JlYXRlcyBudW1lcm91cyBuZXcgYXR0YWNrIHN1cmZhY2VzLiBUaGlzIGlzIGEgcHJpbWUgdGFyZ2V0LiBUaGUgY2hhbmdlcyB0b3VjaCBib3RoIHRoZSB1c2VyLXNwYWNlIGludGVyZmFjZSAodmlhIGBCUEZfU1lTQ0FMTGApIGFuZCB0aGUga2VybmVsIGludGVybmFscywgaW5jcmVhc2luZyB0aGUgY2hhbmNlcyBvZiBtZW1vcnkgY29ycnVwdGlvbiBvciBvdGhlciBpc3N1ZXMuIFRoZSBkeW5hbWljIG5hdHVyZSBvZiBgc2tiYCBleHRlbnNpb25zIGFuZCBkeW5wdHIgaW50ZXJhY3Rpb25zLCBwYXJ0aWN1bGFybHkgaW4gdGhlIGNvbnRleHQgb2YgbmV0d29yayBwYWNrZXQgcHJvY2Vzc2luZywgbWFrZXMgdGhpcyBwYXRjaCBleGNlcHRpb25hbGx5IGFwcGVhbGluZyB0byBhIGZ1enplci5cblxuU28sIGxldCdzIGJ1aWxkIHRoZSBgc2V0LXJlc3VsdHNgIHBhcmFtZXRlcnM6XG5cbiogICBgV29ydGhGdXp6aW5nYDogYHRydWVgXG4qICAgYFJlYXNvbmluZ2A6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgYHNrX2J1ZmZgIGV4dGVuc2lvbiBmb3IgQlBGIG1ldGFkYXRhIChgQ09ORklHX0JQRl9TS0JfRVhUYCkgYWxvbmcgd2l0aCB0aGUgYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCBrZnVuYyBhbmQgZHlucHRyIG9wZXJhdGlvbnMuIEl0IG1vZGlmaWVzIHRoZSBCUEYgdmVyaWZpZXIsIGR5bnB0ciBoZWxwZXJzLCBhbmQgc2tiIGV4dGVuc2lvbiBsaWZldGltZS9zY3J1YmJpbmcgYWNyb3NzIG5ldHdvcmsgc3RhY2sgb3BlcmF0aW9ucyBhbmQgY2xvbmVzLiBUaGlzIHJlYWNoYWJsZSBjb3JlIEJQRiBhbmQgbmV0d29ya2luZyBsb2dpYyB3YXJyYW50cyBmdXp6aW5nLlwiXG4qICAgYEZvY3VzU3ltYm9sc2A6IGBbXCJicGZfZHlucHRyX2Zyb21fc2tiX2V4dFwiLCBcImJwZl9za2JfZXh0X3BvaW50ZXJcIiwgXCJfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXNcIiwgXCJfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzXCIsIFwic2tiX2V4dF9zY3J1YlwiXWBcbiogICBgRW5hYmxlQ29uZmlnc2A6IGBbXCJCUEZfU0tCX0VYVFwiLCBcIkJQRl9TWVNDQUxMXCIsIFwiTkVUXCJdYFxuXG5Ob3csIGxldCdzIGV4ZWN1dGUgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzk0NTksIk91dHB1dFRva2VucyI6MjAwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODM4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMTU6MjM6MzguMTMwMTIzMjA5WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MTcyODA5OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NLQl9FWFRcIixcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJORVRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfZHlucHRyX2Zyb21fc2tiX2V4dFwiLFxuICAgIFwiYnBmX3NrYl9leHRfcG9pbnRlclwiLFxuICAgIFwiX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzXCIsXG4gICAgXCJfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzXCIsXG4gICAgXCJza2JfZXh0X3NjcnViXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBza19idWZmIGV4dGVuc2lvbiBmb3IgQlBGIG1ldGFkYXRhIChDT05GSUdfQlBGX1NLQl9FWFQpIGFsb25nIHdpdGggdGhlIGJwZl9keW5wdHJfZnJvbV9za2JfZXh0IGtmdW5jIGFuZCByZWxhdGVkIGR5bnB0ciBoYW5kbGluZyBpbiBoZWxwZXJzIGFuZCB0aGUgQlBGIHZlcmlmaWVyLiBJdCBhbHNvIG1vZGlmaWVzIHBhY2tldCBzY3J1YmJpbmcgYW5kIGV4dGVuc2lvbiBsaWZldGltZSBsb2dpYyBpbiBjb3JlIG5ldHdvcmtpbmcgcGF0aHMuIFRoZXNlIGNoYW5nZXMgYXJlIGluIHJlYWNoYWJsZSBjb3JlIHN1YnN5c3RlbXMgYW5kIHdhcnJhbnQgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU0tCX0VYVFwiLFxuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIk5FVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9keW5wdHJfZnJvbV9za2JfZXh0XCIsXG4gICAgXCJicGZfc2tiX2V4dF9wb2ludGVyXCIsXG4gICAgXCJfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXNcIixcbiAgICBcIl9fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXNcIixcbiAgICBcInNrYl9leHRfc2NydWJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHNrX2J1ZmYgZXh0ZW5zaW9uIGZvciBCUEYgbWV0YWRhdGEgKENPTkZJR19CUEZfU0tCX0VYVCkgYWxvbmcgd2l0aCB0aGUgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQga2Z1bmMgYW5kIHJlbGF0ZWQgZHlucHRyIGhhbmRsaW5nIGluIGhlbHBlcnMgYW5kIHRoZSBCUEYgdmVyaWZpZXIuIEl0IGFsc28gbW9kaWZpZXMgcGFja2V0IHNjcnViYmluZyBhbmQgZXh0ZW5zaW9uIGxpZmV0aW1lIGxvZ2ljIGluIGNvcmUgbmV0d29ya2luZyBwYXRocy4gVGhlc2UgY2hhbmdlcyBhcmUgaW4gcmVhY2hhYmxlIGNvcmUgc3Vic3lzdGVtcyBhbmQgd2FycmFudCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzozOC4yMTE4NjAxNjhaIiwiU2VxIjo5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTY0MTk5OTU0NjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzozOC4yMTI1ODc2MzhaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1NjQxOTI2MzYzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBCUEYgc29ja2V0IGJ1ZmZlciBtZXRhZGF0YSBleHRlbnNpb25zIChTS0JfRVhUX0JQRikgYWNjZXNzaWJsZSB2aWEgQlBGIGR5bnB0cnMgKGBicGZfZHlucHRyX2Zyb21fc2tiX2V4dGApLCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgdmVyaWZpZXIgY2hlY2tzLCBoZWxwZXIgZnVuY3Rpb25zLCBhbmQgc2tiIGV4dGVuc2lvbiBzY3J1YmJpbmcgbG9naWMuXFxuXFxuQXNzZXNzbWVudCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrOlxcbjEuIE1lbW9yeSBJbml0aWFsaXphdGlvbjogV2hlbiBhIG5ldyBgc3RydWN0IGJwZl9za2JfZXh0YCBpcyBhZGRlZCB0byBhbiBza2IgdmlhIGBza2JfZXh0X2FkZCgpYCwgYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KClgIGV4cGxpY2l0bHkgemVyb2VzIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlIHVzaW5nIGBtZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpYC4gV2hlbiBlcnJvciBjb25kaXRpb25zIGFyZSBlbmNvdW50ZXJlZCwgdGhlIGR5bnB0ciBpcyBzYWZlbHkgY2xlYXJlZCB3aXRoIGBicGZfZHlucHRyX3NldF9udWxsKClgLlxcbjIuIEJvdW5kcyBhbmQgT2Zmc2V0czogVGhlIGJ1ZmZlciBsZW5ndGggaXMgc3RyaWN0bHkgY2hlY2tlZCBhZ2FpbnN0IGBDT05GSUdfQlBGX1NLQl9FWFRfU0laRWAgKGBBUlJBWV9TSVpFKGV4dC1cXHUwMDNlYnVmKWApLCBhbmQgYWxsIHN1YnNlcXVlbnQgZHlucHRyIG9wZXJhdGlvbnMgKGBicGZfZHlucHRyX3JlYWRgLCBgYnBmX2R5bnB0cl93cml0ZWAsIGBicGZfZHlucHRyX3NsaWNlYCkgZW5mb3JjZSBib3VuZHMgdmlhIGBicGZfZHlucHRyX2NoZWNrX29mZl9sZW4oKWAsIHByZXZlbnRpbmcgcmVhZHMgYmV5b25kIHRoZSBpbml0aWFsaXplZCByZWdpb24uXFxuMy4gSW5mbyBMZWFrczogTm8gdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5IG9yIHBhZGRpbmcgaXMgZXhwb3NlZCB0byB1c2VyIHNwYWNlIG9yIGFjcm9zcyBrZXJuZWwgYm91bmRhcmllcy5cXG5cXG5UaGUgcHJpbWFyeSBidWcgc3VyZmFjZXMgZm9yIHRoZXNlIGNoYW5nZXMgYXJlIEJQRiB2ZXJpZmllciBzYWZldHksIHJlZmNvdW50L0NPVyBzZW1hbnRpY3Mgb24gY2xvbmVkIHNrYnMsIGFuZCBidWZmZXIgYm91bmRzIGNoZWNraW5nLCBhbGwgb2Ygd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBzYW5pdGl6ZXJzIHJhdGhlciB0aGFuIEtNU0FOLiBBIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIHRoZXJlZm9yZSBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGEwZTA0NWJkNTkwN2QyNmZlNmVkY2U3NmYxZjIxNmNjMjQyNzBhNDdcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAxMCAxNToyMzoxOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmLmggYi9pbmNsdWRlL2xpbnV4L2JwZi5oXG5pbmRleCBmZmE1NjI2NDExYWMyLi42YzM1ZjhjNzQxNDc0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaFxuKysrIGIvaW5jbHVkZS9saW51eC9icGYuaFxuQEAgLTE0ODEsNiArMTQ4MSw4IEBAIGVudW0gYnBmX2R5bnB0cl90eXBlIHtcbiBcdEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQSxcbiBcdC8qIFVuZGVybHlpbmcgZGF0YSBpcyBhIGZpbGUgKi9cbiBcdEJQRl9EWU5QVFJfVFlQRV9GSUxFLFxuK1x0LyogVW5kZXJseWluZyBkYXRhIGlzIGEgYnBmX3NrYl9leHQgY2h1bmsgKi9cbitcdEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhULFxuIH07XG4gXG4gaW50IGJwZl9keW5wdHJfY2hlY2tfc2l6ZSh1NjQgc2l6ZSk7XG5AQCAtNDIxNiw0ICs0MjE4LDEyIEBAIHN0YXRpYyBpbmxpbmUgaW50IGJwZl9tYXBfY2hlY2tfb3BfZmxhZ3Moc3RydWN0IGJwZl9tYXAgKm1hcCwgdTY0IGZsYWdzLCB1NjQgYWxsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rI2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxuK1xuK3N0cnVjdCBicGZfc2tiX2V4dCB7XG4rXHR1OCBidWZbQ09ORklHX0JQRl9TS0JfRVhUX1NJWkVdIF9fYWxpZ25lZCg4KTtcbit9O1xuK1xuKyNlbmRpZiAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi9cbitcbiAjZW5kaWYgLyogX0xJTlVYX0JQRl9IICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maWx0ZXIuaCBiL2luY2x1ZGUvbGludXgvZmlsdGVyLmhcbmluZGV4IDRhOWJjNmE4NDhmMmUuLmU5YTkzNDkyMjUzYmEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oXG5AQCAtMTk1OCw0ICsxOTU4LDMxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqYnBmX3NrYl9tZXRhX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldClcbiB9XG4gI2VuZGlmIC8qIENPTkZJR19ORVQgKi9cbiBcbisjaWZkZWYgQ09ORklHX0JQRl9TS0JfRVhUXG4rdm9pZCAqYnBmX3NrYl9leHRfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCBib29sIHdyKTtcbitpbnQgX19icGZfc2tiX2V4dF9sb2FkX2J5dGVzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsIHZvaWQgKnRvLFxuK1x0XHRcdCAgICAgdTMyIGxlbik7XG4raW50IF9fYnBmX3NrYl9leHRfc3RvcmVfYnl0ZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCwgY29uc3Qgdm9pZCAqZnJvbSxcbitcdFx0XHQgICAgICB1MzIgbGVuLCB1NjQgZmxhZ3MpO1xuKyNlbHNlIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqL1xuK3N0YXRpYyBpbmxpbmUgdm9pZCAqYnBmX3NrYl9leHRfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LFxuK1x0XHRcdFx0XHRib29sIHdyKVxuK3tcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbitcdFx0XHRcdFx0ICAgdTMyIG9mZnNldCwgdm9pZCAqdG8sIHUzMiBsZW4pXG4re1xuK1x0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsXG4rXHRcdFx0XHRcdCAgICBjb25zdCB2b2lkICpmcm9tLCB1MzIgbGVuLFxuK1x0XHRcdFx0XHQgICAgdTY0IGZsYWdzKVxuK3tcbitcdHJldHVybiAtRU9QTk9UU1VQUDtcbit9XG4rI2VuZGlmIC8qIENPTkZJR19CUEZfU0tCX0VYVCAqL1xuK1xuICNlbmRpZiAvKiBfX0xJTlVYX0ZJTFRFUl9IX18gKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaFxuaW5kZXggNDIxZjZmYzQ1NDUxMS4uNTA5ZDQ0NzE3OWUxMyAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmhcbisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmhcbkBAIC01MDYxLDYgKzUwNjEsOSBAQCBlbnVtIHNrYl9leHRfaWQge1xuICNlbmRpZlxuICNpZiBJU19FTkFCTEVEKENPTkZJR19DQU4pXG4gXHRTS0JfRVhUX0NBTixcbisjZW5kaWZcbisjaWYgSVNfRU5BQkxFRChDT05GSUdfQlBGX1NLQl9FWFQpXG4rXHRTS0JfRVhUX0JQRixcbiAjZW5kaWZcbiBcdFNLQl9FWFRfTlVNLCAvKiBtdXN0IGJlIGxhc3QgKi9cbiB9O1xuQEAgLTUwODgsNiArNTA5MSw3IEBAIHZvaWQgKl9fc2tiX2V4dF9zZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBza2JfZXh0X2lkIGlkLFxuIHZvaWQgKnNrYl9leHRfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZCk7XG4gdm9pZCBfX3NrYl9leHRfZGVsKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZCk7XG4gdm9pZCBfX3NrYl9leHRfcHV0KHN0cnVjdCBza2JfZXh0ICpleHQpO1xuK3ZvaWQgc2tiX2V4dF9zY3J1YihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTtcbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYilcbiB7XG5AQCAtNTE1MywxNCArNTE1NywyMyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2hhc19leHRlbnNpb25zKHN0cnVjdCBza19idWZmICpza2IpXG4ge1xuIFx0cmV0dXJuIHVubGlrZWx5KHNrYi1cdTAwM2VhY3RpdmVfZXh0ZW5zaW9ucyk7XG4gfVxuK1xuKy8qIFRydWUgaWYgdGhlIGV4dGVuc2lvbiBibG9jayBpcyBzaGFyZWQgd2l0aCBjbG9uZWQgc2ticyAqL1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBza2JfZXh0X3NoYXJlZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuK3tcbitcdHJldHVybiBza2ItXHUwMDNlYWN0aXZlX2V4dGVuc2lvbnMgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgcmVmY291bnRfcmVhZChcdTAwMjZza2ItXHUwMDNlZXh0ZW5zaW9ucy1cdTAwM2VyZWZjbnQpICE9IDE7XG4rfVxuICNlbHNlXG4gc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX2V4dF9wdXQoc3RydWN0IHNrYl9leHQgKmV4dCkge31cbiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikge31cbiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fVxuK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfZXh0X3NjcnViKHN0cnVjdCBza19idWZmICpza2IpIHt9XG4gc3RhdGljIGlubGluZSB2b2lkIHNrYl9leHRfZGVsKHN0cnVjdCBza19idWZmICpza2IsIGludCB1bnVzZWQpIHt9XG4gc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX2V4dF9jb3B5KHN0cnVjdCBza19idWZmICpkLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqcykge31cbiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2V4dF9jb3B5KHN0cnVjdCBza19idWZmICpkc3QsIGNvbnN0IHN0cnVjdCBza19idWZmICpzKSB7fVxuIHN0YXRpYyBpbmxpbmUgYm9vbCBza2JfaGFzX2V4dGVuc2lvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYikgeyByZXR1cm4gZmFsc2U7IH1cbitzdGF0aWMgaW5saW5lIGJvb2wgc2tiX2V4dF9zaGFyZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikgeyByZXR1cm4gZmFsc2U7IH1cbiAjZW5kaWYgLyogQ09ORklHX1NLQl9FWFRFTlNJT05TICovXG4gXG4gc3RhdGljIGlubGluZSB2b2lkIG5mX3Jlc2V0X2N0KHN0cnVjdCBza19idWZmICpza2IpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXG5pbmRleCA3MzJiMzVjYzA4ZDFjLi5hNDgzOTlhZmU0OTQ5IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcbkBAIC03ODI1LDQgKzc4MjUsOSBAQCBzdHJ1Y3QgYnBmX2luc25fYXJyYXlfdmFsdWUge1xuIFx0X191MzIgOjMyO1xuIH07XG4gXG4rLyogRmxhZ3MgdG8gY29udHJvbCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpIGJlaGF2aW9yLiAqL1xuK2VudW0ge1xuK1x0QlBGX1NLQl9FWFRfRl9DUkVBVEUgPSAoMVVMTCBcdTAwM2NcdTAwM2MgMCksXG4rfTtcbitcbiAjZW5kaWYgLyogX1VBUElfX0xJTlVYX0JQRl9IX18gKi9cbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hlbHBlcnMuYyBiL2tlcm5lbC9icGYvaGVscGVycy5jXG5pbmRleCBiM2NjNWM4ZmM4NzU2Li5jZmNiNzkzOTllZDBiIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9oZWxwZXJzLmNcbisrKyBiL2tlcm5lbC9icGYvaGVscGVycy5jXG5AQCAtMTkyNiw2ICsxOTI2LDggQEAgc3RhdGljIGludCBfX2JwZl9keW5wdHJfcmVhZCh2b2lkICpkc3QsIHU2NCBsZW4sIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnNcbiBcdFx0cmV0dXJuIDA7XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9GSUxFOlxuIFx0XHRyZXR1cm4gYnBmX2ZpbGVfZmV0Y2hfYnl0ZXMoc3JjLVx1MDAzZWRhdGEsIG9mZnNldCwgZHN0LCBsZW4pO1xuK1x0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDpcbitcdFx0cmV0dXJuIF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyhzcmMtXHUwMDNlZGF0YSwgc3JjLVx1MDAzZW9mZnNldCArIG9mZnNldCwgZHN0LCBsZW4pO1xuIFx0ZGVmYXVsdDpcbiBcdFx0V0FSTl9PTkNFKHRydWUsIFwiYnBmX2R5bnB0cl9yZWFkOiB1bmtub3duIGR5bnB0ciB0eXBlICVkXFxuXCIsIHR5cGUpO1xuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbkBAIC0xOTg1LDYgKzE5ODcsOCBAQCBpbnQgX19icGZfZHlucHRyX3dyaXRlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKmRzdCwgdTY0IG9mZnNldCwgdm9pZCAqc3JjLFxuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEE6XG4gXHRcdHJldHVybiBfX2JwZl9za2JfbWV0YV9zdG9yZV9ieXRlcyhkc3QtXHUwMDNlZGF0YSwgZHN0LVx1MDAzZW9mZnNldCArIG9mZnNldCwgc3JjLFxuIFx0XHRcdFx0XHRcdCAgbGVuLCBmbGFncyk7XG4rXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxuK1x0XHRyZXR1cm4gX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlcyhkc3QtXHUwMDNlZGF0YSwgZHN0LVx1MDAzZW9mZnNldCArIG9mZnNldCwgc3JjLCBsZW4sIGZsYWdzKTtcbiBcdGRlZmF1bHQ6XG4gXHRcdFdBUk5fT05DRSh0cnVlLCBcImJwZl9keW5wdHJfd3JpdGU6IHVua25vd24gZHlucHRyIHR5cGUgJWRcXG5cIiwgdHlwZSk7XG4gXHRcdHJldHVybiAtRUZBVUxUO1xuQEAgLTIwMzIsNiArMjAzNiw3IEBAIEJQRl9DQUxMXzMoYnBmX2R5bnB0cl9kYXRhLCBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICosIHB0ciwgdTY0LCBvZmZzZXQsIHU2XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0I6XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9YRFA6XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQTpcbitcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQ6XG4gXHRcdC8qIHNrYiBhbmQgeGRwIGR5bnB0cnMgc2hvdWxkIHVzZSBicGZfZHlucHRyX3NsaWNlIC8gYnBmX2R5bnB0cl9zbGljZV9yZHdyICovXG4gXHRcdHJldHVybiAwO1xuIFx0ZGVmYXVsdDpcbkBAIC0zMDQ4LDggKzMwNTMsOCBAQCBfX2JwZl9rZnVuYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmJwZl90YXNrX2Zyb21fdnBpZChzMzIgdnBpZClcbiAgKiBwcm92aWRlZCBidWZmZXIsIHdpdGggaXRzIGNvbnRlbnRzIGNvbnRhaW5pbmcgdGhlIGRhdGEsIGlmIHVuYWJsZSB0byBvYnRhaW5cbiAgKiBkaXJlY3QgcG9pbnRlcilcbiAgKi9cbi1fX2JwZl9rZnVuYyB2b2lkICpicGZfZHlucHRyX3NsaWNlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgb2Zmc2V0LFxuLVx0XHRcdFx0ICAgdm9pZCAqYnVmZmVyX19udWxsYWJsZSwgdTY0IGJ1ZmZlcl9fc3prKVxuK3N0YXRpYyB2b2lkICpfX2JwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsXG4rXHRcdFx0XHR2b2lkICpidWZmZXJfX251bGxhYmxlLCB1NjQgYnVmZmVyX19zemssIGJvb2wgd3IpXG4ge1xuIFx0Y29uc3Qgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilwO1xuIFx0ZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZTtcbkBAIC0zMDg3LDYgKzMwOTIsOCBAQCBfX2JwZl9rZnVuYyB2b2lkICpicGZfZHlucHRyX3NsaWNlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgb2Zmc2V0LFxuIFx0fVxuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEE6XG4gXHRcdHJldHVybiBicGZfc2tiX21ldGFfcG9pbnRlcihwdHItXHUwMDNlZGF0YSwgcHRyLVx1MDAzZW9mZnNldCArIG9mZnNldCk7XG4rXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxuK1x0XHRyZXR1cm4gYnBmX3NrYl9leHRfcG9pbnRlcihwdHItXHUwMDNlZGF0YSwgcHRyLVx1MDAzZW9mZnNldCArIG9mZnNldCwgd3IpO1xuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfRklMRTpcbiBcdFx0ZXJyID0gYnBmX2ZpbGVfZmV0Y2hfYnl0ZXMocHRyLVx1MDAzZWRhdGEsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemspO1xuIFx0XHRyZXR1cm4gZXJyID8gTlVMTCA6IGJ1ZmZlcl9fbnVsbGFibGU7XG5AQCAtMzA5Niw2ICszMTAzLDEzIEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsXG4gXHR9XG4gfVxuIFxuK19fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2UoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnAsIHU2NCBvZmZzZXQsXG4rXHRcdFx0XHQgICB2b2lkICpidWZmZXJfX251bGxhYmxlLCB1NjQgYnVmZmVyX19zemspXG4re1xuK1x0cmV0dXJuIF9fYnBmX2R5bnB0cl9zbGljZShwLCBvZmZzZXQsIGJ1ZmZlcl9fbnVsbGFibGUsIGJ1ZmZlcl9fc3prLFxuK1x0XHRcdFx0ICBmYWxzZSk7XG4rfVxuK1xuIC8qKlxuICAqIGJwZl9keW5wdHJfc2xpY2VfcmR3cigpIC0gT2J0YWluIGEgd3JpdGFibGUgcG9pbnRlciB0byB0aGUgZHlucHRyIGRhdGEuXG4gICogQHA6IFRoZSBkeW5wdHIgd2hvc2UgZGF0YSBzbGljZSB0byByZXRyaWV2ZVxuQEAgLTMxNjgsNyArMzE4Miw4IEBAIF9fYnBmX2tmdW5jIHZvaWQgKmJwZl9keW5wdHJfc2xpY2VfcmR3cihjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqcCwgdTY0IG9mZnNldCxcbiBcdCAqIHdpbGwgYmUgY29waWVkIG91dCBpbnRvIHRoZSBidWZmZXIgYW5kIHRoZSB1c2VyIHdpbGwgbmVlZCB0byBjYWxsXG4gXHQgKiBicGZfZHlucHRyX3dyaXRlKCkgdG8gY29tbWl0IGNoYW5nZXMuXG4gXHQgKi9cbi1cdHJldHVybiBicGZfZHlucHRyX3NsaWNlKHAsIG9mZnNldCwgYnVmZmVyX19udWxsYWJsZSwgYnVmZmVyX19zemspO1xuK1x0cmV0dXJuIF9fYnBmX2R5bnB0cl9zbGljZShwLCBvZmZzZXQsIGJ1ZmZlcl9fbnVsbGFibGUsIGJ1ZmZlcl9fc3prLFxuK1x0XHRcdFx0ICB0cnVlKTtcbiB9XG4gXG4gX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfYWRqdXN0KHN0cnVjdCBicGZfZHlucHRyICpwLCB1NjQgc3RhcnQsIHU2NCBlbmQpXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9sb2cuYyBiL2tlcm5lbC9icGYvbG9nLmNcbmluZGV4IDU4OTc3MGNhM2QzYTAuLjAyZjliZjcyYWMwN2MgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2xvZy5jXG4rKysgYi9rZXJuZWwvYnBmL2xvZy5jXG5AQCAtNDYyLDYgKzQ2Miw4IEBAIGNvbnN0IGNoYXIgKmR5bnB0cl90eXBlX3N0cihlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlKVxuIFx0XHRyZXR1cm4gXCJza2JfbWV0YVwiO1xuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfRklMRTpcbiBcdFx0cmV0dXJuIFwiZmlsZVwiO1xuK1x0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDpcbitcdFx0cmV0dXJuIFwic2tiX2V4dFwiO1xuIFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfSU5WQUxJRDpcbiBcdFx0cmV0dXJuIFwiXHUwMDNjaW52YWxpZFx1MDAzZVwiO1xuIFx0ZGVmYXVsdDpcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbmluZGV4IGU0MjFlYTJiODBjM2EuLmU4MmUwYjRkZDJjZTAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTYyMSw2ICs2MjEsNyBAQCBzdGF0aWMgZW51bSBicGZfdHlwZV9mbGFnIGdldF9keW5wdHJfdHlwZV9mbGFnKGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGUpXG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9YRFA6XG4gXHRcdHJldHVybiBEWU5QVFJfVFlQRV9YRFA7XG4gXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQTpcbitcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQ6XG4gXHRcdHJldHVybiBEWU5QVFJfVFlQRV9TS0JfTUVUQTtcbiBcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX0ZJTEU6XG4gXHRcdHJldHVybiBEWU5QVFJfVFlQRV9GSUxFO1xuQEAgLTU4OTAsNiArNTg5MSwxMCBAQCBCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpIHtcbiBcdHN0cnVjdCBmaWxlICp2bV9maWxlO1xuIH07XG4gXG4rQlRGX1RZUEVfU0FGRV9UUlVTVEVEX09SX05VTEwoc3RydWN0IGJwZl9zb2NrX29wc19rZXJuKSB7XG4rXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xuK307XG4rXG4gc3RhdGljIGJvb2wgdHlwZV9pc19yY3Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdFx0XHRzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnLFxuIFx0XHRcdGNvbnN0IGNoYXIgKmZpZWxkX25hbWUsIHUzMiBidGZfaWQpXG5AQCAtNTkzMiw2ICs1OTM3LDcgQEAgc3RhdGljIGJvb2wgdHlwZV9pc190cnVzdGVkX29yX251bGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdEJURl9UWVBFX0VNSVQoQlRGX1RZUEVfU0FGRV9UUlVTVEVEX09SX05VTEwoc3RydWN0IHNvY2tldCkpO1xuIFx0QlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgZGVudHJ5KSk7XG4gXHRCVEZfVFlQRV9FTUlUKEJURl9UWVBFX1NBRkVfVFJVU1RFRF9PUl9OVUxMKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCkpO1xuK1x0QlRGX1RZUEVfRU1JVChCVEZfVFlQRV9TQUZFX1RSVVNURURfT1JfTlVMTChzdHJ1Y3QgYnBmX3NvY2tfb3BzX2tlcm4pKTtcbiBcbiBcdHJldHVybiBidGZfbmVzdGVkX3R5cGVfaXNfdHJ1c3RlZChcdTAwMjZlbnYtXHUwMDNlbG9nLCByZWcsIGZpZWxkX25hbWUsIGJ0Zl9pZCxcbiBcdFx0XHRcdFx0ICBcIl9fc2FmZV90cnVzdGVkX29yX251bGxcIik7XG5AQCAtMTE2MTUsNiArMTE2MjEsNyBAQCBlbnVtIHNwZWNpYWxfa2Z1bmNfdHlwZSB7XG4gXHRLRl9icGZfZHlucHRyX2Zyb21feGRwLFxuIFx0S0ZfYnBmX2R5bnB0cl9mcm9tX3NrYl9tZXRhLFxuIFx0S0ZfYnBmX3hkcF9wdWxsX2RhdGEsXG4rXHRLRl9icGZfZHlucHRyX2Zyb21fc2tiX2V4dCxcbiBcdEtGX2JwZl9keW5wdHJfc2xpY2UsXG4gXHRLRl9icGZfZHlucHRyX3NsaWNlX3Jkd3IsXG4gXHRLRl9icGZfZHlucHRyX2Nsb25lLFxuQEAgLTExNjkyLDYgKzExNjk5LDExIEBAIEJURl9JRF9VTlVTRURcbiBCVEZfSURfVU5VU0VEXG4gQlRGX0lEX1VOVVNFRFxuICNlbmRpZlxuKyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcbitCVEZfSUQoZnVuYywgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQpXG4rI2Vsc2VcbitCVEZfSURfVU5VU0VEXG4rI2VuZGlmXG4gQlRGX0lEKGZ1bmMsIGJwZl9keW5wdHJfc2xpY2UpXG4gQlRGX0lEKGZ1bmMsIGJwZl9keW5wdHJfc2xpY2VfcmR3cilcbiBCVEZfSUQoZnVuYywgYnBmX2R5bnB0cl9jbG9uZSlcbkBAIC0xMTgyNCw3ICsxMTgzNiw4IEBAIHN0YXRpYyBib29sIGlzX2tmdW5jX2JwZl9wcmVlbXB0X2VuYWJsZShzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEpXG4gXG4gYm9vbCBicGZfaXNfa2Z1bmNfcGt0X2NoYW5naW5nKHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSlcbiB7XG4tXHRyZXR1cm4gbWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfeGRwX3B1bGxfZGF0YV07XG4rXHRyZXR1cm4gbWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfeGRwX3B1bGxfZGF0YV0gfHxcbitcdCAgICAgICBtZXRhLVx1MDAzZWZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV9za2JfZXh0XTtcbiB9XG4gXG4gc3RhdGljIGludFxuQEAgLTEyODM1LDcgKzEyODQ4LDggQEAgc3RhdGljIGludCBjaGVja19rZnVuY19hcmdzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfY2FsbF9hcmdfbWVcbiBcdFx0XHRcdGR5bnB0cl9hcmdfdHlwZSB8PSBEWU5QVFJfVFlQRV9TS0I7XG4gXHRcdFx0fSBlbHNlIGlmIChtZXRhLVx1MDAzZWZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV94ZHBdKSB7XG4gXHRcdFx0XHRkeW5wdHJfYXJnX3R5cGUgfD0gRFlOUFRSX1RZUEVfWERQO1xuLVx0XHRcdH0gZWxzZSBpZiAobWV0YS1cdTAwM2VmdW5jX2lkID09IHNwZWNpYWxfa2Z1bmNfbGlzdFtLRl9icGZfZHlucHRyX2Zyb21fc2tiX21ldGFdKSB7XG4rXHRcdFx0fSBlbHNlIGlmIChtZXRhLVx1MDAzZWZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV9za2JfbWV0YV0gfHxcbitcdFx0XHRcdCAgIG1ldGEtXHUwMDNlZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRdKSB7XG4gXHRcdFx0XHRkeW5wdHJfYXJnX3R5cGUgfD0gRFlOUFRSX1RZUEVfU0tCX01FVEE7XG4gXHRcdFx0fSBlbHNlIGlmIChtZXRhLVx1MDAzZWZ1bmNfaWQgPT0gc3BlY2lhbF9rZnVuY19saXN0W0tGX2JwZl9keW5wdHJfZnJvbV9maWxlXSkge1xuIFx0XHRcdFx0ZHlucHRyX2FyZ190eXBlIHw9IERZTlBUUl9UWVBFX0ZJTEU7XG5AQCAtMTM3NjMsNiArMTM3NzcsMTMgQEAgc3RhdGljIGludCBjaGVja19rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcbiBcdFx0fVxuIFx0fVxuIFxuK1x0aWYgKG1ldGEuZnVuY19pZCA9PSBzcGVjaWFsX2tmdW5jX2xpc3RbS0ZfYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRdIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChwcm9nX3R5cGUgPT0gQlBGX1BST0dfVFlQRV9MU00gfHwgcHJvZ190eXBlID09IEJQRl9QUk9HX1RZUEVfVFJBQ0lORykgXHUwMDI2XHUwMDI2XG4rXHQgICAgKG1ldGEuYXJnX2NvbnN0YW50LnZhbHVlIFx1MDAyNiBCUEZfU0tCX0VYVF9GX0NSRUFURSkpIHtcbitcdFx0dmVyYm9zZShlbnYsIFwiQlBGX1NLQl9FWFRfRl9DUkVBVEUgaXMgbm90IGFsbG93ZWQgaW4gbHNtL3RyYWNpbmcgcHJvZ3JhbXNcXG5cIik7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuIFx0aWYgKGlzX2JwZl9yYnRyZWVfYWRkX2tmdW5jKG1ldGEuZnVuY19pZCkpIHtcbiBcdFx0ZXJyID0gcHVzaF9jYWxsYmFja19jYWxsKGVudiwgaW5zbiwgaW5zbl9pZHgsIG1ldGEuc3VicHJvZ25vLFxuIFx0XHRcdFx0XHQgc2V0X3JidHJlZV9hZGRfY2FsbGJhY2tfc3RhdGUpO1xuZGlmZiAtLWdpdCBhL25ldC9LY29uZmlnIGIvbmV0L0tjb25maWdcbmluZGV4IGUzODQ3NzM5MzU1MTUuLjZkNTczMjBkZmVhMzkgMTAwNjQ0XG4tLS0gYS9uZXQvS2NvbmZpZ1xuKysrIGIvbmV0L0tjb25maWdcbkBAIC01NDAsNCArNTQwLDI0IEBAIGNvbmZpZyBORVRfVEVTVFxuIFxuIFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuIFxuK2NvbmZpZyBCUEZfU0tCX0VYVFxuK1x0Ym9vbCBcInNrYiBleHRlbnNpb24gZm9yIEJQRiBtZXRhZGF0YVwiXG4rXHRkZXBlbmRzIG9uIEJQRl9TWVNDQUxMXG4rXHRzZWxlY3QgU0tCX0VYVEVOU0lPTlNcbitcdGhlbHBcbitcdCAgRW5hYmxlIGFuIHNrX2J1ZmYgZXh0ZW5zaW9uIGZvciBzdG9yaW5nIEJQRiBtZXRhZGF0YS4gVGhpcyBhbGxvd3MgQlBGXG4rXHQgIHByb2dyYW1zIHRvIGFzc29jaWF0ZSBhcmJpdHJhcnkgZGF0YSB3aXRoIGluZGl2aWR1YWwgcGFja2V0cyBhcyB0aGV5XG4rXHQgIHRyYXZlcnNlIHRoZSBuZXR3b3JrIHN0YWNrLiBUaGUgc3RvcmFnZSBpcyBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW5cbitcdCAgdGhlIHNrX2J1ZmYgaXMgZnJlZWQuXG4rXG4rY29uZmlnIEJQRl9TS0JfRVhUX1NJWkVcbitcdGludCBcIlNpemUgb2YgdGhlIEJQRiBza2IgZXh0ZW5zaW9uIG1ldGFkYXRhIGJ1ZmZlclwiXG4rXHRkZXBlbmRzIG9uIEJQRl9TS0JfRVhUXG4rXHRyYW5nZSAxIDI1NlxuK1x0ZGVmYXVsdCA2NFxuK1x0aGVscFxuK1x0ICBDb25maWd1cmVzIHRoZSBzaXplIG9mIHRoZSBpbmxpbmUgbWV0YWRhdGEgYnVmZmVyIGluIHN0cnVjdFxuK1x0ICBicGZfc2tiX2V4dCwgd2hpY2ggaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgYSBCUEYgcHJvZ3JhbSBjYW5cbitcdCAgc3RvcmUgb3IgcmV0cmlldmUgd2l0aCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpLlxuK1xuIGVuZGlmICAgIyBpZiBORVRcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWx0ZXIuYyBiL25ldC9jb3JlL2ZpbHRlci5jXG5pbmRleCA2MTk0MGU3NTM1NTIzLi5iZjc1NGYzMzAzNDYzIDEwMDY0NFxuLS0tIGEvbmV0L2NvcmUvZmlsdGVyLmNcbisrKyBiL25ldC9jb3JlL2ZpbHRlci5jXG5AQCAtMTI0MTgsNiArMTI0MTgsNTQgQEAgaW50IF9fYnBmX3NrYl9tZXRhX3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rI2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxuK3ZvaWQgKmJwZl9za2JfZXh0X3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG9mZnNldCwgYm9vbCB3cilcbit7XG4rXHRzdHJ1Y3QgYnBmX3NrYl9leHQgKmV4dDtcbitcbitcdGV4dCA9IHNrYl9leHRfZmluZChza2IsIFNLQl9FWFRfQlBGKTtcbitcdGlmICghZXh0KVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdGlmICh3ciBcdTAwMjZcdTAwMjYgc2tiX2V4dF9zaGFyZWQoc2tiKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRyZXR1cm4gZXh0LVx1MDAzZWJ1ZiArIG9mZnNldDtcbit9XG4rXG4raW50IF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlcyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgb2Zmc2V0LCB2b2lkICp0byxcbitcdFx0XHQgICAgIHUzMiBsZW4pXG4re1xuK1x0c3RydWN0IGJwZl9za2JfZXh0ICpleHQ7XG4rXG4rXHRleHQgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX0JQRik7XG4rXHRpZiAoIWV4dClcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXG4rXHRtZW1tb3ZlKHRvLCBleHQtXHUwMDNlYnVmICsgb2Zmc2V0LCBsZW4pO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK2ludCBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBvZmZzZXQsXG4rXHRcdFx0ICAgICAgY29uc3Qgdm9pZCAqZnJvbSwgdTMyIGxlbiwgdTY0IGZsYWdzKVxuK3tcbitcdHN0cnVjdCBicGZfc2tiX2V4dCAqZXh0O1xuK1xuK1x0aWYgKHVubGlrZWx5KGZsYWdzKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRleHQgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX0JQRik7XG4rXHRpZiAoIWV4dClcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXG4rXHRpZiAoc2tiX2V4dF9zaGFyZWQoc2tiKSlcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcbitcdG1lbW1vdmUoZXh0LVx1MDAzZWJ1ZiArIG9mZnNldCwgZnJvbSwgbGVuKTtcbitcdHJldHVybiAwO1xuK31cbisjZW5kaWYgLyogQ09ORklHX0JQRl9TS0JfRVhUICovXG4rXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuIF9fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2Zyb21fc2tiKHN0cnVjdCBfX3NrX2J1ZmYgKnMsIHU2NCBmbGFncyxcbiBcdFx0XHRcdCAgICBzdHJ1Y3QgYnBmX2R5bnB0ciAqcHRyX191bmluaXQpXG5AQCAtMTI0MzUsNiArMTI0ODMsNzkgQEAgX19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2Ioc3RydWN0IF9fc2tfYnVmZiAqcywgdTY0IGZsYWdzLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcbisvKipcbisgKiBicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgpIC0gSW5pdGlhbGl6ZSBhIGR5bnB0ciB0byB0aGUgc2tiX2V4dCBCUEYgYXJlYS5cbisgKiBAc2tiXzogc29ja2V0IGJ1ZmZlciB0byBhdHRhY2ggdGhlIGV4dGVuc2lvbiB0b1xuKyAqIEBzaXplOiBkeW5wdHIgc2l6ZSBpbiBieXRlcywgMCBmb3IgbWF4aW11bSAoQ09ORklHX0JQRl9TS0JfRVhUX1NJWkUpXG4rICogQGZsYWdzX19rOiBCUEZfU0tCX0VYVF9GX0NSRUFURSB0byBjcmVhdGUvQ09XIChyZWFkLXdyaXRlKSwgMCB0byBmaW5kXG4rICogICAgICAgICAgICAocmVhZC1vbmx5KVxuKyAqIEBwdHJfX3VuaW5pdDogZHlucHRyIHRvIGluaXRpYWxpemVcbisgKlxuKyAqIFdyaXRlcyB0byB0aGUgZHlucHRyIChicGZfZHlucHRyX3dyaXRlKCksIGJwZl9keW5wdHJfc2xpY2VfcmR3cigpKSBmYWlsIHdpdGhcbisgKiAlLUVCVVNZIG9yIE5VTEwgaWYgdGhlIGV4dGVuc2lvbiBjaHVuayBpcyBzaGFyZWQgd2l0aCBjbG9uZXMsIGUuZy4gYWZ0ZXJcbisgKiBicGZfY2xvbmVfcmVkaXJlY3QoKS4gUmUtYWNxdWlyZSB0aGUgZHlucHRyIHdpdGggQlBGX1NLQl9FWFRfRl9DUkVBVEUgdG8gZ2V0XG4rICogYSB3cml0YWJsZSBwcml2YXRlIGNvcHkuXG4rICpcbisgKiBCUEZfU0tCX0VYVF9GX0NSRUFURSBpcyBub3QgYWxsb3dlZCBpbiB0cmFjaW5nIGFuZCBMU00gcHJvZ3JhbXMuXG4rICpcbisgKiBSZXR1cm46XG4rICogKiAlMCAgICAgICAgIC0gZHlucHRyIHJlYWR5IHRvIHVzZVxuKyAqICogJS1FTk9FTlQgICAtIGV4dGVuc2lvbiBub3QgZm91bmQgKHdoZW4gbm90IGNyZWF0aW5nKVxuKyAqICogJS1FTk9NRU0gICAtIGFsbG9jYXRpb24gZmFpbGVkXG4rICogKiAlLUVJTlZBTCAgIC0gaW52YWxpZCBmbGFnc1xuKyAqICogJS1FMkJJRyAgICAtIHNpemUgZXhjZWVkcyBDT05GSUdfQlBGX1NLQl9FWFRfU0laRVxuKyAqL1xuK19fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dChzdHJ1Y3QgX19za19idWZmICpza2JfLCB1MzIgc2l6ZSxcbitcdFx0XHRcdFx0dTY0IGZsYWdzX19rLFxuK1x0XHRcdFx0XHRzdHJ1Y3QgYnBmX2R5bnB0ciAqcHRyX191bmluaXQpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilwdHJfX3VuaW5pdDtcbitcdHN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilza2JfO1xuK1x0Ym9vbCBjcmVhdGUgPSBmbGFnc19fayBcdTAwMjYgQlBGX1NLQl9FWFRfRl9DUkVBVEU7XG4rXHRzdHJ1Y3QgYnBmX3NrYl9leHQgKmV4dDtcbitcdGJvb2wgZXhpc3RzO1xuK1x0aW50IGVycjtcbitcbitcdGlmIChmbGFnc19fayBcdTAwMjYgfkJQRl9TS0JfRVhUX0ZfQ1JFQVRFKSB7XG4rXHRcdGVyciA9IC1FSU5WQUw7XG4rXHRcdGdvdG8gZXJyb3I7XG4rXHR9XG4rXG4rXHRpZiAoc2l6ZSBcdTAwM2UgQVJSQVlfU0laRShleHQtXHUwMDNlYnVmKSkge1xuK1x0XHRlcnIgPSAtRTJCSUc7XG4rXHRcdGdvdG8gZXJyb3I7XG4rXHR9XG4rXHRpZiAoIXNpemUpXG4rXHRcdHNpemUgPSBBUlJBWV9TSVpFKGV4dC1cdTAwM2VidWYpO1xuK1xuK1x0ZXhpc3RzID0gc2tiX2V4dF9leGlzdChza2IsIFNLQl9FWFRfQlBGKTtcbitcdGlmICghY3JlYXRlKSB7XG4rXHRcdGlmICghZXhpc3RzKSB7XG4rXHRcdFx0ZXJyID0gLUVOT0VOVDtcbitcdFx0XHRnb3RvIGVycm9yO1xuK1x0XHR9XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZXh0ID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX0JQRik7XG4rXHRpZiAoIWV4dCkge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuK1x0XHRnb3RvIGVycm9yO1xuK1x0fVxuK1x0aWYgKCFleGlzdHMpXG4rXHRcdG1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7XG4rb3V0OlxuK1x0YnBmX2R5bnB0cl9pbml0KHB0ciwgc2tiLCBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVCwgMCwgc2l6ZSk7XG4rXHRpZiAoIWNyZWF0ZSlcbitcdFx0YnBmX2R5bnB0cl9zZXRfcmRvbmx5KHB0cik7XG4rXHRyZXR1cm4gMDtcbitlcnJvcjpcbitcdGJwZl9keW5wdHJfc2V0X251bGwocHRyKTtcbitcdHJldHVybiBlcnI7XG4rfVxuKyNlbmRpZiAvKiBDT05GSUdfQlBGX1NLQl9FWFQgKi9cbitcbiAvKipcbiAgKiBicGZfZHlucHRyX2Zyb21fc2tiX21ldGEoKSAtIEluaXRpYWxpemUgYSBkeW5wdHIgdG8gdGhlIHNrYiBtZXRhZGF0YSBhcmVhLlxuICAqIEBza2JfOiBzb2NrZXQgYnVmZmVyIGNhcnJ5aW5nIHRoZSBtZXRhZGF0YVxuQEAgLTEyODE2LDYgKzEyOTM3LDEyIEBAIEJURl9LRlVOQ1NfU1RBUlQoYnBmX2tmdW5jX2NoZWNrX3NldF9za2JfbWV0YSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2R5bnB0cl9mcm9tX3NrYl9tZXRhKVxuIEJURl9LRlVOQ1NfRU5EKGJwZl9rZnVuY19jaGVja19zZXRfc2tiX21ldGEpXG4gXG4rI2lmZGVmIENPTkZJR19CUEZfU0tCX0VYVFxuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX2tmdW5jX2NoZWNrX3NldF9za2JfZXh0KVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dClcbitCVEZfS0ZVTkNTX0VORChicGZfa2Z1bmNfY2hlY2tfc2V0X3NrYl9leHQpXG4rI2VuZGlmXG4rXG4gQlRGX0tGVU5DU19TVEFSVChicGZfa2Z1bmNfY2hlY2tfc2V0X3hkcClcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX2R5bnB0cl9mcm9tX3hkcClcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX3hkcF9wdWxsX2RhdGEpXG5AQCAtMTI4NDcsNiArMTI5NzQsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfc2tiX21ldGEgPSB7XG4gXHQuc2V0ID0gXHUwMDI2YnBmX2tmdW5jX2NoZWNrX3NldF9za2JfbWV0YSxcbiB9O1xuIFxuKyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX2tmdW5jX3NldF9za2JfZXh0ID0ge1xuK1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4rXHQuc2V0ID0gXHUwMDI2YnBmX2tmdW5jX2NoZWNrX3NldF9za2JfZXh0LFxuK307XG4rI2VuZGlmXG4rXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9rZnVuY19zZXRfeGRwID0ge1xuIFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ID0gXHUwMDI2YnBmX2tmdW5jX2NoZWNrX3NldF94ZHAsXG5AQCAtMTI4ODksNiArMTMwMjMsMjEgQEAgc3RhdGljIGludCBfX2luaXQgYnBmX2tmdW5jX2luaXQodm9pZClcbiBcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORywgXHUwMDI2YnBmX2tmdW5jX3NldF9za2IpO1xuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX21ldGEpO1xuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9BQ1QsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX21ldGEpO1xuKyNpZmRlZiBDT05GSUdfQlBGX1NLQl9FWFRcbitcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9BQ1QsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TS0IsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NPQ0tfT1BTLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TS19TS0IsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9PVVQsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9JTiwgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbitcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTFdUX1hNSVQsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0xXVF9TRUc2TE9DQUwsIFx1MDAyNmJwZl9rZnVuY19zZXRfc2tiX2V4dCk7XG4rXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX05FVEZJTFRFUiwgXHUwMDI2YnBmX2tmdW5jX3NldF9za2JfZXh0KTtcbitcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfTFNNLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuK1x0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCBcdTAwMjZicGZfa2Z1bmNfc2V0X3NrYl9leHQpO1xuKyNlbmRpZlxuIFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsIFx1MDAyNmJwZl9rZnVuY19zZXRfeGRwKTtcbiBcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfQ0dST1VQX1NPQ0tfQUREUixcbiBcdFx0XHRcdFx0ICAgICAgIFx1MDAyNmJwZl9rZnVuY19zZXRfc29ja19hZGRyKTtcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jXG5pbmRleCBhYjE5NWI5OWM4NTMwLi5hNDc5ZTI1ZGU1NjQ4IDEwMDY0NFxuLS0tIGEvbmV0L2NvcmUvc2tidWZmLmNcbisrKyBiL25ldC9jb3JlL3NrYnVmZi5jXG5AQCAtODMsNiArODMsNyBAQFxuICNpbmNsdWRlIFx1MDAzY25ldC9wYWdlX3Bvb2wvaGVscGVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0L3BzcC90eXBlcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0L2Ryb3ByZWFzb24uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0L3hkcF9zb2NrLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91YWNjZXNzLmhcdTAwM2VcbkBAIC01MTY5LDYgKzUxNzAsOSBAQCBzdGF0aWMgY29uc3QgdTggc2tiX2V4dF90eXBlX2xlbltdID0ge1xuICNpZiBJU19FTkFCTEVEKENPTkZJR19DQU4pXG4gXHRbU0tCX0VYVF9DQU5dID0gU0tCX0VYVF9DSFVOS1NJWkVPRihzdHJ1Y3QgY2FuX3NrYl9leHQpLFxuICNlbmRpZlxuKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUEZfU0tCX0VYVClcbitcdFtTS0JfRVhUX0JQRl0gPSBTS0JfRVhUX0NIVU5LU0laRU9GKHN0cnVjdCBicGZfc2tiX2V4dCksXG4rI2VuZGlmXG4gfTtcbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIF9fbm9fcHJvZmlsZSB1bnNpZ25lZCBpbnQgc2tiX2V4dF90b3RhbF9sZW5ndGgodm9pZClcbkBAIC02Mjg3LDcgKzYyOTEsOCBAQCBFWFBPUlRfU1lNQk9MKHNrYl90cnlfY29hbGVzY2UpO1xuICAqIG9wZXJhdGlvbnMuXG4gICogc2tiX3NjcnViX3BhY2tldCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNsZWFuIGEgc2tiIGJlZm9yZSBpbmplY3RpbmcgaXQgaW5cbiAgKiBhbm90aGVyIG5hbWVzcGFjZSAoQHhuZXQgPT0gdHJ1ZSkuIFdlIGhhdmUgdG8gY2xlYXIgYWxsIGluZm9ybWF0aW9uIGluIHRoZVxuLSAqIHNrYiB0aGF0IGNvdWxkIGltcGFjdCBuYW1lc3BhY2UgaXNvbGF0aW9uLlxuKyAqIHNrYiB0aGF0IGNvdWxkIGltcGFjdCBuYW1lc3BhY2UgaXNvbGF0aW9uLiBOb3RlIHRoYXQgQlBGIHNrYiBleHRlbnNpb24gaXNcbisgKiBtZWFudCB0byBjYXJyeSBpbmZvcm1hdGlvbiBhY3Jvc3MgbmFtZXNwYWNlcyBieSBkZXNpZ24uXG4gICovXG4gdm9pZCBza2Jfc2NydWJfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgeG5ldClcbiB7XG5AQCAtNjI5NSw3ICs2MzAwLDcgQEAgdm9pZCBza2Jfc2NydWJfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgeG5ldClcbiBcdHNrYi1cdTAwM2Vza2JfaWlmID0gMDtcbiBcdHNrYi1cdTAwM2VpZ25vcmVfZGYgPSAwO1xuIFx0c2tiX2RzdF9kcm9wKHNrYik7XG4tXHRza2JfZXh0X3Jlc2V0KHNrYik7XG4rXHRza2JfZXh0X3NjcnViKHNrYik7XG4gXHRuZl9yZXNldF9jdChza2IpO1xuIFx0bmZfcmVzZXRfdHJhY2Uoc2tiKTtcbiBcbkBAIC03MzA0LDYgKzczMDksMjQgQEAgdm9pZCBfX3NrYl9leHRfcHV0KHN0cnVjdCBza2JfZXh0ICpleHQpXG4gXHRrbWVtX2NhY2hlX2ZyZWUoc2tidWZmX2V4dF9jYWNoZSwgZXh0KTtcbiB9XG4gRVhQT1JUX1NZTUJPTChfX3NrYl9leHRfcHV0KTtcbitcbit2b2lkIHNrYl9leHRfc2NydWIoc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHR1bnNpZ25lZCBpbnQgaWQ7XG4rXG4rXHRpZiAobGlrZWx5KCFza2ItXHUwMDNlYWN0aXZlX2V4dGVuc2lvbnMpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRmb3IgKGlkID0gMDsgaWQgXHUwMDNjIFNLQl9FWFRfTlVNOyBpZCsrKSB7XG4rI2lmIElTX0VOQUJMRUQoQ09ORklHX0JQRl9TS0JfRVhUKVxuK1x0XHRpZiAoaWQgPT0gU0tCX0VYVF9CUEYpXG4rXHRcdFx0Y29udGludWU7XG4rI2VuZGlmXG4rXHRcdHNrYl9leHRfZGVsKHNrYiwgaWQpO1xuK1x0fVxuK31cbitFWFBPUlRfU1lNQk9MKHNrYl9leHRfc2NydWIpO1xuK1xuICNlbmRpZiAvKiBDT05GSUdfU0tCX0VYVEVOU0lPTlMgKi9cbiBcbiBzdGF0aWMgdm9pZCBrZnJlZV9za2JfbmFwaV9jYWNoZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcC5jIGIvbmV0L2lwdjQvdWRwLmNcbmluZGV4IGIzODg3YzQyYWRmZGIuLmNmMDkzYjBkNjZjNTggMTAwNjQ0XG4tLS0gYS9uZXQvaXB2NC91ZHAuY1xuKysrIGIvbmV0L2lwdjQvdWRwLmNcbkBAIC0xNTQwLDggKzE1NDAsNiBAQCB2b2lkIHVkcF9zcGxpY2VfZW9mKHN0cnVjdCBzb2NrZXQgKnNvY2spXG4gICpcbiAgKiBXZSBuZWVkIHRvIHByZXNlcnZlIHNlY3BhdGgsIGlmIHByZXNlbnQsIHRvIGV2ZW50dWFsbHkgcHJvY2Vzc1xuICAqIElQX0NNU0dfUEFTU1NFQyBhdCByZWN2bXNnKCkgdGltZS5cbi0gKlxuLSAqIE90aGVyIGV4dGVuc2lvbnMgY2FuIGJlIGNsZWFyZWQuXG4gICovXG4gc3RhdGljIGJvb2wgdWRwX3RyeV9tYWtlX3N0YXRlbGVzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuIHtcbkBAIC0xNTQ5LDggKzE1NDcsOCBAQCBzdGF0aWMgYm9vbCB1ZHBfdHJ5X21ha2Vfc3RhdGVsZXNzKHN0cnVjdCBza19idWZmICpza2IpXG4gXHRcdHJldHVybiB0cnVlO1xuIFxuIFx0aWYgKCFzZWNwYXRoX2V4aXN0cyhza2IpKSB7XG4tXHRcdHNrYl9leHRfcmVzZXQoc2tiKTtcbi1cdFx0cmV0dXJuIHRydWU7XG4rXHRcdHNrYl9leHRfc2NydWIoc2tiKTtcbitcdFx0cmV0dXJuICFza2JfaGFzX2V4dGVuc2lvbnMoc2tiKTtcbiBcdH1cbiBcbiBcdHJldHVybiBmYWxzZTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuaW5kZXggZWE3MDQ0ZjMwYWRjMy4uOWJiZmEzNTFiY2VkYyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbkBAIC03LDYgKzcsNyBAQCBDT05GSUdfQlBGX0pJVD15XG4gQ09ORklHX0JQRl9LUFJPQkVfT1ZFUlJJREU9eVxuIENPTkZJR19CUEZfTElSQ19NT0RFMj15XG4gQ09ORklHX0JQRl9MU009eVxuK0NPTkZJR19CUEZfU0tCX0VYVD15XG4gQ09ORklHX0JQRl9TVFJFQU1fUEFSU0VSPXlcbiBDT05GSUdfQlBGX1NZU0NBTEw9eVxuICMgQ09ORklHX0JQRl9VTlBSSVZfREVGQVVMVF9PRkYgaXMgbm90IHNldFxuQEAgLTEzNiwzICsxMzcsNCBAQCBDT05GSUdfU01DX0hTX0NUUkxfQlBGPXlcbiBDT05GSUdfRElCUz15XG4gQ09ORklHX0RJQlNfTE89eVxuIENPTkZJR19QTV9XQUtFTE9DS1M9eVxuK0NPTkZJR19ORVRfU0NIX05FVEVNPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zb2NrZXRfaGVscGVycy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc29ja2V0X2hlbHBlcnMuaFxuaW5kZXggMGQ1OTUwM2EwYzczZS4uZWIxMTRhNmVhNmY5MiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NvY2tldF9oZWxwZXJzLmhcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NvY2tldF9oZWxwZXJzLmhcbkBAIC0zLDYgKzMsNyBAQFxuICNpZm5kZWYgX19TT0NLRVRfSEVMUEVSU19fXG4gI2RlZmluZSBfX1NPQ0tFVF9IRUxQRVJTX19cbiBcbisjaW5jbHVkZSBcdTAwM2NlcnJvci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC92bV9zb2NrZXRzLmhcdTAwM2VcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZmllci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZpZXIuY1xuaW5kZXggNjRhYzQ5YWQ2N2U2My4uNzcyNGU4MmZjZTY2YSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmaWVyLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmaWVyLmNcbkBAIC05NCw2ICs5NCw3IEBAXG4gI2luY2x1ZGUgXCJ2ZXJpZmllcl9zY2FsYXJfaWRzLnNrZWwuaFwiXG4gI2luY2x1ZGUgXCJ2ZXJpZmllcl9zZGl2LnNrZWwuaFwiXG4gI2luY2x1ZGUgXCJ2ZXJpZmllcl9zZWFyY2hfcHJ1bmluZy5za2VsLmhcIlxuKyNpbmNsdWRlIFwidmVyaWZpZXJfc2tiX2V4dC5za2VsLmhcIlxuICNpbmNsdWRlIFwidmVyaWZpZXJfc29jay5za2VsLmhcIlxuICNpbmNsdWRlIFwidmVyaWZpZXJfc29ja19hZGRyLnNrZWwuaFwiXG4gI2luY2x1ZGUgXCJ2ZXJpZmllcl9zb2NrbWFwX211dGF0ZS5za2VsLmhcIlxuQEAgLTI1Niw2ICsyNTcsNyBAQCB2b2lkIHRlc3RfdmVyaWZpZXJfcnVudGltZV9qaXQodm9pZCkgICAgICAgICAgeyBSVU4odmVyaWZpZXJfcnVudGltZV9qaXQpOyB9XG4gdm9pZCB0ZXN0X3ZlcmlmaWVyX3NjYWxhcl9pZHModm9pZCkgICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3NjYWxhcl9pZHMpOyB9XG4gdm9pZCB0ZXN0X3ZlcmlmaWVyX3NkaXYodm9pZCkgICAgICAgICAgICAgICAgIHsgUlVOKHZlcmlmaWVyX3NkaXYpOyB9XG4gdm9pZCB0ZXN0X3ZlcmlmaWVyX3NlYXJjaF9wcnVuaW5nKHZvaWQpICAgICAgIHsgUlVOKHZlcmlmaWVyX3NlYXJjaF9wcnVuaW5nKTsgfVxuK3ZvaWQgdGVzdF92ZXJpZmllcl9za2JfZXh0KHZvaWQpICAgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9za2JfZXh0KTsgfVxuIHZvaWQgdGVzdF92ZXJpZmllcl9zb2NrKHZvaWQpICAgICAgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9zb2NrKTsgfVxuIHZvaWQgdGVzdF92ZXJpZmllcl9zb2NrX2FkZHIodm9pZCkgICAgICAgICAgICB7IFJVTih2ZXJpZmllcl9zb2NrX2FkZHIpOyB9XG4gdm9pZCB0ZXN0X3ZlcmlmaWVyX3NvY2ttYXBfbXV0YXRlKHZvaWQpICAgICAgIHsgUlVOKHZlcmlmaWVyX3NvY2ttYXBfbXV0YXRlKTsgfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3hkcF9jb250ZXh0X3Rlc3RfcnVuLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy94ZHBfY29udGV4dF90ZXN0X3J1bi5jXG5pbmRleCA0NDg4MDc2NzYxNzZjLi45Y2JiODM5YTU1Y2NlIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMveGRwX2NvbnRleHRfdGVzdF9ydW4uY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMveGRwX2NvbnRleHRfdGVzdF9ydW4uY1xuQEAgLTIsNyArMiw5IEBAXG4gI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbmV0d29ya19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9pcHY2LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9uZXRmaWx0ZXIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FycGEvaW5ldC5oXHUwMDNlXG4rI2luY2x1ZGUgXCJzb2NrZXRfaGVscGVycy5oXCJcbiAjaW5jbHVkZSBcInRlc3RfeGRwX2NvbnRleHRfdGVzdF9ydW4uc2tlbC5oXCJcbiAjaW5jbHVkZSBcInRlc3RfeGRwX21ldGEuc2tlbC5oXCJcbiBcbkBAIC0xNiwxMyArMTgsMTQgQEBcbiAjZGVmaW5lIERVTU1ZX05BTUUgXCJkdW0wXCJcbiAjZGVmaW5lIFRBUF9ORVROUyBcInhkcF9jb250ZXh0X3R1bnRhcFwiXG4gI2RlZmluZSBMV1RfTkVUTlMgXCJ4ZHBfY29udGV4dF9sd3RcIlxuKyNkZWZpbmUgU0tCX0VYVF9ORVROUyBcInNrYl9leHRfdHVudGFwXCJcbiBcbiAjZGVmaW5lIFRFU1RfUEFZTE9BRF9MRU4gMzJcbiBzdGF0aWMgY29uc3QgX191OCB0ZXN0X3BheWxvYWRbVEVTVF9QQVlMT0FEX0xFTl0gPSB7XG4tXHQweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LFxuLVx0MHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCxcbi1cdDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsXG4tXHQweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LFxuK1x0MHg0OSwgMHgyMCwgMHg2MywgMHg3MiwgMHg2ZiwgMHg3MywgMHg3MywgMHg2NSxcbitcdDB4NjQsIDB4MjAsIDB4NjgsIDB4NmYsIDB4NmYsIDB4NmIsIDB4NzMsIDB4MjAsXG4rXHQweDI2LCAweDIwLCAweDZjLCAweDY5LCAweDc2LCAweDY1LCAweDY0LCAweDIwLFxuK1x0MHg3NCwgMHg2ZiwgMHgyMCwgMHg3NCwgMHg2NSwgMHg2YywgMHg2YywgMHgyMSxcbiB9O1xuIFxuIHZvaWQgdGVzdF94ZHBfY29udGV4dF9lcnJvcihpbnQgcHJvZ19mZCwgc3RydWN0IGJwZl90ZXN0X3J1bl9vcHRzIG9wdHMsXG5AQCAtMzMxLDEwICszMzQsMTEgQEAgdm9pZCB0ZXN0X3hkcF9jb250ZXh0X3ZldGgodm9pZClcbiBcdG5ldG5zX2ZyZWUodHhfbnMpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLFxuLVx0XHRcdHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18xX3Byb2csXG4tXHRcdFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzJfcHJvZyxcbi1cdFx0XHRib29sICp0ZXN0X3Bhc3MpXG4rc3RhdGljIHZvaWQgX190ZXN0X3R1bnRhcChjb25zdCBjaGFyICpuc25hbWUsXG4rXHRcdFx0ICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLFxuK1x0XHRcdCAgc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZyxcbitcdFx0XHQgIHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18yX3Byb2csXG4rXHRcdFx0ICBib29sICp0ZXN0X3Bhc3MpXG4ge1xuIFx0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4gXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuQEAgLTM0NSw3ICszNDksNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLFxuIFxuIFx0KnRlc3RfcGFzcyA9IGZhbHNlO1xuIFxuLVx0bnMgPSBuZXRuc19uZXcoVEFQX05FVE5TLCB0cnVlKTtcbitcdG5zID0gbmV0bnNfbmV3KG5zbmFtZSwgdHJ1ZSk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwiY3JlYXRlIGFuZCBvcGVuIG5zXCIpKVxuIFx0XHRyZXR1cm47XG4gXG5AQCAtMzk2LDYgKzQwMCwxNSBAQCBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnhkcF9wcm9nLFxuIFx0bmV0bnNfZnJlZShucyk7XG4gfVxuIFxuK3N0YXRpYyB2b2lkIHRlc3RfdHVudGFwKHN0cnVjdCBicGZfcHJvZ3JhbSAqeGRwX3Byb2csXG4rXHRcdFx0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcmlvXzFfcHJvZyxcbitcdFx0XHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMl9wcm9nLFxuK1x0XHRcdGJvb2wgKnRlc3RfcGFzcylcbit7XG4rXHRfX3Rlc3RfdHVudGFwKFRBUF9ORVROUywgeGRwX3Byb2csIHRjX3ByaW9fMV9wcm9nLCB0Y19wcmlvXzJfcHJvZyxcbitcdFx0ICAgICAgdGVzdF9wYXNzKTtcbit9XG4rXG4gLyogV3JpdGUgYSBwYWNrZXQgdG8gYSB0YXAgZGV2IGFuZCBjb3B5IGl0IHRvIGluZ3Jlc3Mgb2YgYSBkdW1teSBkZXYgKi9cbiBzdGF0aWMgdm9pZCB0ZXN0X3R1bnRhcF9taXJyZWQoc3RydWN0IGJwZl9wcm9ncmFtICp4ZHBfcHJvZyxcbiBcdFx0XHQgICAgICAgc3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcm9nLFxuQEAgLTY5MywzICs3MDYsMTA4OSBAQCB2b2lkIHRlc3RfeGRwX2NvbnRleHRfbHd0X2VuY2FwKHZvaWQpXG4gXG4gXHR0ZXN0X3hkcF9tZXRhX19kZXN0cm95KHNrZWwpO1xuIH1cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfdHVudGFwKHN0cnVjdCBicGZfcHJvZ3JhbSAqdGNfcHJpb18xX3Byb2csXG4rXHRcdFx0XHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnRjX3ByaW9fMl9wcm9nLFxuK1x0XHRcdFx0Ym9vbCAqdGVzdF9wYXNzKVxuK3tcbitcdF9fdGVzdF90dW50YXAoU0tCX0VYVF9ORVROUywgTlVMTCAvKiB4ZHAgKi8sIHRjX3ByaW9fMV9wcm9nLFxuK1x0XHQgICAgICB0Y19wcmlvXzJfcHJvZywgdGVzdF9wYXNzKTtcbit9XG4rXG4rLypcbisgKiBUZXN0IGlmIHNrYl9leHQgc3Vydml2ZXMgc2tiIGNsb25lICh2aWEgdGMgbWlycmVkKS5cbisgKiBkdW1teV9wcm9nIHJ1bnMgb24gdGhlIGNsb25lIChkdW1teSBpbmdyZXNzKS5cbisgKi9cbitzdGF0aWMgdm9pZCB0ZXN0X21pcnJlZF9jbG9uZV9leHQoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsXG4rXHRcdFx0XHQgIHN0cnVjdCBicGZfcHJvZ3JhbSAqZHVtbXlfcHJvZylcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdGNfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19JTkdSRVNTKTtcbitcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XG4rXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XG4rXHRpbnQgZHVtbXlfaWZpbmRleDtcbitcdGludCB0YXBfaWZpbmRleDtcbitcdGludCB0YXBfZmQgPSAtMTtcbitcdGludCByZXQ7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V3cml0ZV9kb25lID0gZmFsc2U7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdG5zID0gbmV0bnNfbmV3KFwibWlycmVkX2Nsb25lXCIsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcIm5ldG5zX25ld1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0LyogRHVtbXkgZGV2OiBhdHRhY2ggcmVhZGVyICovXG4rXHRTWVMoY2xvc2UsIFwiaXAgbGluayBhZGQgbmFtZSBcIiBEVU1NWV9OQU1FIFwiIHR5cGUgZHVtbXlcIik7XG4rXHRTWVMoY2xvc2UsIFwiaXAgbGluayBzZXQgZGV2IFwiIERVTU1ZX05BTUUgXCIgdXBcIik7XG4rXG4rXHRkdW1teV9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoRFVNTVlfTkFNRSk7XG4rXHRpZiAoIUFTU0VSVF9HVChkdW1teV9pZmluZGV4LCAwLCBcImR1bW15X2lmaW5kZXhcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHR0Y19ob29rLmlmaW5kZXggPSBkdW1teV9pZmluZGV4O1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImR1bW15X2hvb2tfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKGR1bW15X3Byb2cpO1xuK1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJkdW1teV9hdHRhY2hcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHQvKiBUQVAgZGV2OiBhdHRhY2ggd3JpdGVyICsgbWlycmVkIHRvIGR1bW15ICovXG4rXHR0YXBfZmQgPSBvcGVuX3R1bnRhcChUQVBfTkFNRSwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9HRSh0YXBfZmQsIDAsIFwib3Blbl90dW50YXBcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHRTWVMoY2xvc2UsIFwiaXAgbGluayBzZXQgZGV2IFwiIFRBUF9OQU1FIFwiIHVwXCIpO1xuK1xuK1x0dGFwX2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChUQVBfTkFNRSk7XG4rXHRpZiAoIUFTU0VSVF9HVCh0YXBfaWZpbmRleCwgMCwgXCJ0YXBfaWZpbmRleFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHRjX2hvb2suaWZpbmRleCA9IHRhcF9pZmluZGV4O1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInRhcF9ob29rX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHRjX29wdHMucHJvZ19pZCA9IDA7XG4rXHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dGNfaG9vaywgXHUwMDI2dGNfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwidGFwX2F0dGFjaFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdFNZUyhjbG9zZSwgXCJ0YyBmaWx0ZXIgYWRkIGRldiBcIiBUQVBfTkFNRSBcIiBpbmdyZXNzIFwiXG4rXHRcdCAgIFwicHJvdG9jb2wgYWxsIG1hdGNoYWxsIFwiXG4rXHRcdCAgIFwiYWN0aW9uIG1pcnJlZCBpbmdyZXNzIG1pcnJvciBkZXYgXCIgRFVNTVlfTkFNRSk7XG4rXG4rXHRyZXQgPSB3cml0ZV90ZXN0X3BhY2tldCh0YXBfZmQpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX3Rlc3RfcGFja2V0XCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNld3JpdGVfZG9uZSwgXCJ3cml0ZV9kb25lXCIpO1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcInRlc3RfcGFzc1wiKTtcbitcbitjbG9zZTpcbitcdGlmICh0YXBfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZSh0YXBfZmQpO1xuK1x0bmV0bnNfZnJlZShucyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfbWlycmVkX2Nsb25lX2V4dF9jb3coc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXG4re1xuK1x0c3RydWN0IGJwZl9saW5rICp0cF9saW5rO1xuK1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNlY2xvbmVfY293X2RvbmUgPSBmYWxzZTtcbitcdHRwX2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoKHNrZWwtXHUwMDNlcHJvZ3MudHBfa2ZyZWVfc2tiX2Nvd19jaGVjayk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIodHBfbGluaywgXCJhdHRhY2hfdHBcIikpXG4rXHRcdHJldHVybjtcbitcbitcdHRlc3RfbWlycmVkX2Nsb25lX2V4dChza2VsLCBza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfY2xvbmVfcmVkaXJfY293KTtcbitcdGJwZl9saW5rX19kZXN0cm95KHRwX2xpbmspO1xuK31cbitcbisvKlxuKyAqIFdyaXRlciBjbG9uZXMgdmlhIGJwZl9jbG9uZV9yZWRpcmVjdCgpIGZyb20gdGhlIHByb2cgaXRzZWxmIHRvIGxvb3BiYWNrXG4rICogd2hvc2UgbmV0ZW0gcWRpc2MgZGVsYXlzIHRoZSBjbG9uZSwgc28gaXQgc3RheXMgcXVldWVkIGFuZCBrZWVwcyBzaGFyaW5nXG4rICogdGhlIGV4dCBibG9jayB3aGlsZSB0aGUgcHJvZyB3cml0ZXMgYWdhaW4uIFdoZW4gdGhlIHFkaXNjIGZpbmFsbHkgbGVha3NcbisgKiB0aGUgY2xvbmUgYmFjayB0byBsbyBpbmdyZXNzLCB0aGUgcmVhZGVyIHRoZXJlIG11c3Qgc3RpbGwgc2VlIHRoZVxuKyAqIGNsb25lLXRpbWUgc25hcHNob3QuXG4rICovXG4rc3RhdGljIHZvaWQgdGVzdF9jbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXIoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsXG4rXHRcdFx0XHRcdCAgICAgc3RydWN0IGJwZl9wcm9ncmFtICp3cml0ZXIpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuK1x0c3RydWN0IG5ldG5zX29iaiAqbnMgPSBOVUxMO1xuK1x0aW50IHRhcF9pZmluZGV4O1xuK1x0aW50IHRhcF9mZCA9IC0xO1xuK1x0aW50IHJldCwgaTtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuK1x0c2tlbC1cdTAwM2Vic3MtXHUwMDNld3JpdGVfYmxvY2tlZCA9IGZhbHNlO1xuK1xuK1x0bnMgPSBuZXRuc19uZXcoXCJjbG9uZV9yZWRpcl9leHRcIiwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwibmV0bnNfbmV3XCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBSZWRpcmVjdCB0YXJnZXQ6IGxvIGhlbGQgYmFjayBieSBuZXRlbSBkZWxheSAqL1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgc2V0IGRldiBsbyB1cFwiKTtcbitcdFNZUyhjbG9zZSwgXCJ0YyBxZGlzYyBhZGQgZGV2IGxvIHJvb3QgbmV0ZW0gZGVsYXkgNTBtc1wiKTtcbitcbitcdC8qIFJlYWRlciBvbiB0aGUgY2xvbmU6IGxvIGluZ3Jlc3MgKi9cbitcdHRjX2hvb2suaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFwibG9cIik7XG4rXHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dGNfaG9vayk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwibG9faG9va19jcmVhdGVcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHR0Y19vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3JlYWQpO1xuK1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJsb19hdHRhY2hcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHQvKiBUQVAgZGV2OiBhdHRhY2ggd3JpdGVyIHdoaWNoIGNsb25lX3JlZGlyZWN0cyB0byBsbyAqL1xuK1x0dGFwX2ZkID0gb3Blbl90dW50YXAoVEFQX05BTUUsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfR0UodGFwX2ZkLCAwLCBcIm9wZW5fdHVudGFwXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgc2V0IGRldiBcIiBUQVBfTkFNRSBcIiB1cFwiKTtcbitcbitcdHRhcF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVEFQX05BTUUpO1xuK1x0aWYgKCFBU1NFUlRfR0UodGFwX2lmaW5kZXgsIDAsIFwidGFwX2lmaW5kZXhcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2VjbG9uZV9yZWRpcl9pZmluZGV4ID0gdGNfaG9vay5pZmluZGV4O1xuK1xuK1x0dGNfaG9vay5pZmluZGV4ID0gdGFwX2lmaW5kZXg7XG4rXHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dGNfaG9vayk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwidGFwX2hvb2tfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0dGNfb3B0cy5wcm9nX2lkID0gMDtcbitcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZCh3cml0ZXIpO1xuK1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ0YXBfYXR0YWNoXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0cmV0ID0gd3JpdGVfdGVzdF9wYWNrZXQodGFwX2ZkKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV90ZXN0X3BhY2tldFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXdyaXRlX2Jsb2NrZWQsIFwid3JpdGVfYmxvY2tlZFwiKTtcbitcbitcdC8qIENsb25lIGFycml2ZXMgYWZ0ZXIgdGhlIG5ldGVtIGRlbGF5OyBwb2xsIGV2ZXJ5IDEwIG1zZWMgdXAgdG8gMSBzZWMgKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDEwMCBcdTAwMjZcdTAwMjYgIXNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzczsgaSsrKVxuK1x0XHR1c2xlZXAoMTAwMDApO1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcInRlc3RfcGFzc1wiKTtcbitcbitjbG9zZTpcbitcdGlmICh0YXBfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZSh0YXBfZmQpO1xuK1x0bmV0bnNfZnJlZShucyk7XG4rfVxuK1xuKy8qIFRlc3QgaWYgc2tiX2V4dCBzdXJ2aXZlcyB2ZXRoIGNyb3NzLW5ldG5zIGZvcndhcmQgKi9cbitzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfc2NydWJfdmV0aChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdHhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19FR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHR4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCByeF9ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHJ4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdHN0cnVjdCBuZXRuc19vYmogKnJ4X25zID0gTlVMTCwgKnR4X25zID0gTlVMTDtcbitcdHN0cnVjdCBuc3Rva2VuICpuc3Rva2VuID0gTlVMTDtcbitcdGludCByeF9pZmluZGV4LCB0eF9pZmluZGV4O1xuK1x0aW50IHJldDtcbitcdGludCBpO1xuK1xuK1x0dHhfbnMgPSBuZXRuc19uZXcoVFhfTkVUTlMsIGZhbHNlKTtcbitcdGlmICghQVNTRVJUX09LX1BUUih0eF9ucywgXCJjcmVhdGUgdHhfbnNcIikpXG4rXHRcdHJldHVybjtcbitcbitcdHJ4X25zID0gbmV0bnNfbmV3KFJYX05FVE5TLCBmYWxzZSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocnhfbnMsIFwiY3JlYXRlIHJ4X25zXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgYWRkIFwiIFJYX05BTUUgXCIgbmV0bnMgXCIgUlhfTkVUTlNcbitcdCAgICBcIiB0eXBlIHZldGggcGVlciBuYW1lIFwiIFRYX05BTUUgXCIgbmV0bnMgXCIgVFhfTkVUTlMpO1xuK1xuK1x0LyogU2V0dXAgUlggc2lkZTogVEMgaW5ncmVzcyByZWFkZXIgKi9cbitcdG5zdG9rZW4gPSBvcGVuX25ldG5zKFJYX05FVE5TKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcInNldG5zIHJ4X25zXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgc2V0IGRldiBcIiBSWF9OQU1FIFwiIHVwXCIpO1xuK1xuK1x0cnhfaWZpbmRleCA9IGlmX25hbWV0b2luZGV4KFJYX05BTUUpO1xuK1x0aWYgKCFBU1NFUlRfR1QocnhfaWZpbmRleCwgMCwgXCJpZl9uYW1ldG9pbmRleCByeFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHJ4X2hvb2suaWZpbmRleCA9IHJ4X2lmaW5kZXg7XG4rXHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2cnhfaG9vayk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiYnBmX3RjX2hvb2tfY3JlYXRlIHJ4XCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0cnhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2cnhfaG9vaywgXHUwMDI2cnhfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiYnBmX3RjX2F0dGFjaCByeFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xuK1xuK1x0LyogU2V0dXAgVFggc2lkZTogVEMgZWdyZXNzIHdyaXRlciAqL1xuK1x0bnN0b2tlbiA9IG9wZW5fbmV0bnMoVFhfTkVUTlMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sIFwic2V0bnMgdHhfbnNcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHRTWVMoY2xvc2UsIFwiaXAgbGluayBzZXQgZGV2IFwiIFRYX05BTUUgXCIgdXBcIik7XG4rXG4rXHR0eF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoVFhfTkFNRSk7XG4rXHRpZiAoIUFTU0VSVF9HVCh0eF9pZmluZGV4LCAwLCBcImlmX25hbWV0b2luZGV4IHR4XCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0dHhfaG9vay5pZmluZGV4ID0gdHhfaWZpbmRleDtcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0eF9ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfaG9va19jcmVhdGUgdHhcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHR0eF9vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dHhfaG9vaywgXHUwMDI2dHhfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiYnBmX3RjX2F0dGFjaCB0eFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuK1xuK1x0cmV0ID0gc2VuZF90ZXN0X3BhY2tldCh0eF9pZmluZGV4KTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZW5kX3Rlc3RfcGFja2V0XCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0LyogUG9sbCBldmVyeSAxMCBtc2VjIHVwIHRvIDEgc2VjICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyAxMDAgXHUwMDI2XHUwMDI2ICFza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3M7IGkrKylcbitcdFx0dXNsZWVwKDEwMDAwKTtcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCJ0ZXN0X3Bhc3NcIik7XG4rXG4rY2xvc2U6XG4rXHRjbG9zZV9uZXRucyhuc3Rva2VuKTtcbitcdG5ldG5zX2ZyZWUocnhfbnMpO1xuK1x0bmV0bnNfZnJlZSh0eF9ucyk7XG4rfVxuK1xuKy8qIFRlc3QgaWYgc2tiX2V4dCBzdXJ2aXZlcyBHUkUgdHVubmVsIGVuY2FwK2RlY2FwICovXG4rc3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X3NjcnViX2dyZShzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfaG9vaywgdHhfaG9vaywgLmF0dGFjaF9wb2ludCA9IEJQRl9UQ19FR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHR4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCByeF9ob29rLCAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHJ4X29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbitcdGludCB0eF9pZmluZGV4O1xuK1x0aW50IHJ4X2lmaW5kZXg7XG4rXHRpbnQgcmV0O1xuK1x0aW50IGk7XG4rXG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MgPSBmYWxzZTtcbitcbitcdG5zID0gbmV0bnNfbmV3KFwiZ3JlX3Rlc3RcIiwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwibmV0bnNfbmV3XCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBTZXR1cDogZ3JlX3R4IC1cdTAwM2UgbG8gLVx1MDAzZSBncmVfcnggKi9cbitcdFNZUyhjbG9zZSwgXCJpcCBsaW5rIHNldCBsbyB1cFwiKTtcbitcdFNZUyhjbG9zZSwgXCJpcCBsaW5rIGFkZCBncmVfdHggdHlwZSBncmV0YXBcIlxuK1x0ICAgIFwiIGxvY2FsIDEyNy4wLjAuMSByZW1vdGUgMTI3LjAuMC4yXCIpO1xuK1x0U1lTKGNsb3NlLCBcImlwIGxpbmsgc2V0IGdyZV90eCB1cFwiKTtcbitcdFNZUyhjbG9zZSwgXCJpcCBhZGRyIGFkZCAxMjcuMC4wLjIvOCBkZXYgbG9cIik7XG4rXHRTWVMoY2xvc2UsIFwiaXAgbGluayBhZGQgZ3JlX3J4IHR5cGUgZ3JldGFwXCJcbitcdCAgICBcIiBsb2NhbCAxMjcuMC4wLjIgcmVtb3RlIDEyNy4wLjAuMVwiKTtcbitcdFNZUyhjbG9zZSwgXCJpcCBsaW5rIHNldCBncmVfcnggdXBcIik7XG4rXG4rXHQvKiBXcml0ZSBza2JfZXh0IG9uIFRDIGVncmVzcyBvbiBHUkUgdHggKi9cbitcdHR4X2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChcImdyZV90eFwiKTtcbitcdGlmICghQVNTRVJUX0dUKHR4X2lmaW5kZXgsIDAsIFwidHhfaWZpbmRleFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdHR4X2hvb2suaWZpbmRleCA9IHR4X2lmaW5kZXg7XG4rXHRyZXQgPSBicGZfdGNfaG9va19jcmVhdGUoXHUwMDI2dHhfaG9vayk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwidHhfaG9va19jcmVhdGVcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHR0eF9vcHRzLnByb2dfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dHhfaG9vaywgXHUwMDI2dHhfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwidHhfYXR0YWNoXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0LyogUmVhZCBza2JfZXh0IG9uIFRDIGluZ3Jlc3Mgb24gR1JFIHJ4ICovXG4rXHRyeF9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoXCJncmVfcnhcIik7XG4rXHRpZiAoIUFTU0VSVF9HVChyeF9pZmluZGV4LCAwLCBcInJ4X2lmaW5kZXhcIikpXG4rXHRcdGdvdG8gY2xvc2U7XG4rXG4rXHRyeF9ob29rLmlmaW5kZXggPSByeF9pZmluZGV4O1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnJ4X2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInJ4X2hvb2tfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0cnhfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkKTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2cnhfaG9vaywgXHUwMDI2cnhfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwicnhfYXR0YWNoXCIpKVxuK1x0XHRnb3RvIGNsb3NlO1xuK1xuK1x0LyogVGhlbiB1c2Ugc2VuZF90ZXN0X3BhY2tldCBvbiBHUkUgdHggKi9cbitcdHJldCA9IHNlbmRfdGVzdF9wYWNrZXQodHhfaWZpbmRleCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwic2VuZF90ZXN0X3BhY2tldFwiKSlcbitcdFx0Z290byBjbG9zZTtcbitcbitcdC8qIFBvbGwgZXZlcnkgMTAgbXNlYyB1cCB0byAxIHNlYyAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgMTAwIFx1MDAyNlx1MDAyNiAhc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzOyBpKyspXG4rXHRcdHVzbGVlcCgxMDAwMCk7XG4rXHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwidGVzdF9wYXNzXCIpO1xuK1xuK2Nsb3NlOlxuK1x0bmV0bnNfZnJlZShucyk7XG4rfVxuK1xuK3ZvaWQgdGVzdF9za2JfZXh0X2Jhc2ljKHZvaWQpXG4re1xuK1x0c3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwgPSBOVUxMO1xuK1xuK1x0c2tlbCA9IHRlc3RfeGRwX21ldGFfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm9wZW4gYW5kIGxvYWQgc2tlbGV0b25cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfd3JpdGVfcmVhZFwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGUsXG4rXHRcdFx0XHQgICAgc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3JlYWQsXG4rXHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfd3JpdGVfY2xvbmVfcmVhZFwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGUsXG4rXHRcdFx0XHQgICAgc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X2Nsb25lX3JlYWQsXG4rXHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfd3JpdGVfc2xpY2VfcmVhZFwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGUsXG4rXHRcdFx0XHQgICAgc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3NsaWNlX3JlYWQsXG4rXHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfc2xpY2Vfd3JpdGVfcmVhZFwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3R1bnRhcChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfc2xpY2Vfd3JpdGUsXG4rXHRcdFx0XHQgICAgc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3JlYWQsXG4rXHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfbm9fYWxsb2NcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X25vX2FsbG9jLFxuK1x0XHRcdFx0ICAgIE5VTEwsIC8qIHRjIHByaW8gMiAqL1xuK1x0XHRcdFx0ICAgIFx1MDAyNnNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX2ludmFsaWRfZmxhZ3NcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF90dW50YXAoc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X2ludmFsaWRfZmxhZ3MsXG4rXHRcdFx0XHQgICAgTlVMTCwgLyogdGMgcHJpbyAyICovXG4rXHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfcmRvbmx5XCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZG9ubHksXG4rXHRcdFx0XHQgICAgTlVMTCwgLyogdGMgcHJpbyAyICovXG4rXHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfZG91YmxlX2FsbG9jXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfdHVudGFwKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9kb3VibGVfYWxsb2MsXG4rXHRcdFx0XHQgICAgTlVMTCwgLyogdGMgcHJpbyAyICovXG4rXHRcdFx0XHQgICAgXHUwMDI2c2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2xvbmVfZXh0X3JlYWRcIikpXG4rXHRcdHRlc3RfbWlycmVkX2Nsb25lX2V4dChza2VsLCBza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfcmVhZCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNsb25lX2V4dF9jb3dcIikpXG4rXHRcdHRlc3RfbWlycmVkX2Nsb25lX2V4dF9jb3coc2tlbCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNsb25lX3JlZGlyX2V4dF93cml0ZV9hZnRlclwiKSlcbitcdFx0dGVzdF9jbG9uZV9yZWRpcl9leHRfd3JpdGVfYWZ0ZXIoc2tlbCxcbitcdFx0XHRcdFx0XHQgc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiY2xvbmVfcmVkaXJfZXh0X3NsaWNlX3dyaXRlX2FmdGVyXCIpKVxuK1x0XHR0ZXN0X2Nsb25lX3JlZGlyX2V4dF93cml0ZV9hZnRlcihza2VsLFxuK1x0XHRcdFx0XHRcdCBza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfc2xpY2Vfd3JpdGVfYWZ0ZXJfY2xvbmVfcmVkaXIpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzdXJ2aXZlc192ZXRoXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfc2NydWJfdmV0aChza2VsKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic3Vydml2ZXNfZ3JlXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfc2NydWJfZ3JlKHNrZWwpO1xuK1xuK1x0dGVzdF94ZHBfbWV0YV9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rLyogU2VuZCB0ZXN0X3BheWxvYWQgb3ZlciBsb29wYmFjayBVRFAgdG8gcmVjdl9mZCAqL1xuK3N0YXRpYyBpbnQgc2VuZF9sb29wYmFja191ZHAoaW50IHJlY3ZfZmQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX2luIGFkZHIgPSB7XG4rXHRcdC5zaW5fZmFtaWx5ID0gQUZfSU5FVCxcbitcdFx0LnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyksXG4rXHR9O1xuK1x0Y2hhciBidWZbVEVTVF9QQVlMT0FEX0xFTl07XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRpbnQgZmQgPSAtMTtcbitcdGludCBwb3J0O1xuK1xuK1x0cG9ydCA9IGdldF9zb2NrZXRfbG9jYWxfcG9ydChyZWN2X2ZkKTtcbitcdGlmICghQVNTRVJUX0dFKHBvcnQsIDAsIFwiZ2V0X3BvcnRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJzb2NrZXRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YWRkci5zaW5fcG9ydCA9IHBvcnQ7XG4rXHRzZW5kdG8oZmQsIHRlc3RfcGF5bG9hZCwgVEVTVF9QQVlMT0FEX0xFTiwgMCxcbitcdCAgICAgICAodm9pZCAqKVx1MDAyNmFkZHIsIHNpemVvZihhZGRyKSk7XG4rXHRyZWN2ZnJvbShyZWN2X2ZkLCBidWYsIHNpemVvZihidWYpLCAwLCBOVUxMLCBOVUxMKTtcbitcdHJldCA9IDA7XG4rb3V0OlxuK1x0aWYgKGZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rZW51bSB1ZHBfcmVhZGVyX3R5cGUge1xuK1x0UkVBREVSX0NHUlBfU0tCLFxuK1x0UkVBREVSX1NLX0ZJTFRFUixcbit9O1xuK1xuKy8qIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgaW5ncmVzcyAtXHUwMDNlIFVEUCByZWFkZXIgaG9vayAqL1xuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF91ZHAoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsIGNvbnN0IGNoYXIgKm5hbWUsXG4rXHRcdFx0ICAgICBlbnVtIHVkcF9yZWFkZXJfdHlwZSByZWFkZXIpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssXG4rXHRcdCAgICAuaWZpbmRleCA9IDEgLyogSUZJTkRFWF9MTyAqLyxcbitcdFx0ICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuK1x0c3RydWN0IGJwZl9saW5rICpyZWFkZXJfbGluayA9IE5VTEw7XG4rXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XG4rXHRpbnQgc2VydmVyX2ZkID0gLTE7XG4rXHRpbnQgY2dyb3VwX2ZkID0gLTE7XG4rXHRpbnQgZmlsdGVyX2ZkO1xuK1x0aW50IHJldDtcbitcbitcdG5zID0gbmV0bnNfbmV3KG5hbWUsIHRydWUpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zLCBcIm5ldG5zX25ld1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0Y2dyb3VwX2ZkID0gdGVzdF9fam9pbl9jZ3JvdXAoXCIvc2tiX2V4dF91ZHBcIik7XG4rXHRpZiAoIUFTU0VSVF9HRShjZ3JvdXBfZmQsIDAsIFwiam9pbl9jZ3JvdXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVULCBTT0NLX0RHUkFNLCBcIjEyNy4wLjAuMVwiLCAwLCAwKTtcbitcdGlmICghQVNTRVJUX0dFKHNlcnZlcl9mZCwgMCwgXCJzdGFydF9zZXJ2ZXJcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuK1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19ob29rX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XG4rXHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19hdHRhY2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHN3aXRjaCAocmVhZGVyKSB7XG4rXHRjYXNlIFJFQURFUl9DR1JQX1NLQjpcbitcdFx0cmVhZGVyX2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2Nncm91cChza2VsLVx1MDAzZXByb2dzLmNncnBfc2tiX2V4dF9yZWFkLFxuK1x0XHRcdFx0XHRcdFx0IGNncm91cF9mZCk7XG4rXHRcdGlmICghQVNTRVJUX09LX1BUUihyZWFkZXJfbGluaywgXCJhdHRhY2hfY2dyb3VwXCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQURFUl9TS19GSUxURVI6XG4rXHRcdGZpbHRlcl9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnNrX2ZpbHRlcl9za2JfZXh0X3JlYWQpO1xuK1x0XHRyZXQgPSBzZXRzb2Nrb3B0KHNlcnZlcl9mZCwgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0JQRixcbitcdFx0XHRcdCBcdTAwMjZmaWx0ZXJfZmQsIHNpemVvZihmaWx0ZXJfZmQpKTtcbitcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcImF0dGFjaF9zb2NrZXRfZmlsdGVyXCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHRpZiAoc2VuZF9sb29wYmFja191ZHAoc2VydmVyX2ZkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcInRlc3RfcGFzc1wiKTtcbitcbitjbGVhbnVwOlxuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kocmVhZGVyX2xpbmspO1xuK1x0YnBmX3RjX2hvb2tfZGVzdHJveShcdTAwMjZ0Y19ob29rKTtcbitcdGlmIChzZXJ2ZXJfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShzZXJ2ZXJfZmQpO1xuK1x0aWYgKGNncm91cF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGNncm91cF9mZCk7XG4rXHRuZXRuc19mcmVlKG5zKTtcbit9XG4rXG4rZW51bSB0Y3BfcmVhZGVyX3R5cGUge1xuK1x0UkVBREVSX1NLT1BTLFxuK1x0UkVBREVSX0xTTSxcbit9O1xuK1xuKy8qIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCBhY3Jvc3MgVEMgaW5ncmVzcyAtXHUwMDNlIFRDUCByZWFkZXIgaG9vayAqL1xuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF90Y3Aoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsIGNvbnN0IGNoYXIgKm5hbWUsXG4rXHRcdFx0ICAgICBlbnVtIHRjcF9yZWFkZXJfdHlwZSByZWFkZXIpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssXG4rXHRcdCAgICAuaWZpbmRleCA9IDEgLyogSUZJTkRFWF9MTyAqLyxcbitcdFx0ICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuK1x0c3RydWN0IGJwZl9saW5rICpyZWFkZXJfbGluayA9IE5VTEw7XG4rXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XG4rXHRpbnQgc2VydmVyX2ZkID0gLTE7XG4rXHRpbnQgY2dyb3VwX2ZkID0gLTE7XG4rXHRpbnQgY2xpZW50X2ZkID0gLTE7XG4rXHRpbnQgY29ubl9mZCA9IC0xO1xuK1x0aW50IHBvcnQ7XG4rXHRpbnQgcmV0O1xuK1xuK1x0bnMgPSBuZXRuc19uZXcobmFtZSwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwibmV0bnNfbmV3XCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRjZ3JvdXBfZmQgPSB0ZXN0X19qb2luX2Nncm91cChcIi9za2JfZXh0X3RjcFwiKTtcbitcdGlmICghQVNTRVJUX0dFKGNncm91cF9mZCwgMCwgXCJqb2luX2Nncm91cFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBcIjEyNy4wLjAuMVwiLCAwLCAwKTtcbitcdGlmICghQVNTRVJUX0dFKHNlcnZlcl9mZCwgMCwgXCJzdGFydF9zZXJ2ZXJcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHBvcnQgPSBnZXRfc29ja2V0X2xvY2FsX3BvcnQoc2VydmVyX2ZkKTtcbitcdGlmICghQVNTRVJUX0dFKHBvcnQsIDAsIFwiZ2V0X3BvcnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRhcmdldF9wb3J0ID0gcG9ydDtcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuK1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19ob29rX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZV9wb3J0KTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dGNfaG9vaywgXHUwMDI2dGNfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiYnBmX3RjX2F0dGFjaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c3dpdGNoIChyZWFkZXIpIHtcbitcdGNhc2UgUkVBREVSX1NLT1BTOlxuK1x0XHRyZWFkZXJfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfY2dyb3VwKHNrZWwtXHUwMDNlcHJvZ3Muc2tvcHNfc2tiX2V4dF9yZWFkLFxuK1x0XHRcdFx0XHRcdFx0IGNncm91cF9mZCk7XG4rXHRcdGlmICghQVNTRVJUX09LX1BUUihyZWFkZXJfbGluaywgXCJhdHRhY2hfc2tvcHNcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0XHRicmVhaztcbitcdGNhc2UgUkVBREVSX0xTTTpcbitcdFx0cmVhZGVyX2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2xzbShza2VsLVx1MDAzZXByb2dzLmxzbV9za2JfZXh0X3JlYWQpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIocmVhZGVyX2xpbmssIFwiYXR0YWNoX2xzbVwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK1xuK1x0Y2xpZW50X2ZkID0gY29ubmVjdF90b19mZChzZXJ2ZXJfZmQsIDApO1xuK1x0aWYgKCFBU1NFUlRfR0UoY2xpZW50X2ZkLCAwLCBcImNvbm5lY3RcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGNvbm5fZmQgPSBhY2NlcHQoc2VydmVyX2ZkLCBOVUxMLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX0dFKGNvbm5fZmQsIDAsIFwiYWNjZXB0XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwidGVzdF9wYXNzXCIpO1xuK1xuK2NsZWFudXA6XG4rXHRpZiAoY29ubl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGNvbm5fZmQpO1xuK1x0aWYgKGNsaWVudF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGNsaWVudF9mZCk7XG4rXHRicGZfbGlua19fZGVzdHJveShyZWFkZXJfbGluayk7XG4rXHRicGZfdGNfaG9va19kZXN0cm95KFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKHNlcnZlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHNlcnZlcl9mZCk7XG4rXHRpZiAoY2dyb3VwX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoY2dyb3VwX2ZkKTtcbitcdG5ldG5zX2ZyZWUobnMpO1xuK31cbitcbisvKlxuKyAqIFRlc3Qgc2tiX2V4dCBzdXJ2aXZhbCB1bnRpbCBza2IgZnJlZTogY2dyb3VwL3NrYiBlZ3Jlc3MgLVx1MDAzZSBrZnJlZV9za2IuXG4rICogU2VuZCBVRFAgdG8gYSBjbG9zZWQgcG9ydC4gVGhlIHBhY2tldCBpcyBkcm9wcGVkLCB0cmlnZ2VyaW5nIGtmcmVlX3NrYi5cbisgKi9cbitzdGF0aWMgdm9pZCB0ZXN0X2NncnBfZWdyZXNzX3RvX2tmcmVlX3NrYihzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbClcbit7XG4rXHRzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHtcbitcdFx0LnNpbl9mYW1pbHkgPSBBRl9JTkVULFxuK1x0XHQuc2luX3BvcnQgPSBodG9ucyg0MzIxKSxcbitcdFx0LnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyksXG4rXHR9O1xuK1x0c3RydWN0IGJwZl9saW5rICpjZ19saW5rID0gTlVMTDtcbitcdHN0cnVjdCBicGZfbGluayAqdHBfbGluayA9IE5VTEw7XG4rXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XG4rXHRpbnQgY2dyb3VwX2ZkID0gLTE7XG4rXHRjaGFyIGJ1ZlsxXTtcbitcdGludCBmZCA9IC0xO1xuK1x0aW50IHJldDtcbitcbitcdGNncm91cF9mZCA9IHRlc3RfX2pvaW5fY2dyb3VwKFwiL2NncnBfdG9fa2ZyZWVcIik7XG4rXHRpZiAoIUFTU0VSVF9HRShjZ3JvdXBfZmQsIDAsIFwiam9pbl9jZ3JvdXBcIikpXG4rXHRcdHJldHVybjtcbitcbitcdG5zID0gbmV0bnNfbmV3KFwiY2dycF90b19rZnJlZVwiLCB0cnVlKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihucywgXCJuZXRuc19uZXdcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuK1xuK1x0Y2dfbGluayA9IGJwZl9wcm9ncmFtX19hdHRhY2hfY2dyb3VwKHNrZWwtXHUwMDNlcHJvZ3MuY2dycF9za2JfZXh0X3dyaXRlLFxuK1x0XHRcdFx0XHQgICAgIGNncm91cF9mZCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoY2dfbGluaywgXCJhdHRhY2hfY2dyb3VwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHR0cF9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF90cmFjZShza2VsLVx1MDAzZXByb2dzLnRwX2tmcmVlX3NrYl9leHRfcmVhZCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIodHBfbGluaywgXCJhdHRhY2hfdHBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwic29ja2V0XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjb25uZWN0KGZkLCAodm9pZCAqKVx1MDAyNmFkZHIsIHNpemVvZihhZGRyKSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiY29ubmVjdFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gc2VuZChmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwKTtcbitcdGlmICghQVNTRVJUX0VRKHJldCwgVEVTVF9QQVlMT0FEX0xFTiwgXCJzZW5kXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHQvKiBXYWl0IGZvciBJQ01QIGVycm9yIC0tIGNvbmZpcm1zIHRoZSBwYWNrZXQgd2FzIGZyZWVkICovXG4rXHRyZXQgPSByZWN2KGZkLCBidWYsIHNpemVvZihidWYpLCAwKTtcbitcdGlmICghQVNTRVJUX0VRKHJldCwgLTEsIFwicmVjdlwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0QVNTRVJUX0VRKGVycm5vLCBFQ09OTlJFRlVTRUQsIFwicmVjdl9lY29ubnJlZnVzZWRcIik7XG4rXG4rXHRBU1NFUlRfVFJVRShza2VsLVx1MDAzZWJzcy1cdTAwM2V0ZXN0X3Bhc3MsIFwidGVzdF9wYXNzXCIpO1xuK1xuK2NsZWFudXA6XG4rXHRpZiAoZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShmZCk7XG4rXHRicGZfbGlua19fZGVzdHJveSh0cF9saW5rKTtcbitcdGJwZl9saW5rX19kZXN0cm95KGNnX2xpbmspO1xuK1x0bmV0bnNfZnJlZShucyk7XG4rXHRpZiAoY2dyb3VwX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoY2dyb3VwX2ZkKTtcbit9XG4rXG4rLyogVGVzdCBza2JfZXh0IHN1cnZpdmFsIGFjcm9zcyBUQyBpbmdyZXNzIC1cdTAwM2UgbmV0ZmlsdGVyIGhvb2sgKi9cbitzdGF0aWMgdm9pZCB0ZXN0X3NrYl9leHRfbmYoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwsIGNvbnN0IGNoYXIgKm5hbWUpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssXG4rXHRcdCAgICAuaWZpbmRleCA9IDEgLyogSUZJTkRFWF9MTyAqLyxcbitcdFx0ICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuK1x0TElCQlBGX09QVFMoYnBmX25ldGZpbHRlcl9vcHRzLCBuZl9vcHRzLFxuK1x0XHQgICAgLnBmID0gTkZQUk9UT19JUFY0LFxuK1x0XHQgICAgLmhvb2tudW0gPSBORl9JTkVUX0xPQ0FMX0lOLFxuK1x0XHQgICAgLnByaW9yaXR5ID0gMSk7XG4rXHRzdHJ1Y3QgYnBmX2xpbmsgKnJlYWRlcl9saW5rID0gTlVMTDtcbitcdHN0cnVjdCBuZXRuc19vYmogKm5zID0gTlVMTDtcbitcdGludCBzZXJ2ZXJfZmQgPSAtMTtcbitcdGludCByZXQ7XG4rXG4rXHRucyA9IG5ldG5zX25ldyhuYW1lLCB0cnVlKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihucywgXCJuZXRuc19uZXdcIikpXG4rXHRcdHJldHVybjtcbitcbitcdHNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVULCBTT0NLX0RHUkFNLCBcIjEyNy4wLjAuMVwiLCAwLCAwKTtcbitcdGlmICghQVNTRVJUX0dFKHNlcnZlcl9mZCwgMCwgXCJzdGFydF9zZXJ2ZXJcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuK1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19ob29rX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZSk7XG4rXHRyZXQgPSBicGZfdGNfYXR0YWNoKFx1MDAyNnRjX2hvb2ssIFx1MDAyNnRjX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19hdHRhY2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJlYWRlcl9saW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9uZXRmaWx0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5uZl9za2JfZXh0X3JlYWQsXG4rXHRcdFx0XHRcdFx0ICAgIFx1MDAyNm5mX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHJlYWRlcl9saW5rLCBcImF0dGFjaF9uZlwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0aWYgKHNlbmRfbG9vcGJhY2tfdWRwKHNlcnZlcl9mZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCJ0ZXN0X3Bhc3NcIik7XG4rXG4rY2xlYW51cDpcbitcdGJwZl9saW5rX19kZXN0cm95KHJlYWRlcl9saW5rKTtcbitcdGJwZl90Y19ob29rX2Rlc3Ryb3koXHUwMDI2dGNfaG9vayk7XG4rXHRpZiAoc2VydmVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2Uoc2VydmVyX2ZkKTtcbitcdG5ldG5zX2ZyZWUobnMpO1xuK31cbitcbisjZGVmaW5lIExXVF9FWFRfUElOX1BBVEggXCIvc3lzL2ZzL2JwZi9za2JfZXh0X2x3dFwiXG4rXG4rLypcbisgKiBUZXN0IHNrYl9leHQgYWNyb3NzIExXVCBob29rcyBvbiBsb29wYmFjay5cbisgKlxuKyAqIEBsd3RfcHJvZzogIEJQRiBwcm9ncmFtIHRvIHBpbiBhbmQgYXR0YWNoIHZpYSBpcCByb3V0ZSBlbmNhcFxuKyAqIEBlbmNhcF9kaXI6IFwiaW5cIiwgXCJvdXRcIiwgb3IgXCJ4bWl0XCJcbisgKiBAd3JpdGVyOiAgICB0cnVlIGlmIGx3dF9wcm9nIHdyaXRlcyBza2JfZXh0IChyZWFkZXIgb24gVEMgaW5ncmVzcyksXG4rICogICAgICAgICAgICAgZmFsc2UgaWYgbHd0X3Byb2cgcmVhZHMgc2tiX2V4dCAod3JpdGVyIG9uIFRDIGluZ3Jlc3MpXG4rICovXG4rc3RhdGljIHZvaWQgdGVzdF9za2JfZXh0X2x3dChzdHJ1Y3QgdGVzdF94ZHBfbWV0YSAqc2tlbCwgY29uc3QgY2hhciAqbmFtZSxcbitcdFx0XHQgICAgIHN0cnVjdCBicGZfcHJvZ3JhbSAqbHd0X3Byb2csXG4rXHRcdFx0ICAgICBjb25zdCBjaGFyICplbmNhcF9kaXIsIGJvb2wgd3JpdGVyKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl90Y19ob29rLCB0Y19ob29rLFxuK1x0XHQgICAgLmlmaW5kZXggPSAxIC8qIElGSU5ERVhfTE8gKi8sXG4rXHRcdCAgICAuYXR0YWNoX3BvaW50ID0gQlBGX1RDX0lOR1JFU1MpO1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX29wdHMsIHRjX29wdHMsIC5oYW5kbGUgPSAxLCAucHJpb3JpdHkgPSAxKTtcbitcdHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyID0ge1xuK1x0XHQuc2luX2ZhbWlseSA9IEFGX0lORVQsXG4rXHR9O1xuK1x0c3RydWN0IGJwZl9wcm9ncmFtICp0Y19wcm9nO1xuK1x0Y2hhciBidWZbVEVTVF9QQVlMT0FEX0xFTl07XG4rXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XG4rXHRib29sIHBpbm5lZCA9IGZhbHNlO1xuK1x0aW50IHNlcnZlcl9mZCA9IC0xO1xuK1x0aW50IGZkID0gLTE7XG4rXHRpbnQgcG9ydDtcbitcdGludCByZXQ7XG4rXG4rXHR1bmxpbmsoTFdUX0VYVF9QSU5fUEFUSCk7XG4rXHRyZXQgPSBicGZfcHJvZ3JhbV9fcGluKGx3dF9wcm9nLCBMV1RfRVhUX1BJTl9QQVRIKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJwaW4gbHd0XCIpKVxuK1x0XHRyZXR1cm47XG4rXHRwaW5uZWQgPSB0cnVlO1xuK1xuK1x0bnMgPSBuZXRuc19uZXcobmFtZSwgdHJ1ZSk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnMsIFwibmV0bnNfbmV3XCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfcHJlaG9vaztcbitcbitcdFNZUyhjbGVhbnVwLCBcImlwIGFkZHIgYWRkIDEwLjAuMC4xLzMyIGRldiBsb1wiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIHJvdXRlIHJlcGxhY2UgdGFibGUgbG9jYWwgbG9jYWwgMTAuMC4wLjEgXCJcbitcdFx0ICAgICBcImVuY2FwIGJwZiAlcyBwaW5uZWQgXCIgTFdUX0VYVF9QSU5fUEFUSCBcIiBkZXYgbG9cIixcbitcdFx0ICAgICBlbmNhcF9kaXIpO1xuK1xuK1x0c2VydmVyX2ZkID0gc3RhcnRfc2VydmVyKEFGX0lORVQsIFNPQ0tfREdSQU0sIFwiMTAuMC4wLjFcIiwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9HRShzZXJ2ZXJfZmQsIDAsIFwic3RhcnRfc2VydmVyXCIpKVxuK1x0XHRnb3RvIGNsZWFudXBfcHJlaG9vaztcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuK1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19ob29rX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbGVhbnVwX3ByZWhvb2s7XG4rXG4rXHQvKiBXaGVuIExXVCB3cml0ZXMsIFRDIGluZ3Jlc3MgcmVhZHM7IHdoZW4gTFdUIHJlYWRzLCBUQyBpbmdyZXNzIHdyaXRlcyAqL1xuK1x0dGNfcHJvZyA9IHdyaXRlciA/IHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF9yZWFkXG4rXHRcdFx0IDogc2tlbC1cdTAwM2Vwcm9ncy50Y19za2JfZXh0X3dyaXRlO1xuK1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHRjX3Byb2cpO1xuK1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfYXR0YWNoXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRwb3J0ID0gZ2V0X3NvY2tldF9sb2NhbF9wb3J0KHNlcnZlcl9mZCk7XG4rXHRpZiAoIUFTU0VSVF9HRShwb3J0LCAwLCBcImdldF9wb3J0XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcInNvY2tldFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0aW5ldF9wdG9uKEFGX0lORVQsIFwiMTAuMC4wLjFcIiwgXHUwMDI2YWRkci5zaW5fYWRkcik7XG4rXHRhZGRyLnNpbl9wb3J0ID0gcG9ydDtcbitcdHJldCA9IHNlbmR0byhmZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwLFxuK1x0XHQgICAgICh2b2lkICopXHUwMDI2YWRkciwgc2l6ZW9mKGFkZHIpKTtcbitcdGlmICghQVNTRVJUX0VRKHJldCwgVEVTVF9QQVlMT0FEX0xFTiwgXCJzZW5kdG9cIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdHJldCA9IHJlY3Zmcm9tKHNlcnZlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgTlVMTCwgTlVMTCk7XG4rXHRBU1NFUlRfRVEocmV0LCBURVNUX1BBWUxPQURfTEVOLCBcInJlY3Zmcm9tXCIpO1xuK1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcInRlc3RfcGFzc1wiKTtcbitcbitjbGVhbnVwOlxuK1x0aWYgKGZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoZmQpO1xuK1x0YnBmX3RjX2hvb2tfZGVzdHJveShcdTAwMjZ0Y19ob29rKTtcbitjbGVhbnVwX3ByZWhvb2s6XG4rXHRpZiAoc2VydmVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2Uoc2VydmVyX2ZkKTtcbitcdG5ldG5zX2ZyZWUobnMpO1xuK1x0aWYgKHBpbm5lZClcbitcdFx0dW5saW5rKExXVF9FWFRfUElOX1BBVEgpO1xuK31cbitcbisjZGVmaW5lIFNFRzZfUElOX1BBVEggXCIvc3lzL2ZzL2JwZi9za2JfZXh0X3NlZzZsb2NhbFwiXG4rXG4rLypcbisgKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgYWNyb3NzIFRDIGVncmVzcyAtXHUwMDNlIHNlZzZsb2NhbCBFbmQuQlBGIGhvb2suXG4rICpcbisgKiBUb3BvbG9neTpcbisgKlxuKyAqICAgICBOUzEgICAgICAgICAgIE5TMiAgICAgICAgICAgIE5TM1xuKyAqICAgbG8gdmV0aDEgXHUwMDNjLVx1MDAzZSB2ZXRoMiB2ZXRoMyBcdTAwM2MtXHUwMDNlIHZldGg0IGxvXG4rICpcbisgKiBOUzEgZW5jYXBzIGZiMDE6OjIgd2l0aCBTUkggKHNlZ21lbnRzIGZkMDE6OjEsZmQwMTo6Mikgb24gb3V0cHV0IGFuZFxuKyAqIHdyaXRlcyBza2JfZXh0IGF0IFRDIGVncmVzcyBvbiB2ZXRoMS4gTlMyIHJ1bnMgRW5kLkJQRiBmb3IgZmQwMTo6MSxcbisgKiB3aGljaCByZWFkcyBza2JfZXh0LCB0aGVuIGZvcndhcmRzIHRvIE5TMyAoc2VnNl9sb29rdXBfbmV4dGhvcFxuKyAqIHJlamVjdHMgbG9vcGJhY2sgcm91dGVzIHdpdGggbG9jYWxfZGVsaXZlcnk9ZmFsc2UsIHNvIEVuZC5CUEZcbisgKiBjYW5ub3QgZGVsaXZlciBsb2NhbGx5KS4gTlMzIGhhcyBmZDAxOjoyIGxvY2FsLCBkZWNhcHN1bGF0ZXMsIGFuZFxuKyAqIGRlbGl2ZXJzIHRoZSBpbm5lciBVRFAgKGRzdD1mYjAxOjoyKSB0byBhIGxvY2FsIHNvY2tldCBmb3IgdGVzdFxuKyAqIHN5bmNocm9uaXphdGlvbi5cbisgKlxuKyAqIFRoZSBUQyBwcm9ncmFtIGRyb3BzIG5vbi10ZXN0IHBhY2tldHMsIHNvIE5EUCBpcyBieXBhc3NlZCB3aXRoIGFcbisgKiBzdGF0aWMgbmVpZ2hib3IgZW50cnkgb24gdGhlIE5TMS1cdTAwM2VOUzIgaG9wLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF9zZWc2bG9jYWwoc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfRUdSRVNTKTtcbitcdExJQkJQRl9PUFRTKGJwZl90Y19vcHRzLCB0Y19vcHRzLCAuaGFuZGxlID0gMSwgLnByaW9yaXR5ID0gMSk7XG4rXHRzdHJ1Y3QgbnN0b2tlbiAqbnN0b2tlbiA9IE5VTEw7XG4rXHRzdHJ1Y3Qgc29ja2FkZHJfaW42IGRzdCA9IHt9O1xuK1x0Y2hhciBidWZbVEVTVF9QQVlMT0FEX0xFTl07XG4rXHRib29sIHBpbm5lZCA9IGZhbHNlO1xuK1x0aW50IGNsaWVudF9mZCA9IC0xO1xuK1x0aW50IHNlcnZlcl9mZCA9IC0xO1xuK1x0c3NpemVfdCBieXRlcztcbitcdGludCByZXQ7XG4rXG4rXHR1bmxpbmsoU0VHNl9QSU5fUEFUSCk7XG4rXHRyZXQgPSBicGZfcHJvZ3JhbV9fcGluKHNrZWwtXHUwMDNlcHJvZ3Muc2VnNmxvY2FsX3NrYl9leHRfcmVhZCxcbitcdFx0XHQgICAgICAgU0VHNl9QSU5fUEFUSCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwicGluIHNlZzZsb2NhbFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0cGlubmVkID0gdHJ1ZTtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuK1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgbmV0bnMgYWRkIHNlZzZfMVwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIG5ldG5zIGFkZCBzZWc2XzJcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCBuZXRucyBhZGQgc2VnNl8zXCIpO1xuK1xuK1x0LyogTlMxIFx1MDAzYy1cdTAwM2UgTlMyIHZldGggcGFpcjsgc3RhdGljIE5EUCBzaW5jZSBUQyBkcm9wcyBOUy9OQSAqL1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8xIGxpbmsgYWRkIHZldGgxIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDIgbmV0bnMgc2VnNl8yXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8xIGxpbmsgc2V0IGRldiB2ZXRoMSB1cFwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMiBsaW5rIHNldCBkZXYgdmV0aDIgYWRkcmVzcyAwMjowMDowMDowMDowMDowMlwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMiBsaW5rIHNldCBkZXYgdmV0aDIgdXBcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzEgLTYgYWRkciBhZGQgZmIwMDo6MTIvMTYgZGV2IHZldGgxIHNjb3BlIGxpbmsgbm9kYWRcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzIgLTYgYWRkciBhZGQgZmIwMDo6MjEvMTYgZGV2IHZldGgyIHNjb3BlIGxpbmsgbm9kYWRcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzEgLTYgbmVpZ2ggYWRkIGZiMDA6OjIxIGxsYWRkciAwMjowMDowMDowMDowMDowMiBcIlxuK1x0XHQgICAgIFwibnVkIHBlcm1hbmVudCBkZXYgdmV0aDFcIik7XG4rXG4rXHQvKiBOUzIgXHUwMDNjLVx1MDAzZSBOUzMgdmV0aCBwYWlyICovXG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzIgbGluayBhZGQgdmV0aDMgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2ZXRoNCBuZXRucyBzZWc2XzNcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzIgbGluayBzZXQgZGV2IHZldGgzIHVwXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8zIGxpbmsgc2V0IGRldiB2ZXRoNCB1cFwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMiAtNiBhZGRyIGFkZCBmYjAwOjozNC8xNiBkZXYgdmV0aDMgc2NvcGUgbGluayBub2RhZFwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMyAtNiBhZGRyIGFkZCBmYjAwOjo0My8xNiBkZXYgdmV0aDQgc2NvcGUgbGluayBub2RhZFwiKTtcbitcbitcdC8qIE5TMTogc291cmNlIGFkZHJlc3MgKyBTUkggZW5jYXAgb24gb3V0cHV0ICsgcm91dGUgZm9yIGZkMDE6Oi8xNiAqL1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8xIGxpbmsgc2V0IGRldiBsbyB1cFwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC1uIHNlZzZfMSAtNiBhZGRyIGFkZCBmYjAxOjoxLzEyOCBkZXYgbG8gbm9kYWRcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtbiBzZWc2XzEgLTYgcm91dGUgYWRkIGZiMDE6OjIgZW5jYXAgc2VnNiBtb2RlIGVuY2FwIFwiXG4rXHRcdCAgICAgXCJzZWdzIGZkMDE6OjEsZmQwMTo6MiBkZXYgdmV0aDEgdmlhIGZiMDA6OjIxXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgLW4gc2VnNl8xIC02IHJvdXRlIGFkZCBmZDAxOjovMTYgZGV2IHZldGgxIHZpYSBmYjAwOjoyMVwiKTtcbitcbitcdC8qIE5TMjogc2VnNmxvY2FsIEVuZC5CUEYgZm9yIGZkMDE6OjEsIHRoZW4gZm9yd2FyZCB0byBOUzMuXG4rXHQgKiBVc2Ugb3Blbl9uZXRucyBzbyB0aGUgcGlubmVkIHByb2cgb24gYnBmZnMgaXMgYWNjZXNzaWJsZS5cbitcdCAqL1xuK1x0bnN0b2tlbiA9IG9wZW5fbmV0bnMoXCJzZWc2XzJcIik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnN0b2tlbiwgXCJvcGVuIHNlZzZfMlwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgbGluayBzZXQgZGV2IGxvIHVwXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwic3lzY3RsIC13cSBuZXQuaXB2Ni5jb25mLmFsbC5mb3J3YXJkaW5nPTFcIik7XG4rXHRTWVMoY2xlYW51cCwgXCJpcCAtNiByb3V0ZSBhZGQgZmQwMTo6Mi8xMjggZGV2IHZldGgzIHZpYSBmYjAwOjo0M1wiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC02IHJvdXRlIGFkZCBmZDAxOjoxIGVuY2FwIHNlZzZsb2NhbCBcIlxuK1x0XHQgICAgIFwiYWN0aW9uIEVuZC5CUEYgZW5kcG9pbnQgcGlubmVkIFwiIFNFRzZfUElOX1BBVEggXCIgZGV2IHZldGgyXCIpO1xuK1xuK1x0Y2xvc2VfbmV0bnMobnN0b2tlbik7XG4rXHRuc3Rva2VuID0gTlVMTDtcbitcbitcdC8qIE5TMzogZGVjYXAgcG9pbnQgKyBVRFAgc2VydmVyLlxuK1x0ICogZmQwMTo6MiBsb2NhbCB0cmlnZ2VycyBTUkggZGVjYXAgKHNlZ21lbnRzX2xlZnQ9MCkuXG4rXHQgKiBmYjAxOjoyIGxvY2FsIGRlbGl2ZXJzIHRoZSBpbm5lciBVRFAgdG8gdGhlIHNvY2tldC5cbitcdCAqL1xuK1x0bnN0b2tlbiA9IG9wZW5fbmV0bnMoXCJzZWc2XzNcIik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIobnN0b2tlbiwgXCJvcGVuIHNlZzZfM1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0U1lTKGNsZWFudXAsIFwiaXAgbGluayBzZXQgZGV2IGxvIHVwXCIpO1xuK1x0U1lTKGNsZWFudXAsIFwic3lzY3RsIC13cSBuZXQuaXB2Ni5jb25mLmFsbC5zZWc2X2VuYWJsZWQ9MVwiKTtcbitcdFNZUyhjbGVhbnVwLCBcInN5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi5sby5zZWc2X2VuYWJsZWQ9MVwiKTtcbitcdFNZUyhjbGVhbnVwLCBcInN5c2N0bCAtd3EgbmV0LmlwdjYuY29uZi52ZXRoNC5zZWc2X2VuYWJsZWQ9MVwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC02IGFkZHIgYWRkIGZkMDE6OjIvMTI4IGRldiBsbyBub2RhZFwiKTtcbitcdFNZUyhjbGVhbnVwLCBcImlwIC02IGFkZHIgYWRkIGZiMDE6OjIvMTI4IGRldiBsbyBub2RhZFwiKTtcbitcbitcdHNlcnZlcl9mZCA9IHN0YXJ0X3NlcnZlcihBRl9JTkVUNiwgU09DS19ER1JBTSwgXCJmYjAxOjoyXCIsIDEyMzQsIDApO1xuK1x0aWYgKCFBU1NFUlRfR0Uoc2VydmVyX2ZkLCAwLCBcInN0YXJ0X3NlcnZlclwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0Y2xvc2VfbmV0bnMobnN0b2tlbik7XG4rXHRuc3Rva2VuID0gTlVMTDtcbitcbitcdC8qIE5TMTogd3JpdGUgc2tiX2V4dCBhdCBUQyBlZ3Jlc3Mgb24gdmV0aDEsIHRoZW4gc2VuZC5cbitcdCAqIFRDIGVncmVzcyBmaXJlcyBhZnRlciBzZWc2IGVuY2FwLCBvbiB0aGUgZW5jYXBwZWQgcGFja2V0LlxuK1x0ICovXG4rXHRuc3Rva2VuID0gb3Blbl9uZXRucyhcInNlZzZfMVwiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihuc3Rva2VuLCBcIm9wZW4gc2VnNl8xXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHR0Y19ob29rLmlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChcInZldGgxXCIpO1xuK1x0aWYgKCFBU1NFUlRfR1QodGNfaG9vay5pZmluZGV4LCAwLCBcImlmaW5kZXggdmV0aDFcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGJwZl90Y19ob29rX2NyZWF0ZShcdTAwMjZ0Y19ob29rKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfaG9va19jcmVhdGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHRjX29wdHMucHJvZ19mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLnRjX3NrYl9leHRfd3JpdGUpO1xuK1x0cmV0ID0gYnBmX3RjX2F0dGFjaChcdTAwMjZ0Y19ob29rLCBcdTAwMjZ0Y19vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJicGZfdGNfYXR0YWNoXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRjbGllbnRfZmQgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApO1xuK1x0aWYgKCFBU1NFUlRfR0UoY2xpZW50X2ZkLCAwLCBcInNvY2tldFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0ZHN0LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7XG4rXHRkc3Quc2luNl9wb3J0ID0gaHRvbnMoMTIzNCk7XG4rXHRpbmV0X3B0b24oQUZfSU5FVDYsIFwiZmIwMTo6MlwiLCBcdTAwMjZkc3Quc2luNl9hZGRyKTtcbitcbitcdGJ5dGVzID0gc2VuZHRvKGNsaWVudF9mZCwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwLFxuK1x0XHQgICAgICAgKHZvaWQgKilcdTAwMjZkc3QsIHNpemVvZihkc3QpKTtcbitcbitcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xuK1x0bnN0b2tlbiA9IE5VTEw7XG4rXG4rXHRpZiAoIUFTU0VSVF9FUShieXRlcywgVEVTVF9QQVlMT0FEX0xFTiwgXCJzZW5kdG9cIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qIFJlY2VpdmUgZGVjYXBzdWxhdGVkIHBhY2tldCAtLSBzeW5jaHJvbml6ZXMgd2l0aCBzZWc2bG9jYWwgKi9cbitcdG5zdG9rZW4gPSBvcGVuX25ldG5zKFwic2VnNl8zXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKG5zdG9rZW4sIFwib3BlbiBzZWc2XzNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGJ5dGVzID0gcmVjdmZyb20oc2VydmVyX2ZkLCBidWYsIHNpemVvZihidWYpLCAwLCBOVUxMLCBOVUxMKTtcbitcdEFTU0VSVF9FUShieXRlcywgVEVTVF9QQVlMT0FEX0xFTiwgXCJyZWN2ZnJvbVwiKTtcbitcdEFTU0VSVF9UUlVFKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcywgXCJ0ZXN0X3Bhc3NcIik7XG4rXG4rY2xlYW51cDpcbitcdGNsb3NlX25ldG5zKG5zdG9rZW4pO1xuK1x0aWYgKHNlcnZlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHNlcnZlcl9mZCk7XG4rXHRpZiAoY2xpZW50X2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoY2xpZW50X2ZkKTtcbitcdFNZU19OT0ZBSUwoXCJpcCBuZXRucyBkZWwgc2VnNl8zXCIpO1xuK1x0U1lTX05PRkFJTChcImlwIG5ldG5zIGRlbCBzZWc2XzJcIik7XG4rXHRTWVNfTk9GQUlMKFwiaXAgbmV0bnMgZGVsIHNlZzZfMVwiKTtcbitcdGlmIChwaW5uZWQpXG4rXHRcdHVubGluayhTRUc2X1BJTl9QQVRIKTtcbit9XG4rXG4rLypcbisgKiBUZXN0IHNrYl9leHQgc3Vydml2YWwgYWNyb3NzIFRDIGluZ3Jlc3MgLVx1MDAzZSBza19za2IgdmVyZGljdCBob29rLiAgVEMgaW5ncmVzc1xuKyAqIHdyaXRlcyBza2JfZXh0IG9uIGxvb3BiYWNrOyB0aGUgdmVyZGljdCBwcm9ncmFtIHJlYWRzIGl0IG9uIHNrYiBkZWxpdmVyeSB0byBhXG4rICogc29ja2V0IGluIHRoZSBzb2NrbWFwLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHRlc3Rfc2tiX2V4dF9za19za2Ioc3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwpXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX3RjX2hvb2ssIHRjX2hvb2ssXG4rXHRcdCAgICAuaWZpbmRleCA9IDEgLyogSUZJTkRFWF9MTyAqLyxcbitcdFx0ICAgIC5hdHRhY2hfcG9pbnQgPSBCUEZfVENfSU5HUkVTUyk7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGNfb3B0cywgdGNfb3B0cywgLmhhbmRsZSA9IDEsIC5wcmlvcml0eSA9IDEpO1xuK1x0c3RydWN0IGJwZl9saW5rICp2ZXJkaWN0X2xpbmsgPSBOVUxMO1xuK1x0c3RydWN0IHNvY2thZGRyX2luIGFkZHI7XG4rXHRzb2NrbGVuX3QgYWRkcl9sZW4gPSBzaXplb2YoYWRkcik7XG4rXHRzdHJ1Y3QgbmV0bnNfb2JqICpucyA9IE5VTEw7XG4rXHRjaGFyIGJ1ZltURVNUX1BBWUxPQURfTEVOXTtcbitcdGludCBjMSA9IC0xLCBwMSA9IC0xO1xuK1x0aW50IG1hcCA9IC0xLCB6ZXJvID0gMDtcbitcdHNzaXplX3QgbjtcbitcdGludCByZXQ7XG4rXG4rXHRucyA9IG5ldG5zX25ldyhcInRjX3RvX3NrX3NrYlwiLCB0cnVlKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihucywgXCJuZXRuc19uZXdcIikpXG4rXHRcdHJldHVybjtcbitcbitcdHNrZWwtXHUwMDNlYnNzLVx1MDAzZXRlc3RfcGFzcyA9IGZhbHNlO1xuK1xuK1x0cmV0ID0gYnBmX3RjX2hvb2tfY3JlYXRlKFx1MDAyNnRjX2hvb2spO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImJwZl90Y19ob29rX2NyZWF0ZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0dGNfb3B0cy5wcm9nX2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MudGNfc2tiX2V4dF93cml0ZV9wb3J0KTtcbitcdHJldCA9IGJwZl90Y19hdHRhY2goXHUwMDI2dGNfaG9vaywgXHUwMDI2dGNfb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiYnBmX3RjX2F0dGFjaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0bWFwID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1NPQ0tNQVAsIE5VTEwsIHNpemVvZihpbnQpLFxuK1x0XHRcdCAgICAgc2l6ZW9mKGludCksIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfR0UobWFwLCAwLCBcImJwZl9tYXBfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHR2ZXJkaWN0X2xpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX3NvY2ttYXAoc2tlbC1cdTAwM2Vwcm9ncy5za19za2Jfc2tiX2V4dF9yZWFkLFxuK1x0XHRcdFx0XHRcdCAgIG1hcCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIodmVyZGljdF9saW5rLCBcImF0dGFjaF9zb2NrbWFwXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhjcmVhdGVfcGFpcihBRl9JTkVULCBTT0NLX1NUUkVBTSwgXHUwMDI2YzEsIFx1MDAyNnAxKSwgXCJjcmVhdGVfcGFpclwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShtYXAsIFx1MDAyNnplcm8sIFx1MDAyNmMxLCBCUEZfTk9FWElTVCksIFwibWFwX3VwZGF0ZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0soZ2V0c29ja25hbWUoYzEsIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZhZGRyLCBcdTAwMjZhZGRyX2xlbiksXG4rXHRcdCAgICAgICBcImdldHNvY2tuYW1lXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRza2VsLVx1MDAzZWJzcy1cdTAwM2V0YXJnZXRfcG9ydCA9IGFkZHIuc2luX3BvcnQ7XG4rXG4rXHRuID0gc2VuZChwMSwgdGVzdF9wYXlsb2FkLCBURVNUX1BBWUxPQURfTEVOLCAwKTtcbitcdGlmICghQVNTRVJUX0VRKG4sIFRFU1RfUEFZTE9BRF9MRU4sIFwic2VuZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0biA9IHJlY3ZfdGltZW91dChjMSwgYnVmLCBzaXplb2YoYnVmKSwgTVNHX0RPTlRXQUlULCBJT19USU1FT1VUX1NFQyk7XG4rXHRBU1NFUlRfRVEobiwgVEVTVF9QQVlMT0FEX0xFTiwgXCJyZWN2XCIpO1xuK1x0QVNTRVJUX1RSVUUoc2tlbC1cdTAwM2Vic3MtXHUwMDNldGVzdF9wYXNzLCBcInRlc3RfcGFzc1wiKTtcbitcbitjbGVhbnVwOlxuK1x0aWYgKGMxIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoYzEpO1xuK1x0aWYgKHAxIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UocDEpO1xuK1x0YnBmX2xpbmtfX2Rlc3Ryb3kodmVyZGljdF9saW5rKTtcbitcdGlmIChtYXAgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShtYXApO1xuK1x0YnBmX3RjX2hvb2tfZGVzdHJveShcdTAwMjZ0Y19ob29rKTtcbitcdG5ldG5zX2ZyZWUobnMpO1xuK31cbitcbit2b2lkIHRlc3Rfc2tiX2V4dF9jcm9zc19ob29rKHZvaWQpXG4re1xuK1x0c3RydWN0IHRlc3RfeGRwX21ldGEgKnNrZWwgPSBOVUxMO1xuK1xuK1x0c2tlbCA9IHRlc3RfeGRwX21ldGFfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm9wZW4gYW5kIGxvYWQgc2tlbGV0b25cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfdG9fY2dycF9pbmdyZXNzXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfdWRwKHNrZWwsIFwidGNfdG9fY2dycF9pbmdyZXNzXCIsIFJFQURFUl9DR1JQX1NLQik7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3RvX3NrX2ZpbHRlclwiKSlcbitcdFx0dGVzdF9za2JfZXh0X3VkcChza2VsLCBcInRjX3RvX3NrX2ZpbHRlclwiLCBSRUFERVJfU0tfRklMVEVSKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfdG9fbHNtXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfdGNwKHNrZWwsIFwidGNfdG9fbHNtXCIsIFJFQURFUl9MU00pO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0Y190b19za29wc1wiKSlcbitcdFx0dGVzdF9za2JfZXh0X3RjcChza2VsLCBcInRjX3RvX3Nrb3BzXCIsIFJFQURFUl9TS09QUyk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImNncnBfZWdyZXNzX3RvX2tmcmVlX3NrYlwiKSlcbitcdFx0dGVzdF9jZ3JwX2VncmVzc190b19rZnJlZV9za2Ioc2tlbCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInRjX3RvX25mXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfbmYoc2tlbCwgXCJ0Y190b19uZlwiKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfdG9fbHd0X2luXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfbHd0KHNrZWwsIFwidGNfdG9fbHd0X2luXCIsXG4rXHRcdFx0XHQgc2tlbC1cdTAwM2Vwcm9ncy5sd3RfaW5fc2tiX2V4dF9yZWFkLCBcImluXCIsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibHd0X291dF90b190Y1wiKSlcbitcdFx0dGVzdF9za2JfZXh0X2x3dChza2VsLCBcImx3dF9vdXRfdG9fdGNcIixcbitcdFx0XHRcdCBza2VsLVx1MDAzZXByb2dzLmx3dF9vdXRfc2tiX2V4dF93cml0ZSwgXCJvdXRcIiwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImx3dF94bWl0X3RvX3RjXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfbHd0KHNrZWwsIFwibHd0X3htaXRfdG9fdGNcIixcbitcdFx0XHRcdCBza2VsLVx1MDAzZXByb2dzLmx3dF94bWl0X3NrYl9leHRfd3JpdGUsIFwieG1pdFwiLCB0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwidGNfdG9fc2VnNmxvY2FsXCIpKVxuK1x0XHR0ZXN0X3NrYl9leHRfc2VnNmxvY2FsKHNrZWwpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0Y190b19za19za2JcIikpXG4rXHRcdHRlc3Rfc2tiX2V4dF9za19za2Ioc2tlbCk7XG4rXG4rXHR0ZXN0X3hkcF9tZXRhX19kZXN0cm95KHNrZWwpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuY1xuaW5kZXggMDhiMDNiZTBiODkxYy4uODBjZGZlZTYxNWNjYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmNcbkBAIC0zLDkgKzMsMTEgQEBcbiBcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2VuZGlhbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcImJwZl9rZnVuY3MuaFwiXG4rI2luY2x1ZGUgXCJicGZfbWlzYy5oXCJcbiAjaW5jbHVkZSBcImJwZl90cmFjaW5nX25ldC5oXCJcbiBcbiAjZGVmaW5lIE1FVEFfU0laRSAzMlxuQEAgLTIyLDEwICsyNCwxMCBAQFxuIGJvb2wgdGVzdF9wYXNzO1xuIFxuIHN0YXRpYyBjb25zdCBfX3U4IG1ldGFfd2FudFtNRVRBX1NJWkVdID0ge1xuLVx0MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCxcbi1cdDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsXG4tXHQweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LFxuLVx0MHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCxcbitcdDB4NDksIDB4MjAsIDB4NjMsIDB4NzIsIDB4NmYsIDB4NzMsIDB4NzMsIDB4NjUsXG4rXHQweDY0LCAweDIwLCAweDY4LCAweDZmLCAweDZmLCAweDZiLCAweDczLCAweDIwLFxuK1x0MHgyNiwgMHgyMCwgMHg2YywgMHg2OSwgMHg3NiwgMHg2NSwgMHg2NCwgMHgyMCxcbitcdDB4NzQsIDB4NmYsIDB4MjAsIDB4NzQsIDB4NjUsIDB4NmMsIDB4NmMsIDB4MjEsXG4gfTtcbiBcbiBzdGF0aWMgYm9vbCBjaGVja19tZXRhZGF0YShjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgX191OCAqbWV0YV9oYXZlKVxuQEAgLTY4OSw0ICs2OTEsNTYzIEBAIGludCBoZWxwZXJfc2tiX2NoYW5nZV9wcm90byhzdHJ1Y3QgX19za19idWZmICpjdHgpXG4gXHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4gfVxuIFxuK2Jvb2wgd3JpdGVfZG9uZTtcbitcbisvKiBXcml0ZSB0byBza2JfZXh0IHVzaW5nIGJwZl9keW5wdHJfd3JpdGUgaGVscGVyICovXG4rU0VDKFwidGNcIilcbitpbnQgdGNfc2tiX2V4dF93cml0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgQVJSQVlfU0laRShtZXRhX3dhbnQpLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0d3JpdGVfZG9uZSA9IHRydWU7XG4rXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbit9XG4rXG4rLyogUmVhZCBmcm9tIHNrYi1leHQgbWV0YWRhdGEgdXNpbmcgYnBmX2R5bnB0cl9yZWFkIGhlbHBlciAqL1xuK1NFQyhcInRjXCIpXG4raW50IHRjX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIEFSUkFZX1NJWkUobWV0YV9oYXZlKSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK31cbitcbisvKiBSZWFkIGZyb20gYSBjbG9uZWQgc2tiX2V4dCBkeW5wdHIgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X2Nsb25lX3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGEsIGNsb25lO1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl9jbG9uZShcdTAwMjZtZXRhLCBcdTAwMjZjbG9uZSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBBUlJBWV9TSVpFKG1ldGFfaGF2ZSksIFx1MDAyNmNsb25lLCAwLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rfVxuK1xuKy8qIFJlYWQgZnJvbSBza2JfZXh0IHVzaW5nIGJwZl9keW5wdHJfc2xpY2UgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X3NsaWNlX3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXHRfX3U4ICptZXRhX2hhdmU7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0bWV0YV9oYXZlID0gYnBmX2R5bnB0cl9zbGljZShcdTAwMjZtZXRhLCAwLCBOVUxMLCBNRVRBX1NJWkUpO1xuK1x0aWYgKCFtZXRhX2hhdmUpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK31cbitcbisvKiBXcml0ZSB0byBza2JfZXh0IHVzaW5nIGJwZl9keW5wdHJfc2xpY2VfcmR3ciAqL1xuK1NFQyhcInRjXCIpXG4raW50IHRjX3NrYl9leHRfc2xpY2Vfd3JpdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXHRfX3U4ICpkc3Q7XG4rXG4rXHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0ZHN0ID0gYnBmX2R5bnB0cl9zbGljZV9yZHdyKFx1MDAyNm1ldGEsIDAsIE5VTEwsIE1FVEFfU0laRSk7XG4rXHRpZiAoIWRzdClcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0X19idWlsdGluX21lbWNweShkc3QsIG1ldGFfd2FudCwgTUVUQV9TSVpFKTtcbitcbitcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK31cbitcbisvKiBPcGVuaW5nIHNrYl9leHQgd2l0aG91dCBGX0NSRUFURSBvbiBhIGZyZXNoIHNrYiBzaG91bGQgZmFpbCAqL1xuK1NFQyhcInRjXCIpXG4raW50IHRjX3NrYl9leHRfbm9fYWxsb2Moc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIDAsIFx1MDAyNm1ldGEpICE9IC1FTk9FTlQpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbit9XG4rXG4rLyogSW52YWxpZCBmbGFncyBhcmUgcmVqZWN0ZWQgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X2ludmFsaWRfZmxhZ3Moc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIH4wVUxMLCBcdTAwMjZtZXRhKSAhPSAtRUlOVkFMKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rfVxuK1xuKy8qIFdpdGhvdXQgRl9DUkVBVEUgdGhlIGR5bnB0ciBpcyByZWFkLW9ubHkgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X3Jkb25seShzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdC8qIENyZWF0ZSBhbmQgcG9wdWxhdGUgdGhlIGV4dCAqL1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0LyogUmVvcGVuIHdpdGhvdXQgRl9DUkVBVEUgLS0gc2hvdWxkIGJlIHJlYWQtb25seSAqL1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdC8qIFZlcmlmeSByZWFkLW9ubHk6IHdyaXRlcyBtdXN0IGZhaWwsIHJlYWRzIG11c3Qgd29yayAqL1xuK1x0aWYgKCFicGZfZHlucHRyX2lzX3Jkb25seShcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKCFicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rfVxuK1xuKy8qIERvdWJsZSBhbGxvYzogZGF0YSBmcm9tIGZpcnN0IGFsbG9jIHN1cnZpdmVzIHNlY29uZCBza2JfZXh0X2FkZCAqL1xuK1NFQyhcInRjXCIpXG4raW50IHRjX3NrYl9leHRfZG91YmxlX2FsbG9jKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmICghaXNfdGVzdF9wYWNrZXRfdGMoY3R4KSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0LyogRmlyc3QgYWxsb2MgKyB3cml0ZSAqL1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0LyogU2Vjb25kIGFsbG9jIC0tIHNrYl9leHRfYWRkIHJldHVybnMgZXhpc3RpbmcgZXh0ICovXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbit9XG4rXG4rc3RhdGljIGNvbnN0IF9fdTggbWV0YV96ZXJvW01FVEFfU0laRV0gPSB7fTtcbitcbitib29sIGNsb25lX2Nvd19kb25lO1xuK1xuKy8qXG4rICogT3ZlcndyaXRlIHNrYl9leHQgb24gdGhlIGNsb25lIHZpYSBGX0NSRUFURSAoQ09XKSAtLSBtdXN0IG5vdCBhZmZlY3Qgb3JpZ2luYWwuXG4rICogUnVucyBvbiB0aGUgZHVtbXkgaW5ncmVzcyAoY2xvbmUgc2lkZSksIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRjIG1pcnJlZC5cbisgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X2Nsb25lX3JlZGlyX2NvdyhzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0LyogWmVybyBvdXQgdGhlIGNsb25lJ3MgZXh0IC0tIG11c3Qgbm90IGFmZmVjdCBvcmlnaW5hbCAqL1xuK1x0aWYgKGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3plcm8sIE1FVEFfU0laRSwgMCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcbitcdGNsb25lX2Nvd19kb25lID0gdHJ1ZTtcbitcdHJldHVybiBUQ19BQ1RfU0hPVDtcbit9XG4rXG4rLypcbisgKiBWZXJpZnkgQ09XIGlzb2xhdGlvbiBhdCBrZnJlZV9za2IgdGltZTogb25jZSBjbG9uZV9jb3dfZG9uZSBpcyBzZXQsXG4rICogY2hlY2sgdGhhdCB0aGUgb3JpZ2luYWwgc2tiIHN0aWxsIGhhcyBtZXRhX3dhbnQuXG4rICovXG4rU0VDKFwidHBfYnRmL2tmcmVlX3NrYlwiKVxuK2ludCBCUEZfUFJPRyh0cF9rZnJlZV9za2JfY293X2NoZWNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuK3tcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKCFjbG9uZV9jb3dfZG9uZSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsIDAsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gMDtcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuK1x0XHRyZXR1cm4gMDtcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK19fdTMyIGNsb25lX3JlZGlyX2lmaW5kZXg7XG4rYm9vbCB3cml0ZV9ibG9ja2VkO1xuK1xuKy8qXG4rICogV3JpdGUgc2tiX2V4dCwgY2xvbmUgdGhlIHNrYiB0byBhIGRlbGF5ZWQgcWRpc2Mgc28gdGhlIGNsb25lIGtlZXBzIHRoZSBleHRcbisgKiBibG9jayBzaGFyZWQsIHRoZW4gdHJ5IHRvIHdyaXRlIHRvIHRoZSBzYW1lIGR5bnB0ciBhZ2Fpbi4gVGhlIHdyaXRlIG11c3QgZmFpbFxuKyAqIHdpdGggLUVCVVNZLiBSZS1hY3F1aXJpbmcgdGhlIGR5bnB0ciB3aXRoIEZfQ1JFQVRFIENPV3MgdGhlIGJsb2NrIGFuZFxuKyAqIHN1Y2NlZWRzLlxuKyAqL1xuK1NFQyhcInRjXCIpXG4raW50IHRjX3NrYl9leHRfd3JpdGVfYWZ0ZXJfY2xvbmVfcmVkaXIoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0aWYgKGJwZl9jbG9uZV9yZWRpcmVjdChjdHgsIGNsb25lX3JlZGlyX2lmaW5kZXgsIDAgLyogZWdyZXNzICovKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0LyogZXh0IG5vdyBzaGFyZWQgd2l0aCB0aGUgcXVldWVkIGNsb25lIC0tIHdyaXRlIG11c3QgZmFpbCAqL1xuK1x0aWYgKGJwZl9keW5wdHJfd3JpdGUoXHUwMDI2bWV0YSwgMCwgKHZvaWQgKiltZXRhX3plcm8sIE1FVEFfU0laRSwgMCkgIT0gLUVCVVNZKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHQvKiBSZS1hY3F1aXJpbmcgQ09XcyB0aGUgYmxvY2sgLS0gd3JpdGUgbXVzdCBzdWNjZWVkICovXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfU0hPVDtcbitcdGlmIChicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV96ZXJvLCBNRVRBX1NJWkUsIDApKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXG4rXHR3cml0ZV9ibG9ja2VkID0gdHJ1ZTtcbitcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK31cbitcbisvKlxuKyAqIFNhbWUgYXMgYWJvdmUgYnV0IHVzaW5nIGJwZl9keW5wdHJfc2xpY2VfcmR3ci5cbisgKi9cbitTRUMoXCJ0Y1wiKVxuK2ludCB0Y19za2JfZXh0X3NsaWNlX3dyaXRlX2FmdGVyX2Nsb25lX3JlZGlyKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1x0dm9pZCAqc2xpY2U7XG4rXG4rXHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4rXHRcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRpZiAoYnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0aWYgKGJwZl9jbG9uZV9yZWRpcmVjdChjdHgsIGNsb25lX3JlZGlyX2lmaW5kZXgsIDAgLyogZWdyZXNzICovKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0LyogZXh0IG5vdyBzaGFyZWQgd2l0aCB0aGUgcXVldWVkIGNsb25lIC0tIHNsaWNlIG11c3QgZmFpbCAqL1xuK1x0c2xpY2UgPSBicGZfZHlucHRyX3NsaWNlX3Jkd3IoXHUwMDI2bWV0YSwgMCwgTlVMTCwgTUVUQV9TSVpFKTtcbitcdGlmIChzbGljZSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1xuK1x0LyogUmUtYWNxdWlyaW5nIENPV3MgdGhlIGJsb2NrIC0tIHNsaWNlIG11c3Qgc3VjY2VlZCAqL1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gVENfQUNUX1NIT1Q7XG4rXHRzbGljZSA9IGJwZl9keW5wdHJfc2xpY2VfcmR3cihcdTAwMjZtZXRhLCAwLCBOVUxMLCBNRVRBX1NJWkUpO1xuK1x0aWYgKCFzbGljZSlcbitcdFx0cmV0dXJuIFRDX0FDVF9TSE9UO1xuK1x0X19idWlsdGluX21lbWNweShzbGljZSwgbWV0YV96ZXJvLCBNRVRBX1NJWkUpO1xuK1xuK1x0d3JpdGVfYmxvY2tlZCA9IHRydWU7XG4rXHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbit9XG4rXG4rLyogUmVhZCBza2JfZXh0IGZyb20gY2dyb3VwL3NrYiBpbmdyZXNzIC0tIHRlc3RzIGNyb3NzLWhvb2sgc3Vydml2YWwgKi9cbitTRUMoXCJjZ3JvdXBfc2tiL2luZ3Jlc3NcIilcbitpbnQgY2dycF9za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAxO1xuK1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4rXHRcdHJldHVybiAxO1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gMTtcbit9XG4rXG4rX19iZTE2IHRhcmdldF9wb3J0O1xuK1xuKyNkZWZpbmUgVENQVjRfSERSX09GRlx0KHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKVxuKyNkZWZpbmUgVENQVjRfU1BPUlRfT0ZGXHQoVENQVjRfSERSX09GRiArIG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIHNvdXJjZSkpXG4rI2RlZmluZSBUQ1BWNF9EUE9SVF9PRkZcdChUQ1BWNF9IRFJfT0ZGICsgb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgZGVzdCkpXG4rXG4rLyogV3JpdGUgc2tiX2V4dCBvbiBUQ1AgcGFja2V0cyB0by9mcm9tIHRhcmdldF9wb3J0ICovXG4rU0VDKFwidGNcIilcbitpbnQgdGNfc2tiX2V4dF93cml0ZV9wb3J0KHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1x0X19iZTE2IHNwb3J0LCBkcG9ydDtcbitcbitcdGlmIChjdHgtXHUwMDNlcHJvdG9jb2wgIT0gX19icGZfY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKVxuK1x0XHRyZXR1cm4gVENfQUNUX1VOU1BFQztcbitcdGlmIChicGZfc2tiX2xvYWRfYnl0ZXMoY3R4LCBUQ1BWNF9TUE9SVF9PRkYsIFx1MDAyNnNwb3J0LCBzaXplb2Yoc3BvcnQpKSlcbitcdFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rXHRpZiAoYnBmX3NrYl9sb2FkX2J5dGVzKGN0eCwgVENQVjRfRFBPUlRfT0ZGLCBcdTAwMjZkcG9ydCwgc2l6ZW9mKGRwb3J0KSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK1x0aWYgKHNwb3J0ICE9IHRhcmdldF9wb3J0IFx1MDAyNlx1MDAyNiBkcG9ydCAhPSB0YXJnZXRfcG9ydClcbitcdFx0cmV0dXJuIFRDX0FDVF9VTlNQRUM7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK1x0YnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgTUVUQV9TSVpFLCAwKTtcbitcbitcdHJldHVybiBUQ19BQ1RfVU5TUEVDO1xuK31cbitcbisvKiBSZWFkIHNrYl9leHQgZnJvbSBzb2NrX29wcyBwYXNzaXZlIGVzdGFibGlzaGVkIC0tIHRlc3RzIFRDIC1cdTAwM2Ugc29ja19vcHMgcGF0aCAqL1xuK1NFQyhcInNvY2tvcHNcIilcbitpbnQgc2tvcHNfc2tiX2V4dF9yZWFkKHN0cnVjdCBicGZfc29ja19vcHMgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX3NvY2tfb3BzX2tlcm4gKmtjdHg7XG4rXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcdHN0cnVjdCBza19idWZmICpza2I7XG4rXG4rXHRpZiAoY3R4LVx1MDAzZW9wICE9IEJQRl9TT0NLX09QU19QQVNTSVZFX0VTVEFCTElTSEVEX0NCKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdGtjdHggPSBicGZfY2FzdF90b19rZXJuX2N0eChjdHgpO1xuK1x0c2tiID0ga2N0eC1cdTAwM2Vza2I7XG4rXHRpZiAoIXNrYilcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsIDAsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gMTtcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuK1x0XHRyZXR1cm4gMTtcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHR0ZXN0X3Bhc3MgPSB0cnVlO1xuK1x0cmV0dXJuIDE7XG4rfVxuK1xuKy8qIFJlYWQgc2tiX2V4dCBmcm9tIExTTSBpbmV0X2Nvbm5fZXN0YWJsaXNoZWQgLS0gdGVzdHMgVEMgLVx1MDAzZSBMU00gcGF0aCAqL1xuK1NFQyhcImxzbS9pbmV0X2Nvbm5fZXN0YWJsaXNoZWRcIilcbitpbnQgQlBGX1BST0cobHNtX3NrYl9leHRfcmVhZCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuK3tcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCAwLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiAwO1xuK31cbitcbisvKiBSZWFkIHNrYl9leHQgZnJvbSBzb2NrZXQgZmlsdGVyIC0tIHRlc3RzIFRDIC1cdTAwM2Ugc2tfZmlsdGVyIHBhdGggKi9cbitTRUMoXCJzb2NrZXRcIilcbitpbnQgc2tfZmlsdGVyX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIWNoZWNrX21ldGFkYXRhKG1ldGFfaGF2ZSkpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitvdXQ6XG4rXHRyZXR1cm4gY3R4LVx1MDAzZWxlbjtcbit9XG4rXG4rLyogV3JpdGUgc2tiX2V4dCBmcm9tIGNncm91cC9za2IgZWdyZXNzICovXG4rU0VDKFwiY2dyb3VwX3NrYi9lZ3Jlc3NcIilcbitpbnQgY2dycF9za2JfZXh0X3dyaXRlKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIDE7XG4rXHRicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBNRVRBX1NJWkUsIDApO1xuK1xuK1x0cmV0dXJuIDE7XG4rfVxuK1xuKy8qIFJlYWQgc2tiX2V4dCBmcm9tIHRwX2J0Zi9rZnJlZV9za2IgLS0gdGVzdHMgc3Vydml2YWwgdW50aWwgc2tiIGZyZWUgKi9cbitTRUMoXCJ0cF9idGYva2ZyZWVfc2tiXCIpXG4raW50IEJQRl9QUk9HKHRwX2tmcmVlX3NrYl9leHRfcmVhZCwgc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAwO1xuK1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4rXHRcdHJldHVybiAwO1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rI2RlZmluZSBORl9BQ0NFUFQgMVxuK1xuK1NFQyhcIm5ldGZpbHRlclwiKVxuK2ludCBuZl9za2JfZXh0X3JlYWQoc3RydWN0IGJwZl9uZl9jdHggKmN0eClcbit7XG4rXHRzdHJ1Y3QgX19za19idWZmICpza2IgPSAoc3RydWN0IF9fc2tfYnVmZiAqKWN0eC1cdTAwM2Vza2I7XG4rXHRfX3U4IG1ldGFfaGF2ZVtNRVRBX1NJWkVdO1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmICghc2tiKVxuK1x0XHRyZXR1cm4gTkZfQUNDRVBUO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KHNrYiwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBORl9BQ0NFUFQ7XG4rXHRpZiAoYnBmX2R5bnB0cl9yZWFkKG1ldGFfaGF2ZSwgTUVUQV9TSVpFLCBcdTAwMjZtZXRhLCAwLCAwKSlcbitcdFx0cmV0dXJuIE5GX0FDQ0VQVDtcbitcdGlmICghY2hlY2tfbWV0YWRhdGEobWV0YV9oYXZlKSlcbitcdFx0cmV0dXJuIE5GX0FDQ0VQVDtcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gTkZfQUNDRVBUO1xuK31cbitcbitTRUMoXCJsd3RfaW5cIilcbitpbnQgbHd0X2luX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIEJQRl9PSztcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuK1x0XHRyZXR1cm4gQlBGX09LO1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRyZXR1cm4gQlBGX09LO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiBCUEZfT0s7XG4rfVxuK1xuK1NFQyhcImx3dF9vdXRcIilcbitpbnQgbHd0X291dF9za2JfZXh0X3dyaXRlKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKCFpc190ZXN0X3BhY2tldF90YyhjdHgpKVxuK1x0XHRyZXR1cm4gQlBGX09LO1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgQlBGX1NLQl9FWFRfRl9DUkVBVEUsIFx1MDAyNm1ldGEpKVxuK1x0XHRyZXR1cm4gQlBGX09LO1xuK1x0YnBmX2R5bnB0cl93cml0ZShcdTAwMjZtZXRhLCAwLCAodm9pZCAqKW1ldGFfd2FudCwgQVJSQVlfU0laRShtZXRhX3dhbnQpLCAwKTtcbitcbitcdHJldHVybiBCUEZfT0s7XG4rfVxuK1xuK1NFQyhcImx3dF94bWl0XCIpXG4raW50IGx3dF94bWl0X3NrYl9leHRfd3JpdGUoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoIWlzX3Rlc3RfcGFja2V0X3RjKGN0eCkpXG4rXHRcdHJldHVybiBCUEZfT0s7XG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBCUEZfT0s7XG4rXHRicGZfZHlucHRyX3dyaXRlKFx1MDAyNm1ldGEsIDAsICh2b2lkICopbWV0YV93YW50LCBBUlJBWV9TSVpFKG1ldGFfd2FudCksIDApO1xuK1xuK1x0cmV0dXJuIEJQRl9PSztcbit9XG4rXG4rLyogUmVhZCBza2JfZXh0IGZyb20gc2VnNmxvY2FsIEVuZC5CUEYgLS0gdGVzdHMgVEMgLVx1MDAzZSBzZWc2bG9jYWwgcGF0aCAqL1xuK1NFQyhcImx3dF9zZWc2bG9jYWxcIilcbitpbnQgc2VnNmxvY2FsX3NrYl9leHRfcmVhZChzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0X191OCBtZXRhX2hhdmVbTUVUQV9TSVpFXTtcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIEJQRl9PSztcbitcdGlmIChicGZfZHlucHRyX3JlYWQobWV0YV9oYXZlLCBNRVRBX1NJWkUsIFx1MDAyNm1ldGEsIDAsIDApKVxuK1x0XHRyZXR1cm4gQlBGX09LO1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRyZXR1cm4gQlBGX09LO1xuK1xuK1x0dGVzdF9wYXNzID0gdHJ1ZTtcbitcdHJldHVybiBCUEZfT0s7XG4rfVxuK1xuKy8qIFJlYWQgc2tiX2V4dCBmcm9tIHNrX3NrYiBzdHJlYW0gdmVyZGljdCBob29rICovXG4rU0VDKFwic2tfc2tiL3N0cmVhbV92ZXJkaWN0XCIpXG4raW50IHNrX3NrYl9za2JfZXh0X3JlYWQoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxuK3tcbitcdF9fdTggbWV0YV9oYXZlW01FVEFfU0laRV07XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KGN0eCwgMCwgMCwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiBTS19QQVNTO1xuK1x0aWYgKGJwZl9keW5wdHJfcmVhZChtZXRhX2hhdmUsIE1FVEFfU0laRSwgXHUwMDI2bWV0YSwgMCwgMCkpXG4rXHRcdHJldHVybiBTS19QQVNTO1xuK1x0aWYgKCFjaGVja19tZXRhZGF0YShtZXRhX2hhdmUpKVxuK1x0XHRyZXR1cm4gU0tfUEFTUztcbitcbitcdHRlc3RfcGFzcyA9IHRydWU7XG4rXHRyZXR1cm4gU0tfUEFTUztcbit9XG4rXG4gY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9za2JfZXh0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfc2tiX2V4dC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYzI2MTFjOTMxNWFhN1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX3NrYl9leHQuY1xuQEAgLTAsMCArMSwxMjIgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfbWlzYy5oXCJcbitcbitfX3U2NCBmbGFncztcbitcbitTRUMoXCJ0Y1wiKVxuK19fZGVzY3JpcHRpb24oXCJza2JfZXh0IHNsaWNlIGlzIGludmFsaWRhdGVkIGJ5IGJwZl9jbG9uZV9yZWRpcmVjdFwiKVxuK19fZmFpbHVyZVxuK2ludCBza2JfZXh0X3N0YWxlX3NsaWNlX2FmdGVyX2Nsb25lX3JlZGlyZWN0KHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1x0X191OCAqc2xpY2U7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0c2xpY2UgPSBicGZfZHlucHRyX3NsaWNlX3Jkd3IoXHUwMDI2bWV0YSwgMCwgTlVMTCwgOCk7XG4rXHRpZiAoIXNsaWNlKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGJwZl9jbG9uZV9yZWRpcmVjdChjdHgsIDEsIDApO1xuK1xuK1x0LyogU3RhbGU6IHRoZSBjbG9uZSBzaGFyZXMgdGhlIGV4dCBibG9jayB0aGUgc2xpY2UgcG9pbnRzIGludG8uICovXG4rXHQqc2xpY2UgPSAwO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcInRjXCIpXG4rX19kZXNjcmlwdGlvbihcInNrYl9leHQgc2xpY2UgaXMgaW52YWxpZGF0ZWQgd2hlbiBleHQgaXMgcmUtb3BlbmVkIHdpdGggRl9DUkVBVEVcIilcbitfX2ZhaWx1cmVcbitpbnQgc2tiX2V4dF9zdGFsZV9zbGljZV9hZnRlcl9yZWNyZWF0ZShzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgZDEsIGQyO1xuK1x0X191OCAqc2xpY2U7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoY3R4LCAwLCAwLCBcdTAwMjZkMSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0c2xpY2UgPSBicGZfZHlucHRyX3NsaWNlKFx1MDAyNmQxLCAwLCBOVUxMLCA4KTtcbitcdGlmICghc2xpY2UpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0LyogTWF5IENPVyB0aGUgZXh0IGJsb2NrLCBsZWF2aW5nIHRoZSBzbGljZSBwb2ludGluZyBhdCB0aGUgb2xkIG9uZS4gKi9cbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZkMikpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuICpzbGljZTtcbit9XG4rXG4rU0VDKFwidHBfYnRmL2tmcmVlX3NrYlwiKVxuK19fZGVzY3JpcHRpb24oXCJGX0NSRUFURSBpcyByZWplY3RlZCBpbiB0cmFjaW5nIHByb2dyYW1zXCIpXG4rX19mYWlsdXJlIF9fbXNnKFwiaXMgbm90IGFsbG93ZWQgaW4gbHNtL3RyYWNpbmcgcHJvZ3JhbXNcIilcbitpbnQgQlBGX1BST0codHBfc2tiX2V4dF9jcmVhdGUsIHN0cnVjdCBza19idWZmICpza2IpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dCgoc3RydWN0IF9fc2tfYnVmZiAqKXNrYiwgMCxcbitcdFx0XHRcdCAgICBCUEZfU0tCX0VYVF9GX0NSRUFURSwgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcInRwX2J0Zi9rZnJlZV9za2JcIilcbitfX2Rlc2NyaXB0aW9uKFwibm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZCBpbiB0cmFjaW5nIHByb2dyYW1zXCIpXG4rX19mYWlsdXJlIF9fbXNnKFwibXVzdCBiZSBhIGtub3duIGNvbnN0YW50XCIpXG4raW50IEJQRl9QUk9HKHRwX3NrYl9leHRfdmFyX2ZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuK3tcbitcdHN0cnVjdCBicGZfZHlucHRyIG1ldGE7XG4rXG4rXHRpZiAoYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKHN0cnVjdCBfX3NrX2J1ZmYgKilza2IsIDAsIGZsYWdzLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwidGNcIilcbitfX2Rlc2NyaXB0aW9uKFwibm9uLWNvbnN0YW50IGZsYWdzIGFyZSByZWplY3RlZFwiKVxuK19fZmFpbHVyZSBfX21zZyhcIm11c3QgYmUgYSBrbm93biBjb25zdGFudFwiKVxuK2ludCBza2JfZXh0X3Zhcl9mbGFncyhzdHJ1Y3QgX19za19idWZmICpjdHgpXG4re1xuK1x0c3RydWN0IGJwZl9keW5wdHIgbWV0YTtcbitcbitcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIGZsYWdzLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwibHNtL2luZXRfY29ubl9lc3RhYmxpc2hlZFwiKVxuK19fZGVzY3JpcHRpb24oXCJGX0NSRUFURSBpcyByZWplY3RlZCBpbiBMU00gcHJvZ3JhbXNcIilcbitfX2ZhaWx1cmUgX19tc2coXCJpcyBub3QgYWxsb3dlZCBpbiBsc20vdHJhY2luZyBwcm9ncmFtc1wiKVxuK2ludCBCUEZfUFJPRyhsc21fc2tiX2V4dF9jcmVhdGUsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLFxuK1x0XHRcdFx0ICAgIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcdTAwMjZtZXRhKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwibHNtL2luZXRfY29ubl9lc3RhYmxpc2hlZFwiKVxuK19fZGVzY3JpcHRpb24oXCJub24tY29uc3RhbnQgZmxhZ3MgYXJlIHJlamVjdGVkIGluIExTTSBwcm9ncmFtc1wiKVxuK19fZmFpbHVyZSBfX21zZyhcIm11c3QgYmUgYSBrbm93biBjb25zdGFudFwiKVxuK2ludCBCUEZfUFJPRyhsc21fc2tiX2V4dF92YXJfZmxhZ3MsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbit7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0ciBtZXRhO1xuK1xuK1x0aWYgKGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KChzdHJ1Y3QgX19za19idWZmICopc2tiLCAwLCBmbGFncywgXHUwMDI2bWV0YSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjIzOjM4LjIxMjU4OTM4OFoiLCJTZXEiOjExLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3NTk5OTcyMTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggYW5kIHNlZSBpZiB3ZSBuZWVkIHRvIGZpcmUgdXAgYSBLTVNBTiBzZXNzaW9uLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gY2FyZWZ1bGx5IGFuYWx5emUgdGhpcyBuZXcgY29kZSwgbGluZSBieSBsaW5lLCB0byB1bmRlcnN0YW5kIGl0cyBkYXRhIGZsb3dzIGFuZCBpZGVudGlmeSBhbnkgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlcy5cblxuRmlyc3QsIEkgc2VlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUYCBhbmQgYHN0cnVjdCBicGZfc2tiX2V4dGAuIFRoaXMgc3VnZ2VzdHMgd2UncmUgZGVhbGluZyB3aXRoIGFuIGV4dGVuc2lvbiB0byB0aGUgQlBGIGluZnJhc3RydWN0dXJlIHNwZWNpZmljYWxseSBmb3IgU0tCcywgd2hpY2ggd2FycmFudHMgYSBiaXQgb2YgZm9jdXNlZCBhdHRlbnRpb24sIGFzIHRoZXNlIGV4dGVuc2lvbnMgY2FuIHNvbWV0aW1lcyBiZSB0cmlja3kuIEknbSBub3RpbmcgdGhlIGJ1ZmZlciBzaXplIGBDT05GSUdfQlBGX1NLQl9FWFRfU0laRWAsIGFzIHRoYXQgd2lsbCBpbmZsdWVuY2UgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3Mgb3IgcmVhZC1hZnRlci13cml0ZSBzaXR1YXRpb25zLlxuXG5OZXh0LCB0aGUgZGVjbGFyYXRpb25zIG9mIGBicGZfc2tiX2V4dF9wb2ludGVyYCwgYF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlc2AsIGFuZCBgX19icGZfc2tiX2V4dF9zdG9yZV9ieXRlc2AgYXJlIGltcG9ydGFudC4gSSdsbCBuZWVkIHRvIHNjcnV0aW5pemUgdGhlc2UgZm9yIGhvdyB0aGV5IGFjY2VzcyB0aGUgZXh0ZW5zaW9uIGRhdGEgYW5kIGlmIHRoZXJlIGlzIGFueSBzYW5pdGl6YXRpb24gb3IgYm91bmRzIGNoZWNraW5nLlxuXG5Ob3csIHRoZSBgc2tiX2V4dF9zY3J1YmAgYW5kIGBza2JfZXh0X3NoYXJlZGAgYWRkaXRpb25zIHRvIGBza2J1ZmYuaGAgdGVsbCBtZSB0aGVyZSdzIGV4cGxpY2l0IGhhbmRsaW5nIG9mIHNoYXJlZCBTS0IgZXh0ZW5zaW9ucywgd2hpY2ggY2FuIGJlIGEga2V5IGluZGljYXRvciBmb3IgY29uY3VycmVuY3kgaXNzdWVzIG9yIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSBzY2VuYXJpb3MuXG5cblRoZSBgQlBGX1NLQl9FWFRfRl9DUkVBVEVgIGZsYWcgaW4gYHVhcGkvbGludXgvYnBmLmhgIGlzIGludGVyZXN0aW5nLiBUaGUgcHJlc2VuY2Ugb2YgYSBcImNyZWF0ZVwiIGZsYWcgYWx3YXlzIGRlbWFuZHMgc29tZSBleHRyYSBjYXJlLiBJcyBpdCB1c2VkPyBIb3cgaXMgdGhlIGV4dGVuc2lvbiBjcmVhdGVkP1xuXG5Nb3Zpbmcgb24gdG8gYGhlbHBlcnMuY2AsIGl0J3MgZ29vZCB0aGF0IGR5bnB0ciByZWFkL3dyaXRlIGhlbHBlcnMgc3VwcG9ydCBgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFRgLCB3aGljaCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGluaXRpYWwgcHJlbWlzZS4gQWxzbywgaXTigJlzIGdvb2QgdG8gc2VlIHRoYXQgdGhlIHZlcmlmaWVyIGhhbmRsZXMgdGhlIG5ldyB0eXBlLCBhbmQgcGFydGljdWxhcmx5IHRoYXQgYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCBpcyBmbGFnZ2VkIGFzIGEgcGFja2V0LWNoYW5naW5nIGtmdW5jLiBUaGlzIGlzIGEgdmVyeSBnb29kIHNpZ24sIGFzIHRoZSB2ZXJpZmllciBpcyB0eXBpY2FsbHkgYSBmaXJzdCBsaW5lIG9mIGRlZmVuY2UgYWdhaW5zdCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbiBCUEYuXG5cbk5vdyB0byB0aGUgY3JpdGljYWwgcGFydHMsIHRoZSBgbmV0L2NvcmUvZmlsdGVyLmNgIGZ1bmN0aW9ucy4gUmVhZGluZyBgYnBmX3NrYl9leHRfcG9pbnRlcmAsIHRoZSBsb2dpYyB0byByZXRyaWV2ZSB0aGUgZXh0ZW5zaW9uIGxvb2tzIHNvdW5kLCBidXQgSSBtdXN0IHBheSBhdHRlbnRpb24gdG8gYW55IHdyaXRlIGFjY2VzcyBpbiB0aGUgc2hhcmVkIGJ1ZmZlciBjYXNlIHRvIGJlIGFic29sdXRlbHkgY2VydGFpbi4gVGhlIHNhbWUgaG9sZHMgdHJ1ZSBmb3IgYF9fYnBmX3NrYl9leHRfbG9hZF9ieXRlc2AgYW5kIGBfX2JwZl9za2JfZXh0X3N0b3JlX2J5dGVzYCwgZXNwZWNpYWxseSB0aGUgYm91bmRzIGNoZWNraW5nIGFuZCBlcnJvciBoYW5kbGluZy4gTm90ZSB0aGF0IHRoZSBmbGFncyBjaGVjayBpcyBnb29kLlxuXG5Pa2F5LCBsZXQncyBnZXQgaW50byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlcjogYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YC4gVGhlIGBjcmVhdGVgIGZsYWcgaXMgY3J1Y2lhbCBoZXJlOyBgc2tiX2V4dF9hZGRgIGlzIHRoZSBrZXkuIFRoZSBmdW5jdGlvbiBzZXRzIHNpemUgdG8gdGhlIGBBUlJBWV9TSVpFYCBpZiBzaXplIGlzIG5vdCBwcm92aWRlZC4gSXQgY2hlY2tzIGZvciBleGlzdGVuY2UgYmVmb3JlIHBvdGVudGlhbGx5IGNyZWF0aW5nLCBzZXRzIGZsYWdzLCBhbmQgdGhlbiBpbml0aWFsaXplcyB0aGUgZHlucHRyLiBDcnVjaWFsbHksIHRoZSBjb2RlIGNoZWNrcyBmb3IgYGV4aXN0c2AgYW5kIHRoZW4gY2FsbHMgYG1lbXNldGAgdG8gemVybyBtZW1vcnkgZm9yIGEgbm9uLWV4aXN0aW5nIGV4dGVuc2lvbi4gU28gaXQgaW5pdGlhbGl6ZXMgdGhlIG1lbW9yeS4gVGhpcyBpcyBjcml0aWNhbC5cblxuQWhhISBOb3cgSSBzZWUgdGhlIGBza2JfZXh0X2FkZGAuIFRoaXMgaXMgdGhlIHBhcnQgSSBuZWVkIHRvIHZlcmlmeS4gU2luY2UgSSdtIHZlcnkgZmFtaWxpYXIgd2l0aCB0aGUgc2tiIGNvZGUsIEknbSBnb2luZyB0byBxdWlja2x5IHF1ZXJ5IGl0IHVzaW5nIGdyZXAgKG9yLCBteSBwcmVmZXJyZWQgdG9vbCwgZ3JlcHBlcikuIEkgaGF2ZSB0byBlbnN1cmUgdGhlcmUgYXJlbid0IGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIGR1cmluZyB0aGUgYWxsb2NhdGlvbiwgb3IgdGhhdCBpdOKAmXMgbm90IGxlYWtpbmcgbWVtb3J5LiBOb3cgSSBhbSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIGBza2JfZXh0X2FkZGAgY2FsbCBpbiBgbmV0L2NvcmUvc2tidWZmLmNgLlxuXG5PbmNlIEkgc2VlIHRoYXQgYHNrYl9leHRfYWRkYCBpcyBzYWZlLCB0aGVuIEkgYW0gY29uZmlkZW50IHRoYXQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNzA5MywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNjMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzo0NS44MTI1NjQ2NzVaIiwiU2VxIjoxMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4ODI1MjUyNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2tiX2V4dF9hZGRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYz0yMTU9c3RydWN0IHNrX2J1ZmYgKmFsbG9jX2Nhbl9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNhbl9mcmFtZSAqKmNmKVxcbi0tXFxuZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYy0yMjMtXFxuZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYzoyMjQ6XFx0Y3N4ID0gY2FuX3NrYl9leHRfYWRkKHNrYik7XFxuZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYy0yMjUtXFx0aWYgKCFjc3gpIHtcXG4tLVxcbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmM9MjQ1PXN0cnVjdCBza19idWZmICphbGxvY19jYW5mZF9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldixcXG4tLVxcbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmMtMjU0LVxcbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmM6MjU1OlxcdGNzeCA9IGNhbl9za2JfZXh0X2FkZChza2IpO1xcbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmMtMjU2LVxcdGlmICghY3N4KSB7XFxuLS1cXG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jPTI3OT1zdHJ1Y3Qgc2tfYnVmZiAqYWxsb2NfY2FueGxfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXFxuLS1cXG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jLTI5Mi1cXG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jOjI5MzpcXHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQoc2tiKTtcXG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jLTI5NC1cXHRpZiAoIWNzeCkge1xcbi0tXFxuZHJpdmVycy9uZXQvY2FuL2Rldi9za2IuYz0zMzQ9c3RhdGljIGJvb2wgY2FuX3NrYl9pbml0X3ZhbGlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5kcml2ZXJzL25ldC9jYW4vZGV2L3NrYi5jLTM0MS1cXHRcXHRpZiAoIWNzeCkge1xcbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmM6MzQyOlxcdFxcdFxcdGNzeCA9IGNhbl9za2JfZXh0X2FkZChza2IpO1xcbmRyaXZlcnMvbmV0L2Nhbi9kZXYvc2tiLmMtMzQzLVxcdFxcdFxcdGlmICghY3N4KVxcbi0tXFxuZHJpdmVycy9uZXQvY2FuL3Z4Y2FuLmM9Mzk9c3RhdGljIG5ldGRldl90eF90IHZ4Y2FuX3htaXQoc3RydWN0IHNrX2J1ZmYgKm9za2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXFxuLS1cXG5kcml2ZXJzL25ldC9jYW4vdnhjYW4uYy02OS1cXHQvKiB0aGUgY2xvbmVkIHNrYiBwb2ludHMgdG8gdGhlIHNrYiBleHRlbnNpb24gb2YgdGhlIGFscmVhZHkgY2xvbmVkXFxuZHJpdmVycy9uZXQvY2FuL3Z4Y2FuLmM6NzA6XFx0ICogb3NrYiB3aXRoIGFuIGluY3JlYXNlZCByZWZjb3VudC4gc2tiX2V4dF9hZGQoKSBjcmVhdGVzIGEgY29weSB0b1xcbmRyaXZlcnMvbmV0L2Nhbi92eGNhbi5jLTcxLVxcdCAqIHNlcGFyYXRlIHRoZSBza2IgZXh0ZW5zaW9uIGRhdGEgd2hpY2ggaXMgbmVlZGVkIHRvIHN0YXJ0IHdpdGggYVxcbi0tXFxuZHJpdmVycy9uZXQvY2FuL3Z4Y2FuLmMtNzMtXFx0ICovXFxuZHJpdmVycy9uZXQvY2FuL3Z4Y2FuLmM6NzQ6XFx0Y3N4ID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX0NBTik7XFxuZHJpdmVycy9uZXQvY2FuL3Z4Y2FuLmMtNzUtXFx0aWYgKCFjc3gpIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvY2FuL3NrYi5oPTM5PWJvb2wgY2FuX2Ryb3BwZWRfaW52YWxpZF9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7XFxuaW5jbHVkZS9saW51eC9jYW4vc2tiLmgtNDAtXFxuaW5jbHVkZS9saW51eC9jYW4vc2tiLmg6NDE6c3RhdGljIGlubGluZSBzdHJ1Y3QgY2FuX3NrYl9leHQgKmNhbl9za2JfZXh0X2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbmluY2x1ZGUvbGludXgvY2FuL3NrYi5oLTQyLXtcXG5pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaDo0MzpcXHRzdHJ1Y3QgY2FuX3NrYl9leHQgKmNzeCA9IHNrYl9leHRfYWRkKHNrYiwgU0tCX0VYVF9DQU4pO1xcbmluY2x1ZGUvbGludXgvY2FuL3NrYi5oLTQ0LVxcbmluY2x1ZGUvbGludXgvY2FuL3NrYi5oOjQ1OlxcdC8qIHNrYl9leHRfYWRkKCkgcmV0dXJucyB1bmluaXRpYWxpemVkIHNwYWNlICovXFxuaW5jbHVkZS9saW51eC9jYW4vc2tiLmgtNDYtXFx0aWYgKGNzeClcXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg9NTA4OT12b2lkICpfX3NrYl9leHRfc2V0KHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZCxcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTUwOTAtXFx0XFx0ICAgIHN0cnVjdCBza2JfZXh0ICpleHQpO1xcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6NTA5MTp2b2lkICpza2JfZXh0X2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQpO1xcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtNTA5Mi12b2lkIF9fc2tiX2V4dF9kZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBza2JfZXh0X2lkIGlkKTtcXG4tLVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9icl9uZXRmaWx0ZXIuaD05PXN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2VfYWxsb2Moc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9icl9uZXRmaWx0ZXIuaC0xMS0jaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFX05FVEZJTFRFUilcXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvYnJfbmV0ZmlsdGVyLmg6MTI6XFx0c3RydWN0IG5mX2JyaWRnZV9pbmZvICpiID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX0JSSURHRV9ORik7XFxuaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2JyX25ldGZpbHRlci5oLTEzLVxcbi0tXFxuaW5jbHVkZS9uZXQvcGt0X2Nscy5oPTc4Nz1zdGF0aWMgaW5saW5lIHN0cnVjdCB0Y19za2JfZXh0ICp0Y19za2JfZXh0X2FsbG9jKHN0cnVjdCBza19idWZmICpza2IpXFxuaW5jbHVkZS9uZXQvcGt0X2Nscy5oLTc4OC17XFxuaW5jbHVkZS9uZXQvcGt0X2Nscy5oOjc4OTpcXHRzdHJ1Y3QgdGNfc2tiX2V4dCAqdGNfc2tiX2V4dCA9IHNrYl9leHRfYWRkKHNrYiwgVENfU0tCX0VYVCk7XFxuaW5jbHVkZS9uZXQvcGt0X2Nscy5oLTc5MC1cXG4tLVxcbm5ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyX2hvb2tzLmM9MTY4PXN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2VfdW5zaGFyZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbm5ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyX2hvb2tzLmMtMTY5LXtcXG5uZXQvYnJpZGdlL2JyX25ldGZpbHRlcl9ob29rcy5jOjE3MDpcXHRyZXR1cm4gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX0JSSURHRV9ORik7XFxubmV0L2JyaWRnZS9icl9uZXRmaWx0ZXJfaG9va3MuYy0xNzEtfVxcbi0tXFxubmV0L2Nhbi9iY20uYz0zMjE9c3RhdGljIHZvaWQgYmNtX2Nhbl90eChzdHJ1Y3QgYmNtX29wICpvcCwgc3RydWN0IGNhbmZkX2ZyYW1lICpjZilcXG4tLVxcbm5ldC9jYW4vYmNtLmMtMzUzLVxcbm5ldC9jYW4vYmNtLmM6MzU0OlxcdGNzeCA9IGNhbl9za2JfZXh0X2FkZChza2IpO1xcbm5ldC9jYW4vYmNtLmMtMzU1LVxcdGlmICghY3N4KSB7XFxuLS1cXG5uZXQvY2FuL2JjbS5jPTE2MDI9c3RhdGljIGludCBiY21fdHhfc2VuZChzdHJ1Y3QgbXNnaGRyICptc2csIGludCBpZmluZGV4LCBzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvY2FuL2JjbS5jLTE2MTctXFxubmV0L2Nhbi9iY20uYzoxNjE4OlxcdGNzeCA9IGNhbl9za2JfZXh0X2FkZChza2IpO1xcbm5ldC9jYW4vYmNtLmMtMTYxOS1cXHRpZiAoIWNzeCkge1xcbi0tXFxubmV0L2Nhbi9ndy5jPTQ1OD1zdGF0aWMgdm9pZCBjYW5fY2FuX2d3X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpkYXRhKVxcbi0tXFxubmV0L2Nhbi9ndy5jLTUxNi1cXHQvKiB0aGUgY2xvbmVkL2NvcGllZCBuc2tiIHBvaW50cyB0byB0aGUgc2tiIGV4dGVuc2lvbiBvZiB0aGUgb3JpZ2luYWxcXG5uZXQvY2FuL2d3LmM6NTE3OlxcdCAqIHNrYiB3aXRoIGFuIGluY3JlYXNlZCByZWZjb3VudC4gc2tiX2V4dF9hZGQoKSBjcmVhdGVzIGEgY29weSB0b1xcbm5ldC9jYW4vZ3cuYy01MTgtXFx0ICogc2VwYXJhdGUgdGhlIHNrYiBleHRlbnNpb24gZGF0YSB0byBtb2RpZnkgdGhlIGNhbl9nd19ob3BzLlxcbm5ldC9jYW4vZ3cuYy01MTktXFx0ICovXFxubmV0L2Nhbi9ndy5jOjUyMDpcXHRuY3N4ID0gc2tiX2V4dF9hZGQobnNrYiwgU0tCX0VYVF9DQU4pO1xcbm5ldC9jYW4vZ3cuYy01MjEtXFx0aWYgKCFuY3N4KSB7XFxuLS1cXG5uZXQvY2FuL2lzb3RwLmM9Mjg2PXN0YXRpYyBpbnQgaXNvdHBfc2VuZF9mYyhzdHJ1Y3Qgc29jayAqc2ssIGludCBhZSwgdTggZmxvd3N0YXR1cylcXG4tLVxcbm5ldC9jYW4vaXNvdHAuYy0yOTgtXFxubmV0L2Nhbi9pc290cC5jOjI5OTpcXHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQobnNrYik7XFxubmV0L2Nhbi9pc290cC5jLTMwMC1cXHRpZiAoIWNzeCkge1xcbi0tXFxubmV0L2Nhbi9pc290cC5jPTg2Mz1zdGF0aWMgdm9pZCBpc290cF9zZW5kX2NmcmFtZShzdHJ1Y3QgaXNvdHBfc29jayAqc28pXFxuLS1cXG5uZXQvY2FuL2lzb3RwLmMtODgzLVxcbm5ldC9jYW4vaXNvdHAuYzo4ODQ6XFx0Y3N4ID0gY2FuX3NrYl9leHRfYWRkKHNrYik7XFxubmV0L2Nhbi9pc290cC5jLTg4NS1cXHRpZiAoIWNzeCkge1xcbi0tXFxubmV0L2Nhbi9pc290cC5jPTExMDQ9c3RhdGljIGludCBpc290cF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpXFxuLS1cXG5uZXQvY2FuL2lzb3RwLmMtMTIxMy1cXG5uZXQvY2FuL2lzb3RwLmM6MTIxNDpcXHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQoc2tiKTtcXG5uZXQvY2FuL2lzb3RwLmMtMTIxNS1cXHRpZiAoIWNzeCkge1xcbi0tXFxubmV0L2Nhbi9qMTkzOS9zb2NrZXQuYz04ODE9c3RhdGljIHN0cnVjdCBza19idWZmICpqMTkzOV9za19hbGxvY19za2Ioc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsXFxuLS1cXG5uZXQvY2FuL2oxOTM5L3NvY2tldC5jLTg5OS1cXG5uZXQvY2FuL2oxOTM5L3NvY2tldC5jOjkwMDpcXHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQoc2tiKTtcXG5uZXQvY2FuL2oxOTM5L3NvY2tldC5jLTkwMS1cXHRpZiAoIWNzeCkge1xcbi0tXFxubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYz02MDE9c2tfYnVmZiAqajE5MzlfdHBfdHhfZGF0X25ldyhzdHJ1Y3QgajE5MzlfcHJpdiAqcHJpdixcXG4tLVxcbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmMtNjEzLVxcbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmM6NjE0OlxcdGNzeCA9IGNhbl9za2JfZXh0X2FkZChza2IpO1xcbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmMtNjE1LVxcdGlmICghY3N4KSB7XFxuLS1cXG5uZXQvY2FuL2oxOTM5L3RyYW5zcG9ydC5jPTEwNTY9c3RhdGljIGludCBqMTkzOV9zaW1wbGVfdHhuZXh0KHN0cnVjdCBqMTkzOV9zZXNzaW9uICpzZXNzaW9uKVxcbi0tXFxubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYy0xMDcyLVxcdC8qIHRoZSBjbG9uZWQgc2tiIHBvaW50cyB0byB0aGUgc2tiIGV4dGVuc2lvbiBvZiB0aGUgb3JpZ2luYWwgc2Vfc2tiXFxubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYzoxMDczOlxcdCAqIHdpdGggYW4gaW5jcmVhc2VkIHJlZmNvdW50LiBza2JfZXh0X2FkZCgpIGNyZWF0ZXMgYSBjb3B5IHRvXFxubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYy0xMDc0LVxcdCAqIHNlcGFyYXRlIHRoZSBza2IgZXh0ZW5zaW9uIGRhdGEgd2hpY2ggaXMgbmVlZGVkIHRvIG1vZGlmeSB0aGVcXG4tLVxcbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmMtMTA3Ni1cXHQgKi9cXG5uZXQvY2FuL2oxOTM5L3RyYW5zcG9ydC5jOjEwNzc6XFx0aWYgKCFza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfQ0FOKSkge1xcbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmMtMTA3OC1cXHRcXHRrZnJlZV9za2Ioc2tiKTtcXG4tLVxcbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmM9MTU1Mz1qMTkzOV9zZXNzaW9uICpqMTkzOV9zZXNzaW9uX2ZyZXNoX25ldyhzdHJ1Y3QgajE5MzlfcHJpdiAqcHJpdixcXG4tLVxcbm5ldC9jYW4vajE5MzkvdHJhbnNwb3J0LmMtMTU2NS1cXG5uZXQvY2FuL2oxOTM5L3RyYW5zcG9ydC5jOjE1NjY6XFx0Y3N4ID0gY2FuX3NrYl9leHRfYWRkKHNrYik7XFxubmV0L2Nhbi9qMTkzOS90cmFuc3BvcnQuYy0xNTY3LVxcdGlmICghY3N4KSB7XFxuLS1cXG5uZXQvY2FuL3Jhdy5jPTkxOD1zdGF0aWMgaW50IHJhd19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpXFxuLS1cXG5uZXQvY2FuL3Jhdy5jLTk2Mi1cXG5uZXQvY2FuL3Jhdy5jOjk2MzpcXHRjc3ggPSBjYW5fc2tiX2V4dF9hZGQoc2tiKTtcXG5uZXQvY2FuL3Jhdy5jLTk2NC1cXHRpZiAoIWNzeCkge1xcbi0tXFxubmV0L2NvcmUvZmlsdGVyLmM9MTI1MDk9X19icGZfa2Z1bmMgaW50IGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KHN0cnVjdCBfX3NrX2J1ZmYgKnNrYl8sIHUzMiBzaXplLFxcbi0tXFxubmV0L2NvcmUvZmlsdGVyLmMtMTI1NDAtXFxubmV0L2NvcmUvZmlsdGVyLmM6MTI1NDE6XFx0ZXh0ID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX0JQRik7XFxubmV0L2NvcmUvZmlsdGVyLmMtMTI1NDItXFx0aWYgKCFleHQpIHtcXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jPTcxODg9RVhQT1JUX1NZTUJPTF9OU19HUEwoX19za2JfZXh0X3NldCwgXFxcIk5FVERFVl9JTlRFUk5BTFxcXCIpO1xcbi0tXFxubmV0L2NvcmUvc2tidWZmLmMtNzE5MC0vKipcXG5uZXQvY29yZS9za2J1ZmYuYzo3MTkxOiAqIHNrYl9leHRfYWRkIC0gYWxsb2NhdGUgc3BhY2UgZm9yIGdpdmVuIGV4dGVuc2lvbiwgQ09XIGlmIG5lZWRlZFxcbm5ldC9jb3JlL3NrYnVmZi5jLTcxOTItICogQHNrYjogYnVmZmVyXFxuLS1cXG5uZXQvY29yZS9za2J1ZmYuYy03MjAzLSAqL1xcbm5ldC9jb3JlL3NrYnVmZi5jOjcyMDQ6dm9pZCAqc2tiX2V4dF9hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBza2JfZXh0X2lkIGlkKVxcbm5ldC9jb3JlL3NrYnVmZi5jLTcyMDUte1xcbi0tXFxubmV0L2NvcmUvc2tidWZmLmMtNzIzNi19XFxubmV0L2NvcmUvc2tidWZmLmM6NzIzNzpFWFBPUlRfU1lNQk9MKHNrYl9leHRfYWRkKTtcXG5uZXQvY29yZS9za2J1ZmYuYy03MjM4LVxcbi0tXFxubmV0L2lwdjQvZXNwNF9vZmZsb2FkLmM9MjY1PXN0YXRpYyBpbnQgZXNwX3htaXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IsICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcylcXG4tLVxcbm5ldC9pcHY0L2VzcDRfb2ZmbG9hZC5jLTM1NC1cXHRpZiAoaHdfb2ZmbG9hZCkge1xcbm5ldC9pcHY0L2VzcDRfb2ZmbG9hZC5jOjM1NTpcXHRcXHRpZiAoIXNrYl9leHRfYWRkKHNrYiwgU0tCX0VYVF9TRUNfUEFUSCkpXFxubmV0L2lwdjQvZXNwNF9vZmZsb2FkLmMtMzU2LVxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi0tXFxubmV0L2lwdjYvZXNwNl9vZmZsb2FkLmM9MzAzPXN0YXRpYyBpbnQgZXNwNl94bWl0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpXFxuLS1cXG5uZXQvaXB2Ni9lc3A2X29mZmxvYWQuYy0zNzUtXFx0aWYgKGh3X29mZmxvYWQpIHtcXG5uZXQvaXB2Ni9lc3A2X29mZmxvYWQuYzozNzY6XFx0XFx0aWYgKCFza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfU0VDX1BBVEgpKVxcbm5ldC9pcHY2L2VzcDZfb2ZmbG9hZC5jLTM3Ny1cXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tLVxcbm5ldC9tY3RwL3JvdXRlLmM9MzQ2PXN0YXRpYyB2b2lkIG1jdHBfc2tiX3NldF9mbG93KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBtY3RwX3NrX2tleSAqa2V5KVxcbi0tXFxubmV0L21jdHAvcm91dGUuYy0zNDktXFxubmV0L21jdHAvcm91dGUuYzozNTA6XFx0ZmxvdyA9IHNrYl9leHRfYWRkKHNrYiwgU0tCX0VYVF9NQ1RQKTtcXG5uZXQvbWN0cC9yb3V0ZS5jLTM1MS1cXHRpZiAoIWZsb3cpXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTEyMjI9Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTMyMi1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjEzMjM6XFx0bXBleHQgPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfTVBUQ1ApO1xcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTMyNC1cXHRpZiAoIW1wZXh0KVxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYz0xMjY9c3RhdGljIHZvaWQgc3ViZmxvd19hZGRfcmVzZXRfcmVhc29uKHN0cnVjdCBza19idWZmICpza2IsIHU4IHJlYXNvbilcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTEyNy17XFxubmV0L21wdGNwL3N1YmZsb3cuYzoxMjg6XFx0c3RydWN0IG1wdGNwX2V4dCAqbXBleHQgPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfTVBUQ1ApO1xcbm5ldC9tcHRjcC9zdWJmbG93LmMtMTI5LVxcbi0tXFxubmV0L3BzcC9wc3BfbWFpbi5jPTMwMj1pbnQgcHNwX2Rldl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGRldl9pZCwgdTggZ2VuZXJhdGlvbiwgYm9vbCBzdHJpcF9pY3YpXFxuLS1cXG5uZXQvcHNwL3BzcF9tYWluLmMtMzY3LVxcbm5ldC9wc3AvcHNwX21haW4uYzozNjg6XFx0cHNlID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX1BTUCk7XFxubmV0L3BzcC9wc3BfbWFpbi5jLTM2OS1cXHRpZiAoIXBzZSlcXG4tLVxcbm5ldC94ZnJtL3hmcm1faW5wdXQuYz0xMjM9c3RydWN0IHNlY19wYXRoICpzZWNwYXRoX3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbi0tXFxubmV0L3hmcm0veGZybV9pbnB1dC5jLTEyNi1cXG5uZXQveGZybS94ZnJtX2lucHV0LmM6MTI3OlxcdHNwID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX1NFQ19QQVRIKTtcXG5uZXQveGZybS94ZnJtX2lucHV0LmMtMTI4LVxcdGlmICghc3ApXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF94ZHBfbWV0YS5jPTgyMT1pbnQgdGNfc2tiX2V4dF9yZG9ubHkoc3RydWN0IF9fc2tfYnVmZiAqY3R4KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYy04NTItXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYzo4NTM6LyogRG91YmxlIGFsbG9jOiBkYXRhIGZyb20gZmlyc3QgYWxsb2Mgc3Vydml2ZXMgc2Vjb25kIHNrYl9leHRfYWRkICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYy04NTQtU0VDKFxcXCJ0Y1xcXCIpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfeGRwX21ldGEuYz04NTU9aW50IHRjX3NrYl9leHRfZG91YmxlX2FsbG9jKHN0cnVjdCBfX3NrX2J1ZmYgKmN0eClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmMtODY4LVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmM6ODY5OlxcdC8qIFNlY29uZCBhbGxvYyAtLSBza2JfZXh0X2FkZCByZXR1cm5zIGV4aXN0aW5nIGV4dCAqL1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3hkcF9tZXRhLmMtODcwLVxcdGlmIChicGZfZHlucHRyX2Zyb21fc2tiX2V4dChjdHgsIDAsIEJQRl9TS0JfRVhUX0ZfQ1JFQVRFLCBcXHUwMDI2bWV0YSkpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjIzOjQ3LjY5NTA5ODQxNVoiLCJTZXEiOjEzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTQ0NTMxNzY4MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdtIHRoaW5raW5nIGFib3V0IGl0OlxuXG4qKkRpZ2dpbmcgaW50byBza2JfZXh0X2FkZCBpbiBuZXQvY29yZS9za2J1ZmYuYyoqXG5cbkFscmlnaHQsIEkgbmVlZCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIGhvdyB0aGVzZSBleHRlbnNpb25zIHdvcmsgd2l0aGluIHRoZSBgc2tfYnVmZmAgc3RydWN0dXJlLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGFsbG9jYXRpb24sIGNvcHlpbmcsIGFuZCBpbml0aWFsaXphdGlvbiBwcm9jZXNzZXMgaGFwcGVuaW5nIHdpdGhpbiB0aGUgYHNrYl9leHRfYWRkYCBmdW5jdGlvbi4gSSB3YW50IHRvIHNlZSBob3cgdGhlIGtlcm5lbCBtYW5hZ2VzIHRoZXNlIGV4dGVuc2lvbnMsIGFzIHRoYXQgaXMgY3JpdGljYWwgdG8gbWFuYWdpbmcgbWVtb3J5IHdpdGhpbiB0aGUga2VybmVsLiBJIGFtIGdvaW5nIHRvIGZvY3VzIG15IHJlYWRpbmcgb24gdGhhdCBhcmVhIG9mIHRoZSBzb3VyY2UgY29kZSwgYXMgdGhhdCB3aWxsIGdpdmUgbWUgdGhlIGluZm9ybWF0aW9uIHRoYXQgSSBuZWVkLiBUaGlzIGtub3dsZWRnZSB3aWxsIGJlIGludmFsdWFibGUgZm9yIG9wdGltaXppbmcgbmV0d29yayBwZXJmb3JtYW5jZSBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCBjb21wbGV4IHBhY2tldCBtYW5pcHVsYXRpb25zLiBMZXQncyBzZWUgaG93IHRoZXNlIGV4dGVuc2lvbnMgZml0IGludG8gdGhlIGxhcmdlciBwaWN0dXJlIG9mIFNLQiBsaWZlY3ljbGUgbWFuYWdlbWVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDM5MDAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzo1OS4xNDA0MjAzMDVaIiwiU2VxIjoxNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM5OTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9jb3JlL3NrYnVmZi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDcxOTAsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjcxOTA6XFx0LyoqXFxuNzE5MTpcXHQgKiBza2JfZXh0X2FkZCAtIGFsbG9jYXRlIHNwYWNlIGZvciBnaXZlbiBleHRlbnNpb24sIENPVyBpZiBuZWVkZWRcXG43MTkyOlxcdCAqIEBza2I6IGJ1ZmZlclxcbjcxOTM6XFx0ICogQGlkOiBleHRlbnNpb24gdG8gYWxsb2NhdGUgc3BhY2UgZm9yXFxuNzE5NDpcXHQgKlxcbjcxOTU6XFx0ICogQWxsb2NhdGVzIGVub3VnaCBzcGFjZSBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvbi5cXG43MTk2OlxcdCAqIElmIHRoZSBleHRlbnNpb24gaXMgYWxyZWFkeSBwcmVzZW50LCBhIHBvaW50ZXIgdG8gdGhhdCBleHRlbnNpb25cXG43MTk3OlxcdCAqIGlzIHJldHVybmVkLlxcbjcxOTg6XFx0ICpcXG43MTk5OlxcdCAqIElmIHRoZSBza2Igd2FzIGNsb25lZCwgQ09XIGFwcGxpZXMgYW5kIHRoZSByZXR1cm5lZCBtZW1vcnkgY2FuIGJlXFxuNzIwMDpcXHQgKiBtb2RpZmllZCB3aXRob3V0IGNoYW5naW5nIHRoZSBleHRlbnNpb24gc3BhY2Ugb2YgY2xvbmVzIGJ1ZmZlcnMuXFxuNzIwMTpcXHQgKlxcbjcyMDI6XFx0ICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBleHRlbnNpb24gb3IgTlVMTCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXFxuNzIwMzpcXHQgKi9cXG43MjA0OlxcdHZvaWQgKnNrYl9leHRfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZClcXG43MjA1OlxcdHtcXG43MjA2OlxcdFxcdHN0cnVjdCBza2JfZXh0ICpuZXcsICpvbGQgPSBOVUxMO1xcbjcyMDc6XFx0XFx0dW5zaWduZWQgaW50IG5ld2xlbiwgbmV3b2ZmO1xcbjcyMDg6XFx0XFxuNzIwOTpcXHRcXHRpZiAoc2tiLVxcdTAwM2VhY3RpdmVfZXh0ZW5zaW9ucykge1xcbjcyMTA6XFx0XFx0XFx0b2xkID0gc2tiLVxcdTAwM2VleHRlbnNpb25zO1xcbjcyMTE6XFx0XFxuNzIxMjpcXHRcXHRcXHRuZXcgPSBza2JfZXh0X21heWJlX2NvdyhvbGQsIHNrYi1cXHUwMDNlYWN0aXZlX2V4dGVuc2lvbnMpO1xcbjcyMTM6XFx0XFx0XFx0aWYgKCFuZXcpXFxuNzIxNDpcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG43MjE1OlxcdFxcbjcyMTY6XFx0XFx0XFx0aWYgKF9fc2tiX2V4dF9leGlzdChuZXcsIGlkKSlcXG43MjE3OlxcdFxcdFxcdFxcdGdvdG8gc2V0X2FjdGl2ZTtcXG43MjE4OlxcdFxcbjcyMTk6XFx0XFx0XFx0bmV3b2ZmID0gbmV3LVxcdTAwM2VjaHVua3M7XFxuNzIyMDpcXHRcXHR9IGVsc2Uge1xcbjcyMjE6XFx0XFx0XFx0bmV3b2ZmID0gU0tCX0VYVF9DSFVOS1NJWkVPRigqbmV3KTtcXG43MjIyOlxcdFxcbjcyMjM6XFx0XFx0XFx0bmV3ID0gX19za2JfZXh0X2FsbG9jKEdGUF9BVE9NSUMpO1xcbjcyMjQ6XFx0XFx0XFx0aWYgKCFuZXcpXFxuNzIyNTpcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG43MjI2OlxcdFxcdH1cXG43MjI3OlxcdFxcbjcyMjg6XFx0XFx0bmV3bGVuID0gbmV3b2ZmICsgc2tiX2V4dF90eXBlX2xlbltpZF07XFxuNzIyOTpcXHRcXHRuZXctXFx1MDAzZWNodW5rcyA9IG5ld2xlbjtcXG43MjMwOlxcdFxcdG5ldy1cXHUwMDNlb2Zmc2V0W2lkXSA9IG5ld29mZjtcXG43MjMxOlxcdHNldF9hY3RpdmU6XFxuNzIzMjpcXHRcXHRza2ItXFx1MDAzZXNsb3dfZ3JvID0gMTtcXG43MjMzOlxcdFxcdHNrYi1cXHUwMDNlZXh0ZW5zaW9ucyA9IG5ldztcXG43MjM0OlxcdFxcdHNrYi1cXHUwMDNlYWN0aXZlX2V4dGVuc2lvbnMgfD0gMSBcXHUwMDNjXFx1MDAzYyBpZDtcXG43MjM1OlxcdFxcdHJldHVybiBza2JfZXh0X2dldF9wdHIobmV3LCBpZCk7XFxuNzIzNjpcXHR9XFxuNzIzNzpcXHRFWFBPUlRfU1lNQk9MKHNrYl9leHRfYWRkKTtcXG43MjM4OlxcdFxcbjcyMzk6XFx0I2lmZGVmIENPTkZJR19YRlJNXFxuNzI0MDpcXHRzdGF0aWMgdm9pZCBza2JfZXh0X3B1dF9zcChzdHJ1Y3Qgc2VjX3BhdGggKnNwKVxcbjcyNDE6XFx0e1xcbjcyNDI6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuNzI0MzpcXHRcXG43MjQ0OlxcdFxcdGlmICghc3AtXFx1MDAzZWxlbilcXG43MjQ1OlxcdFxcdFxcdHJldHVybjtcXG43MjQ2OlxcdFxcbjcyNDc6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNwLVxcdTAwM2VsZW47IGkrKylcXG43MjQ4OlxcdFxcdFxcdHhmcm1fc3RhdGVfcHV0KHNwLVxcdTAwM2V4dmVjW2ldKTtcXG43MjQ5OlxcdFxcdHNwLVxcdTAwM2VsZW4gPSAwO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyMzo1OS4xNDA2NjMyODVaIiwiU2VxIjoxNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mzg1NzkxMzk5OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBgbmV0L2NvcmUvZmlsdGVyLmNgIC0gU3BlY2lmaWNhbGx5IHRoZSBCUEYgRXh0ZW5zaW9uIEhhbmRsaW5nKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJbiBgbmV0L2NvcmUvZmlsdGVyLmNgLCBzcGVjaWZpY2FsbHkgbG9va2luZyBhdCBob3cgQlBGIGV4dGVuc2lvbnMgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSBgc2tiYCAoc29ja2V0IGJ1ZmZlcikgY29udGV4dC4gIFRoZSBjb2RlIHNuaXBwZXQgaXMgcHJldHR5IGNsZWFyLCBidXQgbGV0J3MgbWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzYW1lIHBhZ2UuXG5cbkZpcnN0LCB0aGUgY29kZSBjaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSBCUEYgZXh0ZW5zaW9uLiBUaGVuLCBhIGZldyBsaW5lcyBsYXRlciwgdGhlIGNvZGUgY2FsbHMgYHNrYl9leHRfYWRkYC4gVGhpcyBpcyB0aGUgcGFydCBJIHdhbnQgdG8gZm9jdXMgb24uIFNvLCBpZiBgY3JlYXRlYCBpcyB0cnVlLCB0aGVuIGBza2JfZXh0X2FkZGAgaXMgY2FsbGVkLiBJZiB0aGF0IGhhcHBlbnMsIHRoZW4gYGV4dGAgaXMgYWxsb2NhdGVkLiBUaGUgbGluZSwgYGlmICghZXhpc3RzKSBtZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpYCBpcyB3aGF0IEknbSBob21pbmcgaW4gb24uXG5cbklmIHRoZSBleHRlbnNpb24gKmRpZG4ndCogZXhpc3QgYmVmb3JlLCBhIG5ldyBvbmUgaXMgYmVpbmcgYWRkZWQgdmlhIGBza2JfZXh0X2FkZGAsIGFuZCB0aGVuIGBtZW1zZXRgIGlzIHVzZWQgdG8gemVybyBvdXQgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBuZXcgZXh0ZW5zaW9uLiBUaGF0J3Mgc3RyYWlnaHRmb3J3YXJkIGVub3VnaDogc2V0dGluZyB1cCBhIGNsZWFuIHNsYXRlLlxuXG5CdXQgdGhlIG51YW5jZSBsaWVzIGluIHRoZSAqb3RoZXIqIGNhc2U6IHdoZW4gdGhlIGV4dGVuc2lvbiAqZGlkKiBhbHJlYWR5IGV4aXN0IChgZXhpc3RzYCB3YXMgYHRydWVgKS4gIEluIHRoaXMgY2FzZSwgYHNrYl9leHRfYWRkYCBpcyAqc3RpbGwqIGNhbGxlZC4gQnV0IHdoYXQgc3RhdGUgaXMgYGV4dGAgaW4/IEl0IGNvdWxkIGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyLCBvciBwZXJoYXBzIGl0IHdhcyBhIGNvcHktb24td3JpdGUgKENPVykgc2l0dWF0aW9uIGZyb20gYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGV4dGVuc2lvbi4gU28sIGluIHRoZSBgZXhpc3RzID0gdHJ1ZWAgc2l0dWF0aW9uLCB0aGUgbWVtb3J5IGlzICpub3QqIHplcm9lZCBvdXQuIFRoaXMgbWVhbnMgaXQgY2FycmllcyB0aGUgcHJldmlvdXMgc3RhdGUuXG5cbkxldCdzIHF1aWNrbHkgY2hlY2sgYHNrYl9leHRfbWF5YmVfY293YCB0byBiZSBjb21wbGV0ZWx5IHN1cmUuIFRoYXQgY29uZmlybXMgaXQsIHRoZSBwcmV2aW91cyBzdGF0ZSBpcyBtYWludGFpbmVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NTAxMSwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwMiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjI0OjAyLjk5ODU3OTk2M1oiLCJTZXEiOjE2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk4MjkwODI2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJza2JfZXh0X21heWJlX2Nvd1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvY29yZS9za2J1ZmYuYz03MTE3PXN0cnVjdCBza2JfZXh0ICpfX3NrYl9leHRfYWxsb2MoZ2ZwX3QgZmxhZ3MpXFxuLS1cXG5uZXQvY29yZS9za2J1ZmYuYy03MTI4LVxcbm5ldC9jb3JlL3NrYnVmZi5jOjcxMjk6c3RhdGljIHN0cnVjdCBza2JfZXh0ICpza2JfZXh0X21heWJlX2NvdyhzdHJ1Y3Qgc2tiX2V4dCAqb2xkLFxcbm5ldC9jb3JlL3NrYnVmZi5jLTcxMzAtXFx0XFx0XFx0XFx0XFx0IHVuc2lnbmVkIGludCBvbGRfYWN0aXZlKVxcbi0tXFxubmV0L2NvcmUvc2tidWZmLmM9NzIwND12b2lkICpza2JfZXh0X2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHNrYl9leHRfaWQgaWQpXFxuLS1cXG5uZXQvY29yZS9za2J1ZmYuYy03MjExLVxcbm5ldC9jb3JlL3NrYnVmZi5jOjcyMTI6XFx0XFx0bmV3ID0gc2tiX2V4dF9tYXliZV9jb3cob2xkLCBza2ItXFx1MDAzZWFjdGl2ZV9leHRlbnNpb25zKTtcXG5uZXQvY29yZS9za2J1ZmYuYy03MjEzLVxcdFxcdGlmICghbmV3KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyNDowNC45ODE0OTg2MzFaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQ1ODgzNzEzMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byBnZXQgYSBmaXJtIHVuZGVyc3RhbmRpbmcgb2YgYHNrYl9leHRfbWF5YmVfY293YCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIG5ldHdvcmtpbmcgY29yZS4gVG8gZG8gdGhhdCBwcm9wZXJseSwgSSdtIGdvaW5nIHRvIGp1bXAgc3RyYWlnaHQgaW50byBgbmV0L2NvcmUvc2tidWZmLmNgIGFuZCBmb2N1cyBvbiBsaW5lcyA3MTI1IHRocm91Z2ggNzE4NS4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIHdpbmRvdyBpbnRvIHRoZSBmdW5jdGlvbidzIGludGVybmFsIHdvcmtpbmdzLiBJIGtub3cgdGhlIFNLQiAoU29ja2V0IEJ1ZmZlcikgYXJjaGl0ZWN0dXJlIHByZXR0eSB3ZWxsLCBhbmQgSSdtIGludGVyZXN0ZWQgdG8gc2VlIGhvdyBpdCBoYW5kbGVzIHBvc3NpYmxlIENvcHktT24tV3JpdGUgKENPVykgc2NlbmFyaW9zIHdpdGggdGhlIGV4dGVuZGVkIFNLQiBkYXRhLiBJJ20gZXhwZWN0aW5nIHRoaXMgc2VjdGlvbiB0byByZXZlYWwgdGhlIHByZWNpc2UgY29uZGl0aW9ucyB1bmRlciB3aGljaCBkYXRhIG1pZ2h0IGJlIGR1cGxpY2F0ZWQsIGFuZCB3aGF0IGNyaXRlcmlhIGRldGVybWluZSB3aGVuIGEgY29weSBpcyBhY3R1YWxseSBuZWNlc3NhcnkgdmVyc3VzIHdoZW4gdGhlIGRhdGEgY2FuIGJlIHNhZmVseSBzaGFyZWQuIFVuZGVyc3RhbmRpbmcgdGhlIHN1YnRsZXRpZXMgb2YgQ09XIGluIHRoaXMgY29udGV4dCBpcyBjcnVjaWFsIGZvciBvcHRpbWl6aW5nIG5ldHdvcmsgcGVyZm9ybWFuY2UgYW5kIGF2b2lkaW5nIHVubmVjZXNzYXJ5IG1lbW9yeSBvdmVyaGVhZCwgcGFydGljdWxhcmx5IGluIGhpZ2gtdGhyb3VnaHB1dCBlbnZpcm9ubWVudHMuIEkgd2FudCB0byBzZWUgaG93IHRoZXkncmUgaGFuZGxpbmcgcmVmZXJlbmNlIGNvdW50cywgZmxhZ3MsIGFuZCBtZW1vcnkgYWxsb2NhdGlvbi4gSXQncyBhIGtleSBwaWVjZSBvZiB0aGUgcHV6emxlIGZvciB1bmRlcnN0YW5kaW5nIGRhdGEgc2hhcmluZyBpbiB0aGUga2VybmVsJ3MgbmV0d29yayBzdGFjay4gVGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkgYW5kIGV4YW1pbmUgdGhlIGFjdHVhbCBjb2RlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NTk2NSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjI0OjA3LjQ0MDMzODQ3MVoiLCJTZXEiOjE4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MzYxNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2NvcmUvc2tidWZmLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNzEyNSxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNzEyNTpcXHRcXG43MTI2OlxcdFxcdHJldHVybiBuZXc7XFxuNzEyNzpcXHR9XFxuNzEyODpcXHRcXG43MTI5OlxcdHN0YXRpYyBzdHJ1Y3Qgc2tiX2V4dCAqc2tiX2V4dF9tYXliZV9jb3coc3RydWN0IHNrYl9leHQgKm9sZCxcXG43MTMwOlxcdFxcdFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBpbnQgb2xkX2FjdGl2ZSlcXG43MTMxOlxcdHtcXG43MTMyOlxcdFxcdHN0cnVjdCBza2JfZXh0ICpuZXc7XFxuNzEzMzpcXHRcXG43MTM0OlxcdFxcdGlmIChyZWZjb3VudF9yZWFkKFxcdTAwMjZvbGQtXFx1MDAzZXJlZmNudCkgPT0gMSlcXG43MTM1OlxcdFxcdFxcdHJldHVybiBvbGQ7XFxuNzEzNjpcXHRcXG43MTM3OlxcdFxcdG5ldyA9IGttZW1fY2FjaGVfYWxsb2Moc2tidWZmX2V4dF9jYWNoZSwgR0ZQX0FUT01JQyk7XFxuNzEzODpcXHRcXHRpZiAoIW5ldylcXG43MTM5OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbjcxNDA6XFx0XFxuNzE0MTpcXHRcXHRtZW1jcHkobmV3LCBvbGQsIG9sZC1cXHUwMDNlY2h1bmtzICogU0tCX0VYVF9BTElHTl9WQUxVRSk7XFxuNzE0MjpcXHRcXHRyZWZjb3VudF9zZXQoXFx1MDAyNm5ldy1cXHUwMDNlcmVmY250LCAxKTtcXG43MTQzOlxcdFxcbjcxNDQ6XFx0I2lmZGVmIENPTkZJR19YRlJNXFxuNzE0NTpcXHRcXHRpZiAob2xkX2FjdGl2ZSBcXHUwMDI2ICgxIFxcdTAwM2NcXHUwMDNjIFNLQl9FWFRfU0VDX1BBVEgpKSB7XFxuNzE0NjpcXHRcXHRcXHRzdHJ1Y3Qgc2VjX3BhdGggKnNwID0gc2tiX2V4dF9nZXRfcHRyKG9sZCwgU0tCX0VYVF9TRUNfUEFUSCk7XFxuNzE0NzpcXHRcXHRcXHR1bnNpZ25lZCBpbnQgaTtcXG43MTQ4OlxcdFxcbjcxNDk6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNwLVxcdTAwM2VsZW47IGkrKylcXG43MTUwOlxcdFxcdFxcdFxcdHhmcm1fc3RhdGVfaG9sZChzcC1cXHUwMDNleHZlY1tpXSk7XFxuNzE1MTpcXHRcXHR9XFxuNzE1MjpcXHQjZW5kaWZcXG43MTUzOlxcdCNpZmRlZiBDT05GSUdfTUNUUF9GTE9XU1xcbjcxNTQ6XFx0XFx0aWYgKG9sZF9hY3RpdmUgXFx1MDAyNiAoMSBcXHUwMDNjXFx1MDAzYyBTS0JfRVhUX01DVFApKSB7XFxuNzE1NTpcXHRcXHRcXHRzdHJ1Y3QgbWN0cF9mbG93ICpmbG93ID0gc2tiX2V4dF9nZXRfcHRyKG9sZCwgU0tCX0VYVF9NQ1RQKTtcXG43MTU2OlxcdFxcbjcxNTc6XFx0XFx0XFx0aWYgKGZsb3ctXFx1MDAzZWtleSlcXG43MTU4OlxcdFxcdFxcdFxcdHJlZmNvdW50X2luYyhcXHUwMDI2Zmxvdy1cXHUwMDNla2V5LVxcdTAwM2VyZWZzKTtcXG43MTU5OlxcdFxcdH1cXG43MTYwOlxcdCNlbmRpZlxcbjcxNjE6XFx0XFx0X19za2JfZXh0X3B1dChvbGQpO1xcbjcxNjI6XFx0XFx0cmV0dXJuIG5ldztcXG43MTYzOlxcdH1cXG43MTY0OlxcdFxcbjcxNjU6XFx0LyoqXFxuNzE2NjpcXHQgKiBfX3NrYl9leHRfc2V0IC0gYXR0YWNoIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uIHN0b3JhZ2UgdG8gdGhpcyBza2JcXG43MTY3OlxcdCAqIEBza2I6IGJ1ZmZlclxcbjcxNjg6XFx0ICogQGlkOiBleHRlbnNpb24gaWRcXG43MTY5OlxcdCAqIEBleHQ6IGV4dGVuc2lvbiBzdG9yYWdlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHZpYSBfX3NrYl9leHRfYWxsb2MoKVxcbjcxNzA6XFx0ICpcXG43MTcxOlxcdCAqIEV4aXN0aW5nIGV4dGVuc2lvbnMsIGlmIGFueSwgYXJlIGNsZWFyZWQuXFxuNzE3MjpcXHQgKlxcbjcxNzM6XFx0ICogUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgZXh0ZW5zaW9uLlxcbjcxNzQ6XFx0ICovXFxuNzE3NTpcXHR2b2lkICpfX3NrYl9leHRfc2V0KHN0cnVjdCBza19idWZmICpza2IsIGVudW0gc2tiX2V4dF9pZCBpZCxcXG43MTc2OlxcdFxcdFxcdCAgICBzdHJ1Y3Qgc2tiX2V4dCAqZXh0KVxcbjcxNzc6XFx0e1xcbjcxNzg6XFx0XFx0dW5zaWduZWQgaW50IG5ld2xlbiwgbmV3b2ZmID0gU0tCX0VYVF9DSFVOS1NJWkVPRigqZXh0KTtcXG43MTc5OlxcdFxcbjcxODA6XFx0XFx0c2tiX2V4dF9wdXQoc2tiKTtcXG43MTgxOlxcdFxcdG5ld2xlbiA9IG5ld29mZiArIHNrYl9leHRfdHlwZV9sZW5baWRdO1xcbjcxODI6XFx0XFx0ZXh0LVxcdTAwM2VjaHVua3MgPSBuZXdsZW47XFxuNzE4MzpcXHRcXHRleHQtXFx1MDAzZW9mZnNldFtpZF0gPSBuZXdvZmY7XFxuNzE4NDpcXHRcXHRza2ItXFx1MDAzZWV4dGVuc2lvbnMgPSBleHQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjI0OjA3LjQ0MTE4MDQ0MVoiLCJTZXEiOjE5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTE4NTYxNzY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgc3VtbWFyeSwgY29uc2lkZXJpbmcgbXkgZXhwZXJ0aXNlOlxuXG4qKkNoZWNraW5nIHRoZSBEeW5wdHIgT3BlcmF0aW9ucyBhbmQgVmVyaWZpZXIgSW1wYWN0cyoqXG5cblJpZ2h0LCBsZXQncyBkaXZlIGluLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBkeW5wdHIgb3BlcmF0aW9ucyBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkLCBwYXJ0aWN1bGFybHkgaW4gbGlnaHQgb2YgdGhlIHZlcmlmaWVyIGNoYW5nZXMgd2UndmUgYmVlbiBzZWVpbmcuIEknbSBnb2luZyB0byBzdGFydCBieSByZXZpZXdpbmcgdGhlIGNvcmUgZnVuY3Rpb25zLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gaG93IHRoZSBkeW5hbWljIHBvaW50ZXIgbWVjaGFuaXNtLCBgYnBmX2R5bnB0cmAsIGlzIGluaXRpYWxpemVkLCBhbmQgaG93IGl0cyBzaXplIGlzIHN1YnNlcXVlbnRseSBjaGVja2VkLiBTcGVjaWZpY2FsbHksIEknbSB0aGlua2luZyBhYm91dCB0aGUgY2FsbCBzZXF1ZW5jZTpcblxuYGJwZl9keW5wdHJfaW5pdChwdHIsIHNrYiwgQlBGX0RZTlBUUl9UWVBFX1NLQl9FWFQsIDAsIHNpemUpO2BcbmFuZFxuYGJwZl9keW5wdHJfY2hlY2tfc2l6ZSh1NjQgc2l6ZSk7YFxuXG5JJ2xsIGJlIHNwZWNpZmljYWxseSBsb29raW5nIGF0IHRoZSBhcmd1bWVudHMgaGVyZSBhbmQgd2hhdCB0aGV5J3JlIGRvaW5nIHdpdGggdGhlIHNrYiBleHRlbnNpb25zLiBXaGF0J3MgdGhlIGNvbnRleHQsIHRoZSBpbXBsaWNhdGlvbnMgZm9yIHNlY3VyaXR5LCBhbmQgZWZmaWNpZW5jeT8gVGhlbiwgSSByZWFsbHkgbmVlZCB0byBkcmlsbCBkb3duIGludG8gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgYGJwZl9keW5wdHJfaW5pdGAuIFRoYXQncyB3aGVyZSB0aGUgcnViYmVyIG1lZXRzIHRoZSByb2FkLCBzbyB0byBzcGVhay4gVW5kZXJzdGFuZGluZyAqaG93KiBpdCdzIGRvbmUgd2lsbCByZXZlYWwgdGhlIHN1YnRsZXRpZXMgb2YgaXRzIG9wZXJhdGlvbiBhbmQgYW55IHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMuIFRoYXQgd2lsbCBnaXZlIG1lIGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhlc2UgY2hhbmdlcyBhcmUgaW1wYWN0aW5nIHRoZSBvdmVyYWxsIEJQRiBsYW5kc2NhcGUgYW5kIGhvdyB0byBoYW5kbGUgaXQgaW4gZnV0dXJlIGl0ZXJhdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ3MTk3LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyNDowOS45NTk3NDU1MloiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY3MjA4MTgyNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicGZfZHlucHRyX2luaXRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9icGYuaD0zMjE3PXZvaWQgbm90cmFjZSBicGZfcHJvZ19pbmNfbWlzc2VzX2NvdW50ZXIoc3RydWN0IGJwZl9wcm9nICpwcm9nKTtcXG5pbmNsdWRlL2xpbnV4L2JwZi5oLTMyMTgtXFxuaW5jbHVkZS9saW51eC9icGYuaDozMjE5OnZvaWQgYnBmX2R5bnB0cl9pbml0KHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0ciwgdm9pZCAqZGF0YSxcXG5pbmNsdWRlL2xpbnV4L2JwZi5oLTMyMjAtXFx0XFx0ICAgICBlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlLCB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2JwZi5oPTM1NDY9c3RhdGljIGlubGluZSB2b2lkIGJwZl9jZ3JwX3N0b3JhZ2VfZnJlZShzdHJ1Y3QgY2dyb3VwICpjZ3JvdXApXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2JwZi5oLTM1NDktXFxuaW5jbHVkZS9saW51eC9icGYuaDozNTUwOnN0YXRpYyBpbmxpbmUgdm9pZCBicGZfZHlucHRyX2luaXQoc3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyLCB2b2lkICpkYXRhLFxcbmluY2x1ZGUvbGludXgvYnBmLmgtMzU1MS1cXHRcXHRcXHRcXHQgICBlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlLCB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSlcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jPTE4Mjg9c3RhdGljIGludCBicGZfZmlsZV9mZXRjaF9ieXRlcyhzdHJ1Y3QgYnBmX2R5bnB0cl9maWxlX2ltcGwgKmRmLCB1NjQgb2Zmc2V0LCB2b2lkICpidWYsIHU2NCBsZW4pXFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy0xODQ2LVxcbmtlcm5lbC9icGYvaGVscGVycy5jOjE4NDc6dm9pZCBicGZfZHlucHRyX2luaXQoc3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyLCB2b2lkICpkYXRhLFxcbmtlcm5lbC9icGYvaGVscGVycy5jLTE4NDgtXFx0XFx0ICAgICBlbnVtIGJwZl9keW5wdHJfdHlwZSB0eXBlLCB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSlcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jPTE4NjE9QlBGX0NBTExfNChicGZfZHlucHRyX2Zyb21fbWVtLCB2b2lkICosIGRhdGEsIHU2NCwgc2l6ZSwgdTY0LCBmbGFncywgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqLCBwdHIpXFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy0xODc2LVxcbmtlcm5lbC9icGYvaGVscGVycy5jOjE4Nzc6XFx0YnBmX2R5bnB0cl9pbml0KHB0ciwgZGF0YSwgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLCBzaXplKTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy0xODc4LVxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmM9NDY5ND1zdGF0aWMgaW50IG1ha2VfZmlsZV9keW5wdHIoc3RydWN0IGZpbGUgKmZpbGUsIHUzMiBmbGFncywgYm9vbCBtYXlfc2xlZXAsXFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00NzEyLVxcdGZyZWFkZXJfaW5pdF9mcm9tX2ZpbGUoXFx1MDAyNnN0YXRlLVxcdTAwM2VmcmVhZGVyLCBOVUxMLCAwLCBmaWxlLCBtYXlfc2xlZXApO1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjQ3MTM6XFx0YnBmX2R5bnB0cl9pbml0KHB0ciwgc3RhdGUsIEJQRl9EWU5QVFJfVFlQRV9GSUxFLCAwLCAwKTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00NzE0LVxcdGJwZl9keW5wdHJfc2V0X3Jkb25seShwdHIpO1xcbi0tXFxua2VybmVsL2JwZi9yaW5nYnVmLmM9NjcwPUJQRl9DQUxMXzQoYnBmX3JpbmdidWZfcmVzZXJ2ZV9keW5wdHIsIHN0cnVjdCBicGZfbWFwICosIG1hcCwgdTMyLCBzaXplLCB1NjQsIGZsYWdzLFxcbi0tXFxua2VybmVsL2JwZi9yaW5nYnVmLmMtNjk1LVxcbmtlcm5lbC9icGYvcmluZ2J1Zi5jOjY5NjpcXHRicGZfZHlucHRyX2luaXQocHRyLCBzYW1wbGUsIEJQRl9EWU5QVFJfVFlQRV9SSU5HQlVGLCAwLCBzaXplKTtcXG5rZXJuZWwvYnBmL3JpbmdidWYuYy02OTctXFxuLS1cXG5rZXJuZWwvYnBmL3JpbmdidWYuYz04MTc9QlBGX0NBTExfNChicGZfdXNlcl9yaW5nYnVmX2RyYWluLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsXFxuLS1cXG5rZXJuZWwvYnBmL3JpbmdidWYuYy04NTMtXFxua2VybmVsL2JwZi9yaW5nYnVmLmM6ODU0OlxcdFxcdGJwZl9keW5wdHJfaW5pdChcXHUwMDI2ZHlucHRyLCBzYW1wbGUsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCwgc2l6ZSk7XFxua2VybmVsL2JwZi9yaW5nYnVmLmMtODU1LVxcdFxcdHJldCA9IGNhbGxiYWNrKCh1aW50cHRyX3QpXFx1MDAyNmR5bnB0ciwgKHVpbnRwdHJfdCljYWxsYmFja19jdHgsIDAsIDAsIDApO1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTIwODgwPXN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTIwOTc1LVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyMDk3NjpcXHRicGZfZHlucHRyX2luaXQoXFx1MDAyNmRhdGFfcHRyLCBkYXRhLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsIGRhdGFfc3opO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyMDk3NzpcXHRicGZfZHlucHRyX2luaXQoXFx1MDAyNnNpZ19wdHIsIHNpZywgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLFxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDk3OC1cXHRcXHRcXHRhdHRyLVxcdTAwM2VzaWduYXR1cmVfc2l6ZSk7XFxuLS1cXG5uZXQvY29yZS9maWx0ZXIuYz0xMjQ3MD1fX2JwZl9rZnVuYyBpbnQgYnBmX2R5bnB0cl9mcm9tX3NrYihzdHJ1Y3QgX19za19idWZmICpzLCB1NjQgZmxhZ3MsXFxuLS1cXG5uZXQvY29yZS9maWx0ZXIuYy0xMjQ4MC1cXG5uZXQvY29yZS9maWx0ZXIuYzoxMjQ4MTpcXHRicGZfZHlucHRyX2luaXQocHRyLCBza2IsIEJQRl9EWU5QVFJfVFlQRV9TS0IsIDAsIHNrYi1cXHUwMDNlbGVuKTtcXG5uZXQvY29yZS9maWx0ZXIuYy0xMjQ4Mi1cXG4tLVxcbm5ldC9jb3JlL2ZpbHRlci5jPTEyNTA5PV9fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2Zyb21fc2tiX2V4dChzdHJ1Y3QgX19za19idWZmICpza2JfLCB1MzIgc2l6ZSxcXG4tLVxcbm5ldC9jb3JlL2ZpbHRlci5jLTEyNTQ4LW91dDpcXG5uZXQvY29yZS9maWx0ZXIuYzoxMjU0OTpcXHRicGZfZHlucHRyX2luaXQocHRyLCBza2IsIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhULCAwLCBzaXplKTtcXG5uZXQvY29yZS9maWx0ZXIuYy0xMjU1MC1cXHRpZiAoIWNyZWF0ZSlcXG4tLVxcbm5ldC9jb3JlL2ZpbHRlci5jPTEyNTczPV9fYnBmX2tmdW5jIGludCBicGZfZHlucHRyX2Zyb21fc2tiX21ldGEoc3RydWN0IF9fc2tfYnVmZiAqc2tiXywgdTY0IGZsYWdzLFxcbi0tXFxubmV0L2NvcmUvZmlsdGVyLmMtMTI1ODMtXFxubmV0L2NvcmUvZmlsdGVyLmM6MTI1ODQ6XFx0YnBmX2R5bnB0cl9pbml0KHB0ciwgc2tiLCBCUEZfRFlOUFRSX1RZUEVfU0tCX01FVEEsIDAsIHNrYl9tZXRhZGF0YV9sZW4oc2tiKSk7XFxubmV0L2NvcmUvZmlsdGVyLmMtMTI1ODUtXFxuLS1cXG5uZXQvY29yZS9maWx0ZXIuYz0xMjU4OT1fX2JwZl9rZnVuYyBpbnQgYnBmX2R5bnB0cl9mcm9tX3hkcChzdHJ1Y3QgeGRwX21kICp4LCB1NjQgZmxhZ3MsXFxuLS1cXG5uZXQvY29yZS9maWx0ZXIuYy0xMjU5OS1cXG5uZXQvY29yZS9maWx0ZXIuYzoxMjYwMDpcXHRicGZfZHlucHRyX2luaXQocHRyLCB4ZHAsIEJQRl9EWU5QVFJfVFlQRV9YRFAsIDAsIHhkcF9nZXRfYnVmZl9sZW4oeGRwKSk7XFxubmV0L2NvcmUvZmlsdGVyLmMtMTI2MDEtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjI0OjExLjYzMTgzMzA5M1oiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1NDQ5NDM2OTAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSB0aGlua2luZyB0aHJvdWdoIGl0OlxuXG4qKkRpdmluZyBpbnRvIHRoZSBCUEYgRHluYW1pYyBQb2ludGVyIEluaXRpYWxpemF0aW9uKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEknbSBnb2luZyB0byBqdW1wIGludG8gdGhlIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AgZmlsZSBhbmQgemVybyBpbiBvbiBsaW5lIDE4NDcuIFRoYXQncyB3aGVyZSB0aGUgYGJwZl9keW5wdHJfaW5pdGAgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIGl0J3MgdGltZSB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGR5bmFtaWMgcG9pbnRlcnMgZ2V0IGluaXRpYWxpemVkIGluIHRoZSBCUEYgd29ybGQuIEkgd2FudCB0byB0aG9yb3VnaGx5IHVuZGVyc3RhbmQgaG93IHRoaXMgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gb3JkZXIgdG8gYmV0dGVyIGRlYnVnIGlzc3VlcyBhbmQgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIGl0IGhhcy4gVGhpcyBpcyB3aGVyZSB0aGUgY29yZSBvZiBkeW5hbWljIG1lbW9yeSBtYW5hZ2VtZW50LCBhdCBsZWFzdCB0aGUgaW5pdGlhbGl6YXRpb24gc3RhZ2UsIHJlc2lkZXMuIEkgbmVlZCBhIGNsZWFyIG1lbnRhbCBwaWN0dXJlIG9mIHdoYXQncyBoYXBwZW5pbmcgdW5kZXIgdGhlIGhvb2Qgd2hlbiBhIGR5bmFtaWMgcG9pbnRlciBpcyBmaXJzdCBicm91Z2h0IHRvIGxpZmUgd2l0aGluIGEgQlBGIHByb2dyYW0uIFRpbWUgdG8gc2VlIHdoYXQncyB3aGF0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0OTMxNCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjI0OjE3LjA4MTI3MjY2NloiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODAxNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9oZWxwZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTg0NSxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTg0NTpcXHR9XFxuMTg0NjpcXHRcXG4xODQ3OlxcdHZvaWQgYnBmX2R5bnB0cl9pbml0KHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnB0ciwgdm9pZCAqZGF0YSxcXG4xODQ4OlxcdFxcdFxcdCAgICAgZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZSwgdTMyIG9mZnNldCwgdTMyIHNpemUpXFxuMTg0OTpcXHR7XFxuMTg1MDpcXHRcXHRwdHItXFx1MDAzZWRhdGEgPSBkYXRhO1xcbjE4NTE6XFx0XFx0cHRyLVxcdTAwM2VvZmZzZXQgPSBvZmZzZXQ7XFxuMTg1MjpcXHRcXHRwdHItXFx1MDAzZXNpemUgPSBzaXplO1xcbjE4NTM6XFx0XFx0YnBmX2R5bnB0cl9zZXRfdHlwZShwdHIsIHR5cGUpO1xcbjE4NTQ6XFx0fVxcbjE4NTU6XFx0XFxuMTg1NjpcXHR2b2lkIGJwZl9keW5wdHJfc2V0X251bGwoc3RydWN0IGJwZl9keW5wdHJfa2VybiAqcHRyKVxcbjE4NTc6XFx0e1xcbjE4NTg6XFx0XFx0bWVtc2V0KHB0ciwgMCwgc2l6ZW9mKCpwdHIpKTtcXG4xODU5OlxcdH1cXG4xODYwOlxcdFxcbjE4NjE6XFx0QlBGX0NBTExfNChicGZfZHlucHRyX2Zyb21fbWVtLCB2b2lkICosIGRhdGEsIHU2NCwgc2l6ZSwgdTY0LCBmbGFncywgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqLCBwdHIpXFxuMTg2MjpcXHR7XFxuMTg2MzpcXHRcXHRpbnQgZXJyO1xcbjE4NjQ6XFx0XFxuMTg2NTpcXHRcXHRCVEZfVFlQRV9FTUlUKHN0cnVjdCBicGZfZHlucHRyKTtcXG4xODY2OlxcdFxcbjE4Njc6XFx0XFx0ZXJyID0gYnBmX2R5bnB0cl9jaGVja19zaXplKHNpemUpO1xcbjE4Njg6XFx0XFx0aWYgKGVycilcXG4xODY5OlxcdFxcdFxcdGdvdG8gZXJyb3I7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjI0OjE3LjA4MTQ1NDYwNloiLCJTZXEiOjIzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozMDEwNDA2MjQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgRHlucHRyIFNsaWNlIGFuZCBCb3VuZCBDaGVja3MqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gaG93IGBkeW5wdHJgIHNsaWNlIGFuZCByZWFkL3dyaXRlIGJvdW5kcyBjaGVja3MgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBGaXJzdCwgSSdsbCBzdGFydCBieSBsb29raW5nIGF0IGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIFNwZWNpZmljYWxseSwgSSdtIGludGVyZXN0ZWQgaW4gdGhlIGBfX2JwZl9keW5wdHJfcmVhZGAgZnVuY3Rpb24uIEkgc2VlIGl0IGhhbmRsZXMgdGhlIGBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVGAgY2FzZTpcblxuYGBgY1xuXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfRVhUOlxuXHRcdHJldHVybiBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoc3JjLVx1MDAzZWRhdGEsIHNyYy1cdTAwM2VvZmZzZXQgKyBvZmZzZXQsIGRzdCwgbGVuKTtcbmBgYFxuXG5SaWdodCwgc28gYHNyY2AgYXBwZWFycyB0byBiZSB0aGUgc291cmNlLCBhbmQgaXQncyBiZWluZyBjaGVja2VkIGluIGBicGZfZHlucHRyX3JlYWRgLiBJIHNob3VsZCBwcm9iYWJseSBsb29rIGF0IHRoYXQgZnVuY3Rpb24sIHRvby4gSSdsbCB0YWtlIGEgbG9vayBhdCBga2VybmVsL2JwZi9oZWxwZXJzLmNgIGFuZCBmb2N1cyBvbiB0aGUgbGluZXMgYXJvdW5kIDE5MTAgdG8gMTk2MC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgZGV0YWlscyBvZiB0aGUgYm91bmRzIGNoZWNraW5nIGxvZ2ljLiBUaW1lIHRvIGRpZyBpbiBhbmQgc2VlIGhvdyB0aGlzIGFsbCBmaXRzIHRvZ2V0aGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0OTk1OCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjI0OjIwLjA5MTg2Mzg5N1oiLCJTZXEiOjI0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTY5NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9oZWxwZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTkxNSxcbiAgXCJMaW5lQ291bnRcIjogNDVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTkxNTpcXHRcXHRcXHQgKiBjb3B5IHRoZSBkYXRhLiBFLmcuIGJwZl9keW5wdHJfZnJvbV9tZW0gbWF5IGNyZWF0ZSB0d28gZHlucHRyXFxuMTkxNjpcXHRcXHRcXHQgKiBwb2ludGluZyB0byBvdmVybGFwcGluZyBQVFJfVE9fTUFQX1ZBTFVFIHJlZ2lvbnMuXFxuMTkxNzpcXHRcXHRcXHQgKi9cXG4xOTE4OlxcdFxcdFxcdG1lbW1vdmUoZHN0LCBzcmMtXFx1MDAzZWRhdGEgKyBzcmMtXFx1MDAzZW9mZnNldCArIG9mZnNldCwgbGVuKTtcXG4xOTE5OlxcdFxcdFxcdHJldHVybiAwO1xcbjE5MjA6XFx0XFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCOlxcbjE5MjE6XFx0XFx0XFx0cmV0dXJuIF9fYnBmX3NrYl9sb2FkX2J5dGVzKHNyYy1cXHUwMDNlZGF0YSwgc3JjLVxcdTAwM2VvZmZzZXQgKyBvZmZzZXQsIGRzdCwgbGVuKTtcXG4xOTIyOlxcdFxcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX1hEUDpcXG4xOTIzOlxcdFxcdFxcdHJldHVybiBfX2JwZl94ZHBfbG9hZF9ieXRlcyhzcmMtXFx1MDAzZWRhdGEsIHNyYy1cXHUwMDNlb2Zmc2V0ICsgb2Zmc2V0LCBkc3QsIGxlbik7XFxuMTkyNDpcXHRcXHRjYXNlIEJQRl9EWU5QVFJfVFlQRV9TS0JfTUVUQTpcXG4xOTI1OlxcdFxcdFxcdG1lbW1vdmUoZHN0LCBicGZfc2tiX21ldGFfcG9pbnRlcihzcmMtXFx1MDAzZWRhdGEsIHNyYy1cXHUwMDNlb2Zmc2V0ICsgb2Zmc2V0KSwgbGVuKTtcXG4xOTI2OlxcdFxcdFxcdHJldHVybiAwO1xcbjE5Mjc6XFx0XFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfRklMRTpcXG4xOTI4OlxcdFxcdFxcdHJldHVybiBicGZfZmlsZV9mZXRjaF9ieXRlcyhzcmMtXFx1MDAzZWRhdGEsIG9mZnNldCwgZHN0LCBsZW4pO1xcbjE5Mjk6XFx0XFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfU0tCX0VYVDpcXG4xOTMwOlxcdFxcdFxcdHJldHVybiBfX2JwZl9za2JfZXh0X2xvYWRfYnl0ZXMoc3JjLVxcdTAwM2VkYXRhLCBzcmMtXFx1MDAzZW9mZnNldCArIG9mZnNldCwgZHN0LCBsZW4pO1xcbjE5MzE6XFx0XFx0ZGVmYXVsdDpcXG4xOTMyOlxcdFxcdFxcdFdBUk5fT05DRSh0cnVlLCBcXFwiYnBmX2R5bnB0cl9yZWFkOiB1bmtub3duIGR5bnB0ciB0eXBlICVkXFxcXG5cXFwiLCB0eXBlKTtcXG4xOTMzOlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbjE5MzQ6XFx0XFx0fVxcbjE5MzU6XFx0fVxcbjE5MzY6XFx0XFxuMTkzNzpcXHRCUEZfQ0FMTF81KGJwZl9keW5wdHJfcmVhZCwgdm9pZCAqLCBkc3QsIHU2NCwgbGVuLCBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICosIHNyYyxcXG4xOTM4OlxcdFxcdCAgIHU2NCwgb2Zmc2V0LCB1NjQsIGZsYWdzKVxcbjE5Mzk6XFx0e1xcbjE5NDA6XFx0XFx0cmV0dXJuIF9fYnBmX2R5bnB0cl9yZWFkKGRzdCwgbGVuLCBzcmMsIG9mZnNldCwgZmxhZ3MpO1xcbjE5NDE6XFx0fVxcbjE5NDI6XFx0XFxuMTk0MzpcXHRzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9keW5wdHJfcmVhZF9wcm90byA9IHtcXG4xOTQ0OlxcdFxcdC5mdW5jXFx0XFx0PSBicGZfZHlucHRyX3JlYWQsXFxuMTk0NTpcXHRcXHQuZ3BsX29ubHlcXHQ9IGZhbHNlLFxcbjE5NDY6XFx0XFx0LnJldF90eXBlXFx0PSBSRVRfSU5URUdFUixcXG4xOTQ3OlxcdFxcdC5hcmcxX3R5cGVcXHQ9IEFSR19QVFJfVE9fVU5JTklUX01FTSxcXG4xOTQ4OlxcdFxcdC5hcmcyX3R5cGVcXHQ9IEFSR19NRU1fU0laRV9PUl9aRVJPLFxcbjE5NDk6XFx0XFx0LmFyZzNfdHlwZVxcdD0gQVJHX1BUUl9UT19EWU5QVFIsXFxuMTk1MDpcXHRcXHQuYXJnNF90eXBlXFx0PSBBUkdfQU5ZVEhJTkcsXFxuMTk1MTpcXHRcXHQuYXJnNV90eXBlXFx0PSBBUkdfQU5ZVEhJTkcsXFxuMTk1MjpcXHR9O1xcbjE5NTM6XFx0XFxuMTk1NDpcXHRpbnQgX19icGZfZHlucHRyX3dyaXRlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKmRzdCwgdTY0IG9mZnNldCwgdm9pZCAqc3JjLFxcbjE5NTU6XFx0XFx0XFx0ICAgICAgIHU2NCBsZW4sIHU2NCBmbGFncylcXG4xOTU2OlxcdHtcXG4xOTU3OlxcdFxcdGVudW0gYnBmX2R5bnB0cl90eXBlIHR5cGU7XFxuMTk1ODpcXHRcXHRpbnQgZXJyO1xcbjE5NTk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjI0OjIwLjA5MjA2Mjk4N1oiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTAzMTM1MDMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGBicGZfZHlucHRyX3JlYWRgIGZvciBCb3VuZGFyeSBDb25kaXRpb25zKipcblxuT2theSwgYmVmb3JlIEkgZ28gYW55IGZ1cnRoZXIgZG93biB0aGlzIHJhYmJpdCBob2xlLCBJIG5lZWQgdG8gcmV2aXNpdCBgYnBmX2R5bnB0cl9yZWFkYC4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoZXkncmUgaGFuZGxpbmcgYm91bmRhcnkgY2hlY2tzIHdoZW4gcmVhZGluZyBhbmQgd3JpdGluZyB3aXRoIGR5bmFtaWMgcG9pbnRlcnMuIEkgcmVtZW1iZXIgc2VlaW5nIHNvbWV0aGluZyBpbiB0aGF0IGZ1bmN0aW9uIHRoYXQgSSBuZWVkIHRvIGNsYXJpZnkgYW5kIGNvbmZpcm0uIExldCdzIHN0YXJ0IGJ5IGNoZWNraW5nIHRoZSBjb2RlIGJlZm9yZSBsaW5lIDE5MTUgYW5kIGVuc3VyZSB0aGVyZSBhcmUgbm8gc3VycHJpc2VzIG9yIGFzc3VtcHRpb25zIGJlaW5nIG1hZGUgaW4gdGhpcyBwYXJ0IG9mIHRoZSBicGYgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTEyNjQsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDE1OjI0OjIzLjU5NTIwMTgyWiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM2ODkxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL2hlbHBlcnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxODk1LFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxODk1OlxcdFxcbjE4OTY6XFx0c3RhdGljIGludCBfX2JwZl9keW5wdHJfcmVhZCh2b2lkICpkc3QsIHU2NCBsZW4sIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKnNyYyxcXG4xODk3OlxcdFxcdFxcdFxcdCAgICAgdTY0IG9mZnNldCwgdTY0IGZsYWdzKVxcbjE4OTg6XFx0e1xcbjE4OTk6XFx0XFx0ZW51bSBicGZfZHlucHRyX3R5cGUgdHlwZTtcXG4xOTAwOlxcdFxcdGludCBlcnI7XFxuMTkwMTpcXHRcXG4xOTAyOlxcdFxcdGlmICghc3JjLVxcdTAwM2VkYXRhIHx8IGZsYWdzKVxcbjE5MDM6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMTkwNDpcXHRcXG4xOTA1OlxcdFxcdGVyciA9IGJwZl9keW5wdHJfY2hlY2tfb2ZmX2xlbihzcmMsIG9mZnNldCwgbGVuKTtcXG4xOTA2OlxcdFxcdGlmIChlcnIpXFxuMTkwNzpcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjE5MDg6XFx0XFxuMTkwOTpcXHRcXHR0eXBlID0gYnBmX2R5bnB0cl9nZXRfdHlwZShzcmMpO1xcbjE5MTA6XFx0XFxuMTkxMTpcXHRcXHRzd2l0Y2ggKHR5cGUpIHtcXG4xOTEyOlxcdFxcdGNhc2UgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMOlxcbjE5MTM6XFx0XFx0Y2FzZSBCUEZfRFlOUFRSX1RZUEVfUklOR0JVRjpcXG4xOTE0OlxcdFxcdFxcdC8qIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWF5IHBvc3NpYmx5IG92ZXJsYXAsIGhlbmNlIHVzZSBtZW1tb3ZlIHRvXFxuMTkxNTpcXHRcXHRcXHQgKiBjb3B5IHRoZSBkYXRhLiBFLmcuIGJwZl9keW5wdHJfZnJvbV9tZW0gbWF5IGNyZWF0ZSB0d28gZHlucHRyXFxuMTkxNjpcXHRcXHRcXHQgKiBwb2ludGluZyB0byBvdmVybGFwcGluZyBQVFJfVE9fTUFQX1ZBTFVFIHJlZ2lvbnMuXFxuMTkxNzpcXHRcXHRcXHQgKi9cXG4xOTE4OlxcdFxcdFxcdG1lbW1vdmUoZHN0LCBzcmMtXFx1MDAzZWRhdGEgKyBzcmMtXFx1MDAzZW9mZnNldCArIG9mZnNldCwgbGVuKTtcXG4xOTE5OlxcdFxcdFxcdHJldHVybiAwO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQxNToyNDoyMy41OTU1NzQyNFoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTAzNjI0ODY5MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBBc3Nlc3NtZW50OiBObyBVbmluaXRpYWxpemVkIE1lbW9yeSBSZWFkL0xlYWsgRGV0ZWN0ZWQqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gdGhyb3VnaCB0aGlzIGNvZGUgd2l0aCBhIGZpbmUtdG9vdGggY29tYiwgZm9jdXNpbmcgc3BlY2lmaWNhbGx5IG9uIHdoZXRoZXIgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBsZWFrcyB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIGEgS01TQU4gZnV6emluZyBzZXNzaW9uLiBNeSBhc3Nlc3NtZW50IGlzIHRoYXQgaXQgZG9lc24ndC5cblxuRmlyc3QsIEkgZXhhbWluZWQgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eTogdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgQlBGIGR5bnB0ciBpbnRlcmZhY2UgdG8gd29yayB3aXRoIGBza2JfZXh0YCBleHRlbnNpb25zLiBUaGUga2V5IGlzIGluIGhvdyB0aGVzZSBgYnBmX3NrYl9leHRgIHN0cnVjdHVyZXMgYXJlIGhhbmRsZWQuIEluIHBhcnRpY3VsYXIsIGBicGZfZHlucHRyX2Zyb21fc2tiX2V4dGAsIHdoZXJlIHRoZXNlIGFyZSBjcmVhdGVkLCBjYWxscyBgbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKWAgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIG5ld2x5IGFsbG9jYXRlZC4gVGhpcyB6ZXJvLWluaXRpYWxpemVzIHRoZSBkeW5wdHIncyBidWZmZXIuIEkgY2hlY2tlZCwgYW5kIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIGlzIHZhbGlkYXRlZCB0byBiZSB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgYGV4dC1cdTAwM2VidWZgIHdoaWNoIGlzIGRlZmluZWQgYXMgYENPTkZJR19CUEZfU0tCX0VYVF9TSVpFYCwgc28gbm8gb3ZlcmZsb3dzIHRoZXJlLlxuXG5JIHRoZW4gbG9va2VkIGZvciBhbnkgY2FzZXMgd2hlcmUgZXhpc3RpbmcgZXh0ZW5zaW9ucyBjb3VsZCBsZWF2ZSB1bmluaXRpYWxpemVkIG1lbW9yeSwgb3Igd2hlcmUgdGhpcyBwYXRjaCBtaWdodCBpbnRyb2R1Y2UgYSBwYXRoIHRoYXQgcmVhZHMgdW5pbml0aWFsaXplZCBkYXRhLiBTcGVjaWZpY2FsbHksIEkgY2hlY2tlZCBgc2tiX2V4dF9zY3J1YmAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLiBgc2tiX2V4dF9zY3J1YmAgY2xlYW5zIHVwIGV4dGVuc2lvbnMsIGFuZCBteSBhbmFseXNpcyBjb25maXJtZWQgdGhhdCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBgYnBmX2R5bnB0cl9zZXRfbnVsbCgpYCBpcyBhbHNvIGV4cGxpY2l0bHkgY2FsbGVkIG9uIGVycm9yIHBhdGhzLlxuXG5JIG1ldGhvZGljYWxseSBsb29rZWQgZm9yIGZvdXIgcG90ZW50aWFsIHJpc2sgY2F0ZWdvcmllcyB0aGF0IGNvdWxkIGxlYWQgdG8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgbGVha3M6XG5cbjEuICAqKktlcm5lbC10by1Vc2VyIFNwYWNlIEluZm9ybWF0aW9uIExlYWs6KiogSSBjaGVja2VkIHRoZSBzdHJ1Y3R1cmVzIGdvaW5nIHRvIHVzZXJzcGFjZSAodmlhIGBjb3B5X3RvX3VzZXJgLCBgcHV0X3VzZXJgLCBuZXRsaW5rLCBpb2N0bCwgZXRjLikuIEkgZm91bmQgbm8gaW5zdGFuY2VzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGZyb20gdGhlIGBicGZfc2tiX2V4dGAgaXMgbGVha2VkLiBUaGUgZHlucHRyIGJ1ZmZlcnMgYXJlIGFsd2F5cyB6ZXJvZWQgb24gY3JlYXRpb24sIGFuZCBkeW5wdHJzIGFyZSBudWxsZWQgb24gZXJyb3IuXG4yLiAgKipDb25kaXRpb25hbCBMb2dpYyBEZXBlbmRlbnQgb24gVW5pbml0aWFsaXplZCBWYXJpYWJsZXM6KiogSSBtYWRlIHN1cmUgdGhhdCBjb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hlcyBkb24ndCBkZXBlbmQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoaXMgcGF0Y2ggaW5pdGlhbGl6ZXMgYWxsIHN1Y2ggdmFyaWFibGVzIChgZXhpc3RzYCwgYGNyZWF0ZWAsIGBlcnJgLCBgc2l6ZWAsIGV0Yy4pIGJlZm9yZSB1c2luZyB0aGVtLlxuMy4gICoqVW5pbml0aWFsaXplZCBGaWVsZHMgaW4gQ29tcGxleCBEYXRhIFN0cnVjdHVyZXM6KiogVGhlIGBicGZfc2tiX2V4dGAgaXMgYWxsb2NhdGVkIGFuZCB6ZXJvZWQgaW1tZWRpYXRlbHkgdmlhIGBtZW1zZXRgLiBUaGVyZSBhcmUgbm8gY2FzZXMgb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYWxsb2NhdGVkIHdpdGhvdXQgcHJvcGVyIGluaXRpYWxpemF0aW9uLlxuNC4gICoqQm91bmRzIENoZWNrcyBJc3N1ZXM6KiogQm91bmRzIGNoZWNrcyBpbiBgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHRgIGFuZCBgYnBmX2R5bnB0cl9jaGVja19vZmZfbGVuYCBlbnN1cmUgdGhhdCBhY2Nlc3NlcyBzdGF5IHdpdGhpbiB0aGUgaW5pdGlhbGl6ZWQgbWVtb3J5IHJlZ2lvbi4gVGhlIGNoZWNrIGBicGZfZHlucHRyX2NoZWNrX29mZl9sZW5gIGNvbmZpcm1zIHRoYXQgb2Zmc2V0IGFuZCBsZW5ndGggYXJlIHNhZmUgd2l0aGluIHRoZSBzaXplIG9mIHRoZSBpbml0aWFsaXplZCBidWZmZXIsIHdoaWNoIGlzIGNvbnRyb2xsZWQgYnkgYHNpemUgXHUwMDNjPSBBUlJBWV9TSVpFKGV4dC1cdTAwM2VidWYpYC4gYHNrYl9leHRfdHlwZV9sZW5bU0tCX0VYVF9CUEZdYCBpcyBhbHNvIHByb3Blcmx5IHNldCB0byB0aGUgY2h1bmsgc2l6ZS5cblxuSSBhbHNvIGNvbnNpZGVyZWQgcG90ZW50aWFsIGNvbmN1cnJlbmN5LCBsb2NrLCByZWZjb3VudCwgb3Igc2hhcmluZyBpc3N1ZXMgd2l0aCBjbG9uZWQgYHNrYmBzLCBidXQgdGhvc2UgYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgYHNrYl9leHRfc2hhcmVkYCBjaGVjayBhbmQgQ09XIChjb3B5LW9uLXdyaXRlKS4gVmVyaWZpZXIgdHlwZSBjaGVja2luZyBhbmQgdmFsaWRhdGlvbiBidWdzIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIC8gdGhlIEJQRiB2ZXJpZmllci4gT3V0LW9mLWJvdW5kcyBhY2Nlc3Mgb3IgdXNlLWFmdGVyLWZyZWUgb24gYHNrYmAgb3IgYHNrYl9leHRgIGlzIGNvdmVyZWQgYnkgS0FTQU4uXG5cbkkgZG91YmxlLWNoZWNrZWQgYWxsIHRoZSBtb2RpZmllZCBmaWxlczogYGluY2x1ZGUvbGludXgvKmAsIGBrZXJuZWwvYnBmLypgLCBgbmV0LypgLCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLypgLiBJJ20gY29uZmlkZW50IHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBsZWFrcy5cblxuU28sIHRoZSByZWFzb25pbmcgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdXBwb3J0IHRvIGBza2JfZXh0YCB2aWEgZHlucHRycywgd2l0aCBoZWxwZXIgZnVuY3Rpb25zLCBhbmQgdmVyaWZpZXIgY2hlY2tzLiBDcnVjaWFsbHksIHRoZSBleHRlbnNpb24gaXMgYWx3YXlzIGV4cGxpY2l0bHkgemVyby1pbml0aWFsaXplZCB2aWEgYG1lbXNldGAgdXBvbiBjcmVhdGlvbi4gRXJyb3IgcGF0aHMgZW5zdXJlIGNsZWFuIGR5bnB0ciBpbml0aWFsaXphdGlvbiB2aWEgYGJwZl9keW5wdHJfc2V0X251bGwoKWAuIEFsbCBtZW1vcnkgYWNjZXNzZXMgYXJlIGNvbnN0cmFpbmVkIGJ5IHZlcmlmaWVkIGJvdW5kcyBjaGVja3MuIEtNU0FOJ3MgbWFpbiBwdXJwb3NlIGlzIHRvIGNhdGNoIHRoZSBsZWFrcyBhbmQgcmVhZHMsIGJ1dCB0aGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gYXZvaWQgdGhvc2UgaXNzdWVzLiBUaGVyZWZvcmUsIG5vIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5lZWRlZCAoTmVlZHNLTVNBTj1mYWxzZSkuIE5vdywgbGV0J3MgY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MTg2MywiT3V0cHV0VG9rZW5zIjozNjUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjg4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMTU6MjQ6MzQuNjMxODI3NTUyWiIsIlNlcSI6MjgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIxODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIEJQRiBzb2NrZXQgYnVmZmVyIG1ldGFkYXRhIGV4dGVuc2lvbnMgKFNLQl9FWFRfQlBGKSBhY2Nlc3NpYmxlIHZpYSBCUEYgZHlucHRycyAoYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0YCksIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyB2ZXJpZmllciBjaGVja3MsIGhlbHBlciBmdW5jdGlvbnMsIGFuZCBza2IgZXh0ZW5zaW9uIHNjcnViYmluZyBsb2dpYy5cXG5cXG5Bc3Nlc3NtZW50IG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2s6XFxuMS4gTWVtb3J5IEluaXRpYWxpemF0aW9uOiBXaGVuIGEgbmV3IGBzdHJ1Y3QgYnBmX3NrYl9leHRgIGlzIGFkZGVkIHRvIGFuIHNrYiB2aWEgYHNrYl9leHRfYWRkKClgLCBgYnBmX2R5bnB0cl9mcm9tX3NrYl9leHQoKWAgZXhwbGljaXRseSB6ZXJvZXMgdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdXNpbmcgYG1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSlgLiBXaGVuIGVycm9yIGNvbmRpdGlvbnMgYXJlIGVuY291bnRlcmVkLCB0aGUgZHlucHRyIGlzIHNhZmVseSBjbGVhcmVkIHdpdGggYGJwZl9keW5wdHJfc2V0X251bGwoKWAuXFxuMi4gQm91bmRzIGFuZCBPZmZzZXRzOiBUaGUgYnVmZmVyIGxlbmd0aCBpcyBzdHJpY3RseSBjaGVja2VkIGFnYWluc3QgYENPTkZJR19CUEZfU0tCX0VYVF9TSVpFYCAoYEFSUkFZX1NJWkUoZXh0LVxcdTAwM2VidWYpYCksIGFuZCBhbGwgc3Vic2VxdWVudCBkeW5wdHIgb3BlcmF0aW9ucyAoYGJwZl9keW5wdHJfcmVhZGAsIGBicGZfZHlucHRyX3dyaXRlYCwgYGJwZl9keW5wdHJfc2xpY2VgKSBlbmZvcmNlIGJvdW5kcyB2aWEgYGJwZl9keW5wdHJfY2hlY2tfb2ZmX2xlbigpYCwgcHJldmVudGluZyByZWFkcyBiZXlvbmQgdGhlIGluaXRpYWxpemVkIHJlZ2lvbi5cXG4zLiBJbmZvIExlYWtzOiBObyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkgb3IgcGFkZGluZyBpcyBleHBvc2VkIHRvIHVzZXIgc3BhY2Ugb3IgYWNyb3NzIGtlcm5lbCBib3VuZGFyaWVzLlxcblxcblRoZSBwcmltYXJ5IGJ1ZyBzdXJmYWNlcyBmb3IgdGhlc2UgY2hhbmdlcyBhcmUgQlBGIHZlcmlmaWVyIHNhZmV0eSwgcmVmY291bnQvQ09XIHNlbWFudGljcyBvbiBjbG9uZWQgc2ticywgYW5kIGJ1ZmZlciBib3VuZHMgY2hlY2tpbmcsIGFsbCBvZiB3aGljaCBhcmUgZWZmZWN0aXZlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHNhbml0aXplcnMgcmF0aGVyIHRoYW4gS01TQU4uIEEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgdGhlcmVmb3JlIG5vdCBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBzdXBwb3J0IGZvciBCUEYgc29ja2V0IGJ1ZmZlciBtZXRhZGF0YSBleHRlbnNpb25zIChTS0JfRVhUX0JQRikgYWNjZXNzaWJsZSB2aWEgQlBGIGR5bnB0cnMgKGBicGZfZHlucHRyX2Zyb21fc2tiX2V4dGApLCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgdmVyaWZpZXIgY2hlY2tzLCBoZWxwZXIgZnVuY3Rpb25zLCBhbmQgc2tiIGV4dGVuc2lvbiBzY3J1YmJpbmcgbG9naWMuXFxuXFxuQXNzZXNzbWVudCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrOlxcbjEuIE1lbW9yeSBJbml0aWFsaXphdGlvbjogV2hlbiBhIG5ldyBgc3RydWN0IGJwZl9za2JfZXh0YCBpcyBhZGRlZCB0byBhbiBza2IgdmlhIGBza2JfZXh0X2FkZCgpYCwgYGJwZl9keW5wdHJfZnJvbV9za2JfZXh0KClgIGV4cGxpY2l0bHkgemVyb2VzIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlIHVzaW5nIGBtZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpYC4gV2hlbiBlcnJvciBjb25kaXRpb25zIGFyZSBlbmNvdW50ZXJlZCwgdGhlIGR5bnB0ciBpcyBzYWZlbHkgY2xlYXJlZCB3aXRoIGBicGZfZHlucHRyX3NldF9udWxsKClgLlxcbjIuIEJvdW5kcyBhbmQgT2Zmc2V0czogVGhlIGJ1ZmZlciBsZW5ndGggaXMgc3RyaWN0bHkgY2hlY2tlZCBhZ2FpbnN0IGBDT05GSUdfQlBGX1NLQl9FWFRfU0laRWAgKGBBUlJBWV9TSVpFKGV4dC1cXHUwMDNlYnVmKWApLCBhbmQgYWxsIHN1YnNlcXVlbnQgZHlucHRyIG9wZXJhdGlvbnMgKGBicGZfZHlucHRyX3JlYWRgLCBgYnBmX2R5bnB0cl93cml0ZWAsIGBicGZfZHlucHRyX3NsaWNlYCkgZW5mb3JjZSBib3VuZHMgdmlhIGBicGZfZHlucHRyX2NoZWNrX29mZl9sZW4oKWAsIHByZXZlbnRpbmcgcmVhZHMgYmV5b25kIHRoZSBpbml0aWFsaXplZCByZWdpb24uXFxuMy4gSW5mbyBMZWFrczogTm8gdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5IG9yIHBhZGRpbmcgaXMgZXhwb3NlZCB0byB1c2VyIHNwYWNlIG9yIGFjcm9zcyBrZXJuZWwgYm91bmRhcmllcy5cXG5cXG5UaGUgcHJpbWFyeSBidWcgc3VyZmFjZXMgZm9yIHRoZXNlIGNoYW5nZXMgYXJlIEJQRiB2ZXJpZmllciBzYWZldHksIHJlZmNvdW50L0NPVyBzZW1hbnRpY3Mgb24gY2xvbmVkIHNrYnMsIGFuZCBidWZmZXIgYm91bmRzIGNoZWNraW5nLCBhbGwgb2Ygd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBzYW5pdGl6ZXJzIHJhdGhlciB0aGFuIEtNU0FOLiBBIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIHRoZXJlZm9yZSBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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,}