Name: series-workflow8cf62 Phase: Succeeded StartedAt: 2026-08-10 21:34:52 +0000 UTC FinishedAt: 2026-08-11 01:29:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[0] Phase: Succeeded StartedAt: 2026-08-10 21:34:52 +0000 UTC FinishedAt: 2026-08-10 21:41:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[0].run-triage Phase: Succeeded StartedAt: 2026-08-10 21:34:52 +0000 UTC FinishedAt: 2026-08-10 21:41:05 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "6b8c8af514d739d0335f5579b585e02babe8a727", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NFSD", "NFSD_V4", "SUNRPC", "NET_NS", "IPV6" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "6b8c8af514d739d0335f5579b585e02babe8a727", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NFSD", "NFSD_V4", "SUNRPC", "NET_NS", "IPV6" ], "series_id": "f83e0325-9b4d-49dc-8c51-d591fefe8752" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "nfsd_nl_listener_set_doit", "svc_register", "rpcb_create_local" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjM5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05GU0QmIzM0OywKICAgICYjMzQ7TkZTRF9WNCYjMzQ7LAogICAgJiMzNDtTVU5SUEMmIzM0OywKICAgICYjMzQ7TkVUX05TJiMzNDssCiAgICAmIzM0O0lQVjYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0JiMzNDssCiAgICAmIzM0O3N2Y19yZWdpc3RlciYjMzQ7LAogICAgJiMzNDtycGNiX2NyZWF0ZV9sb2NhbCYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHZhbGlkYXRpb24gY2hlY2tzIGZvciBORlNEIG5ldGxpbmsgbGlzdGVuZXIgYXR0cmlidXRlcyAoZS5nLiwgbGltaXRpbmcgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgdG8gYE5GU0RfTkxfTElTVEVORVJfTUFYYCBhbmQgdmFsaWRhdGluZyB0aGUgdHJhbnNwb3J0IG5hbWUgdmlhIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgKS4gSXQgYWxzbyBmaXhlcyBlcnJvciBjb2RlIHByb3BhZ2F0aW9uIGluIGBzdmNfcmVnaXN0ZXJgIGFuZCBzZXRzIGEgbG9jYWwgdGltZW91dCBmb3IgcnBjYmluZCBjbGllbnRzLiBcblxuVGhlIG5ldGxpbmsgYXR0cmlidXRlIGBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRWAgaXMgZGVmaW5lZCBhcyBgTkxBX05VTF9TVFJJTkdgIGluIGBuZnNkX3NvY2tfbmxfcG9saWN5YCwgZW5zdXJpbmcgdGhhdCBgbmxhX2RhdGEoKWAgcmV0dXJucyBhIHByb3Blcmx5IG51bGwtdGVybWluYXRlZCBzdHJpbmcgYmVmb3JlIGl0IGlzIHBhc3NlZCB0byBgc3RyY21wKClgIGluIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgLiBcblxuTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgb3Igc2VudCB0byB1c2VyIHNwYWNlLCBhbmQgdGhlcmUgYXJlIG5vIGNoYW5nZXMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIG1lbW9yeS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9naWMgYnVncykgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBkZWZhdWx0IHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTozOTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDYwMWViNzA0OGZkMWNjMzcxOTUxZjU4YWYwMGNjMjUwZjllMmJhYzNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAxMCAyMTozOTozNyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuY1xuaW5kZXggN2UxZDVhNWQ2NTExZS4uZjczYTJlYTQyNTU3MSAxMDA2NDRcbi0tLSBhL2ZzL25mc2QvbmZzY3RsLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL25mc2QvbmZzY3RsLmNcbkBAIC0xOTczLDIxICYjNDM7MTk3MywzOSBAQCBpbnQgbmZzZF9ubF92ZXJzaW9uX2dldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogVHJhbnNwb3J0IGNsYXNzZXMgTkZTRCBrbm93cyBob3cgdG8gaW5zdGFudGlhdGUuIFZldHRpbmcgdGhlIG5hbWUgaGVyZVxuJiM0MzsgKiBrZWVwcyBhIGJvZ3VzIHN0cmluZyBmcm9tIHJlYWNoaW5nIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCksIHdoZXJlIGFuXG4mIzQzOyAqIHVua25vd24gbmFtZSB0cmlnZ2VycyBhIHJlcXVlc3RfbW9kdWxlKFwmIzM0O3N2YyVzXCYjMzQ7LCBuYW1lKSB1cGNhbGwgdW5kZXJcbiYjNDM7ICogbmZzZF9tdXRleC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKVxuJiM0Mzt7XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdXBwb3J0ZWRbXSA9IHsgXCYjMzQ7dGNwXCYjMzQ7LCBcJiMzNDt1ZHBcJiMzNDssIFwmIzM0O3JkbWFcJiMzNDsgfTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShzdXBwb3J0ZWQpOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICghc3RyY21wKG5hbWUsIHN1cHBvcnRlZFtpXSkpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogVXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgYSBzaW5nbGUgcmVxdWVzdCBtYXkgY2FycnkuICovXG4mIzQzOyNkZWZpbmUgTkZTRF9OTF9MSVNURU5FUl9NQVhcdDEwMjRcbiYjNDM7XG4gLyoqXG4gICogbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMgLSBzYW5pdHktY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgZnJvbSB1c2VybGFuZFxuICAqIEBpbmZvOiBuZXRsaW5rIG1ldGFkYXRhIGFuZCBjb21tYW5kIGFyZ3VtZW50c1xuICAqXG4tICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCBlYWNoIGVudHJ5XG4tICogaXMgd2VsbC1mb3JtZWQ6IGl0IHBhcnNlcyBhZ2FpbnN0IHRoZSBwb2xpY3ksIGNhcnJpZXMgYm90aCBhbiBhZGRyZXNzIGFuZFxuLSAqIGEgdHJhbnNwb3J0IG5hbWUsIGFuZCB0aGUgYWRkcmVzcyBpcyBsb25nIGVub3VnaCBmb3IgaXRzIGZhbWlseS4gRG9pbmdcbi0gKiB0aGlzIHVwIGZyb250IGxldHMgdGhlIGNhbGxlcnMgYmVsb3cgYXNzdW1lIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkIGFuZFxuLSAqIGd1YXJhbnRlZXMgd2UgbWFrZSBubyBjaGFuZ2VzIHdoZW4gdGhlIHJlcXVlc3QgaXMgbWFsZm9ybWVkLlxuJiM0MzsgKiBXYWxrIGV2ZXJ5IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIGF0dHJpYnV0ZSBhbmQgY29uZmlybSB0aGF0IHRoZSBsaXN0IGlzXG4mIzQzOyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC5cbiAgKlxuICAqIFJldHVybjogMCBpZiBldmVyeSBlbnRyeSBpcyB2YWxpZCwgb3IgYSBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UuXG4gICovXG4gc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIHtcbiBcdGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHI7XG4mIzQzO1x0dW5zaWduZWQgaW50IGNvdW50ID0gMDtcbiBcdGludCByZW07XG4gXG4gXHRubG1zZ19mb3JfZWFjaF9hdHRyX3R5cGUoYXR0ciwgTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIsIGluZm8tXHUwMDNlbmxoZHIsXG5AQCAtMTk5Niw2ICYjNDM7MjAxNCwxMSBAQCBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRcdHN0cnVjdCBzb2NrYWRkciAqc2E7XG4gXHRcdGludCBlcnI7XG4gXG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2NvdW50IFx1MDAzZSBORlNEX05MX0xJU1RFTkVSX01BWCkge1xuJiM0MztcdFx0XHROTF9TRVRfRVJSX01TRyhpbmZvLVx1MDAzZWV4dGFjaywgXCYjMzQ7dG9vIG1hbnkgbGlzdGVuZXJzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FMkJJRztcbiYjNDM7XHRcdH1cbiYjNDM7XG4gXHRcdGVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5GU0RfQV9TT0NLX01BWCwgYXR0cixcbiBcdFx0XHRcdCAgICAgICBuZnNkX3NvY2tfbmxfcG9saWN5LCBpbmZvLVx1MDAzZWV4dGFjayk7XG4gXHRcdGlmIChlcnIgXHUwMDNjIDApXG5AQCAtMjAwNCw2ICYjNDM7MjAyNyw5IEBAIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdFx0aWYgKCF0YltORlNEX0FfU09DS19BRERSXSB8fCAhdGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuJiM0MztcdFx0aWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRVBST1RPTk9TVVBQT1JUO1xuJiM0MztcbiBcdFx0c2EgPSBubGFfZGF0YSh0YltORlNEX0FfU09DS19BRERSXSk7XG4gXHRcdGlmIChubGFfbGVuKHRiW05GU0RfQV9TT0NLX0FERFJdKSBcdTAwM2Mgc2l6ZW9mKHNhLVx1MDAzZXNhX2ZhbWlseSkpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG5AQCAtMjE1Niw4ICYjNDM7MjE4MiwxMiBAQCBpbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRyZXQgPSBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYShzZXJ2LCB4Y2xfbmFtZSwgbmV0LCBzYSwgMCxcbiBcdFx0XHRcdFx0ICAgICAgY3VycmVudF9jcmVkKCkpO1xuIFx0XHQvKiBhbHdheXMgc2F2ZSB0aGUgbGF0ZXN0IGVycm9yICovXG4tXHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdE5MX1NFVF9FUlJfTVNHX0ZNVChpbmZvLVx1MDAzZWV4dGFjayxcbiYjNDM7XHRcdFx0XHRcdCAgIFwmIzM0O2Nhbm5vdCBjcmVhdGUgJXMgbGlzdGVuZXI6ICVkXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgeGNsX25hbWUsIHJldCk7XG4gXHRcdFx0ZXJyID0gcmV0O1xuJiM0MztcdFx0fVxuIFx0fVxuIFxuIFx0aWYgKCFzZXJ2LVx1MDAzZXN2X25ydGhyZWFkcyBcdTAwMjZcdTAwMjYgbGlzdF9lbXB0eShcdTAwMjZubi1cdTAwM2VuZnNkX3NlcnYtXHUwMDNlc3ZfcGVybXNvY2tzKSlcbmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuY1xuaW5kZXggNmFhMzcyMTg4Yzg2YS4uMGFhMzc2YjgyYTUyNiAxMDA2NDRcbi0tLSBhL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcbkBAIC0yMjEsNiAmIzQzOzIyMSwxNiBAQCBzdGF0aWMgdm9pZCBycGNiX3NldF9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBycGNfY2xudCAqY2xudCxcbiAjIGRlZmluZSBTVU5fTEVOKHB0cikgKG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpXHRcdFxcXG4gXHRcdCAgICAgICYjNDM7IDEgJiM0Mzsgc3RybGVuKChwdHIpLVx1MDAzZXN1bl9wYXRoICYjNDM7IDEpKVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBUaGUga2VybmVsJiMzOTtzIHJwY2JpbmQgY2xpZW50IHRhbGtzIG9ubHkgdG8gdGhlIGxvY2FsIHJwY2JpbmQsIG92ZXIgbG9vcGJhY2tcbiYjNDM7ICogb3IgYSBsb2NhbCBBRl9MT0NBTCBzb2NrZXQsIHdoZXJlIGEgaGVhbHRoeSBycGNiaW5kIGFuc3dlcnMgaW4gbWljcm9zZWNvbmRzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBycGNfdGltZW91dCBycGNiX2xvY2FsX3RpbWVvdXQgPSB7XG4mIzQzO1x0LnRvX2luaXR2YWxcdD0gMSAqIEhaLFxuJiM0MztcdC50b19tYXh2YWxcdD0gMSAqIEhaLFxuJiM0MztcdC50b19yZXRyaWVzXHQ9IDAsXG4mIzQzO307XG4mIzQzO1xuIC8qXG4gICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlXG4gICogaXMgcmV0dXJuZWQuXG5AQCAtMjM4LDYgJiM0MzsyNDgsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2FmX2xvY2FsKHN0cnVjdCBuZXQgKm5ldCxcbiBcdFx0LnZlcnNpb25cdD0gUlBDQlZFUlNfMixcbiBcdFx0LmF1dGhmbGF2b3JcdD0gUlBDX0FVVEhfTlVMTCxcbiBcdFx0LmNyZWRcdFx0PSBjdXJyZW50X2NyZWQoKSxcbiYjNDM7XHRcdC50aW1lb3V0XHQ9IFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcbiBcdFx0LypcbiBcdFx0ICogV2UgdHVybiBvZmYgdGhlIGlkbGUgdGltZW91dCB0byBwcmV2ZW50IHRoZSBrZXJuZWxcbiBcdFx0ICogZnJvbSBhdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3RpbmcgdGhlIHNvY2tldC5cbkBAIC0zMTIsNiAmIzQzOzMyMyw3IEBAIHN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfbmV0KHN0cnVjdCBuZXQgKm5ldClcbiBcdFx0LnZlcnNpb25cdD0gUlBDQlZFUlNfMixcbiBcdFx0LmF1dGhmbGF2b3JcdD0gUlBDX0FVVEhfVU5JWCxcbiBcdFx0LmNyZWRcdFx0PSBjdXJyZW50X2NyZWQoKSxcbiYjNDM7XHRcdC50aW1lb3V0XHQ9IFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcbiBcdFx0LmZsYWdzXHRcdD0gUlBDX0NMTlRfQ1JFQVRFX05PUElORyxcbiBcdH07XG4gXHRzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsICpjbG50NDtcbmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuY1xuaW5kZXggMDVjM2U2ZTJmNjU5NC4uZTljZmNlYjFhMzM0MiAxMDA2NDRcbi0tLSBhL25ldC9zdW5ycGMvc3ZjLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvc3ZjLmNcbkBAIC0xMjA4LDEzICYjNDM7MTIwOCwxNiBAQCBpbnQgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0LFxuIFx0XHRzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2dwID0gXHUwMDI2c2Vydi1cdTAwM2Vzdl9wcm9ncmFtc1twXTtcbiBcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcHJvZ3AtXHUwMDNlcGdfbnZlcnM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGludCByZXQ7XG4gXG4tXHRcdFx0ZXJyb3IgPSBwcm9ncC1cdTAwM2VwZ19ycGNiaW5kX3NldChuZXQsIHByb2dwLCBpLFxuJiM0MztcdFx0XHRyZXQgPSBwcm9ncC1cdTAwM2VwZ19ycGNiaW5kX3NldChuZXQsIHByb2dwLCBpLFxuIFx0XHRcdFx0XHRmYW1pbHksIHByb3RvLCBwb3J0KTtcbi1cdFx0XHRpZiAoZXJyb3IgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuIFx0XHRcdFx0cHJpbnRrKEtFUk5fV0FSTklORyBcJiMzNDtzdmM6IGZhaWxlZCB0byByZWdpc3RlciBcJiMzNDtcbiBcdFx0XHRcdFx0XCYjMzQ7JXN2JXUgUlBDIHNlcnZpY2UgKGVycm5vICVkKS5cXG5cJiMzNDssXG4tXHRcdFx0XHRcdHByb2dwLVx1MDAzZXBnX25hbWUsIGksIC1lcnJvcik7XG4mIzQzO1x0XHRcdFx0XHRwcm9ncC1cdTAwM2VwZ19uYW1lLCBpLCAtcmV0KTtcbiYjNDM7XHRcdFx0XHRpZiAoIWVycm9yKVxuJiM0MztcdFx0XHRcdFx0ZXJyb3IgPSByZXQ7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4gXHRcdH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5pbmRleCA4NDM0M2ZkMWUzNTRiLi40NjA1MDhkZTkzNzRmIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5AQCAtODksNiAmIzQzOzg5LDcgQEAgVEFSR0VUUyAmIzQzOz0gbmV0L3BhY2tldGRyaWxsXG4gVEFSR0VUUyAmIzQzOz0gbmV0L3BwcFxuIFRBUkdFVFMgJiM0Mzs9IG5ldC9yZHNcbiBUQVJHRVRTICYjNDM7PSBuZXQvdGNwX2FvXG4mIzQzO1RBUkdFVFMgJiM0Mzs9IG5mc2RcbiBUQVJHRVRTICYjNDM7PSBub2xpYmNcbiBUQVJHRVRTICYjNDM7PSBwY2lfZW5kcG9pbnRcbiBUQVJHRVRTICYjNDM7PSBwY2llX2J3Y3RybFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvLmdpdGlnbm9yZVxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE5ZTZkZWMwNGQ4ZTlcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvLmdpdGlnbm9yZVxuQEAgLTAsMCAmIzQzOzEgQEBcbiYjNDM7bmZzZF9uZXRsaW5rX2xpc3RlbmVyXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xNWFjNjU1NDlkMjU5XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlXG5AQCAtMCwwICYjNDM7MSw2IEBAXG4mIzQzOyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7Q0ZMQUdTICYjNDM7PSAkKEtIRFJfSU5DTFVERVMpIC1XYWxsXG4mIzQzO1xuJiM0MztURVNUX0dFTl9QUk9HUyA6PSBuZnNkX25ldGxpbmtfbGlzdGVuZXJcbiYjNDM7XG4mIzQzO2luY2x1ZGUgLi4vbGliLm1rXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2OTQ1ZmY5NTUxYzRcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnXG5AQCAtMCwwICYjNDM7MSw0IEBAXG4mIzQzO0NPTkZJR19ORVRfTlM9eVxuJiM0MztDT05GSUdfSVBWNj15XG4mIzQzO0NPTkZJR19ORlNEPXlcbiYjNDM7Q09ORklHX05GU0RfVjQ9eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uM2UzMzA3NjgwZDdkNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuY1xuQEAgLTAsMCAmIzQzOzEsOTIwIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIFJlZ3Jlc3Npb24gdGVzdHMgZm9yIHRoZSBORlNEIGdlbmVyaWMtbmV0bGluayBsaXN0ZW5lciBpbnRlcmZhY2VcbiYjNDM7ICogKE5GU0RfQ01EX0xJU1RFTkVSX1NFVCAvIE5GU0RfQ01EX0xJU1RFTkVSX0dFVCkuXG4mIzQzOyAqXG4mIzQzOyAqIFRocmVlIGdyb3VwczpcbiYjNDM7ICogICB2YWxpZGF0aW9uICAtIG1hbGZvcm1lZC9hYnVzaXZlIExJU1RFTkVSX1NFVCByZXF1ZXN0cyBhcmUgcmVqZWN0ZWQgYnlcbiYjNDM7ICogICAgICAgICAgICAgICAgIG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKCksIGJlZm9yZSBuZnNkX211dGV4IGlzIHRha2VuLlxuJiM0MzsgKiAgIGZ1bmN0aW9uYWwgIC0gY3JlYXRlL2FkZC9yZW1vdmUgbGlzdGVuZXJzIGFuZCB2ZXJpZnkgTElTVEVORVJfR0VUXG4mIzQzOyAqICAgICAgICAgICAgICAgICByZWZsZWN0cyB0aGUgc2V0IChyb3VuZC10cmlwIG9mIHRyYW5zcG9ydCAmIzQzOyBhZGRyOnBvcnQpLlxuJiM0MzsgKiAgIHNlbWFudGljcyAgIC0gb25jZSB0aHJlYWRzIGFyZSBydW5uaW5nIChUSFJFQURTX1NFVCkgYSBsaXN0ZW5lciBjaGFuZ2VcbiYjNDM7ICogICAgICAgICAgICAgICAgIGlzIHJlZnVzZWQgd2l0aCAtRUJVU1kuXG4mIzQzOyAqXG4mIzQzOyAqIEVhY2ggdGVzdCBydW5zIGluIGl0cyBvd24gcHJpdmF0ZSBuZXQgJiM0MzsgbW91bnQgbmFtZXNwYWNlICh1bnNoYXJlIGluXG4mIzQzOyAqIEZJWFRVUkVfU0VUVVApLiAvcnVuIGlzIG1hc2tlZCB0aGVyZTogYSBwYXRobmFtZSBBRl9MT0NBTCBjb25uZWN0IGlzIG5vdFxuJiM0MzsgKiBzY29wZWQgYnkgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBzaW5jZSB1bml4X2ZpbmRfYnNkKCkgcmVzb2x2ZXMgYnkgaW5vZGVcbiYjNDM7ICogYW5kIHRha2VzIG5vIHN0cnVjdCBuZXQsIHNvIHRoZSBrZXJuZWwmIzM5O3MgcnBjYmluZCBjbGllbnQgd291bGQgb3RoZXJ3aXNlIGJlXG4mIzQzOyAqIGFibGUgdG8gcmVhY2ggdGhlIHJwY2JpbmQgcnVubmluZyBvbiB0aGUgaG9zdC4gQW55dGhpbmcgdGhhdCBjcmVhdGVzIGFcbiYjNDM7ICogc2VydiBpcyBzZXJ2ZWQgYnkgdGhlIHBlci1uZXRucyBycGNiaW5kIHN0dWIgYmVsb3cgaW5zdGVhZC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nwb2xsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc2NoZWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRkZWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpbnQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tb3VudC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9wcmN0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy90aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXQvaWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXRpbmV0L2luLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbmV0bGluay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2dlbmV0bGluay5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDsuLi9rc2VsZnRlc3RfaGFybmVzcy5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsvKiBORlNEIGdlbmVyaWMtbmV0bGluayBjb25zdGFudHMgKGZyb20gbGludXgvbmZzZF9uZXRsaW5rLmgpLiAqL1xuJiM0MzsjZGVmaW5lIE5GU0RfRkFNSUxZX05BTUVcdFx0XCYjMzQ7bmZzZFwmIzM0O1xuJiM0MzsjZGVmaW5lIE5GU0RfQ01EX1RIUkVBRFNfU0VUXHRcdDJcbiYjNDM7I2RlZmluZSBORlNEX0NNRF9MSVNURU5FUl9TRVRcdFx0NlxuJiM0MzsjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX0dFVFx0XHQ3XG4mIzQzOyNkZWZpbmUgTkZTRF9BX1NFUlZFUl9USFJFQURTXHRcdDFcbiYjNDM7I2RlZmluZSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUlx0XHQxXHQvKiBwZXItbGlzdGVuZXIgbmVzdCAqL1xuJiM0MzsjZGVmaW5lIE5GU0RfQV9TT0NLX0FERFJcdFx0MVx0LyogaW5zaWRlIHRoZSBuZXN0ICovXG4mIzQzOyNkZWZpbmUgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVcdDJcdC8qIGluc2lkZSB0aGUgbmVzdCAqL1xuJiM0MztcbiYjNDM7I2RlZmluZSBOTEFfQUxJR040KGxlbilcdFx0XHQoKChsZW4pICYjNDM7IDMpIFx1MDAyNiB+MylcbiYjNDM7I2RlZmluZSBURVNUX1BPUlRcdFx0XHQyMDA0OVxuJiM0MzsjZGVmaW5lIE1BWF9MSVNURU5FUlNcdFx0XHQ4XG4mIzQzOyNkZWZpbmUgUkVDVl9USU1FT19TRUNcdFx0XHQzMFxuJiM0MztcbiYjNDM7c3RhdGljIGludCBuZnNkX2ZhbWlseTtcdFx0XHQvKiBzZXQgcGVyLXRlc3QgaW4gRklYVFVSRV9TRVRVUCAqL1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKm1zZylcbiYjNDM7e1xuJiM0MztcdHBlcnJvcihtc2cpO1xuJiM0MztcdGV4aXQoMSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gbWluaW1hbCBnZW5lcmljLW5ldGxpbmsgcGx1bWJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZW5sX29wZW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9ubCBzYSA9IHsgLm5sX2ZhbWlseSA9IEFGX05FVExJTksgfTtcbiYjNDM7XHRzdHJ1Y3QgdGltZXZhbCB0diA9IHsgLnR2X3NlYyA9IFJFQ1ZfVElNRU9fU0VDIH07XG4mIzQzO1x0aW50IGZkID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX0dFTkVSSUMpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRkaWUoXCYjMzQ7c29ja2V0KE5FVExJTktfR0VORVJJQylcJiMzNDspO1xuJiM0MztcdGlmIChiaW5kKGZkLCAodm9pZCAqKVx1MDAyNnNhLCBzaXplb2Yoc2EpKSBcdTAwM2MgMClcbiYjNDM7XHRcdGRpZShcJiMzNDtiaW5kKG5ldGxpbmspXCYjMzQ7KTtcbiYjNDM7XHRzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgXHUwMDI2dHYsIHNpemVvZih0dikpO1xuJiM0MztcdHJldHVybiBmZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQXBwZW5kIGFuIGF0dHJpYnV0ZSBhdCBAb2ZmOyByZXR1cm4gdGhlIG5ldyAoYWxpZ25lZCkgb2Zmc2V0LiAqL1xuJiM0MztzdGF0aWMgaW50IHB1dF9hdHRyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgdWludDE2X3QgdHlwZSxcbiYjNDM7XHRcdCAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG5sYXR0ciAqbmEgPSAodm9pZCAqKShidWYgJiM0Mzsgb2ZmKTtcbiYjNDM7XG4mIzQzO1x0bmEtXHUwMDNlbmxhX3R5cGUgPSB0eXBlO1xuJiM0MztcdG5hLVx1MDAzZW5sYV9sZW4gPSBOTEFfSERSTEVOICYjNDM7IGxlbjtcbiYjNDM7XHRpZiAobGVuKVxuJiM0MztcdFx0bWVtY3B5KGJ1ZiAmIzQzOyBvZmYgJiM0MzsgTkxBX0hEUkxFTiwgZGF0YSwgbGVuKTtcbiYjNDM7XHRyZXR1cm4gb2ZmICYjNDM7IE5MQV9BTElHTjQoTkxBX0hEUkxFTiAmIzQzOyBsZW4pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBCdWlsZCBhIGdlbmwgbWVzc2FnZSBoZWFkZXIgaW50byBAYnVmOyByZXR1cm4gdGhlIG9mZnNldCBwYXN0IGl0LiAqL1xuJiM0MztzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbiYjNDM7XHRzdHJ1Y3QgZ2VubG1zZ2hkciAqZ25sID0gKHZvaWQgKikoYnVmICYjNDM7IE5MTVNHX0hEUkxFTik7XG4mIzQzO1xuJiM0MztcdG1lbXNldChidWYsIDAsIE5MTVNHX0hEUkxFTiAmIzQzOyBHRU5MX0hEUkxFTik7XG4mIzQzO1x0bmxoLVx1MDAzZW5sbXNnX3R5cGUgPSB0eXBlO1xuJiM0MztcdG5saC1cdTAwM2VubG1zZ19mbGFncyA9IGZsYWdzO1xuJiM0MztcdG5saC1cdTAwM2VubG1zZ19zZXEgPSAxO1xuJiM0MztcdGdubC1cdTAwM2VjbWQgPSBjbWQ7XG4mIzQzO1x0Z25sLVx1MDAzZXZlcnNpb24gPSAxO1xuJiM0MztcdHJldHVybiBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU47XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFNlbmQgYW4gbmZzZCBjb21tYW5kIHdpdGggYW4gQUNLOyByZXR1cm4gdGhlIEFDSyBlcnJubyAoXHUwMDNjPSAwKS4gKi9cbiYjNDM7c3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBidWZbMSBcdTAwM2NcdTAwM2MgMjBdLCByYnVmWzQwOTZdO1xuJiM0MztcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4mIzQzO1x0aW50IGZkID0gZ2VubF9vcGVuKCk7XG4mIzQzO1x0aW50IG9mZiwgbiwgcmV0O1xuJiM0MztcbiYjNDM7XHRvZmYgPSBnZW5sX2hkcihidWYsIG5mc2RfZmFtaWx5LCBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNLLCBjbWQpO1xuJiM0MztcdGlmIChhdHRyc19sZW4pIHtcbiYjNDM7XHRcdG1lbWNweShidWYgJiM0Mzsgb2ZmLCBhdHRycywgYXR0cnNfbGVuKTtcbiYjNDM7XHRcdG9mZiAmIzQzOz0gYXR0cnNfbGVuO1xuJiM0MztcdH1cbiYjNDM7XHRubGgtXHUwMDNlbmxtc2dfbGVuID0gb2ZmO1xuJiM0MztcbiYjNDM7XHRpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApIFx1MDAzYyAwKVxuJiM0MztcdFx0ZGllKFwmIzM0O3NlbmQoZ2VubClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRuID0gcmVjdihmZCwgcmJ1Ziwgc2l6ZW9mKHJidWYpLCAwKTtcbiYjNDM7XHRpZiAobiBcdTAwM2MgMClcbiYjNDM7XHRcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcbiYjNDM7XHRlbHNlIGlmICgoKHN0cnVjdCBubG1zZ2hkciAqKXJidWYpLVx1MDAzZW5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpXG4mIzQzO1x0XHRyZXQgPSAoKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEocmJ1ZikpLVx1MDAzZWVycm9yO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldCA9IDA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFNlbmQgYSBjb21tYW5kIGFuZCByZXR1cm4gdGhlIGZ1bGwgcmVwbHkgbWVzc2FnZTsgLWVycm5vIG9uIGZhaWx1cmUuICovXG4mIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXF1ZXN0X3JlcGx5KHVpbnQ4X3QgY21kLCBjaGFyICpyYnVmLCBzaXplX3QgcmxlbilcbiYjNDM7e1xuJiM0MztcdGNoYXIgYnVmWzI1Nl07XG4mIzQzO1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbiYjNDM7XHRpbnQgZmQgPSBnZW5sX29wZW4oKTtcbiYjNDM7XHRpbnQgb2ZmLCBuLCByZXQ7XG4mIzQzO1xuJiM0MztcdG9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QsIGNtZCk7XG4mIzQzO1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbiYjNDM7XG4mIzQzO1x0aWYgKHNlbmQoZmQsIGJ1Ziwgb2ZmLCAwKSBcdTAwM2MgMClcbiYjNDM7XHRcdGRpZShcJiMzNDtzZW5kKGdlbmwgcmVwbHkpXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0biA9IHJlY3YoZmQsIHJidWYsIHJsZW4sIDApO1xuJiM0MztcdGlmIChuIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0ID0gKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgPyAtRVRJTUVET1VUIDogLWVycm5vO1xuJiM0MztcdGVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbiYjNDM7XHRcdHJldCA9ICgoc3RydWN0IG5sbXNnZXJyICopTkxNU0dfREFUQShyYnVmKSktXHUwMDNlZXJyb3I7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0cmV0ID0gbjtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVzb2x2ZSB0aGUgXCYjMzQ7bmZzZFwmIzM0OyBnZW5sIGZhbWlseSBpZDsgLTEgaWYgbm90IHJlZ2lzdGVyZWQuICovXG4mIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXNvbHZlX25mc2Qodm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgYnVmWzEwMjRdLCByYnVmWzQwOTZdO1xuJiM0MztcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4mIzQzO1x0c3RydWN0IG5sbXNnaGRyICpyaCA9ICh2b2lkICopcmJ1ZjtcbiYjNDM7XHRzdHJ1Y3QgbmxhdHRyICpuYTtcbiYjNDM7XHRpbnQgZmQsIG9mZiwgbGVmdCwgaWQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBnZW5sX29wZW4oKTtcbiYjNDM7XHRvZmYgPSBnZW5sX2hkcihidWYsIEdFTkxfSURfQ1RSTCwgTkxNX0ZfUkVRVUVTVCwgQ1RSTF9DTURfR0VURkFNSUxZKTtcbiYjNDM7XHRvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLFxuJiM0MztcdFx0ICAgICAgIE5GU0RfRkFNSUxZX05BTUUsIHNpemVvZihORlNEX0ZBTUlMWV9OQU1FKSk7XG4mIzQzO1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbiYjNDM7XG4mIzQzO1x0aWYgKHNlbmQoZmQsIGJ1Ziwgb2ZmLCAwKSBcdTAwM2MgMClcbiYjNDM7XHRcdGRpZShcJiMzNDtzZW5kKEdFVEZBTUlMWSlcJiMzNDspO1xuJiM0MztcdGlmIChyZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApIFx1MDAzYyAwKVxuJiM0MztcdFx0ZGllKFwmIzM0O3JlY3YoR0VURkFNSUxZKVwmIzM0Oyk7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRpZiAocmgtXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0bmEgPSAodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEocmgpICYjNDM7IEdFTkxfSERSTEVOKTtcbiYjNDM7XHRsZWZ0ID0gcmgtXHUwMDNlbmxtc2dfbGVuIC0gTkxNU0dfSERSTEVOIC0gR0VOTF9IRFJMRU47XG4mIzQzO1x0d2hpbGUgKGxlZnQgXHUwMDNlPSAoaW50KU5MQV9IRFJMRU4pIHtcbiYjNDM7XHRcdGlmIChuYS1cdTAwM2VubGFfdHlwZSA9PSBDVFJMX0FUVFJfRkFNSUxZX0lEKSB7XG4mIzQzO1x0XHRcdGlkID0gKih1aW50MTZfdCAqKSgoY2hhciAqKW5hICYjNDM7IE5MQV9IRFJMRU4pO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGxlZnQgLT0gTkxBX0FMSUdONChuYS1cdTAwM2VubGFfbGVuKTtcbiYjNDM7XHRcdG5hID0gKHZvaWQgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfQUxJR040KG5hLVx1MDAzZW5sYV9sZW4pKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGlkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGxpc3RlbmVyIHJlcXVlc3QgYnVpbGRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJiM0MztcbiYjNDM7LyogRmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIG5lZ2F0aXZlIHRlc3RzOiBhbnkgZmllbGQgY2FuIGJlIG9taXR0ZWQvbWFsZm9ybWVkLiAqL1xuJiM0MztzdHJ1Y3QgcmF3X2xpc3RlbmVyIHtcbiYjNDM7XHRjb25zdCBjaGFyICp4cHJ0O1x0LyogTlVMTCAtXHUwMDNlIG9taXQgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUgKi9cbiYjNDM7XHRpbnQgZW1pdF9hZGRyO1x0XHQvKiAwIC1cdTAwM2Ugb21pdCBORlNEX0FfU09DS19BRERSICovXG4mIzQzO1x0Y29uc3Qgdm9pZCAqYWRkcjtcbiYjNDM7XHRpbnQgYWRkcl9sZW47XHRcdC8qIGJ5dGVzIHRvIGVtaXQgZm9yIE5GU0RfQV9TT0NLX0FERFIgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcHV0X3Jhd19saXN0ZW5lcihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IHN0cnVjdCByYXdfbGlzdGVuZXIgKnIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbmxhdHRyICpuZXN0ID0gKHZvaWQgKikoYnVmICYjNDM7IG9mZik7XG4mIzQzO1x0aW50IGlubmVyID0gb2ZmICYjNDM7IE5MQV9IRFJMRU47XG4mIzQzO1xuJiM0MztcdGlmIChyLVx1MDAzZWVtaXRfYWRkcilcbiYjNDM7XHRcdGlubmVyID0gcHV0X2F0dHIoYnVmLCBpbm5lciwgTkZTRF9BX1NPQ0tfQUREUiwgci1cdTAwM2VhZGRyLCByLVx1MDAzZWFkZHJfbGVuKTtcbiYjNDM7XHRpZiAoci1cdTAwM2V4cHJ0KVxuJiM0MztcdFx0aW5uZXIgPSBwdXRfYXR0cihidWYsIGlubmVyLCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSxcbiYjNDM7XHRcdFx0XHQgci1cdTAwM2V4cHJ0LCBzdHJsZW4oci1cdTAwM2V4cHJ0KSAmIzQzOyAxKTtcbiYjNDM7XHRuZXN0LVx1MDAzZW5sYV90eXBlID0gTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgfCBOTEFfRl9ORVNURUQ7XG4mIzQzO1x0bmVzdC1cdTAwM2VubGFfbGVuID0gaW5uZXIgLSBvZmY7XG4mIzQzO1x0cmV0dXJuIG9mZiAmIzQzOyBOTEFfQUxJR040KG5lc3QtXHUwMDNlbmxhX2xlbik7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFdlbGwtZm9ybWVkIGxvb3BiYWNrIGxpc3RlbmVyIGZvciBAZmFtaWx5IChBRl9JTkVUIG9yIEFGX0lORVQ2KS4gKi9cbiYjNDM7c3RhdGljIGludCBwdXRfbGlzdGVuZXJfYWYoY2hhciAqYnVmLCBpbnQgb2ZmLCBjb25zdCBjaGFyICp4cHJ0LCBpbnQgZmFtaWx5LFxuJiM0MztcdFx0XHQgICB1aW50MTZfdCBwb3J0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7MH07XG4mIzQzO1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IHhwcnQsIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnNzIH07XG4mIzQzO1xuJiM0MztcdGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHtcbiYjNDM7XHRcdHN0cnVjdCBzb2NrYWRkcl9pbjYgKnM2ID0gKHZvaWQgKilcdTAwMjZzcztcbiYjNDM7XG4mIzQzO1x0XHRzNi1cdTAwM2VzaW42X2ZhbWlseSA9IEFGX0lORVQ2O1xuJiM0MztcdFx0czYtXHUwMDNlc2luNl9wb3J0ID0gaHRvbnMocG9ydCk7XG4mIzQzO1x0XHRzNi1cdTAwM2VzaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrO1xuJiM0MztcdFx0ci5hZGRyX2xlbiA9IHNpemVvZigqczYpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gKnM0ID0gKHZvaWQgKilcdTAwMjZzcztcbiYjNDM7XG4mIzQzO1x0XHRzNC1cdTAwM2VzaW5fZmFtaWx5ID0gQUZfSU5FVDtcbiYjNDM7XHRcdHM0LVx1MDAzZXNpbl9wb3J0ID0gaHRvbnMocG9ydCk7XG4mIzQzO1x0XHRzNC1cdTAwM2VzaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spO1xuJiM0MztcdFx0ci5hZGRyX2xlbiA9IHNpemVvZigqczQpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gcHV0X3Jhd19saXN0ZW5lcihidWYsIG9mZiwgXHUwMDI2cik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgdWludDE2X3QgcG9ydClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBwdXRfbGlzdGVuZXJfYWYoYnVmLCBvZmYsIHhwcnQsIEFGX0lORVQsIHBvcnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIExJU1RFTkVSX0dFVCBwYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiYjNDM7XG4mIzQzO3N0cnVjdCBsaXN0ZW5lcl9lbnQge1xuJiM0MztcdGNoYXIgeHBydFsxNl07XG4mIzQzO1x0aW50IGZhbWlseTtcbiYjNDM7XHR1aW50MTZfdCBwb3J0O1xuJiM0MztcdHN0cnVjdCBpbl9hZGRyIGE0O1xuJiM0MztcdHN0cnVjdCBpbjZfYWRkciBhNjtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGFyc2VfbGlzdGVuZXJfZ2V0KGNvbnN0IGNoYXIgKnJidWYsIGludCBsZW4sXG4mIzQzO1x0XHRcdCAgICAgIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKm91dCwgaW50IG1heClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHZvaWQgKilyYnVmO1xuJiM0MztcdGNvbnN0IHN0cnVjdCBubGF0dHIgKm5hO1xuJiM0MztcdGludCBsZWZ0LCBjb3VudCA9IDA7XG4mIzQzO1xuJiM0MztcdCh2b2lkKWxlbjtcbiYjNDM7XHRuYSA9IChjb25zdCB2b2lkICopKHJidWYgJiM0MzsgTkxNU0dfSERSTEVOICYjNDM7IEdFTkxfSERSTEVOKTtcbiYjNDM7XHRsZWZ0ID0gbmxoLVx1MDAzZW5sbXNnX2xlbiAtIE5MTVNHX0hEUkxFTiAtIEdFTkxfSERSTEVOO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAobGVmdCBcdTAwM2U9IChpbnQpTkxBX0hEUkxFTikge1xuJiM0MztcdFx0aW50IGFsZW4gPSBuYS1cdTAwM2VubGFfbGVuO1xuJiM0MztcbiYjNDM7XHRcdGlmICgobmEtXHUwMDNlbmxhX3R5cGUgXHUwMDI2IE5MQV9UWVBFX01BU0spID09IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIGNvdW50IFx1MDAzYyBtYXgpIHtcbiYjNDM7XHRcdFx0Y29uc3Qgc3RydWN0IG5sYXR0ciAqaW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICYjNDM7IE5MQV9IRFJMRU4pO1xuJiM0MztcdFx0XHRpbnQgaWxlZnQgPSBhbGVuIC0gTkxBX0hEUkxFTjtcbiYjNDM7XHRcdFx0c3RydWN0IGxpc3RlbmVyX2VudCAqZSA9IFx1MDAyNm91dFtjb3VudF07XG4mIzQzO1xuJiM0MztcdFx0XHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XG4mIzQzO1x0XHRcdHdoaWxlIChpbGVmdCBcdTAwM2U9IChpbnQpTkxBX0hEUkxFTikge1xuJiM0MztcdFx0XHRcdGNvbnN0IHZvaWQgKmQgPSAoY29uc3QgY2hhciAqKWluICYjNDM7IE5MQV9IRFJMRU47XG4mIzQzO1x0XHRcdFx0aW50IHQgPSBpbi1cdTAwM2VubGFfdHlwZSBcdTAwMjYgTkxBX1RZUEVfTUFTSztcbiYjNDM7XG4mIzQzO1x0XHRcdFx0aWYgKHQgPT0gTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUpIHtcbiYjNDM7XHRcdFx0XHRcdHN0cm5jcHkoZS1cdTAwM2V4cHJ0LCBkLCBzaXplb2YoZS1cdTAwM2V4cHJ0KSAtIDEpO1xuJiM0MztcdFx0XHRcdH0gZWxzZSBpZiAodCA9PSBORlNEX0FfU09DS19BRERSKSB7XG4mIzQzO1x0XHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc3MgPSBkO1xuJiM0MztcbiYjNDM7XHRcdFx0XHRcdGUtXHUwMDNlZmFtaWx5ID0gc3MtXHUwMDNlc3NfZmFtaWx5O1xuJiM0MztcdFx0XHRcdFx0aWYgKHNzLVx1MDAzZXNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7XG4mIzQzO1x0XHRcdFx0XHRcdGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqcyA9IGQ7XG4mIzQzO1xuJiM0MztcdFx0XHRcdFx0XHRlLVx1MDAzZWE0ID0gcy1cdTAwM2VzaW5fYWRkcjtcbiYjNDM7XHRcdFx0XHRcdFx0ZS1cdTAwM2Vwb3J0ID0gbnRvaHMocy1cdTAwM2VzaW5fcG9ydCk7XG4mIzQzO1x0XHRcdFx0XHR9IGVsc2UgaWYgKHNzLVx1MDAzZXNzX2ZhbWlseSA9PSBBRl9JTkVUNikge1xuJiM0MztcdFx0XHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzID0gZDtcbiYjNDM7XG4mIzQzO1x0XHRcdFx0XHRcdGUtXHUwMDNlYTYgPSBzLVx1MDAzZXNpbjZfYWRkcjtcbiYjNDM7XHRcdFx0XHRcdFx0ZS1cdTAwM2Vwb3J0ID0gbnRvaHMocy1cdTAwM2VzaW42X3BvcnQpO1xuJiM0MztcdFx0XHRcdFx0fVxuJiM0MztcdFx0XHRcdH1cbiYjNDM7XHRcdFx0XHRpbGVmdCAtPSBOTEFfQUxJR040KGluLVx1MDAzZW5sYV9sZW4pO1xuJiM0MztcdFx0XHRcdGluID0gKGNvbnN0IHZvaWQgKikoKGNoYXIgKilpbiAmIzQzOyBOTEFfQUxJR040KGluLVx1MDAzZW5sYV9sZW4pKTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRsZWZ0IC09IE5MQV9BTElHTjQoYWxlbik7XG4mIzQzO1x0XHRuYSA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgJiM0MzsgTkxBX0FMSUdONChhbGVuKSk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBjb3VudDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZW5pZW5jZSB3cmFwcGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGxpc3RlbmVyX3NldChjb25zdCBjaGFyICphdHRycywgaW50IGxlbilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfTElTVEVORVJfU0VULCBhdHRycywgbGVuKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRmV0Y2ggdGhlIGN1cnJlbnQgbGlzdGVuZXJzOyByZXR1cm5zIGNvdW50IChcdTAwM2U9MCkgb3IgLWVycm5vLiAqL1xuJiM0MztzdGF0aWMgaW50IGxpc3RlbmVyX2dldChzdHJ1Y3QgbGlzdGVuZXJfZW50ICpvdXQsIGludCBtYXgpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIHJidWZbODE5Ml07XG4mIzQzO1x0aW50IG4gPSBnZW5sX3JlcXVlc3RfcmVwbHkoTkZTRF9DTURfTElTVEVORVJfR0VULCByYnVmLCBzaXplb2YocmJ1ZikpO1xuJiM0MztcbiYjNDM7XHRpZiAobiBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiBuO1xuJiM0MztcdHJldHVybiBwYXJzZV9saXN0ZW5lcl9nZXQocmJ1Ziwgbiwgb3V0LCBtYXgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGxpc3RlbmVyX2VudCAqZmluZF9saXN0ZW5lcihzdHJ1Y3QgbGlzdGVuZXJfZW50ICplLCBpbnQgbixcbiYjNDM7XHRcdFx0XHRcdCAgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSxcbiYjNDM7XHRcdFx0XHRcdCAgdWludDE2X3QgcG9ydClcbiYjNDM7e1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmIChlW2ldLmZhbWlseSA9PSBmYW1pbHkgXHUwMDI2XHUwMDI2IGVbaV0ucG9ydCA9PSBwb3J0IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICFzdHJjbXAoZVtpXS54cHJ0LCB4cHJ0KSlcbiYjNDM7XHRcdFx0cmV0dXJuIFx1MDAyNmVbaV07XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFN0YXJ0IChAbiBcdTAwM2UgMCkgb3Igc3RvcCAoQG4gPT0gMCkgbmZzZCB0aHJlYWRzIGluIHRoaXMgbmV0bnMuICovXG4mIzQzO3N0YXRpYyBpbnQgdGhyZWFkc19zZXQoaW50IG4pXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHR1aW50MzJfdCB2ID0gbjtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X2F0dHIoYXR0cnMsIDAsIE5GU0RfQV9TRVJWRVJfVEhSRUFEUywgXHUwMDI2diwgc2l6ZW9mKHYpKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGdlbmxfcmVxdWVzdChORlNEX0NNRF9USFJFQURTX1NFVCwgYXR0cnMsIG9mZik7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyLW5ldG5zIGxvY2FsIHJwY2JpbmQgc3R1YiAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBDcmVhdGluZyBhIGxpc3RlbmVyIHJlZ2lzdGVycyB3aXRoIHJwY2JpbmQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKClcbiYjNDM7ICogcGFzc2VzIGZsYWdzIG9mIDAsIHNvIHBtYXBfcmVnaXN0ZXIgaXMgdHJ1ZSBpbiBzdmNfc2V0dXBfc29ja2V0KCksIGFuZFxuJiM0MzsgKiBuZnNkX3ZlcnNpb24zIGlzIHJlZ2lzdGVyYWJsZSBieSBkZWZhdWx0IGFuZCBkb2VzIG5vdCBzZXQgdnNfcnBjYl9vcHRubCxcbiYjNDM7ICogc28gYSByZWdpc3RyYXRpb24gZmFpbHVyZSBhYm9ydHMgbGlzdGVuZXIgY3JlYXRpb24uIFRoZSBhYnN0cmFjdCBBRl9MT0NBTFxuJiM0MzsgKiBuYW1lIHRoZSBrZXJuZWwgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zICh1bml4X2ZpbmRfYWJzdHJhY3QoKSB0YWtlcyBhXG4mIzQzOyAqIHN0cnVjdCBuZXQpLCBzbyBhbnN3ZXIgaXQgaGVyZSBhbmQgc3RheSBvdXQgb2YgdGhlIGhvc3QmIzM5O3MgcnBjYmluZC5cbiYjNDM7ICpcbiYjNDM7ICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZFxuJiM0MzsgKiBTRVQvVU5TRVQgZ2V0IFRSVUUsIGZvciBib3RoIFJQQ0JWRVJTXzIgYW5kIFJQQ0JWRVJTXzQuIHY0IGhhcyB0byBiZVxuJiM0MzsgKiBhbnN3ZXJlZCBiZWNhdXNlIF9fc3ZjX3JwY2JfcmVnaXN0ZXI2KCkgdHVybnMgYSB2NCByZWZ1c2FsIGludG9cbiYjNDM7ICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLlxuJiM0MzsgKlxuJiM0MzsgKiBJbiBSUENCX1NUVUJfUkVGVVNFIG1vZGUgU0VUIGlzIGFuc3dlcmVkIEZBTFNFIGluc3RlYWQsIHdoaWNoXG4mIzQzOyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seVxuJiM0MzsgKiBzdmNfdW5yZWdpc3RlcigpIGlzc3VlcyBpdCwgYW5kIGl0IGRpc2NhcmRzIHRoZSByZXN1bHQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIFJQQ0JfUFJPR1JBTVx0XHQxMDAwMDBcbiYjNDM7I2RlZmluZSBSUENCX1BST0NfTlVMTFx0XHQwXG4mIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1NFVFx0XHQxXG4mIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUXHRcdDJcbiYjNDM7I2RlZmluZSBSUENCX0FCU1RSQUNUX05BTUVcdFwmIzM0Oy9ydW4vcnBjYmluZC5zb2NrXCYjMzQ7XG4mIzQzOyNkZWZpbmUgUlBDQl9TVFVCX01BWENPTk5cdDRcbiYjNDM7XG4mIzQzO2VudW0geyBSUENCX1NUVUJfQUNDRVBULCBSUENCX1NUVUJfUkVGVVNFIH07XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9saXN0ZW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl91biBzdW4gPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9O1xuJiM0MztcdHNpemVfdCBubGVuID0gc3RybGVuKFJQQ0JfQUJTVFJBQ1RfTkFNRSk7XG4mIzQzO1x0c29ja2xlbl90IGFsZW47XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHQvKiBBYnN0cmFjdCBuYW1lcyBhcmUgbGVuZ3RoLWRlbGltaXRlZCwgc28gdGhlIGxlbmd0aCBtdXN0IG1hdGNoLiAqL1xuJiM0MztcdG1lbWNweShzdW4uc3VuX3BhdGggJiM0MzsgMSwgUlBDQl9BQlNUUkFDVF9OQU1FLCBubGVuKTtcbiYjNDM7XHRhbGVuID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgJiM0MzsgMSAmIzQzOyBubGVuO1xuJiM0MztcbiYjNDM7XHRmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopXHUwMDI2c3VuLCBhbGVuKSBcdTAwM2MgMCB8fFxuJiM0MztcdCAgICBsaXN0ZW4oZmQsIFJQQ0JfU1RVQl9NQVhDT05OKSBcdTAwM2MgMCkge1xuJiM0MztcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gZmQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgZG9uZSA9IDA7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChkb25lIFx1MDAzYyBsZW4pIHtcbiYjNDM7XHRcdHNzaXplX3QgbiA9IHJlYWQoZmQsIChjaGFyICopYnVmICYjNDM7IGRvbmUsIGxlbiAtIGRvbmUpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChuIFx1MDAzYz0gMClcbiYjNDM7XHRcdFx0cmV0dXJuIC0xO1xuJiM0MztcdFx0ZG9uZSAmIzQzOz0gbjtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIEhhbmRsZSBvbmUgcmVjb3JkLW1hcmtlZCBSUEMgY2FsbC4gUmV0dXJucyAtMSB3aGVuIHRoZSBwZWVyIGlzIGRvbmUuICovXG4mIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX2NhbGwoaW50IGZkLCBpbnQgbW9kZSlcbiYjNDM7e1xuJiM0MztcdHVpbnQzMl90IG1hcmssIGNhbGxbNl0sIHJlcFs3XTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgbGVuLCBucmVwID0gNjtcbiYjNDM7XHRzaXplX3QgcmVwbGVuO1xuJiM0MztcbiYjNDM7XHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIFx1MDAyNm1hcmssIHNpemVvZihtYXJrKSkpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0bGVuID0gbnRvaGwobWFyaykgXHUwMDI2IDB4N2ZmZmZmZmY7XG4mIzQzO1x0aWYgKGxlbiBcdTAwM2Mgc2l6ZW9mKGNhbGwpIHx8IGxlbiBcdTAwM2UgNDA5NilcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdC8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqL1xuJiM0MztcdGZvciAobGVuIC09IHNpemVvZihjYWxsKTsgbGVuOyApIHtcbiYjNDM7XHRcdGNoYXIgc2lua1syNTZdO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IG4gPSBsZW4gXHUwMDNlIHNpemVvZihzaW5rKSA/IHNpemVvZihzaW5rKSA6IGxlbjtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIHNpbmssIG4pKVxuJiM0MztcdFx0XHRyZXR1cm4gLTE7XG4mIzQzO1x0XHRsZW4gLT0gbjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJlcFswXSA9IGNhbGxbMF07XHRcdC8qIHhpZCAqL1xuJiM0MztcdHJlcFsxXSA9IGh0b25sKDEpO1x0XHQvKiBSRVBMWSAqL1xuJiM0MztcdHJlcFsyXSA9IGh0b25sKDApO1x0XHQvKiBNU0dfQUNDRVBURUQgKi9cbiYjNDM7XHRyZXBbM10gPSBodG9ubCgwKTtcdFx0LyogdmVyaWZpZXIgZmxhdm9yIEFVVEhfTlVMTCAqL1xuJiM0MztcdHJlcFs0XSA9IGh0b25sKDApO1x0XHQvKiB2ZXJpZmllciBsZW5ndGggKi9cbiYjNDM7XHRyZXBbNV0gPSBodG9ubCgwKTtcdFx0LyogU1VDQ0VTUyAqL1xuJiM0MztcbiYjNDM7XHRpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7XG4mIzQzO1x0XHRyZXBbNV0gPSBodG9ubCgxKTtcdC8qIFBST0dfVU5BVkFJTCAqL1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7XG4mIzQzO1x0XHRjYXNlIFJQQ0JfUFJPQ19OVUxMOlxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgUlBDQl9QUk9DX1NFVDpcbiYjNDM7XHRcdFx0cmVwWzZdID0gaHRvbmwobW9kZSA9PSBSUENCX1NUVUJfUkVGVVNFID8gMCA6IDEpO1xuJiM0MztcdFx0XHRucmVwID0gNztcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIFJQQ0JfUFJPQ19VTlNFVDpcbiYjNDM7XHRcdFx0cmVwWzZdID0gaHRvbmwoMSk7XHQvKiBUUlVFICovXG4mIzQzO1x0XHRcdG5yZXAgPSA3O1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHJlcFs1XSA9IGh0b25sKDMpO1x0LyogUFJPQ19VTkFWQUlMICovXG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXBsZW4gPSBucmVwICogc2l6ZW9mKHJlcFswXSk7XG4mIzQzO1x0bWFyayA9IGh0b25sKDB4ODAwMDAwMDAgfCByZXBsZW4pO1xuJiM0MztcdGlmICh3cml0ZShmZCwgXHUwMDI2bWFyaywgc2l6ZW9mKG1hcmspKSAhPSAoc3NpemVfdClzaXplb2YobWFyaykgfHxcbiYjNDM7XHQgICAgd3JpdGUoZmQsIHJlcCwgcmVwbGVuKSAhPSAoc3NpemVfdClyZXBsZW4pXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBwb2xsZmQgcGZkWzEgJiM0MzsgUlBDQl9TVFVCX01BWENPTk5dO1xuJiM0MztcdG5mZHNfdCBuID0gMSwgaTtcbiYjNDM7XG4mIzQzO1x0cGZkWzBdLmZkID0gbGZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHQvKiBzdG9wIHBvbGxpbmcgdGhlIGxpc3RlbmVyIHdoZW4gZnVsbCwgb3IgcG9sbCgpIHNwaW5zICovXG4mIzQzO1x0XHRwZmRbMF0uZXZlbnRzID0gbiBcdTAwM2MgMSAmIzQzOyBSUENCX1NUVUJfTUFYQ09OTiA/IFBPTExJTiA6IDA7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHBvbGwocGZkLCBuLCAtMSkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocGZkWzBdLnJldmVudHMgXHUwMDI2IFBPTExJTikge1xuJiM0MztcdFx0XHRpbnQgYyA9IGFjY2VwdChsZmQsIE5VTEwsIE5VTEwpO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKGMgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHRcdFx0cGZkW25dLmZkID0gYztcbiYjNDM7XHRcdFx0XHRwZmRbbl0uZXZlbnRzID0gUE9MTElOO1xuJiM0MztcdFx0XHRcdG4mIzQzOyYjNDM7O1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKCEocGZkW2ldLnJldmVudHMgXHUwMDI2IChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikpKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRpZiAocnBjYl9zdHViX2NhbGwocGZkW2ldLmZkLCBtb2RlKSkge1xuJiM0MztcdFx0XHRcdGNsb3NlKHBmZFtpXS5mZCk7XG4mIzQzO1x0XHRcdFx0cGZkW2ldID0gcGZkWy0tbl07XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJldHVybnMgdGhlIHN0dWImIzM5O3MgcGlkLCBvciAtMS4gVGhlIHNvY2tldCBpcyBsaXN0ZW5pbmcgYmVmb3JlIHdlIGZvcmsuICovXG4mIzQzO3N0YXRpYyBwaWRfdCBycGNiX3N0dWJfc3RhcnQoaW50IG1vZGUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgbGZkID0gcnBjYl9zdHViX2xpc3RlbigpO1xuJiM0MztcdHBpZF90IHBpZDtcbiYjNDM7XG4mIzQzO1x0aWYgKGxmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cGlkID0gZm9yaygpO1xuJiM0MztcdGlmIChwaWQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGNsb3NlKGxmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChwaWQgPT0gMCkge1xuJiM0MztcdFx0c2lnbmFsKFNJR1BJUEUsIFNJR19JR04pO1xuJiM0MztcdFx0cHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lHS0lMTCk7XG4mIzQzO1x0XHRpZiAoZ2V0cHBpZCgpID09IDEpXHRcdC8qIHJhY2VkIHdpdGggcGFyZW50IGV4aXQgKi9cbiYjNDM7XHRcdFx0X2V4aXQoMCk7XG4mIzQzO1x0XHRycGNiX3N0dWJfc2VydmUobGZkLCBtb2RlKTtcbiYjNDM7XHRcdF9leGl0KDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Y2xvc2UobGZkKTtcbiYjNDM7XHRyZXR1cm4gcGlkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBTd2FwIHRoZSBzdHViIGZvciBvbmUgaW4gQG1vZGUuIFNhZmUgYmVmb3JlIHRoZSBmaXJzdCByZXF1ZXN0OiBubyBzZXJ2XG4mIzQzOyAqIGV4aXN0cyB5ZXQsIHNvIHRoZSBrZXJuZWwgaGFzIG5vdCBjb25uZWN0ZWQgYW5kIHRoZSBhYnN0cmFjdCBuYW1lIGlzIGZyZWVcbiYjNDM7ICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBycGNiX3N0dWJfcmVzdGFydChwaWRfdCAqcGlkLCBpbnQgbW9kZSlcbiYjNDM7e1xuJiM0MztcdGlmICgqcGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRraWxsKCpwaWQsIFNJR0tJTEwpO1xuJiM0MztcdFx0d2FpdHBpZCgqcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0KnBpZCA9IHJwY2Jfc3R1Yl9zdGFydChtb2RlKTtcbiYjNDM7XHRyZXR1cm4gKnBpZCBcdTAwM2UgMCA/IDAgOiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4mIzQzO1xuJiM0MztGSVhUVVJFKG5mc2RfbGlzdGVuZXIpIHtcbiYjNDM7XHRwaWRfdCBycGNiZDtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO0ZJWFRVUkVfU0VUVVAobmZzZF9saXN0ZW5lcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpZnJlcSBpZnIgPSB7MH07XG4mIzQzO1x0c3RydWN0IHN0YXQgc3Q7XG4mIzQzO1x0aW50IHM7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRldWlkKCkgIT0gMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDttdXN0IGJlIHJ1biBhcyByb290XCYjMzQ7KTtcbiYjNDM7XHRpZiAodW5zaGFyZShDTE9ORV9ORVdORVQgfCBDTE9ORV9ORVdOUykgXHUwMDNjIDApXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7dW5zaGFyZShORVdORVR8TkVXTlMpOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRpZiAobW91bnQoXCYjMzQ7XCYjMzQ7LCBcJiMzNDsvXCYjMzQ7LCBOVUxMLCBNU19SRUMgfCBNU19QUklWQVRFLCBOVUxMKSBcdTAwM2MgMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDttb3VudCgvIHByaXZhdGUpOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBLZWVwIHRoZSBrZXJuZWwmIzM5O3MgcnBjYmluZCBjbGllbnQgaW5zaWRlIHRoaXMgbmFtZXNwYWNlLiBUaGVcbiYjNDM7XHQgKiBhYnN0cmFjdCBzb2NrZXQgaXQgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zLCBidXQgdGhlXG4mIzQzO1x0ICogXCYjMzQ7L3Zhci9ydW4vcnBjYmluZC5zb2NrXCYjMzQ7IGZhbGxiYWNrIGlzIG5vdCwgc28gaGlkZSB0aGUgcGF0aC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAobW91bnQoXCYjMzQ7dG1wZnNcJiMzNDssIFwmIzM0Oy9ydW5cJiMzNDssIFwmIzM0O3RtcGZzXCYjMzQ7LCAwLCBOVUxMKSBcdTAwM2MgMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDttb3VudCh0bXBmcyBvbiAvcnVuKTogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0aWYgKGxzdGF0KFwmIzM0Oy92YXIvcnVuXCYjMzQ7LCBcdTAwMjZzdCkgPT0gMCBcdTAwMjZcdTAwMjYgU19JU0RJUihzdC5zdF9tb2RlKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgbW91bnQoXCYjMzQ7dG1wZnNcJiMzNDssIFwmIzM0Oy92YXIvcnVuXCYjMzQ7LCBcJiMzNDt0bXBmc1wmIzM0OywgMCwgTlVMTCkgXHUwMDNjIDApXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7bW91bnQodG1wZnMgb24gL3Zhci9ydW4pOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XG4mIzQzO1x0LyogQnJpbmcgbG9vcGJhY2sgdXAgc28gbGlzdGVuZXIgYmluZHMgKDEyNy4wLjAuMSAvIDo6MSkgd29yay4gKi9cbiYjNDM7XHRzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApO1xuJiM0MztcdEFTU0VSVF9HRShzLCAwKTtcbiYjNDM7XHRzdHJjcHkoaWZyLmlmcl9uYW1lLCBcJiMzNDtsb1wmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIGlvY3RsKHMsIFNJT0NHSUZGTEFHUywgXHUwMDI2aWZyKSk7XG4mIzQzO1x0aWZyLmlmcl9mbGFncyB8PSBJRkZfVVAgfCBJRkZfUlVOTklORztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ1NJRkZMQUdTLCBcdTAwMjZpZnIpKTtcbiYjNDM7XHRjbG9zZShzKTtcbiYjNDM7XG4mIzQzO1x0bmZzZF9mYW1pbHkgPSBnZW5sX3Jlc29sdmVfbmZzZCgpO1xuJiM0MztcdGlmIChuZnNkX2ZhbWlseSBcdTAwM2MgMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtuZnNkIGdlbmwgZmFtaWx5IG5vdCBmb3VuZCAobW9kcHJvYmUgbmZzZD8pXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0c2VsZi1cdTAwM2VycGNiZCA9IHJwY2Jfc3R1Yl9zdGFydChSUENCX1NUVUJfQUNDRVBUKTtcbiYjNDM7XHRpZiAoc2VsZi1cdTAwM2VycGNiZCBcdTAwM2MgMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtjYW5ub3Qgc3RhcnQgdGhlIHJwY2JpbmQgc3R1YjogJXNcJiMzNDssXG4mIzQzO1x0XHQgICAgIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO0ZJWFRVUkVfVEVBUkRPV04obmZzZF9saXN0ZW5lcilcbiYjNDM7e1xuJiM0MztcdGlmIChzZWxmLVx1MDAzZXJwY2JkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRraWxsKHNlbGYtXHUwMDNlcnBjYmQsIFNJR0tJTEwpO1xuJiM0MztcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXJwY2JkLCBOVUxMLCAwKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSB2YWxpZGF0aW9uIC8gbmVnYXRpdmUgPT09PT09PT09PT09PT09PT09PT09ICovXG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2VtcHR5X2xpc3Rfb2spXG4mIzQzO3tcbiYjNDM7XHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF90b29fbWFueSlcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBjaGFyIGF0dHJzWzEgXHUwMDNjXHUwMDNjIDIwXTtcbiYjNDM7XHRpbnQgaSwgb2ZmID0gMDtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgMTAyNTsgaSYjNDM7JiM0MzspXHRcdC8qIFx1MDAzZSBORlNEX05MX0xJU1RFTkVSX01BWCAoMTAyNCkgKi9cbiYjNDM7XHRcdG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgb2ZmLCBcJiMzNDt1ZHBcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1x0RVhQRUNUX0VRKC1FMkJJRywgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9taXNzaW5nX2FkZHIpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCYjMzQ7dGNwXCYjMzQ7LCAuZW1pdF9hZGRyID0gMCB9O1xuJiM0MztcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ190cmFuc3BvcnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gczQgPSB7IC5zaW5fZmFtaWx5ID0gQUZfSU5FVCwgLnNpbl9wb3J0ID0gaHRvbnMoVEVTVF9QT1JUKSB9O1xuJiM0MztcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBOVUxMLCAuZW1pdF9hZGRyID0gMSxcbiYjNDM7XHRcdFx0XHQgIC5hZGRyID0gXHUwMDI2czQsIC5hZGRyX2xlbiA9IHNpemVvZihzNCkgfTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIG5hbWUgbWF0Y2hpbmcgbm8gdHJhbnNwb3J0IGNsYXNzIG11c3QgYmUgcmVmdXNlZCBiZWZvcmUgbmZzZF9tdXRleCBpc1xuJiM0MzsgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHNcbiYjNDM7ICogcmVxdWVzdF9tb2R1bGUoXCYjMzQ7c3ZjJXNcJiMzNDssIG5hbWUpIHVwY2FsbC5cbiYjNDM7ICovXG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX3RyYW5zcG9ydClcbiYjNDM7e1xuJiM0MztcdGNoYXIgYXR0cnNbNjRdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwmIzM0O2JvZ3VzX3hwcnRcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUSgtRVBST1RPTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2FkZHJfdG9vX3Nob3J0KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgY2hhciB0aW55ID0gMDtcbiYjNDM7XHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCYjMzQ7dGNwXCYjMzQ7LCAuZW1pdF9hZGRyID0gMSxcbiYjNDM7XHRcdFx0XHQgIC5hZGRyID0gXHUwMDI2dGlueSwgLmFkZHJfbGVuID0gMSB9O1xuJiM0MztcdGNoYXIgYXR0cnNbNjRdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldF9zaG9ydClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4mIzQzO1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFwmIzM0O3RjcFwmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2czQsXG4mIzQzO1x0XHRcdFx0ICAuYWRkcl9sZW4gPSBzaXplb2Yoc2FfZmFtaWx5X3QpICYjNDM7IDIgfTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXQ2X3Nob3J0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4mIzQzO1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFwmIzM0O3RjcFwmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2czYsXG4mIzQzO1x0XHRcdFx0ICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuJiM0MztcdGNoYXIgYXR0cnNbNjRdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX2ZhbWlseSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9O1xuJiM0MztcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcJiMzNDt0Y3BcJiMzNDssIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnNzLFxuJiM0MztcdFx0XHRcdCAgLmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgfTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHsgLnNzX2ZhbWlseSA9IEFGX1VOSVggfTtcbiYjNDM7XHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIGJhZCA9IHsgLnhwcnQgPSBcJiMzNDt0Y3BcJiMzNDssIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnNzLFxuJiM0MztcdFx0XHRcdCAgICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuJiM0MztcdGNoYXIgYXR0cnNbMTI4XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXHUwMDI2YmFkKTtcbiYjNDM7XHQvKiBUaGUgd2hvbGUgcmVxdWVzdCBpcyByZWplY3RlZCBkdXJpbmcgdmFsaWRhdGlvbjsgbm90aGluZyBhcHBsaWVkLiAqL1xuJiM0MztcdEVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIHJlamVjdGVkIHJlcXVlc3QgbXVzdCBsZWF2ZSB0aGUgbGlzdGVuZXJzIHRoYXQgYXJlIGFscmVhZHkgdXAgYWxvbmUuXG4mIzQzOyAqIFRoZSBlcnJubyBhbG9uZSBkb2VzIG5vdCBzaG93IHRoYXQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCkgcmV0dXJuc1xuJiM0MzsgKiAtRVBST1RPTk9TVVBQT1JUIGZvciBhbiB1bmtub3duIG5hbWUgdG9vLiBXaGF0IGRpZmZlcnMgaXMgaG93IGZhciB0aGVcbiYjNDM7ICogcmVxdWVzdCBnZXRzIC0tIHdpdGhvdXQgdGhlIGNoZWNrIGluIG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKCksXG4mIzQzOyAqIG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoKSBoYXMgYWxyZWFkeSBtb3ZlZCB0aGUgdW5tYXRjaGVkIHRjcCBsaXN0ZW5lclxuJiM0MzsgKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGVcbiYjNDM7ICogbmFtZSBmYWlscy5cbiYjNDM7ICovXG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfcmVqZWN0X2tlZXBzX2xpc3RlbmVycylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuJiM0MztcdGNoYXIgZ29vZFs2NF0sIGJhZFs2NF07XG4mIzQzO1x0aW50IG9nID0gcHV0X2xpc3RlbmVyKGdvb2QsIDAsIFwmIzM0O3RjcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XHRpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYmFkLCAwLCBcJiMzNDtib2d1c194cHJ0XCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGdvb2QsIG9nKSk7XG4mIzQzO1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChiYWQsIG9iKSk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4mIzQzO1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCBcJiMzNDt0Y3BcJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gZnVuY3Rpb25hbCAvIHJvdW5kLXRyaXAgPT09PT09PT09PT09PT09PT09PT09ICovXG4mIzQzO1xuJiM0MzsvKiBMSVNURU5FUl9HRVQgd2l0aCBubyBzZXJ2IGluIHRoaXMgbmV0bnMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiAqL1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19nZXRfZW1wdHkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX3RjcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuJiM0MztcdGNoYXIgYXR0cnNbNjRdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwmIzM0O3RjcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4mIzQzO1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbiYjNDM7XHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwmIzM0O3RjcFwmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4mIzQzO1x0RVhQRUNUX0VRKGh0b25sKElOQUREUl9MT09QQkFDSyksIGdvdFswXS5hNC5zX2FkZHIpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdWRwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4mIzQzO1x0Y2hhciBhdHRyc1s2NF07XG4mIzQzO1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCYjMzQ7dWRwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCYjMzQ7dWRwXCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX211bHRpKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4mIzQzO1x0Y2hhciBhdHRyc1sxMjhdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwmIzM0O3RjcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XG4mIzQzO1x0b2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsIFwmIzM0O3VkcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXCYjMzQ7dGNwXCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbiYjNDM7XHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwmIzM0O3VkcFwmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lkZW1wb3RlbnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0MztcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1x0XHQvKiByZS1zZXQgc2FtZSBsaXN0ICovXG4mIzQzO1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbiYjNDM7XHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwmIzM0O3RjcFwmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2FkZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuJiM0MztcdGNoYXIgb25lWzY0XSwgdHdvWzEyOF07XG4mIzQzO1x0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcdGludCBvMiA9IHB1dF9saXN0ZW5lcih0d28sIDAsIFwmIzM0O3RjcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XG4mIzQzO1x0bzIgPSBwdXRfbGlzdGVuZXIodHdvLCBvMiwgXCYjMzQ7dWRwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvMSkpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpO1x0XHQvKiBhZGQgdWRwLCBrZWVwIHRjcCAqL1xuJiM0MztcdEFTU0VSVF9FUSgyLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4mIzQzO1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcJiMzNDt0Y3BcJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXCYjMzQ7dWRwXCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfcmVtb3ZlX3N1YnNldClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuJiM0MztcdGNoYXIgYm90aFsxMjhdLCBvbmVbNjRdO1xuJiM0MztcdGludCBvYiA9IHB1dF9saXN0ZW5lcihib3RoLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1x0aW50IG9vID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRvYiA9IHB1dF9saXN0ZW5lcihib3RoLCBvYiwgXCYjMzQ7dWRwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYm90aCwgb2IpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgb28pKTtcdFx0LyogZHJvcCB1ZHAgKi9cbiYjNDM7XHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCYjMzQ7dGNwXCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfZW1wdHlfZGVzdHJveXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0MztcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpO1x0XHQvKiBlbXB0eSAtXHUwMDNlIGRlc3Ryb3kgc2VydiAqL1xuJiM0MztcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmLCBzO1xuJiM0MztcbiYjNDM7XHRzID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7XG4mIzQzO1x0aWYgKHMgXHUwMDNjIDApXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7SVB2NiB1bmF2YWlsYWJsZTogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0Y2xvc2Uocyk7XG4mIzQzO1xuJiM0MztcdG9mZiA9IHB1dF9saXN0ZW5lcl9hZihhdHRycywgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBBRl9JTkVUNiwgVEVTVF9QT1JUKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCYjMzQ7dGNwXCYjMzQ7LCBBRl9JTkVUNiwgVEVTVF9QT1JUKSk7XG4mIzQzO1x0RVhQRUNUX0VRKDAsIG1lbWNtcChcdTAwMjZnb3RbMF0uYTYsIFx1MDAyNmluNmFkZHJfbG9vcGJhY2ssIHNpemVvZihpbjZhZGRyX2xvb3BiYWNrKSkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gcnBjYmluZCByZWdpc3RyYXRpb24gPT09PT09PT09PT09PT09PT09PT09ICovXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIHJwY2JpbmQgdGhhdCByZWZ1c2VzIHRoZSByZWdpc3RyYXRpb24gbXVzdCBmYWlsIGxpc3RlbmVyIGNyZWF0aW9uLFxuJiM0MzsgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgZXJyb3IgaGFzIHRvIHN1cnZpdmUgc3ZjX3JlZ2lzdGVyKCkmIzM5O3Mgd2FsayBvdmVyIHN2X3Byb2dyYW1zIHRvIGdldFxuJiM0MzsgKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHlcbiYjNDM7ICogYSBOVUxMIGFuZCBhIHZzX2hpZGRlbiB2ZXJzaW9uLCBhbmQgc3ZjX2dlbmVyaWNfcnBjYmluZF9zZXQoKSByZXBvcnRzIDBcbiYjNDM7ICogZm9yIGJvdGgsIHNvIGFuIHN2Y19yZWdpc3RlcigpIHRoYXQga2VlcHMgdGhlIGxhc3QgcmVzdWx0IHJhdGhlciB0aGFuIHRoZVxuJiM0MzsgKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLlxuJiM0MzsgKi9cbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9yZWdpc3Rlcl9yZWZ1c2VkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4mIzQzO1x0Y2hhciBhdHRyc1s2NF07XG4mIzQzO1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgcnBjYl9zdHViX3Jlc3RhcnQoXHUwMDI2c2VsZi1cdTAwM2VycGNiZCwgUlBDQl9TVFVCX1JFRlVTRSkpO1xuJiM0MztcbiYjNDM7XHRFWFBFQ1RfRVEoLUVBQ0NFUywgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7XHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gdGhyZWFkcyAvIC1FQlVTWSBzZW1hbnRpY3MgPT09PT09PT09PT09PT09PT09PT09ICovXG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fY2hhbmdlKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBvbmVbNjRdLCB0d29bMTI4XTtcbiYjNDM7XHRpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1x0aW50IG8yID0gcHV0X2xpc3RlbmVyKHR3bywgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCBcJiMzNDt1ZHBcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcdFx0XHQvKiB0aHJlYWRzIG5vdyBydW5uaW5nICovXG4mIzQzO1x0RVhQRUNUX0VRKC1FQlVTWSwgbGlzdGVuZXJfc2V0KHR3bywgbzIpKTtcdC8qIGFkZCByZWZ1c2VkICovXG4mIzQzO1x0dGhyZWFkc19zZXQoMCk7XHRcdFx0XHRcdC8qIHN0b3AgYmVmb3JlIG5ldG5zIGV4aXQgKi9cbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX3JlbW92ZSlcbiYjNDM7e1xuJiM0MztcdGNoYXIgb25lWzY0XTtcbiYjNDM7XHRpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvMSkpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7XG4mIzQzO1x0RVhQRUNUX0VRKC1FQlVTWSwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcdC8qIHJlbW92ZSByZWZ1c2VkICovXG4mIzQzO1x0dGhyZWFkc19zZXQoMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3Ncbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MDkxYjQ1ZDIyNmJhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL3NldHRpbmdzXG5AQCAtMCwwICYjNDM7MSBAQFxuJiM0Mzt0aW1lb3V0PTEyMFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjM5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtORlNEJiMzNDssCiAgICAmIzM0O05GU0RfVjQmIzM0OywKICAgICYjMzQ7U1VOUlBDJiMzNDssCiAgICAmIzM0O05FVF9OUyYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCYjMzQ7LAogICAgJiMzNDtzdmNfcmVnaXN0ZXImIzM0OywKICAgICYjMzQ7cnBjYl9jcmVhdGVfbG9jYWwmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDYwMWViNzA0OGZkMWNjMzcxOTUxZjU4YWYwMGNjMjUwZjllMmJhYzMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAxMCAyMTozOTozNyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDdlMWQ1YTVkNjUxMWUuLmY3M2EyZWE0MjU1NzEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTk3MywyMSAmIzQzOzE5NzMsMzkgQEAgaW50IG5mc2RfbmxfdmVyc2lvbl9nZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCXJldHVybiBlcnI7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFRyYW5zcG9ydCBjbGFzc2VzIE5GU0Qga25vd3MgaG93IHRvIGluc3RhbnRpYXRlLiBWZXR0aW5nIHRoZSBuYW1lIGhlcmUKJiM0MzsgKiBrZWVwcyBhIGJvZ3VzIHN0cmluZyBmcm9tIHJlYWNoaW5nIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCksIHdoZXJlIGFuCiYjNDM7ICogdW5rbm93biBuYW1lIHRyaWdnZXJzIGEgcmVxdWVzdF9tb2R1bGUoJiMzNDtzdmMlcyYjMzQ7LCBuYW1lKSB1cGNhbGwgdW5kZXIKJiM0MzsgKiBuZnNkX211dGV4LgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdXBwb3J0ZWRbXSA9IHsgJiMzNDt0Y3AmIzM0OywgJiMzNDt1ZHAmIzM0OywgJiMzNDtyZG1hJiMzNDsgfTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKHN1cHBvcnRlZCk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKCFzdHJjbXAobmFtZSwgc3VwcG9ydGVkW2ldKSkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKiBVcHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBhIHNpbmdsZSByZXF1ZXN0IG1heSBjYXJyeS4gKi8KJiM0MzsjZGVmaW5lIE5GU0RfTkxfTElTVEVORVJfTUFYCTEwMjQKJiM0MzsKIC8qKgogICogbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMgLSBzYW5pdHktY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgZnJvbSB1c2VybGFuZAogICogQGluZm86IG5ldGxpbmsgbWV0YWRhdGEgYW5kIGNvbW1hbmQgYXJndW1lbnRzCiAgKgotICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCBlYWNoIGVudHJ5Ci0gKiBpcyB3ZWxsLWZvcm1lZDogaXQgcGFyc2VzIGFnYWluc3QgdGhlIHBvbGljeSwgY2FycmllcyBib3RoIGFuIGFkZHJlc3MgYW5kCi0gKiBhIHRyYW5zcG9ydCBuYW1lLCBhbmQgdGhlIGFkZHJlc3MgaXMgbG9uZyBlbm91Z2ggZm9yIGl0cyBmYW1pbHkuIERvaW5nCi0gKiB0aGlzIHVwIGZyb250IGxldHMgdGhlIGNhbGxlcnMgYmVsb3cgYXNzdW1lIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkIGFuZAotICogZ3VhcmFudGVlcyB3ZSBtYWtlIG5vIGNoYW5nZXMgd2hlbiB0aGUgcmVxdWVzdCBpcyBtYWxmb3JtZWQuCiYjNDM7ICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCB0aGUgbGlzdCBpcwomIzQzOyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC4KICAqCiAgKiBSZXR1cm46IDAgaWYgZXZlcnkgZW50cnkgaXMgdmFsaWQsIG9yIGEgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cjsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAlpbnQgcmVtOwogCiAJbmxtc2dfZm9yX2VhY2hfYXR0cl90eXBlKGF0dHIsIE5GU0RfQV9TRVJWRVJfU09DS19BRERSLCBpbmZvLSZndDtubGhkciwKQEAgLTE5OTYsNiAmIzQzOzIwMTQsMTEgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCQlzdHJ1Y3Qgc29ja2FkZHIgKnNhOwogCQlpbnQgZXJyOwogCiYjNDM7CQlpZiAoJiM0MzsmIzQzO2NvdW50ICZndDsgTkZTRF9OTF9MSVNURU5FUl9NQVgpIHsKJiM0MzsJCQlOTF9TRVRfRVJSX01TRyhpbmZvLSZndDtleHRhY2ssICYjMzQ7dG9vIG1hbnkgbGlzdGVuZXJzJiMzNDspOwomIzQzOwkJCXJldHVybiAtRTJCSUc7CiYjNDM7CQl9CiYjNDM7CiAJCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5GU0RfQV9TT0NLX01BWCwgYXR0ciwKIAkJCQkgICAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby0mZ3Q7ZXh0YWNrKTsKIAkJaWYgKGVyciAmbHQ7IDApCkBAIC0yMDA0LDYgJiM0MzsyMDI3LDkgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCQlpZiAoIXRiW05GU0RfQV9TT0NLX0FERFJdIHx8ICF0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAomIzQzOwkJaWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpCiYjNDM7CQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiYjNDM7CiAJCXNhID0gbmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfQUREUl0pOwogCQlpZiAobmxhX2xlbih0YltORlNEX0FfU09DS19BRERSXSkgJmx0OyBzaXplb2Yoc2EtJmd0O3NhX2ZhbWlseSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIxNTYsOCAmIzQzOzIxODIsMTIgQEAgaW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIAkJcmV0ID0gc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2Eoc2VydiwgeGNsX25hbWUsIG5ldCwgc2EsIDAsCiAJCQkJCSAgICAgIGN1cnJlbnRfY3JlZCgpKTsKIAkJLyogYWx3YXlzIHNhdmUgdGhlIGxhdGVzdCBlcnJvciAqLwotCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWlmIChyZXQgJmx0OyAwKSB7CiYjNDM7CQkJTkxfU0VUX0VSUl9NU0dfRk1UKGluZm8tJmd0O2V4dGFjaywKJiM0MzsJCQkJCSAgICYjMzQ7Y2Fubm90IGNyZWF0ZSAlcyBsaXN0ZW5lcjogJWQmIzM0OywKJiM0MzsJCQkJCSAgIHhjbF9uYW1lLCByZXQpOwogCQkJZXJyID0gcmV0OwomIzQzOwkJfQogCX0KIAogCWlmICghc2Vydi0mZ3Q7c3ZfbnJ0aHJlYWRzICZhbXA7JmFtcDsgbGlzdF9lbXB0eSgmYW1wO25uLSZndDtuZnNkX3NlcnYtJmd0O3N2X3Blcm1zb2NrcykpCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCA2YWEzNzIxODhjODZhLi4wYWEzNzZiODJhNTI2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTIyMSw2ICYjNDM7MjIxLDE2IEBAIHN0YXRpYyB2b2lkIHJwY2Jfc2V0X2xvY2FsKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHJwY19jbG50ICpjbG50LAogIyBkZWZpbmUgU1VOX0xFTihwdHIpIChvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKQkJXAogCQkgICAgICAmIzQzOyAxICYjNDM7IHN0cmxlbigocHRyKS0mZ3Q7c3VuX3BhdGggJiM0MzsgMSkpCiAKJiM0MzsvKgomIzQzOyAqIFRoZSBrZXJuZWwmIzM5O3MgcnBjYmluZCBjbGllbnQgdGFsa3Mgb25seSB0byB0aGUgbG9jYWwgcnBjYmluZCwgb3ZlciBsb29wYmFjawomIzQzOyAqIG9yIGEgbG9jYWwgQUZfTE9DQUwgc29ja2V0LCB3aGVyZSBhIGhlYWx0aHkgcnBjYmluZCBhbnN3ZXJzIGluIG1pY3Jvc2Vjb25kcy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHJwY190aW1lb3V0IHJwY2JfbG9jYWxfdGltZW91dCA9IHsKJiM0MzsJLnRvX2luaXR2YWwJPSAxICogSFosCiYjNDM7CS50b19tYXh2YWwJPSAxICogSFosCiYjNDM7CS50b19yZXRyaWVzCT0gMCwKJiM0Mzt9OwomIzQzOwogLyoKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQogICogaXMgcmV0dXJuZWQuCkBAIC0yMzgsNiAmIzQzOzI0OCw3IEBAIHN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfYWZfbG9jYWwoc3RydWN0IG5ldCAqbmV0LAogCQkudmVyc2lvbgk9IFJQQ0JWRVJTXzIsCiAJCS5hdXRoZmxhdm9yCT0gUlBDX0FVVEhfTlVMTCwKIAkJLmNyZWQJCT0gY3VycmVudF9jcmVkKCksCiYjNDM7CQkudGltZW91dAk9ICZhbXA7cnBjYl9sb2NhbF90aW1lb3V0LAogCQkvKgogCQkgKiBXZSB0dXJuIG9mZiB0aGUgaWRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGtlcm5lbAogCQkgKiBmcm9tIGF1dG9tYXRpY2FsbHkgZGlzY29ubmVjdGluZyB0aGUgc29ja2V0LgpAQCAtMzEyLDYgJiM0MzszMjMsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX25ldChzdHJ1Y3QgbmV0ICpuZXQpCiAJCS52ZXJzaW9uCT0gUlBDQlZFUlNfMiwKIAkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9VTklYLAogCQkuY3JlZAkJPSBjdXJyZW50X2NyZWQoKSwKJiM0MzsJCS50aW1lb3V0CT0gJmFtcDtycGNiX2xvY2FsX3RpbWVvdXQsCiAJCS5mbGFncwkJPSBSUENfQ0xOVF9DUkVBVEVfTk9QSU5HLAogCX07CiAJc3RydWN0IHJwY19jbG50ICpjbG50LCAqY2xudDQ7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCAwNWMzZTZlMmY2NTk0Li5lOWNmY2ViMWEzMzQyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTEyMDgsMTMgJiM0MzsxMjA4LDE2IEBAIGludCBzdmNfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBzdHJ1Y3QgbmV0ICpuZXQsCiAJCXN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZ3AgPSAmYW1wO3NlcnYtJmd0O3N2X3Byb2dyYW1zW3BdOwogCiAJCWZvciAoaSA9IDA7IGkgJmx0OyBwcm9ncC0mZ3Q7cGdfbnZlcnM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaW50IHJldDsKIAotCQkJZXJyb3IgPSBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSwKJiM0MzsJCQlyZXQgPSBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSwKIAkJCQkJZmFtaWx5LCBwcm90bywgcG9ydCk7Ci0JCQlpZiAoZXJyb3IgJmx0OyAwKSB7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICYjMzQ7c3ZjOiBmYWlsZWQgdG8gcmVnaXN0ZXIgJiMzNDsKIAkJCQkJJiMzNDslc3YldSBSUEMgc2VydmljZSAoZXJybm8gJWQpLlxuJiMzNDssCi0JCQkJCXByb2dwLSZndDtwZ19uYW1lLCBpLCAtZXJyb3IpOwomIzQzOwkJCQkJcHJvZ3AtJmd0O3BnX25hbWUsIGksIC1yZXQpOwomIzQzOwkJCQlpZiAoIWVycm9yKQomIzQzOwkJCQkJZXJyb3IgPSByZXQ7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKaW5kZXggODQzNDNmZDFlMzU0Yi4uNDYwNTA4ZGU5Mzc0ZiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKQEAgLTg5LDYgJiM0Mzs4OSw3IEBAIFRBUkdFVFMgJiM0Mzs9IG5ldC9wYWNrZXRkcmlsbAogVEFSR0VUUyAmIzQzOz0gbmV0L3BwcAogVEFSR0VUUyAmIzQzOz0gbmV0L3JkcwogVEFSR0VUUyAmIzQzOz0gbmV0L3RjcF9hbwomIzQzO1RBUkdFVFMgJiM0Mzs9IG5mc2QKIFRBUkdFVFMgJiM0Mzs9IG5vbGliYwogVEFSR0VUUyAmIzQzOz0gcGNpX2VuZHBvaW50CiBUQVJHRVRTICYjNDM7PSBwY2llX2J3Y3RybApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE5ZTZkZWMwNGQ4ZTkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmUKQEAgLTAsMCAmIzQzOzEgQEAKJiM0MztuZnNkX25ldGxpbmtfbGlzdGVuZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1YWM2NTU0OWQyNTkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlCkBAIC0wLDAgJiM0MzsxLDYgQEAKJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7Q0ZMQUdTICYjNDM7PSAkKEtIRFJfSU5DTFVERVMpIC1XYWxsCiYjNDM7CiYjNDM7VEVTVF9HRU5fUFJPR1MgOj0gbmZzZF9uZXRsaW5rX2xpc3RlbmVyCiYjNDM7CiYjNDM7aW5jbHVkZSAuLi9saWIubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uZTY5NDVmZjk1NTFjNAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnCkBAIC0wLDAgJiM0MzsxLDQgQEAKJiM0MztDT05GSUdfTkVUX05TPXkKJiM0MztDT05GSUdfSVBWNj15CiYjNDM7Q09ORklHX05GU0Q9eQomIzQzO0NPTkZJR19ORlNEX1Y0PXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlMzMwNzY4MGQ3ZDQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jCkBAIC0wLDAgJiM0MzsxLDkyMCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBSZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUgTkZTRCBnZW5lcmljLW5ldGxpbmsgbGlzdGVuZXIgaW50ZXJmYWNlCiYjNDM7ICogKE5GU0RfQ01EX0xJU1RFTkVSX1NFVCAvIE5GU0RfQ01EX0xJU1RFTkVSX0dFVCkuCiYjNDM7ICoKJiM0MzsgKiBUaHJlZSBncm91cHM6CiYjNDM7ICogICB2YWxpZGF0aW9uICAtIG1hbGZvcm1lZC9hYnVzaXZlIExJU1RFTkVSX1NFVCByZXF1ZXN0cyBhcmUgcmVqZWN0ZWQgYnkKJiM0MzsgKiAgICAgICAgICAgICAgICAgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwgYmVmb3JlIG5mc2RfbXV0ZXggaXMgdGFrZW4uCiYjNDM7ICogICBmdW5jdGlvbmFsICAtIGNyZWF0ZS9hZGQvcmVtb3ZlIGxpc3RlbmVycyBhbmQgdmVyaWZ5IExJU1RFTkVSX0dFVAomIzQzOyAqICAgICAgICAgICAgICAgICByZWZsZWN0cyB0aGUgc2V0IChyb3VuZC10cmlwIG9mIHRyYW5zcG9ydCAmIzQzOyBhZGRyOnBvcnQpLgomIzQzOyAqICAgc2VtYW50aWNzICAgLSBvbmNlIHRocmVhZHMgYXJlIHJ1bm5pbmcgKFRIUkVBRFNfU0VUKSBhIGxpc3RlbmVyIGNoYW5nZQomIzQzOyAqICAgICAgICAgICAgICAgICBpcyByZWZ1c2VkIHdpdGggLUVCVVNZLgomIzQzOyAqCiYjNDM7ICogRWFjaCB0ZXN0IHJ1bnMgaW4gaXRzIG93biBwcml2YXRlIG5ldCAmIzQzOyBtb3VudCBuYW1lc3BhY2UgKHVuc2hhcmUgaW4KJiM0MzsgKiBGSVhUVVJFX1NFVFVQKS4gL3J1biBpcyBtYXNrZWQgdGhlcmU6IGEgcGF0aG5hbWUgQUZfTE9DQUwgY29ubmVjdCBpcyBub3QKJiM0MzsgKiBzY29wZWQgYnkgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBzaW5jZSB1bml4X2ZpbmRfYnNkKCkgcmVzb2x2ZXMgYnkgaW5vZGUKJiM0MzsgKiBhbmQgdGFrZXMgbm8gc3RydWN0IG5ldCwgc28gdGhlIGtlcm5lbCYjMzk7cyBycGNiaW5kIGNsaWVudCB3b3VsZCBvdGhlcndpc2UgYmUKJiM0MzsgKiBhYmxlIHRvIHJlYWNoIHRoZSBycGNiaW5kIHJ1bm5pbmcgb24gdGhlIGhvc3QuIEFueXRoaW5nIHRoYXQgY3JlYXRlcyBhCiYjNDM7ICogc2VydiBpcyBzZXJ2ZWQgYnkgdGhlIHBlci1uZXRucyBycGNiaW5kIHN0dWIgYmVsb3cgaW5zdGVhZC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2NoZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGRlZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpbnQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21vdW50LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9wcmN0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc29ja2V0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bmV0L2lmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O25ldGluZXQvaW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbmV0bGluay5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9nZW5ldGxpbmsuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0Oy4uL2tzZWxmdGVzdF9oYXJuZXNzLmgmIzM0OwomIzQzOwomIzQzOy8qIE5GU0QgZ2VuZXJpYy1uZXRsaW5rIGNvbnN0YW50cyAoZnJvbSBsaW51eC9uZnNkX25ldGxpbmsuaCkuICovCiYjNDM7I2RlZmluZSBORlNEX0ZBTUlMWV9OQU1FCQkmIzM0O25mc2QmIzM0OwomIzQzOyNkZWZpbmUgTkZTRF9DTURfVEhSRUFEU19TRVQJCTIKJiM0MzsjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX1NFVAkJNgomIzQzOyNkZWZpbmUgTkZTRF9DTURfTElTVEVORVJfR0VUCQk3CiYjNDM7I2RlZmluZSBORlNEX0FfU0VSVkVSX1RIUkVBRFMJCTEKJiM0MzsjZGVmaW5lIE5GU0RfQV9TRVJWRVJfU09DS19BRERSCQkxCS8qIHBlci1saXN0ZW5lciBuZXN0ICovCiYjNDM7I2RlZmluZSBORlNEX0FfU09DS19BRERSCQkxCS8qIGluc2lkZSB0aGUgbmVzdCAqLwomIzQzOyNkZWZpbmUgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUJMgkvKiBpbnNpZGUgdGhlIG5lc3QgKi8KJiM0MzsKJiM0MzsjZGVmaW5lIE5MQV9BTElHTjQobGVuKQkJCSgoKGxlbikgJiM0MzsgMykgJmFtcDsgfjMpCiYjNDM7I2RlZmluZSBURVNUX1BPUlQJCQkyMDA0OQomIzQzOyNkZWZpbmUgTUFYX0xJU1RFTkVSUwkJCTgKJiM0MzsjZGVmaW5lIFJFQ1ZfVElNRU9fU0VDCQkJMzAKJiM0MzsKJiM0MztzdGF0aWMgaW50IG5mc2RfZmFtaWx5OwkJCS8qIHNldCBwZXItdGVzdCBpbiBGSVhUVVJFX1NFVFVQICovCiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKm1zZykKJiM0Mzt7CiYjNDM7CXBlcnJvcihtc2cpOwomIzQzOwlleGl0KDEpOwomIzQzO30KJiM0MzsKJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIG1pbmltYWwgZ2VuZXJpYy1uZXRsaW5rIHBsdW1iaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdlbmxfb3Blbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX25sIHNhID0geyAubmxfZmFtaWx5ID0gQUZfTkVUTElOSyB9OwomIzQzOwlzdHJ1Y3QgdGltZXZhbCB0diA9IHsgLnR2X3NlYyA9IFJFQ1ZfVElNRU9fU0VDIH07CiYjNDM7CWludCBmZCA9IHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19HRU5FUklDKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NvY2tldChORVRMSU5LX0dFTkVSSUMpJiMzNDspOwomIzQzOwlpZiAoYmluZChmZCwgKHZvaWQgKikmYW1wO3NhLCBzaXplb2Yoc2EpKSAmbHQ7IDApCiYjNDM7CQlkaWUoJiMzNDtiaW5kKG5ldGxpbmspJiMzNDspOwomIzQzOwlzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJmFtcDt0diwgc2l6ZW9mKHR2KSk7CiYjNDM7CXJldHVybiBmZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQXBwZW5kIGFuIGF0dHJpYnV0ZSBhdCBAb2ZmOyByZXR1cm4gdGhlIG5ldyAoYWxpZ25lZCkgb2Zmc2V0LiAqLwomIzQzO3N0YXRpYyBpbnQgcHV0X2F0dHIoY2hhciAqYnVmLCBpbnQgb2ZmLCB1aW50MTZfdCB0eXBlLAomIzQzOwkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbmxhdHRyICpuYSA9ICh2b2lkICopKGJ1ZiAmIzQzOyBvZmYpOwomIzQzOwomIzQzOwluYS0mZ3Q7bmxhX3R5cGUgPSB0eXBlOwomIzQzOwluYS0mZ3Q7bmxhX2xlbiA9IE5MQV9IRFJMRU4gJiM0MzsgbGVuOwomIzQzOwlpZiAobGVuKQomIzQzOwkJbWVtY3B5KGJ1ZiAmIzQzOyBvZmYgJiM0MzsgTkxBX0hEUkxFTiwgZGF0YSwgbGVuKTsKJiM0MzsJcmV0dXJuIG9mZiAmIzQzOyBOTEFfQUxJR040KE5MQV9IRFJMRU4gJiM0MzsgbGVuKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQnVpbGQgYSBnZW5sIG1lc3NhZ2UgaGVhZGVyIGludG8gQGJ1ZjsgcmV0dXJuIHRoZSBvZmZzZXQgcGFzdCBpdC4gKi8KJiM0MztzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKQomIzQzO3sKJiM0MzsJc3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjsKJiM0MzsJc3RydWN0IGdlbmxtc2doZHIgKmdubCA9ICh2b2lkICopKGJ1ZiAmIzQzOyBOTE1TR19IRFJMRU4pOwomIzQzOwomIzQzOwltZW1zZXQoYnVmLCAwLCBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU4pOwomIzQzOwlubGgtJmd0O25sbXNnX3R5cGUgPSB0eXBlOwomIzQzOwlubGgtJmd0O25sbXNnX2ZsYWdzID0gZmxhZ3M7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfc2VxID0gMTsKJiM0MzsJZ25sLSZndDtjbWQgPSBjbWQ7CiYjNDM7CWdubC0mZ3Q7dmVyc2lvbiA9IDE7CiYjNDM7CXJldHVybiBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU47CiYjNDM7fQomIzQzOwomIzQzOy8qIFNlbmQgYW4gbmZzZCBjb21tYW5kIHdpdGggYW4gQUNLOyByZXR1cm4gdGhlIEFDSyBlcnJubyAoJmx0Oz0gMCkuICovCiYjNDM7c3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKQomIzQzO3sKJiM0MzsJY2hhciBidWZbMSAmbHQ7Jmx0OyAyMF0sIHJidWZbNDA5Nl07CiYjNDM7CXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7CiYjNDM7CWludCBmZCA9IGdlbmxfb3BlbigpOwomIzQzOwlpbnQgb2ZmLCBuLCByZXQ7CiYjNDM7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0ssIGNtZCk7CiYjNDM7CWlmIChhdHRyc19sZW4pIHsKJiM0MzsJCW1lbWNweShidWYgJiM0Mzsgb2ZmLCBhdHRycywgYXR0cnNfbGVuKTsKJiM0MzsJCW9mZiAmIzQzOz0gYXR0cnNfbGVuOwomIzQzOwl9CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoZ2VubCkmIzM0Oyk7CiYjNDM7CiYjNDM7CW4gPSByZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApOwomIzQzOwlpZiAobiAmbHQ7IDApCiYjNDM7CQlyZXQgPSAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSA/IC1FVElNRURPVVQgOiAtZXJybm87CiYjNDM7CWVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktJmd0O25sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpCiYjNDM7CQlyZXQgPSAoKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEocmJ1ZikpLSZndDtlcnJvcjsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gMDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKiBTZW5kIGEgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBmdWxsIHJlcGx5IG1lc3NhZ2U7IC1lcnJubyBvbiBmYWlsdXJlLiAqLwomIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXF1ZXN0X3JlcGx5KHVpbnQ4X3QgY21kLCBjaGFyICpyYnVmLCBzaXplX3QgcmxlbikKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzI1Nl07CiYjNDM7CXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7CiYjNDM7CWludCBmZCA9IGdlbmxfb3BlbigpOwomIzQzOwlpbnQgb2ZmLCBuLCByZXQ7CiYjNDM7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QsIGNtZCk7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoZ2VubCByZXBseSkmIzM0Oyk7CiYjNDM7CiYjNDM7CW4gPSByZWN2KGZkLCByYnVmLCBybGVuLCAwKTsKJiM0MzsJaWYgKG4gJmx0OyAwKQomIzQzOwkJcmV0ID0gKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgPyAtRVRJTUVET1VUIDogLWVycm5vOwomIzQzOwllbHNlIGlmICgoKHN0cnVjdCBubG1zZ2hkciAqKXJidWYpLSZndDtubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKQomIzQzOwkJcmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS0mZ3Q7ZXJyb3I7CiYjNDM7CWVsc2UKJiM0MzsJCXJldCA9IG47CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVzb2x2ZSB0aGUgJiMzNDtuZnNkJiMzNDsgZ2VubCBmYW1pbHkgaWQ7IC0xIGlmIG5vdCByZWdpc3RlcmVkLiAqLwomIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXNvbHZlX25mc2Qodm9pZCkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzEwMjRdLCByYnVmWzQwOTZdOwomIzQzOwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmOwomIzQzOwlzdHJ1Y3Qgbmxtc2doZHIgKnJoID0gKHZvaWQgKilyYnVmOwomIzQzOwlzdHJ1Y3QgbmxhdHRyICpuYTsKJiM0MzsJaW50IGZkLCBvZmYsIGxlZnQsIGlkID0gLTE7CiYjNDM7CiYjNDM7CWZkID0gZ2VubF9vcGVuKCk7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgR0VOTF9JRF9DVFJMLCBOTE1fRl9SRVFVRVNULCBDVFJMX0NNRF9HRVRGQU1JTFkpOwomIzQzOwlvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLAomIzQzOwkJICAgICAgIE5GU0RfRkFNSUxZX05BTUUsIHNpemVvZihORlNEX0ZBTUlMWV9OQU1FKSk7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoR0VURkFNSUxZKSYjMzQ7KTsKJiM0MzsJaWYgKHJlY3YoZmQsIHJidWYsIHNpemVvZihyYnVmKSwgMCkgJmx0OyAwKQomIzQzOwkJZGllKCYjMzQ7cmVjdihHRVRGQU1JTFkpJiMzNDspOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWlmIChyaC0mZ3Q7bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJbmEgPSAodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEocmgpICYjNDM7IEdFTkxfSERSTEVOKTsKJiM0MzsJbGVmdCA9IHJoLSZndDtubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjsKJiM0MzsJd2hpbGUgKGxlZnQgJmd0Oz0gKGludClOTEFfSERSTEVOKSB7CiYjNDM7CQlpZiAobmEtJmd0O25sYV90eXBlID09IENUUkxfQVRUUl9GQU1JTFlfSUQpIHsKJiM0MzsJCQlpZCA9ICoodWludDE2X3QgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfSERSTEVOKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWxlZnQgLT0gTkxBX0FMSUdONChuYS0mZ3Q7bmxhX2xlbik7CiYjNDM7CQluYSA9ICh2b2lkICopKChjaGFyICopbmEgJiM0MzsgTkxBX0FMSUdONChuYS0mZ3Q7bmxhX2xlbikpOwomIzQzOwl9CiYjNDM7CXJldHVybiBpZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBsaXN0ZW5lciByZXF1ZXN0IGJ1aWxkZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MzsvKiBGaW5lLWdyYWluZWQgY29udHJvbCBmb3IgbmVnYXRpdmUgdGVzdHM6IGFueSBmaWVsZCBjYW4gYmUgb21pdHRlZC9tYWxmb3JtZWQuICovCiYjNDM7c3RydWN0IHJhd19saXN0ZW5lciB7CiYjNDM7CWNvbnN0IGNoYXIgKnhwcnQ7CS8qIE5VTEwgLSZndDsgb21pdCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSAqLwomIzQzOwlpbnQgZW1pdF9hZGRyOwkJLyogMCAtJmd0OyBvbWl0IE5GU0RfQV9TT0NLX0FERFIgKi8KJiM0MzsJY29uc3Qgdm9pZCAqYWRkcjsKJiM0MzsJaW50IGFkZHJfbGVuOwkJLyogYnl0ZXMgdG8gZW1pdCBmb3IgTkZTRF9BX1NPQ0tfQUREUiAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBwdXRfcmF3X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3Qgc3RydWN0IHJhd19saXN0ZW5lciAqcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBubGF0dHIgKm5lc3QgPSAodm9pZCAqKShidWYgJiM0Mzsgb2ZmKTsKJiM0MzsJaW50IGlubmVyID0gb2ZmICYjNDM7IE5MQV9IRFJMRU47CiYjNDM7CiYjNDM7CWlmIChyLSZndDtlbWl0X2FkZHIpCiYjNDM7CQlpbm5lciA9IHB1dF9hdHRyKGJ1ZiwgaW5uZXIsIE5GU0RfQV9TT0NLX0FERFIsIHItJmd0O2FkZHIsIHItJmd0O2FkZHJfbGVuKTsKJiM0MzsJaWYgKHItJmd0O3hwcnQpCiYjNDM7CQlpbm5lciA9IHB1dF9hdHRyKGJ1ZiwgaW5uZXIsIE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FLAomIzQzOwkJCQkgci0mZ3Q7eHBydCwgc3RybGVuKHItJmd0O3hwcnQpICYjNDM7IDEpOwomIzQzOwluZXN0LSZndDtubGFfdHlwZSA9IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIHwgTkxBX0ZfTkVTVEVEOwomIzQzOwluZXN0LSZndDtubGFfbGVuID0gaW5uZXIgLSBvZmY7CiYjNDM7CXJldHVybiBvZmYgJiM0MzsgTkxBX0FMSUdONChuZXN0LSZndDtubGFfbGVuKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogV2VsbC1mb3JtZWQgbG9vcGJhY2sgbGlzdGVuZXIgZm9yIEBmYW1pbHkgKEFGX0lORVQgb3IgQUZfSU5FVDYpLiAqLwomIzQzO3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyX2FmKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSwKJiM0MzsJCQkgICB1aW50MTZfdCBwb3J0KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7MH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSB4cHJ0LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3NzIH07CiYjNDM7CiYjNDM7CWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnM2ID0gKHZvaWQgKikmYW1wO3NzOwomIzQzOwomIzQzOwkJczYtJmd0O3NpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiYjNDM7CQlzNi0mZ3Q7c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7CiYjNDM7CQlzNi0mZ3Q7c2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKJiM0MzsJCXIuYWRkcl9sZW4gPSBzaXplb2YoKnM2KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbiAqczQgPSAodm9pZCAqKSZhbXA7c3M7CiYjNDM7CiYjNDM7CQlzNC0mZ3Q7c2luX2ZhbWlseSA9IEFGX0lORVQ7CiYjNDM7CQlzNC0mZ3Q7c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKJiM0MzsJCXM0LSZndDtzaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOwomIzQzOwkJci5hZGRyX2xlbiA9IHNpemVvZigqczQpOwomIzQzOwl9CiYjNDM7CXJldHVybiBwdXRfcmF3X2xpc3RlbmVyKGJ1Ziwgb2ZmLCAmYW1wO3IpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHB1dF9saXN0ZW5lcihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IGNoYXIgKnhwcnQsIHVpbnQxNl90IHBvcnQpCiYjNDM7ewomIzQzOwlyZXR1cm4gcHV0X2xpc3RlbmVyX2FmKGJ1Ziwgb2ZmLCB4cHJ0LCBBRl9JTkVULCBwb3J0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBMSVNURU5FUl9HRVQgcGFyc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7c3RydWN0IGxpc3RlbmVyX2VudCB7CiYjNDM7CWNoYXIgeHBydFsxNl07CiYjNDM7CWludCBmYW1pbHk7CiYjNDM7CXVpbnQxNl90IHBvcnQ7CiYjNDM7CXN0cnVjdCBpbl9hZGRyIGE0OwomIzQzOwlzdHJ1Y3QgaW42X2FkZHIgYTY7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHBhcnNlX2xpc3RlbmVyX2dldChjb25zdCBjaGFyICpyYnVmLCBpbnQgbGVuLAomIzQzOwkJCSAgICAgIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKm91dCwgaW50IG1heCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHZvaWQgKilyYnVmOwomIzQzOwljb25zdCBzdHJ1Y3QgbmxhdHRyICpuYTsKJiM0MzsJaW50IGxlZnQsIGNvdW50ID0gMDsKJiM0MzsKJiM0MzsJKHZvaWQpbGVuOwomIzQzOwluYSA9IChjb25zdCB2b2lkICopKHJidWYgJiM0MzsgTkxNU0dfSERSTEVOICYjNDM7IEdFTkxfSERSTEVOKTsKJiM0MzsJbGVmdCA9IG5saC0mZ3Q7bmxtc2dfbGVuIC0gTkxNU0dfSERSTEVOIC0gR0VOTF9IRFJMRU47CiYjNDM7CiYjNDM7CXdoaWxlIChsZWZ0ICZndDs9IChpbnQpTkxBX0hEUkxFTikgewomIzQzOwkJaW50IGFsZW4gPSBuYS0mZ3Q7bmxhX2xlbjsKJiM0MzsKJiM0MzsJCWlmICgobmEtJmd0O25sYV90eXBlICZhbXA7IE5MQV9UWVBFX01BU0spID09IE5GU0RfQV9TRVJWRVJfU09DS19BRERSICZhbXA7JmFtcDsKJiM0MzsJCSAgICBjb3VudCAmbHQ7IG1heCkgewomIzQzOwkJCWNvbnN0IHN0cnVjdCBubGF0dHIgKmluID0gKGNvbnN0IHZvaWQgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfSERSTEVOKTsKJiM0MzsJCQlpbnQgaWxlZnQgPSBhbGVuIC0gTkxBX0hEUkxFTjsKJiM0MzsJCQlzdHJ1Y3QgbGlzdGVuZXJfZW50ICplID0gJmFtcDtvdXRbY291bnRdOwomIzQzOwomIzQzOwkJCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKJiM0MzsJCQl3aGlsZSAoaWxlZnQgJmd0Oz0gKGludClOTEFfSERSTEVOKSB7CiYjNDM7CQkJCWNvbnN0IHZvaWQgKmQgPSAoY29uc3QgY2hhciAqKWluICYjNDM7IE5MQV9IRFJMRU47CiYjNDM7CQkJCWludCB0ID0gaW4tJmd0O25sYV90eXBlICZhbXA7IE5MQV9UWVBFX01BU0s7CiYjNDM7CiYjNDM7CQkJCWlmICh0ID09IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FKSB7CiYjNDM7CQkJCQlzdHJuY3B5KGUtJmd0O3hwcnQsIGQsIHNpemVvZihlLSZndDt4cHJ0KSAtIDEpOwomIzQzOwkJCQl9IGVsc2UgaWYgKHQgPT0gTkZTRF9BX1NPQ0tfQUREUikgewomIzQzOwkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzID0gZDsKJiM0MzsKJiM0MzsJCQkJCWUtJmd0O2ZhbWlseSA9IHNzLSZndDtzc19mYW1pbHk7CiYjNDM7CQkJCQlpZiAoc3MtJmd0O3NzX2ZhbWlseSA9PSBBRl9JTkVUKSB7CiYjNDM7CQkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzID0gZDsKJiM0MzsKJiM0MzsJCQkJCQllLSZndDthNCA9IHMtJmd0O3Npbl9hZGRyOwomIzQzOwkJCQkJCWUtJmd0O3BvcnQgPSBudG9ocyhzLSZndDtzaW5fcG9ydCk7CiYjNDM7CQkJCQl9IGVsc2UgaWYgKHNzLSZndDtzc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKJiM0MzsJCQkJCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzID0gZDsKJiM0MzsKJiM0MzsJCQkJCQllLSZndDthNiA9IHMtJmd0O3NpbjZfYWRkcjsKJiM0MzsJCQkJCQllLSZndDtwb3J0ID0gbnRvaHMocy0mZ3Q7c2luNl9wb3J0KTsKJiM0MzsJCQkJCX0KJiM0MzsJCQkJfQomIzQzOwkJCQlpbGVmdCAtPSBOTEFfQUxJR040KGluLSZndDtubGFfbGVuKTsKJiM0MzsJCQkJaW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKWluICYjNDM7IE5MQV9BTElHTjQoaW4tJmd0O25sYV9sZW4pKTsKJiM0MzsJCQl9CiYjNDM7CQkJY291bnQmIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJbGVmdCAtPSBOTEFfQUxJR040KGFsZW4pOwomIzQzOwkJbmEgPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICYjNDM7IE5MQV9BTElHTjQoYWxlbikpOwomIzQzOwl9CiYjNDM7CXJldHVybiBjb3VudDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZW5pZW5jZSB3cmFwcGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7c3RhdGljIGludCBsaXN0ZW5lcl9zZXQoY29uc3QgY2hhciAqYXR0cnMsIGludCBsZW4pCiYjNDM7ewomIzQzOwlyZXR1cm4gZ2VubF9yZXF1ZXN0KE5GU0RfQ01EX0xJU1RFTkVSX1NFVCwgYXR0cnMsIGxlbik7CiYjNDM7fQomIzQzOwomIzQzOy8qIEZldGNoIHRoZSBjdXJyZW50IGxpc3RlbmVyczsgcmV0dXJucyBjb3VudCAoJmd0Oz0wKSBvciAtZXJybm8uICovCiYjNDM7c3RhdGljIGludCBsaXN0ZW5lcl9nZXQoc3RydWN0IGxpc3RlbmVyX2VudCAqb3V0LCBpbnQgbWF4KQomIzQzO3sKJiM0MzsJY2hhciByYnVmWzgxOTJdOwomIzQzOwlpbnQgbiA9IGdlbmxfcmVxdWVzdF9yZXBseShORlNEX0NNRF9MSVNURU5FUl9HRVQsIHJidWYsIHNpemVvZihyYnVmKSk7CiYjNDM7CiYjNDM7CWlmIChuICZsdDsgMCkKJiM0MzsJCXJldHVybiBuOwomIzQzOwlyZXR1cm4gcGFyc2VfbGlzdGVuZXJfZ2V0KHJidWYsIG4sIG91dCwgbWF4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmZpbmRfbGlzdGVuZXIoc3RydWN0IGxpc3RlbmVyX2VudCAqZSwgaW50IG4sCiYjNDM7CQkJCQkgIGNvbnN0IGNoYXIgKnhwcnQsIGludCBmYW1pbHksCiYjNDM7CQkJCQkgIHVpbnQxNl90IHBvcnQpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKGVbaV0uZmFtaWx5ID09IGZhbWlseSAmYW1wOyZhbXA7IGVbaV0ucG9ydCA9PSBwb3J0ICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc3RyY21wKGVbaV0ueHBydCwgeHBydCkpCiYjNDM7CQkJcmV0dXJuICZhbXA7ZVtpXTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIFN0YXJ0IChAbiAmZ3Q7IDApIG9yIHN0b3AgKEBuID09IDApIG5mc2QgdGhyZWFkcyBpbiB0aGlzIG5ldG5zLiAqLwomIzQzO3N0YXRpYyBpbnQgdGhyZWFkc19zZXQoaW50IG4pCiYjNDM7ewomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJdWludDMyX3QgdiA9IG47CiYjNDM7CWludCBvZmYgPSBwdXRfYXR0cihhdHRycywgMCwgTkZTRF9BX1NFUlZFUl9USFJFQURTLCAmYW1wO3YsIHNpemVvZih2KSk7CiYjNDM7CiYjNDM7CXJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfVEhSRUFEU19TRVQsIGF0dHJzLCBvZmYpOwomIzQzO30KJiM0MzsKJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIHBlci1uZXRucyBsb2NhbCBycGNiaW5kIHN0dWIgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogQ3JlYXRpbmcgYSBsaXN0ZW5lciByZWdpc3RlcnMgd2l0aCBycGNiaW5kOiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpCiYjNDM7ICogcGFzc2VzIGZsYWdzIG9mIDAsIHNvIHBtYXBfcmVnaXN0ZXIgaXMgdHJ1ZSBpbiBzdmNfc2V0dXBfc29ja2V0KCksIGFuZAomIzQzOyAqIG5mc2RfdmVyc2lvbjMgaXMgcmVnaXN0ZXJhYmxlIGJ5IGRlZmF1bHQgYW5kIGRvZXMgbm90IHNldCB2c19ycGNiX29wdG5sLAomIzQzOyAqIHNvIGEgcmVnaXN0cmF0aW9uIGZhaWx1cmUgYWJvcnRzIGxpc3RlbmVyIGNyZWF0aW9uLiBUaGUgYWJzdHJhY3QgQUZfTE9DQUwKJiM0MzsgKiBuYW1lIHRoZSBrZXJuZWwgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zICh1bml4X2ZpbmRfYWJzdHJhY3QoKSB0YWtlcyBhCiYjNDM7ICogc3RydWN0IG5ldCksIHNvIGFuc3dlciBpdCBoZXJlIGFuZCBzdGF5IG91dCBvZiB0aGUgaG9zdCYjMzk7cyBycGNiaW5kLgomIzQzOyAqCiYjNDM7ICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZAomIzQzOyAqIFNFVC9VTlNFVCBnZXQgVFJVRSwgZm9yIGJvdGggUlBDQlZFUlNfMiBhbmQgUlBDQlZFUlNfNC4gdjQgaGFzIHRvIGJlCiYjNDM7ICogYW5zd2VyZWQgYmVjYXVzZSBfX3N2Y19ycGNiX3JlZ2lzdGVyNigpIHR1cm5zIGEgdjQgcmVmdXNhbCBpbnRvCiYjNDM7ICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLgomIzQzOyAqCiYjNDM7ICogSW4gUlBDQl9TVFVCX1JFRlVTRSBtb2RlIFNFVCBpcyBhbnN3ZXJlZCBGQUxTRSBpbnN0ZWFkLCB3aGljaAomIzQzOyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seQomIzQzOyAqIHN2Y191bnJlZ2lzdGVyKCkgaXNzdWVzIGl0LCBhbmQgaXQgZGlzY2FyZHMgdGhlIHJlc3VsdC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJQQ0JfUFJPR1JBTQkJMTAwMDAwCiYjNDM7I2RlZmluZSBSUENCX1BST0NfTlVMTAkJMAomIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1NFVAkJMQomIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUCQkyCiYjNDM7I2RlZmluZSBSUENCX0FCU1RSQUNUX05BTUUJJiMzNDsvcnVuL3JwY2JpbmQuc29jayYjMzQ7CiYjNDM7I2RlZmluZSBSUENCX1NUVUJfTUFYQ09OTgk0CiYjNDM7CiYjNDM7ZW51bSB7IFJQQ0JfU1RVQl9BQ0NFUFQsIFJQQ0JfU1RVQl9SRUZVU0UgfTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9saXN0ZW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl91biBzdW4gPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9OwomIzQzOwlzaXplX3QgbmxlbiA9IHN0cmxlbihSUENCX0FCU1RSQUNUX05BTUUpOwomIzQzOwlzb2NrbGVuX3QgYWxlbjsKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwkvKiBBYnN0cmFjdCBuYW1lcyBhcmUgbGVuZ3RoLWRlbGltaXRlZCwgc28gdGhlIGxlbmd0aCBtdXN0IG1hdGNoLiAqLwomIzQzOwltZW1jcHkoc3VuLnN1bl9wYXRoICYjNDM7IDEsIFJQQ0JfQUJTVFJBQ1RfTkFNRSwgbmxlbik7CiYjNDM7CWFsZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSAmIzQzOyAxICYjNDM7IG5sZW47CiYjNDM7CiYjNDM7CWZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYW1wO3N1biwgYWxlbikgJmx0OyAwIHx8CiYjNDM7CSAgICBsaXN0ZW4oZmQsIFJQQ0JfU1RVQl9NQVhDT05OKSAmbHQ7IDApIHsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCiYjNDM7ewomIzQzOwlzaXplX3QgZG9uZSA9IDA7CiYjNDM7CiYjNDM7CXdoaWxlIChkb25lICZsdDsgbGVuKSB7CiYjNDM7CQlzc2l6ZV90IG4gPSByZWFkKGZkLCAoY2hhciAqKWJ1ZiAmIzQzOyBkb25lLCBsZW4gLSBkb25lKTsKJiM0MzsKJiM0MzsJCWlmIChuICZsdDs9IDApCiYjNDM7CQkJcmV0dXJuIC0xOwomIzQzOwkJZG9uZSAmIzQzOz0gbjsKJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogSGFuZGxlIG9uZSByZWNvcmQtbWFya2VkIFJQQyBjYWxsLiBSZXR1cm5zIC0xIHdoZW4gdGhlIHBlZXIgaXMgZG9uZS4gKi8KJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9jYWxsKGludCBmZCwgaW50IG1vZGUpCiYjNDM7ewomIzQzOwl1aW50MzJfdCBtYXJrLCBjYWxsWzZdLCByZXBbN107CiYjNDM7CXVuc2lnbmVkIGludCBsZW4sIG5yZXAgPSA2OwomIzQzOwlzaXplX3QgcmVwbGVuOwomIzQzOwomIzQzOwlpZiAocnBjYl9zdHViX3JlYWQoZmQsICZhbXA7bWFyaywgc2l6ZW9mKG1hcmspKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbGVuID0gbnRvaGwobWFyaykgJmFtcDsgMHg3ZmZmZmZmZjsKJiM0MzsJaWYgKGxlbiAmbHQ7IHNpemVvZihjYWxsKSB8fCBsZW4gJmd0OyA0MDk2KQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CS8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqLwomIzQzOwlmb3IgKGxlbiAtPSBzaXplb2YoY2FsbCk7IGxlbjsgKSB7CiYjNDM7CQljaGFyIHNpbmtbMjU2XTsKJiM0MzsJCXVuc2lnbmVkIGludCBuID0gbGVuICZndDsgc2l6ZW9mKHNpbmspID8gc2l6ZW9mKHNpbmspIDogbGVuOwomIzQzOwomIzQzOwkJaWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBzaW5rLCBuKSkKJiM0MzsJCQlyZXR1cm4gLTE7CiYjNDM7CQlsZW4gLT0gbjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXBbMF0gPSBjYWxsWzBdOwkJLyogeGlkICovCiYjNDM7CXJlcFsxXSA9IGh0b25sKDEpOwkJLyogUkVQTFkgKi8KJiM0MzsJcmVwWzJdID0gaHRvbmwoMCk7CQkvKiBNU0dfQUNDRVBURUQgKi8KJiM0MzsJcmVwWzNdID0gaHRvbmwoMCk7CQkvKiB2ZXJpZmllciBmbGF2b3IgQVVUSF9OVUxMICovCiYjNDM7CXJlcFs0XSA9IGh0b25sKDApOwkJLyogdmVyaWZpZXIgbGVuZ3RoICovCiYjNDM7CXJlcFs1XSA9IGh0b25sKDApOwkJLyogU1VDQ0VTUyAqLwomIzQzOwomIzQzOwlpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7CiYjNDM7CQlyZXBbNV0gPSBodG9ubCgxKTsJLyogUFJPR19VTkFWQUlMICovCiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7CiYjNDM7CQljYXNlIFJQQ0JfUFJPQ19OVUxMOgomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSUENCX1BST0NfU0VUOgomIzQzOwkJCXJlcFs2XSA9IGh0b25sKG1vZGUgPT0gUlBDQl9TVFVCX1JFRlVTRSA/IDAgOiAxKTsKJiM0MzsJCQlucmVwID0gNzsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgUlBDQl9QUk9DX1VOU0VUOgomIzQzOwkJCXJlcFs2XSA9IGh0b25sKDEpOwkvKiBUUlVFICovCiYjNDM7CQkJbnJlcCA9IDc7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXJlcFs1XSA9IGh0b25sKDMpOwkvKiBQUk9DX1VOQVZBSUwgKi8KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXBsZW4gPSBucmVwICogc2l6ZW9mKHJlcFswXSk7CiYjNDM7CW1hcmsgPSBodG9ubCgweDgwMDAwMDAwIHwgcmVwbGVuKTsKJiM0MzsJaWYgKHdyaXRlKGZkLCAmYW1wO21hcmssIHNpemVvZihtYXJrKSkgIT0gKHNzaXplX3Qpc2l6ZW9mKG1hcmspIHx8CiYjNDM7CSAgICB3cml0ZShmZCwgcmVwLCByZXBsZW4pICE9IChzc2l6ZV90KXJlcGxlbikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkWzEgJiM0MzsgUlBDQl9TVFVCX01BWENPTk5dOwomIzQzOwluZmRzX3QgbiA9IDEsIGk7CiYjNDM7CiYjNDM7CXBmZFswXS5mZCA9IGxmZDsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJLyogc3RvcCBwb2xsaW5nIHRoZSBsaXN0ZW5lciB3aGVuIGZ1bGwsIG9yIHBvbGwoKSBzcGlucyAqLwomIzQzOwkJcGZkWzBdLmV2ZW50cyA9IG4gJmx0OyAxICYjNDM7IFJQQ0JfU1RVQl9NQVhDT05OID8gUE9MTElOIDogMDsKJiM0MzsKJiM0MzsJCWlmIChwb2xsKHBmZCwgbiwgLTEpICZsdDsgMCkKJiM0MzsJCQlyZXR1cm47CiYjNDM7CiYjNDM7CQlpZiAocGZkWzBdLnJldmVudHMgJmFtcDsgUE9MTElOKSB7CiYjNDM7CQkJaW50IGMgPSBhY2NlcHQobGZkLCBOVUxMLCBOVUxMKTsKJiM0MzsKJiM0MzsJCQlpZiAoYyAmZ3Q7PSAwKSB7CiYjNDM7CQkJCXBmZFtuXS5mZCA9IGM7CiYjNDM7CQkJCXBmZFtuXS5ldmVudHMgPSBQT0xMSU47CiYjNDM7CQkJCW4mIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZvciAoaSA9IDE7IGkgJmx0OyBuOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICghKHBmZFtpXS5yZXZlbnRzICZhbXA7IChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikpKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlpZiAocnBjYl9zdHViX2NhbGwocGZkW2ldLmZkLCBtb2RlKSkgewomIzQzOwkJCQljbG9zZShwZmRbaV0uZmQpOwomIzQzOwkJCQlwZmRbaV0gPSBwZmRbLS1uXTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmV0dXJucyB0aGUgc3R1YiYjMzk7cyBwaWQsIG9yIC0xLiBUaGUgc29ja2V0IGlzIGxpc3RlbmluZyBiZWZvcmUgd2UgZm9yay4gKi8KJiM0MztzdGF0aWMgcGlkX3QgcnBjYl9zdHViX3N0YXJ0KGludCBtb2RlKQomIzQzO3sKJiM0MzsJaW50IGxmZCA9IHJwY2Jfc3R1Yl9saXN0ZW4oKTsKJiM0MzsJcGlkX3QgcGlkOwomIzQzOwomIzQzOwlpZiAobGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlpZiAocGlkICZsdDsgMCkgewomIzQzOwkJY2xvc2UobGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZiAocGlkID09IDApIHsKJiM0MzsJCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKJiM0MzsJCXByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpOwomIzQzOwkJaWYgKGdldHBwaWQoKSA9PSAxKQkJLyogcmFjZWQgd2l0aCBwYXJlbnQgZXhpdCAqLwomIzQzOwkJCV9leGl0KDApOwomIzQzOwkJcnBjYl9zdHViX3NlcnZlKGxmZCwgbW9kZSk7CiYjNDM7CQlfZXhpdCgwKTsKJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZShsZmQpOwomIzQzOwlyZXR1cm4gcGlkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN3YXAgdGhlIHN0dWIgZm9yIG9uZSBpbiBAbW9kZS4gU2FmZSBiZWZvcmUgdGhlIGZpcnN0IHJlcXVlc3Q6IG5vIHNlcnYKJiM0MzsgKiBleGlzdHMgeWV0LCBzbyB0aGUga2VybmVsIGhhcyBub3QgY29ubmVjdGVkIGFuZCB0aGUgYWJzdHJhY3QgbmFtZSBpcyBmcmVlCiYjNDM7ICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3Jlc3RhcnQocGlkX3QgKnBpZCwgaW50IG1vZGUpCiYjNDM7ewomIzQzOwlpZiAoKnBpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoKnBpZCwgU0lHS0lMTCk7CiYjNDM7CQl3YWl0cGlkKCpwaWQsIE5VTEwsIDApOwomIzQzOwl9CiYjNDM7CSpwaWQgPSBycGNiX3N0dWJfc3RhcnQobW9kZSk7CiYjNDM7CXJldHVybiAqcGlkICZndDsgMCA/IDAgOiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7RklYVFVSRShuZnNkX2xpc3RlbmVyKSB7CiYjNDM7CXBpZF90IHJwY2JkOwomIzQzO307CiYjNDM7CiYjNDM7RklYVFVSRV9TRVRVUChuZnNkX2xpc3RlbmVyKQomIzQzO3sKJiM0MzsJc3RydWN0IGlmcmVxIGlmciA9IHswfTsKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBzOwomIzQzOwomIzQzOwlpZiAoZ2V0ZXVpZCgpICE9IDApCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDttdXN0IGJlIHJ1biBhcyByb290JiMzNDspOwomIzQzOwlpZiAodW5zaGFyZShDTE9ORV9ORVdORVQgfCBDTE9ORV9ORVdOUykgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7dW5zaGFyZShORVdORVR8TkVXTlMpOiAlcyYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwlpZiAobW91bnQoJiMzNDsmIzM0OywgJiMzNDsvJiMzNDssIE5VTEwsIE1TX1JFQyB8IE1TX1BSSVZBVEUsIE5VTEwpICZsdDsgMCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O21vdW50KC8gcHJpdmF0ZSk6ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEtlZXAgdGhlIGtlcm5lbCYjMzk7cyBycGNiaW5kIGNsaWVudCBpbnNpZGUgdGhpcyBuYW1lc3BhY2UuIFRoZQomIzQzOwkgKiBhYnN0cmFjdCBzb2NrZXQgaXQgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zLCBidXQgdGhlCiYjNDM7CSAqICYjMzQ7L3Zhci9ydW4vcnBjYmluZC5zb2NrJiMzNDsgZmFsbGJhY2sgaXMgbm90LCBzbyBoaWRlIHRoZSBwYXRoLgomIzQzOwkgKi8KJiM0MzsJaWYgKG1vdW50KCYjMzQ7dG1wZnMmIzM0OywgJiMzNDsvcnVuJiMzNDssICYjMzQ7dG1wZnMmIzM0OywgMCwgTlVMTCkgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bW91bnQodG1wZnMgb24gL3J1bik6ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CWlmIChsc3RhdCgmIzM0Oy92YXIvcnVuJiMzNDssICZhbXA7c3QpID09IDAgJmFtcDsmYW1wOyBTX0lTRElSKHN0LnN0X21vZGUpICZhbXA7JmFtcDsKJiM0MzsJICAgIG1vdW50KCYjMzQ7dG1wZnMmIzM0OywgJiMzNDsvdmFyL3J1biYjMzQ7LCAmIzM0O3RtcGZzJiMzNDssIDAsIE5VTEwpICZsdDsgMCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O21vdW50KHRtcGZzIG9uIC92YXIvcnVuKTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsKJiM0MzsJLyogQnJpbmcgbG9vcGJhY2sgdXAgc28gbGlzdGVuZXIgYmluZHMgKDEyNy4wLjAuMSAvIDo6MSkgd29yay4gKi8KJiM0MzsJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKJiM0MzsJQVNTRVJUX0dFKHMsIDApOwomIzQzOwlzdHJjcHkoaWZyLmlmcl9uYW1lLCAmIzM0O2xvJiMzNDspOwomIzQzOwlBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ0dJRkZMQUdTLCAmYW1wO2lmcikpOwomIzQzOwlpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUCB8IElGRl9SVU5OSU5HOwomIzQzOwlBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ1NJRkZMQUdTLCAmYW1wO2lmcikpOwomIzQzOwljbG9zZShzKTsKJiM0MzsKJiM0MzsJbmZzZF9mYW1pbHkgPSBnZW5sX3Jlc29sdmVfbmZzZCgpOwomIzQzOwlpZiAobmZzZF9mYW1pbHkgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bmZzZCBnZW5sIGZhbWlseSBub3QgZm91bmQgKG1vZHByb2JlIG5mc2Q/KSYjMzQ7KTsKJiM0MzsKJiM0MzsJc2VsZi0mZ3Q7cnBjYmQgPSBycGNiX3N0dWJfc3RhcnQoUlBDQl9TVFVCX0FDQ0VQVCk7CiYjNDM7CWlmIChzZWxmLSZndDtycGNiZCAmbHQ7IDApCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtjYW5ub3Qgc3RhcnQgdGhlIHJwY2JpbmQgc3R1YjogJXMmIzM0OywKJiM0MzsJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihuZnNkX2xpc3RlbmVyKQomIzQzO3sKJiM0MzsJaWYgKHNlbGYtJmd0O3JwY2JkICZndDsgMCkgewomIzQzOwkJa2lsbChzZWxmLSZndDtycGNiZCwgU0lHS0lMTCk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3JwY2JkLCBOVUxMLCAwKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gdmFsaWRhdGlvbiAvIG5lZ2F0aXZlID09PT09PT09PT09PT09PT09PT09PSAqLwomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfZW1wdHlfbGlzdF9vaykKJiM0Mzt7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3Rvb19tYW55KQomIzQzO3sKJiM0MzsJc3RhdGljIGNoYXIgYXR0cnNbMSAmbHQ7Jmx0OyAyMF07CiYjNDM7CWludCBpLCBvZmYgPSAwOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgMTAyNTsgaSYjNDM7JiM0MzspCQkvKiAmZ3Q7IE5GU0RfTkxfTElTVEVORVJfTUFYICgxMDI0KSAqLwomIzQzOwkJb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUVYUEVDVF9FUSgtRTJCSUcsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ19hZGRyKQomIzQzO3sKJiM0MzsJY2hhciBhdHRyc1s2NF07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMCB9OwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ190cmFuc3BvcnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gczQgPSB7IC5zaW5fZmFtaWx5ID0gQUZfSU5FVCwgLnNpbl9wb3J0ID0gaHRvbnMoVEVTVF9QT1JUKSB9OwomIzQzOwlzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gTlVMTCwgLmVtaXRfYWRkciA9IDEsCiYjNDM7CQkJCSAgLmFkZHIgPSAmYW1wO3M0LCAuYWRkcl9sZW4gPSBzaXplb2YoczQpIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBuYW1lIG1hdGNoaW5nIG5vIHRyYW5zcG9ydCBjbGFzcyBtdXN0IGJlIHJlZnVzZWQgYmVmb3JlIG5mc2RfbXV0ZXggaXMKJiM0MzsgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHMKJiM0MzsgKiByZXF1ZXN0X21vZHVsZSgmIzM0O3N2YyVzJiMzNDssIG5hbWUpIHVwY2FsbC4KJiM0MzsgKi8KJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2JhZF90cmFuc3BvcnQpCiYjNDM7ewomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDtib2d1c194cHJ0JiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRVBST1RPTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2FkZHJfdG9vX3Nob3J0KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgY2hhciB0aW55ID0gMDsKJiM0MzsJc3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9ICYjMzQ7dGNwJiMzNDssIC5lbWl0X2FkZHIgPSAxLAomIzQzOwkJCQkgIC5hZGRyID0gJmFtcDt0aW55LCAuYWRkcl9sZW4gPSAxIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldF9zaG9ydCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3M0LAomIzQzOwkJCQkgIC5hZGRyX2xlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgJiM0MzsgMiB9OwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsICZhbXA7cik7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXQ2X3Nob3J0KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3M2LAomIzQzOwkJCQkgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX2ZhbWlseSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9OwomIzQzOwlzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gJiMzNDt0Y3AmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gJmFtcDtzcywKJiM0MzsJCQkJICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9OwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsICZhbXA7cik7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHsgLnNzX2ZhbWlseSA9IEFGX1VOSVggfTsKJiM0MzsJc3RydWN0IHJhd19saXN0ZW5lciBiYWQgPSB7IC54cHJ0ID0gJiMzNDt0Y3AmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gJmFtcDtzcywKJiM0MzsJCQkJICAgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07CiYjNDM7CWNoYXIgYXR0cnNbMTI4XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgb2ZmLCAmYW1wO2JhZCk7CiYjNDM7CS8qIFRoZSB3aG9sZSByZXF1ZXN0IGlzIHJlamVjdGVkIGR1cmluZyB2YWxpZGF0aW9uOyBub3RoaW5nIGFwcGxpZWQuICovCiYjNDM7CUVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEEgcmVqZWN0ZWQgcmVxdWVzdCBtdXN0IGxlYXZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBhcmUgYWxyZWFkeSB1cCBhbG9uZS4KJiM0MzsgKiBUaGUgZXJybm8gYWxvbmUgZG9lcyBub3Qgc2hvdyB0aGF0OiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIHJldHVybnMKJiM0MzsgKiAtRVBST1RPTk9TVVBQT1JUIGZvciBhbiB1bmtub3duIG5hbWUgdG9vLiBXaGF0IGRpZmZlcnMgaXMgaG93IGZhciB0aGUKJiM0MzsgKiByZXF1ZXN0IGdldHMgLS0gd2l0aG91dCB0aGUgY2hlY2sgaW4gbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwKJiM0MzsgKiBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KCkgaGFzIGFscmVhZHkgbW92ZWQgdGhlIHVubWF0Y2hlZCB0Y3AgbGlzdGVuZXIKJiM0MzsgKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGUKJiM0MzsgKiBuYW1lIGZhaWxzLgomIzQzOyAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfcmVqZWN0X2tlZXBzX2xpc3RlbmVycykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGdvb2RbNjRdLCBiYWRbNjRdOwomIzQzOwlpbnQgb2cgPSBwdXRfbGlzdGVuZXIoZ29vZCwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG9iID0gcHV0X2xpc3RlbmVyKGJhZCwgMCwgJiMzNDtib2d1c194cHJ0JiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoZ29vZCwgb2cpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChiYWQsIG9iKSk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7CUVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSBmdW5jdGlvbmFsIC8gcm91bmQtdHJpcCA9PT09PT09PT09PT09PT09PT09PT0gKi8KJiM0MzsKJiM0MzsvKiBMSVNURU5FUl9HRVQgd2l0aCBubyBzZXJ2IGluIHRoaXMgbmV0bnMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2dldF9lbXB0eSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwomIzQzOwlFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdGNwKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsJRVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCAmIzM0O3RjcCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTsKJiM0MzsJRVhQRUNUX0VRKGh0b25sKElOQUREUl9MT09QQkFDSyksIGdvdFswXS5hNC5zX2FkZHIpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdWRwKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3VkcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsJRVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCAmIzM0O3VkcCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX211bHRpKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbMTI4XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzOwlBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dWRwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19pZGVtcG90ZW50KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJRVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CQkvKiByZS1zZXQgc2FtZSBsaXN0ICovCiYjNDM7CUFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7CUVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2FkZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIG9uZVs2NF0sIHR3b1sxMjhdOwomIzQzOwlpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwlpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCAmIzM0O3VkcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7CQkvKiBhZGQgdWRwLCBrZWVwIHRjcCAqLwomIzQzOwlBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dWRwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19yZW1vdmVfc3Vic2V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYm90aFsxMjhdLCBvbmVbNjRdOwomIzQzOwlpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG9vID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgb2IsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYm90aCwgb2IpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG9vKSk7CQkvKiBkcm9wIHVkcCAqLwomIzQzOwlBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19lbXB0eV9kZXN0cm95cykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpOwkJLyogZW1wdHkgLSZndDsgZGVzdHJveSBzZXJ2ICovCiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTsKJiM0MzsJY2hhciBhdHRyc1s2NF07CiYjNDM7CWludCBvZmYsIHM7CiYjNDM7CiYjNDM7CXMgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJaWYgKHMgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7SVB2NiB1bmF2YWlsYWJsZTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJY2xvc2Uocyk7CiYjNDM7CiYjNDM7CW9mZiA9IHB1dF9saXN0ZW5lcl9hZihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVDYsIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzOwlBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQ2LCBURVNUX1BPUlQpKTsKJiM0MzsJRVhQRUNUX0VRKDAsIG1lbWNtcCgmYW1wO2dvdFswXS5hNiwgJmFtcDtpbjZhZGRyX2xvb3BiYWNrLCBzaXplb2YoaW42YWRkcl9sb29wYmFjaykpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogPT09PT09PT09PT09PT09PT09PT09IHJwY2JpbmQgcmVnaXN0cmF0aW9uID09PT09PT09PT09PT09PT09PT09PSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBycGNiaW5kIHRoYXQgcmVmdXNlcyB0aGUgcmVnaXN0cmF0aW9uIG11c3QgZmFpbCBsaXN0ZW5lciBjcmVhdGlvbiwKJiM0MzsgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLgomIzQzOyAqCiYjNDM7ICogVGhlIGVycm9yIGhhcyB0byBzdXJ2aXZlIHN2Y19yZWdpc3RlcigpJiMzOTtzIHdhbGsgb3ZlciBzdl9wcm9ncmFtcyB0byBnZXQKJiM0MzsgKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHkKJiM0MzsgKiBhIE5VTEwgYW5kIGEgdnNfaGlkZGVuIHZlcnNpb24sIGFuZCBzdmNfZ2VuZXJpY19ycGNiaW5kX3NldCgpIHJlcG9ydHMgMAomIzQzOyAqIGZvciBib3RoLCBzbyBhbiBzdmNfcmVnaXN0ZXIoKSB0aGF0IGtlZXBzIHRoZSBsYXN0IHJlc3VsdCByYXRoZXIgdGhhbiB0aGUKJiM0MzsgKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLgomIzQzOyAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBzZW1fcmVnaXN0ZXJfcmVmdXNlZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHJwY2Jfc3R1Yl9yZXN0YXJ0KCZhbXA7c2VsZi0mZ3Q7cnBjYmQsIFJQQ0JfU1RVQl9SRUZVU0UpKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FQUNDRVMsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSB0aHJlYWRzIC8gLUVCVVNZIHNlbWFudGljcyA9PT09PT09PT09PT09PT09PT09PT0gKi8KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fY2hhbmdlKQomIzQzO3sKJiM0MzsJY2hhciBvbmVbNjRdLCB0d29bMTI4XTsKJiM0MzsJaW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG8yID0gcHV0X2xpc3RlbmVyKHR3bywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJbzIgPSBwdXRfbGlzdGVuZXIodHdvLCBvMiwgJiMzNDt1ZHAmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7CQkJLyogdGhyZWFkcyBub3cgcnVubmluZyAqLwomIzQzOwlFWFBFQ1RfRVEoLUVCVVNZLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpOwkvKiBhZGQgcmVmdXNlZCAqLwomIzQzOwl0aHJlYWRzX3NldCgwKTsJCQkJCS8qIHN0b3AgYmVmb3JlIG5ldG5zIGV4aXQgKi8KJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX3JlbW92ZSkKJiM0Mzt7CiYjNDM7CWNoYXIgb25lWzY0XTsKJiM0MzsJaW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7CiYjNDM7CUVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7CS8qIHJlbW92ZSByZWZ1c2VkICovCiYjNDM7CXRocmVhZHNfc2V0KDApOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0hBUk5FU1NfTUFJTgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjA5MWI0NWQyMjZiYQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3MKQEAgLTAsMCAmIzQzOzEgQEAKJiM0Mzt0aW1lb3V0PTEyMAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjAyOAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDUyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE5GUyBhbmQgUlBDIFBhdGNoIFNlcmllcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBzZXJpZXMsIGFuZCBpdCYjMzk7cyB0b3VjaGluZyBzb21lIHByZXR0eSBjcml0aWNhbCBhcmVhczogYGZzL25mc2QvbmZzY3RsLmNgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AsIGFuZCBgbmV0L3N1bnJwYy9zdmMuY2AuIFBsdXMsIHRoZXJlJiMzOTtzIGEgbmV3IHNlbGZ0ZXN0LCB3aGljaCBpcyBhbHdheXMgZ29vZC4gTGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCkZpcnN0LCBgZnMvbmZzZC9uZnNjdGwuY2AgaGFzIGNoYW5nZXMgdGhhdCBhcmUgYWRkaW5nIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzIHVzaW5nIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgIGFuZCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyB3aXRoIGBORlNEX05MX0xJU1RFTkVSX01BWGAuIFRoaXMgaXMgaW1wb3J0YW50IGZvciByb2J1c3RuZXNzIGFuZCBwcmV2ZW50aW5nIHJlc291cmNlIGV4aGF1c3Rpb24uCgpUaGVuLCBvdmVyIGluIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgdGhlcmUmIzM5O3MgYSB0aW1lb3V0IGJlaW5nIGFkZGVkIGZvciBsb2NhbCBycGNiaW5kIGNhbGxzIChgcnBjYl9sb2NhbF90aW1lb3V0YCkuIFRoYXQmIzM5O3MgbGlrZWx5IGFpbWVkIGF0IGhhbmRsaW5nIHBvdGVudGlhbCBibG9ja2luZyBzY2VuYXJpb3MgbW9yZSBncmFjZWZ1bGx5LgoKRmluYWxseSwgYG5ldC9zdW5ycGMvc3ZjLmNgIHNlZW1zIHRvIGJlIGZpeGluZyBhbiBlcnJvciBoYW5kbGluZyBpc3N1ZSBpbiBgc3ZjX3JlZ2lzdGVyYCwgbWFraW5nIGl0IHJldHVybiB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQsIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhhdC4gVGhpcyBpcyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IGNoYW5nZSB0aGF0IGltcHJvdmVzIHRoZSBlcnJvciByZXBvcnRpbmcuCgpJIG5lZWQgdG8gY29uZmlybSB0aGVzZSBmdW5jdGlvbnMmIzM5OyByZWFjaGFiaWxpdHkgYW5kIGZ1bmN0aW9uYWwgaW1wYWN0LCBzbyBJIGFtIGdvaW5nIHRvIGNoZWNrIHRob3NlIGZpbGVzIHNwZWNpZmljYWxseS4gSSYjMzk7dmUgbm90ZWQgdGhhdCBgZnMvbmZzZC9uZnNjdGwuY2AgaXMgdG91Y2hpbmcgYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYCBhbmQgYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AgaXMgZ29pbmcgdG8gZGVhbCB3aXRoIGBycGNiX2NyZWF0ZV9hZl9sb2NhbGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgLCBhbmQgYG5ldC9zdW5ycGMvc3ZjLmNgIGNoYW5nZXMgYXJlIGdvaW5nIHRvIGltcGFjdCBgc3ZjX3JlZ2lzdGVyYC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWZpbml0ZWx5IGNvcmUga2VybmVsIGxvZ2ljLCBhbmQgdGhlIGNoYW5nZXMgYXJlIGRlZmluaXRlbHkgcmVhY2hhYmxlIGFuZCB3aWxsIGhhdmUgZnVuY3Rpb25hbCBpbXBhY3QuCgpOb3csIEkgd2FudCB0byBjb25maXJtIHdoZXRoZXIgdGhlc2UgZnVuY3Rpb25zIGFyZSBzdGF0aWMgb3Igbm90LiBUaGlzIGFmZmVjdHMgdGhlaXIgc2NvcGUgYW5kIGhvdyB0aGV5JiMzOTtyZSB1c2VkLgpJIGZvdW5kIHRoYXQgYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYCBpcyBzdGF0aWMsIHdoaWxlIGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBpcyBub3QuIEluIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgSSBjb25maXJtZWQgdGhhdCBib3RoIGBycGNiX2NyZWF0ZV9hZl9sb2NhbGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgIGFyZSBzdGF0aWMuIEZpbmFsbHksIGBzdmNfcmVnaXN0ZXJgIGluIGBuZXQvc3VucnBjL3N2Yy5jYCBpcyBub3Qgc3RhdGljLgoKSSYjMzk7bSBnb2luZyB0byBsZXZlcmFnZSBgZ3JlcHBlcmAgbm93IHRvIHRyYWNrIGRvd24gYWxsIHRoZSBwcmVjaXNlIGRlZmluaXRpb25zIGFuZCB1c2FnZXMgb2YgZWFjaCBmdW5jdGlvbiB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9uZnNkL25ldGxpbmsuYz0xMjI9c3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX3NwbGl0X29wcyBuZnNkX25sX29wc1tdID0ge1xuLS1cbmZzL25mc2QvbmV0bGluay5jLTE1My1cdFx0LmNtZFx0XHQ9IE5GU0RfQ01EX0xJU1RFTkVSX1NFVCxcbmZzL25mc2QvbmV0bGluay5jOjE1NDpcdFx0LmRvaXRcdFx0PSBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0LFxuZnMvbmZzZC9uZXRsaW5rLmMtMTU1LVx0XHQucG9saWN5XHRcdD0gbmZzZF9saXN0ZW5lcl9zZXRfbmxfcG9saWN5LFxuLS1cbmZzL25mc2QvbmV0bGluay5oPTI5PWludCBuZnNkX25sX3ZlcnNpb25fZ2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7XG5mcy9uZnNkL25ldGxpbmsuaDozMDppbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTtcbmZzL25mc2QvbmV0bGluay5oLTMxLWludCBuZnNkX25sX2xpc3RlbmVyX2dldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pO1xuLS1cbmZzL25mc2QvbmZzY3RsLmM9MjAwNT1zdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4tLVxuZnMvbmZzZC9uZnNjdGwuYy0yMDU2LS8qKlxuZnMvbmZzZC9uZnNjdGwuYzoyMDU3OiAqIG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQgLSBzZXQgdGhlIG5mcyBydW5uaW5nIHNvY2tldHNcbmZzL25mc2QvbmZzY3RsLmMtMjA1OC0gKiBAc2tiOiByZXBseSBidWZmZXJcbi0tXG5mcy9uZnNkL25mc2N0bC5jLTIwNjItICovXG5mcy9uZnNkL25mc2N0bC5jOjIwNjM6aW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbmZzL25mc2QvbmZzY3RsLmMtMjA2NC17XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuYz03MTY9VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9zZWNvbmRfZW50cnlfYmFkKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMtNzMzLSAqIHJlcXVlc3QgZ2V0cyAtLSB3aXRob3V0IHRoZSBjaGVjayBpbiBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycygpLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuYzo3MzQ6ICogbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCgpIGhhcyBhbHJlYWR5IG1vdmVkIHRoZSB1bm1hdGNoZWQgdGNwIGxpc3RlbmVyXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTczNS0gKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGVcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzg0OQoJCQkJCQkJb3V0cHV0OiAxNwoJCQkJCQkJdGhvdWdodHM6IDMzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgaW5pdGlhbCB0aG91Z2h0cywgZnJhbWVkIGFzIGEgY29uY2lzZSBzdW1tYXJ5IGZvciBhbiBleHBlcnQ6CgoqKlByaW9yaXRpemluZyBGdXp6aW5nIFRhcmdldHMqKgoKQWxyaWdodCwgbG9va2luZyBhdCB0aGlzIGNvZGUsIG15IG1pbmQgaW1tZWRpYXRlbHkganVtcHMgdG8gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLiBTZWVtcyBsaWtlIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nLiBJdCYjMzk7cyBnb3QgdGhhdCBuZXR3b3JrIGludGVyYWN0aW9uIGVsZW1lbnQsIHdoaWNoIG9mdGVuIG1lYW5zIGNvbXBsZXggaW5wdXQgaGFuZGxpbmcgYW5kIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMuCgpOb3csIEkmIzM5O20gYWxzbyBjb25zaWRlcmluZyBgc3ZjX3JlZ2lzdGVyYC4gSXQmIzM5O3MgYSBrZXkgZnVuY3Rpb24gZm9yIHNlcnZpY2UgcmVnaXN0cmF0aW9uLCBhbHdheXMgYSBzZW5zaXRpdmUgYXJlYSBmcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUuIEkgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIGRhdGEgZmxvd3MgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbiBwb2ludHMgaW4gdGhpcyBhcmVhLiBCb3RoIHNlZW0gbGlrZSBnb29kIHN0YXJ0aW5nIHBvaW50cywgYnV0IGl0JiMzOTtzIGltcG9ydGFudCB0byBhc3Nlc3Mgd2hpY2ggb25lIHByZXNlbnRzIHRoZSBtb3N0IGltbWVkaWF0ZSByaXNrIG9yIGhpZ2hlc3QgcG90ZW50aWFsIGZvciByZXdhcmQgaW4gdGVybXMgb2YgdW5jb3ZlcmluZyB2dWxuZXJhYmlsaXRpZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3ZjX3JlZ2lzdGVyJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oPTQ3ND12b2lkXHRcdCAgIHN2Y19wcm9jZXNzX2JjKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKTtcbmluY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oOjQ3NTppbnRcdFx0ICAgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqLCBzdHJ1Y3QgbmV0ICosIGNvbnN0IGludCxcbmluY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oLTQ3Ni1cdFx0XHRcdGNvbnN0IHVuc2lnbmVkIHNob3J0LCBjb25zdCB1bnNpZ25lZCBzaG9ydCk7XG4tLVxubmV0L3N1bnJwYy9zdmMuYz0xMDc0PXN0YXRpYyBpbnQgX19zdmNfcnBjYl9yZWdpc3RlcjYoc3RydWN0IG5ldCAqbmV0LCBjb25zdCB1MzIgcHJvZ3JhbSxcbi0tXG5uZXQvc3VucnBjL3N2Yy5jLTExMTctICovXG5uZXQvc3VucnBjL3N2Yy5jOjExMTg6c3RhdGljIGludCBfX3N2Y19yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKnByb2duYW1lLFxubmV0L3N1bnJwYy9zdmMuYy0xMTE5LVx0XHRcdCAgY29uc3QgdTMyIHByb2dyYW0sIGNvbnN0IHUzMiB2ZXJzaW9uLFxuLS1cbm5ldC9zdW5ycGMvc3ZjLmMtMTEzNy1cbm5ldC9zdW5ycGMvc3ZjLmM6MTEzODpcdHRyYWNlX3N2Y19yZWdpc3Rlcihwcm9nbmFtZSwgdmVyc2lvbiwgZmFtaWx5LCBwcm90b2NvbCwgcG9ydCwgZXJyb3IpO1xubmV0L3N1bnJwYy9zdmMuYy0xMTM5LVx0cmV0dXJuIGVycm9yO1xuLS1cbm5ldC9zdW5ycGMvc3ZjLmM9MTE0Mz1pbnQgc3ZjX3JwY2JpbmRfc2V0X3ZlcnNpb24oc3RydWN0IG5ldCAqbmV0LFxuLS1cbm5ldC9zdW5ycGMvc3ZjLmMtMTE0OC17XG5uZXQvc3VucnBjL3N2Yy5jOjExNDk6XHRyZXR1cm4gX19zdmNfcmVnaXN0ZXIobmV0LCBwcm9ncC1cdTAwM2VwZ19uYW1lLCBwcm9ncC1cdTAwM2VwZ19wcm9nLFxubmV0L3N1bnJwYy9zdmMuYy0xMTUwLVx0XHRcdFx0dmVyc2lvbiwgZmFtaWx5LCBwcm90bywgcG9ydCk7XG4tLVxubmV0L3N1bnJwYy9zdmMuYz0xMTg0PUVYUE9SVF9TWU1CT0xfR1BMKHN2Y19nZW5lcmljX3JwY2JpbmRfc2V0KTtcbi0tXG5uZXQvc3VucnBjL3N2Yy5jLTExODYtLyoqXG5uZXQvc3VucnBjL3N2Yy5jOjExODc6ICogc3ZjX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYW4gUlBDIHNlcnZpY2Ugd2l0aCB0aGUgbG9jYWwgcG9ydG1hcHBlclxubmV0L3N1bnJwYy9zdmMuYy0xMTg4LSAqIEBzZXJ2OiBzdmNfc2VydiBzdHJ1Y3QgZm9yIHRoZSBzZXJ2aWNlIHRvIHJlZ2lzdGVyXG4tLVxubmV0L3N1bnJwYy9zdmMuYy0xMTk1LSAqL1xubmV0L3N1bnJwYy9zdmMuYzoxMTk2OmludCBzdmNfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBzdHJ1Y3QgbmV0ICpuZXQsXG5uZXQvc3VucnBjL3N2Yy5jLTExOTctXHRcdCBjb25zdCBpbnQgZmFtaWx5LCBjb25zdCB1bnNpZ25lZCBzaG9ydCBwcm90byxcbi0tXG5uZXQvc3VucnBjL3N2Y194cHJ0LmM9MTEwNz1zdGF0aWMgdm9pZCBzdmNfZGVsZXRlX3hwcnQoc3RydWN0IHN2Y194cHJ0ICp4cHJ0KVxuLS1cbm5ldC9zdW5ycGMvc3ZjX3hwcnQuYy0xMTE4LVxubmV0L3N1bnJwYy9zdmNfeHBydC5jOjExMTk6XHRcdGlmIChzdmNfcmVnaXN0ZXIoc2VydiwgeHBydC1cdTAwM2V4cHRfbmV0LCBzb2NrLVx1MDAzZXNrLVx1MDAzZXNrX2ZhbWlseSxcbm5ldC9zdW5ycGMvc3ZjX3hwcnQuYy0xMTIwLVx0XHRcdFx0IHNvY2stXHUwMDNlc2stXHUwMDNlc2tfcHJvdG9jb2wsIDApIFx1MDAzYyAwKVxuLS1cbm5ldC9zdW5ycGMvc3Zjc29jay5jPTE0Mzk9c3RhdGljIHN0cnVjdCBzdmNfc29jayAqc3ZjX3NldHVwX3NvY2tldChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsXG4tLVxubmV0L3N1bnJwYy9zdmNzb2NrLmMtMTQ3Mi1cbm5ldC9zdW5ycGMvc3Zjc29jay5jOjE0NzM6XHRcdGVyciA9IHN2Y19yZWdpc3RlcihzZXJ2LCBzb2NrX25ldChzb2NrLVx1MDAzZXNrKSwgaW5ldC1cdTAwM2Vza19mYW1pbHksXG5uZXQvc3VucnBjL3N2Y3NvY2suYy0xNDc0LVx0XHRcdFx0ICAgICBpbmV0LVx1MDAzZXNrX3Byb3RvY29sLFxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM9ODUyPVRFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuYy04NzUtICpcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM6ODc2OiAqIFRoZSBlcnJvciBoYXMgdG8gc3Vydml2ZSBzdmNfcmVnaXN0ZXIoKSYjMzk7cyB3YWxrIG92ZXIgc3ZfcHJvZ3JhbXMgdG8gZ2V0XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg3Ny0gKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMtODc4LSAqIGEgTlVMTCBhbmQgYSB2c19oaWRkZW4gdmVyc2lvbiwgYW5kIHN2Y19nZW5lcmljX3JwY2JpbmRfc2V0KCkgcmVwb3J0cyAwXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jOjg3OTogKiBmb3IgYm90aCwgc28gYW4gc3ZjX3JlZ2lzdGVyKCkgdGhhdCBrZWVwcyB0aGUgbGFzdCByZXN1bHQgcmF0aGVyIHRoYW4gdGhlXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg4MC0gKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MjQzCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZywgY29uc2lkZXJpbmcgSSYjMzk7bSB0cnlpbmcgdG8gc2VsZWN0IHRoZSBiZXN0IGZ1bmN0aW9uIGZvciBzb21ldGhpbmc6CgoqKkZ1bmN0aW9uIENhbmRpZGF0ZSBFdmFsdWF0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGBzdmNfcmVnaXN0ZXJgIGxvb2tzIGxpa2UgYSBzdHJvbmcgY29udGVuZGVyLiBIb3dldmVyLCBJIG5lZWQgdG8gYmUgdGhvcm91Z2guIFRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIGl0JiMzOTtzIHRoZSBiZXN0IG9wdGlvbiwgb3IgaWYgdGhlcmUgbWlnaHQgYmUgc29tZXRoaW5nIGV2ZW4gbW9yZSBwZXJmZWN0bHkgc3VpdGVkIGZvciBteSBuZWVkcy4KCkkmIzM5O20gbm93IHRoaW5raW5nIGFib3V0IGBycGNiX2NyZWF0ZV9hZl9sb2NhbGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgLiBUaGUgaW1tZWRpYXRlIGNvbmNlcm4gaXMgdGhhdCB0aGV5IGFyZSBzdGF0aWMgZnVuY3Rpb25zLiBTdGF0aWMgZnVuY3Rpb25zIGhhdmUgdGhlaXIgc2NvcGUgbGltaXRlZC4gVGhlIG1haW4gaXNzdWUgaGVyZSBpcyBpZiB0aGUgY2FsbC1zaXRlcyBhcmUgYWxzbyB3aXRoaW4gdGhhdCBzY29wZS4gQXJlIHRoZXkgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4gb3RoZXIgc3RhdGljIGZ1bmN0aW9ucywgb3IgYXJlIHRoZXkgY2FsbGVkIGZyb20gYSBub24tc3RhdGljIGNvbnRleHQ/IFRoaXMgaXMgdGhlIGNydWNpYWwgcG9pbnQgZm9yIGRldGVybWluaW5nIGlmIHRoZXkgd2lsbCB3b3JrIGFzIGRlc2lyZWQsIGVzcGVjaWFsbHkgY29uc2lkZXJpbmcgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgbGFyZ2VyIGRlc2lnbi4gSWYgdGhleSYjMzk7cmUgY2FsbGVkIG91dHNpZGUgdGhlaXIgc3RhdGljIHNjb3BlLCBJIGhhdmUgYSBwcm9ibGVtLiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlIGNhbGwgZ3JhcGggYW5kIHRoZWlyIHJlc3BlY3RpdmUgY29udGV4dHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cnBjYl9jcmVhdGVfYWZfbG9jYWwmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0yMjg9c3RhdGljIGNvbnN0IHN0cnVjdCBycGNfdGltZW91dCBycGNiX2xvY2FsX3RpbWVvdXQgPSB7XG4tLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yMzctICovXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjIzODpzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2FmX2xvY2FsKHN0cnVjdCBuZXQgKm5ldCxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjM5LVx0XHRcdFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX3VuICphZGRyKVxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9Mjg1PXN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfYWJzdHJhY3Qoc3RydWN0IG5ldCAqbmV0KVxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjkxLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyOTI6XHRyZXR1cm4gcnBjYl9jcmVhdGVfYWZfbG9jYWwobmV0LCBcdTAwMjZycGNiX2xvY2FsYWRkcl9hYnN0cmFjdCk7XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI5My19XG4tLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0yOTU9c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF91bml4KHN0cnVjdCBuZXQgKm5ldClcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMwMS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzAyOlx0cmV0dXJuIHJwY2JfY3JlYXRlX2FmX2xvY2FsKG5ldCwgXHUwMDI2cnBjYl9sb2NhbGFkZHJfdW5peCk7XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMwMy19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTk4OTEKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBzdW1tYXJ5LCB0YWtpbmcgdGhlIHBlcnNwZWN0aXZlIG9mIHNvbWVvbmUgZGVlcGx5IGZhbWlsaWFyIHdpdGggc3lzdGVtIGludGVybmFsczoKCioqVHJhY2luZyB0aGUgT3JpZ2lucyBvZiBBYnN0cmFjdCBhbmQgVW5peCBEb21haW4gU29ja2V0IENyZWF0aW9uIGluIHJwY2JpbmQqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsaWZlY3ljbGUgb2YgYWJzdHJhY3QgYW5kIFVuaXggZG9tYWluIHNvY2tldCBjcmVhdGlvbiB3aXRoaW4gYHJwY2JpbmRgLiBNeSBmb2N1cyBpcyBvbiB0cmFjaW5nIGhvdyB0aGVzZSBtZWNoYW5pc21zIGFyZSAqaW5zdGFudGlhdGVkKiDigJMgc3BlY2lmaWNhbGx5LCB0aGUgY2FsbHMgdG8gYHJwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0YCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX3VuaXhgLiBJIHdhbnQgdG8gaWRlbnRpZnkgdGhlIGluaXRpYXRpbmcgcG9pbnRzLCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCwgYW5kIGFueSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdGhhdCBpbmZsdWVuY2UgdGhlaXIgaW52b2NhdGlvbi4gVGhpcyBsZXZlbCBvZiBkZXRhaWwgaXMgY3J1Y2lhbCBmb3IgcmVhbGx5IHVuZGVyc3RhbmRpbmcgdGhlIGJlaGF2aW9yIG9mIGBycGNiaW5kYCB3aGVuIGRlYWxpbmcgd2l0aCB2YXJpb3VzIHNvY2tldCB0eXBlcy4gS25vd2luZyAqd2hlcmUqIGFuZCAqd2h5KiB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aWxsIHJldmVhbCBhIGxvdCBhYm91dCB0aGUgYXBwbGljYXRpb24gYXJjaGl0ZWN0dXJlLCBpdHMgZXJyb3IgaGFuZGxpbmcsIGFuZCwgcG9zc2libHksIGFueSB2dWxuZXJhYmlsaXRpZXMgb3Igb3B0aW1pemF0aW9ucyB0aGF0IG1pZ2h0IGJlIHByZXNlbnQuIExldCYjMzk7cyBkaWcgaW4gYW5kIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3JwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9zdW5ycGMvcnBjYl9jbG50LmM9MjM4PXN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfYWZfbG9jYWwoc3RydWN0IG5ldCAqbmV0LFxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjg0LVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyODU6c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChzdHJ1Y3QgbmV0ICpuZXQpXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI4Ni17XG4tLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0zNTc9aW50IHJwY2JfY3JlYXRlX2xvY2FsKHN0cnVjdCBuZXQgKm5ldClcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2OC1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY5Olx0aWYgKHJwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0KG5ldCkgIT0gMCBcdTAwMjZcdTAwMjZcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzcwLVx0ICAgIHJwY2JfY3JlYXRlX2xvY2FsX3VuaXgobmV0KSAhPSAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDM5MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgcnBjYl9jcmVhdGVfbG9jYWxgKioKCk9rYXksIHNvIGBycGNiX2NyZWF0ZV9sb2NhbGAgaXNuJiMzOTt0IGRlY2xhcmVkIGFzIGBzdGF0aWNgLiBUaGF0IGltbWVkaWF0ZWx5IHBpcXVlcyBteSBpbnRlcmVzdC4gTm9uLXN0YXRpYyBmdW5jdGlvbnMgdXN1YWxseSBpbXBseSBhIGJyb2FkZXIgc2NvcGUgb2YgdXNhZ2UsIHBvdGVudGlhbGx5IGluZGljYXRpbmcgaXQmIzM5O3MgcGFydCBvZiBhIHB1YmxpYyBpbnRlcmZhY2UsIG9yIGF0IGxlYXN0IGNhbGxlZCBmcm9tIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiB0aGUgY29kZWJhc2UuIEdpdmVuIHRoYXQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgdGhvcm91Z2hseSBhbmFseXplIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYmVpbmcgKnVzZWQqLiBUaW1lIHRvIHRyYWNrIGRvd24gYWxsIGl0cyBjYWxsIHNpdGVzIGFuZCB1bmRlcnN0YW5kIGl0cyByb2xlIGluIHRoaXMgc3lzdGVtLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGl0cyBpbXBhY3QgYW5kIGltcG9ydGFuY2UuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb250ZXh0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtycGNiX2NyZWF0ZV9sb2NhbCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50Lmg9MTk3PXN0cnVjdCBycGNfeHBydFx0KnJwY190YXNrX2dldF94cHJ0KHN0cnVjdCBycGNfY2xudCAqY2xudCxcbi0tXG5pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgtMTk5LVxuaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oOjIwMDppbnRcdFx0cnBjYl9jcmVhdGVfbG9jYWwoc3RydWN0IG5ldCAqKTtcbmluY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaC0yMDEtdm9pZFx0XHRycGNiX3B1dF9sb2NhbChzdHJ1Y3QgbmV0ICopO1xuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9MjA2PXN0YXRpYyB2b2lkIHJwY2Jfc2V0X2xvY2FsKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHJwY19jbG50ICpjbG50LFxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjExLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyMTI6XHQvKiBQcm90ZWN0ZWQgYnkgcnBjYl9jcmVhdGVfbG9jYWxfbXV0ZXggKi9cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjEzLVx0c24tXHUwMDNlcnBjYl9sb2NhbF9jbG50ID0gY2xudDtcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jPTIzOD1zdGF0aWMgaW50IHJwY2JfY3JlYXRlX2FmX2xvY2FsKHN0cnVjdCBuZXQgKm5ldCxcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI4NC1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6Mjg1OnN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfYWJzdHJhY3Qoc3RydWN0IG5ldCAqbmV0KVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yODYte1xuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjk0LVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyOTU6c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF91bml4KHN0cnVjdCBuZXQgKm5ldClcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjk2LXtcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMwOC0gKi9cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzA5OnN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfbmV0KHN0cnVjdCBuZXQgKm5ldClcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzEwLXtcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM1Ni0gKi9cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzU3OmludCBycGNiX2NyZWF0ZV9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQpXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM1OC17XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM1OTpcdHN0YXRpYyBERUZJTkVfTVVURVgocnBjYl9jcmVhdGVfbG9jYWxfbXV0ZXgpO1xubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0zNjAtXHRpbnQgcmVzdWx0ID0gMDtcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2NC1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY1Olx0bXV0ZXhfbG9jayhcdTAwMjZycGNiX2NyZWF0ZV9sb2NhbF9tdXRleCk7XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2Ni1cdGlmIChycGNiX2dldF9sb2NhbChuZXQpKVxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzY4LVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzozNjk6XHRpZiAocnBjYl9jcmVhdGVfbG9jYWxfYWJzdHJhY3QobmV0KSAhPSAwIFx1MDAyNlx1MDAyNlxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzozNzA6XHQgICAgcnBjYl9jcmVhdGVfbG9jYWxfdW5peChuZXQpICE9IDApXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM3MTpcdFx0cmVzdWx0ID0gcnBjYl9jcmVhdGVfbG9jYWxfbmV0KG5ldCk7XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM3Mi1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzczLW91dDpcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6Mzc0Olx0bXV0ZXhfdW5sb2NrKFx1MDAyNnJwY2JfY3JlYXRlX2xvY2FsX211dGV4KTtcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzc1LVx0cmV0dXJuIHJlc3VsdDtcbi0tXG5uZXQvc3VucnBjL3N2Yy5jPTMwMT1zdGF0aWMgaW50IHN2Y19ycGNiX3NldHVwKHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0KVxuLS1cbm5ldC9zdW5ycGMvc3ZjLmMtMzA0LVxubmV0L3N1bnJwYy9zdmMuYzozMDU6XHRlcnIgPSBycGNiX2NyZWF0ZV9sb2NhbChuZXQpO1xubmV0L3N1bnJwYy9zdmMuYy0zMDYtXHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTYzMwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDEzOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFJQQyBTZXJ2ZXIgU2V0dXAgYW5kIFJlbGF0ZWQgQ29uZmlndXJhdGlvbnMqKgoKT2theSwgc28gSSBzZWUgdGhhdCBgcnBjYl9jcmVhdGVfbG9jYWxgIGlzIGJlaW5nIGNhbGxlZCBmcm9tIHdpdGhpbiBgc3ZjX3JwY2Jfc2V0dXBgLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBSUEMgc2VydmVyIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuIFRoYXQgbWFrZXMgc2Vuc2U7IGl0JiMzOTtzIGEgY3JpdGljYWwgcGFydCBvZiB0aGUgc2V0dXAuIEkmIzM5O3ZlIGFsc28gbm90ZWQgdGhhdCB0aGUgY29kZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLCBgcnBjYl9jcmVhdGVfbG9jYWxgLCBhbmQgYHN2Y19yZWdpc3RlcmAuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGtleSB0byB0aGUgbmV3IGJlaGF2aW9yLgoKTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZW5hYmxpbmcgdGhpcyBuZXcgZnVuY3Rpb25hbGl0eS4gTGV0JiMzOTtzIHNlZS4uLiB0aGUgc2VsZnRlc3QgY29uZmlnIG1lbnRpb25zIGBDT05GSUdfTkVUX05TPXlgLCBgQ09ORklHX0lQVjY9eWAsIGBDT05GSUdfTkZTRD15YCwgYW5kIGBDT05GSUdfTkZTRF9WND15YC4gVGhhdCBnaXZlcyBtZSBhIHN0YXJ0aW5nIHBvaW50LiBgTkVUX05TYCBpcyBjbGVhcmx5IGltcG9ydGFudCBmb3IgbmV0d29yayBuYW1lc3BhY2VzLCBgSVBWNmAgZm9yIG9idmlvdXMgcmVhc29ucywgYW5kIGBORlNEYC9gTkZTRF9WNGAgcmVsYXRlIHRvIHRoZSBORlMgc2VydmVyIGl0c2VsZi4gSSYjMzk7bGwgbmVlZCB0byBkaWcgZGVlcGVyLCB0aG91Z2guCgpJIHNob3VsZCBleGFtaW5lIGBmcy9uZnNkL0tjb25maWdgIHRvIGxvb2sgZm9yIGFueSBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBvciByZWxhdGlvbnNoaXBzIHRoYXQgbWlnaHQgYmUgbGVzcyBvYnZpb3VzLiBUaGVyZSBjb3VsZCBiZSBvdGhlciByZWxhdGVkIGtlcm5lbCBmZWF0dXJlcyBvciBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgYWxzbyBpbnZvbHZlZC4gSXQmIzM5O3MgaW1wb3J0YW50IHRvIGhhdmUgYSBjb21wbGV0ZSBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL25mc2QvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgTkZTRFxuICAgMzpcdFx0dHJpc3RhdGUgXCYjMzQ7TkZTIHNlcnZlciBzdXBwb3J0XCYjMzQ7XG4gICA0Olx0XHRkZXBlbmRzIG9uIElORVRcbiAgIDU6XHRcdGRlcGVuZHMgb24gRklMRV9MT0NLSU5HXG4gICA2Olx0XHRkZXBlbmRzIG9uIEZTTk9USUZZXG4gICA3Olx0XHRzZWxlY3QgQ1JDMzJcbiAgIDg6XHRcdHNlbGVjdCBDUllQVE9fTElCX01ENSBpZiBORlNEX0xFR0FDWV9DTElFTlRfVFJBQ0tJTkdcbiAgIDk6XHRcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NiBpZiBORlNEX1Y0XG4gIDEwOlx0XHRzZWxlY3QgQ1JZUFRPICMgcmVxdWlyZWQgYnkgUlBDU0VDX0dTU19LUkI1IGFuZCBzaWduZWQgZmlsZWhhbmRsZXNcbiAgMTE6XHRcdHNlbGVjdCBMT0NLRFxuICAxMjpcdFx0c2VsZWN0IFNVTlJQQ1xuICAxMzpcdFx0c2VsZWN0IEVYUE9SVEZTXG4gIDE0Olx0XHRzZWxlY3QgTkZTX0NPTU1PTlxuICAxNTpcdFx0c2VsZWN0IE5GU19BQ0xfU1VQUE9SVCBpZiBORlNEX1YyX0FDTFxuICAxNjpcdFx0c2VsZWN0IE5GU19BQ0xfU1VQUE9SVCBpZiBORlNEX1YzX0FDTFxuICAxNzpcdFx0ZGVwZW5kcyBvbiBNVUxUSVVTRVJcbiAgMTg6XHRcdGhlbHBcbiAgMTk6XHRcdCAgQ2hvb3NlIFkgaGVyZSBpZiB5b3Ugd2FudCB0byBhbGxvdyBvdGhlciBjb21wdXRlcnMgdG8gYWNjZXNzXG4gIDIwOlx0XHQgIGZpbGVzIHJlc2lkaW5nIG9uIHRoaXMgc3lzdGVtIHVzaW5nIFN1biYjMzk7cyBOZXR3b3JrIEZpbGUgU3lzdGVtXG4gIDIxOlx0XHQgIHByb3RvY29sLiAgVG8gY29tcGlsZSB0aGUgTkZTIHNlcnZlciBzdXBwb3J0IGFzIGEgbW9kdWxlLFxuICAyMjpcdFx0ICBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG5mc2QuXG4gIDIzOlx0XG4gIDI0Olx0XHQgIFlvdSBtYXkgY2hvb3NlIHRvIHVzZSBhIHVzZXItc3BhY2UgTkZTIHNlcnZlciBpbnN0ZWFkLCBpbiB3aGljaFxuICAyNTpcdFx0ICBjYXNlIHlvdSBjYW4gY2hvb3NlIE4gaGVyZS5cbiAgMjY6XHRcbiAgMjc6XHRcdCAgVG8gZXhwb3J0IGxvY2FsIGZpbGUgc3lzdGVtcyB1c2luZyBORlMsIHlvdSBhbHNvIG5lZWQgdG8gaW5zdGFsbFxuICAyODpcdFx0ICB1c2VyIHNwYWNlIHByb2dyYW1zIHdoaWNoIGNhbiBiZSBmb3VuZCBpbiB0aGUgTGludXggbmZzLXV0aWxzXG4gIDI5Olx0XHQgIHBhY2thZ2UsIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9saW51eC1uZnMub3JnLy4gIE1vcmUgZGV0YWlsIGFib3V0XG4gIDMwOlx0XHQgIHRoZSBMaW51eCBORlMgc2VydmVyIGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB2aWEgdGhlXG4gIDMxOlx0XHQgIGV4cG9ydHMoNSkgbWFuIHBhZ2UuXG4gIDMyOlx0XG4gIDMzOlx0XHQgIEJlbG93IHlvdSBjYW4gY2hvb3NlIHdoaWNoIHZlcnNpb25zIG9mIHRoZSBORlMgcHJvdG9jb2wgYXJlXG4gIDM0Olx0XHQgIGF2YWlsYWJsZSB0byBjbGllbnRzIG1vdW50aW5nIHRoZSBORlMgc2VydmVyIG9uIHRoaXMgc3lzdGVtLlxuICAzNTpcdFx0ICBTdXBwb3J0IGZvciBORlMgdmVyc2lvbiAzIChSRkMgMTgxMykgaXMgYWx3YXlzIGF2YWlsYWJsZSB3aGVuXG4gIDM2Olx0XHQgIENPTkZJR19ORlNEIGlzIHNlbGVjdGVkLlxuICAzNzpcdFxuICAzODpcdFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuICAzOTpcdFxuICA0MDpcdGNvbmZpZyBORlNEX1YyXG4gIDQxOlx0XHRib29sIFwmIzM0O05GUyBzZXJ2ZXIgc3VwcG9ydCBmb3IgTkZTIHZlcnNpb24gMiAoREVQUkVDQVRFRClcJiMzNDtcbiAgNDI6XHRcdGRlcGVuZHMgb24gTkZTRFxuICA0MzpcdFx0ZGVmYXVsdCBuXG4gIDQ0Olx0XHRoZWxwXG4gIDQ1Olx0XHQgIE5GU3YyIChSRkMgMTA5NCkgd2FzIHRoZSBmaXJzdCBwdWJsaWNseS1yZWxlYXNlZCB2ZXJzaW9uIG9mIE5GUy5cbiAgNDY6XHRcdCAgVW5sZXNzIHlvdSBhcmUgaG9zdGluZyBhbmNpZW50ICgxOTkwJiMzOTtzIGVyYSkgTkZTIGNsaWVudHMsIHlvdSBkb24mIzM5O3RcbiAgNDc6XHRcdCAgbmVlZCB0aGlzLlxuICA0ODpcdFxuICA0OTpcdFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuICA1MDpcdFxuICA1MTpcdGNvbmZpZyBORlNEX1YyX0FDTFxuICA1MjpcdFx0Ym9vbCBcJiMzNDtORlMgc2VydmVyIHN1cHBvcnQgZm9yIHRoZSBORlN2MiBBQ0wgcHJvdG9jb2wgZXh0ZW5zaW9uXCYjMzQ7XG4gIDUzOlx0XHRkZXBlbmRzIG9uIE5GU0RfVjJcbiAgNTQ6XHRcbiAgNTU6XHRjb25maWcgTkZTRF9WM19BQ0xcbiAgNTY6XHRcdGJvb2wgXCYjMzQ7TkZTIHNlcnZlciBzdXBwb3J0IGZvciB0aGUgTkZTdjMgQUNMIHByb3RvY29sIGV4dGVuc2lvblwmIzM0O1xuICA1NzpcdFx0ZGVwZW5kcyBvbiBORlNEXG4gIDU4Olx0XHRoZWxwXG4gIDU5Olx0XHQgIFNvbGFyaXMgTkZTIHNlcnZlcnMgc3VwcG9ydCBhbiBhdXhpbGlhcnkgTkZTdjMgQUNMIHByb3RvY29sIHRoYXRcbiAgNjA6XHRcdCAgbmV2ZXIgYmVjYW1lIGFuIG9mZmljaWFsIHBhcnQgb2YgdGhlIE5GUyB2ZXJzaW9uIDMgcHJvdG9jb2wuXG4gIDYxOlx0XHQgIFRoaXMgcHJvdG9jb2wgZXh0ZW5zaW9uIGFsbG93cyBhcHBsaWNhdGlvbnMgb24gTkZTIGNsaWVudHMgdG9cbiAgNjI6XHRcdCAgbWFuaXB1bGF0ZSBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyBvbiBmaWxlcyByZXNpZGluZyBvbiBORlNcbiAgNjM6XHRcdCAgc2VydmVycy4gIE5GUyBzZXJ2ZXJzIGVuZm9yY2UgUE9TSVggQUNMcyBvbiBsb2NhbCBmaWxlcyB3aGV0aGVyXG4gIDY0Olx0XHQgIHRoaXMgcHJvdG9jb2wgaXMgYXZhaWxhYmxlIG9yIG5vdC5cbiAgNjU6XHRcbiAgNjY6XHRcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGluIHlvdXIgc3lzdGVtJiMzOTtzIE5GUyBzZXJ2ZXIgZm9yIHRoZVxuICA2NzpcdFx0ICBORlN2MyBBQ0wgcHJvdG9jb2wgZXh0ZW5zaW9uIGFsbG93aW5nIE5GUyBjbGllbnRzIHRvIG1hbmlwdWxhdGVcbiAgNjg6XHRcdCAgUE9TSVggQUNMcyBvbiBmaWxlcyBleHBvcnRlZCBieSB5b3VyIHN5c3RlbSYjMzk7cyBORlMgc2VydmVyLiAgTkZTXG4gIDY5Olx0XHQgIGNsaWVudHMgd2hpY2ggc3VwcG9ydCB0aGUgU29sYXJpcyBORlN2MyBBQ0wgcHJvdG9jb2wgY2FuIHRoZW5cbiAgNzA6XHRcdCAgYWNjZXNzIGFuZCBtb2RpZnkgQUNMcyBvbiB5b3VyIE5GUyBzZXJ2ZXIuXG4gIDcxOlx0XG4gIDcyOlx0XHQgIFRvIHN0b3JlIEFDTHMgb24geW91ciBORlMgc2VydmVyLCB5b3UgYWxzbyBuZWVkIHRvIGVuYWJsZSBBQ0wtXG4gIDczOlx0XHQgIHJlbGF0ZWQgQ09ORklHIG9wdGlvbnMgZm9yIHlvdXIgbG9jYWwgZmlsZSBzeXN0ZW1zIG9mIGNob2ljZS5cbiAgNzQ6XHRcbiAgNzU6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAgNzY6XHRcbiAgNzc6XHRjb25maWcgTkZTRF9WNFxuICA3ODpcdFx0Ym9vbCBcJiMzNDtORlMgc2VydmVyIHN1cHBvcnQgZm9yIE5GUyB2ZXJzaW9uIDRcJiMzNDtcbiAgNzk6XHRcdGRlcGVuZHMgb24gTkZTRCBcdTAwMjZcdTAwMjYgUFJPQ19GU1xuICA4MDpcdFx0c2VsZWN0IEZTX1BPU0lYX0FDTFxuICA4MTpcdFx0c2VsZWN0IFJQQ1NFQ19HU1NfS1JCNVxuICA4MjpcdFx0c2VsZWN0IEdSQUNFX1BFUklPRFxuICA4MzpcdFx0c2VsZWN0IE5GU19WNF8yX1NTQ19IRUxQRVIgaWYgTkZTX1Y0XzJcbiAgODQ6XHRcdGhlbHBcbiAgODU6XHRcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGluIHlvdXIgc3lzdGVtJiMzOTtzIE5GUyBzZXJ2ZXIgZm9yXG4gIDg2Olx0XHQgIHZlcnNpb24gNCBvZiB0aGUgTkZTIHByb3RvY29sIChSRkMgMzUzMCkuXG4gIDg3Olx0XG4gIDg4Olx0XHQgIFRvIGV4cG9ydCBmaWxlcyB1c2luZyBORlN2NCwgeW91IG5lZWQgdG8gaW5zdGFsbCBhZGRpdGlvbmFsIHVzZXJcbiAgODk6XHRcdCAgc3BhY2UgcHJvZ3JhbXMgd2hpY2ggY2FuIGJlIGZvdW5kIGluIHRoZSBMaW51eCBuZnMtdXRpbHMgcGFja2FnZSxcbiAgOTA6XHRcdCAgYXZhaWxhYmxlIGZyb20gaHR0cDovL2xpbnV4LW5mcy5vcmcvLlxuICA5MTpcdFxuICA5MjpcdFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuICA5MzpcdFxuICA5NDpcdGNvbmZpZyBORlNEX1BORlNcbiAgOTU6XHRcdGJvb2xcbiAgOTY6XHRcbiAgOTc6XHRjb25maWcgTkZTRF9CTE9DS0xBWU9VVFxuICA5ODpcdFx0Ym9vbCBcJiMzNDtORlN2NC4xIHNlcnZlciBzdXBwb3J0IGZvciBwTkZTIGJsb2NrIGxheW91dHNcJiMzNDtcbiAgOTk6XHRcdGRlcGVuZHMgb24gTkZTRF9WNCBcdTAwMjZcdTAwMjYgQkxPQ0tcbiAxMDA6XHRcdHNlbGVjdCBORlNEX1BORlNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM1NTgKCQkJCQkJCW91dHB1dDogMTU1CgkJCQkJCQl0aG91Z2h0czogNDgzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBORlMgTmV0bGluayBMaXN0ZW5lciBDb25maWd1cmF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gcmV2ZWFsZWQgYSBmZXcga2V5IG9wdGlvbnMgdGhhdCBzZWVtIHJlbGV2YW50IHRvIHRoaXMgYXJlYTogYE5GU0RgLCBgTkZTRF9WNGAsIGBTVU5SUENgLCBgSU5FVGAsIGBGSUxFX0xPQ0tJTkdgLCBgRlNOT1RJRllgLCBgTVVMVElVU0VSYCwgYW5kIGBQUk9DX0ZTYC4gVGhlIGZhY3QgdGhhdCBgU1VOUlBDYCBpcyBzZWxlY3RlZCBieSBgTkZTRGAgaXMgc29tZXRoaW5nIEkmIzM5O2xsIGtlZXAgaW4gbWluZC4gQWxzbywgdGhlIGluY2x1c2lvbiBvZiBgTkVUX05TYCBhbmQgYElQVjZgIGZyb20gdGhlIHNlbGZ0ZXN0IGNvbmZpZyBpcyBpbnRlcmVzdGluZywgbGV0JiMzOTtzIGtlZXAgdGhlbSBpbiBtaW5kLCBldmVuIGlmIHRoZXkgYXJlbiYjMzk7dCBleHBsaWNpdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuCgpJIGluaXRpYWxseSBmbGFnZ2VkIGEgZmV3IGZ1bmN0aW9uIHN5bWJvbHMgYXMgcG90ZW50aWFsIGFyZWFzIG9mIGZvY3VzOiBgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdGAsIGBzdmNfcmVnaXN0ZXJgLCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsYC4gSG93ZXZlciwgYWZ0ZXIgYSBjbG9zZXIgbG9vaywgaXQgc2VlbXMgbm9uZSBvZiB0aGVzZSBhcmUgbGlrZWx5IHRvIGJlIG9uIGEgcGVyZm9ybWFuY2UtY3JpdGljYWwgcGF0aC4gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgIGlzIGEgbmV0bGluayBjb21tYW5kIGhhbmRsZXIsIHdoaWNoIGlzbiYjMzk7dCB0eXBpY2FsbHkgaG90LiBTaW1pbGFybHksIGJvdGggYHN2Y19yZWdpc3RlcmAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbGAgYXJlIGNhbGxlZCBkdXJpbmcgdGhlIHNldHVwIG9mIFJQQyBzZXJ2aWNlcywgbm90IGR1cmluZyBhY3R1YWwgZGF0YSB0cmFuc2Zlci4KCkkgdGhlbiBkaWQgYSBxdWljayBzYW5pdHkgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55IG90aGVyIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSByZWxldmFudCwgSSBjaGVja2VkIHRoZSBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5lYXJieS4gVGhlIGZ1bmN0aW9ucyBgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnNgLCBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCwgYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCwgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgIGFwcGVhciB0byBiZSBzdGF0aWMsIHdoaWNoIGxpa2VseSBtZWFucyB0aGV5IGFyZSBlaXRoZXIgaW5saW5lZCBvciBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLgoKU28sIGNpcmNsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZvY3VzIHN5bWJvbHM6CgoqICAgYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgCiogICBgc3ZjX3JlZ2lzdGVyYAoqICAgYHJwY2JfY3JlYXRlX2xvY2FsYAoKTm93LCBsZXQmIzM5O3MgY29uZmlybSB0aGF0IGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBpcyB0aGUgKm9ubHkqIG5ldGxpbmsgaGFuZGxlciBiZWluZyBtb2RpZmllZC4gWWVzLCBpdCBsb29rcyBsaWtlIGl0IGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgbGlzdGVuZXIgc2V0IGNvbW1hbmQuCgpOZXh0LCBJIG5lZWQgdG8gbWFrZSBhIG5vdGUgb2YgdGhlIHJlbGV2YW50IGBFbmFibGVDb25maWdzYDoKCiogICBgTkZTRGAKKiAgIGBORlNEX1Y0YAoqICAgYFNVTlJQQ2AgKEFnYWluLCBub3RpbmcgaXRzIGRlcGVuZGVuY3kpCiogICBgTkVUX05TYAoqICAgYElQVjZgCgpJJiMzOTtsbCB2ZXJpZnkgdGhhdCBgU1VOUlBDYCBpcyBpbmRlZWQgYSBjb25maWcgb3B0aW9uLCB3aGljaCBpdCBpcy4gRmluYWxseSwgSSYjMzk7bGwgY29uZmlybSB0aGF0IGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBpcyBhY3R1YWxseSBjb21waWxlZCBpbi4gWWVzLCBpdCYjMzk7cyBsb2NhdGVkIHdpdGhpbiBgZnMvbmZzZC9uZnNjdGwuY2AsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGBuZnNkYCBtb2R1bGUuIE5vdyBJIHdpbGwgY29tcGlsZSB0aGUgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05GU0QmIzM0OywKICAgICYjMzQ7TkZTRF9WNCYjMzQ7LAogICAgJiMzNDtTVU5SUEMmIzM0OywKICAgICYjMzQ7TkVUX05TJiMzNDssCiAgICAmIzM0O0lQVjYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0JiMzNDssCiAgICAmIzM0O3N2Y19yZWdpc3RlciYjMzQ7LAogICAgJiMzNDtycGNiX2NyZWF0ZV9sb2NhbCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgTkZTRCBuZXRsaW5rIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gbG9naWMsIGFkZHMgdmFsaWRhdGlvbiBmb3IgdHJhbnNwb3J0IGNsYXNzZXMsIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycywgaW50cm9kdWNlcyBhIHRpbWVvdXQgZm9yIGxvY2FsIHJwY2JpbmQgY2FsbHMsIGFuZCBmaXhlcyBlcnJvciBoYW5kbGluZyBpbiBzdmNfcmVnaXN0ZXIuIFRoZXNlIGFyZSByZWFjaGFibGUgY29yZSBrZXJuZWwgY2hhbmdlcyBpbiB0aGUgTkZTIHNlcnZlciBhbmQgUlBDIHN1YnN5c3RlbXMgdGhhdCBoYXZlIGZ1bmN0aW9uYWwgaW1wYWN0IGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtORlNEJiMzNDssCiAgICAmIzM0O05GU0RfVjQmIzM0OywKICAgICYjMzQ7U1VOUlBDJiMzNDssCiAgICAmIzM0O05FVF9OUyYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCYjMzQ7LAogICAgJiMzNDtzdmNfcmVnaXN0ZXImIzM0OywKICAgICYjMzQ7cnBjYl9jcmVhdGVfbG9jYWwmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyB2YWxpZGF0aW9uIGNoZWNrcyBmb3IgTkZTRCBuZXRsaW5rIGxpc3RlbmVyIGF0dHJpYnV0ZXMgKGUuZy4sIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHRvIGBORlNEX05MX0xJU1RFTkVSX01BWGAgYW5kIHZhbGlkYXRpbmcgdGhlIHRyYW5zcG9ydCBuYW1lIHZpYSBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCkuIEl0IGFsc28gZml4ZXMgZXJyb3IgY29kZSBwcm9wYWdhdGlvbiBpbiBgc3ZjX3JlZ2lzdGVyYCBhbmQgc2V0cyBhIGxvY2FsIHRpbWVvdXQgZm9yIHJwY2JpbmQgY2xpZW50cy4gXG5cblRoZSBuZXRsaW5rIGF0dHJpYnV0ZSBgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVgIGlzIGRlZmluZWQgYXMgYE5MQV9OVUxfU1RSSU5HYCBpbiBgbmZzZF9zb2NrX25sX3BvbGljeWAsIGVuc3VyaW5nIHRoYXQgYG5sYV9kYXRhKClgIHJldHVybnMgYSBwcm9wZXJseSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJlZm9yZSBpdCBpcyBwYXNzZWQgdG8gYHN0cmNtcCgpYCBpbiBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYC4gXG5cbk5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIG9yIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnkuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvZ2ljIGJ1Z3MpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDYwMWViNzA0OGZkMWNjMzcxOTUxZjU4YWYwMGNjMjUwZjllMmJhYzMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAxMCAyMTozOTozNyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDdlMWQ1YTVkNjUxMWUuLmY3M2EyZWE0MjU1NzEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTk3MywyMSAmIzQzOzE5NzMsMzkgQEAgaW50IG5mc2RfbmxfdmVyc2lvbl9nZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCXJldHVybiBlcnI7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFRyYW5zcG9ydCBjbGFzc2VzIE5GU0Qga25vd3MgaG93IHRvIGluc3RhbnRpYXRlLiBWZXR0aW5nIHRoZSBuYW1lIGhlcmUKJiM0MzsgKiBrZWVwcyBhIGJvZ3VzIHN0cmluZyBmcm9tIHJlYWNoaW5nIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCksIHdoZXJlIGFuCiYjNDM7ICogdW5rbm93biBuYW1lIHRyaWdnZXJzIGEgcmVxdWVzdF9tb2R1bGUoJiMzNDtzdmMlcyYjMzQ7LCBuYW1lKSB1cGNhbGwgdW5kZXIKJiM0MzsgKiBuZnNkX211dGV4LgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdXBwb3J0ZWRbXSA9IHsgJiMzNDt0Y3AmIzM0OywgJiMzNDt1ZHAmIzM0OywgJiMzNDtyZG1hJiMzNDsgfTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKHN1cHBvcnRlZCk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKCFzdHJjbXAobmFtZSwgc3VwcG9ydGVkW2ldKSkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKiBVcHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBhIHNpbmdsZSByZXF1ZXN0IG1heSBjYXJyeS4gKi8KJiM0MzsjZGVmaW5lIE5GU0RfTkxfTElTVEVORVJfTUFYCTEwMjQKJiM0MzsKIC8qKgogICogbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMgLSBzYW5pdHktY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgZnJvbSB1c2VybGFuZAogICogQGluZm86IG5ldGxpbmsgbWV0YWRhdGEgYW5kIGNvbW1hbmQgYXJndW1lbnRzCiAgKgotICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCBlYWNoIGVudHJ5Ci0gKiBpcyB3ZWxsLWZvcm1lZDogaXQgcGFyc2VzIGFnYWluc3QgdGhlIHBvbGljeSwgY2FycmllcyBib3RoIGFuIGFkZHJlc3MgYW5kCi0gKiBhIHRyYW5zcG9ydCBuYW1lLCBhbmQgdGhlIGFkZHJlc3MgaXMgbG9uZyBlbm91Z2ggZm9yIGl0cyBmYW1pbHkuIERvaW5nCi0gKiB0aGlzIHVwIGZyb250IGxldHMgdGhlIGNhbGxlcnMgYmVsb3cgYXNzdW1lIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkIGFuZAotICogZ3VhcmFudGVlcyB3ZSBtYWtlIG5vIGNoYW5nZXMgd2hlbiB0aGUgcmVxdWVzdCBpcyBtYWxmb3JtZWQuCiYjNDM7ICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCB0aGUgbGlzdCBpcwomIzQzOyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC4KICAqCiAgKiBSZXR1cm46IDAgaWYgZXZlcnkgZW50cnkgaXMgdmFsaWQsIG9yIGEgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cjsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAlpbnQgcmVtOwogCiAJbmxtc2dfZm9yX2VhY2hfYXR0cl90eXBlKGF0dHIsIE5GU0RfQV9TRVJWRVJfU09DS19BRERSLCBpbmZvLSZndDtubGhkciwKQEAgLTE5OTYsNiAmIzQzOzIwMTQsMTEgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCQlzdHJ1Y3Qgc29ja2FkZHIgKnNhOwogCQlpbnQgZXJyOwogCiYjNDM7CQlpZiAoJiM0MzsmIzQzO2NvdW50ICZndDsgTkZTRF9OTF9MSVNURU5FUl9NQVgpIHsKJiM0MzsJCQlOTF9TRVRfRVJSX01TRyhpbmZvLSZndDtleHRhY2ssICYjMzQ7dG9vIG1hbnkgbGlzdGVuZXJzJiMzNDspOwomIzQzOwkJCXJldHVybiAtRTJCSUc7CiYjNDM7CQl9CiYjNDM7CiAJCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5GU0RfQV9TT0NLX01BWCwgYXR0ciwKIAkJCQkgICAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby0mZ3Q7ZXh0YWNrKTsKIAkJaWYgKGVyciAmbHQ7IDApCkBAIC0yMDA0LDYgJiM0MzsyMDI3LDkgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCQlpZiAoIXRiW05GU0RfQV9TT0NLX0FERFJdIHx8ICF0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAomIzQzOwkJaWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpCiYjNDM7CQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiYjNDM7CiAJCXNhID0gbmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfQUREUl0pOwogCQlpZiAobmxhX2xlbih0YltORlNEX0FfU09DS19BRERSXSkgJmx0OyBzaXplb2Yoc2EtJmd0O3NhX2ZhbWlseSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIxNTYsOCAmIzQzOzIxODIsMTIgQEAgaW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIAkJcmV0ID0gc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2Eoc2VydiwgeGNsX25hbWUsIG5ldCwgc2EsIDAsCiAJCQkJCSAgICAgIGN1cnJlbnRfY3JlZCgpKTsKIAkJLyogYWx3YXlzIHNhdmUgdGhlIGxhdGVzdCBlcnJvciAqLwotCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWlmIChyZXQgJmx0OyAwKSB7CiYjNDM7CQkJTkxfU0VUX0VSUl9NU0dfRk1UKGluZm8tJmd0O2V4dGFjaywKJiM0MzsJCQkJCSAgICYjMzQ7Y2Fubm90IGNyZWF0ZSAlcyBsaXN0ZW5lcjogJWQmIzM0OywKJiM0MzsJCQkJCSAgIHhjbF9uYW1lLCByZXQpOwogCQkJZXJyID0gcmV0OwomIzQzOwkJfQogCX0KIAogCWlmICghc2Vydi0mZ3Q7c3ZfbnJ0aHJlYWRzICZhbXA7JmFtcDsgbGlzdF9lbXB0eSgmYW1wO25uLSZndDtuZnNkX3NlcnYtJmd0O3N2X3Blcm1zb2NrcykpCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCA2YWEzNzIxODhjODZhLi4wYWEzNzZiODJhNTI2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTIyMSw2ICYjNDM7MjIxLDE2IEBAIHN0YXRpYyB2b2lkIHJwY2Jfc2V0X2xvY2FsKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHJwY19jbG50ICpjbG50LAogIyBkZWZpbmUgU1VOX0xFTihwdHIpIChvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKQkJXAogCQkgICAgICAmIzQzOyAxICYjNDM7IHN0cmxlbigocHRyKS0mZ3Q7c3VuX3BhdGggJiM0MzsgMSkpCiAKJiM0MzsvKgomIzQzOyAqIFRoZSBrZXJuZWwmIzM5O3MgcnBjYmluZCBjbGllbnQgdGFsa3Mgb25seSB0byB0aGUgbG9jYWwgcnBjYmluZCwgb3ZlciBsb29wYmFjawomIzQzOyAqIG9yIGEgbG9jYWwgQUZfTE9DQUwgc29ja2V0LCB3aGVyZSBhIGhlYWx0aHkgcnBjYmluZCBhbnN3ZXJzIGluIG1pY3Jvc2Vjb25kcy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHJwY190aW1lb3V0IHJwY2JfbG9jYWxfdGltZW91dCA9IHsKJiM0MzsJLnRvX2luaXR2YWwJPSAxICogSFosCiYjNDM7CS50b19tYXh2YWwJPSAxICogSFosCiYjNDM7CS50b19yZXRyaWVzCT0gMCwKJiM0Mzt9OwomIzQzOwogLyoKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQogICogaXMgcmV0dXJuZWQuCkBAIC0yMzgsNiAmIzQzOzI0OCw3IEBAIHN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfYWZfbG9jYWwoc3RydWN0IG5ldCAqbmV0LAogCQkudmVyc2lvbgk9IFJQQ0JWRVJTXzIsCiAJCS5hdXRoZmxhdm9yCT0gUlBDX0FVVEhfTlVMTCwKIAkJLmNyZWQJCT0gY3VycmVudF9jcmVkKCksCiYjNDM7CQkudGltZW91dAk9ICZhbXA7cnBjYl9sb2NhbF90aW1lb3V0LAogCQkvKgogCQkgKiBXZSB0dXJuIG9mZiB0aGUgaWRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGtlcm5lbAogCQkgKiBmcm9tIGF1dG9tYXRpY2FsbHkgZGlzY29ubmVjdGluZyB0aGUgc29ja2V0LgpAQCAtMzEyLDYgJiM0MzszMjMsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX25ldChzdHJ1Y3QgbmV0ICpuZXQpCiAJCS52ZXJzaW9uCT0gUlBDQlZFUlNfMiwKIAkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9VTklYLAogCQkuY3JlZAkJPSBjdXJyZW50X2NyZWQoKSwKJiM0MzsJCS50aW1lb3V0CT0gJmFtcDtycGNiX2xvY2FsX3RpbWVvdXQsCiAJCS5mbGFncwkJPSBSUENfQ0xOVF9DUkVBVEVfTk9QSU5HLAogCX07CiAJc3RydWN0IHJwY19jbG50ICpjbG50LCAqY2xudDQ7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCAwNWMzZTZlMmY2NTk0Li5lOWNmY2ViMWEzMzQyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTEyMDgsMTMgJiM0MzsxMjA4LDE2IEBAIGludCBzdmNfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBzdHJ1Y3QgbmV0ICpuZXQsCiAJCXN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZ3AgPSAmYW1wO3NlcnYtJmd0O3N2X3Byb2dyYW1zW3BdOwogCiAJCWZvciAoaSA9IDA7IGkgJmx0OyBwcm9ncC0mZ3Q7cGdfbnZlcnM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaW50IHJldDsKIAotCQkJZXJyb3IgPSBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSwKJiM0MzsJCQlyZXQgPSBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSwKIAkJCQkJZmFtaWx5LCBwcm90bywgcG9ydCk7Ci0JCQlpZiAoZXJyb3IgJmx0OyAwKSB7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICYjMzQ7c3ZjOiBmYWlsZWQgdG8gcmVnaXN0ZXIgJiMzNDsKIAkJCQkJJiMzNDslc3YldSBSUEMgc2VydmljZSAoZXJybm8gJWQpLlxuJiMzNDssCi0JCQkJCXByb2dwLSZndDtwZ19uYW1lLCBpLCAtZXJyb3IpOwomIzQzOwkJCQkJcHJvZ3AtJmd0O3BnX25hbWUsIGksIC1yZXQpOwomIzQzOwkJCQlpZiAoIWVycm9yKQomIzQzOwkJCQkJZXJyb3IgPSByZXQ7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKaW5kZXggODQzNDNmZDFlMzU0Yi4uNDYwNTA4ZGU5Mzc0ZiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKQEAgLTg5LDYgJiM0Mzs4OSw3IEBAIFRBUkdFVFMgJiM0Mzs9IG5ldC9wYWNrZXRkcmlsbAogVEFSR0VUUyAmIzQzOz0gbmV0L3BwcAogVEFSR0VUUyAmIzQzOz0gbmV0L3JkcwogVEFSR0VUUyAmIzQzOz0gbmV0L3RjcF9hbwomIzQzO1RBUkdFVFMgJiM0Mzs9IG5mc2QKIFRBUkdFVFMgJiM0Mzs9IG5vbGliYwogVEFSR0VUUyAmIzQzOz0gcGNpX2VuZHBvaW50CiBUQVJHRVRTICYjNDM7PSBwY2llX2J3Y3RybApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE5ZTZkZWMwNGQ4ZTkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmUKQEAgLTAsMCAmIzQzOzEgQEAKJiM0MztuZnNkX25ldGxpbmtfbGlzdGVuZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1YWM2NTU0OWQyNTkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlCkBAIC0wLDAgJiM0MzsxLDYgQEAKJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7Q0ZMQUdTICYjNDM7PSAkKEtIRFJfSU5DTFVERVMpIC1XYWxsCiYjNDM7CiYjNDM7VEVTVF9HRU5fUFJPR1MgOj0gbmZzZF9uZXRsaW5rX2xpc3RlbmVyCiYjNDM7CiYjNDM7aW5jbHVkZSAuLi9saWIubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uZTY5NDVmZjk1NTFjNAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnCkBAIC0wLDAgJiM0MzsxLDQgQEAKJiM0MztDT05GSUdfTkVUX05TPXkKJiM0MztDT05GSUdfSVBWNj15CiYjNDM7Q09ORklHX05GU0Q9eQomIzQzO0NPTkZJR19ORlNEX1Y0PXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlMzMwNzY4MGQ3ZDQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jCkBAIC0wLDAgJiM0MzsxLDkyMCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBSZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUgTkZTRCBnZW5lcmljLW5ldGxpbmsgbGlzdGVuZXIgaW50ZXJmYWNlCiYjNDM7ICogKE5GU0RfQ01EX0xJU1RFTkVSX1NFVCAvIE5GU0RfQ01EX0xJU1RFTkVSX0dFVCkuCiYjNDM7ICoKJiM0MzsgKiBUaHJlZSBncm91cHM6CiYjNDM7ICogICB2YWxpZGF0aW9uICAtIG1hbGZvcm1lZC9hYnVzaXZlIExJU1RFTkVSX1NFVCByZXF1ZXN0cyBhcmUgcmVqZWN0ZWQgYnkKJiM0MzsgKiAgICAgICAgICAgICAgICAgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwgYmVmb3JlIG5mc2RfbXV0ZXggaXMgdGFrZW4uCiYjNDM7ICogICBmdW5jdGlvbmFsICAtIGNyZWF0ZS9hZGQvcmVtb3ZlIGxpc3RlbmVycyBhbmQgdmVyaWZ5IExJU1RFTkVSX0dFVAomIzQzOyAqICAgICAgICAgICAgICAgICByZWZsZWN0cyB0aGUgc2V0IChyb3VuZC10cmlwIG9mIHRyYW5zcG9ydCAmIzQzOyBhZGRyOnBvcnQpLgomIzQzOyAqICAgc2VtYW50aWNzICAgLSBvbmNlIHRocmVhZHMgYXJlIHJ1bm5pbmcgKFRIUkVBRFNfU0VUKSBhIGxpc3RlbmVyIGNoYW5nZQomIzQzOyAqICAgICAgICAgICAgICAgICBpcyByZWZ1c2VkIHdpdGggLUVCVVNZLgomIzQzOyAqCiYjNDM7ICogRWFjaCB0ZXN0IHJ1bnMgaW4gaXRzIG93biBwcml2YXRlIG5ldCAmIzQzOyBtb3VudCBuYW1lc3BhY2UgKHVuc2hhcmUgaW4KJiM0MzsgKiBGSVhUVVJFX1NFVFVQKS4gL3J1biBpcyBtYXNrZWQgdGhlcmU6IGEgcGF0aG5hbWUgQUZfTE9DQUwgY29ubmVjdCBpcyBub3QKJiM0MzsgKiBzY29wZWQgYnkgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBzaW5jZSB1bml4X2ZpbmRfYnNkKCkgcmVzb2x2ZXMgYnkgaW5vZGUKJiM0MzsgKiBhbmQgdGFrZXMgbm8gc3RydWN0IG5ldCwgc28gdGhlIGtlcm5lbCYjMzk7cyBycGNiaW5kIGNsaWVudCB3b3VsZCBvdGhlcndpc2UgYmUKJiM0MzsgKiBhYmxlIHRvIHJlYWNoIHRoZSBycGNiaW5kIHJ1bm5pbmcgb24gdGhlIGhvc3QuIEFueXRoaW5nIHRoYXQgY3JlYXRlcyBhCiYjNDM7ICogc2VydiBpcyBzZXJ2ZWQgYnkgdGhlIHBlci1uZXRucyBycGNiaW5kIHN0dWIgYmVsb3cgaW5zdGVhZC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2NoZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGRlZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpbnQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21vdW50LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9wcmN0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc29ja2V0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bmV0L2lmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O25ldGluZXQvaW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbmV0bGluay5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9nZW5ldGxpbmsuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0Oy4uL2tzZWxmdGVzdF9oYXJuZXNzLmgmIzM0OwomIzQzOwomIzQzOy8qIE5GU0QgZ2VuZXJpYy1uZXRsaW5rIGNvbnN0YW50cyAoZnJvbSBsaW51eC9uZnNkX25ldGxpbmsuaCkuICovCiYjNDM7I2RlZmluZSBORlNEX0ZBTUlMWV9OQU1FCQkmIzM0O25mc2QmIzM0OwomIzQzOyNkZWZpbmUgTkZTRF9DTURfVEhSRUFEU19TRVQJCTIKJiM0MzsjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX1NFVAkJNgomIzQzOyNkZWZpbmUgTkZTRF9DTURfTElTVEVORVJfR0VUCQk3CiYjNDM7I2RlZmluZSBORlNEX0FfU0VSVkVSX1RIUkVBRFMJCTEKJiM0MzsjZGVmaW5lIE5GU0RfQV9TRVJWRVJfU09DS19BRERSCQkxCS8qIHBlci1saXN0ZW5lciBuZXN0ICovCiYjNDM7I2RlZmluZSBORlNEX0FfU09DS19BRERSCQkxCS8qIGluc2lkZSB0aGUgbmVzdCAqLwomIzQzOyNkZWZpbmUgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUJMgkvKiBpbnNpZGUgdGhlIG5lc3QgKi8KJiM0MzsKJiM0MzsjZGVmaW5lIE5MQV9BTElHTjQobGVuKQkJCSgoKGxlbikgJiM0MzsgMykgJmFtcDsgfjMpCiYjNDM7I2RlZmluZSBURVNUX1BPUlQJCQkyMDA0OQomIzQzOyNkZWZpbmUgTUFYX0xJU1RFTkVSUwkJCTgKJiM0MzsjZGVmaW5lIFJFQ1ZfVElNRU9fU0VDCQkJMzAKJiM0MzsKJiM0MztzdGF0aWMgaW50IG5mc2RfZmFtaWx5OwkJCS8qIHNldCBwZXItdGVzdCBpbiBGSVhUVVJFX1NFVFVQICovCiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKm1zZykKJiM0Mzt7CiYjNDM7CXBlcnJvcihtc2cpOwomIzQzOwlleGl0KDEpOwomIzQzO30KJiM0MzsKJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIG1pbmltYWwgZ2VuZXJpYy1uZXRsaW5rIHBsdW1iaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdlbmxfb3Blbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX25sIHNhID0geyAubmxfZmFtaWx5ID0gQUZfTkVUTElOSyB9OwomIzQzOwlzdHJ1Y3QgdGltZXZhbCB0diA9IHsgLnR2X3NlYyA9IFJFQ1ZfVElNRU9fU0VDIH07CiYjNDM7CWludCBmZCA9IHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19HRU5FUklDKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NvY2tldChORVRMSU5LX0dFTkVSSUMpJiMzNDspOwomIzQzOwlpZiAoYmluZChmZCwgKHZvaWQgKikmYW1wO3NhLCBzaXplb2Yoc2EpKSAmbHQ7IDApCiYjNDM7CQlkaWUoJiMzNDtiaW5kKG5ldGxpbmspJiMzNDspOwomIzQzOwlzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJmFtcDt0diwgc2l6ZW9mKHR2KSk7CiYjNDM7CXJldHVybiBmZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQXBwZW5kIGFuIGF0dHJpYnV0ZSBhdCBAb2ZmOyByZXR1cm4gdGhlIG5ldyAoYWxpZ25lZCkgb2Zmc2V0LiAqLwomIzQzO3N0YXRpYyBpbnQgcHV0X2F0dHIoY2hhciAqYnVmLCBpbnQgb2ZmLCB1aW50MTZfdCB0eXBlLAomIzQzOwkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbmxhdHRyICpuYSA9ICh2b2lkICopKGJ1ZiAmIzQzOyBvZmYpOwomIzQzOwomIzQzOwluYS0mZ3Q7bmxhX3R5cGUgPSB0eXBlOwomIzQzOwluYS0mZ3Q7bmxhX2xlbiA9IE5MQV9IRFJMRU4gJiM0MzsgbGVuOwomIzQzOwlpZiAobGVuKQomIzQzOwkJbWVtY3B5KGJ1ZiAmIzQzOyBvZmYgJiM0MzsgTkxBX0hEUkxFTiwgZGF0YSwgbGVuKTsKJiM0MzsJcmV0dXJuIG9mZiAmIzQzOyBOTEFfQUxJR040KE5MQV9IRFJMRU4gJiM0MzsgbGVuKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQnVpbGQgYSBnZW5sIG1lc3NhZ2UgaGVhZGVyIGludG8gQGJ1ZjsgcmV0dXJuIHRoZSBvZmZzZXQgcGFzdCBpdC4gKi8KJiM0MztzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKQomIzQzO3sKJiM0MzsJc3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjsKJiM0MzsJc3RydWN0IGdlbmxtc2doZHIgKmdubCA9ICh2b2lkICopKGJ1ZiAmIzQzOyBOTE1TR19IRFJMRU4pOwomIzQzOwomIzQzOwltZW1zZXQoYnVmLCAwLCBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU4pOwomIzQzOwlubGgtJmd0O25sbXNnX3R5cGUgPSB0eXBlOwomIzQzOwlubGgtJmd0O25sbXNnX2ZsYWdzID0gZmxhZ3M7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfc2VxID0gMTsKJiM0MzsJZ25sLSZndDtjbWQgPSBjbWQ7CiYjNDM7CWdubC0mZ3Q7dmVyc2lvbiA9IDE7CiYjNDM7CXJldHVybiBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU47CiYjNDM7fQomIzQzOwomIzQzOy8qIFNlbmQgYW4gbmZzZCBjb21tYW5kIHdpdGggYW4gQUNLOyByZXR1cm4gdGhlIEFDSyBlcnJubyAoJmx0Oz0gMCkuICovCiYjNDM7c3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKQomIzQzO3sKJiM0MzsJY2hhciBidWZbMSAmbHQ7Jmx0OyAyMF0sIHJidWZbNDA5Nl07CiYjNDM7CXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7CiYjNDM7CWludCBmZCA9IGdlbmxfb3BlbigpOwomIzQzOwlpbnQgb2ZmLCBuLCByZXQ7CiYjNDM7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0ssIGNtZCk7CiYjNDM7CWlmIChhdHRyc19sZW4pIHsKJiM0MzsJCW1lbWNweShidWYgJiM0Mzsgb2ZmLCBhdHRycywgYXR0cnNfbGVuKTsKJiM0MzsJCW9mZiAmIzQzOz0gYXR0cnNfbGVuOwomIzQzOwl9CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoZ2VubCkmIzM0Oyk7CiYjNDM7CiYjNDM7CW4gPSByZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApOwomIzQzOwlpZiAobiAmbHQ7IDApCiYjNDM7CQlyZXQgPSAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSA/IC1FVElNRURPVVQgOiAtZXJybm87CiYjNDM7CWVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktJmd0O25sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpCiYjNDM7CQlyZXQgPSAoKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEocmJ1ZikpLSZndDtlcnJvcjsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gMDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKiBTZW5kIGEgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBmdWxsIHJlcGx5IG1lc3NhZ2U7IC1lcnJubyBvbiBmYWlsdXJlLiAqLwomIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXF1ZXN0X3JlcGx5KHVpbnQ4X3QgY21kLCBjaGFyICpyYnVmLCBzaXplX3QgcmxlbikKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzI1Nl07CiYjNDM7CXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7CiYjNDM7CWludCBmZCA9IGdlbmxfb3BlbigpOwomIzQzOwlpbnQgb2ZmLCBuLCByZXQ7CiYjNDM7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QsIGNtZCk7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoZ2VubCByZXBseSkmIzM0Oyk7CiYjNDM7CiYjNDM7CW4gPSByZWN2KGZkLCByYnVmLCBybGVuLCAwKTsKJiM0MzsJaWYgKG4gJmx0OyAwKQomIzQzOwkJcmV0ID0gKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgPyAtRVRJTUVET1VUIDogLWVycm5vOwomIzQzOwllbHNlIGlmICgoKHN0cnVjdCBubG1zZ2hkciAqKXJidWYpLSZndDtubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKQomIzQzOwkJcmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS0mZ3Q7ZXJyb3I7CiYjNDM7CWVsc2UKJiM0MzsJCXJldCA9IG47CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVzb2x2ZSB0aGUgJiMzNDtuZnNkJiMzNDsgZ2VubCBmYW1pbHkgaWQ7IC0xIGlmIG5vdCByZWdpc3RlcmVkLiAqLwomIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXNvbHZlX25mc2Qodm9pZCkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzEwMjRdLCByYnVmWzQwOTZdOwomIzQzOwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmOwomIzQzOwlzdHJ1Y3Qgbmxtc2doZHIgKnJoID0gKHZvaWQgKilyYnVmOwomIzQzOwlzdHJ1Y3QgbmxhdHRyICpuYTsKJiM0MzsJaW50IGZkLCBvZmYsIGxlZnQsIGlkID0gLTE7CiYjNDM7CiYjNDM7CWZkID0gZ2VubF9vcGVuKCk7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgR0VOTF9JRF9DVFJMLCBOTE1fRl9SRVFVRVNULCBDVFJMX0NNRF9HRVRGQU1JTFkpOwomIzQzOwlvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLAomIzQzOwkJICAgICAgIE5GU0RfRkFNSUxZX05BTUUsIHNpemVvZihORlNEX0ZBTUlMWV9OQU1FKSk7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoR0VURkFNSUxZKSYjMzQ7KTsKJiM0MzsJaWYgKHJlY3YoZmQsIHJidWYsIHNpemVvZihyYnVmKSwgMCkgJmx0OyAwKQomIzQzOwkJZGllKCYjMzQ7cmVjdihHRVRGQU1JTFkpJiMzNDspOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWlmIChyaC0mZ3Q7bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJbmEgPSAodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEocmgpICYjNDM7IEdFTkxfSERSTEVOKTsKJiM0MzsJbGVmdCA9IHJoLSZndDtubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjsKJiM0MzsJd2hpbGUgKGxlZnQgJmd0Oz0gKGludClOTEFfSERSTEVOKSB7CiYjNDM7CQlpZiAobmEtJmd0O25sYV90eXBlID09IENUUkxfQVRUUl9GQU1JTFlfSUQpIHsKJiM0MzsJCQlpZCA9ICoodWludDE2X3QgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfSERSTEVOKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWxlZnQgLT0gTkxBX0FMSUdONChuYS0mZ3Q7bmxhX2xlbik7CiYjNDM7CQluYSA9ICh2b2lkICopKChjaGFyICopbmEgJiM0MzsgTkxBX0FMSUdONChuYS0mZ3Q7bmxhX2xlbikpOwomIzQzOwl9CiYjNDM7CXJldHVybiBpZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBsaXN0ZW5lciByZXF1ZXN0IGJ1aWxkZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MzsvKiBGaW5lLWdyYWluZWQgY29udHJvbCBmb3IgbmVnYXRpdmUgdGVzdHM6IGFueSBmaWVsZCBjYW4gYmUgb21pdHRlZC9tYWxmb3JtZWQuICovCiYjNDM7c3RydWN0IHJhd19saXN0ZW5lciB7CiYjNDM7CWNvbnN0IGNoYXIgKnhwcnQ7CS8qIE5VTEwgLSZndDsgb21pdCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSAqLwomIzQzOwlpbnQgZW1pdF9hZGRyOwkJLyogMCAtJmd0OyBvbWl0IE5GU0RfQV9TT0NLX0FERFIgKi8KJiM0MzsJY29uc3Qgdm9pZCAqYWRkcjsKJiM0MzsJaW50IGFkZHJfbGVuOwkJLyogYnl0ZXMgdG8gZW1pdCBmb3IgTkZTRF9BX1NPQ0tfQUREUiAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBwdXRfcmF3X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3Qgc3RydWN0IHJhd19saXN0ZW5lciAqcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBubGF0dHIgKm5lc3QgPSAodm9pZCAqKShidWYgJiM0Mzsgb2ZmKTsKJiM0MzsJaW50IGlubmVyID0gb2ZmICYjNDM7IE5MQV9IRFJMRU47CiYjNDM7CiYjNDM7CWlmIChyLSZndDtlbWl0X2FkZHIpCiYjNDM7CQlpbm5lciA9IHB1dF9hdHRyKGJ1ZiwgaW5uZXIsIE5GU0RfQV9TT0NLX0FERFIsIHItJmd0O2FkZHIsIHItJmd0O2FkZHJfbGVuKTsKJiM0MzsJaWYgKHItJmd0O3hwcnQpCiYjNDM7CQlpbm5lciA9IHB1dF9hdHRyKGJ1ZiwgaW5uZXIsIE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FLAomIzQzOwkJCQkgci0mZ3Q7eHBydCwgc3RybGVuKHItJmd0O3hwcnQpICYjNDM7IDEpOwomIzQzOwluZXN0LSZndDtubGFfdHlwZSA9IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIHwgTkxBX0ZfTkVTVEVEOwomIzQzOwluZXN0LSZndDtubGFfbGVuID0gaW5uZXIgLSBvZmY7CiYjNDM7CXJldHVybiBvZmYgJiM0MzsgTkxBX0FMSUdONChuZXN0LSZndDtubGFfbGVuKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogV2VsbC1mb3JtZWQgbG9vcGJhY2sgbGlzdGVuZXIgZm9yIEBmYW1pbHkgKEFGX0lORVQgb3IgQUZfSU5FVDYpLiAqLwomIzQzO3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyX2FmKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSwKJiM0MzsJCQkgICB1aW50MTZfdCBwb3J0KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7MH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSB4cHJ0LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3NzIH07CiYjNDM7CiYjNDM7CWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnM2ID0gKHZvaWQgKikmYW1wO3NzOwomIzQzOwomIzQzOwkJczYtJmd0O3NpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiYjNDM7CQlzNi0mZ3Q7c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7CiYjNDM7CQlzNi0mZ3Q7c2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKJiM0MzsJCXIuYWRkcl9sZW4gPSBzaXplb2YoKnM2KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbiAqczQgPSAodm9pZCAqKSZhbXA7c3M7CiYjNDM7CiYjNDM7CQlzNC0mZ3Q7c2luX2ZhbWlseSA9IEFGX0lORVQ7CiYjNDM7CQlzNC0mZ3Q7c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKJiM0MzsJCXM0LSZndDtzaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOwomIzQzOwkJci5hZGRyX2xlbiA9IHNpemVvZigqczQpOwomIzQzOwl9CiYjNDM7CXJldHVybiBwdXRfcmF3X2xpc3RlbmVyKGJ1Ziwgb2ZmLCAmYW1wO3IpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHB1dF9saXN0ZW5lcihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IGNoYXIgKnhwcnQsIHVpbnQxNl90IHBvcnQpCiYjNDM7ewomIzQzOwlyZXR1cm4gcHV0X2xpc3RlbmVyX2FmKGJ1Ziwgb2ZmLCB4cHJ0LCBBRl9JTkVULCBwb3J0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBMSVNURU5FUl9HRVQgcGFyc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7c3RydWN0IGxpc3RlbmVyX2VudCB7CiYjNDM7CWNoYXIgeHBydFsxNl07CiYjNDM7CWludCBmYW1pbHk7CiYjNDM7CXVpbnQxNl90IHBvcnQ7CiYjNDM7CXN0cnVjdCBpbl9hZGRyIGE0OwomIzQzOwlzdHJ1Y3QgaW42X2FkZHIgYTY7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHBhcnNlX2xpc3RlbmVyX2dldChjb25zdCBjaGFyICpyYnVmLCBpbnQgbGVuLAomIzQzOwkJCSAgICAgIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKm91dCwgaW50IG1heCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHZvaWQgKilyYnVmOwomIzQzOwljb25zdCBzdHJ1Y3QgbmxhdHRyICpuYTsKJiM0MzsJaW50IGxlZnQsIGNvdW50ID0gMDsKJiM0MzsKJiM0MzsJKHZvaWQpbGVuOwomIzQzOwluYSA9IChjb25zdCB2b2lkICopKHJidWYgJiM0MzsgTkxNU0dfSERSTEVOICYjNDM7IEdFTkxfSERSTEVOKTsKJiM0MzsJbGVmdCA9IG5saC0mZ3Q7bmxtc2dfbGVuIC0gTkxNU0dfSERSTEVOIC0gR0VOTF9IRFJMRU47CiYjNDM7CiYjNDM7CXdoaWxlIChsZWZ0ICZndDs9IChpbnQpTkxBX0hEUkxFTikgewomIzQzOwkJaW50IGFsZW4gPSBuYS0mZ3Q7bmxhX2xlbjsKJiM0MzsKJiM0MzsJCWlmICgobmEtJmd0O25sYV90eXBlICZhbXA7IE5MQV9UWVBFX01BU0spID09IE5GU0RfQV9TRVJWRVJfU09DS19BRERSICZhbXA7JmFtcDsKJiM0MzsJCSAgICBjb3VudCAmbHQ7IG1heCkgewomIzQzOwkJCWNvbnN0IHN0cnVjdCBubGF0dHIgKmluID0gKGNvbnN0IHZvaWQgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfSERSTEVOKTsKJiM0MzsJCQlpbnQgaWxlZnQgPSBhbGVuIC0gTkxBX0hEUkxFTjsKJiM0MzsJCQlzdHJ1Y3QgbGlzdGVuZXJfZW50ICplID0gJmFtcDtvdXRbY291bnRdOwomIzQzOwomIzQzOwkJCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKJiM0MzsJCQl3aGlsZSAoaWxlZnQgJmd0Oz0gKGludClOTEFfSERSTEVOKSB7CiYjNDM7CQkJCWNvbnN0IHZvaWQgKmQgPSAoY29uc3QgY2hhciAqKWluICYjNDM7IE5MQV9IRFJMRU47CiYjNDM7CQkJCWludCB0ID0gaW4tJmd0O25sYV90eXBlICZhbXA7IE5MQV9UWVBFX01BU0s7CiYjNDM7CiYjNDM7CQkJCWlmICh0ID09IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FKSB7CiYjNDM7CQkJCQlzdHJuY3B5KGUtJmd0O3hwcnQsIGQsIHNpemVvZihlLSZndDt4cHJ0KSAtIDEpOwomIzQzOwkJCQl9IGVsc2UgaWYgKHQgPT0gTkZTRF9BX1NPQ0tfQUREUikgewomIzQzOwkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzID0gZDsKJiM0MzsKJiM0MzsJCQkJCWUtJmd0O2ZhbWlseSA9IHNzLSZndDtzc19mYW1pbHk7CiYjNDM7CQkJCQlpZiAoc3MtJmd0O3NzX2ZhbWlseSA9PSBBRl9JTkVUKSB7CiYjNDM7CQkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzID0gZDsKJiM0MzsKJiM0MzsJCQkJCQllLSZndDthNCA9IHMtJmd0O3Npbl9hZGRyOwomIzQzOwkJCQkJCWUtJmd0O3BvcnQgPSBudG9ocyhzLSZndDtzaW5fcG9ydCk7CiYjNDM7CQkJCQl9IGVsc2UgaWYgKHNzLSZndDtzc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKJiM0MzsJCQkJCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzID0gZDsKJiM0MzsKJiM0MzsJCQkJCQllLSZndDthNiA9IHMtJmd0O3NpbjZfYWRkcjsKJiM0MzsJCQkJCQllLSZndDtwb3J0ID0gbnRvaHMocy0mZ3Q7c2luNl9wb3J0KTsKJiM0MzsJCQkJCX0KJiM0MzsJCQkJfQomIzQzOwkJCQlpbGVmdCAtPSBOTEFfQUxJR040KGluLSZndDtubGFfbGVuKTsKJiM0MzsJCQkJaW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKWluICYjNDM7IE5MQV9BTElHTjQoaW4tJmd0O25sYV9sZW4pKTsKJiM0MzsJCQl9CiYjNDM7CQkJY291bnQmIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJbGVmdCAtPSBOTEFfQUxJR040KGFsZW4pOwomIzQzOwkJbmEgPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICYjNDM7IE5MQV9BTElHTjQoYWxlbikpOwomIzQzOwl9CiYjNDM7CXJldHVybiBjb3VudDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZW5pZW5jZSB3cmFwcGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7c3RhdGljIGludCBsaXN0ZW5lcl9zZXQoY29uc3QgY2hhciAqYXR0cnMsIGludCBsZW4pCiYjNDM7ewomIzQzOwlyZXR1cm4gZ2VubF9yZXF1ZXN0KE5GU0RfQ01EX0xJU1RFTkVSX1NFVCwgYXR0cnMsIGxlbik7CiYjNDM7fQomIzQzOwomIzQzOy8qIEZldGNoIHRoZSBjdXJyZW50IGxpc3RlbmVyczsgcmV0dXJucyBjb3VudCAoJmd0Oz0wKSBvciAtZXJybm8uICovCiYjNDM7c3RhdGljIGludCBsaXN0ZW5lcl9nZXQoc3RydWN0IGxpc3RlbmVyX2VudCAqb3V0LCBpbnQgbWF4KQomIzQzO3sKJiM0MzsJY2hhciByYnVmWzgxOTJdOwomIzQzOwlpbnQgbiA9IGdlbmxfcmVxdWVzdF9yZXBseShORlNEX0NNRF9MSVNURU5FUl9HRVQsIHJidWYsIHNpemVvZihyYnVmKSk7CiYjNDM7CiYjNDM7CWlmIChuICZsdDsgMCkKJiM0MzsJCXJldHVybiBuOwomIzQzOwlyZXR1cm4gcGFyc2VfbGlzdGVuZXJfZ2V0KHJidWYsIG4sIG91dCwgbWF4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmZpbmRfbGlzdGVuZXIoc3RydWN0IGxpc3RlbmVyX2VudCAqZSwgaW50IG4sCiYjNDM7CQkJCQkgIGNvbnN0IGNoYXIgKnhwcnQsIGludCBmYW1pbHksCiYjNDM7CQkJCQkgIHVpbnQxNl90IHBvcnQpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKGVbaV0uZmFtaWx5ID09IGZhbWlseSAmYW1wOyZhbXA7IGVbaV0ucG9ydCA9PSBwb3J0ICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc3RyY21wKGVbaV0ueHBydCwgeHBydCkpCiYjNDM7CQkJcmV0dXJuICZhbXA7ZVtpXTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIFN0YXJ0IChAbiAmZ3Q7IDApIG9yIHN0b3AgKEBuID09IDApIG5mc2QgdGhyZWFkcyBpbiB0aGlzIG5ldG5zLiAqLwomIzQzO3N0YXRpYyBpbnQgdGhyZWFkc19zZXQoaW50IG4pCiYjNDM7ewomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJdWludDMyX3QgdiA9IG47CiYjNDM7CWludCBvZmYgPSBwdXRfYXR0cihhdHRycywgMCwgTkZTRF9BX1NFUlZFUl9USFJFQURTLCAmYW1wO3YsIHNpemVvZih2KSk7CiYjNDM7CiYjNDM7CXJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfVEhSRUFEU19TRVQsIGF0dHJzLCBvZmYpOwomIzQzO30KJiM0MzsKJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIHBlci1uZXRucyBsb2NhbCBycGNiaW5kIHN0dWIgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogQ3JlYXRpbmcgYSBsaXN0ZW5lciByZWdpc3RlcnMgd2l0aCBycGNiaW5kOiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpCiYjNDM7ICogcGFzc2VzIGZsYWdzIG9mIDAsIHNvIHBtYXBfcmVnaXN0ZXIgaXMgdHJ1ZSBpbiBzdmNfc2V0dXBfc29ja2V0KCksIGFuZAomIzQzOyAqIG5mc2RfdmVyc2lvbjMgaXMgcmVnaXN0ZXJhYmxlIGJ5IGRlZmF1bHQgYW5kIGRvZXMgbm90IHNldCB2c19ycGNiX29wdG5sLAomIzQzOyAqIHNvIGEgcmVnaXN0cmF0aW9uIGZhaWx1cmUgYWJvcnRzIGxpc3RlbmVyIGNyZWF0aW9uLiBUaGUgYWJzdHJhY3QgQUZfTE9DQUwKJiM0MzsgKiBuYW1lIHRoZSBrZXJuZWwgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zICh1bml4X2ZpbmRfYWJzdHJhY3QoKSB0YWtlcyBhCiYjNDM7ICogc3RydWN0IG5ldCksIHNvIGFuc3dlciBpdCBoZXJlIGFuZCBzdGF5IG91dCBvZiB0aGUgaG9zdCYjMzk7cyBycGNiaW5kLgomIzQzOyAqCiYjNDM7ICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZAomIzQzOyAqIFNFVC9VTlNFVCBnZXQgVFJVRSwgZm9yIGJvdGggUlBDQlZFUlNfMiBhbmQgUlBDQlZFUlNfNC4gdjQgaGFzIHRvIGJlCiYjNDM7ICogYW5zd2VyZWQgYmVjYXVzZSBfX3N2Y19ycGNiX3JlZ2lzdGVyNigpIHR1cm5zIGEgdjQgcmVmdXNhbCBpbnRvCiYjNDM7ICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLgomIzQzOyAqCiYjNDM7ICogSW4gUlBDQl9TVFVCX1JFRlVTRSBtb2RlIFNFVCBpcyBhbnN3ZXJlZCBGQUxTRSBpbnN0ZWFkLCB3aGljaAomIzQzOyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seQomIzQzOyAqIHN2Y191bnJlZ2lzdGVyKCkgaXNzdWVzIGl0LCBhbmQgaXQgZGlzY2FyZHMgdGhlIHJlc3VsdC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJQQ0JfUFJPR1JBTQkJMTAwMDAwCiYjNDM7I2RlZmluZSBSUENCX1BST0NfTlVMTAkJMAomIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1NFVAkJMQomIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUCQkyCiYjNDM7I2RlZmluZSBSUENCX0FCU1RSQUNUX05BTUUJJiMzNDsvcnVuL3JwY2JpbmQuc29jayYjMzQ7CiYjNDM7I2RlZmluZSBSUENCX1NUVUJfTUFYQ09OTgk0CiYjNDM7CiYjNDM7ZW51bSB7IFJQQ0JfU1RVQl9BQ0NFUFQsIFJQQ0JfU1RVQl9SRUZVU0UgfTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9saXN0ZW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl91biBzdW4gPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9OwomIzQzOwlzaXplX3QgbmxlbiA9IHN0cmxlbihSUENCX0FCU1RSQUNUX05BTUUpOwomIzQzOwlzb2NrbGVuX3QgYWxlbjsKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwkvKiBBYnN0cmFjdCBuYW1lcyBhcmUgbGVuZ3RoLWRlbGltaXRlZCwgc28gdGhlIGxlbmd0aCBtdXN0IG1hdGNoLiAqLwomIzQzOwltZW1jcHkoc3VuLnN1bl9wYXRoICYjNDM7IDEsIFJQQ0JfQUJTVFJBQ1RfTkFNRSwgbmxlbik7CiYjNDM7CWFsZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSAmIzQzOyAxICYjNDM7IG5sZW47CiYjNDM7CiYjNDM7CWZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYW1wO3N1biwgYWxlbikgJmx0OyAwIHx8CiYjNDM7CSAgICBsaXN0ZW4oZmQsIFJQQ0JfU1RVQl9NQVhDT05OKSAmbHQ7IDApIHsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCiYjNDM7ewomIzQzOwlzaXplX3QgZG9uZSA9IDA7CiYjNDM7CiYjNDM7CXdoaWxlIChkb25lICZsdDsgbGVuKSB7CiYjNDM7CQlzc2l6ZV90IG4gPSByZWFkKGZkLCAoY2hhciAqKWJ1ZiAmIzQzOyBkb25lLCBsZW4gLSBkb25lKTsKJiM0MzsKJiM0MzsJCWlmIChuICZsdDs9IDApCiYjNDM7CQkJcmV0dXJuIC0xOwomIzQzOwkJZG9uZSAmIzQzOz0gbjsKJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogSGFuZGxlIG9uZSByZWNvcmQtbWFya2VkIFJQQyBjYWxsLiBSZXR1cm5zIC0xIHdoZW4gdGhlIHBlZXIgaXMgZG9uZS4gKi8KJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9jYWxsKGludCBmZCwgaW50IG1vZGUpCiYjNDM7ewomIzQzOwl1aW50MzJfdCBtYXJrLCBjYWxsWzZdLCByZXBbN107CiYjNDM7CXVuc2lnbmVkIGludCBsZW4sIG5yZXAgPSA2OwomIzQzOwlzaXplX3QgcmVwbGVuOwomIzQzOwomIzQzOwlpZiAocnBjYl9zdHViX3JlYWQoZmQsICZhbXA7bWFyaywgc2l6ZW9mKG1hcmspKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbGVuID0gbnRvaGwobWFyaykgJmFtcDsgMHg3ZmZmZmZmZjsKJiM0MzsJaWYgKGxlbiAmbHQ7IHNpemVvZihjYWxsKSB8fCBsZW4gJmd0OyA0MDk2KQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CS8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqLwomIzQzOwlmb3IgKGxlbiAtPSBzaXplb2YoY2FsbCk7IGxlbjsgKSB7CiYjNDM7CQljaGFyIHNpbmtbMjU2XTsKJiM0MzsJCXVuc2lnbmVkIGludCBuID0gbGVuICZndDsgc2l6ZW9mKHNpbmspID8gc2l6ZW9mKHNpbmspIDogbGVuOwomIzQzOwomIzQzOwkJaWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBzaW5rLCBuKSkKJiM0MzsJCQlyZXR1cm4gLTE7CiYjNDM7CQlsZW4gLT0gbjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXBbMF0gPSBjYWxsWzBdOwkJLyogeGlkICovCiYjNDM7CXJlcFsxXSA9IGh0b25sKDEpOwkJLyogUkVQTFkgKi8KJiM0MzsJcmVwWzJdID0gaHRvbmwoMCk7CQkvKiBNU0dfQUNDRVBURUQgKi8KJiM0MzsJcmVwWzNdID0gaHRvbmwoMCk7CQkvKiB2ZXJpZmllciBmbGF2b3IgQVVUSF9OVUxMICovCiYjNDM7CXJlcFs0XSA9IGh0b25sKDApOwkJLyogdmVyaWZpZXIgbGVuZ3RoICovCiYjNDM7CXJlcFs1XSA9IGh0b25sKDApOwkJLyogU1VDQ0VTUyAqLwomIzQzOwomIzQzOwlpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7CiYjNDM7CQlyZXBbNV0gPSBodG9ubCgxKTsJLyogUFJPR19VTkFWQUlMICovCiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7CiYjNDM7CQljYXNlIFJQQ0JfUFJPQ19OVUxMOgomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSUENCX1BST0NfU0VUOgomIzQzOwkJCXJlcFs2XSA9IGh0b25sKG1vZGUgPT0gUlBDQl9TVFVCX1JFRlVTRSA/IDAgOiAxKTsKJiM0MzsJCQlucmVwID0gNzsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgUlBDQl9QUk9DX1VOU0VUOgomIzQzOwkJCXJlcFs2XSA9IGh0b25sKDEpOwkvKiBUUlVFICovCiYjNDM7CQkJbnJlcCA9IDc7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXJlcFs1XSA9IGh0b25sKDMpOwkvKiBQUk9DX1VOQVZBSUwgKi8KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXBsZW4gPSBucmVwICogc2l6ZW9mKHJlcFswXSk7CiYjNDM7CW1hcmsgPSBodG9ubCgweDgwMDAwMDAwIHwgcmVwbGVuKTsKJiM0MzsJaWYgKHdyaXRlKGZkLCAmYW1wO21hcmssIHNpemVvZihtYXJrKSkgIT0gKHNzaXplX3Qpc2l6ZW9mKG1hcmspIHx8CiYjNDM7CSAgICB3cml0ZShmZCwgcmVwLCByZXBsZW4pICE9IChzc2l6ZV90KXJlcGxlbikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkWzEgJiM0MzsgUlBDQl9TVFVCX01BWENPTk5dOwomIzQzOwluZmRzX3QgbiA9IDEsIGk7CiYjNDM7CiYjNDM7CXBmZFswXS5mZCA9IGxmZDsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJLyogc3RvcCBwb2xsaW5nIHRoZSBsaXN0ZW5lciB3aGVuIGZ1bGwsIG9yIHBvbGwoKSBzcGlucyAqLwomIzQzOwkJcGZkWzBdLmV2ZW50cyA9IG4gJmx0OyAxICYjNDM7IFJQQ0JfU1RVQl9NQVhDT05OID8gUE9MTElOIDogMDsKJiM0MzsKJiM0MzsJCWlmIChwb2xsKHBmZCwgbiwgLTEpICZsdDsgMCkKJiM0MzsJCQlyZXR1cm47CiYjNDM7CiYjNDM7CQlpZiAocGZkWzBdLnJldmVudHMgJmFtcDsgUE9MTElOKSB7CiYjNDM7CQkJaW50IGMgPSBhY2NlcHQobGZkLCBOVUxMLCBOVUxMKTsKJiM0MzsKJiM0MzsJCQlpZiAoYyAmZ3Q7PSAwKSB7CiYjNDM7CQkJCXBmZFtuXS5mZCA9IGM7CiYjNDM7CQkJCXBmZFtuXS5ldmVudHMgPSBQT0xMSU47CiYjNDM7CQkJCW4mIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZvciAoaSA9IDE7IGkgJmx0OyBuOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICghKHBmZFtpXS5yZXZlbnRzICZhbXA7IChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikpKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlpZiAocnBjYl9zdHViX2NhbGwocGZkW2ldLmZkLCBtb2RlKSkgewomIzQzOwkJCQljbG9zZShwZmRbaV0uZmQpOwomIzQzOwkJCQlwZmRbaV0gPSBwZmRbLS1uXTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmV0dXJucyB0aGUgc3R1YiYjMzk7cyBwaWQsIG9yIC0xLiBUaGUgc29ja2V0IGlzIGxpc3RlbmluZyBiZWZvcmUgd2UgZm9yay4gKi8KJiM0MztzdGF0aWMgcGlkX3QgcnBjYl9zdHViX3N0YXJ0KGludCBtb2RlKQomIzQzO3sKJiM0MzsJaW50IGxmZCA9IHJwY2Jfc3R1Yl9saXN0ZW4oKTsKJiM0MzsJcGlkX3QgcGlkOwomIzQzOwomIzQzOwlpZiAobGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlpZiAocGlkICZsdDsgMCkgewomIzQzOwkJY2xvc2UobGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZiAocGlkID09IDApIHsKJiM0MzsJCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKJiM0MzsJCXByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpOwomIzQzOwkJaWYgKGdldHBwaWQoKSA9PSAxKQkJLyogcmFjZWQgd2l0aCBwYXJlbnQgZXhpdCAqLwomIzQzOwkJCV9leGl0KDApOwomIzQzOwkJcnBjYl9zdHViX3NlcnZlKGxmZCwgbW9kZSk7CiYjNDM7CQlfZXhpdCgwKTsKJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZShsZmQpOwomIzQzOwlyZXR1cm4gcGlkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN3YXAgdGhlIHN0dWIgZm9yIG9uZSBpbiBAbW9kZS4gU2FmZSBiZWZvcmUgdGhlIGZpcnN0IHJlcXVlc3Q6IG5vIHNlcnYKJiM0MzsgKiBleGlzdHMgeWV0LCBzbyB0aGUga2VybmVsIGhhcyBub3QgY29ubmVjdGVkIGFuZCB0aGUgYWJzdHJhY3QgbmFtZSBpcyBmcmVlCiYjNDM7ICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3Jlc3RhcnQocGlkX3QgKnBpZCwgaW50IG1vZGUpCiYjNDM7ewomIzQzOwlpZiAoKnBpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoKnBpZCwgU0lHS0lMTCk7CiYjNDM7CQl3YWl0cGlkKCpwaWQsIE5VTEwsIDApOwomIzQzOwl9CiYjNDM7CSpwaWQgPSBycGNiX3N0dWJfc3RhcnQobW9kZSk7CiYjNDM7CXJldHVybiAqcGlkICZndDsgMCA/IDAgOiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7RklYVFVSRShuZnNkX2xpc3RlbmVyKSB7CiYjNDM7CXBpZF90IHJwY2JkOwomIzQzO307CiYjNDM7CiYjNDM7RklYVFVSRV9TRVRVUChuZnNkX2xpc3RlbmVyKQomIzQzO3sKJiM0MzsJc3RydWN0IGlmcmVxIGlmciA9IHswfTsKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBzOwomIzQzOwomIzQzOwlpZiAoZ2V0ZXVpZCgpICE9IDApCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDttdXN0IGJlIHJ1biBhcyByb290JiMzNDspOwomIzQzOwlpZiAodW5zaGFyZShDTE9ORV9ORVdORVQgfCBDTE9ORV9ORVdOUykgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7dW5zaGFyZShORVdORVR8TkVXTlMpOiAlcyYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwlpZiAobW91bnQoJiMzNDsmIzM0OywgJiMzNDsvJiMzNDssIE5VTEwsIE1TX1JFQyB8IE1TX1BSSVZBVEUsIE5VTEwpICZsdDsgMCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O21vdW50KC8gcHJpdmF0ZSk6ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEtlZXAgdGhlIGtlcm5lbCYjMzk7cyBycGNiaW5kIGNsaWVudCBpbnNpZGUgdGhpcyBuYW1lc3BhY2UuIFRoZQomIzQzOwkgKiBhYnN0cmFjdCBzb2NrZXQgaXQgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zLCBidXQgdGhlCiYjNDM7CSAqICYjMzQ7L3Zhci9ydW4vcnBjYmluZC5zb2NrJiMzNDsgZmFsbGJhY2sgaXMgbm90LCBzbyBoaWRlIHRoZSBwYXRoLgomIzQzOwkgKi8KJiM0MzsJaWYgKG1vdW50KCYjMzQ7dG1wZnMmIzM0OywgJiMzNDsvcnVuJiMzNDssICYjMzQ7dG1wZnMmIzM0OywgMCwgTlVMTCkgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bW91bnQodG1wZnMgb24gL3J1bik6ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CWlmIChsc3RhdCgmIzM0Oy92YXIvcnVuJiMzNDssICZhbXA7c3QpID09IDAgJmFtcDsmYW1wOyBTX0lTRElSKHN0LnN0X21vZGUpICZhbXA7JmFtcDsKJiM0MzsJICAgIG1vdW50KCYjMzQ7dG1wZnMmIzM0OywgJiMzNDsvdmFyL3J1biYjMzQ7LCAmIzM0O3RtcGZzJiMzNDssIDAsIE5VTEwpICZsdDsgMCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O21vdW50KHRtcGZzIG9uIC92YXIvcnVuKTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsKJiM0MzsJLyogQnJpbmcgbG9vcGJhY2sgdXAgc28gbGlzdGVuZXIgYmluZHMgKDEyNy4wLjAuMSAvIDo6MSkgd29yay4gKi8KJiM0MzsJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKJiM0MzsJQVNTRVJUX0dFKHMsIDApOwomIzQzOwlzdHJjcHkoaWZyLmlmcl9uYW1lLCAmIzM0O2xvJiMzNDspOwomIzQzOwlBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ0dJRkZMQUdTLCAmYW1wO2lmcikpOwomIzQzOwlpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUCB8IElGRl9SVU5OSU5HOwomIzQzOwlBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ1NJRkZMQUdTLCAmYW1wO2lmcikpOwomIzQzOwljbG9zZShzKTsKJiM0MzsKJiM0MzsJbmZzZF9mYW1pbHkgPSBnZW5sX3Jlc29sdmVfbmZzZCgpOwomIzQzOwlpZiAobmZzZF9mYW1pbHkgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bmZzZCBnZW5sIGZhbWlseSBub3QgZm91bmQgKG1vZHByb2JlIG5mc2Q/KSYjMzQ7KTsKJiM0MzsKJiM0MzsJc2VsZi0mZ3Q7cnBjYmQgPSBycGNiX3N0dWJfc3RhcnQoUlBDQl9TVFVCX0FDQ0VQVCk7CiYjNDM7CWlmIChzZWxmLSZndDtycGNiZCAmbHQ7IDApCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtjYW5ub3Qgc3RhcnQgdGhlIHJwY2JpbmQgc3R1YjogJXMmIzM0OywKJiM0MzsJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihuZnNkX2xpc3RlbmVyKQomIzQzO3sKJiM0MzsJaWYgKHNlbGYtJmd0O3JwY2JkICZndDsgMCkgewomIzQzOwkJa2lsbChzZWxmLSZndDtycGNiZCwgU0lHS0lMTCk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3JwY2JkLCBOVUxMLCAwKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gdmFsaWRhdGlvbiAvIG5lZ2F0aXZlID09PT09PT09PT09PT09PT09PT09PSAqLwomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfZW1wdHlfbGlzdF9vaykKJiM0Mzt7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3Rvb19tYW55KQomIzQzO3sKJiM0MzsJc3RhdGljIGNoYXIgYXR0cnNbMSAmbHQ7Jmx0OyAyMF07CiYjNDM7CWludCBpLCBvZmYgPSAwOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgMTAyNTsgaSYjNDM7JiM0MzspCQkvKiAmZ3Q7IE5GU0RfTkxfTElTVEVORVJfTUFYICgxMDI0KSAqLwomIzQzOwkJb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUVYUEVDVF9FUSgtRTJCSUcsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ19hZGRyKQomIzQzO3sKJiM0MzsJY2hhciBhdHRyc1s2NF07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMCB9OwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ190cmFuc3BvcnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gczQgPSB7IC5zaW5fZmFtaWx5ID0gQUZfSU5FVCwgLnNpbl9wb3J0ID0gaHRvbnMoVEVTVF9QT1JUKSB9OwomIzQzOwlzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gTlVMTCwgLmVtaXRfYWRkciA9IDEsCiYjNDM7CQkJCSAgLmFkZHIgPSAmYW1wO3M0LCAuYWRkcl9sZW4gPSBzaXplb2YoczQpIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBuYW1lIG1hdGNoaW5nIG5vIHRyYW5zcG9ydCBjbGFzcyBtdXN0IGJlIHJlZnVzZWQgYmVmb3JlIG5mc2RfbXV0ZXggaXMKJiM0MzsgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHMKJiM0MzsgKiByZXF1ZXN0X21vZHVsZSgmIzM0O3N2YyVzJiMzNDssIG5hbWUpIHVwY2FsbC4KJiM0MzsgKi8KJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2JhZF90cmFuc3BvcnQpCiYjNDM7ewomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDtib2d1c194cHJ0JiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRVBST1RPTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2FkZHJfdG9vX3Nob3J0KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgY2hhciB0aW55ID0gMDsKJiM0MzsJc3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9ICYjMzQ7dGNwJiMzNDssIC5lbWl0X2FkZHIgPSAxLAomIzQzOwkJCQkgIC5hZGRyID0gJmFtcDt0aW55LCAuYWRkcl9sZW4gPSAxIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldF9zaG9ydCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3M0LAomIzQzOwkJCQkgIC5hZGRyX2xlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgJiM0MzsgMiB9OwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsICZhbXA7cik7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXQ2X3Nob3J0KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3M2LAomIzQzOwkJCQkgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX2ZhbWlseSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9OwomIzQzOwlzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gJiMzNDt0Y3AmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gJmFtcDtzcywKJiM0MzsJCQkJICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9OwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsICZhbXA7cik7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHsgLnNzX2ZhbWlseSA9IEFGX1VOSVggfTsKJiM0MzsJc3RydWN0IHJhd19saXN0ZW5lciBiYWQgPSB7IC54cHJ0ID0gJiMzNDt0Y3AmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gJmFtcDtzcywKJiM0MzsJCQkJICAgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07CiYjNDM7CWNoYXIgYXR0cnNbMTI4XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgb2ZmLCAmYW1wO2JhZCk7CiYjNDM7CS8qIFRoZSB3aG9sZSByZXF1ZXN0IGlzIHJlamVjdGVkIGR1cmluZyB2YWxpZGF0aW9uOyBub3RoaW5nIGFwcGxpZWQuICovCiYjNDM7CUVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEEgcmVqZWN0ZWQgcmVxdWVzdCBtdXN0IGxlYXZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBhcmUgYWxyZWFkeSB1cCBhbG9uZS4KJiM0MzsgKiBUaGUgZXJybm8gYWxvbmUgZG9lcyBub3Qgc2hvdyB0aGF0OiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIHJldHVybnMKJiM0MzsgKiAtRVBST1RPTk9TVVBQT1JUIGZvciBhbiB1bmtub3duIG5hbWUgdG9vLiBXaGF0IGRpZmZlcnMgaXMgaG93IGZhciB0aGUKJiM0MzsgKiByZXF1ZXN0IGdldHMgLS0gd2l0aG91dCB0aGUgY2hlY2sgaW4gbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwKJiM0MzsgKiBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KCkgaGFzIGFscmVhZHkgbW92ZWQgdGhlIHVubWF0Y2hlZCB0Y3AgbGlzdGVuZXIKJiM0MzsgKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGUKJiM0MzsgKiBuYW1lIGZhaWxzLgomIzQzOyAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfcmVqZWN0X2tlZXBzX2xpc3RlbmVycykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGdvb2RbNjRdLCBiYWRbNjRdOwomIzQzOwlpbnQgb2cgPSBwdXRfbGlzdGVuZXIoZ29vZCwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG9iID0gcHV0X2xpc3RlbmVyKGJhZCwgMCwgJiMzNDtib2d1c194cHJ0JiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoZ29vZCwgb2cpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChiYWQsIG9iKSk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7CUVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSBmdW5jdGlvbmFsIC8gcm91bmQtdHJpcCA9PT09PT09PT09PT09PT09PT09PT0gKi8KJiM0MzsKJiM0MzsvKiBMSVNURU5FUl9HRVQgd2l0aCBubyBzZXJ2IGluIHRoaXMgbmV0bnMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2dldF9lbXB0eSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwomIzQzOwlFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdGNwKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsJRVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCAmIzM0O3RjcCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTsKJiM0MzsJRVhQRUNUX0VRKGh0b25sKElOQUREUl9MT09QQkFDSyksIGdvdFswXS5hNC5zX2FkZHIpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdWRwKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3VkcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsJRVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCAmIzM0O3VkcCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX211bHRpKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbMTI4XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzOwlBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dWRwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19pZGVtcG90ZW50KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJRVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CQkvKiByZS1zZXQgc2FtZSBsaXN0ICovCiYjNDM7CUFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7CUVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2FkZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIG9uZVs2NF0sIHR3b1sxMjhdOwomIzQzOwlpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwlpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCAmIzM0O3VkcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7CQkvKiBhZGQgdWRwLCBrZWVwIHRjcCAqLwomIzQzOwlBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dWRwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19yZW1vdmVfc3Vic2V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYm90aFsxMjhdLCBvbmVbNjRdOwomIzQzOwlpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG9vID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgb2IsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYm90aCwgb2IpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG9vKSk7CQkvKiBkcm9wIHVkcCAqLwomIzQzOwlBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19lbXB0eV9kZXN0cm95cykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpOwkJLyogZW1wdHkgLSZndDsgZGVzdHJveSBzZXJ2ICovCiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTsKJiM0MzsJY2hhciBhdHRyc1s2NF07CiYjNDM7CWludCBvZmYsIHM7CiYjNDM7CiYjNDM7CXMgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJaWYgKHMgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7SVB2NiB1bmF2YWlsYWJsZTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJY2xvc2Uocyk7CiYjNDM7CiYjNDM7CW9mZiA9IHB1dF9saXN0ZW5lcl9hZihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVDYsIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzOwlBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQ2LCBURVNUX1BPUlQpKTsKJiM0MzsJRVhQRUNUX0VRKDAsIG1lbWNtcCgmYW1wO2dvdFswXS5hNiwgJmFtcDtpbjZhZGRyX2xvb3BiYWNrLCBzaXplb2YoaW42YWRkcl9sb29wYmFjaykpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogPT09PT09PT09PT09PT09PT09PT09IHJwY2JpbmQgcmVnaXN0cmF0aW9uID09PT09PT09PT09PT09PT09PT09PSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBycGNiaW5kIHRoYXQgcmVmdXNlcyB0aGUgcmVnaXN0cmF0aW9uIG11c3QgZmFpbCBsaXN0ZW5lciBjcmVhdGlvbiwKJiM0MzsgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLgomIzQzOyAqCiYjNDM7ICogVGhlIGVycm9yIGhhcyB0byBzdXJ2aXZlIHN2Y19yZWdpc3RlcigpJiMzOTtzIHdhbGsgb3ZlciBzdl9wcm9ncmFtcyB0byBnZXQKJiM0MzsgKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHkKJiM0MzsgKiBhIE5VTEwgYW5kIGEgdnNfaGlkZGVuIHZlcnNpb24sIGFuZCBzdmNfZ2VuZXJpY19ycGNiaW5kX3NldCgpIHJlcG9ydHMgMAomIzQzOyAqIGZvciBib3RoLCBzbyBhbiBzdmNfcmVnaXN0ZXIoKSB0aGF0IGtlZXBzIHRoZSBsYXN0IHJlc3VsdCByYXRoZXIgdGhhbiB0aGUKJiM0MzsgKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLgomIzQzOyAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBzZW1fcmVnaXN0ZXJfcmVmdXNlZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHJwY2Jfc3R1Yl9yZXN0YXJ0KCZhbXA7c2VsZi0mZ3Q7cnBjYmQsIFJQQ0JfU1RVQl9SRUZVU0UpKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FQUNDRVMsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSB0aHJlYWRzIC8gLUVCVVNZIHNlbWFudGljcyA9PT09PT09PT09PT09PT09PT09PT0gKi8KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fY2hhbmdlKQomIzQzO3sKJiM0MzsJY2hhciBvbmVbNjRdLCB0d29bMTI4XTsKJiM0MzsJaW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG8yID0gcHV0X2xpc3RlbmVyKHR3bywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJbzIgPSBwdXRfbGlzdGVuZXIodHdvLCBvMiwgJiMzNDt1ZHAmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7CQkJLyogdGhyZWFkcyBub3cgcnVubmluZyAqLwomIzQzOwlFWFBFQ1RfRVEoLUVCVVNZLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpOwkvKiBhZGQgcmVmdXNlZCAqLwomIzQzOwl0aHJlYWRzX3NldCgwKTsJCQkJCS8qIHN0b3AgYmVmb3JlIG5ldG5zIGV4aXQgKi8KJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX3JlbW92ZSkKJiM0Mzt7CiYjNDM7CWNoYXIgb25lWzY0XTsKJiM0MzsJaW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7CiYjNDM7CUVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7CS8qIHJlbW92ZSByZWZ1c2VkICovCiYjNDM7CXRocmVhZHNfc2V0KDApOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0hBUk5FU1NfTUFJTgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjA5MWI0NWQyMjZiYQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3MKQEAgLTAsMCAmIzQzOzEgQEAKJiM0Mzt0aW1lb3V0PTEyMAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYwMjUKCQkJCQkJCW91dHB1dDogMjMKCQkJCQkJCXRob3VnaHRzOiA1NzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFRoaXMgTkZTZCBOZXRsaW5rIExpc3RlbmVyIFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0aGUgY29yZSBjaGFuZ2VzIGFuZCBwb3RlbnRpYWwgaW1wbGljYXRpb25zLCBlc3BlY2lhbGx5IHJlZ2FyZGluZyBzZWN1cml0eSBhbmQgc3RhYmlsaXR5LCBnaXZlbiBteSBleHBlcnRpc2UgaW4gdGhpcyBhcmVhLgoKRmlyc3QsIEkgc2VlIG1vZGlmaWNhdGlvbnMgdG8gYGZzL25mc2QvbmZzY3RsLmNgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AsIGFuZCBgbmV0L3N1bnJwYy9zdmMuY2AsIGFsb25nc2lkZSBhIG5ldyBzZWxmLXRlc3QgZm9yIHRoZSBORlNkIG5ldGxpbmsgbGlzdGVuZXIuIEdvb2QgdG8gc2VlIHRoZSBhZGRpdGlvbiBvZiBhIHNlbGZ0ZXN0OyB0aGF0JiMzOTtzIGNyaXRpY2FsIGZvciByZWdyZXNzaW9uIHByZXZlbnRpb24uCgpJbiBgZnMvbmZzZC9uZnNjdGwuY2AsIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAgYW5kIHRoZSBtb2RpZmljYXRpb24gb2YgYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYCBpbW1lZGlhdGVseSBjYXRjaCBteSBleWUuIFNwZWNpZmljYWxseSwgSSBub3RlIHRoZSBsaW1pdGluZyBvZiBsaXN0ZW5lcnMgdG8gYE5GU0RfTkxfTElTVEVORVJfTUFYYCAoMTAyNCksIGEgc2Vuc2libGUgcHJlY2F1dGlvbiBhZ2FpbnN0IERvUy4gVGhlIGluY2x1c2lvbiBvZiB0aGUgY2hlY2sgdXNpbmcgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAgd2l0aGluIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MgaXMgYWxzbyB3ZWxjb21lLiBUaGUgY2hhbmdlIHRvIHNldCB0aGUgZXJyb3IgbWVzc2FnZSB2aWEgYE5MX1NFVF9FUlJfTVNHX0ZNVGAgaW4gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgIG9uIGBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYWAgZmFpbHVyZSBpcyBhIGdvb2QgZGVidWdnaW5nIGltcHJvdmVtZW50LgoKTW92aW5nIHRvIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgdGhlIGFkZGl0aW9uIGFuZCB1c2Ugb2YgYHJwY2JfbG9jYWxfdGltZW91dGAgaW4gYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAgc3VnZ2VzdHMgYSBwb3RlbnRpYWwgcGVyZm9ybWFuY2Ugb3Igcm9idXN0bmVzcyBpbXByb3ZlbWVudCByZWxhdGVkIHRvIGxvY2FsIFJQQyBjb25uZWN0aW9ucy4gSSYjMzk7bGwgbmVlZCB0byBleGFtaW5lIHRoZSB0aW1lb3V0IHZhbHVlcyBhbmQgdGhlaXIgaW1wYWN0IG9uIG92ZXJhbGwgUlBDIGxhdGVuY3kuCgpJbiBgbmV0L3N1bnJwYy9zdmMuY2AsIHRoZSBjaGFuZ2UgdG8gYHN2Y19yZWdpc3RlcmAgdG8gcmV0YWluIHRoZSBmaXJzdCBlcnJvciBmcm9tIGBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXRgIGlzIGEgc2lnbmlmaWNhbnQgb25lLiBUaGUgcHJldmlvdXMgYmVoYXZpb3Igb2Ygb3ZlcndyaXRpbmcgYW4gaW5pdGlhbCBlcnJvciB3aXRoIHplcm8gaXMsIGZyYW5rbHksIGluY29ycmVjdCBhbmQgY291bGQgbGVhZCB0byBzaWxlbnQgZmFpbHVyZXMuIFRoaXMgaXMgYSBjbGVhciBpbXByb3ZlbWVudCBpbiBlcnJvciByZXBvcnRpbmcsIGFuZCBJJiMzOTttIGdsYWQgdG8gc2VlIHRoaXMgY29ycmVjdGlvbi4KCk5vdywgbXkgbW9yZSBpbW1lZGlhdGUgY29uY2VybiBpcyB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIHZ1bG5lcmFiaWxpdGllcy4gSSBzZWUgYSBwb3RlbnRpYWwgYXJlYSB0byBhc3Nlc3MgaW4gYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYC4gU3BlY2lmaWNhbGx5IHRoZSBmb2xsb3dpbmcgbGluZXM6CgpgYGBjCgkJaWYgKCF0YltORlNEX0FfU09DS19BRERSXSB8fCAhdGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKQoJCQlyZXR1cm4gLUVJTlZBTDsKCgkJaWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpCgkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwpgYGAKSGVyZSwgYG5sYV9kYXRhYCByZXRyaWV2ZXMgdGhlIHBheWxvYWQgb2YgYSBuZXRsaW5rIGF0dHJpYnV0ZS4gVGhpcyBpcyBiZWluZyBwYXNzZWQgdG8gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAsIHdoaWNoLCBmcm9tIGEgYnJpZWYgZ2xhbmNlLCBzZWVtcyB0byB1c2UgYHN0cmNtcGAuIE15IHF1ZXN0aW9uIGlzLCBpcyB0aGUgcGF5bG9hZCBvZiB0aGlzIG5ldGxpbmsgYXR0cmlidXRlIGd1YXJhbnRlZWQgdG8gYmUgbnVsbC10ZXJtaW5hdGVkPyBJZiBub3QsIHdlIGhhdmUgYSBjbGVhciBwb3RlbnRpYWwgZm9yIGEgYnVmZmVyIG92ZXJmbG93IHdpdGggYHN0cmNtcGAuIEkgKm11c3QqIHZlcmlmeSB0aGUgZGVmaW5pdGlvbiBvZiBgbmZzZF9zb2NrX25sX3BvbGljeWAgaW4gYGZzL25mc2QvbmZzY3RsLmNgIHRvIHNlZSBpZiB0aGUgbmV0bGluayBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBhZGRyZXNzZXMgbnVsbCB0ZXJtaW5hdGlvbi4gVGhpcyBpcyBhIGNyaXRpY2FsIHBvaW50IHRoYXQgbmVlZHMgYSB0aG9yb3VnaCBpbnZlc3RpZ2F0aW9uIHRvIGVuc3VyZSB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhIHNlY3VyaXR5IGhvbGUuIFRoaXMgaXMgdGhlIGZpcnN0IHRoaW5nIEkmIzM5O2xsIGNoZWNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtuZnNkX3NvY2tfbmxfcG9saWN5JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL25mc2QvbmV0bGluay5jPTM1PWNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiAmIzQzOyAxXSA9IHtcbi0tXG5mcy9uZnNkL25ldGxpbmsuYy0zOC1cbmZzL25mc2QvbmV0bGluay5jOjM5OmNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc29ja19ubF9wb2xpY3lbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUgJiM0MzsgMV0gPSB7XG5mcy9uZnNkL25ldGxpbmsuYy00MC1cdFtORlNEX0FfU09DS19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCB9LFxuLS1cbmZzL25mc2QvbmV0bGluay5jPTgyPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnNkX2xpc3RlbmVyX3NldF9ubF9wb2xpY3lbTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgJiM0MzsgMV0gPSB7XG5mcy9uZnNkL25ldGxpbmsuYzo4MzpcdFtORlNEX0FfU0VSVkVSX1NPQ0tfQUREUl0gPSBOTEFfUE9MSUNZX05FU1RFRChuZnNkX3NvY2tfbmxfcG9saWN5KSxcbmZzL25mc2QvbmV0bGluay5jLTg0LX07XG4tLVxuZnMvbmZzZC9uZXRsaW5rLmg9MTk9ZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiAmIzQzOyAxXTtcbmZzL25mc2QvbmV0bGluay5oOjIwOmV4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnNkX3NvY2tfbmxfcG9saWN5W05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FICYjNDM7IDFdO1xuZnMvbmZzZC9uZXRsaW5rLmgtMjEtZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc3ZjX2V4cG9ydF9ubF9wb2xpY3lbTkZTRF9BX1NWQ19FWFBPUlRfRlNJRCAmIzQzOyAxXTtcbi0tXG5mcy9uZnNkL25mc2N0bC5jPTIwMDU9c3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuLS1cbmZzL25mc2QvbmZzY3RsLmMtMjAyMi1cdFx0ZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgTkZTRF9BX1NPQ0tfTUFYLCBhdHRyLFxuZnMvbmZzZC9uZnNjdGwuYzoyMDIzOlx0XHRcdFx0ICAgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXHUwMDNlZXh0YWNrKTtcbmZzL25mc2QvbmZzY3RsLmMtMjAyNC1cdFx0aWYgKGVyciBcdTAwM2MgMClcbi0tXG5mcy9uZnNkL25mc2N0bC5jPTIwNjM9aW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbi0tXG5mcy9uZnNkL25mc2N0bC5jLTIxMTAtXHRcdGlmIChubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXG5mcy9uZnNkL25mc2N0bC5jOjIxMTE6XHRcdFx0XHQgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXHUwMDNlZXh0YWNrKSBcdTAwM2MgMClcbmZzL25mc2QvbmZzY3RsLmMtMjExMi1cdFx0XHRjb250aW51ZTtcbi0tXG5mcy9uZnNkL25mc2N0bC5jLTIxNjYtXHRcdGlmIChubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXG5mcy9uZnNkL25mc2N0bC5jOjIxNjc6XHRcdFx0XHQgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXHUwMDNlZXh0YWNrKSBcdTAwM2MgMClcbmZzL25mc2QvbmZzY3RsLmMtMjE2OC1cdFx0XHRjb250aW51ZTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgxODcKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIHRoZSBORlMgTmV0bGluayBQb2xpY3kqKgoKT2theSwgdGltZSB0byBnZXQgdG8gdGhlIGhlYXJ0IG9mIHRoaXMuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIHRoZSBgbmZzZF9zb2NrX25sX3BvbGljeWAgc3RydWN0dXJlLiBJIGltbWVkaWF0ZWx5IGtub3cgdGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGRlZmluZXMgdGhlIE5ldGxpbmsgbWVzc2FnZSBwb2xpY3kgZm9yIHRoZSBORlMgc2VydmVyJiMzOTtzIHNvY2tldCBpbnRlcmFjdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBnbyBkaXJlY3RseSB0byBgZnMvbmZzZC9uZXRsaW5rLmNgIOKAkyB0aGF0JiMzOTtzIHRoZSBvYnZpb3VzIHBsYWNlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhhdCBwb2xpY3kgZGVmaW5pdGlvbiByZXZlYWxzIGFib3V0IHRoZSBleHBlY3RlZCBtZXNzYWdlIGZvcm1hdCwgZGF0YSB0eXBlcywgYW5kIGFueSBzZWN1cml0eSByZXN0cmljdGlvbnMgaW4gcGxhY2UuIFVuZGVyc3RhbmRpbmcgdGhpcyBwb2xpY3kgaXMgY3J1Y2lhbCBmb3IgZGlhZ25vc2luZyBvciBkZXZlbG9waW5nIGFueSBOZXRsaW5rLWJhc2VkIHRvb2xzIHRoYXQgaW50ZXJhY3Qgd2l0aCB0aGUgTkZTIHNlcnZlci4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBwb2xpY3kgdG8gb3V0bGluZSB0aGUgYXR0cmlidXRlcyBhY2NlcHRlZCBieSBgbmZzZGAgYW5kIHRoZWlyIGFzc29jaWF0ZWQgdmFsaWRhdGlvbnMuIFRoZSBkZXRhaWxzIG9mIHRoZSBwb2xpY3kgYXJlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBleHBlY3RlZCBjb250ZW50IG9mIHRoZSBpbmNvbWluZyBhbmQgb3V0Z29pbmcgTmV0bGluayBtZXNzYWdlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9uZnNkL25ldGxpbmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDE1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgMzU6XHRjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnNkX2ZzbG9jYXRpb25zX25sX3BvbGljeVtORlNEX0FfRlNMT0NBVElPTlNfTE9DQVRJT04gJiM0MzsgMV0gPSB7XG4gIDM2Olx0XHRbTkZTRF9BX0ZTTE9DQVRJT05TX0xPQ0FUSU9OXSA9IE5MQV9QT0xJQ1lfTkVTVEVEKG5mc2RfZnNsb2NhdGlvbl9ubF9wb2xpY3kpLFxuICAzNzpcdH07XG4gIDM4Olx0XG4gIDM5Olx0Y29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZzZF9zb2NrX25sX3BvbGljeVtORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSAmIzQzOyAxXSA9IHtcbiAgNDA6XHRcdFtORlNEX0FfU09DS19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCB9LFxuICA0MTpcdFx0W05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSA9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgfSxcbiAgNDI6XHR9O1xuICA0MzpcdFxuICA0NDpcdGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc3ZjX2V4cG9ydF9ubF9wb2xpY3lbTkZTRF9BX1NWQ19FWFBPUlRfRlNJRCAmIzQzOyAxXSA9IHtcbiAgNDU6XHRcdFtORlNEX0FfU1ZDX0VYUE9SVF9TRVFOT10gPSB7IC50eXBlID0gTkxBX1U2NCwgfSxcbiAgNDY6XHRcdFtORlNEX0FfU1ZDX0VYUE9SVF9DTElFTlRdID0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCB9LFxuICA0NzpcdFx0W05GU0RfQV9TVkNfRVhQT1JUX1BBVEhdID0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCB9LFxuICA0ODpcdFx0W05GU0RfQV9TVkNfRVhQT1JUX05FR0FUSVZFXSA9IHsgLnR5cGUgPSBOTEFfRkxBRywgfSxcbiAgNDk6XHRcdFtORlNEX0FfU1ZDX0VYUE9SVF9FWFBJUlldID0geyAudHlwZSA9IE5MQV9VNjQsIH0sXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4ODczCgkJCQkJCQlvdXRwdXQ6IDI1NgoJCQkJCQkJdGhvdWdodHM6IDUxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipSZWFzb25pbmcgVGhyb3VnaCB0aGUgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHJlZ2FyZGluZyB0aGUgYFtORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV1gIGRlZmluaXRpb24sIGtub3dpbmcgdGhhdCBgLnR5cGUgPSBOTEFfTlVMX1NUUklOR2AgZ3VhcmFudGVlcyB0aGF0IGBubGFfZGF0YSh0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pYCB3aWxsIGJlIG51bGwtdGVybWluYXRlZC4gVGhpcyBpcyBjcnVjaWFsIGZvciBhdm9pZGluZyBhbnkgcG90ZW50aWFsIGJ1ZmZlciBvdmVycnVucyBvciB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhlIHBhdGNoIGl0c2VsZiBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyBhbGxvY2F0aW9ucywgc28gd2UmIzM5O3JlIG5vdCBkZWFsaW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLiBUaGUgY2hhbmdlcyBhcmUgYWxsIGNlbnRlcmVkIGFyb3VuZCB2YWxpZGF0aW9uIGFuZCBlcnJvciBoYW5kbGluZywgd2hpY2ggaXMgcHJlY2lzZWx5IHRoZSBraW5kIG9mIHRoaW5nIEtBU0FOIGFuZCBvdGhlciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFyZSBkZXNpZ25lZCB0byBjYXRjaCBpZiBzb21ldGhpbmcgc2xpcHMgdGhyb3VnaC4gU28sIGluIHRlcm1zIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCB0aGlzIHNlY3Rpb24gaXMgYSBub24taXNzdWUuCgpOZXh0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgYHN2Y19yZWdpc3RlcmAgY2hhbmdlcy4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBhIHNpbXBsZSwgYW5kIHJhdGhlciBzdHJhaWdodGZvcndhcmQsIGZpeCBmb3IgYW4gZXJyb3IgY29kZSBwcm9wYWdhdGlvbiBidWcuIFRoZSBwYXRjaCBpcyBzaW1wbHkgZW5zdXJpbmcgdGhlIGNvcnJlY3QgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4gTm8gbmV3IG1lbW9yeSBpcyBiZWluZyBpbnRyb2R1Y2VkIGFuZCBubyBtZW1vcnkgdGhhdCBleGlzdGVkIGJlZm9yZSBpcyBiZWluZyBjaGFuZ2VkIHRvIGJlIHVuaW5pdGlhbGl6ZWQuCgpGaW5hbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNoYW5nZXMgaW4gYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAuIEl0IHNlZW1zIHRoZSB1cGRhdGUgYWRkcyBhIGBycGNiX2xvY2FsX3RpbWVvdXRgLiBJdCBpcyBkZWZpbmluZyBhIGxvY2FsIHRpbWVvdXQgd2l0aCBhbiBpbml0aXZhbCBvZiBgMSAqIEhaYCwgYSBtYXh2YWwgb2YgYDEgKiBIWmAsIGFuZCBgMGAgcmV0cmllcy4gVGhpcyBhcHBlYXJzIHRvIGJlIHNldHRpbmcgdXAgYSB0aW1lb3V0IHN0cnVjdHVyZSwgYnV0IGFnYWluLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoYXQgSSBjYW4gc2VlIGhlcmUuCgpCYXNlZCBvbiB0aGlzIHJldmlldywgSSYjMzk7bSBjb25maWRlbnQgdGhhdCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBXZSBjYW4gc2FmZWx5IG1hcmsgTmVlZHNLTVNBTiBhcyBmYWxzZS4gSSYjMzk7bGwgc3VtbWFyaXplIHRoaXMgcmVhc29uaW5nIGZvciBteSBub3RlcyBhbmQgdGhlIHJldmlld2Vycy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgdmFsaWRhdGlvbiBjaGVja3MgZm9yIE5GU0QgbmV0bGluayBsaXN0ZW5lciBhdHRyaWJ1dGVzIChlLmcuLCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyB0byBgTkZTRF9OTF9MSVNURU5FUl9NQVhgIGFuZCB2YWxpZGF0aW5nIHRoZSB0cmFuc3BvcnQgbmFtZSB2aWEgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGApLiBJdCBhbHNvIGZpeGVzIGVycm9yIGNvZGUgcHJvcGFnYXRpb24gaW4gYHN2Y19yZWdpc3RlcmAgYW5kIHNldHMgYSBsb2NhbCB0aW1lb3V0IGZvciBycGNiaW5kIGNsaWVudHMuIFxuXG5UaGUgbmV0bGluayBhdHRyaWJ1dGUgYE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FYCBpcyBkZWZpbmVkIGFzIGBOTEFfTlVMX1NUUklOR2AgaW4gYG5mc2Rfc29ja19ubF9wb2xpY3lgLCBlbnN1cmluZyB0aGF0IGBubGFfZGF0YSgpYCByZXR1cm5zIGEgcHJvcGVybHkgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIGBzdHJjbXAoKWAgaW4gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAuIFxuXG5ObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBvciBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCB0aGVyZSBhcmUgbm8gY2hhbmdlcyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBBbnkgcG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBsb2dpYyBidWdzKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGRlZmF1bHQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgdmFsaWRhdGlvbiBjaGVja3MgZm9yIE5GU0QgbmV0bGluayBsaXN0ZW5lciBhdHRyaWJ1dGVzIChlLmcuLCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyB0byBgTkZTRF9OTF9MSVNURU5FUl9NQVhgIGFuZCB2YWxpZGF0aW5nIHRoZSB0cmFuc3BvcnQgbmFtZSB2aWEgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGApLiBJdCBhbHNvIGZpeGVzIGVycm9yIGNvZGUgcHJvcGFnYXRpb24gaW4gYHN2Y19yZWdpc3RlcmAgYW5kIHNldHMgYSBsb2NhbCB0aW1lb3V0IGZvciBycGNiaW5kIGNsaWVudHMuIFxuXG5UaGUgbmV0bGluayBhdHRyaWJ1dGUgYE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FYCBpcyBkZWZpbmVkIGFzIGBOTEFfTlVMX1NUUklOR2AgaW4gYG5mc2Rfc29ja19ubF9wb2xpY3lgLCBlbnN1cmluZyB0aGF0IGBubGFfZGF0YSgpYCByZXR1cm5zIGEgcHJvcGVybHkgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIGBzdHJjbXAoKWAgaW4gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAuIFxuXG5ObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBvciBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCB0aGVyZSBhcmUgbm8gY2hhbmdlcyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBBbnkgcG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBsb2dpYyBidWdzKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGRlZmF1bHQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTozOTozOS4yNjIwOTk3OTdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDI5Njg1MDI3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJORlNEXCIsXG4gICAgXCJORlNEX1Y0XCIsXG4gICAgXCJTVU5SUENcIixcbiAgICBcIk5FVF9OU1wiLFxuICAgIFwiSVBWNlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRcIixcbiAgICBcInN2Y19yZWdpc3RlclwiLFxuICAgIFwicnBjYl9jcmVhdGVfbG9jYWxcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHZhbGlkYXRpb24gY2hlY2tzIGZvciBORlNEIG5ldGxpbmsgbGlzdGVuZXIgYXR0cmlidXRlcyAoZS5nLiwgbGltaXRpbmcgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgdG8gYE5GU0RfTkxfTElTVEVORVJfTUFYYCBhbmQgdmFsaWRhdGluZyB0aGUgdHJhbnNwb3J0IG5hbWUgdmlhIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgKS4gSXQgYWxzbyBmaXhlcyBlcnJvciBjb2RlIHByb3BhZ2F0aW9uIGluIGBzdmNfcmVnaXN0ZXJgIGFuZCBzZXRzIGEgbG9jYWwgdGltZW91dCBmb3IgcnBjYmluZCBjbGllbnRzLiBcXG5cXG5UaGUgbmV0bGluayBhdHRyaWJ1dGUgYE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FYCBpcyBkZWZpbmVkIGFzIGBOTEFfTlVMX1NUUklOR2AgaW4gYG5mc2Rfc29ja19ubF9wb2xpY3lgLCBlbnN1cmluZyB0aGF0IGBubGFfZGF0YSgpYCByZXR1cm5zIGEgcHJvcGVybHkgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIGBzdHJjbXAoKWAgaW4gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAuIFxcblxcbk5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIG9yIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnkuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvZ2ljIGJ1Z3MpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6Mzk6MzkuMjYyMTA0MjY4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTIyMTc5MzYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNjAxZWI3MDQ4ZmQxY2MzNzE5NTFmNThhZjAwY2MyNTBmOWUyYmFjM1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIEF1ZyAxMCAyMTozOTozNyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuY1xcbmluZGV4IDdlMWQ1YTVkNjUxMWUuLmY3M2EyZWE0MjU1NzEgMTAwNjQ0XFxuLS0tIGEvZnMvbmZzZC9uZnNjdGwuY1xcbisrKyBiL2ZzL25mc2QvbmZzY3RsLmNcXG5AQCAtMTk3MywyMSArMTk3MywzOSBAQCBpbnQgbmZzZF9ubF92ZXJzaW9uX2dldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFRyYW5zcG9ydCBjbGFzc2VzIE5GU0Qga25vd3MgaG93IHRvIGluc3RhbnRpYXRlLiBWZXR0aW5nIHRoZSBuYW1lIGhlcmVcXG4rICoga2VlcHMgYSBib2d1cyBzdHJpbmcgZnJvbSByZWFjaGluZyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpLCB3aGVyZSBhblxcbisgKiB1bmtub3duIG5hbWUgdHJpZ2dlcnMgYSByZXF1ZXN0X21vZHVsZShcXFwic3ZjJXNcXFwiLCBuYW1lKSB1cGNhbGwgdW5kZXJcXG4rICogbmZzZF9tdXRleC5cXG4rICovXFxuK3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKVxcbit7XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3VwcG9ydGVkW10gPSB7IFxcXCJ0Y3BcXFwiLCBcXFwidWRwXFxcIiwgXFxcInJkbWFcXFwiIH07XFxuK1xcdGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoc3VwcG9ydGVkKTsgaSsrKVxcbitcXHRcXHRpZiAoIXN0cmNtcChuYW1lLCBzdXBwb3J0ZWRbaV0pKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbisvKiBVcHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBhIHNpbmdsZSByZXF1ZXN0IG1heSBjYXJyeS4gKi9cXG4rI2RlZmluZSBORlNEX05MX0xJU1RFTkVSX01BWFxcdDEwMjRcXG4rXFxuIC8qKlxcbiAgKiBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyAtIHNhbml0eS1jaGVjayB0aGUgbGlzdGVuZXIgbGlzdCBmcm9tIHVzZXJsYW5kXFxuICAqIEBpbmZvOiBuZXRsaW5rIG1ldGFkYXRhIGFuZCBjb21tYW5kIGFyZ3VtZW50c1xcbiAgKlxcbi0gKiBXYWxrIGV2ZXJ5IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIGF0dHJpYnV0ZSBhbmQgY29uZmlybSB0aGF0IGVhY2ggZW50cnlcXG4tICogaXMgd2VsbC1mb3JtZWQ6IGl0IHBhcnNlcyBhZ2FpbnN0IHRoZSBwb2xpY3ksIGNhcnJpZXMgYm90aCBhbiBhZGRyZXNzIGFuZFxcbi0gKiBhIHRyYW5zcG9ydCBuYW1lLCBhbmQgdGhlIGFkZHJlc3MgaXMgbG9uZyBlbm91Z2ggZm9yIGl0cyBmYW1pbHkuIERvaW5nXFxuLSAqIHRoaXMgdXAgZnJvbnQgbGV0cyB0aGUgY2FsbGVycyBiZWxvdyBhc3N1bWUgZXZlcnkgZW50cnkgaXMgdmFsaWQgYW5kXFxuLSAqIGd1YXJhbnRlZXMgd2UgbWFrZSBubyBjaGFuZ2VzIHdoZW4gdGhlIHJlcXVlc3QgaXMgbWFsZm9ybWVkLlxcbisgKiBXYWxrIGV2ZXJ5IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIGF0dHJpYnV0ZSBhbmQgY29uZmlybSB0aGF0IHRoZSBsaXN0IGlzXFxuKyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC5cXG4gICpcXG4gICogUmV0dXJuOiAwIGlmIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkLCBvciBhIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZS5cXG4gICovXFxuIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4ge1xcbiBcXHRjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyO1xcbitcXHR1bnNpZ25lZCBpbnQgY291bnQgPSAwO1xcbiBcXHRpbnQgcmVtO1xcbiBcXG4gXFx0bmxtc2dfZm9yX2VhY2hfYXR0cl90eXBlKGF0dHIsIE5GU0RfQV9TRVJWRVJfU09DS19BRERSLCBpbmZvLVxcdTAwM2VubGhkcixcXG5AQCAtMTk5Niw2ICsyMDE0LDExIEBAIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4gXFx0XFx0c3RydWN0IHNvY2thZGRyICpzYTtcXG4gXFx0XFx0aW50IGVycjtcXG4gXFxuK1xcdFxcdGlmICgrK2NvdW50IFxcdTAwM2UgTkZTRF9OTF9MSVNURU5FUl9NQVgpIHtcXG4rXFx0XFx0XFx0TkxfU0VUX0VSUl9NU0coaW5mby1cXHUwMDNlZXh0YWNrLCBcXFwidG9vIG1hbnkgbGlzdGVuZXJzXFxcIik7XFxuK1xcdFxcdFxcdHJldHVybiAtRTJCSUc7XFxuK1xcdFxcdH1cXG4rXFxuIFxcdFxcdGVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5GU0RfQV9TT0NLX01BWCwgYXR0cixcXG4gXFx0XFx0XFx0XFx0ICAgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXFx1MDAzZWV4dGFjayk7XFxuIFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbkBAIC0yMDA0LDYgKzIwMjcsOSBAQCBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXFxuIFxcdFxcdGlmICghdGJbTkZTRF9BX1NPQ0tfQUREUl0gfHwgIXRiW05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbitcXHRcXHRpZiAoIW5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChubGFfZGF0YSh0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7XFxuK1xcbiBcXHRcXHRzYSA9IG5sYV9kYXRhKHRiW05GU0RfQV9TT0NLX0FERFJdKTtcXG4gXFx0XFx0aWYgKG5sYV9sZW4odGJbTkZTRF9BX1NPQ0tfQUREUl0pIFxcdTAwM2Mgc2l6ZW9mKHNhLVxcdTAwM2VzYV9mYW1pbHkpKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5AQCAtMjE1Niw4ICsyMTgyLDEyIEBAIGludCBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXFxuIFxcdFxcdHJldCA9IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKHNlcnYsIHhjbF9uYW1lLCBuZXQsIHNhLCAwLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgICBjdXJyZW50X2NyZWQoKSk7XFxuIFxcdFxcdC8qIGFsd2F5cyBzYXZlIHRoZSBsYXRlc3QgZXJyb3IgKi9cXG4tXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdE5MX1NFVF9FUlJfTVNHX0ZNVChpbmZvLVxcdTAwM2VleHRhY2ssXFxuK1xcdFxcdFxcdFxcdFxcdCAgIFxcXCJjYW5ub3QgY3JlYXRlICVzIGxpc3RlbmVyOiAlZFxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHhjbF9uYW1lLCByZXQpO1xcbiBcXHRcXHRcXHRlcnIgPSByZXQ7XFxuK1xcdFxcdH1cXG4gXFx0fVxcbiBcXG4gXFx0aWYgKCFzZXJ2LVxcdTAwM2Vzdl9ucnRocmVhZHMgXFx1MDAyNlxcdTAwMjYgbGlzdF9lbXB0eShcXHUwMDI2bm4tXFx1MDAzZW5mc2Rfc2Vydi1cXHUwMDNlc3ZfcGVybXNvY2tzKSlcXG5kaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcXG5pbmRleCA2YWEzNzIxODhjODZhLi4wYWEzNzZiODJhNTI2IDEwMDY0NFxcbi0tLSBhL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcXG4rKysgYi9uZXQvc3VucnBjL3JwY2JfY2xudC5jXFxuQEAgLTIyMSw2ICsyMjEsMTYgQEAgc3RhdGljIHZvaWQgcnBjYl9zZXRfbG9jYWwoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsXFxuICMgZGVmaW5lIFNVTl9MRU4ocHRyKSAob2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aClcXHRcXHRcXFxcXFxuIFxcdFxcdCAgICAgICsgMSArIHN0cmxlbigocHRyKS1cXHUwMDNlc3VuX3BhdGggKyAxKSlcXG4gXFxuKy8qXFxuKyAqIFRoZSBrZXJuZWwncyBycGNiaW5kIGNsaWVudCB0YWxrcyBvbmx5IHRvIHRoZSBsb2NhbCBycGNiaW5kLCBvdmVyIGxvb3BiYWNrXFxuKyAqIG9yIGEgbG9jYWwgQUZfTE9DQUwgc29ja2V0LCB3aGVyZSBhIGhlYWx0aHkgcnBjYmluZCBhbnN3ZXJzIGluIG1pY3Jvc2Vjb25kcy5cXG4rICovXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX3RpbWVvdXQgcnBjYl9sb2NhbF90aW1lb3V0ID0ge1xcbitcXHQudG9faW5pdHZhbFxcdD0gMSAqIEhaLFxcbitcXHQudG9fbWF4dmFsXFx0PSAxICogSFosXFxuK1xcdC50b19yZXRyaWVzXFx0PSAwLFxcbit9O1xcbitcXG4gLypcXG4gICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlXFxuICAqIGlzIHJldHVybmVkLlxcbkBAIC0yMzgsNiArMjQ4LDcgQEAgc3RhdGljIGludCBycGNiX2NyZWF0ZV9hZl9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsXFxuIFxcdFxcdC52ZXJzaW9uXFx0PSBSUENCVkVSU18yLFxcbiBcXHRcXHQuYXV0aGZsYXZvclxcdD0gUlBDX0FVVEhfTlVMTCxcXG4gXFx0XFx0LmNyZWRcXHRcXHQ9IGN1cnJlbnRfY3JlZCgpLFxcbitcXHRcXHQudGltZW91dFxcdD0gXFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2UgdHVybiBvZmYgdGhlIGlkbGUgdGltZW91dCB0byBwcmV2ZW50IHRoZSBrZXJuZWxcXG4gXFx0XFx0ICogZnJvbSBhdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3RpbmcgdGhlIHNvY2tldC5cXG5AQCAtMzEyLDYgKzMyMyw3IEBAIHN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfbmV0KHN0cnVjdCBuZXQgKm5ldClcXG4gXFx0XFx0LnZlcnNpb25cXHQ9IFJQQ0JWRVJTXzIsXFxuIFxcdFxcdC5hdXRoZmxhdm9yXFx0PSBSUENfQVVUSF9VTklYLFxcbiBcXHRcXHQuY3JlZFxcdFxcdD0gY3VycmVudF9jcmVkKCksXFxuK1xcdFxcdC50aW1lb3V0XFx0PSBcXHUwMDI2cnBjYl9sb2NhbF90aW1lb3V0LFxcbiBcXHRcXHQuZmxhZ3NcXHRcXHQ9IFJQQ19DTE5UX0NSRUFURV9OT1BJTkcsXFxuIFxcdH07XFxuIFxcdHN0cnVjdCBycGNfY2xudCAqY2xudCwgKmNsbnQ0O1xcbmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuY1xcbmluZGV4IDA1YzNlNmUyZjY1OTQuLmU5Y2ZjZWIxYTMzNDIgMTAwNjQ0XFxuLS0tIGEvbmV0L3N1bnJwYy9zdmMuY1xcbisrKyBiL25ldC9zdW5ycGMvc3ZjLmNcXG5AQCAtMTIwOCwxMyArMTIwOCwxNiBAQCBpbnQgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0LFxcbiBcXHRcXHRzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2dwID0gXFx1MDAyNnNlcnYtXFx1MDAzZXN2X3Byb2dyYW1zW3BdO1xcbiBcXG4gXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHByb2dwLVxcdTAwM2VwZ19udmVyczsgaSsrKSB7XFxuK1xcdFxcdFxcdGludCByZXQ7XFxuIFxcbi1cXHRcXHRcXHRlcnJvciA9IHByb2dwLVxcdTAwM2VwZ19ycGNiaW5kX3NldChuZXQsIHByb2dwLCBpLFxcbitcXHRcXHRcXHRyZXQgPSBwcm9ncC1cXHUwMDNlcGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSxcXG4gXFx0XFx0XFx0XFx0XFx0ZmFtaWx5LCBwcm90bywgcG9ydCk7XFxuLVxcdFxcdFxcdGlmIChlcnJvciBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApIHtcXG4gXFx0XFx0XFx0XFx0cHJpbnRrKEtFUk5fV0FSTklORyBcXFwic3ZjOiBmYWlsZWQgdG8gcmVnaXN0ZXIgXFxcIlxcbiBcXHRcXHRcXHRcXHRcXHRcXFwiJXN2JXUgUlBDIHNlcnZpY2UgKGVycm5vICVkKS5cXFxcblxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdHByb2dwLVxcdTAwM2VwZ19uYW1lLCBpLCAtZXJyb3IpO1xcbitcXHRcXHRcXHRcXHRcXHRwcm9ncC1cXHUwMDNlcGdfbmFtZSwgaSwgLXJldCk7XFxuK1xcdFxcdFxcdFxcdGlmICghZXJyb3IpXFxuK1xcdFxcdFxcdFxcdFxcdGVycm9yID0gcmV0O1xcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHR9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcXG5pbmRleCA4NDM0M2ZkMWUzNTRiLi40NjA1MDhkZTkzNzRmIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcXG5AQCAtODksNiArODksNyBAQCBUQVJHRVRTICs9IG5ldC9wYWNrZXRkcmlsbFxcbiBUQVJHRVRTICs9IG5ldC9wcHBcXG4gVEFSR0VUUyArPSBuZXQvcmRzXFxuIFRBUkdFVFMgKz0gbmV0L3RjcF9hb1xcbitUQVJHRVRTICs9IG5mc2RcXG4gVEFSR0VUUyArPSBub2xpYmNcXG4gVEFSR0VUUyArPSBwY2lfZW5kcG9pbnRcXG4gVEFSR0VUUyArPSBwY2llX2J3Y3RybFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmVcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE5ZTZkZWMwNGQ4ZTlcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlXFxuQEAgLTAsMCArMSBAQFxcbituZnNkX25ldGxpbmtfbGlzdGVuZXJcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGVcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1YWM2NTU0OWQyNTlcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZVxcbkBAIC0wLDAgKzEsNiBAQFxcbisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuK0NGTEFHUyArPSAkKEtIRFJfSU5DTFVERVMpIC1XYWxsXFxuK1xcbitURVNUX0dFTl9QUk9HUyA6PSBuZnNkX25ldGxpbmtfbGlzdGVuZXJcXG4rXFxuK2luY2x1ZGUgLi4vbGliLm1rXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWdcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2OTQ1ZmY5NTUxYzRcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWdcXG5AQCAtMCwwICsxLDQgQEBcXG4rQ09ORklHX05FVF9OUz15XFxuK0NPTkZJR19JUFY2PXlcXG4rQ09ORklHX05GU0Q9eVxcbitDT05GSUdfTkZTRF9WND15XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zZTMzMDc2ODBkN2Q0XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmNcXG5AQCAtMCwwICsxLDkyMCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBSZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUgTkZTRCBnZW5lcmljLW5ldGxpbmsgbGlzdGVuZXIgaW50ZXJmYWNlXFxuKyAqIChORlNEX0NNRF9MSVNURU5FUl9TRVQgLyBORlNEX0NNRF9MSVNURU5FUl9HRVQpLlxcbisgKlxcbisgKiBUaHJlZSBncm91cHM6XFxuKyAqICAgdmFsaWRhdGlvbiAgLSBtYWxmb3JtZWQvYWJ1c2l2ZSBMSVNURU5FUl9TRVQgcmVxdWVzdHMgYXJlIHJlamVjdGVkIGJ5XFxuKyAqICAgICAgICAgICAgICAgICBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycygpLCBiZWZvcmUgbmZzZF9tdXRleCBpcyB0YWtlbi5cXG4rICogICBmdW5jdGlvbmFsICAtIGNyZWF0ZS9hZGQvcmVtb3ZlIGxpc3RlbmVycyBhbmQgdmVyaWZ5IExJU1RFTkVSX0dFVFxcbisgKiAgICAgICAgICAgICAgICAgcmVmbGVjdHMgdGhlIHNldCAocm91bmQtdHJpcCBvZiB0cmFuc3BvcnQgKyBhZGRyOnBvcnQpLlxcbisgKiAgIHNlbWFudGljcyAgIC0gb25jZSB0aHJlYWRzIGFyZSBydW5uaW5nIChUSFJFQURTX1NFVCkgYSBsaXN0ZW5lciBjaGFuZ2VcXG4rICogICAgICAgICAgICAgICAgIGlzIHJlZnVzZWQgd2l0aCAtRUJVU1kuXFxuKyAqXFxuKyAqIEVhY2ggdGVzdCBydW5zIGluIGl0cyBvd24gcHJpdmF0ZSBuZXQgKyBtb3VudCBuYW1lc3BhY2UgKHVuc2hhcmUgaW5cXG4rICogRklYVFVSRV9TRVRVUCkuIC9ydW4gaXMgbWFza2VkIHRoZXJlOiBhIHBhdGhuYW1lIEFGX0xPQ0FMIGNvbm5lY3QgaXMgbm90XFxuKyAqIHNjb3BlZCBieSB0aGUgbmV0d29yayBuYW1lc3BhY2UsIHNpbmNlIHVuaXhfZmluZF9ic2QoKSByZXNvbHZlcyBieSBpbm9kZVxcbisgKiBhbmQgdGFrZXMgbm8gc3RydWN0IG5ldCwgc28gdGhlIGtlcm5lbCdzIHJwY2JpbmQgY2xpZW50IHdvdWxkIG90aGVyd2lzZSBiZVxcbisgKiBhYmxlIHRvIHJlYWNoIHRoZSBycGNiaW5kIHJ1bm5pbmcgb24gdGhlIGhvc3QuIEFueXRoaW5nIHRoYXQgY3JlYXRlcyBhXFxuKyAqIHNlcnYgaXMgc2VydmVkIGJ5IHRoZSBwZXItbmV0bnMgcnBjYmluZCBzdHViIGJlbG93IGluc3RlYWQuXFxuKyAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjcG9sbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc2NoZWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkZGVmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpbnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW91bnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9wcmN0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3NvY2tldC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvc3RhdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3RpbWUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy91bi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY25ldC9pZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbmV0aW5ldC9pbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbmV0bGluay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZ2VuZXRsaW5rLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwiLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFxcXCJcXG4rXFxuKy8qIE5GU0QgZ2VuZXJpYy1uZXRsaW5rIGNvbnN0YW50cyAoZnJvbSBsaW51eC9uZnNkX25ldGxpbmsuaCkuICovXFxuKyNkZWZpbmUgTkZTRF9GQU1JTFlfTkFNRVxcdFxcdFxcXCJuZnNkXFxcIlxcbisjZGVmaW5lIE5GU0RfQ01EX1RIUkVBRFNfU0VUXFx0XFx0MlxcbisjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX1NFVFxcdFxcdDZcXG4rI2RlZmluZSBORlNEX0NNRF9MSVNURU5FUl9HRVRcXHRcXHQ3XFxuKyNkZWZpbmUgTkZTRF9BX1NFUlZFUl9USFJFQURTXFx0XFx0MVxcbisjZGVmaW5lIE5GU0RfQV9TRVJWRVJfU09DS19BRERSXFx0XFx0MVxcdC8qIHBlci1saXN0ZW5lciBuZXN0ICovXFxuKyNkZWZpbmUgTkZTRF9BX1NPQ0tfQUREUlxcdFxcdDFcXHQvKiBpbnNpZGUgdGhlIG5lc3QgKi9cXG4rI2RlZmluZSBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRVxcdDJcXHQvKiBpbnNpZGUgdGhlIG5lc3QgKi9cXG4rXFxuKyNkZWZpbmUgTkxBX0FMSUdONChsZW4pXFx0XFx0XFx0KCgobGVuKSArIDMpIFxcdTAwMjYgfjMpXFxuKyNkZWZpbmUgVEVTVF9QT1JUXFx0XFx0XFx0MjAwNDlcXG4rI2RlZmluZSBNQVhfTElTVEVORVJTXFx0XFx0XFx0OFxcbisjZGVmaW5lIFJFQ1ZfVElNRU9fU0VDXFx0XFx0XFx0MzBcXG4rXFxuK3N0YXRpYyBpbnQgbmZzZF9mYW1pbHk7XFx0XFx0XFx0Lyogc2V0IHBlci10ZXN0IGluIEZJWFRVUkVfU0VUVVAgKi9cXG4rXFxuK3N0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICptc2cpXFxuK3tcXG4rXFx0cGVycm9yKG1zZyk7XFxuK1xcdGV4aXQoMSk7XFxuK31cXG4rXFxuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gbWluaW1hbCBnZW5lcmljLW5ldGxpbmsgcGx1bWJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rc3RhdGljIGludCBnZW5sX29wZW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfbmwgc2EgPSB7IC5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LIH07XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHR2ID0geyAudHZfc2VjID0gUkVDVl9USU1FT19TRUMgfTtcXG4rXFx0aW50IGZkID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX0dFTkVSSUMpO1xcbitcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0ZGllKFxcXCJzb2NrZXQoTkVUTElOS19HRU5FUklDKVxcXCIpO1xcbitcXHRpZiAoYmluZChmZCwgKHZvaWQgKilcXHUwMDI2c2EsIHNpemVvZihzYSkpIFxcdTAwM2MgMClcXG4rXFx0XFx0ZGllKFxcXCJiaW5kKG5ldGxpbmspXFxcIik7XFxuK1xcdHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCBcXHUwMDI2dHYsIHNpemVvZih0dikpO1xcbitcXHRyZXR1cm4gZmQ7XFxuK31cXG4rXFxuKy8qIEFwcGVuZCBhbiBhdHRyaWJ1dGUgYXQgQG9mZjsgcmV0dXJuIHRoZSBuZXcgKGFsaWduZWQpIG9mZnNldC4gKi9cXG4rc3RhdGljIGludCBwdXRfYXR0cihjaGFyICpidWYsIGludCBvZmYsIHVpbnQxNl90IHR5cGUsXFxuK1xcdFxcdCAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKVxcbit7XFxuK1xcdHN0cnVjdCBubGF0dHIgKm5hID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcXG4rXFxuK1xcdG5hLVxcdTAwM2VubGFfdHlwZSA9IHR5cGU7XFxuK1xcdG5hLVxcdTAwM2VubGFfbGVuID0gTkxBX0hEUkxFTiArIGxlbjtcXG4rXFx0aWYgKGxlbilcXG4rXFx0XFx0bWVtY3B5KGJ1ZiArIG9mZiArIE5MQV9IRFJMRU4sIGRhdGEsIGxlbik7XFxuK1xcdHJldHVybiBvZmYgKyBOTEFfQUxJR040KE5MQV9IRFJMRU4gKyBsZW4pO1xcbit9XFxuK1xcbisvKiBCdWlsZCBhIGdlbmwgbWVzc2FnZSBoZWFkZXIgaW50byBAYnVmOyByZXR1cm4gdGhlIG9mZnNldCBwYXN0IGl0LiAqL1xcbitzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKVxcbit7XFxuK1xcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XFxuK1xcdHN0cnVjdCBnZW5sbXNnaGRyICpnbmwgPSAodm9pZCAqKShidWYgKyBOTE1TR19IRFJMRU4pO1xcbitcXG4rXFx0bWVtc2V0KGJ1ZiwgMCwgTkxNU0dfSERSTEVOICsgR0VOTF9IRFJMRU4pO1xcbitcXHRubGgtXFx1MDAzZW5sbXNnX3R5cGUgPSB0eXBlO1xcbitcXHRubGgtXFx1MDAzZW5sbXNnX2ZsYWdzID0gZmxhZ3M7XFxuK1xcdG5saC1cXHUwMDNlbmxtc2dfc2VxID0gMTtcXG4rXFx0Z25sLVxcdTAwM2VjbWQgPSBjbWQ7XFxuK1xcdGdubC1cXHUwMDNldmVyc2lvbiA9IDE7XFxuK1xcdHJldHVybiBOTE1TR19IRFJMRU4gKyBHRU5MX0hEUkxFTjtcXG4rfVxcbitcXG4rLyogU2VuZCBhbiBuZnNkIGNvbW1hbmQgd2l0aCBhbiBBQ0s7IHJldHVybiB0aGUgQUNLIGVycm5vIChcXHUwMDNjPSAwKS4gKi9cXG4rc3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKVxcbit7XFxuK1xcdGNoYXIgYnVmWzEgXFx1MDAzY1xcdTAwM2MgMjBdLCByYnVmWzQwOTZdO1xcbitcXHRzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmO1xcbitcXHRpbnQgZmQgPSBnZW5sX29wZW4oKTtcXG4rXFx0aW50IG9mZiwgbiwgcmV0O1xcbitcXG4rXFx0b2ZmID0gZ2VubF9oZHIoYnVmLCBuZnNkX2ZhbWlseSwgTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0FDSywgY21kKTtcXG4rXFx0aWYgKGF0dHJzX2xlbikge1xcbitcXHRcXHRtZW1jcHkoYnVmICsgb2ZmLCBhdHRycywgYXR0cnNfbGVuKTtcXG4rXFx0XFx0b2ZmICs9IGF0dHJzX2xlbjtcXG4rXFx0fVxcbitcXHRubGgtXFx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcXG4rXFxuK1xcdGlmIChzZW5kKGZkLCBidWYsIG9mZiwgMCkgXFx1MDAzYyAwKVxcbitcXHRcXHRkaWUoXFxcInNlbmQoZ2VubClcXFwiKTtcXG4rXFxuK1xcdG4gPSByZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApO1xcbitcXHRpZiAobiBcXHUwMDNjIDApXFxuK1xcdFxcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcXG4rXFx0ZWxzZSBpZiAoKChzdHJ1Y3Qgbmxtc2doZHIgKilyYnVmKS1cXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcXG4rXFx0XFx0cmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS1cXHUwMDNlZXJyb3I7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cmV0ID0gMDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKiBTZW5kIGEgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBmdWxsIHJlcGx5IG1lc3NhZ2U7IC1lcnJubyBvbiBmYWlsdXJlLiAqL1xcbitzdGF0aWMgaW50IGdlbmxfcmVxdWVzdF9yZXBseSh1aW50OF90IGNtZCwgY2hhciAqcmJ1Ziwgc2l6ZV90IHJsZW4pXFxuK3tcXG4rXFx0Y2hhciBidWZbMjU2XTtcXG4rXFx0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcXG4rXFx0aW50IGZkID0gZ2VubF9vcGVuKCk7XFxuK1xcdGludCBvZmYsIG4sIHJldDtcXG4rXFxuK1xcdG9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QsIGNtZCk7XFxuK1xcdG5saC1cXHUwMDNlbmxtc2dfbGVuID0gb2ZmO1xcbitcXG4rXFx0aWYgKHNlbmQoZmQsIGJ1Ziwgb2ZmLCAwKSBcXHUwMDNjIDApXFxuK1xcdFxcdGRpZShcXFwic2VuZChnZW5sIHJlcGx5KVxcXCIpO1xcbitcXG4rXFx0biA9IHJlY3YoZmQsIHJidWYsIHJsZW4sIDApO1xcbitcXHRpZiAobiBcXHUwMDNjIDApXFxuK1xcdFxcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcXG4rXFx0ZWxzZSBpZiAoKChzdHJ1Y3Qgbmxtc2doZHIgKilyYnVmKS1cXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcXG4rXFx0XFx0cmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS1cXHUwMDNlZXJyb3I7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cmV0ID0gbjtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKiBSZXNvbHZlIHRoZSBcXFwibmZzZFxcXCIgZ2VubCBmYW1pbHkgaWQ7IC0xIGlmIG5vdCByZWdpc3RlcmVkLiAqL1xcbitzdGF0aWMgaW50IGdlbmxfcmVzb2x2ZV9uZnNkKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciBidWZbMTAyNF0sIHJidWZbNDA5Nl07XFxuK1xcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XFxuK1xcdHN0cnVjdCBubG1zZ2hkciAqcmggPSAodm9pZCAqKXJidWY7XFxuK1xcdHN0cnVjdCBubGF0dHIgKm5hO1xcbitcXHRpbnQgZmQsIG9mZiwgbGVmdCwgaWQgPSAtMTtcXG4rXFxuK1xcdGZkID0gZ2VubF9vcGVuKCk7XFxuK1xcdG9mZiA9IGdlbmxfaGRyKGJ1ZiwgR0VOTF9JRF9DVFJMLCBOTE1fRl9SRVFVRVNULCBDVFJMX0NNRF9HRVRGQU1JTFkpO1xcbitcXHRvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLFxcbitcXHRcXHQgICAgICAgTkZTRF9GQU1JTFlfTkFNRSwgc2l6ZW9mKE5GU0RfRkFNSUxZX05BTUUpKTtcXG4rXFx0bmxoLVxcdTAwM2VubG1zZ19sZW4gPSBvZmY7XFxuK1xcbitcXHRpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApIFxcdTAwM2MgMClcXG4rXFx0XFx0ZGllKFxcXCJzZW5kKEdFVEZBTUlMWSlcXFwiKTtcXG4rXFx0aWYgKHJlY3YoZmQsIHJidWYsIHNpemVvZihyYnVmKSwgMCkgXFx1MDAzYyAwKVxcbitcXHRcXHRkaWUoXFxcInJlY3YoR0VURkFNSUxZKVxcXCIpO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRpZiAocmgtXFx1MDAzZW5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdG5hID0gKHZvaWQgKikoKGNoYXIgKilOTE1TR19EQVRBKHJoKSArIEdFTkxfSERSTEVOKTtcXG4rXFx0bGVmdCA9IHJoLVxcdTAwM2VubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjtcXG4rXFx0d2hpbGUgKGxlZnQgXFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XFxuK1xcdFxcdGlmIChuYS1cXHUwMDNlbmxhX3R5cGUgPT0gQ1RSTF9BVFRSX0ZBTUlMWV9JRCkge1xcbitcXHRcXHRcXHRpZCA9ICoodWludDE2X3QgKikoKGNoYXIgKiluYSArIE5MQV9IRFJMRU4pO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRsZWZ0IC09IE5MQV9BTElHTjQobmEtXFx1MDAzZW5sYV9sZW4pO1xcbitcXHRcXHRuYSA9ICh2b2lkICopKChjaGFyICopbmEgKyBOTEFfQUxJR040KG5hLVxcdTAwM2VubGFfbGVuKSk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGlkO1xcbit9XFxuK1xcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGxpc3RlbmVyIHJlcXVlc3QgYnVpbGRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rLyogRmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIG5lZ2F0aXZlIHRlc3RzOiBhbnkgZmllbGQgY2FuIGJlIG9taXR0ZWQvbWFsZm9ybWVkLiAqL1xcbitzdHJ1Y3QgcmF3X2xpc3RlbmVyIHtcXG4rXFx0Y29uc3QgY2hhciAqeHBydDtcXHQvKiBOVUxMIC1cXHUwMDNlIG9taXQgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUgKi9cXG4rXFx0aW50IGVtaXRfYWRkcjtcXHRcXHQvKiAwIC1cXHUwMDNlIG9taXQgTkZTRF9BX1NPQ0tfQUREUiAqL1xcbitcXHRjb25zdCB2b2lkICphZGRyO1xcbitcXHRpbnQgYWRkcl9sZW47XFx0XFx0LyogYnl0ZXMgdG8gZW1pdCBmb3IgTkZTRF9BX1NPQ0tfQUREUiAqL1xcbit9O1xcbitcXG4rc3RhdGljIGludCBwdXRfcmF3X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3Qgc3RydWN0IHJhd19saXN0ZW5lciAqcilcXG4re1xcbitcXHRzdHJ1Y3QgbmxhdHRyICpuZXN0ID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcXG4rXFx0aW50IGlubmVyID0gb2ZmICsgTkxBX0hEUkxFTjtcXG4rXFxuK1xcdGlmIChyLVxcdTAwM2VlbWl0X2FkZHIpXFxuK1xcdFxcdGlubmVyID0gcHV0X2F0dHIoYnVmLCBpbm5lciwgTkZTRF9BX1NPQ0tfQUREUiwgci1cXHUwMDNlYWRkciwgci1cXHUwMDNlYWRkcl9sZW4pO1xcbitcXHRpZiAoci1cXHUwMDNleHBydClcXG4rXFx0XFx0aW5uZXIgPSBwdXRfYXR0cihidWYsIGlubmVyLCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSxcXG4rXFx0XFx0XFx0XFx0IHItXFx1MDAzZXhwcnQsIHN0cmxlbihyLVxcdTAwM2V4cHJ0KSArIDEpO1xcbitcXHRuZXN0LVxcdTAwM2VubGFfdHlwZSA9IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIHwgTkxBX0ZfTkVTVEVEO1xcbitcXHRuZXN0LVxcdTAwM2VubGFfbGVuID0gaW5uZXIgLSBvZmY7XFxuK1xcdHJldHVybiBvZmYgKyBOTEFfQUxJR040KG5lc3QtXFx1MDAzZW5sYV9sZW4pO1xcbit9XFxuK1xcbisvKiBXZWxsLWZvcm1lZCBsb29wYmFjayBsaXN0ZW5lciBmb3IgQGZhbWlseSAoQUZfSU5FVCBvciBBRl9JTkVUNikuICovXFxuK3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyX2FmKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSxcXG4rXFx0XFx0XFx0ICAgdWludDE2X3QgcG9ydClcXG4re1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHswfTtcXG4rXFx0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IHhwcnQsIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFxcdTAwMjZzcyB9O1xcbitcXG4rXFx0aWYgKGZhbWlseSA9PSBBRl9JTkVUNikge1xcbitcXHRcXHRzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzNiA9ICh2b2lkICopXFx1MDAyNnNzO1xcbitcXG4rXFx0XFx0czYtXFx1MDAzZXNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7XFxuK1xcdFxcdHM2LVxcdTAwM2VzaW42X3BvcnQgPSBodG9ucyhwb3J0KTtcXG4rXFx0XFx0czYtXFx1MDAzZXNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7XFxuK1xcdFxcdHIuYWRkcl9sZW4gPSBzaXplb2YoKnM2KTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c3RydWN0IHNvY2thZGRyX2luICpzNCA9ICh2b2lkICopXFx1MDAyNnNzO1xcbitcXG4rXFx0XFx0czQtXFx1MDAzZXNpbl9mYW1pbHkgPSBBRl9JTkVUO1xcbitcXHRcXHRzNC1cXHUwMDNlc2luX3BvcnQgPSBodG9ucyhwb3J0KTtcXG4rXFx0XFx0czQtXFx1MDAzZXNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7XFxuK1xcdFxcdHIuYWRkcl9sZW4gPSBzaXplb2YoKnM0KTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gcHV0X3Jhd19saXN0ZW5lcihidWYsIG9mZiwgXFx1MDAyNnIpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHB1dF9saXN0ZW5lcihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IGNoYXIgKnhwcnQsIHVpbnQxNl90IHBvcnQpXFxuK3tcXG4rXFx0cmV0dXJuIHB1dF9saXN0ZW5lcl9hZihidWYsIG9mZiwgeHBydCwgQUZfSU5FVCwgcG9ydCk7XFxuK31cXG4rXFxuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gTElTVEVORVJfR0VUIHBhcnNpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rc3RydWN0IGxpc3RlbmVyX2VudCB7XFxuK1xcdGNoYXIgeHBydFsxNl07XFxuK1xcdGludCBmYW1pbHk7XFxuK1xcdHVpbnQxNl90IHBvcnQ7XFxuK1xcdHN0cnVjdCBpbl9hZGRyIGE0O1xcbitcXHRzdHJ1Y3QgaW42X2FkZHIgYTY7XFxuK307XFxuK1xcbitzdGF0aWMgaW50IHBhcnNlX2xpc3RlbmVyX2dldChjb25zdCBjaGFyICpyYnVmLCBpbnQgbGVuLFxcbitcXHRcXHRcXHQgICAgICBzdHJ1Y3QgbGlzdGVuZXJfZW50ICpvdXQsIGludCBtYXgpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGggPSAoY29uc3Qgdm9pZCAqKXJidWY7XFxuK1xcdGNvbnN0IHN0cnVjdCBubGF0dHIgKm5hO1xcbitcXHRpbnQgbGVmdCwgY291bnQgPSAwO1xcbitcXG4rXFx0KHZvaWQpbGVuO1xcbitcXHRuYSA9IChjb25zdCB2b2lkICopKHJidWYgKyBOTE1TR19IRFJMRU4gKyBHRU5MX0hEUkxFTik7XFxuK1xcdGxlZnQgPSBubGgtXFx1MDAzZW5sbXNnX2xlbiAtIE5MTVNHX0hEUkxFTiAtIEdFTkxfSERSTEVOO1xcbitcXG4rXFx0d2hpbGUgKGxlZnQgXFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XFxuK1xcdFxcdGludCBhbGVuID0gbmEtXFx1MDAzZW5sYV9sZW47XFxuK1xcbitcXHRcXHRpZiAoKG5hLVxcdTAwM2VubGFfdHlwZSBcXHUwMDI2IE5MQV9UWVBFX01BU0spID09IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBjb3VudCBcXHUwMDNjIG1heCkge1xcbitcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmxhdHRyICppbiA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgKyBOTEFfSERSTEVOKTtcXG4rXFx0XFx0XFx0aW50IGlsZWZ0ID0gYWxlbiAtIE5MQV9IRFJMRU47XFxuK1xcdFxcdFxcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmUgPSBcXHUwMDI2b3V0W2NvdW50XTtcXG4rXFxuK1xcdFxcdFxcdG1lbXNldChlLCAwLCBzaXplb2YoKmUpKTtcXG4rXFx0XFx0XFx0d2hpbGUgKGlsZWZ0IFxcdTAwM2U9IChpbnQpTkxBX0hEUkxFTikge1xcbitcXHRcXHRcXHRcXHRjb25zdCB2b2lkICpkID0gKGNvbnN0IGNoYXIgKilpbiArIE5MQV9IRFJMRU47XFxuK1xcdFxcdFxcdFxcdGludCB0ID0gaW4tXFx1MDAzZW5sYV90eXBlIFxcdTAwMjYgTkxBX1RZUEVfTUFTSztcXG4rXFxuK1xcdFxcdFxcdFxcdGlmICh0ID09IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FKSB7XFxuK1xcdFxcdFxcdFxcdFxcdHN0cm5jcHkoZS1cXHUwMDNleHBydCwgZCwgc2l6ZW9mKGUtXFx1MDAzZXhwcnQpIC0gMSk7XFxuK1xcdFxcdFxcdFxcdH0gZWxzZSBpZiAodCA9PSBORlNEX0FfU09DS19BRERSKSB7XFxuK1xcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpzcyA9IGQ7XFxuK1xcbitcXHRcXHRcXHRcXHRcXHRlLVxcdTAwM2VmYW1pbHkgPSBzcy1cXHUwMDNlc3NfZmFtaWx5O1xcbitcXHRcXHRcXHRcXHRcXHRpZiAoc3MtXFx1MDAzZXNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7XFxuK1xcdFxcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqcyA9IGQ7XFxuK1xcbitcXHRcXHRcXHRcXHRcXHRcXHRlLVxcdTAwM2VhNCA9IHMtXFx1MDAzZXNpbl9hZGRyO1xcbitcXHRcXHRcXHRcXHRcXHRcXHRlLVxcdTAwM2Vwb3J0ID0gbnRvaHMocy1cXHUwMDNlc2luX3BvcnQpO1xcbitcXHRcXHRcXHRcXHRcXHR9IGVsc2UgaWYgKHNzLVxcdTAwM2Vzc19mYW1pbHkgPT0gQUZfSU5FVDYpIHtcXG4rXFx0XFx0XFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqcyA9IGQ7XFxuK1xcbitcXHRcXHRcXHRcXHRcXHRcXHRlLVxcdTAwM2VhNiA9IHMtXFx1MDAzZXNpbjZfYWRkcjtcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ZS1cXHUwMDNlcG9ydCA9IG50b2hzKHMtXFx1MDAzZXNpbjZfcG9ydCk7XFxuK1xcdFxcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHRcXHRpbGVmdCAtPSBOTEFfQUxJR040KGluLVxcdTAwM2VubGFfbGVuKTtcXG4rXFx0XFx0XFx0XFx0aW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKWluICsgTkxBX0FMSUdONChpbi1cXHUwMDNlbmxhX2xlbikpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGNvdW50Kys7XFxuK1xcdFxcdH1cXG4rXFx0XFx0bGVmdCAtPSBOTEFfQUxJR040KGFsZW4pO1xcbitcXHRcXHRuYSA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgKyBOTEFfQUxJR040KGFsZW4pKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gY29udmVuaWVuY2Ugd3JhcHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rc3RhdGljIGludCBsaXN0ZW5lcl9zZXQoY29uc3QgY2hhciAqYXR0cnMsIGludCBsZW4pXFxuK3tcXG4rXFx0cmV0dXJuIGdlbmxfcmVxdWVzdChORlNEX0NNRF9MSVNURU5FUl9TRVQsIGF0dHJzLCBsZW4pO1xcbit9XFxuK1xcbisvKiBGZXRjaCB0aGUgY3VycmVudCBsaXN0ZW5lcnM7IHJldHVybnMgY291bnQgKFxcdTAwM2U9MCkgb3IgLWVycm5vLiAqL1xcbitzdGF0aWMgaW50IGxpc3RlbmVyX2dldChzdHJ1Y3QgbGlzdGVuZXJfZW50ICpvdXQsIGludCBtYXgpXFxuK3tcXG4rXFx0Y2hhciByYnVmWzgxOTJdO1xcbitcXHRpbnQgbiA9IGdlbmxfcmVxdWVzdF9yZXBseShORlNEX0NNRF9MSVNURU5FUl9HRVQsIHJidWYsIHNpemVvZihyYnVmKSk7XFxuK1xcbitcXHRpZiAobiBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiBuO1xcbitcXHRyZXR1cm4gcGFyc2VfbGlzdGVuZXJfZ2V0KHJidWYsIG4sIG91dCwgbWF4KTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmZpbmRfbGlzdGVuZXIoc3RydWN0IGxpc3RlbmVyX2VudCAqZSwgaW50IG4sXFxuK1xcdFxcdFxcdFxcdFxcdCAgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSxcXG4rXFx0XFx0XFx0XFx0XFx0ICB1aW50MTZfdCBwb3J0KVxcbit7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0aWYgKGVbaV0uZmFtaWx5ID09IGZhbWlseSBcXHUwMDI2XFx1MDAyNiBlW2ldLnBvcnQgPT0gcG9ydCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXN0cmNtcChlW2ldLnhwcnQsIHhwcnQpKVxcbitcXHRcXHRcXHRyZXR1cm4gXFx1MDAyNmVbaV07XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKiBTdGFydCAoQG4gXFx1MDAzZSAwKSBvciBzdG9wIChAbiA9PSAwKSBuZnNkIHRocmVhZHMgaW4gdGhpcyBuZXRucy4gKi9cXG4rc3RhdGljIGludCB0aHJlYWRzX3NldChpbnQgbilcXG4re1xcbitcXHRjaGFyIGF0dHJzWzY0XTtcXG4rXFx0dWludDMyX3QgdiA9IG47XFxuK1xcdGludCBvZmYgPSBwdXRfYXR0cihhdHRycywgMCwgTkZTRF9BX1NFUlZFUl9USFJFQURTLCBcXHUwMDI2diwgc2l6ZW9mKHYpKTtcXG4rXFxuK1xcdHJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfVEhSRUFEU19TRVQsIGF0dHJzLCBvZmYpO1xcbit9XFxuK1xcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIHBlci1uZXRucyBsb2NhbCBycGNiaW5kIHN0dWIgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rLypcXG4rICogQ3JlYXRpbmcgYSBsaXN0ZW5lciByZWdpc3RlcnMgd2l0aCBycGNiaW5kOiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpXFxuKyAqIHBhc3NlcyBmbGFncyBvZiAwLCBzbyBwbWFwX3JlZ2lzdGVyIGlzIHRydWUgaW4gc3ZjX3NldHVwX3NvY2tldCgpLCBhbmRcXG4rICogbmZzZF92ZXJzaW9uMyBpcyByZWdpc3RlcmFibGUgYnkgZGVmYXVsdCBhbmQgZG9lcyBub3Qgc2V0IHZzX3JwY2Jfb3B0bmwsXFxuKyAqIHNvIGEgcmVnaXN0cmF0aW9uIGZhaWx1cmUgYWJvcnRzIGxpc3RlbmVyIGNyZWF0aW9uLiBUaGUgYWJzdHJhY3QgQUZfTE9DQUxcXG4rICogbmFtZSB0aGUga2VybmVsIHRyaWVzIGZpcnN0IGlzIHBlci1uZXRucyAodW5peF9maW5kX2Fic3RyYWN0KCkgdGFrZXMgYVxcbisgKiBzdHJ1Y3QgbmV0KSwgc28gYW5zd2VyIGl0IGhlcmUgYW5kIHN0YXkgb3V0IG9mIHRoZSBob3N0J3MgcnBjYmluZC5cXG4rICpcXG4rICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZFxcbisgKiBTRVQvVU5TRVQgZ2V0IFRSVUUsIGZvciBib3RoIFJQQ0JWRVJTXzIgYW5kIFJQQ0JWRVJTXzQuIHY0IGhhcyB0byBiZVxcbisgKiBhbnN3ZXJlZCBiZWNhdXNlIF9fc3ZjX3JwY2JfcmVnaXN0ZXI2KCkgdHVybnMgYSB2NCByZWZ1c2FsIGludG9cXG4rICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLlxcbisgKlxcbisgKiBJbiBSUENCX1NUVUJfUkVGVVNFIG1vZGUgU0VUIGlzIGFuc3dlcmVkIEZBTFNFIGluc3RlYWQsIHdoaWNoXFxuKyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seVxcbisgKiBzdmNfdW5yZWdpc3RlcigpIGlzc3VlcyBpdCwgYW5kIGl0IGRpc2NhcmRzIHRoZSByZXN1bHQuXFxuKyAqL1xcbisjZGVmaW5lIFJQQ0JfUFJPR1JBTVxcdFxcdDEwMDAwMFxcbisjZGVmaW5lIFJQQ0JfUFJPQ19OVUxMXFx0XFx0MFxcbisjZGVmaW5lIFJQQ0JfUFJPQ19TRVRcXHRcXHQxXFxuKyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUXFx0XFx0MlxcbisjZGVmaW5lIFJQQ0JfQUJTVFJBQ1RfTkFNRVxcdFxcXCIvcnVuL3JwY2JpbmQuc29ja1xcXCJcXG4rI2RlZmluZSBSUENCX1NUVUJfTUFYQ09OTlxcdDRcXG4rXFxuK2VudW0geyBSUENCX1NUVUJfQUNDRVBULCBSUENCX1NUVUJfUkVGVVNFIH07XFxuK1xcbitzdGF0aWMgaW50IHJwY2Jfc3R1Yl9saXN0ZW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfdW4gc3VuID0geyAuc3VuX2ZhbWlseSA9IEFGX1VOSVggfTtcXG4rXFx0c2l6ZV90IG5sZW4gPSBzdHJsZW4oUlBDQl9BQlNUUkFDVF9OQU1FKTtcXG4rXFx0c29ja2xlbl90IGFsZW47XFxuK1xcdGludCBmZDtcXG4rXFxuK1xcdC8qIEFic3RyYWN0IG5hbWVzIGFyZSBsZW5ndGgtZGVsaW1pdGVkLCBzbyB0aGUgbGVuZ3RoIG11c3QgbWF0Y2guICovXFxuK1xcdG1lbWNweShzdW4uc3VuX3BhdGggKyAxLCBSUENCX0FCU1RSQUNUX05BTUUsIG5sZW4pO1xcbitcXHRhbGVuID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyAxICsgbmxlbjtcXG4rXFxuK1xcdGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKVxcdTAwMjZzdW4sIGFsZW4pIFxcdTAwM2MgMCB8fFxcbitcXHQgICAgbGlzdGVuKGZkLCBSUENCX1NUVUJfTUFYQ09OTikgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGNsb3NlKGZkKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcdHJldHVybiBmZDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBycGNiX3N0dWJfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRzaXplX3QgZG9uZSA9IDA7XFxuK1xcbitcXHR3aGlsZSAoZG9uZSBcXHUwMDNjIGxlbikge1xcbitcXHRcXHRzc2l6ZV90IG4gPSByZWFkKGZkLCAoY2hhciAqKWJ1ZiArIGRvbmUsIGxlbiAtIGRvbmUpO1xcbitcXG4rXFx0XFx0aWYgKG4gXFx1MDAzYz0gMClcXG4rXFx0XFx0XFx0cmV0dXJuIC0xO1xcbitcXHRcXHRkb25lICs9IG47XFxuK1xcdH1cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIEhhbmRsZSBvbmUgcmVjb3JkLW1hcmtlZCBSUEMgY2FsbC4gUmV0dXJucyAtMSB3aGVuIHRoZSBwZWVyIGlzIGRvbmUuICovXFxuK3N0YXRpYyBpbnQgcnBjYl9zdHViX2NhbGwoaW50IGZkLCBpbnQgbW9kZSlcXG4re1xcbitcXHR1aW50MzJfdCBtYXJrLCBjYWxsWzZdLCByZXBbN107XFxuK1xcdHVuc2lnbmVkIGludCBsZW4sIG5yZXAgPSA2O1xcbitcXHRzaXplX3QgcmVwbGVuO1xcbitcXG4rXFx0aWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBcXHUwMDI2bWFyaywgc2l6ZW9mKG1hcmspKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRsZW4gPSBudG9obChtYXJrKSBcXHUwMDI2IDB4N2ZmZmZmZmY7XFxuK1xcdGlmIChsZW4gXFx1MDAzYyBzaXplb2YoY2FsbCkgfHwgbGVuIFxcdTAwM2UgNDA5NilcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdC8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqL1xcbitcXHRmb3IgKGxlbiAtPSBzaXplb2YoY2FsbCk7IGxlbjsgKSB7XFxuK1xcdFxcdGNoYXIgc2lua1syNTZdO1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgbiA9IGxlbiBcXHUwMDNlIHNpemVvZihzaW5rKSA/IHNpemVvZihzaW5rKSA6IGxlbjtcXG4rXFxuK1xcdFxcdGlmIChycGNiX3N0dWJfcmVhZChmZCwgc2luaywgbikpXFxuK1xcdFxcdFxcdHJldHVybiAtMTtcXG4rXFx0XFx0bGVuIC09IG47XFxuK1xcdH1cXG4rXFxuK1xcdHJlcFswXSA9IGNhbGxbMF07XFx0XFx0LyogeGlkICovXFxuK1xcdHJlcFsxXSA9IGh0b25sKDEpO1xcdFxcdC8qIFJFUExZICovXFxuK1xcdHJlcFsyXSA9IGh0b25sKDApO1xcdFxcdC8qIE1TR19BQ0NFUFRFRCAqL1xcbitcXHRyZXBbM10gPSBodG9ubCgwKTtcXHRcXHQvKiB2ZXJpZmllciBmbGF2b3IgQVVUSF9OVUxMICovXFxuK1xcdHJlcFs0XSA9IGh0b25sKDApO1xcdFxcdC8qIHZlcmlmaWVyIGxlbmd0aCAqL1xcbitcXHRyZXBbNV0gPSBodG9ubCgwKTtcXHRcXHQvKiBTVUNDRVNTICovXFxuK1xcbitcXHRpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7XFxuK1xcdFxcdHJlcFs1XSA9IGh0b25sKDEpO1xcdC8qIFBST0dfVU5BVkFJTCAqL1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7XFxuK1xcdFxcdGNhc2UgUlBDQl9QUk9DX05VTEw6XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFJQQ0JfUFJPQ19TRVQ6XFxuK1xcdFxcdFxcdHJlcFs2XSA9IGh0b25sKG1vZGUgPT0gUlBDQl9TVFVCX1JFRlVTRSA/IDAgOiAxKTtcXG4rXFx0XFx0XFx0bnJlcCA9IDc7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFJQQ0JfUFJPQ19VTlNFVDpcXG4rXFx0XFx0XFx0cmVwWzZdID0gaHRvbmwoMSk7XFx0LyogVFJVRSAqL1xcbitcXHRcXHRcXHRucmVwID0gNztcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdHJlcFs1XSA9IGh0b25sKDMpO1xcdC8qIFBST0NfVU5BVkFJTCAqL1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJlcGxlbiA9IG5yZXAgKiBzaXplb2YocmVwWzBdKTtcXG4rXFx0bWFyayA9IGh0b25sKDB4ODAwMDAwMDAgfCByZXBsZW4pO1xcbitcXHRpZiAod3JpdGUoZmQsIFxcdTAwMjZtYXJrLCBzaXplb2YobWFyaykpICE9IChzc2l6ZV90KXNpemVvZihtYXJrKSB8fFxcbitcXHQgICAgd3JpdGUoZmQsIHJlcCwgcmVwbGVuKSAhPSAoc3NpemVfdClyZXBsZW4pXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSlcXG4re1xcbitcXHRzdHJ1Y3QgcG9sbGZkIHBmZFsxICsgUlBDQl9TVFVCX01BWENPTk5dO1xcbitcXHRuZmRzX3QgbiA9IDEsIGk7XFxuK1xcbitcXHRwZmRbMF0uZmQgPSBsZmQ7XFxuK1xcbitcXHRmb3IgKDs7KSB7XFxuK1xcdFxcdC8qIHN0b3AgcG9sbGluZyB0aGUgbGlzdGVuZXIgd2hlbiBmdWxsLCBvciBwb2xsKCkgc3BpbnMgKi9cXG4rXFx0XFx0cGZkWzBdLmV2ZW50cyA9IG4gXFx1MDAzYyAxICsgUlBDQl9TVFVCX01BWENPTk4gPyBQT0xMSU4gOiAwO1xcbitcXG4rXFx0XFx0aWYgKHBvbGwocGZkLCBuLCAtMSkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRcXHRpZiAocGZkWzBdLnJldmVudHMgXFx1MDAyNiBQT0xMSU4pIHtcXG4rXFx0XFx0XFx0aW50IGMgPSBhY2NlcHQobGZkLCBOVUxMLCBOVUxMKTtcXG4rXFxuK1xcdFxcdFxcdGlmIChjIFxcdTAwM2U9IDApIHtcXG4rXFx0XFx0XFx0XFx0cGZkW25dLmZkID0gYztcXG4rXFx0XFx0XFx0XFx0cGZkW25dLmV2ZW50cyA9IFBPTExJTjtcXG4rXFx0XFx0XFx0XFx0bisrO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBuOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKCEocGZkW2ldLnJldmVudHMgXFx1MDAyNiAoUE9MTElOIHwgUE9MTEhVUCB8IFBPTExFUlIpKSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGlmIChycGNiX3N0dWJfY2FsbChwZmRbaV0uZmQsIG1vZGUpKSB7XFxuK1xcdFxcdFxcdFxcdGNsb3NlKHBmZFtpXS5mZCk7XFxuK1xcdFxcdFxcdFxcdHBmZFtpXSA9IHBmZFstLW5dO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0fVxcbit9XFxuK1xcbisvKiBSZXR1cm5zIHRoZSBzdHViJ3MgcGlkLCBvciAtMS4gVGhlIHNvY2tldCBpcyBsaXN0ZW5pbmcgYmVmb3JlIHdlIGZvcmsuICovXFxuK3N0YXRpYyBwaWRfdCBycGNiX3N0dWJfc3RhcnQoaW50IG1vZGUpXFxuK3tcXG4rXFx0aW50IGxmZCA9IHJwY2Jfc3R1Yl9saXN0ZW4oKTtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0aWYgKGxmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHBpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKHBpZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0Y2xvc2UobGZkKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcdGlmIChwaWQgPT0gMCkge1xcbitcXHRcXHRzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7XFxuK1xcdFxcdHByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpO1xcbitcXHRcXHRpZiAoZ2V0cHBpZCgpID09IDEpXFx0XFx0LyogcmFjZWQgd2l0aCBwYXJlbnQgZXhpdCAqL1xcbitcXHRcXHRcXHRfZXhpdCgwKTtcXG4rXFx0XFx0cnBjYl9zdHViX3NlcnZlKGxmZCwgbW9kZSk7XFxuK1xcdFxcdF9leGl0KDApO1xcbitcXHR9XFxuK1xcbitcXHRjbG9zZShsZmQpO1xcbitcXHRyZXR1cm4gcGlkO1xcbit9XFxuK1xcbisvKlxcbisgKiBTd2FwIHRoZSBzdHViIGZvciBvbmUgaW4gQG1vZGUuIFNhZmUgYmVmb3JlIHRoZSBmaXJzdCByZXF1ZXN0OiBubyBzZXJ2XFxuKyAqIGV4aXN0cyB5ZXQsIHNvIHRoZSBrZXJuZWwgaGFzIG5vdCBjb25uZWN0ZWQgYW5kIHRoZSBhYnN0cmFjdCBuYW1lIGlzIGZyZWVcXG4rICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLlxcbisgKi9cXG4rc3RhdGljIGludCBycGNiX3N0dWJfcmVzdGFydChwaWRfdCAqcGlkLCBpbnQgbW9kZSlcXG4re1xcbitcXHRpZiAoKnBpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0a2lsbCgqcGlkLCBTSUdLSUxMKTtcXG4rXFx0XFx0d2FpdHBpZCgqcGlkLCBOVUxMLCAwKTtcXG4rXFx0fVxcbitcXHQqcGlkID0gcnBjYl9zdHViX3N0YXJ0KG1vZGUpO1xcbitcXHRyZXR1cm4gKnBpZCBcXHUwMDNlIDAgPyAwIDogLTE7XFxuK31cXG4rXFxuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmaXh0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rRklYVFVSRShuZnNkX2xpc3RlbmVyKSB7XFxuK1xcdHBpZF90IHJwY2JkO1xcbit9O1xcbitcXG4rRklYVFVSRV9TRVRVUChuZnNkX2xpc3RlbmVyKVxcbit7XFxuK1xcdHN0cnVjdCBpZnJlcSBpZnIgPSB7MH07XFxuK1xcdHN0cnVjdCBzdGF0IHN0O1xcbitcXHRpbnQgcztcXG4rXFxuK1xcdGlmIChnZXRldWlkKCkgIT0gMClcXG4rXFx0XFx0U0tJUChyZXR1cm4sIFxcXCJtdXN0IGJlIHJ1biBhcyByb290XFxcIik7XFxuK1xcdGlmICh1bnNoYXJlKENMT05FX05FV05FVCB8IENMT05FX05FV05TKSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwidW5zaGFyZShORVdORVR8TkVXTlMpOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdGlmIChtb3VudChcXFwiXFxcIiwgXFxcIi9cXFwiLCBOVUxMLCBNU19SRUMgfCBNU19QUklWQVRFLCBOVUxMKSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibW91bnQoLyBwcml2YXRlKTogJXNcXFwiLCBzdHJlcnJvcihlcnJubykpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogS2VlcCB0aGUga2VybmVsJ3MgcnBjYmluZCBjbGllbnQgaW5zaWRlIHRoaXMgbmFtZXNwYWNlLiBUaGVcXG4rXFx0ICogYWJzdHJhY3Qgc29ja2V0IGl0IHRyaWVzIGZpcnN0IGlzIHBlci1uZXRucywgYnV0IHRoZVxcbitcXHQgKiBcXFwiL3Zhci9ydW4vcnBjYmluZC5zb2NrXFxcIiBmYWxsYmFjayBpcyBub3QsIHNvIGhpZGUgdGhlIHBhdGguXFxuK1xcdCAqL1xcbitcXHRpZiAobW91bnQoXFxcInRtcGZzXFxcIiwgXFxcIi9ydW5cXFwiLCBcXFwidG1wZnNcXFwiLCAwLCBOVUxMKSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibW91bnQodG1wZnMgb24gL3J1bik6ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0aWYgKGxzdGF0KFxcXCIvdmFyL3J1blxcXCIsIFxcdTAwMjZzdCkgPT0gMCBcXHUwMDI2XFx1MDAyNiBTX0lTRElSKHN0LnN0X21vZGUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBtb3VudChcXFwidG1wZnNcXFwiLCBcXFwiL3Zhci9ydW5cXFwiLCBcXFwidG1wZnNcXFwiLCAwLCBOVUxMKSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibW91bnQodG1wZnMgb24gL3Zhci9ydW4pOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcbitcXHQvKiBCcmluZyBsb29wYmFjayB1cCBzbyBsaXN0ZW5lciBiaW5kcyAoMTI3LjAuMC4xIC8gOjoxKSB3b3JrLiAqL1xcbitcXHRzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApO1xcbitcXHRBU1NFUlRfR0UocywgMCk7XFxuK1xcdHN0cmNweShpZnIuaWZyX25hbWUsIFxcXCJsb1xcXCIpO1xcbitcXHRBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ0dJRkZMQUdTLCBcXHUwMDI2aWZyKSk7XFxuK1xcdGlmci5pZnJfZmxhZ3MgfD0gSUZGX1VQIHwgSUZGX1JVTk5JTkc7XFxuK1xcdEFTU0VSVF9FUSgwLCBpb2N0bChzLCBTSU9DU0lGRkxBR1MsIFxcdTAwMjZpZnIpKTtcXG4rXFx0Y2xvc2Uocyk7XFxuK1xcbitcXHRuZnNkX2ZhbWlseSA9IGdlbmxfcmVzb2x2ZV9uZnNkKCk7XFxuK1xcdGlmIChuZnNkX2ZhbWlseSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibmZzZCBnZW5sIGZhbWlseSBub3QgZm91bmQgKG1vZHByb2JlIG5mc2Q/KVxcXCIpO1xcbitcXG4rXFx0c2VsZi1cXHUwMDNlcnBjYmQgPSBycGNiX3N0dWJfc3RhcnQoUlBDQl9TVFVCX0FDQ0VQVCk7XFxuK1xcdGlmIChzZWxmLVxcdTAwM2VycGNiZCBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiY2Fubm90IHN0YXJ0IHRoZSBycGNiaW5kIHN0dWI6ICVzXFxcIixcXG4rXFx0XFx0ICAgICBzdHJlcnJvcihlcnJubykpO1xcbit9XFxuK1xcbitGSVhUVVJFX1RFQVJET1dOKG5mc2RfbGlzdGVuZXIpXFxuK3tcXG4rXFx0aWYgKHNlbGYtXFx1MDAzZXJwY2JkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRraWxsKHNlbGYtXFx1MDAzZXJwY2JkLCBTSUdLSUxMKTtcXG4rXFx0XFx0d2FpdHBpZChzZWxmLVxcdTAwM2VycGNiZCwgTlVMTCwgMCk7XFxuK1xcdH1cXG4rfVxcbitcXG4rLyogPT09PT09PT09PT09PT09PT09PT09IHZhbGlkYXRpb24gLyBuZWdhdGl2ZSA9PT09PT09PT09PT09PT09PT09PT0gKi9cXG4rXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfZW1wdHlfbGlzdF9vaylcXG4re1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF90b29fbWFueSlcXG4re1xcbitcXHRzdGF0aWMgY2hhciBhdHRyc1sxIFxcdTAwM2NcXHUwMDNjIDIwXTtcXG4rXFx0aW50IGksIG9mZiA9IDA7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgMTAyNTsgaSsrKVxcdFxcdC8qIFxcdTAwM2UgTkZTRF9OTF9MSVNURU5FUl9NQVggKDEwMjQpICovXFxuK1xcdFxcdG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgb2ZmLCBcXFwidWRwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFx0RVhQRUNUX0VRKC1FMkJJRywgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9taXNzaW5nX2FkZHIpXFxuK3tcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcXFwidGNwXFxcIiwgLmVtaXRfYWRkciA9IDAgfTtcXG4rXFx0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFxcdTAwMjZyKTtcXG4rXFxuK1xcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX21pc3NpbmdfdHJhbnNwb3J0KVxcbit7XFxuK1xcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XFxuK1xcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBOVUxMLCAuZW1pdF9hZGRyID0gMSxcXG4rXFx0XFx0XFx0XFx0ICAuYWRkciA9IFxcdTAwMjZzNCwgLmFkZHJfbGVuID0gc2l6ZW9mKHM0KSB9O1xcbitcXHRjaGFyIGF0dHJzWzY0XTtcXG4rXFx0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFxcdTAwMjZyKTtcXG4rXFxuK1xcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIG5hbWUgbWF0Y2hpbmcgbm8gdHJhbnNwb3J0IGNsYXNzIG11c3QgYmUgcmVmdXNlZCBiZWZvcmUgbmZzZF9tdXRleCBpc1xcbisgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHNcXG4rICogcmVxdWVzdF9tb2R1bGUoXFxcInN2YyVzXFxcIiwgbmFtZSkgdXBjYWxsLlxcbisgKi9cXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9iYWRfdHJhbnNwb3J0KVxcbit7XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwiYm9ndXNfeHBydFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRFWFBFQ1RfRVEoLUVQUk9UT05PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9hZGRyX3Rvb19zaG9ydClcXG4re1xcbitcXHR1bnNpZ25lZCBjaGFyIHRpbnkgPSAwO1xcbitcXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXFxcInRjcFxcXCIsIC5lbWl0X2FkZHIgPSAxLFxcbitcXHRcXHRcXHRcXHQgIC5hZGRyID0gXFx1MDAyNnRpbnksIC5hZGRyX2xlbiA9IDEgfTtcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcXHUwMDI2cik7XFxuK1xcbitcXHRFWFBFQ1RfRVEoLUVJTlZBTCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9pbmV0X3Nob3J0KVxcbit7XFxuK1xcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XFxuK1xcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcXFwidGNwXFxcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXFx1MDAyNnM0LFxcbitcXHRcXHRcXHRcXHQgIC5hZGRyX2xlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgKyAyIH07XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXFx1MDAyNnIpO1xcbitcXG4rXFx0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XFxuK31cXG4rXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldDZfc2hvcnQpXFxuK3tcXG4rXFx0c3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XFxuK1xcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcXFwidGNwXFxcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXFx1MDAyNnM2LFxcbitcXHRcXHRcXHRcXHQgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXFx1MDAyNnIpO1xcbitcXG4rXFx0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XFxuK31cXG4rXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX2ZhbWlseSlcXG4re1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHsgLnNzX2ZhbWlseSA9IEFGX1VOSVggfTtcXG4rXFx0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFxcXCJ0Y3BcXFwiLCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSBcXHUwMDI2c3MsXFxuK1xcdFxcdFxcdFxcdCAgLmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgfTtcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcXHUwMDI2cik7XFxuK1xcbitcXHRFWFBFQ1RfRVEoLUVBRk5PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9zZWNvbmRfZW50cnlfYmFkKVxcbit7XFxuK1xcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9O1xcbitcXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIGJhZCA9IHsgLnhwcnQgPSBcXFwidGNwXFxcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXFx1MDAyNnNzLFxcbitcXHRcXHRcXHRcXHQgICAgLmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgfTtcXG4rXFx0Y2hhciBhdHRyc1sxMjhdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXFx1MDAyNmJhZCk7XFxuK1xcdC8qIFRoZSB3aG9sZSByZXF1ZXN0IGlzIHJlamVjdGVkIGR1cmluZyB2YWxpZGF0aW9uOyBub3RoaW5nIGFwcGxpZWQuICovXFxuK1xcdEVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIHJlamVjdGVkIHJlcXVlc3QgbXVzdCBsZWF2ZSB0aGUgbGlzdGVuZXJzIHRoYXQgYXJlIGFscmVhZHkgdXAgYWxvbmUuXFxuKyAqIFRoZSBlcnJubyBhbG9uZSBkb2VzIG5vdCBzaG93IHRoYXQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCkgcmV0dXJuc1xcbisgKiAtRVBST1RPTk9TVVBQT1JUIGZvciBhbiB1bmtub3duIG5hbWUgdG9vLiBXaGF0IGRpZmZlcnMgaXMgaG93IGZhciB0aGVcXG4rICogcmVxdWVzdCBnZXRzIC0tIHdpdGhvdXQgdGhlIGNoZWNrIGluIG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKCksXFxuKyAqIG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoKSBoYXMgYWxyZWFkeSBtb3ZlZCB0aGUgdW5tYXRjaGVkIHRjcCBsaXN0ZW5lclxcbisgKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGVcXG4rICogbmFtZSBmYWlscy5cXG4rICovXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfcmVqZWN0X2tlZXBzX2xpc3RlbmVycylcXG4re1xcbitcXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcXG4rXFx0Y2hhciBnb29kWzY0XSwgYmFkWzY0XTtcXG4rXFx0aW50IG9nID0gcHV0X2xpc3RlbmVyKGdvb2QsIDAsIFxcXCJ0Y3BcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYmFkLCAwLCBcXFwiYm9ndXNfeHBydFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGdvb2QsIG9nKSk7XFxuK1xcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XFxuK1xcbitcXHRFWFBFQ1RfRVEoLUVQUk9UT05PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGJhZCwgb2IpKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XFxuK1xcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXFxcInRjcFxcXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xcbit9XFxuK1xcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gZnVuY3Rpb25hbCAvIHJvdW5kLXRyaXAgPT09PT09PT09PT09PT09PT09PT09ICovXFxuK1xcbisvKiBMSVNURU5FUl9HRVQgd2l0aCBubyBzZXJ2IGluIHRoaXMgbmV0bnMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiAqL1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19nZXRfZW1wdHkpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdGNwKVxcbit7XFxuK1xcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xcbitcXHRjaGFyIGF0dHJzWzY0XTtcXG4rXFx0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXFxcInRjcFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rXFx0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcXG4rXFx0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCBcXFwidGNwXFxcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XFxuK1xcdEVYUEVDVF9FUShodG9ubChJTkFERFJfTE9PUEJBQ0spLCBnb3RbMF0uYTQuc19hZGRyKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX3VkcClcXG4re1xcbitcXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFxcXCJ1ZHBcXFwiLCBURVNUX1BPUlQpO1xcbitcXG4rXFx0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XFxuK1xcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XFxuK1xcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXFxcInVkcFxcXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfbXVsdGkpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgYXR0cnNbMTI4XTtcXG4rXFx0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXFxcInRjcFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXFxcInVkcFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbitcXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFxcXCJ0Y3BcXFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcXG4rXFx0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcXFwidWRwXFxcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XFxuK31cXG4rXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lkZW1wb3RlbnQpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXHRcXHQvKiByZS1zZXQgc2FtZSBsaXN0ICovXFxuK1xcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XFxuK1xcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXFxcInRjcFxcXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19hZGQpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgb25lWzY0XSwgdHdvWzEyOF07XFxuK1xcdGludCBvMSA9IHB1dF9saXN0ZW5lcihvbmUsIDAsIFxcXCJ0Y3BcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdG8yID0gcHV0X2xpc3RlbmVyKHR3bywgbzIsIFxcXCJ1ZHBcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTtcXG4rXFx0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7XFx0XFx0LyogYWRkIHVkcCwga2VlcCB0Y3AgKi9cXG4rXFx0QVNTRVJUX0VRKDIsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcXG4rXFx0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcXFwidGNwXFxcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XFxuK1xcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXFxcInVkcFxcXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19yZW1vdmVfc3Vic2V0KVxcbit7XFxuK1xcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xcbitcXHRjaGFyIGJvdGhbMTI4XSwgb25lWzY0XTtcXG4rXFx0aW50IG9iID0gcHV0X2xpc3RlbmVyKGJvdGgsIDAsIFxcXCJ0Y3BcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRpbnQgb28gPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdG9iID0gcHV0X2xpc3RlbmVyKGJvdGgsIG9iLCBcXFwidWRwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFx0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChib3RoLCBvYikpO1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgb28pKTtcXHRcXHQvKiBkcm9wIHVkcCAqL1xcbitcXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbitcXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFxcXCJ0Y3BcXFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfZW1wdHlfZGVzdHJveXMpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcXHRcXHQvKiBlbXB0eSAtXFx1MDAzZSBkZXN0cm95IHNlcnYgKi9cXG4rXFx0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfaXB2NilcXG4re1xcbitcXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdGludCBvZmYsIHM7XFxuK1xcbitcXHRzID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7XFxuK1xcdGlmIChzIFxcdTAwM2MgMClcXG4rXFx0XFx0U0tJUChyZXR1cm4sIFxcXCJJUHY2IHVuYXZhaWxhYmxlOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdGNsb3NlKHMpO1xcbitcXG4rXFx0b2ZmID0gcHV0X2xpc3RlbmVyX2FmKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgQUZfSU5FVDYsIFRFU1RfUE9SVCk7XFxuK1xcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbitcXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFxcXCJ0Y3BcXFwiLCBBRl9JTkVUNiwgVEVTVF9QT1JUKSk7XFxuK1xcdEVYUEVDVF9FUSgwLCBtZW1jbXAoXFx1MDAyNmdvdFswXS5hNiwgXFx1MDAyNmluNmFkZHJfbG9vcGJhY2ssIHNpemVvZihpbjZhZGRyX2xvb3BiYWNrKSkpO1xcbit9XFxuK1xcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gcnBjYmluZCByZWdpc3RyYXRpb24gPT09PT09PT09PT09PT09PT09PT09ICovXFxuK1xcbisvKlxcbisgKiBBIHJwY2JpbmQgdGhhdCByZWZ1c2VzIHRoZSByZWdpc3RyYXRpb24gbXVzdCBmYWlsIGxpc3RlbmVyIGNyZWF0aW9uLFxcbisgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLlxcbisgKlxcbisgKiBUaGUgZXJyb3IgaGFzIHRvIHN1cnZpdmUgc3ZjX3JlZ2lzdGVyKCkncyB3YWxrIG92ZXIgc3ZfcHJvZ3JhbXMgdG8gZ2V0XFxuKyAqIGhlcmUuIFdpdGggQ09ORklHX05GU19MT0NBTElPPXkgdGhlIHRyYWlsaW5nIG5mc2xvY2FsaW8gcHJvZ3JhbSBoYXMgb25seVxcbisgKiBhIE5VTEwgYW5kIGEgdnNfaGlkZGVuIHZlcnNpb24sIGFuZCBzdmNfZ2VuZXJpY19ycGNiaW5kX3NldCgpIHJlcG9ydHMgMFxcbisgKiBmb3IgYm90aCwgc28gYW4gc3ZjX3JlZ2lzdGVyKCkgdGhhdCBrZWVwcyB0aGUgbGFzdCByZXN1bHQgcmF0aGVyIHRoYW4gdGhlXFxuKyAqIGZpcnN0IGhhbmRzIGJhY2sgc3VjY2VzcyBhbmQgdGhlIGxpc3RlbmVyIGNvbWVzIHVwIHJlZ2FyZGxlc3MuXFxuKyAqL1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX3JlZ2lzdGVyX3JlZnVzZWQpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCBycGNiX3N0dWJfcmVzdGFydChcXHUwMDI2c2VsZi1cXHUwMDNlcnBjYmQsIFJQQ0JfU1RVQl9SRUZVU0UpKTtcXG4rXFxuK1xcdEVYUEVDVF9FUSgtRUFDQ0VTLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbit9XFxuK1xcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gdGhyZWFkcyAvIC1FQlVTWSBzZW1hbnRpY3MgPT09PT09PT09PT09PT09PT09PT09ICovXFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fY2hhbmdlKVxcbit7XFxuK1xcdGNoYXIgb25lWzY0XSwgdHdvWzEyOF07XFxuK1xcdGludCBvMSA9IHB1dF9saXN0ZW5lcihvbmUsIDAsIFxcXCJ0Y3BcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdG8yID0gcHV0X2xpc3RlbmVyKHR3bywgbzIsIFxcXCJ1ZHBcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTtcXG4rXFx0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcXHRcXHRcXHQvKiB0aHJlYWRzIG5vdyBydW5uaW5nICovXFxuK1xcdEVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7XFx0LyogYWRkIHJlZnVzZWQgKi9cXG4rXFx0dGhyZWFkc19zZXQoMCk7XFx0XFx0XFx0XFx0XFx0Lyogc3RvcCBiZWZvcmUgbmV0bnMgZXhpdCAqL1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fcmVtb3ZlKVxcbit7XFxuK1xcdGNoYXIgb25lWzY0XTtcXG4rXFx0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXFxcInRjcFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTtcXG4rXFx0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcXG4rXFx0RVhQRUNUX0VRKC1FQlVTWSwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcXHQvKiByZW1vdmUgcmVmdXNlZCAqL1xcbitcXHR0aHJlYWRzX3NldCgwKTtcXG4rfVxcbitcXG4rVEVTVF9IQVJORVNTX01BSU5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3NcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjYwOTFiNDVkMjI2YmFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5nc1xcbkBAIC0wLDAgKzEgQEBcXG4rdGltZW91dD0xMjBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6Mzk6NDAuNzg3MzM5ODc5WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NDcxMTczMTY0ODEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTkZTRFwiLFxuICAgIFwiTkZTRF9WNFwiLFxuICAgIFwiU1VOUlBDXCIsXG4gICAgXCJORVRfTlNcIixcbiAgICBcIklQVjZcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0XCIsXG4gICAgXCJzdmNfcmVnaXN0ZXJcIixcbiAgICBcInJwY2JfY3JlYXRlX2xvY2FsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjAxZWI3MDQ4ZmQxY2MzNzE5NTFmNThhZjAwY2MyNTBmOWUyYmFjM1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDEwIDIxOjM5OjM3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmNcbmluZGV4IDdlMWQ1YTVkNjUxMWUuLmY3M2EyZWE0MjU1NzEgMTAwNjQ0XG4tLS0gYS9mcy9uZnNkL25mc2N0bC5jXG4rKysgYi9mcy9uZnNkL25mc2N0bC5jXG5AQCAtMTk3MywyMSArMTk3MywzOSBAQCBpbnQgbmZzZF9ubF92ZXJzaW9uX2dldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbisvKlxuKyAqIFRyYW5zcG9ydCBjbGFzc2VzIE5GU0Qga25vd3MgaG93IHRvIGluc3RhbnRpYXRlLiBWZXR0aW5nIHRoZSBuYW1lIGhlcmVcbisgKiBrZWVwcyBhIGJvZ3VzIHN0cmluZyBmcm9tIHJlYWNoaW5nIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCksIHdoZXJlIGFuXG4rICogdW5rbm93biBuYW1lIHRyaWdnZXJzIGEgcmVxdWVzdF9tb2R1bGUoXCJzdmMlc1wiLCBuYW1lKSB1cGNhbGwgdW5kZXJcbisgKiBuZnNkX211dGV4LlxuKyAqL1xuK3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3VwcG9ydGVkW10gPSB7IFwidGNwXCIsIFwidWRwXCIsIFwicmRtYVwiIH07XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoc3VwcG9ydGVkKTsgaSsrKVxuK1x0XHRpZiAoIXN0cmNtcChuYW1lLCBzdXBwb3J0ZWRbaV0pKVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisvKiBVcHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBhIHNpbmdsZSByZXF1ZXN0IG1heSBjYXJyeS4gKi9cbisjZGVmaW5lIE5GU0RfTkxfTElTVEVORVJfTUFYXHQxMDI0XG4rXG4gLyoqXG4gICogbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMgLSBzYW5pdHktY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgZnJvbSB1c2VybGFuZFxuICAqIEBpbmZvOiBuZXRsaW5rIG1ldGFkYXRhIGFuZCBjb21tYW5kIGFyZ3VtZW50c1xuICAqXG4tICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCBlYWNoIGVudHJ5XG4tICogaXMgd2VsbC1mb3JtZWQ6IGl0IHBhcnNlcyBhZ2FpbnN0IHRoZSBwb2xpY3ksIGNhcnJpZXMgYm90aCBhbiBhZGRyZXNzIGFuZFxuLSAqIGEgdHJhbnNwb3J0IG5hbWUsIGFuZCB0aGUgYWRkcmVzcyBpcyBsb25nIGVub3VnaCBmb3IgaXRzIGZhbWlseS4gRG9pbmdcbi0gKiB0aGlzIHVwIGZyb250IGxldHMgdGhlIGNhbGxlcnMgYmVsb3cgYXNzdW1lIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkIGFuZFxuLSAqIGd1YXJhbnRlZXMgd2UgbWFrZSBubyBjaGFuZ2VzIHdoZW4gdGhlIHJlcXVlc3QgaXMgbWFsZm9ybWVkLlxuKyAqIFdhbGsgZXZlcnkgTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgYXR0cmlidXRlIGFuZCBjb25maXJtIHRoYXQgdGhlIGxpc3QgaXNcbisgKiBub3Qgb3ZlcnNpemVkIGFuZCB0aGF0IGVhY2ggZW50cnkgaXMgd2VsbC1mb3JtZWQuXG4gICpcbiAgKiBSZXR1cm46IDAgaWYgZXZlcnkgZW50cnkgaXMgdmFsaWQsIG9yIGEgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlLlxuICAqL1xuIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiB7XG4gXHRjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyO1xuK1x0dW5zaWduZWQgaW50IGNvdW50ID0gMDtcbiBcdGludCByZW07XG4gXG4gXHRubG1zZ19mb3JfZWFjaF9hdHRyX3R5cGUoYXR0ciwgTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIsIGluZm8tXHUwMDNlbmxoZHIsXG5AQCAtMTk5Niw2ICsyMDE0LDExIEBAIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdFx0c3RydWN0IHNvY2thZGRyICpzYTtcbiBcdFx0aW50IGVycjtcbiBcbitcdFx0aWYgKCsrY291bnQgXHUwMDNlIE5GU0RfTkxfTElTVEVORVJfTUFYKSB7XG4rXHRcdFx0TkxfU0VUX0VSUl9NU0coaW5mby1cdTAwM2VleHRhY2ssIFwidG9vIG1hbnkgbGlzdGVuZXJzXCIpO1xuK1x0XHRcdHJldHVybiAtRTJCSUc7XG4rXHRcdH1cbitcbiBcdFx0ZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgTkZTRF9BX1NPQ0tfTUFYLCBhdHRyLFxuIFx0XHRcdFx0ICAgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXHUwMDNlZXh0YWNrKTtcbiBcdFx0aWYgKGVyciBcdTAwM2MgMClcbkBAIC0yMDA0LDYgKzIwMjcsOSBAQCBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRcdGlmICghdGJbTkZTRF9BX1NPQ0tfQUREUl0gfHwgIXRiW05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbitcdFx0aWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpXG4rXHRcdFx0cmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7XG4rXG4gXHRcdHNhID0gbmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfQUREUl0pO1xuIFx0XHRpZiAobmxhX2xlbih0YltORlNEX0FfU09DS19BRERSXSkgXHUwMDNjIHNpemVvZihzYS1cdTAwM2VzYV9mYW1pbHkpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTIxNTYsOCArMjE4MiwxMiBAQCBpbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRyZXQgPSBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYShzZXJ2LCB4Y2xfbmFtZSwgbmV0LCBzYSwgMCxcbiBcdFx0XHRcdFx0ICAgICAgY3VycmVudF9jcmVkKCkpO1xuIFx0XHQvKiBhbHdheXMgc2F2ZSB0aGUgbGF0ZXN0IGVycm9yICovXG4tXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbitcdFx0XHROTF9TRVRfRVJSX01TR19GTVQoaW5mby1cdTAwM2VleHRhY2ssXG4rXHRcdFx0XHRcdCAgIFwiY2Fubm90IGNyZWF0ZSAlcyBsaXN0ZW5lcjogJWRcIixcbitcdFx0XHRcdFx0ICAgeGNsX25hbWUsIHJldCk7XG4gXHRcdFx0ZXJyID0gcmV0O1xuK1x0XHR9XG4gXHR9XG4gXG4gXHRpZiAoIXNlcnYtXHUwMDNlc3ZfbnJ0aHJlYWRzIFx1MDAyNlx1MDAyNiBsaXN0X2VtcHR5KFx1MDAyNm5uLVx1MDAzZW5mc2Rfc2Vydi1cdTAwM2Vzdl9wZXJtc29ja3MpKVxuZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjYl9jbG50LmMgYi9uZXQvc3VucnBjL3JwY2JfY2xudC5jXG5pbmRleCA2YWEzNzIxODhjODZhLi4wYWEzNzZiODJhNTI2IDEwMDY0NFxuLS0tIGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuY1xuKysrIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuY1xuQEAgLTIyMSw2ICsyMjEsMTYgQEAgc3RhdGljIHZvaWQgcnBjYl9zZXRfbG9jYWwoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsXG4gIyBkZWZpbmUgU1VOX0xFTihwdHIpIChvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKVx0XHRcXFxuIFx0XHQgICAgICArIDEgKyBzdHJsZW4oKHB0ciktXHUwMDNlc3VuX3BhdGggKyAxKSlcbiBcbisvKlxuKyAqIFRoZSBrZXJuZWwncyBycGNiaW5kIGNsaWVudCB0YWxrcyBvbmx5IHRvIHRoZSBsb2NhbCBycGNiaW5kLCBvdmVyIGxvb3BiYWNrXG4rICogb3IgYSBsb2NhbCBBRl9MT0NBTCBzb2NrZXQsIHdoZXJlIGEgaGVhbHRoeSBycGNiaW5kIGFuc3dlcnMgaW4gbWljcm9zZWNvbmRzLlxuKyAqL1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX3RpbWVvdXQgcnBjYl9sb2NhbF90aW1lb3V0ID0ge1xuK1x0LnRvX2luaXR2YWxcdD0gMSAqIEhaLFxuK1x0LnRvX21heHZhbFx0PSAxICogSFosXG4rXHQudG9fcmV0cmllc1x0PSAwLFxuK307XG4rXG4gLypcbiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8gdmFsdWVcbiAgKiBpcyByZXR1cm5lZC5cbkBAIC0yMzgsNiArMjQ4LDcgQEAgc3RhdGljIGludCBycGNiX2NyZWF0ZV9hZl9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsXG4gXHRcdC52ZXJzaW9uXHQ9IFJQQ0JWRVJTXzIsXG4gXHRcdC5hdXRoZmxhdm9yXHQ9IFJQQ19BVVRIX05VTEwsXG4gXHRcdC5jcmVkXHRcdD0gY3VycmVudF9jcmVkKCksXG4rXHRcdC50aW1lb3V0XHQ9IFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcbiBcdFx0LypcbiBcdFx0ICogV2UgdHVybiBvZmYgdGhlIGlkbGUgdGltZW91dCB0byBwcmV2ZW50IHRoZSBrZXJuZWxcbiBcdFx0ICogZnJvbSBhdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3RpbmcgdGhlIHNvY2tldC5cbkBAIC0zMTIsNiArMzIzLDcgQEAgc3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF9uZXQoc3RydWN0IG5ldCAqbmV0KVxuIFx0XHQudmVyc2lvblx0PSBSUENCVkVSU18yLFxuIFx0XHQuYXV0aGZsYXZvclx0PSBSUENfQVVUSF9VTklYLFxuIFx0XHQuY3JlZFx0XHQ9IGN1cnJlbnRfY3JlZCgpLFxuK1x0XHQudGltZW91dFx0PSBcdTAwMjZycGNiX2xvY2FsX3RpbWVvdXQsXG4gXHRcdC5mbGFnc1x0XHQ9IFJQQ19DTE5UX0NSRUFURV9OT1BJTkcsXG4gXHR9O1xuIFx0c3RydWN0IHJwY19jbG50ICpjbG50LCAqY2xudDQ7XG5kaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmMuYyBiL25ldC9zdW5ycGMvc3ZjLmNcbmluZGV4IDA1YzNlNmUyZjY1OTQuLmU5Y2ZjZWIxYTMzNDIgMTAwNjQ0XG4tLS0gYS9uZXQvc3VucnBjL3N2Yy5jXG4rKysgYi9uZXQvc3VucnBjL3N2Yy5jXG5AQCAtMTIwOCwxMyArMTIwOCwxNiBAQCBpbnQgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0LFxuIFx0XHRzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2dwID0gXHUwMDI2c2Vydi1cdTAwM2Vzdl9wcm9ncmFtc1twXTtcbiBcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcHJvZ3AtXHUwMDNlcGdfbnZlcnM7IGkrKykge1xuK1x0XHRcdGludCByZXQ7XG4gXG4tXHRcdFx0ZXJyb3IgPSBwcm9ncC1cdTAwM2VwZ19ycGNiaW5kX3NldChuZXQsIHByb2dwLCBpLFxuK1x0XHRcdHJldCA9IHByb2dwLVx1MDAzZXBnX3JwY2JpbmRfc2V0KG5ldCwgcHJvZ3AsIGksXG4gXHRcdFx0XHRcdGZhbWlseSwgcHJvdG8sIHBvcnQpO1xuLVx0XHRcdGlmIChlcnJvciBcdTAwM2MgMCkge1xuK1x0XHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbiBcdFx0XHRcdHByaW50ayhLRVJOX1dBUk5JTkcgXCJzdmM6IGZhaWxlZCB0byByZWdpc3RlciBcIlxuIFx0XHRcdFx0XHRcIiVzdiV1IFJQQyBzZXJ2aWNlIChlcnJubyAlZCkuXFxuXCIsXG4tXHRcdFx0XHRcdHByb2dwLVx1MDAzZXBnX25hbWUsIGksIC1lcnJvcik7XG4rXHRcdFx0XHRcdHByb2dwLVx1MDAzZXBnX25hbWUsIGksIC1yZXQpO1xuK1x0XHRcdFx0aWYgKCFlcnJvcilcbitcdFx0XHRcdFx0ZXJyb3IgPSByZXQ7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4gXHRcdH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5pbmRleCA4NDM0M2ZkMWUzNTRiLi40NjA1MDhkZTkzNzRmIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5AQCAtODksNiArODksNyBAQCBUQVJHRVRTICs9IG5ldC9wYWNrZXRkcmlsbFxuIFRBUkdFVFMgKz0gbmV0L3BwcFxuIFRBUkdFVFMgKz0gbmV0L3Jkc1xuIFRBUkdFVFMgKz0gbmV0L3RjcF9hb1xuK1RBUkdFVFMgKz0gbmZzZFxuIFRBUkdFVFMgKz0gbm9saWJjXG4gVEFSR0VUUyArPSBwY2lfZW5kcG9pbnRcbiBUQVJHRVRTICs9IHBjaWVfYndjdHJsXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTllNmRlYzA0ZDhlOVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlXG5AQCAtMCwwICsxIEBAXG4rbmZzZF9uZXRsaW5rX2xpc3RlbmVyXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xNWFjNjU1NDlkMjU5XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlXG5AQCAtMCwwICsxLDYgQEBcbisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rQ0ZMQUdTICs9ICQoS0hEUl9JTkNMVURFUykgLVdhbGxcbitcbitURVNUX0dFTl9QUk9HUyA6PSBuZnNkX25ldGxpbmtfbGlzdGVuZXJcbitcbitpbmNsdWRlIC4uL2xpYi5ta1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWdcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lNjk0NWZmOTU1MWM0XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL2NvbmZpZ1xuQEAgLTAsMCArMSw0IEBAXG4rQ09ORklHX05FVF9OUz15XG4rQ09ORklHX0lQVjY9eVxuK0NPTkZJR19ORlNEPXlcbitDT05GSUdfTkZTRF9WND15XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zZTMzMDc2ODBkN2Q0XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jXG5AQCAtMCwwICsxLDkyMCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBSZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUgTkZTRCBnZW5lcmljLW5ldGxpbmsgbGlzdGVuZXIgaW50ZXJmYWNlXG4rICogKE5GU0RfQ01EX0xJU1RFTkVSX1NFVCAvIE5GU0RfQ01EX0xJU1RFTkVSX0dFVCkuXG4rICpcbisgKiBUaHJlZSBncm91cHM6XG4rICogICB2YWxpZGF0aW9uICAtIG1hbGZvcm1lZC9hYnVzaXZlIExJU1RFTkVSX1NFVCByZXF1ZXN0cyBhcmUgcmVqZWN0ZWQgYnlcbisgKiAgICAgICAgICAgICAgICAgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwgYmVmb3JlIG5mc2RfbXV0ZXggaXMgdGFrZW4uXG4rICogICBmdW5jdGlvbmFsICAtIGNyZWF0ZS9hZGQvcmVtb3ZlIGxpc3RlbmVycyBhbmQgdmVyaWZ5IExJU1RFTkVSX0dFVFxuKyAqICAgICAgICAgICAgICAgICByZWZsZWN0cyB0aGUgc2V0IChyb3VuZC10cmlwIG9mIHRyYW5zcG9ydCArIGFkZHI6cG9ydCkuXG4rICogICBzZW1hbnRpY3MgICAtIG9uY2UgdGhyZWFkcyBhcmUgcnVubmluZyAoVEhSRUFEU19TRVQpIGEgbGlzdGVuZXIgY2hhbmdlXG4rICogICAgICAgICAgICAgICAgIGlzIHJlZnVzZWQgd2l0aCAtRUJVU1kuXG4rICpcbisgKiBFYWNoIHRlc3QgcnVucyBpbiBpdHMgb3duIHByaXZhdGUgbmV0ICsgbW91bnQgbmFtZXNwYWNlICh1bnNoYXJlIGluXG4rICogRklYVFVSRV9TRVRVUCkuIC9ydW4gaXMgbWFza2VkIHRoZXJlOiBhIHBhdGhuYW1lIEFGX0xPQ0FMIGNvbm5lY3QgaXMgbm90XG4rICogc2NvcGVkIGJ5IHRoZSBuZXR3b3JrIG5hbWVzcGFjZSwgc2luY2UgdW5peF9maW5kX2JzZCgpIHJlc29sdmVzIGJ5IGlub2RlXG4rICogYW5kIHRha2VzIG5vIHN0cnVjdCBuZXQsIHNvIHRoZSBrZXJuZWwncyBycGNiaW5kIGNsaWVudCB3b3VsZCBvdGhlcndpc2UgYmVcbisgKiBhYmxlIHRvIHJlYWNoIHRoZSBycGNiaW5kIHJ1bm5pbmcgb24gdGhlIGhvc3QuIEFueXRoaW5nIHRoYXQgY3JlYXRlcyBhXG4rICogc2VydiBpcyBzZXJ2ZWQgYnkgdGhlIHBlci1uZXRucyBycGNiaW5kIHN0dWIgYmVsb3cgaW5zdGVhZC5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NjaGVkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGRlZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21vdW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvcHJjdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy90aW1lLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvaWYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY25ldGluZXQvaW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldGxpbmsuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2dlbmV0bGluay5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCIuLi9rc2VsZnRlc3RfaGFybmVzcy5oXCJcbitcbisvKiBORlNEIGdlbmVyaWMtbmV0bGluayBjb25zdGFudHMgKGZyb20gbGludXgvbmZzZF9uZXRsaW5rLmgpLiAqL1xuKyNkZWZpbmUgTkZTRF9GQU1JTFlfTkFNRVx0XHRcIm5mc2RcIlxuKyNkZWZpbmUgTkZTRF9DTURfVEhSRUFEU19TRVRcdFx0MlxuKyNkZWZpbmUgTkZTRF9DTURfTElTVEVORVJfU0VUXHRcdDZcbisjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX0dFVFx0XHQ3XG4rI2RlZmluZSBORlNEX0FfU0VSVkVSX1RIUkVBRFNcdFx0MVxuKyNkZWZpbmUgTkZTRF9BX1NFUlZFUl9TT0NLX0FERFJcdFx0MVx0LyogcGVyLWxpc3RlbmVyIG5lc3QgKi9cbisjZGVmaW5lIE5GU0RfQV9TT0NLX0FERFJcdFx0MVx0LyogaW5zaWRlIHRoZSBuZXN0ICovXG4rI2RlZmluZSBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRVx0Mlx0LyogaW5zaWRlIHRoZSBuZXN0ICovXG4rXG4rI2RlZmluZSBOTEFfQUxJR040KGxlbilcdFx0XHQoKChsZW4pICsgMykgXHUwMDI2IH4zKVxuKyNkZWZpbmUgVEVTVF9QT1JUXHRcdFx0MjAwNDlcbisjZGVmaW5lIE1BWF9MSVNURU5FUlNcdFx0XHQ4XG4rI2RlZmluZSBSRUNWX1RJTUVPX1NFQ1x0XHRcdDMwXG4rXG4rc3RhdGljIGludCBuZnNkX2ZhbWlseTtcdFx0XHQvKiBzZXQgcGVyLXRlc3QgaW4gRklYVFVSRV9TRVRVUCAqL1xuK1xuK3N0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICptc2cpXG4re1xuK1x0cGVycm9yKG1zZyk7XG4rXHRleGl0KDEpO1xuK31cbitcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIG1pbmltYWwgZ2VuZXJpYy1uZXRsaW5rIHBsdW1iaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbitcbitzdGF0aWMgaW50IGdlbmxfb3Blbih2b2lkKVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9ubCBzYSA9IHsgLm5sX2ZhbWlseSA9IEFGX05FVExJTksgfTtcbitcdHN0cnVjdCB0aW1ldmFsIHR2ID0geyAudHZfc2VjID0gUkVDVl9USU1FT19TRUMgfTtcbitcdGludCBmZCA9IHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19HRU5FUklDKTtcbitcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0ZGllKFwic29ja2V0KE5FVExJTktfR0VORVJJQylcIik7XG4rXHRpZiAoYmluZChmZCwgKHZvaWQgKilcdTAwMjZzYSwgc2l6ZW9mKHNhKSkgXHUwMDNjIDApXG4rXHRcdGRpZShcImJpbmQobmV0bGluaylcIik7XG4rXHRzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgXHUwMDI2dHYsIHNpemVvZih0dikpO1xuK1x0cmV0dXJuIGZkO1xuK31cbitcbisvKiBBcHBlbmQgYW4gYXR0cmlidXRlIGF0IEBvZmY7IHJldHVybiB0aGUgbmV3IChhbGlnbmVkKSBvZmZzZXQuICovXG4rc3RhdGljIGludCBwdXRfYXR0cihjaGFyICpidWYsIGludCBvZmYsIHVpbnQxNl90IHR5cGUsXG4rXHRcdCAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKVxuK3tcbitcdHN0cnVjdCBubGF0dHIgKm5hID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcbitcbitcdG5hLVx1MDAzZW5sYV90eXBlID0gdHlwZTtcbitcdG5hLVx1MDAzZW5sYV9sZW4gPSBOTEFfSERSTEVOICsgbGVuO1xuK1x0aWYgKGxlbilcbitcdFx0bWVtY3B5KGJ1ZiArIG9mZiArIE5MQV9IRFJMRU4sIGRhdGEsIGxlbik7XG4rXHRyZXR1cm4gb2ZmICsgTkxBX0FMSUdONChOTEFfSERSTEVOICsgbGVuKTtcbit9XG4rXG4rLyogQnVpbGQgYSBnZW5sIG1lc3NhZ2UgaGVhZGVyIGludG8gQGJ1ZjsgcmV0dXJuIHRoZSBvZmZzZXQgcGFzdCBpdC4gKi9cbitzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKVxuK3tcbitcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4rXHRzdHJ1Y3QgZ2VubG1zZ2hkciAqZ25sID0gKHZvaWQgKikoYnVmICsgTkxNU0dfSERSTEVOKTtcbitcbitcdG1lbXNldChidWYsIDAsIE5MTVNHX0hEUkxFTiArIEdFTkxfSERSTEVOKTtcbitcdG5saC1cdTAwM2VubG1zZ190eXBlID0gdHlwZTtcbitcdG5saC1cdTAwM2VubG1zZ19mbGFncyA9IGZsYWdzO1xuK1x0bmxoLVx1MDAzZW5sbXNnX3NlcSA9IDE7XG4rXHRnbmwtXHUwMDNlY21kID0gY21kO1xuK1x0Z25sLVx1MDAzZXZlcnNpb24gPSAxO1xuK1x0cmV0dXJuIE5MTVNHX0hEUkxFTiArIEdFTkxfSERSTEVOO1xuK31cbitcbisvKiBTZW5kIGFuIG5mc2QgY29tbWFuZCB3aXRoIGFuIEFDSzsgcmV0dXJuIHRoZSBBQ0sgZXJybm8gKFx1MDAzYz0gMCkuICovXG4rc3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKVxuK3tcbitcdGNoYXIgYnVmWzEgXHUwMDNjXHUwMDNjIDIwXSwgcmJ1Zls0MDk2XTtcbitcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4rXHRpbnQgZmQgPSBnZW5sX29wZW4oKTtcbitcdGludCBvZmYsIG4sIHJldDtcbitcbitcdG9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0ssIGNtZCk7XG4rXHRpZiAoYXR0cnNfbGVuKSB7XG4rXHRcdG1lbWNweShidWYgKyBvZmYsIGF0dHJzLCBhdHRyc19sZW4pO1xuK1x0XHRvZmYgKz0gYXR0cnNfbGVuO1xuK1x0fVxuK1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbitcbitcdGlmIChzZW5kKGZkLCBidWYsIG9mZiwgMCkgXHUwMDNjIDApXG4rXHRcdGRpZShcInNlbmQoZ2VubClcIik7XG4rXG4rXHRuID0gcmVjdihmZCwgcmJ1Ziwgc2l6ZW9mKHJidWYpLCAwKTtcbitcdGlmIChuIFx1MDAzYyAwKVxuK1x0XHRyZXQgPSAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSA/IC1FVElNRURPVVQgOiAtZXJybm87XG4rXHRlbHNlIGlmICgoKHN0cnVjdCBubG1zZ2hkciAqKXJidWYpLVx1MDAzZW5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpXG4rXHRcdHJldCA9ICgoc3RydWN0IG5sbXNnZXJyICopTkxNU0dfREFUQShyYnVmKSktXHUwMDNlZXJyb3I7XG4rXHRlbHNlXG4rXHRcdHJldCA9IDA7XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKiBTZW5kIGEgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBmdWxsIHJlcGx5IG1lc3NhZ2U7IC1lcnJubyBvbiBmYWlsdXJlLiAqL1xuK3N0YXRpYyBpbnQgZ2VubF9yZXF1ZXN0X3JlcGx5KHVpbnQ4X3QgY21kLCBjaGFyICpyYnVmLCBzaXplX3Qgcmxlbilcbit7XG4rXHRjaGFyIGJ1ZlsyNTZdO1xuK1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbitcdGludCBmZCA9IGdlbmxfb3BlbigpO1xuK1x0aW50IG9mZiwgbiwgcmV0O1xuK1xuK1x0b2ZmID0gZ2VubF9oZHIoYnVmLCBuZnNkX2ZhbWlseSwgTkxNX0ZfUkVRVUVTVCwgY21kKTtcbitcdG5saC1cdTAwM2VubG1zZ19sZW4gPSBvZmY7XG4rXG4rXHRpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApIFx1MDAzYyAwKVxuK1x0XHRkaWUoXCJzZW5kKGdlbmwgcmVwbHkpXCIpO1xuK1xuK1x0biA9IHJlY3YoZmQsIHJidWYsIHJsZW4sIDApO1xuK1x0aWYgKG4gXHUwMDNjIDApXG4rXHRcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcbitcdGVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbitcdFx0cmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS1cdTAwM2VlcnJvcjtcbitcdGVsc2VcbitcdFx0cmV0ID0gbjtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qIFJlc29sdmUgdGhlIFwibmZzZFwiIGdlbmwgZmFtaWx5IGlkOyAtMSBpZiBub3QgcmVnaXN0ZXJlZC4gKi9cbitzdGF0aWMgaW50IGdlbmxfcmVzb2x2ZV9uZnNkKHZvaWQpXG4re1xuK1x0Y2hhciBidWZbMTAyNF0sIHJidWZbNDA5Nl07XG4rXHRzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmO1xuK1x0c3RydWN0IG5sbXNnaGRyICpyaCA9ICh2b2lkICopcmJ1ZjtcbitcdHN0cnVjdCBubGF0dHIgKm5hO1xuK1x0aW50IGZkLCBvZmYsIGxlZnQsIGlkID0gLTE7XG4rXG4rXHRmZCA9IGdlbmxfb3BlbigpO1xuK1x0b2ZmID0gZ2VubF9oZHIoYnVmLCBHRU5MX0lEX0NUUkwsIE5MTV9GX1JFUVVFU1QsIENUUkxfQ01EX0dFVEZBTUlMWSk7XG4rXHRvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLFxuK1x0XHQgICAgICAgTkZTRF9GQU1JTFlfTkFNRSwgc2l6ZW9mKE5GU0RfRkFNSUxZX05BTUUpKTtcbitcdG5saC1cdTAwM2VubG1zZ19sZW4gPSBvZmY7XG4rXG4rXHRpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApIFx1MDAzYyAwKVxuK1x0XHRkaWUoXCJzZW5kKEdFVEZBTUlMWSlcIik7XG4rXHRpZiAocmVjdihmZCwgcmJ1Ziwgc2l6ZW9mKHJidWYpLCAwKSBcdTAwM2MgMClcbitcdFx0ZGllKFwicmVjdihHRVRGQU1JTFkpXCIpO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0aWYgKHJoLVx1MDAzZW5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdG5hID0gKHZvaWQgKikoKGNoYXIgKilOTE1TR19EQVRBKHJoKSArIEdFTkxfSERSTEVOKTtcbitcdGxlZnQgPSByaC1cdTAwM2VubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjtcbitcdHdoaWxlIChsZWZ0IFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XG4rXHRcdGlmIChuYS1cdTAwM2VubGFfdHlwZSA9PSBDVFJMX0FUVFJfRkFNSUxZX0lEKSB7XG4rXHRcdFx0aWQgPSAqKHVpbnQxNl90ICopKChjaGFyICopbmEgKyBOTEFfSERSTEVOKTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRsZWZ0IC09IE5MQV9BTElHTjQobmEtXHUwMDNlbmxhX2xlbik7XG4rXHRcdG5hID0gKHZvaWQgKikoKGNoYXIgKiluYSArIE5MQV9BTElHTjQobmEtXHUwMDNlbmxhX2xlbikpO1xuK1x0fVxuK1x0cmV0dXJuIGlkO1xuK31cbitcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGxpc3RlbmVyIHJlcXVlc3QgYnVpbGRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuK1xuKy8qIEZpbmUtZ3JhaW5lZCBjb250cm9sIGZvciBuZWdhdGl2ZSB0ZXN0czogYW55IGZpZWxkIGNhbiBiZSBvbWl0dGVkL21hbGZvcm1lZC4gKi9cbitzdHJ1Y3QgcmF3X2xpc3RlbmVyIHtcbitcdGNvbnN0IGNoYXIgKnhwcnQ7XHQvKiBOVUxMIC1cdTAwM2Ugb21pdCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSAqL1xuK1x0aW50IGVtaXRfYWRkcjtcdFx0LyogMCAtXHUwMDNlIG9taXQgTkZTRF9BX1NPQ0tfQUREUiAqL1xuK1x0Y29uc3Qgdm9pZCAqYWRkcjtcbitcdGludCBhZGRyX2xlbjtcdFx0LyogYnl0ZXMgdG8gZW1pdCBmb3IgTkZTRF9BX1NPQ0tfQUREUiAqL1xuK307XG4rXG4rc3RhdGljIGludCBwdXRfcmF3X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3Qgc3RydWN0IHJhd19saXN0ZW5lciAqcilcbit7XG4rXHRzdHJ1Y3QgbmxhdHRyICpuZXN0ID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcbitcdGludCBpbm5lciA9IG9mZiArIE5MQV9IRFJMRU47XG4rXG4rXHRpZiAoci1cdTAwM2VlbWl0X2FkZHIpXG4rXHRcdGlubmVyID0gcHV0X2F0dHIoYnVmLCBpbm5lciwgTkZTRF9BX1NPQ0tfQUREUiwgci1cdTAwM2VhZGRyLCByLVx1MDAzZWFkZHJfbGVuKTtcbitcdGlmIChyLVx1MDAzZXhwcnQpXG4rXHRcdGlubmVyID0gcHV0X2F0dHIoYnVmLCBpbm5lciwgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUsXG4rXHRcdFx0XHQgci1cdTAwM2V4cHJ0LCBzdHJsZW4oci1cdTAwM2V4cHJ0KSArIDEpO1xuK1x0bmVzdC1cdTAwM2VubGFfdHlwZSA9IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIHwgTkxBX0ZfTkVTVEVEO1xuK1x0bmVzdC1cdTAwM2VubGFfbGVuID0gaW5uZXIgLSBvZmY7XG4rXHRyZXR1cm4gb2ZmICsgTkxBX0FMSUdONChuZXN0LVx1MDAzZW5sYV9sZW4pO1xuK31cbitcbisvKiBXZWxsLWZvcm1lZCBsb29wYmFjayBsaXN0ZW5lciBmb3IgQGZhbWlseSAoQUZfSU5FVCBvciBBRl9JTkVUNikuICovXG4rc3RhdGljIGludCBwdXRfbGlzdGVuZXJfYWYoY2hhciAqYnVmLCBpbnQgb2ZmLCBjb25zdCBjaGFyICp4cHJ0LCBpbnQgZmFtaWx5LFxuK1x0XHRcdCAgIHVpbnQxNl90IHBvcnQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7MH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0geHBydCwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2c3MgfTtcbitcbitcdGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHtcbitcdFx0c3RydWN0IHNvY2thZGRyX2luNiAqczYgPSAodm9pZCAqKVx1MDAyNnNzO1xuK1xuK1x0XHRzNi1cdTAwM2VzaW42X2ZhbWlseSA9IEFGX0lORVQ2O1xuK1x0XHRzNi1cdTAwM2VzaW42X3BvcnQgPSBodG9ucyhwb3J0KTtcbitcdFx0czYtXHUwMDNlc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjaztcbitcdFx0ci5hZGRyX2xlbiA9IHNpemVvZigqczYpO1xuK1x0fSBlbHNlIHtcbitcdFx0c3RydWN0IHNvY2thZGRyX2luICpzNCA9ICh2b2lkICopXHUwMDI2c3M7XG4rXG4rXHRcdHM0LVx1MDAzZXNpbl9mYW1pbHkgPSBBRl9JTkVUO1xuK1x0XHRzNC1cdTAwM2VzaW5fcG9ydCA9IGh0b25zKHBvcnQpO1xuK1x0XHRzNC1cdTAwM2VzaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spO1xuK1x0XHRyLmFkZHJfbGVuID0gc2l6ZW9mKCpzNCk7XG4rXHR9XG4rXHRyZXR1cm4gcHV0X3Jhd19saXN0ZW5lcihidWYsIG9mZiwgXHUwMDI2cik7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgdWludDE2X3QgcG9ydClcbit7XG4rXHRyZXR1cm4gcHV0X2xpc3RlbmVyX2FmKGJ1Ziwgb2ZmLCB4cHJ0LCBBRl9JTkVULCBwb3J0KTtcbit9XG4rXG4rLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBMSVNURU5FUl9HRVQgcGFyc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rc3RydWN0IGxpc3RlbmVyX2VudCB7XG4rXHRjaGFyIHhwcnRbMTZdO1xuK1x0aW50IGZhbWlseTtcbitcdHVpbnQxNl90IHBvcnQ7XG4rXHRzdHJ1Y3QgaW5fYWRkciBhNDtcbitcdHN0cnVjdCBpbjZfYWRkciBhNjtcbit9O1xuK1xuK3N0YXRpYyBpbnQgcGFyc2VfbGlzdGVuZXJfZ2V0KGNvbnN0IGNoYXIgKnJidWYsIGludCBsZW4sXG4rXHRcdFx0ICAgICAgc3RydWN0IGxpc3RlbmVyX2VudCAqb3V0LCBpbnQgbWF4KVxuK3tcbitcdGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHZvaWQgKilyYnVmO1xuK1x0Y29uc3Qgc3RydWN0IG5sYXR0ciAqbmE7XG4rXHRpbnQgbGVmdCwgY291bnQgPSAwO1xuK1xuK1x0KHZvaWQpbGVuO1xuK1x0bmEgPSAoY29uc3Qgdm9pZCAqKShyYnVmICsgTkxNU0dfSERSTEVOICsgR0VOTF9IRFJMRU4pO1xuK1x0bGVmdCA9IG5saC1cdTAwM2VubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjtcbitcbitcdHdoaWxlIChsZWZ0IFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XG4rXHRcdGludCBhbGVuID0gbmEtXHUwMDNlbmxhX2xlbjtcbitcbitcdFx0aWYgKChuYS1cdTAwM2VubGFfdHlwZSBcdTAwMjYgTkxBX1RZUEVfTUFTSykgPT0gTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBjb3VudCBcdTAwM2MgbWF4KSB7XG4rXHRcdFx0Y29uc3Qgc3RydWN0IG5sYXR0ciAqaW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICsgTkxBX0hEUkxFTik7XG4rXHRcdFx0aW50IGlsZWZ0ID0gYWxlbiAtIE5MQV9IRFJMRU47XG4rXHRcdFx0c3RydWN0IGxpc3RlbmVyX2VudCAqZSA9IFx1MDAyNm91dFtjb3VudF07XG4rXG4rXHRcdFx0bWVtc2V0KGUsIDAsIHNpemVvZigqZSkpO1xuK1x0XHRcdHdoaWxlIChpbGVmdCBcdTAwM2U9IChpbnQpTkxBX0hEUkxFTikge1xuK1x0XHRcdFx0Y29uc3Qgdm9pZCAqZCA9IChjb25zdCBjaGFyICopaW4gKyBOTEFfSERSTEVOO1xuK1x0XHRcdFx0aW50IHQgPSBpbi1cdTAwM2VubGFfdHlwZSBcdTAwMjYgTkxBX1RZUEVfTUFTSztcbitcbitcdFx0XHRcdGlmICh0ID09IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FKSB7XG4rXHRcdFx0XHRcdHN0cm5jcHkoZS1cdTAwM2V4cHJ0LCBkLCBzaXplb2YoZS1cdTAwM2V4cHJ0KSAtIDEpO1xuK1x0XHRcdFx0fSBlbHNlIGlmICh0ID09IE5GU0RfQV9TT0NLX0FERFIpIHtcbitcdFx0XHRcdFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzID0gZDtcbitcbitcdFx0XHRcdFx0ZS1cdTAwM2VmYW1pbHkgPSBzcy1cdTAwM2Vzc19mYW1pbHk7XG4rXHRcdFx0XHRcdGlmIChzcy1cdTAwM2Vzc19mYW1pbHkgPT0gQUZfSU5FVCkge1xuK1x0XHRcdFx0XHRcdGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqcyA9IGQ7XG4rXG4rXHRcdFx0XHRcdFx0ZS1cdTAwM2VhNCA9IHMtXHUwMDNlc2luX2FkZHI7XG4rXHRcdFx0XHRcdFx0ZS1cdTAwM2Vwb3J0ID0gbnRvaHMocy1cdTAwM2VzaW5fcG9ydCk7XG4rXHRcdFx0XHRcdH0gZWxzZSBpZiAoc3MtXHUwMDNlc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7XG4rXHRcdFx0XHRcdFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqcyA9IGQ7XG4rXG4rXHRcdFx0XHRcdFx0ZS1cdTAwM2VhNiA9IHMtXHUwMDNlc2luNl9hZGRyO1xuK1x0XHRcdFx0XHRcdGUtXHUwMDNlcG9ydCA9IG50b2hzKHMtXHUwMDNlc2luNl9wb3J0KTtcbitcdFx0XHRcdFx0fVxuK1x0XHRcdFx0fVxuK1x0XHRcdFx0aWxlZnQgLT0gTkxBX0FMSUdONChpbi1cdTAwM2VubGFfbGVuKTtcbitcdFx0XHRcdGluID0gKGNvbnN0IHZvaWQgKikoKGNoYXIgKilpbiArIE5MQV9BTElHTjQoaW4tXHUwMDNlbmxhX2xlbikpO1xuK1x0XHRcdH1cbitcdFx0XHRjb3VudCsrO1xuK1x0XHR9XG4rXHRcdGxlZnQgLT0gTkxBX0FMSUdONChhbGVuKTtcbitcdFx0bmEgPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICsgTkxBX0FMSUdONChhbGVuKSk7XG4rXHR9XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gY29udmVuaWVuY2Ugd3JhcHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuK1xuK3N0YXRpYyBpbnQgbGlzdGVuZXJfc2V0KGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgbGVuKVxuK3tcbitcdHJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfTElTVEVORVJfU0VULCBhdHRycywgbGVuKTtcbit9XG4rXG4rLyogRmV0Y2ggdGhlIGN1cnJlbnQgbGlzdGVuZXJzOyByZXR1cm5zIGNvdW50IChcdTAwM2U9MCkgb3IgLWVycm5vLiAqL1xuK3N0YXRpYyBpbnQgbGlzdGVuZXJfZ2V0KHN0cnVjdCBsaXN0ZW5lcl9lbnQgKm91dCwgaW50IG1heClcbit7XG4rXHRjaGFyIHJidWZbODE5Ml07XG4rXHRpbnQgbiA9IGdlbmxfcmVxdWVzdF9yZXBseShORlNEX0NNRF9MSVNURU5FUl9HRVQsIHJidWYsIHNpemVvZihyYnVmKSk7XG4rXG4rXHRpZiAobiBcdTAwM2MgMClcbitcdFx0cmV0dXJuIG47XG4rXHRyZXR1cm4gcGFyc2VfbGlzdGVuZXJfZ2V0KHJidWYsIG4sIG91dCwgbWF4KTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmZpbmRfbGlzdGVuZXIoc3RydWN0IGxpc3RlbmVyX2VudCAqZSwgaW50IG4sXG4rXHRcdFx0XHRcdCAgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSxcbitcdFx0XHRcdFx0ICB1aW50MTZfdCBwb3J0KVxuK3tcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKVxuK1x0XHRpZiAoZVtpXS5mYW1pbHkgPT0gZmFtaWx5IFx1MDAyNlx1MDAyNiBlW2ldLnBvcnQgPT0gcG9ydCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICFzdHJjbXAoZVtpXS54cHJ0LCB4cHJ0KSlcbitcdFx0XHRyZXR1cm4gXHUwMDI2ZVtpXTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiBTdGFydCAoQG4gXHUwMDNlIDApIG9yIHN0b3AgKEBuID09IDApIG5mc2QgdGhyZWFkcyBpbiB0aGlzIG5ldG5zLiAqL1xuK3N0YXRpYyBpbnQgdGhyZWFkc19zZXQoaW50IG4pXG4re1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHR1aW50MzJfdCB2ID0gbjtcbitcdGludCBvZmYgPSBwdXRfYXR0cihhdHRycywgMCwgTkZTRF9BX1NFUlZFUl9USFJFQURTLCBcdTAwMjZ2LCBzaXplb2YodikpO1xuK1xuK1x0cmV0dXJuIGdlbmxfcmVxdWVzdChORlNEX0NNRF9USFJFQURTX1NFVCwgYXR0cnMsIG9mZik7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyLW5ldG5zIGxvY2FsIHJwY2JpbmQgc3R1YiAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rLypcbisgKiBDcmVhdGluZyBhIGxpc3RlbmVyIHJlZ2lzdGVycyB3aXRoIHJwY2JpbmQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKClcbisgKiBwYXNzZXMgZmxhZ3Mgb2YgMCwgc28gcG1hcF9yZWdpc3RlciBpcyB0cnVlIGluIHN2Y19zZXR1cF9zb2NrZXQoKSwgYW5kXG4rICogbmZzZF92ZXJzaW9uMyBpcyByZWdpc3RlcmFibGUgYnkgZGVmYXVsdCBhbmQgZG9lcyBub3Qgc2V0IHZzX3JwY2Jfb3B0bmwsXG4rICogc28gYSByZWdpc3RyYXRpb24gZmFpbHVyZSBhYm9ydHMgbGlzdGVuZXIgY3JlYXRpb24uIFRoZSBhYnN0cmFjdCBBRl9MT0NBTFxuKyAqIG5hbWUgdGhlIGtlcm5lbCB0cmllcyBmaXJzdCBpcyBwZXItbmV0bnMgKHVuaXhfZmluZF9hYnN0cmFjdCgpIHRha2VzIGFcbisgKiBzdHJ1Y3QgbmV0KSwgc28gYW5zd2VyIGl0IGhlcmUgYW5kIHN0YXkgb3V0IG9mIHRoZSBob3N0J3MgcnBjYmluZC5cbisgKlxuKyAqIEFyZ3VtZW50cyBhcmUgbmV2ZXIgZGVjb2RlZC4gVGhlIE5VTEwgcHJvY2VkdXJlIGdldHMgYW4gZW1wdHkgc3VjY2VzcyBhbmRcbisgKiBTRVQvVU5TRVQgZ2V0IFRSVUUsIGZvciBib3RoIFJQQ0JWRVJTXzIgYW5kIFJQQ0JWRVJTXzQuIHY0IGhhcyB0byBiZVxuKyAqIGFuc3dlcmVkIGJlY2F1c2UgX19zdmNfcnBjYl9yZWdpc3RlcjYoKSB0dXJucyBhIHY0IHJlZnVzYWwgaW50b1xuKyAqIC1FQUZOT1NVUFBPUlQsIHdoaWNoIHdvdWxkIGZhaWwgZXZlcnkgSVB2NiBsaXN0ZW5lci5cbisgKlxuKyAqIEluIFJQQ0JfU1RVQl9SRUZVU0UgbW9kZSBTRVQgaXMgYW5zd2VyZWQgRkFMU0UgaW5zdGVhZCwgd2hpY2hcbisgKiBycGNiX3JlZ2lzdGVyX2NhbGwoKSByZXBvcnRzIGFzIC1FQUNDRVMuIFVOU0VUIGlzIGxlZnQgYWxvbmU6IG9ubHlcbisgKiBzdmNfdW5yZWdpc3RlcigpIGlzc3VlcyBpdCwgYW5kIGl0IGRpc2NhcmRzIHRoZSByZXN1bHQuXG4rICovXG4rI2RlZmluZSBSUENCX1BST0dSQU1cdFx0MTAwMDAwXG4rI2RlZmluZSBSUENCX1BST0NfTlVMTFx0XHQwXG4rI2RlZmluZSBSUENCX1BST0NfU0VUXHRcdDFcbisjZGVmaW5lIFJQQ0JfUFJPQ19VTlNFVFx0XHQyXG4rI2RlZmluZSBSUENCX0FCU1RSQUNUX05BTUVcdFwiL3J1bi9ycGNiaW5kLnNvY2tcIlxuKyNkZWZpbmUgUlBDQl9TVFVCX01BWENPTk5cdDRcbitcbitlbnVtIHsgUlBDQl9TVFVCX0FDQ0VQVCwgUlBDQl9TVFVCX1JFRlVTRSB9O1xuK1xuK3N0YXRpYyBpbnQgcnBjYl9zdHViX2xpc3Rlbih2b2lkKVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl91biBzdW4gPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9O1xuK1x0c2l6ZV90IG5sZW4gPSBzdHJsZW4oUlBDQl9BQlNUUkFDVF9OQU1FKTtcbitcdHNvY2tsZW5fdCBhbGVuO1xuK1x0aW50IGZkO1xuK1xuK1x0LyogQWJzdHJhY3QgbmFtZXMgYXJlIGxlbmd0aC1kZWxpbWl0ZWQsIHNvIHRoZSBsZW5ndGggbXVzdCBtYXRjaC4gKi9cbitcdG1lbWNweShzdW4uc3VuX3BhdGggKyAxLCBSUENCX0FCU1RSQUNUX05BTUUsIG5sZW4pO1xuK1x0YWxlbiA9IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpICsgMSArIG5sZW47XG4rXG4rXHRmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdGlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopXHUwMDI2c3VuLCBhbGVuKSBcdTAwM2MgMCB8fFxuK1x0ICAgIGxpc3RlbihmZCwgUlBDQl9TVFVCX01BWENPTk4pIFx1MDAzYyAwKSB7XG4rXHRcdGNsb3NlKGZkKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0cmV0dXJuIGZkO1xuK31cbitcbitzdGF0aWMgaW50IHJwY2Jfc3R1Yl9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKVxuK3tcbitcdHNpemVfdCBkb25lID0gMDtcbitcbitcdHdoaWxlIChkb25lIFx1MDAzYyBsZW4pIHtcbitcdFx0c3NpemVfdCBuID0gcmVhZChmZCwgKGNoYXIgKilidWYgKyBkb25lLCBsZW4gLSBkb25lKTtcbitcbitcdFx0aWYgKG4gXHUwMDNjPSAwKVxuK1x0XHRcdHJldHVybiAtMTtcbitcdFx0ZG9uZSArPSBuO1xuK1x0fVxuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIEhhbmRsZSBvbmUgcmVjb3JkLW1hcmtlZCBSUEMgY2FsbC4gUmV0dXJucyAtMSB3aGVuIHRoZSBwZWVyIGlzIGRvbmUuICovXG4rc3RhdGljIGludCBycGNiX3N0dWJfY2FsbChpbnQgZmQsIGludCBtb2RlKVxuK3tcbitcdHVpbnQzMl90IG1hcmssIGNhbGxbNl0sIHJlcFs3XTtcbitcdHVuc2lnbmVkIGludCBsZW4sIG5yZXAgPSA2O1xuK1x0c2l6ZV90IHJlcGxlbjtcbitcbitcdGlmIChycGNiX3N0dWJfcmVhZChmZCwgXHUwMDI2bWFyaywgc2l6ZW9mKG1hcmspKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0bGVuID0gbnRvaGwobWFyaykgXHUwMDI2IDB4N2ZmZmZmZmY7XG4rXHRpZiAobGVuIFx1MDAzYyBzaXplb2YoY2FsbCkgfHwgbGVuIFx1MDAzZSA0MDk2KVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdC8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqL1xuK1x0Zm9yIChsZW4gLT0gc2l6ZW9mKGNhbGwpOyBsZW47ICkge1xuK1x0XHRjaGFyIHNpbmtbMjU2XTtcbitcdFx0dW5zaWduZWQgaW50IG4gPSBsZW4gXHUwMDNlIHNpemVvZihzaW5rKSA/IHNpemVvZihzaW5rKSA6IGxlbjtcbitcbitcdFx0aWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBzaW5rLCBuKSlcbitcdFx0XHRyZXR1cm4gLTE7XG4rXHRcdGxlbiAtPSBuO1xuK1x0fVxuK1xuK1x0cmVwWzBdID0gY2FsbFswXTtcdFx0LyogeGlkICovXG4rXHRyZXBbMV0gPSBodG9ubCgxKTtcdFx0LyogUkVQTFkgKi9cbitcdHJlcFsyXSA9IGh0b25sKDApO1x0XHQvKiBNU0dfQUNDRVBURUQgKi9cbitcdHJlcFszXSA9IGh0b25sKDApO1x0XHQvKiB2ZXJpZmllciBmbGF2b3IgQVVUSF9OVUxMICovXG4rXHRyZXBbNF0gPSBodG9ubCgwKTtcdFx0LyogdmVyaWZpZXIgbGVuZ3RoICovXG4rXHRyZXBbNV0gPSBodG9ubCgwKTtcdFx0LyogU1VDQ0VTUyAqL1xuK1xuK1x0aWYgKG50b2hsKGNhbGxbM10pICE9IFJQQ0JfUFJPR1JBTSkge1xuK1x0XHRyZXBbNV0gPSBodG9ubCgxKTtcdC8qIFBST0dfVU5BVkFJTCAqL1xuK1x0fSBlbHNlIHtcbitcdFx0c3dpdGNoIChudG9obChjYWxsWzVdKSkge1xuK1x0XHRjYXNlIFJQQ0JfUFJPQ19OVUxMOlxuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJQQ0JfUFJPQ19TRVQ6XG4rXHRcdFx0cmVwWzZdID0gaHRvbmwobW9kZSA9PSBSUENCX1NUVUJfUkVGVVNFID8gMCA6IDEpO1xuK1x0XHRcdG5yZXAgPSA3O1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJQQ0JfUFJPQ19VTlNFVDpcbitcdFx0XHRyZXBbNl0gPSBodG9ubCgxKTtcdC8qIFRSVUUgKi9cbitcdFx0XHRucmVwID0gNztcbitcdFx0XHRicmVhaztcbitcdFx0ZGVmYXVsdDpcbitcdFx0XHRyZXBbNV0gPSBodG9ubCgzKTtcdC8qIFBST0NfVU5BVkFJTCAqL1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXBsZW4gPSBucmVwICogc2l6ZW9mKHJlcFswXSk7XG4rXHRtYXJrID0gaHRvbmwoMHg4MDAwMDAwMCB8IHJlcGxlbik7XG4rXHRpZiAod3JpdGUoZmQsIFx1MDAyNm1hcmssIHNpemVvZihtYXJrKSkgIT0gKHNzaXplX3Qpc2l6ZW9mKG1hcmspIHx8XG4rXHQgICAgd3JpdGUoZmQsIHJlcCwgcmVwbGVuKSAhPSAoc3NpemVfdClyZXBsZW4pXG4rXHRcdHJldHVybiAtMTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBycGNiX3N0dWJfc2VydmUoaW50IGxmZCwgaW50IG1vZGUpXG4re1xuK1x0c3RydWN0IHBvbGxmZCBwZmRbMSArIFJQQ0JfU1RVQl9NQVhDT05OXTtcbitcdG5mZHNfdCBuID0gMSwgaTtcbitcbitcdHBmZFswXS5mZCA9IGxmZDtcbitcbitcdGZvciAoOzspIHtcbitcdFx0Lyogc3RvcCBwb2xsaW5nIHRoZSBsaXN0ZW5lciB3aGVuIGZ1bGwsIG9yIHBvbGwoKSBzcGlucyAqL1xuK1x0XHRwZmRbMF0uZXZlbnRzID0gbiBcdTAwM2MgMSArIFJQQ0JfU1RVQl9NQVhDT05OID8gUE9MTElOIDogMDtcbitcbitcdFx0aWYgKHBvbGwocGZkLCBuLCAtMSkgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuO1xuK1xuK1x0XHRpZiAocGZkWzBdLnJldmVudHMgXHUwMDI2IFBPTExJTikge1xuK1x0XHRcdGludCBjID0gYWNjZXB0KGxmZCwgTlVMTCwgTlVMTCk7XG4rXG4rXHRcdFx0aWYgKGMgXHUwMDNlPSAwKSB7XG4rXHRcdFx0XHRwZmRbbl0uZmQgPSBjO1xuK1x0XHRcdFx0cGZkW25dLmV2ZW50cyA9IFBPTExJTjtcbitcdFx0XHRcdG4rKztcbitcdFx0XHR9XG4rXHRcdH1cbitcbitcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbjsgaSsrKSB7XG4rXHRcdFx0aWYgKCEocGZkW2ldLnJldmVudHMgXHUwMDI2IChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0aWYgKHJwY2Jfc3R1Yl9jYWxsKHBmZFtpXS5mZCwgbW9kZSkpIHtcbitcdFx0XHRcdGNsb3NlKHBmZFtpXS5mZCk7XG4rXHRcdFx0XHRwZmRbaV0gPSBwZmRbLS1uXTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbit9XG4rXG4rLyogUmV0dXJucyB0aGUgc3R1YidzIHBpZCwgb3IgLTEuIFRoZSBzb2NrZXQgaXMgbGlzdGVuaW5nIGJlZm9yZSB3ZSBmb3JrLiAqL1xuK3N0YXRpYyBwaWRfdCBycGNiX3N0dWJfc3RhcnQoaW50IG1vZGUpXG4re1xuK1x0aW50IGxmZCA9IHJwY2Jfc3R1Yl9saXN0ZW4oKTtcbitcdHBpZF90IHBpZDtcbitcbitcdGlmIChsZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHBpZCA9IGZvcmsoKTtcbitcdGlmIChwaWQgXHUwMDNjIDApIHtcbitcdFx0Y2xvc2UobGZkKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0aWYgKHBpZCA9PSAwKSB7XG4rXHRcdHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTtcbitcdFx0cHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lHS0lMTCk7XG4rXHRcdGlmIChnZXRwcGlkKCkgPT0gMSlcdFx0LyogcmFjZWQgd2l0aCBwYXJlbnQgZXhpdCAqL1xuK1x0XHRcdF9leGl0KDApO1xuK1x0XHRycGNiX3N0dWJfc2VydmUobGZkLCBtb2RlKTtcbitcdFx0X2V4aXQoMCk7XG4rXHR9XG4rXG4rXHRjbG9zZShsZmQpO1xuK1x0cmV0dXJuIHBpZDtcbit9XG4rXG4rLypcbisgKiBTd2FwIHRoZSBzdHViIGZvciBvbmUgaW4gQG1vZGUuIFNhZmUgYmVmb3JlIHRoZSBmaXJzdCByZXF1ZXN0OiBubyBzZXJ2XG4rICogZXhpc3RzIHlldCwgc28gdGhlIGtlcm5lbCBoYXMgbm90IGNvbm5lY3RlZCBhbmQgdGhlIGFic3RyYWN0IG5hbWUgaXMgZnJlZVxuKyAqIGFnYWluIG9uY2UgdGhlIG9sZCBzdHViIGhhcyBiZWVuIHJlYXBlZC5cbisgKi9cbitzdGF0aWMgaW50IHJwY2Jfc3R1Yl9yZXN0YXJ0KHBpZF90ICpwaWQsIGludCBtb2RlKVxuK3tcbitcdGlmICgqcGlkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoKnBpZCwgU0lHS0lMTCk7XG4rXHRcdHdhaXRwaWQoKnBpZCwgTlVMTCwgMCk7XG4rXHR9XG4rXHQqcGlkID0gcnBjYl9zdHViX3N0YXJ0KG1vZGUpO1xuK1x0cmV0dXJuICpwaWQgXHUwMDNlIDAgPyAwIDogLTE7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmaXh0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuK1xuK0ZJWFRVUkUobmZzZF9saXN0ZW5lcikge1xuK1x0cGlkX3QgcnBjYmQ7XG4rfTtcbitcbitGSVhUVVJFX1NFVFVQKG5mc2RfbGlzdGVuZXIpXG4re1xuK1x0c3RydWN0IGlmcmVxIGlmciA9IHswfTtcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1x0aW50IHM7XG4rXG4rXHRpZiAoZ2V0ZXVpZCgpICE9IDApXG4rXHRcdFNLSVAocmV0dXJuLCBcIm11c3QgYmUgcnVuIGFzIHJvb3RcIik7XG4rXHRpZiAodW5zaGFyZShDTE9ORV9ORVdORVQgfCBDTE9ORV9ORVdOUykgXHUwMDNjIDApXG4rXHRcdFNLSVAocmV0dXJuLCBcInVuc2hhcmUoTkVXTkVUfE5FV05TKTogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdGlmIChtb3VudChcIlwiLCBcIi9cIiwgTlVMTCwgTVNfUkVDIHwgTVNfUFJJVkFURSwgTlVMTCkgXHUwMDNjIDApXG4rXHRcdFNLSVAocmV0dXJuLCBcIm1vdW50KC8gcHJpdmF0ZSk6ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXG4rXHQvKlxuK1x0ICogS2VlcCB0aGUga2VybmVsJ3MgcnBjYmluZCBjbGllbnQgaW5zaWRlIHRoaXMgbmFtZXNwYWNlLiBUaGVcbitcdCAqIGFic3RyYWN0IHNvY2tldCBpdCB0cmllcyBmaXJzdCBpcyBwZXItbmV0bnMsIGJ1dCB0aGVcbitcdCAqIFwiL3Zhci9ydW4vcnBjYmluZC5zb2NrXCIgZmFsbGJhY2sgaXMgbm90LCBzbyBoaWRlIHRoZSBwYXRoLlxuK1x0ICovXG4rXHRpZiAobW91bnQoXCJ0bXBmc1wiLCBcIi9ydW5cIiwgXCJ0bXBmc1wiLCAwLCBOVUxMKSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwibW91bnQodG1wZnMgb24gL3J1bik6ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRpZiAobHN0YXQoXCIvdmFyL3J1blwiLCBcdTAwMjZzdCkgPT0gMCBcdTAwMjZcdTAwMjYgU19JU0RJUihzdC5zdF9tb2RlKSBcdTAwMjZcdTAwMjZcbitcdCAgICBtb3VudChcInRtcGZzXCIsIFwiL3Zhci9ydW5cIiwgXCJ0bXBmc1wiLCAwLCBOVUxMKSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwibW91bnQodG1wZnMgb24gL3Zhci9ydW4pOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1xuK1x0LyogQnJpbmcgbG9vcGJhY2sgdXAgc28gbGlzdGVuZXIgYmluZHMgKDEyNy4wLjAuMSAvIDo6MSkgd29yay4gKi9cbitcdHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7XG4rXHRBU1NFUlRfR0UocywgMCk7XG4rXHRzdHJjcHkoaWZyLmlmcl9uYW1lLCBcImxvXCIpO1xuK1x0QVNTRVJUX0VRKDAsIGlvY3RsKHMsIFNJT0NHSUZGTEFHUywgXHUwMDI2aWZyKSk7XG4rXHRpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUCB8IElGRl9SVU5OSU5HO1xuK1x0QVNTRVJUX0VRKDAsIGlvY3RsKHMsIFNJT0NTSUZGTEFHUywgXHUwMDI2aWZyKSk7XG4rXHRjbG9zZShzKTtcbitcbitcdG5mc2RfZmFtaWx5ID0gZ2VubF9yZXNvbHZlX25mc2QoKTtcbitcdGlmIChuZnNkX2ZhbWlseSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwibmZzZCBnZW5sIGZhbWlseSBub3QgZm91bmQgKG1vZHByb2JlIG5mc2Q/KVwiKTtcbitcbitcdHNlbGYtXHUwMDNlcnBjYmQgPSBycGNiX3N0dWJfc3RhcnQoUlBDQl9TVFVCX0FDQ0VQVCk7XG4rXHRpZiAoc2VsZi1cdTAwM2VycGNiZCBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwiY2Fubm90IHN0YXJ0IHRoZSBycGNiaW5kIHN0dWI6ICVzXCIsXG4rXHRcdCAgICAgc3RyZXJyb3IoZXJybm8pKTtcbit9XG4rXG4rRklYVFVSRV9URUFSRE9XTihuZnNkX2xpc3RlbmVyKVxuK3tcbitcdGlmIChzZWxmLVx1MDAzZXJwY2JkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoc2VsZi1cdTAwM2VycGNiZCwgU0lHS0lMTCk7XG4rXHRcdHdhaXRwaWQoc2VsZi1cdTAwM2VycGNiZCwgTlVMTCwgMCk7XG4rXHR9XG4rfVxuK1xuKy8qID09PT09PT09PT09PT09PT09PT09PSB2YWxpZGF0aW9uIC8gbmVnYXRpdmUgPT09PT09PT09PT09PT09PT09PT09ICovXG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9lbXB0eV9saXN0X29rKVxuK3tcbitcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3Rvb19tYW55KVxuK3tcbitcdHN0YXRpYyBjaGFyIGF0dHJzWzEgXHUwMDNjXHUwMDNjIDIwXTtcbitcdGludCBpLCBvZmYgPSAwO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgMTAyNTsgaSsrKVx0XHQvKiBcdTAwM2UgTkZTRF9OTF9MSVNURU5FUl9NQVggKDEwMjQpICovXG4rXHRcdG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgb2ZmLCBcInVkcFwiLCBURVNUX1BPUlQpO1xuK1x0RVhQRUNUX0VRKC1FMkJJRywgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9taXNzaW5nX2FkZHIpXG4re1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDAgfTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX21pc3NpbmdfdHJhbnNwb3J0KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gTlVMTCwgLmVtaXRfYWRkciA9IDEsXG4rXHRcdFx0XHQgIC5hZGRyID0gXHUwMDI2czQsIC5hZGRyX2xlbiA9IHNpemVvZihzNCkgfTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFx1MDAyNnIpO1xuK1xuK1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuKy8qXG4rICogQSBuYW1lIG1hdGNoaW5nIG5vIHRyYW5zcG9ydCBjbGFzcyBtdXN0IGJlIHJlZnVzZWQgYmVmb3JlIG5mc2RfbXV0ZXggaXNcbisgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHNcbisgKiByZXF1ZXN0X21vZHVsZShcInN2YyVzXCIsIG5hbWUpIHVwY2FsbC5cbisgKi9cbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2JhZF90cmFuc3BvcnQpXG4re1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcImJvZ3VzX3hwcnRcIiwgVEVTVF9QT1JUKTtcbitcbitcdEVYUEVDVF9FUSgtRVBST1RPTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2FkZHJfdG9vX3Nob3J0KVxuK3tcbitcdHVuc2lnbmVkIGNoYXIgdGlueSA9IDA7XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsXG4rXHRcdFx0XHQgIC5hZGRyID0gXHUwMDI2dGlueSwgLmFkZHJfbGVuID0gMSB9O1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4rXG4rXHRFWFBFQ1RfRVEoLUVJTlZBTCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9pbmV0X3Nob3J0KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2czQsXG4rXHRcdFx0XHQgIC5hZGRyX2xlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgKyAyIH07XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXQ2X3Nob3J0KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9pbjYgczYgPSB7IC5zaW42X2ZhbWlseSA9IEFGX0lORVQ2LCAuc2luNl9wb3J0ID0gaHRvbnMoVEVTVF9QT1JUKSB9O1xuK1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFwidGNwXCIsIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnM2LFxuK1x0XHRcdFx0ICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4rXG4rXHRFWFBFQ1RfRVEoLUVJTlZBTCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9iYWRfZmFtaWx5KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9O1xuK1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFwidGNwXCIsIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnNzLFxuK1x0XHRcdFx0ICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4rXG4rXHRFWFBFQ1RfRVEoLUVBRk5PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9zZWNvbmRfZW50cnlfYmFkKVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9O1xuK1x0c3RydWN0IHJhd19saXN0ZW5lciBiYWQgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2c3MsXG4rXHRcdFx0XHQgICAgLmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgfTtcbitcdGNoYXIgYXR0cnNbMTI4XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCBvZmYsIFx1MDAyNmJhZCk7XG4rXHQvKiBUaGUgd2hvbGUgcmVxdWVzdCBpcyByZWplY3RlZCBkdXJpbmcgdmFsaWRhdGlvbjsgbm90aGluZyBhcHBsaWVkLiAqL1xuK1x0RVhQRUNUX0VRKC1FQUZOT1NVUFBPUlQsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuKy8qXG4rICogQSByZWplY3RlZCByZXF1ZXN0IG11c3QgbGVhdmUgdGhlIGxpc3RlbmVycyB0aGF0IGFyZSBhbHJlYWR5IHVwIGFsb25lLlxuKyAqIFRoZSBlcnJubyBhbG9uZSBkb2VzIG5vdCBzaG93IHRoYXQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCkgcmV0dXJuc1xuKyAqIC1FUFJPVE9OT1NVUFBPUlQgZm9yIGFuIHVua25vd24gbmFtZSB0b28uIFdoYXQgZGlmZmVycyBpcyBob3cgZmFyIHRoZVxuKyAqIHJlcXVlc3QgZ2V0cyAtLSB3aXRob3V0IHRoZSBjaGVjayBpbiBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycygpLFxuKyAqIG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoKSBoYXMgYWxyZWFkeSBtb3ZlZCB0aGUgdW5tYXRjaGVkIHRjcCBsaXN0ZW5lclxuKyAqIG9mZiBzdl9wZXJtc29ja3MgYW5kIHJ1biBzdmNfeHBydF9kZXN0cm95X2FsbCgpIG9uIGl0IGJ5IHRoZSB0aW1lIHRoZVxuKyAqIG5hbWUgZmFpbHMuXG4rICovXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9yZWplY3Rfa2VlcHNfbGlzdGVuZXJzKVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBnb29kWzY0XSwgYmFkWzY0XTtcbitcdGludCBvZyA9IHB1dF9saXN0ZW5lcihnb29kLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1x0aW50IG9iID0gcHV0X2xpc3RlbmVyKGJhZCwgMCwgXCJib2d1c194cHJ0XCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGdvb2QsIG9nKSk7XG4rXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK1xuK1x0RVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChiYWQsIG9iKSk7XG4rXG4rXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCBcInRjcFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbit9XG4rXG4rLyogPT09PT09PT09PT09PT09PT09PT09IGZ1bmN0aW9uYWwgLyByb3VuZC10cmlwID09PT09PT09PT09PT09PT09PT09PSAqL1xuK1xuKy8qIExJU1RFTkVSX0dFVCB3aXRoIG5vIHNlcnYgaW4gdGhpcyBuZXRucyByZXR1cm5zIGFuIGVtcHR5IGxpc3QuICovXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfZ2V0X2VtcHR5KVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX3RjcClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rXHRFWFBFQ1RfRVEoaHRvbmwoSU5BRERSX0xPT1BCQUNLKSwgZ290WzBdLmE0LnNfYWRkcik7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2NyZWF0ZV91ZHApXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidWRwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfbXVsdGkpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGF0dHJzWzEyOF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0b2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbitcdEFTU0VSVF9FUSgyLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcInVkcFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfaWRlbXBvdGVudClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XHRcdC8qIHJlLXNldCBzYW1lIGxpc3QgKi9cbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19hZGQpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIG9uZVs2NF0sIHR3b1sxMjhdO1xuK1x0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcdGludCBvMiA9IHB1dF9saXN0ZW5lcih0d28sIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCBcInVkcFwiLCBURVNUX1BPUlQpO1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KHR3bywgbzIpKTtcdFx0LyogYWRkIHVkcCwga2VlcCB0Y3AgKi9cbitcdEFTU0VSVF9FUSgyLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcInVkcFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfcmVtb3ZlX3N1YnNldClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYm90aFsxMjhdLCBvbmVbNjRdO1xuK1x0aW50IG9iID0gcHV0X2xpc3RlbmVyKGJvdGgsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXHRpbnQgb28gPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0b2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgb2IsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGJvdGgsIG9iKSk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgb28pKTtcdFx0LyogZHJvcCB1ZHAgKi9cbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19lbXB0eV9kZXN0cm95cylcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7XHRcdC8qIGVtcHR5IC1cdTAwM2UgZGVzdHJveSBzZXJ2ICovXG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19pcHY2KVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmLCBzO1xuK1xuK1x0cyA9IHNvY2tldChBRl9JTkVUNiwgU09DS19TVFJFQU0sIDApO1xuK1x0aWYgKHMgXHUwMDNjIDApXG4rXHRcdFNLSVAocmV0dXJuLCBcIklQdjYgdW5hdmFpbGFibGU6ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRjbG9zZShzKTtcbitcbitcdG9mZiA9IHB1dF9saXN0ZW5lcl9hZihhdHRycywgMCwgXCJ0Y3BcIiwgQUZfSU5FVDYsIFRFU1RfUE9SVCk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidGNwXCIsIEFGX0lORVQ2LCBURVNUX1BPUlQpKTtcbitcdEVYUEVDVF9FUSgwLCBtZW1jbXAoXHUwMDI2Z290WzBdLmE2LCBcdTAwMjZpbjZhZGRyX2xvb3BiYWNrLCBzaXplb2YoaW42YWRkcl9sb29wYmFjaykpKTtcbit9XG4rXG4rLyogPT09PT09PT09PT09PT09PT09PT09IHJwY2JpbmQgcmVnaXN0cmF0aW9uID09PT09PT09PT09PT09PT09PT09PSAqL1xuK1xuKy8qXG4rICogQSBycGNiaW5kIHRoYXQgcmVmdXNlcyB0aGUgcmVnaXN0cmF0aW9uIG11c3QgZmFpbCBsaXN0ZW5lciBjcmVhdGlvbixcbisgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLlxuKyAqXG4rICogVGhlIGVycm9yIGhhcyB0byBzdXJ2aXZlIHN2Y19yZWdpc3RlcigpJ3Mgd2FsayBvdmVyIHN2X3Byb2dyYW1zIHRvIGdldFxuKyAqIGhlcmUuIFdpdGggQ09ORklHX05GU19MT0NBTElPPXkgdGhlIHRyYWlsaW5nIG5mc2xvY2FsaW8gcHJvZ3JhbSBoYXMgb25seVxuKyAqIGEgTlVMTCBhbmQgYSB2c19oaWRkZW4gdmVyc2lvbiwgYW5kIHN2Y19nZW5lcmljX3JwY2JpbmRfc2V0KCkgcmVwb3J0cyAwXG4rICogZm9yIGJvdGgsIHNvIGFuIHN2Y19yZWdpc3RlcigpIHRoYXQga2VlcHMgdGhlIGxhc3QgcmVzdWx0IHJhdGhlciB0aGFuIHRoZVxuKyAqIGZpcnN0IGhhbmRzIGJhY2sgc3VjY2VzcyBhbmQgdGhlIGxpc3RlbmVyIGNvbWVzIHVwIHJlZ2FyZGxlc3MuXG4rICovXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9yZWdpc3Rlcl9yZWZ1c2VkKVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIHJwY2Jfc3R1Yl9yZXN0YXJ0KFx1MDAyNnNlbGYtXHUwMDNlcnBjYmQsIFJQQ0JfU1RVQl9SRUZVU0UpKTtcbitcbitcdEVYUEVDVF9FUSgtRUFDQ0VTLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbit9XG4rXG4rLyogPT09PT09PT09PT09PT09PT09PT09IHRocmVhZHMgLyAtRUJVU1kgc2VtYW50aWNzID09PT09PT09PT09PT09PT09PT09PSAqL1xuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBzZW1fYnVzeV9vbl9jaGFuZ2UpXG4re1xuK1x0Y2hhciBvbmVbNjRdLCB0d29bMTI4XTtcbitcdGludCBvMSA9IHB1dF9saXN0ZW5lcihvbmUsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXHRpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0bzIgPSBwdXRfbGlzdGVuZXIodHdvLCBvMiwgXCJ1ZHBcIiwgVEVTVF9QT1JUKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvMSkpO1xuK1x0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcdFx0XHQvKiB0aHJlYWRzIG5vdyBydW5uaW5nICovXG4rXHRFWFBFQ1RfRVEoLUVCVVNZLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpO1x0LyogYWRkIHJlZnVzZWQgKi9cbitcdHRocmVhZHNfc2V0KDApO1x0XHRcdFx0XHQvKiBzdG9wIGJlZm9yZSBuZXRucyBleGl0ICovXG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBzZW1fYnVzeV9vbl9yZW1vdmUpXG4re1xuK1x0Y2hhciBvbmVbNjRdO1xuK1x0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvMSkpO1xuK1x0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcbitcdEVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7XHQvKiByZW1vdmUgcmVmdXNlZCAqL1xuK1x0dGhyZWFkc19zZXQoMCk7XG4rfVxuK1xuK1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3Ncbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MDkxYjQ1ZDIyNmJhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL3NldHRpbmdzXG5AQCAtMCwwICsxIEBAXG4rdGltZW91dD0xMjBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjM5OjQwLjc4NzM0MjQwOFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg2NTExMzAxNTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBORlMgYW5kIFJQQyBQYXRjaCBTZXJpZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHNlcmllcywgYW5kIGl0J3MgdG91Y2hpbmcgc29tZSBwcmV0dHkgY3JpdGljYWwgYXJlYXM6IGBmcy9uZnNkL25mc2N0bC5jYCwgYG5ldC9zdW5ycGMvcnBjYl9jbG50LmNgLCBhbmQgYG5ldC9zdW5ycGMvc3ZjLmNgLiBQbHVzLCB0aGVyZSdzIGEgbmV3IHNlbGZ0ZXN0LCB3aGljaCBpcyBhbHdheXMgZ29vZC4gTGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG5GaXJzdCwgYGZzL25mc2QvbmZzY3RsLmNgIGhhcyBjaGFuZ2VzIHRoYXQgYXJlIGFkZGluZyB2YWxpZGF0aW9uIGZvciB0cmFuc3BvcnQgY2xhc3NlcyB1c2luZyBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCBhbmQgbGltaXRpbmcgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgd2l0aCBgTkZTRF9OTF9MSVNURU5FUl9NQVhgLiBUaGlzIGlzIGltcG9ydGFudCBmb3Igcm9idXN0bmVzcyBhbmQgcHJldmVudGluZyByZXNvdXJjZSBleGhhdXN0aW9uLlxuXG5UaGVuLCBvdmVyIGluIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgdGhlcmUncyBhIHRpbWVvdXQgYmVpbmcgYWRkZWQgZm9yIGxvY2FsIHJwY2JpbmQgY2FsbHMgKGBycGNiX2xvY2FsX3RpbWVvdXRgKS4gVGhhdCdzIGxpa2VseSBhaW1lZCBhdCBoYW5kbGluZyBwb3RlbnRpYWwgYmxvY2tpbmcgc2NlbmFyaW9zIG1vcmUgZ3JhY2VmdWxseS5cblxuRmluYWxseSwgYG5ldC9zdW5ycGMvc3ZjLmNgIHNlZW1zIHRvIGJlIGZpeGluZyBhbiBlcnJvciBoYW5kbGluZyBpc3N1ZSBpbiBgc3ZjX3JlZ2lzdGVyYCwgbWFraW5nIGl0IHJldHVybiB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQsIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhhdC4gVGhpcyBpcyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IGNoYW5nZSB0aGF0IGltcHJvdmVzIHRoZSBlcnJvciByZXBvcnRpbmcuXG5cbkkgbmVlZCB0byBjb25maXJtIHRoZXNlIGZ1bmN0aW9ucycgcmVhY2hhYmlsaXR5IGFuZCBmdW5jdGlvbmFsIGltcGFjdCwgc28gSSBhbSBnb2luZyB0byBjaGVjayB0aG9zZSBmaWxlcyBzcGVjaWZpY2FsbHkuIEkndmUgbm90ZWQgdGhhdCBgZnMvbmZzZC9uZnNjdGwuY2AgaXMgdG91Y2hpbmcgYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYCBhbmQgYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AgaXMgZ29pbmcgdG8gZGVhbCB3aXRoIGBycGNiX2NyZWF0ZV9hZl9sb2NhbGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgLCBhbmQgYG5ldC9zdW5ycGMvc3ZjLmNgIGNoYW5nZXMgYXJlIGdvaW5nIHRvIGltcGFjdCBgc3ZjX3JlZ2lzdGVyYC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWZpbml0ZWx5IGNvcmUga2VybmVsIGxvZ2ljLCBhbmQgdGhlIGNoYW5nZXMgYXJlIGRlZmluaXRlbHkgcmVhY2hhYmxlIGFuZCB3aWxsIGhhdmUgZnVuY3Rpb25hbCBpbXBhY3QuXG5cbk5vdywgSSB3YW50IHRvIGNvbmZpcm0gd2hldGhlciB0aGVzZSBmdW5jdGlvbnMgYXJlIHN0YXRpYyBvciBub3QuIFRoaXMgYWZmZWN0cyB0aGVpciBzY29wZSBhbmQgaG93IHRoZXkncmUgdXNlZC5cbkkgZm91bmQgdGhhdCBgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnNgIGlzIHN0YXRpYywgd2hpbGUgYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgIGlzIG5vdC4gSW4gYG5ldC9zdW5ycGMvcnBjYl9jbG50LmNgLCBJIGNvbmZpcm1lZCB0aGF0IGJvdGggYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAgYXJlIHN0YXRpYy4gRmluYWxseSwgYHN2Y19yZWdpc3RlcmAgaW4gYG5ldC9zdW5ycGMvc3ZjLmNgIGlzIG5vdCBzdGF0aWMuXG5cbkknbSBnb2luZyB0byBsZXZlcmFnZSBgZ3JlcHBlcmAgbm93IHRvIHRyYWNrIGRvd24gYWxsIHRoZSBwcmVjaXNlIGRlZmluaXRpb25zIGFuZCB1c2FnZXMgb2YgZWFjaCBmdW5jdGlvbiB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MDI4LCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTI5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6Mzk6NDkuNDM4NDc1NjcyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNDE5Mzc3MjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9uZnNkL25ldGxpbmsuYz0xMjI9c3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX3NwbGl0X29wcyBuZnNkX25sX29wc1tdID0ge1xcbi0tXFxuZnMvbmZzZC9uZXRsaW5rLmMtMTUzLVxcdFxcdC5jbWRcXHRcXHQ9IE5GU0RfQ01EX0xJU1RFTkVSX1NFVCxcXG5mcy9uZnNkL25ldGxpbmsuYzoxNTQ6XFx0XFx0LmRvaXRcXHRcXHQ9IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQsXFxuZnMvbmZzZC9uZXRsaW5rLmMtMTU1LVxcdFxcdC5wb2xpY3lcXHRcXHQ9IG5mc2RfbGlzdGVuZXJfc2V0X25sX3BvbGljeSxcXG4tLVxcbmZzL25mc2QvbmV0bGluay5oPTI5PWludCBuZnNkX25sX3ZlcnNpb25fZ2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7XFxuZnMvbmZzZC9uZXRsaW5rLmg6MzA6aW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7XFxuZnMvbmZzZC9uZXRsaW5rLmgtMzEtaW50IG5mc2RfbmxfbGlzdGVuZXJfZ2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7XFxuLS1cXG5mcy9uZnNkL25mc2N0bC5jPTIwMDU9c3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYy0yMDU2LS8qKlxcbmZzL25mc2QvbmZzY3RsLmM6MjA1NzogKiBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0IC0gc2V0IHRoZSBuZnMgcnVubmluZyBzb2NrZXRzXFxuZnMvbmZzZC9uZnNjdGwuYy0yMDU4LSAqIEBza2I6IHJlcGx5IGJ1ZmZlclxcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYy0yMDYyLSAqL1xcbmZzL25mc2QvbmZzY3RsLmM6MjA2MzppbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbmZzL25mc2QvbmZzY3RsLmMtMjA2NC17XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jPTcxNj1URVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTczMy0gKiByZXF1ZXN0IGdldHMgLS0gd2l0aG91dCB0aGUgY2hlY2sgaW4gbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jOjczNDogKiBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KCkgaGFzIGFscmVhZHkgbW92ZWQgdGhlIHVubWF0Y2hlZCB0Y3AgbGlzdGVuZXJcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTczNS0gKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGVcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6Mzk6NTEuNTgwNDE4NDY5WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzAwOTIyMDYyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgaW5pdGlhbCB0aG91Z2h0cywgZnJhbWVkIGFzIGEgY29uY2lzZSBzdW1tYXJ5IGZvciBhbiBleHBlcnQ6XG5cbioqUHJpb3JpdGl6aW5nIEZ1enppbmcgVGFyZ2V0cyoqXG5cbkFscmlnaHQsIGxvb2tpbmcgYXQgdGhpcyBjb2RlLCBteSBtaW5kIGltbWVkaWF0ZWx5IGp1bXBzIHRvIGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YC4gU2VlbXMgbGlrZSBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gSXQncyBnb3QgdGhhdCBuZXR3b3JrIGludGVyYWN0aW9uIGVsZW1lbnQsIHdoaWNoIG9mdGVuIG1lYW5zIGNvbXBsZXggaW5wdXQgaGFuZGxpbmcgYW5kIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMuXG5cbk5vdywgSSdtIGFsc28gY29uc2lkZXJpbmcgYHN2Y19yZWdpc3RlcmAuIEl0J3MgYSBrZXkgZnVuY3Rpb24gZm9yIHNlcnZpY2UgcmVnaXN0cmF0aW9uLCBhbHdheXMgYSBzZW5zaXRpdmUgYXJlYSBmcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUuIEkgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIGRhdGEgZmxvd3MgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbiBwb2ludHMgaW4gdGhpcyBhcmVhLiBCb3RoIHNlZW0gbGlrZSBnb29kIHN0YXJ0aW5nIHBvaW50cywgYnV0IGl0J3MgaW1wb3J0YW50IHRvIGFzc2VzcyB3aGljaCBvbmUgcHJlc2VudHMgdGhlIG1vc3QgaW1tZWRpYXRlIHJpc2sgb3IgaGlnaGVzdCBwb3RlbnRpYWwgZm9yIHJld2FyZCBpbiB0ZXJtcyBvZiB1bmNvdmVyaW5nIHZ1bG5lcmFiaWxpdGllcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc4NDksIk91dHB1dFRva2VucyI6MTcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTozOTo1NC41ODk2NDI1MjRaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI3NzY2MDU3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdmNfcmVnaXN0ZXJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmg9NDc0PXZvaWRcXHRcXHQgICBzdmNfcHJvY2Vzc19iYyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHN2Y19ycXN0ICpycXN0cCk7XFxuaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmg6NDc1OmludFxcdFxcdCAgIHN2Y19yZWdpc3Rlcihjb25zdCBzdHJ1Y3Qgc3ZjX3NlcnYgKiwgc3RydWN0IG5ldCAqLCBjb25zdCBpbnQsXFxuaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgtNDc2LVxcdFxcdFxcdFxcdGNvbnN0IHVuc2lnbmVkIHNob3J0LCBjb25zdCB1bnNpZ25lZCBzaG9ydCk7XFxuLS1cXG5uZXQvc3VucnBjL3N2Yy5jPTEwNzQ9c3RhdGljIGludCBfX3N2Y19ycGNiX3JlZ2lzdGVyNihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHUzMiBwcm9ncmFtLFxcbi0tXFxubmV0L3N1bnJwYy9zdmMuYy0xMTE3LSAqL1xcbm5ldC9zdW5ycGMvc3ZjLmM6MTExODpzdGF0aWMgaW50IF9fc3ZjX3JlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCwgY29uc3QgY2hhciAqcHJvZ25hbWUsXFxubmV0L3N1bnJwYy9zdmMuYy0xMTE5LVxcdFxcdFxcdCAgY29uc3QgdTMyIHByb2dyYW0sIGNvbnN0IHUzMiB2ZXJzaW9uLFxcbi0tXFxubmV0L3N1bnJwYy9zdmMuYy0xMTM3LVxcbm5ldC9zdW5ycGMvc3ZjLmM6MTEzODpcXHR0cmFjZV9zdmNfcmVnaXN0ZXIocHJvZ25hbWUsIHZlcnNpb24sIGZhbWlseSwgcHJvdG9jb2wsIHBvcnQsIGVycm9yKTtcXG5uZXQvc3VucnBjL3N2Yy5jLTExMzktXFx0cmV0dXJuIGVycm9yO1xcbi0tXFxubmV0L3N1bnJwYy9zdmMuYz0xMTQzPWludCBzdmNfcnBjYmluZF9zZXRfdmVyc2lvbihzdHJ1Y3QgbmV0ICpuZXQsXFxuLS1cXG5uZXQvc3VucnBjL3N2Yy5jLTExNDgte1xcbm5ldC9zdW5ycGMvc3ZjLmM6MTE0OTpcXHRyZXR1cm4gX19zdmNfcmVnaXN0ZXIobmV0LCBwcm9ncC1cXHUwMDNlcGdfbmFtZSwgcHJvZ3AtXFx1MDAzZXBnX3Byb2csXFxubmV0L3N1bnJwYy9zdmMuYy0xMTUwLVxcdFxcdFxcdFxcdHZlcnNpb24sIGZhbWlseSwgcHJvdG8sIHBvcnQpO1xcbi0tXFxubmV0L3N1bnJwYy9zdmMuYz0xMTg0PUVYUE9SVF9TWU1CT0xfR1BMKHN2Y19nZW5lcmljX3JwY2JpbmRfc2V0KTtcXG4tLVxcbm5ldC9zdW5ycGMvc3ZjLmMtMTE4Ni0vKipcXG5uZXQvc3VucnBjL3N2Yy5jOjExODc6ICogc3ZjX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYW4gUlBDIHNlcnZpY2Ugd2l0aCB0aGUgbG9jYWwgcG9ydG1hcHBlclxcbm5ldC9zdW5ycGMvc3ZjLmMtMTE4OC0gKiBAc2Vydjogc3ZjX3NlcnYgc3RydWN0IGZvciB0aGUgc2VydmljZSB0byByZWdpc3Rlclxcbi0tXFxubmV0L3N1bnJwYy9zdmMuYy0xMTk1LSAqL1xcbm5ldC9zdW5ycGMvc3ZjLmM6MTE5NjppbnQgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0LFxcbm5ldC9zdW5ycGMvc3ZjLmMtMTE5Ny1cXHRcXHQgY29uc3QgaW50IGZhbWlseSwgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG8sXFxuLS1cXG5uZXQvc3VucnBjL3N2Y194cHJ0LmM9MTEwNz1zdGF0aWMgdm9pZCBzdmNfZGVsZXRlX3hwcnQoc3RydWN0IHN2Y194cHJ0ICp4cHJ0KVxcbi0tXFxubmV0L3N1bnJwYy9zdmNfeHBydC5jLTExMTgtXFxubmV0L3N1bnJwYy9zdmNfeHBydC5jOjExMTk6XFx0XFx0aWYgKHN2Y19yZWdpc3RlcihzZXJ2LCB4cHJ0LVxcdTAwM2V4cHRfbmV0LCBzb2NrLVxcdTAwM2Vzay1cXHUwMDNlc2tfZmFtaWx5LFxcbm5ldC9zdW5ycGMvc3ZjX3hwcnQuYy0xMTIwLVxcdFxcdFxcdFxcdCBzb2NrLVxcdTAwM2Vzay1cXHUwMDNlc2tfcHJvdG9jb2wsIDApIFxcdTAwM2MgMClcXG4tLVxcbm5ldC9zdW5ycGMvc3Zjc29jay5jPTE0Mzk9c3RhdGljIHN0cnVjdCBzdmNfc29jayAqc3ZjX3NldHVwX3NvY2tldChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsXFxuLS1cXG5uZXQvc3VucnBjL3N2Y3NvY2suYy0xNDcyLVxcbm5ldC9zdW5ycGMvc3Zjc29jay5jOjE0NzM6XFx0XFx0ZXJyID0gc3ZjX3JlZ2lzdGVyKHNlcnYsIHNvY2tfbmV0KHNvY2stXFx1MDAzZXNrKSwgaW5ldC1cXHUwMDNlc2tfZmFtaWx5LFxcbm5ldC9zdW5ycGMvc3Zjc29jay5jLTE0NzQtXFx0XFx0XFx0XFx0ICAgICBpbmV0LVxcdTAwM2Vza19wcm90b2NvbCxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM9ODUyPVRFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg3NS0gKlxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM6ODc2OiAqIFRoZSBlcnJvciBoYXMgdG8gc3Vydml2ZSBzdmNfcmVnaXN0ZXIoKSdzIHdhbGsgb3ZlciBzdl9wcm9ncmFtcyB0byBnZXRcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg3Ny0gKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHlcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg3OC0gKiBhIE5VTEwgYW5kIGEgdnNfaGlkZGVuIHZlcnNpb24sIGFuZCBzdmNfZ2VuZXJpY19ycGNiaW5kX3NldCgpIHJlcG9ydHMgMFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM6ODc5OiAqIGZvciBib3RoLCBzbyBhbiBzdmNfcmVnaXN0ZXIoKSB0aGF0IGtlZXBzIHRoZSBsYXN0IHJlc3VsdCByYXRoZXIgdGhhbiB0aGVcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg4MC0gKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTozOTo1Ni44NjczMTEzNTJaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzEzMjg1MTQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdW5kZXJzdGFuZGluZywgY29uc2lkZXJpbmcgSSdtIHRyeWluZyB0byBzZWxlY3QgdGhlIGJlc3QgZnVuY3Rpb24gZm9yIHNvbWV0aGluZzpcblxuKipGdW5jdGlvbiBDYW5kaWRhdGUgRXZhbHVhdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIHNlZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgYHN2Y19yZWdpc3RlcmAgbG9va3MgbGlrZSBhIHN0cm9uZyBjb250ZW5kZXIuIEhvd2V2ZXIsIEkgbmVlZCB0byBiZSB0aG9yb3VnaC4gVGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgaXQncyB0aGUgYmVzdCBvcHRpb24sIG9yIGlmIHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyBldmVuIG1vcmUgcGVyZmVjdGx5IHN1aXRlZCBmb3IgbXkgbmVlZHMuXG5cbkknbSBub3cgdGhpbmtpbmcgYWJvdXQgYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAuIFRoZSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGF0IHRoZXkgYXJlIHN0YXRpYyBmdW5jdGlvbnMuIFN0YXRpYyBmdW5jdGlvbnMgaGF2ZSB0aGVpciBzY29wZSBsaW1pdGVkLiBUaGUgbWFpbiBpc3N1ZSBoZXJlIGlzIGlmIHRoZSBjYWxsLXNpdGVzIGFyZSBhbHNvIHdpdGhpbiB0aGF0IHNjb3BlLiBBcmUgdGhleSBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBvdGhlciBzdGF0aWMgZnVuY3Rpb25zLCBvciBhcmUgdGhleSBjYWxsZWQgZnJvbSBhIG5vbi1zdGF0aWMgY29udGV4dD8gVGhpcyBpcyB0aGUgY3J1Y2lhbCBwb2ludCBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhleSB3aWxsIHdvcmsgYXMgZGVzaXJlZCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBsYXJnZXIgZGVzaWduLiBJZiB0aGV5J3JlIGNhbGxlZCBvdXRzaWRlIHRoZWlyIHN0YXRpYyBzY29wZSwgSSBoYXZlIGEgcHJvYmxlbS4gSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoZSBjYWxsIGdyYXBoIGFuZCB0aGVpciByZXNwZWN0aXZlIGNvbnRleHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTI0MywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjQwOjAwLjU4MDYwMDA1N1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjAzMzY5MTYzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJwY2JfY3JlYXRlX2FmX2xvY2FsXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9MjI4PXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX3RpbWVvdXQgcnBjYl9sb2NhbF90aW1lb3V0ID0ge1xcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yMzctICovXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyMzg6c3RhdGljIGludCBycGNiX2NyZWF0ZV9hZl9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yMzktXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX3VuICphZGRyKVxcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0yODU9c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChzdHJ1Y3QgbmV0ICpuZXQpXFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI5MS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjI5MjpcXHRyZXR1cm4gcnBjYl9jcmVhdGVfYWZfbG9jYWwobmV0LCBcXHUwMDI2cnBjYl9sb2NhbGFkZHJfYWJzdHJhY3QpO1xcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjkzLX1cXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9Mjk1PXN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfdW5peChzdHJ1Y3QgbmV0ICpuZXQpXFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMwMS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjMwMjpcXHRyZXR1cm4gcnBjYl9jcmVhdGVfYWZfbG9jYWwobmV0LCBcXHUwMDI2cnBjYl9sb2NhbGFkZHJfdW5peCk7XFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0zMDMtfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTo0MDowMi43ODM5NzQxOVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2NTcyMjk3MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBzdW1tYXJ5LCB0YWtpbmcgdGhlIHBlcnNwZWN0aXZlIG9mIHNvbWVvbmUgZGVlcGx5IGZhbWlsaWFyIHdpdGggc3lzdGVtIGludGVybmFsczpcblxuKipUcmFjaW5nIHRoZSBPcmlnaW5zIG9mIEFic3RyYWN0IGFuZCBVbml4IERvbWFpbiBTb2NrZXQgQ3JlYXRpb24gaW4gcnBjYmluZCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbGlmZWN5Y2xlIG9mIGFic3RyYWN0IGFuZCBVbml4IGRvbWFpbiBzb2NrZXQgY3JlYXRpb24gd2l0aGluIGBycGNiaW5kYC4gTXkgZm9jdXMgaXMgb24gdHJhY2luZyBob3cgdGhlc2UgbWVjaGFuaXNtcyBhcmUgKmluc3RhbnRpYXRlZCog4oCTIHNwZWNpZmljYWxseSwgdGhlIGNhbGxzIHRvIGBycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF91bml4YC4gSSB3YW50IHRvIGlkZW50aWZ5IHRoZSBpbml0aWF0aW5nIHBvaW50cywgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQsIGFuZCBhbnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHRoYXQgaW5mbHVlbmNlIHRoZWlyIGludm9jYXRpb24uIFRoaXMgbGV2ZWwgb2YgZGV0YWlsIGlzIGNydWNpYWwgZm9yIHJlYWxseSB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciBvZiBgcnBjYmluZGAgd2hlbiBkZWFsaW5nIHdpdGggdmFyaW91cyBzb2NrZXQgdHlwZXMuIEtub3dpbmcgKndoZXJlKiBhbmQgKndoeSogdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2lsbCByZXZlYWwgYSBsb3QgYWJvdXQgdGhlIGFwcGxpY2F0aW9uIGFyY2hpdGVjdHVyZSwgaXRzIGVycm9yIGhhbmRsaW5nLCBhbmQsIHBvc3NpYmx5LCBhbnkgdnVsbmVyYWJpbGl0aWVzIG9yIG9wdGltaXphdGlvbnMgdGhhdCBtaWdodCBiZSBwcmVzZW50LiBMZXQncyBkaWcgaW4gYW5kIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5ODkxLCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MDYuNDQxMjA2MDI5WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTEzNDQxOTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9MjM4PXN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfYWZfbG9jYWwoc3RydWN0IG5ldCAqbmV0LFxcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yODQtXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyODU6c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChzdHJ1Y3QgbmV0ICpuZXQpXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yODYte1xcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0zNTc9aW50IHJwY2JfY3JlYXRlX2xvY2FsKHN0cnVjdCBuZXQgKm5ldClcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzY4LVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY5OlxcdGlmIChycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChuZXQpICE9IDAgXFx1MDAyNlxcdTAwMjZcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM3MC1cXHQgICAgcnBjYl9jcmVhdGVfbG9jYWxfdW5peChuZXQpICE9IDApXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjQwOjA4LjU1NDY1NjQ2OFoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyOTY1NTAxNDc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBgcnBjYl9jcmVhdGVfbG9jYWxgKipcblxuT2theSwgc28gYHJwY2JfY3JlYXRlX2xvY2FsYCBpc24ndCBkZWNsYXJlZCBhcyBgc3RhdGljYC4gVGhhdCBpbW1lZGlhdGVseSBwaXF1ZXMgbXkgaW50ZXJlc3QuIE5vbi1zdGF0aWMgZnVuY3Rpb25zIHVzdWFsbHkgaW1wbHkgYSBicm9hZGVyIHNjb3BlIG9mIHVzYWdlLCBwb3RlbnRpYWxseSBpbmRpY2F0aW5nIGl0J3MgcGFydCBvZiBhIHB1YmxpYyBpbnRlcmZhY2UsIG9yIGF0IGxlYXN0IGNhbGxlZCBmcm9tIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiB0aGUgY29kZWJhc2UuIEdpdmVuIHRoYXQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCB0aG9yb3VnaGx5IGFuYWx5emUgd2hlcmUgdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBiZWluZyAqdXNlZCouIFRpbWUgdG8gdHJhY2sgZG93biBhbGwgaXRzIGNhbGwgc2l0ZXMgYW5kIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gdGhpcyBzeXN0ZW0uIFRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaXRzIGltcGFjdCBhbmQgaW1wb3J0YW5jZS4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbnRleHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMzkxLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MTEuNTIwMTYwNTA3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTg1MDg1OTA0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJwY2JfY3JlYXRlX2xvY2FsXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaD0xOTc9c3RydWN0IHJwY194cHJ0XFx0KnJwY190YXNrX2dldF94cHJ0KHN0cnVjdCBycGNfY2xudCAqY2xudCxcXG4tLVxcbmluY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaC0xOTktXFxuaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oOjIwMDppbnRcXHRcXHRycGNiX2NyZWF0ZV9sb2NhbChzdHJ1Y3QgbmV0ICopO1xcbmluY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaC0yMDEtdm9pZFxcdFxcdHJwY2JfcHV0X2xvY2FsKHN0cnVjdCBuZXQgKik7XFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jPTIwNj1zdGF0aWMgdm9pZCBycGNiX3NldF9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBycGNfY2xudCAqY2xudCxcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjExLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MjEyOlxcdC8qIFByb3RlY3RlZCBieSBycGNiX2NyZWF0ZV9sb2NhbF9tdXRleCAqL1xcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjEzLVxcdHNuLVxcdTAwM2VycGNiX2xvY2FsX2NsbnQgPSBjbG50O1xcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0yMzg9c3RhdGljIGludCBycGNiX2NyZWF0ZV9hZl9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsXFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI4NC1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjI4NTpzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0KHN0cnVjdCBuZXQgKm5ldClcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI4Ni17XFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI5NC1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjI5NTpzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX3VuaXgoc3RydWN0IG5ldCAqbmV0KVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjk2LXtcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzA4LSAqL1xcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzA5OnN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfbmV0KHN0cnVjdCBuZXQgKm5ldClcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMxMC17XFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM1Ni0gKi9cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM1NzppbnQgcnBjYl9jcmVhdGVfbG9jYWwoc3RydWN0IG5ldCAqbmV0KVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzU4LXtcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM1OTpcXHRzdGF0aWMgREVGSU5FX01VVEVYKHJwY2JfY3JlYXRlX2xvY2FsX211dGV4KTtcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2MC1cXHRpbnQgcmVzdWx0ID0gMDtcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzY0LVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY1OlxcdG11dGV4X2xvY2soXFx1MDAyNnJwY2JfY3JlYXRlX2xvY2FsX211dGV4KTtcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2Ni1cXHRpZiAocnBjYl9nZXRfbG9jYWwobmV0KSlcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzY4LVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY5OlxcdGlmIChycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChuZXQpICE9IDAgXFx1MDAyNlxcdTAwMjZcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM3MDpcXHQgICAgcnBjYl9jcmVhdGVfbG9jYWxfdW5peChuZXQpICE9IDApXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzozNzE6XFx0XFx0cmVzdWx0ID0gcnBjYl9jcmVhdGVfbG9jYWxfbmV0KG5ldCk7XFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0zNzItXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0zNzMtb3V0Olxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6Mzc0OlxcdG11dGV4X3VubG9jayhcXHUwMDI2cnBjYl9jcmVhdGVfbG9jYWxfbXV0ZXgpO1xcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzc1LVxcdHJldHVybiByZXN1bHQ7XFxuLS1cXG5uZXQvc3VucnBjL3N2Yy5jPTMwMT1zdGF0aWMgaW50IHN2Y19ycGNiX3NldHVwKHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0KVxcbi0tXFxubmV0L3N1bnJwYy9zdmMuYy0zMDQtXFxubmV0L3N1bnJwYy9zdmMuYzozMDU6XFx0ZXJyID0gcnBjYl9jcmVhdGVfbG9jYWwobmV0KTtcXG5uZXQvc3VucnBjL3N2Yy5jLTMwNi1cXHRpZiAoZXJyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTo0MDoxMy43MDUyNTE3MzFaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY2NDg3ODMyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFJQQyBTZXJ2ZXIgU2V0dXAgYW5kIFJlbGF0ZWQgQ29uZmlndXJhdGlvbnMqKlxuXG5Pa2F5LCBzbyBJIHNlZSB0aGF0IGBycGNiX2NyZWF0ZV9sb2NhbGAgaXMgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGBzdmNfcnBjYl9zZXR1cGAsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIFJQQyBzZXJ2ZXIgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4gVGhhdCBtYWtlcyBzZW5zZTsgaXQncyBhIGNyaXRpY2FsIHBhcnQgb2YgdGhlIHNldHVwLiBJJ3ZlIGFsc28gbm90ZWQgdGhhdCB0aGUgY29kZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLCBgcnBjYl9jcmVhdGVfbG9jYWxgLCBhbmQgYHN2Y19yZWdpc3RlcmAuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGtleSB0byB0aGUgbmV3IGJlaGF2aW9yLlxuXG5Ob3csIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBlbmFibGluZyB0aGlzIG5ldyBmdW5jdGlvbmFsaXR5LiBMZXQncyBzZWUuLi4gdGhlIHNlbGZ0ZXN0IGNvbmZpZyBtZW50aW9ucyBgQ09ORklHX05FVF9OUz15YCwgYENPTkZJR19JUFY2PXlgLCBgQ09ORklHX05GU0Q9eWAsIGFuZCBgQ09ORklHX05GU0RfVjQ9eWAuIFRoYXQgZ2l2ZXMgbWUgYSBzdGFydGluZyBwb2ludC4gYE5FVF9OU2AgaXMgY2xlYXJseSBpbXBvcnRhbnQgZm9yIG5ldHdvcmsgbmFtZXNwYWNlcywgYElQVjZgIGZvciBvYnZpb3VzIHJlYXNvbnMsIGFuZCBgTkZTRGAvYE5GU0RfVjRgIHJlbGF0ZSB0byB0aGUgTkZTIHNlcnZlciBpdHNlbGYuIEknbGwgbmVlZCB0byBkaWcgZGVlcGVyLCB0aG91Z2guXG5cbkkgc2hvdWxkIGV4YW1pbmUgYGZzL25mc2QvS2NvbmZpZ2AgdG8gbG9vayBmb3IgYW55IGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIHJlbGF0aW9uc2hpcHMgdGhhdCBtaWdodCBiZSBsZXNzIG9idmlvdXMuIFRoZXJlIGNvdWxkIGJlIG90aGVyIHJlbGF0ZWQga2VybmVsIGZlYXR1cmVzIG9yIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSBhbHNvIGludm9sdmVkLiBJdCdzIGltcG9ydGFudCB0byBoYXZlIGEgY29tcGxldGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE2MzMsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MTguMzcwMTMzMDc5WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NDMxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9uZnNkL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgTkZTRFxcbiAgIDM6XFx0XFx0dHJpc3RhdGUgXFxcIk5GUyBzZXJ2ZXIgc3VwcG9ydFxcXCJcXG4gICA0OlxcdFxcdGRlcGVuZHMgb24gSU5FVFxcbiAgIDU6XFx0XFx0ZGVwZW5kcyBvbiBGSUxFX0xPQ0tJTkdcXG4gICA2OlxcdFxcdGRlcGVuZHMgb24gRlNOT1RJRllcXG4gICA3OlxcdFxcdHNlbGVjdCBDUkMzMlxcbiAgIDg6XFx0XFx0c2VsZWN0IENSWVBUT19MSUJfTUQ1IGlmIE5GU0RfTEVHQUNZX0NMSUVOVF9UUkFDS0lOR1xcbiAgIDk6XFx0XFx0c2VsZWN0IENSWVBUT19MSUJfU0hBMjU2IGlmIE5GU0RfVjRcXG4gIDEwOlxcdFxcdHNlbGVjdCBDUllQVE8gIyByZXF1aXJlZCBieSBSUENTRUNfR1NTX0tSQjUgYW5kIHNpZ25lZCBmaWxlaGFuZGxlc1xcbiAgMTE6XFx0XFx0c2VsZWN0IExPQ0tEXFxuICAxMjpcXHRcXHRzZWxlY3QgU1VOUlBDXFxuICAxMzpcXHRcXHRzZWxlY3QgRVhQT1JURlNcXG4gIDE0OlxcdFxcdHNlbGVjdCBORlNfQ09NTU9OXFxuICAxNTpcXHRcXHRzZWxlY3QgTkZTX0FDTF9TVVBQT1JUIGlmIE5GU0RfVjJfQUNMXFxuICAxNjpcXHRcXHRzZWxlY3QgTkZTX0FDTF9TVVBQT1JUIGlmIE5GU0RfVjNfQUNMXFxuICAxNzpcXHRcXHRkZXBlbmRzIG9uIE1VTFRJVVNFUlxcbiAgMTg6XFx0XFx0aGVscFxcbiAgMTk6XFx0XFx0ICBDaG9vc2UgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGFsbG93IG90aGVyIGNvbXB1dGVycyB0byBhY2Nlc3NcXG4gIDIwOlxcdFxcdCAgZmlsZXMgcmVzaWRpbmcgb24gdGhpcyBzeXN0ZW0gdXNpbmcgU3VuJ3MgTmV0d29yayBGaWxlIFN5c3RlbVxcbiAgMjE6XFx0XFx0ICBwcm90b2NvbC4gIFRvIGNvbXBpbGUgdGhlIE5GUyBzZXJ2ZXIgc3VwcG9ydCBhcyBhIG1vZHVsZSxcXG4gIDIyOlxcdFxcdCAgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBuZnNkLlxcbiAgMjM6XFx0XFxuICAyNDpcXHRcXHQgIFlvdSBtYXkgY2hvb3NlIHRvIHVzZSBhIHVzZXItc3BhY2UgTkZTIHNlcnZlciBpbnN0ZWFkLCBpbiB3aGljaFxcbiAgMjU6XFx0XFx0ICBjYXNlIHlvdSBjYW4gY2hvb3NlIE4gaGVyZS5cXG4gIDI2OlxcdFxcbiAgMjc6XFx0XFx0ICBUbyBleHBvcnQgbG9jYWwgZmlsZSBzeXN0ZW1zIHVzaW5nIE5GUywgeW91IGFsc28gbmVlZCB0byBpbnN0YWxsXFxuICAyODpcXHRcXHQgIHVzZXIgc3BhY2UgcHJvZ3JhbXMgd2hpY2ggY2FuIGJlIGZvdW5kIGluIHRoZSBMaW51eCBuZnMtdXRpbHNcXG4gIDI5OlxcdFxcdCAgcGFja2FnZSwgYXZhaWxhYmxlIGZyb20gaHR0cDovL2xpbnV4LW5mcy5vcmcvLiAgTW9yZSBkZXRhaWwgYWJvdXRcXG4gIDMwOlxcdFxcdCAgdGhlIExpbnV4IE5GUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIHZpYSB0aGVcXG4gIDMxOlxcdFxcdCAgZXhwb3J0cyg1KSBtYW4gcGFnZS5cXG4gIDMyOlxcdFxcbiAgMzM6XFx0XFx0ICBCZWxvdyB5b3UgY2FuIGNob29zZSB3aGljaCB2ZXJzaW9ucyBvZiB0aGUgTkZTIHByb3RvY29sIGFyZVxcbiAgMzQ6XFx0XFx0ICBhdmFpbGFibGUgdG8gY2xpZW50cyBtb3VudGluZyB0aGUgTkZTIHNlcnZlciBvbiB0aGlzIHN5c3RlbS5cXG4gIDM1OlxcdFxcdCAgU3VwcG9ydCBmb3IgTkZTIHZlcnNpb24gMyAoUkZDIDE4MTMpIGlzIGFsd2F5cyBhdmFpbGFibGUgd2hlblxcbiAgMzY6XFx0XFx0ICBDT05GSUdfTkZTRCBpcyBzZWxlY3RlZC5cXG4gIDM3OlxcdFxcbiAgMzg6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgMzk6XFx0XFxuICA0MDpcXHRjb25maWcgTkZTRF9WMlxcbiAgNDE6XFx0XFx0Ym9vbCBcXFwiTkZTIHNlcnZlciBzdXBwb3J0IGZvciBORlMgdmVyc2lvbiAyIChERVBSRUNBVEVEKVxcXCJcXG4gIDQyOlxcdFxcdGRlcGVuZHMgb24gTkZTRFxcbiAgNDM6XFx0XFx0ZGVmYXVsdCBuXFxuICA0NDpcXHRcXHRoZWxwXFxuICA0NTpcXHRcXHQgIE5GU3YyIChSRkMgMTA5NCkgd2FzIHRoZSBmaXJzdCBwdWJsaWNseS1yZWxlYXNlZCB2ZXJzaW9uIG9mIE5GUy5cXG4gIDQ2OlxcdFxcdCAgVW5sZXNzIHlvdSBhcmUgaG9zdGluZyBhbmNpZW50ICgxOTkwJ3MgZXJhKSBORlMgY2xpZW50cywgeW91IGRvbid0XFxuICA0NzpcXHRcXHQgIG5lZWQgdGhpcy5cXG4gIDQ4OlxcdFxcbiAgNDk6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgNTA6XFx0XFxuICA1MTpcXHRjb25maWcgTkZTRF9WMl9BQ0xcXG4gIDUyOlxcdFxcdGJvb2wgXFxcIk5GUyBzZXJ2ZXIgc3VwcG9ydCBmb3IgdGhlIE5GU3YyIEFDTCBwcm90b2NvbCBleHRlbnNpb25cXFwiXFxuICA1MzpcXHRcXHRkZXBlbmRzIG9uIE5GU0RfVjJcXG4gIDU0OlxcdFxcbiAgNTU6XFx0Y29uZmlnIE5GU0RfVjNfQUNMXFxuICA1NjpcXHRcXHRib29sIFxcXCJORlMgc2VydmVyIHN1cHBvcnQgZm9yIHRoZSBORlN2MyBBQ0wgcHJvdG9jb2wgZXh0ZW5zaW9uXFxcIlxcbiAgNTc6XFx0XFx0ZGVwZW5kcyBvbiBORlNEXFxuICA1ODpcXHRcXHRoZWxwXFxuICA1OTpcXHRcXHQgIFNvbGFyaXMgTkZTIHNlcnZlcnMgc3VwcG9ydCBhbiBhdXhpbGlhcnkgTkZTdjMgQUNMIHByb3RvY29sIHRoYXRcXG4gIDYwOlxcdFxcdCAgbmV2ZXIgYmVjYW1lIGFuIG9mZmljaWFsIHBhcnQgb2YgdGhlIE5GUyB2ZXJzaW9uIDMgcHJvdG9jb2wuXFxuICA2MTpcXHRcXHQgIFRoaXMgcHJvdG9jb2wgZXh0ZW5zaW9uIGFsbG93cyBhcHBsaWNhdGlvbnMgb24gTkZTIGNsaWVudHMgdG9cXG4gIDYyOlxcdFxcdCAgbWFuaXB1bGF0ZSBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyBvbiBmaWxlcyByZXNpZGluZyBvbiBORlNcXG4gIDYzOlxcdFxcdCAgc2VydmVycy4gIE5GUyBzZXJ2ZXJzIGVuZm9yY2UgUE9TSVggQUNMcyBvbiBsb2NhbCBmaWxlcyB3aGV0aGVyXFxuICA2NDpcXHRcXHQgIHRoaXMgcHJvdG9jb2wgaXMgYXZhaWxhYmxlIG9yIG5vdC5cXG4gIDY1OlxcdFxcbiAgNjY6XFx0XFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgaW4geW91ciBzeXN0ZW0ncyBORlMgc2VydmVyIGZvciB0aGVcXG4gIDY3OlxcdFxcdCAgTkZTdjMgQUNMIHByb3RvY29sIGV4dGVuc2lvbiBhbGxvd2luZyBORlMgY2xpZW50cyB0byBtYW5pcHVsYXRlXFxuICA2ODpcXHRcXHQgIFBPU0lYIEFDTHMgb24gZmlsZXMgZXhwb3J0ZWQgYnkgeW91ciBzeXN0ZW0ncyBORlMgc2VydmVyLiAgTkZTXFxuICA2OTpcXHRcXHQgIGNsaWVudHMgd2hpY2ggc3VwcG9ydCB0aGUgU29sYXJpcyBORlN2MyBBQ0wgcHJvdG9jb2wgY2FuIHRoZW5cXG4gIDcwOlxcdFxcdCAgYWNjZXNzIGFuZCBtb2RpZnkgQUNMcyBvbiB5b3VyIE5GUyBzZXJ2ZXIuXFxuICA3MTpcXHRcXG4gIDcyOlxcdFxcdCAgVG8gc3RvcmUgQUNMcyBvbiB5b3VyIE5GUyBzZXJ2ZXIsIHlvdSBhbHNvIG5lZWQgdG8gZW5hYmxlIEFDTC1cXG4gIDczOlxcdFxcdCAgcmVsYXRlZCBDT05GSUcgb3B0aW9ucyBmb3IgeW91ciBsb2NhbCBmaWxlIHN5c3RlbXMgb2YgY2hvaWNlLlxcbiAgNzQ6XFx0XFxuICA3NTpcXHRcXHQgIElmIHVuc3VyZSwgc2F5IE4uXFxuICA3NjpcXHRcXG4gIDc3OlxcdGNvbmZpZyBORlNEX1Y0XFxuICA3ODpcXHRcXHRib29sIFxcXCJORlMgc2VydmVyIHN1cHBvcnQgZm9yIE5GUyB2ZXJzaW9uIDRcXFwiXFxuICA3OTpcXHRcXHRkZXBlbmRzIG9uIE5GU0QgXFx1MDAyNlxcdTAwMjYgUFJPQ19GU1xcbiAgODA6XFx0XFx0c2VsZWN0IEZTX1BPU0lYX0FDTFxcbiAgODE6XFx0XFx0c2VsZWN0IFJQQ1NFQ19HU1NfS1JCNVxcbiAgODI6XFx0XFx0c2VsZWN0IEdSQUNFX1BFUklPRFxcbiAgODM6XFx0XFx0c2VsZWN0IE5GU19WNF8yX1NTQ19IRUxQRVIgaWYgTkZTX1Y0XzJcXG4gIDg0OlxcdFxcdGhlbHBcXG4gIDg1OlxcdFxcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGluIHlvdXIgc3lzdGVtJ3MgTkZTIHNlcnZlciBmb3JcXG4gIDg2OlxcdFxcdCAgdmVyc2lvbiA0IG9mIHRoZSBORlMgcHJvdG9jb2wgKFJGQyAzNTMwKS5cXG4gIDg3OlxcdFxcbiAgODg6XFx0XFx0ICBUbyBleHBvcnQgZmlsZXMgdXNpbmcgTkZTdjQsIHlvdSBuZWVkIHRvIGluc3RhbGwgYWRkaXRpb25hbCB1c2VyXFxuICA4OTpcXHRcXHQgIHNwYWNlIHByb2dyYW1zIHdoaWNoIGNhbiBiZSBmb3VuZCBpbiB0aGUgTGludXggbmZzLXV0aWxzIHBhY2thZ2UsXFxuICA5MDpcXHRcXHQgIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9saW51eC1uZnMub3JnLy5cXG4gIDkxOlxcdFxcbiAgOTI6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgOTM6XFx0XFxuICA5NDpcXHRjb25maWcgTkZTRF9QTkZTXFxuICA5NTpcXHRcXHRib29sXFxuICA5NjpcXHRcXG4gIDk3OlxcdGNvbmZpZyBORlNEX0JMT0NLTEFZT1VUXFxuICA5ODpcXHRcXHRib29sIFxcXCJORlN2NC4xIHNlcnZlciBzdXBwb3J0IGZvciBwTkZTIGJsb2NrIGxheW91dHNcXFwiXFxuICA5OTpcXHRcXHRkZXBlbmRzIG9uIE5GU0RfVjQgXFx1MDAyNlxcdTAwMjYgQkxPQ0tcXG4gMTAwOlxcdFxcdHNlbGVjdCBORlNEX1BORlNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MTguMzcwMjkwMTU5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjk0MDI2NzQ3MDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE5GUyBOZXRsaW5rIExpc3RlbmVyIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gcmV2ZWFsZWQgYSBmZXcga2V5IG9wdGlvbnMgdGhhdCBzZWVtIHJlbGV2YW50IHRvIHRoaXMgYXJlYTogYE5GU0RgLCBgTkZTRF9WNGAsIGBTVU5SUENgLCBgSU5FVGAsIGBGSUxFX0xPQ0tJTkdgLCBgRlNOT1RJRllgLCBgTVVMVElVU0VSYCwgYW5kIGBQUk9DX0ZTYC4gVGhlIGZhY3QgdGhhdCBgU1VOUlBDYCBpcyBzZWxlY3RlZCBieSBgTkZTRGAgaXMgc29tZXRoaW5nIEknbGwga2VlcCBpbiBtaW5kLiBBbHNvLCB0aGUgaW5jbHVzaW9uIG9mIGBORVRfTlNgIGFuZCBgSVBWNmAgZnJvbSB0aGUgc2VsZnRlc3QgY29uZmlnIGlzIGludGVyZXN0aW5nLCBsZXQncyBrZWVwIHRoZW0gaW4gbWluZCwgZXZlbiBpZiB0aGV5IGFyZW4ndCBleHBsaWNpdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cbkkgaW5pdGlhbGx5IGZsYWdnZWQgYSBmZXcgZnVuY3Rpb24gc3ltYm9scyBhcyBwb3RlbnRpYWwgYXJlYXMgb2YgZm9jdXM6IGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCwgYHN2Y19yZWdpc3RlcmAsIGFuZCBgcnBjYl9jcmVhdGVfbG9jYWxgLiBIb3dldmVyLCBhZnRlciBhIGNsb3NlciBsb29rLCBpdCBzZWVtcyBub25lIG9mIHRoZXNlIGFyZSBsaWtlbHkgdG8gYmUgb24gYSBwZXJmb3JtYW5jZS1jcml0aWNhbCBwYXRoLiBgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdGAgaXMgYSBuZXRsaW5rIGNvbW1hbmQgaGFuZGxlciwgd2hpY2ggaXNuJ3QgdHlwaWNhbGx5IGhvdC4gU2ltaWxhcmx5LCBib3RoIGBzdmNfcmVnaXN0ZXJgIGFuZCBgcnBjYl9jcmVhdGVfbG9jYWxgIGFyZSBjYWxsZWQgZHVyaW5nIHRoZSBzZXR1cCBvZiBSUEMgc2VydmljZXMsIG5vdCBkdXJpbmcgYWN0dWFsIGRhdGEgdHJhbnNmZXIuXG5cbkkgdGhlbiBkaWQgYSBxdWljayBzYW5pdHkgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55IG90aGVyIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSByZWxldmFudCwgSSBjaGVja2VkIHRoZSBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5lYXJieS4gVGhlIGZ1bmN0aW9ucyBgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnNgLCBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCwgYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCwgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgIGFwcGVhciB0byBiZSBzdGF0aWMsIHdoaWNoIGxpa2VseSBtZWFucyB0aGV5IGFyZSBlaXRoZXIgaW5saW5lZCBvciBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLlxuXG5TbywgY2lyY2xpbmcgYmFjayB0byB0aGUgb3JpZ2luYWwgZm9jdXMgc3ltYm9sczpcblxuKiAgIGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YFxuKiAgIGBzdmNfcmVnaXN0ZXJgXG4qICAgYHJwY2JfY3JlYXRlX2xvY2FsYFxuXG5Ob3csIGxldCdzIGNvbmZpcm0gdGhhdCBgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdGAgaXMgdGhlICpvbmx5KiBuZXRsaW5rIGhhbmRsZXIgYmVpbmcgbW9kaWZpZWQuIFllcywgaXQgbG9va3MgbGlrZSBpdCBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGxpc3RlbmVyIHNldCBjb21tYW5kLlxuXG5OZXh0LCBJIG5lZWQgdG8gbWFrZSBhIG5vdGUgb2YgdGhlIHJlbGV2YW50IGBFbmFibGVDb25maWdzYDpcblxuKiAgIGBORlNEYFxuKiAgIGBORlNEX1Y0YFxuKiAgIGBTVU5SUENgIChBZ2Fpbiwgbm90aW5nIGl0cyBkZXBlbmRlbmN5KVxuKiAgIGBORVRfTlNgXG4qICAgYElQVjZgXG5cbkknbGwgdmVyaWZ5IHRoYXQgYFNVTlJQQ2AgaXMgaW5kZWVkIGEgY29uZmlnIG9wdGlvbiwgd2hpY2ggaXQgaXMuIEZpbmFsbHksIEknbGwgY29uZmlybSB0aGF0IGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBpcyBhY3R1YWxseSBjb21waWxlZCBpbi4gWWVzLCBpdCdzIGxvY2F0ZWQgd2l0aGluIGBmcy9uZnNkL25mc2N0bC5jYCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgYG5mc2RgIG1vZHVsZS4gTm93IEkgd2lsbCBjb21waWxlIHRoZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzU1OCwiT3V0cHV0VG9rZW5zIjoxNTUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0ODMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTo0MDoyNy43NzI5Njc3ODlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzE2ODM3ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5GU0RcIixcbiAgICBcIk5GU0RfVjRcIixcbiAgICBcIlNVTlJQQ1wiLFxuICAgIFwiTkVUX05TXCIsXG4gICAgXCJJUFY2XCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdFwiLFxuICAgIFwic3ZjX3JlZ2lzdGVyXCIsXG4gICAgXCJycGNiX2NyZWF0ZV9sb2NhbFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBORlNEIG5ldGxpbmsgbGlzdGVuZXIgY29uZmlndXJhdGlvbiBsb2dpYywgYWRkcyB2YWxpZGF0aW9uIGZvciB0cmFuc3BvcnQgY2xhc3NlcywgbGltaXRzIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLCBpbnRyb2R1Y2VzIGEgdGltZW91dCBmb3IgbG9jYWwgcnBjYmluZCBjYWxscywgYW5kIGZpeGVzIGVycm9yIGhhbmRsaW5nIGluIHN2Y19yZWdpc3Rlci4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjaGFuZ2VzIGluIHRoZSBORlMgc2VydmVyIGFuZCBSUEMgc3Vic3lzdGVtcyB0aGF0IGhhdmUgZnVuY3Rpb25hbCBpbXBhY3QgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTkZTRFwiLFxuICAgIFwiTkZTRF9WNFwiLFxuICAgIFwiU1VOUlBDXCIsXG4gICAgXCJORVRfTlNcIixcbiAgICBcIklQVjZcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0XCIsXG4gICAgXCJzdmNfcmVnaXN0ZXJcIixcbiAgICBcInJwY2JfY3JlYXRlX2xvY2FsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MjcuOTA0NjYwOTc5WiIsIlNlcSI6MTcsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTY1NDI3MzgwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjQwOjI3LjkwNzUyNDI5OVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyNTY1MTQwNTc2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgdmFsaWRhdGlvbiBjaGVja3MgZm9yIE5GU0QgbmV0bGluayBsaXN0ZW5lciBhdHRyaWJ1dGVzIChlLmcuLCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyB0byBgTkZTRF9OTF9MSVNURU5FUl9NQVhgIGFuZCB2YWxpZGF0aW5nIHRoZSB0cmFuc3BvcnQgbmFtZSB2aWEgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGApLiBJdCBhbHNvIGZpeGVzIGVycm9yIGNvZGUgcHJvcGFnYXRpb24gaW4gYHN2Y19yZWdpc3RlcmAgYW5kIHNldHMgYSBsb2NhbCB0aW1lb3V0IGZvciBycGNiaW5kIGNsaWVudHMuIFxcblxcblRoZSBuZXRsaW5rIGF0dHJpYnV0ZSBgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVgIGlzIGRlZmluZWQgYXMgYE5MQV9OVUxfU1RSSU5HYCBpbiBgbmZzZF9zb2NrX25sX3BvbGljeWAsIGVuc3VyaW5nIHRoYXQgYG5sYV9kYXRhKClgIHJldHVybnMgYSBwcm9wZXJseSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJlZm9yZSBpdCBpcyBwYXNzZWQgdG8gYHN0cmNtcCgpYCBpbiBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYC4gXFxuXFxuTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgb3Igc2VudCB0byB1c2VyIHNwYWNlLCBhbmQgdGhlcmUgYXJlIG5vIGNoYW5nZXMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIG1lbW9yeS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9naWMgYnVncykgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBkZWZhdWx0IHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2MDFlYjcwNDhmZDFjYzM3MTk1MWY1OGFmMDBjYzI1MGY5ZTJiYWMzXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTAgMjE6Mzk6MzcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuY1xuaW5kZXggN2UxZDVhNWQ2NTExZS4uZjczYTJlYTQyNTU3MSAxMDA2NDRcbi0tLSBhL2ZzL25mc2QvbmZzY3RsLmNcbisrKyBiL2ZzL25mc2QvbmZzY3RsLmNcbkBAIC0xOTczLDIxICsxOTczLDM5IEBAIGludCBuZnNkX25sX3ZlcnNpb25fZ2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuKy8qXG4rICogVHJhbnNwb3J0IGNsYXNzZXMgTkZTRCBrbm93cyBob3cgdG8gaW5zdGFudGlhdGUuIFZldHRpbmcgdGhlIG5hbWUgaGVyZVxuKyAqIGtlZXBzIGEgYm9ndXMgc3RyaW5nIGZyb20gcmVhY2hpbmcgc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2EoKSwgd2hlcmUgYW5cbisgKiB1bmtub3duIG5hbWUgdHJpZ2dlcnMgYSByZXF1ZXN0X21vZHVsZShcInN2YyVzXCIsIG5hbWUpIHVwY2FsbCB1bmRlclxuKyAqIG5mc2RfbXV0ZXguXG4rICovXG4rc3RhdGljIGJvb2wgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkKGNvbnN0IGNoYXIgKm5hbWUpXG4re1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdXBwb3J0ZWRbXSA9IHsgXCJ0Y3BcIiwgXCJ1ZHBcIiwgXCJyZG1hXCIgfTtcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShzdXBwb3J0ZWQpOyBpKyspXG4rXHRcdGlmICghc3RyY21wKG5hbWUsIHN1cHBvcnRlZFtpXSkpXG4rXHRcdFx0cmV0dXJuIHRydWU7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuKy8qIFVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGEgc2luZ2xlIHJlcXVlc3QgbWF5IGNhcnJ5LiAqL1xuKyNkZWZpbmUgTkZTRF9OTF9MSVNURU5FUl9NQVhcdDEwMjRcbitcbiAvKipcbiAgKiBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyAtIHNhbml0eS1jaGVjayB0aGUgbGlzdGVuZXIgbGlzdCBmcm9tIHVzZXJsYW5kXG4gICogQGluZm86IG5ldGxpbmsgbWV0YWRhdGEgYW5kIGNvbW1hbmQgYXJndW1lbnRzXG4gICpcbi0gKiBXYWxrIGV2ZXJ5IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIGF0dHJpYnV0ZSBhbmQgY29uZmlybSB0aGF0IGVhY2ggZW50cnlcbi0gKiBpcyB3ZWxsLWZvcm1lZDogaXQgcGFyc2VzIGFnYWluc3QgdGhlIHBvbGljeSwgY2FycmllcyBib3RoIGFuIGFkZHJlc3MgYW5kXG4tICogYSB0cmFuc3BvcnQgbmFtZSwgYW5kIHRoZSBhZGRyZXNzIGlzIGxvbmcgZW5vdWdoIGZvciBpdHMgZmFtaWx5LiBEb2luZ1xuLSAqIHRoaXMgdXAgZnJvbnQgbGV0cyB0aGUgY2FsbGVycyBiZWxvdyBhc3N1bWUgZXZlcnkgZW50cnkgaXMgdmFsaWQgYW5kXG4tICogZ3VhcmFudGVlcyB3ZSBtYWtlIG5vIGNoYW5nZXMgd2hlbiB0aGUgcmVxdWVzdCBpcyBtYWxmb3JtZWQuXG4rICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCB0aGUgbGlzdCBpc1xuKyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC5cbiAgKlxuICAqIFJldHVybjogMCBpZiBldmVyeSBlbnRyeSBpcyB2YWxpZCwgb3IgYSBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UuXG4gICovXG4gc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIHtcbiBcdGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHI7XG4rXHR1bnNpZ25lZCBpbnQgY291bnQgPSAwO1xuIFx0aW50IHJlbTtcbiBcbiBcdG5sbXNnX2Zvcl9lYWNoX2F0dHJfdHlwZShhdHRyLCBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiwgaW5mby1cdTAwM2VubGhkcixcbkBAIC0xOTk2LDYgKzIwMTQsMTEgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRzdHJ1Y3Qgc29ja2FkZHIgKnNhO1xuIFx0XHRpbnQgZXJyO1xuIFxuK1x0XHRpZiAoKytjb3VudCBcdTAwM2UgTkZTRF9OTF9MSVNURU5FUl9NQVgpIHtcbitcdFx0XHROTF9TRVRfRVJSX01TRyhpbmZvLVx1MDAzZWV4dGFjaywgXCJ0b28gbWFueSBsaXN0ZW5lcnNcIik7XG4rXHRcdFx0cmV0dXJuIC1FMkJJRztcbitcdFx0fVxuK1xuIFx0XHRlcnIgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXG4gXHRcdFx0XHQgICAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby1cdTAwM2VleHRhY2spO1xuIFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuQEAgLTIwMDQsNiArMjAyNyw5IEBAIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdFx0aWYgKCF0YltORlNEX0FfU09DS19BRERSXSB8fCAhdGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuK1x0XHRpZiAoIW5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChubGFfZGF0YSh0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pKSlcbitcdFx0XHRyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDtcbitcbiBcdFx0c2EgPSBubGFfZGF0YSh0YltORlNEX0FfU09DS19BRERSXSk7XG4gXHRcdGlmIChubGFfbGVuKHRiW05GU0RfQV9TT0NLX0FERFJdKSBcdTAwM2Mgc2l6ZW9mKHNhLVx1MDAzZXNhX2ZhbWlseSkpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG5AQCAtMjE1Niw4ICsyMTgyLDEyIEBAIGludCBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRcdHJldCA9IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKHNlcnYsIHhjbF9uYW1lLCBuZXQsIHNhLCAwLFxuIFx0XHRcdFx0XHQgICAgICBjdXJyZW50X2NyZWQoKSk7XG4gXHRcdC8qIGFsd2F5cyBzYXZlIHRoZSBsYXRlc3QgZXJyb3IgKi9cbi1cdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuK1x0XHRcdE5MX1NFVF9FUlJfTVNHX0ZNVChpbmZvLVx1MDAzZWV4dGFjayxcbitcdFx0XHRcdFx0ICAgXCJjYW5ub3QgY3JlYXRlICVzIGxpc3RlbmVyOiAlZFwiLFxuK1x0XHRcdFx0XHQgICB4Y2xfbmFtZSwgcmV0KTtcbiBcdFx0XHRlcnIgPSByZXQ7XG4rXHRcdH1cbiBcdH1cbiBcbiBcdGlmICghc2Vydi1cdTAwM2Vzdl9ucnRocmVhZHMgXHUwMDI2XHUwMDI2IGxpc3RfZW1wdHkoXHUwMDI2bm4tXHUwMDNlbmZzZF9zZXJ2LVx1MDAzZXN2X3Blcm1zb2NrcykpXG5kaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcbmluZGV4IDZhYTM3MjE4OGM4NmEuLjBhYTM3NmI4MmE1MjYgMTAwNjQ0XG4tLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jXG4rKysgYi9uZXQvc3VucnBjL3JwY2JfY2xudC5jXG5AQCAtMjIxLDYgKzIyMSwxNiBAQCBzdGF0aWMgdm9pZCBycGNiX3NldF9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBycGNfY2xudCAqY2xudCxcbiAjIGRlZmluZSBTVU5fTEVOKHB0cikgKG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpXHRcdFxcXG4gXHRcdCAgICAgICsgMSArIHN0cmxlbigocHRyKS1cdTAwM2VzdW5fcGF0aCArIDEpKVxuIFxuKy8qXG4rICogVGhlIGtlcm5lbCdzIHJwY2JpbmQgY2xpZW50IHRhbGtzIG9ubHkgdG8gdGhlIGxvY2FsIHJwY2JpbmQsIG92ZXIgbG9vcGJhY2tcbisgKiBvciBhIGxvY2FsIEFGX0xPQ0FMIHNvY2tldCwgd2hlcmUgYSBoZWFsdGh5IHJwY2JpbmQgYW5zd2VycyBpbiBtaWNyb3NlY29uZHMuXG4rICovXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfdGltZW91dCBycGNiX2xvY2FsX3RpbWVvdXQgPSB7XG4rXHQudG9faW5pdHZhbFx0PSAxICogSFosXG4rXHQudG9fbWF4dmFsXHQ9IDEgKiBIWixcbitcdC50b19yZXRyaWVzXHQ9IDAsXG4rfTtcbitcbiAvKlxuICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZVxuICAqIGlzIHJldHVybmVkLlxuQEAgLTIzOCw2ICsyNDgsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2FmX2xvY2FsKHN0cnVjdCBuZXQgKm5ldCxcbiBcdFx0LnZlcnNpb25cdD0gUlBDQlZFUlNfMixcbiBcdFx0LmF1dGhmbGF2b3JcdD0gUlBDX0FVVEhfTlVMTCxcbiBcdFx0LmNyZWRcdFx0PSBjdXJyZW50X2NyZWQoKSxcbitcdFx0LnRpbWVvdXRcdD0gXHUwMDI2cnBjYl9sb2NhbF90aW1lb3V0LFxuIFx0XHQvKlxuIFx0XHQgKiBXZSB0dXJuIG9mZiB0aGUgaWRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGtlcm5lbFxuIFx0XHQgKiBmcm9tIGF1dG9tYXRpY2FsbHkgZGlzY29ubmVjdGluZyB0aGUgc29ja2V0LlxuQEAgLTMxMiw2ICszMjMsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX25ldChzdHJ1Y3QgbmV0ICpuZXQpXG4gXHRcdC52ZXJzaW9uXHQ9IFJQQ0JWRVJTXzIsXG4gXHRcdC5hdXRoZmxhdm9yXHQ9IFJQQ19BVVRIX1VOSVgsXG4gXHRcdC5jcmVkXHRcdD0gY3VycmVudF9jcmVkKCksXG4rXHRcdC50aW1lb3V0XHQ9IFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcbiBcdFx0LmZsYWdzXHRcdD0gUlBDX0NMTlRfQ1JFQVRFX05PUElORyxcbiBcdH07XG4gXHRzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsICpjbG50NDtcbmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuY1xuaW5kZXggMDVjM2U2ZTJmNjU5NC4uZTljZmNlYjFhMzM0MiAxMDA2NDRcbi0tLSBhL25ldC9zdW5ycGMvc3ZjLmNcbisrKyBiL25ldC9zdW5ycGMvc3ZjLmNcbkBAIC0xMjA4LDEzICsxMjA4LDE2IEBAIGludCBzdmNfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBzdHJ1Y3QgbmV0ICpuZXQsXG4gXHRcdHN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZ3AgPSBcdTAwMjZzZXJ2LVx1MDAzZXN2X3Byb2dyYW1zW3BdO1xuIFxuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwcm9ncC1cdTAwM2VwZ19udmVyczsgaSsrKSB7XG4rXHRcdFx0aW50IHJldDtcbiBcbi1cdFx0XHRlcnJvciA9IHByb2dwLVx1MDAzZXBnX3JwY2JpbmRfc2V0KG5ldCwgcHJvZ3AsIGksXG4rXHRcdFx0cmV0ID0gcHJvZ3AtXHUwMDNlcGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSxcbiBcdFx0XHRcdFx0ZmFtaWx5LCBwcm90bywgcG9ydCk7XG4tXHRcdFx0aWYgKGVycm9yIFx1MDAzYyAwKSB7XG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuIFx0XHRcdFx0cHJpbnRrKEtFUk5fV0FSTklORyBcInN2YzogZmFpbGVkIHRvIHJlZ2lzdGVyIFwiXG4gXHRcdFx0XHRcdFwiJXN2JXUgUlBDIHNlcnZpY2UgKGVycm5vICVkKS5cXG5cIixcbi1cdFx0XHRcdFx0cHJvZ3AtXHUwMDNlcGdfbmFtZSwgaSwgLWVycm9yKTtcbitcdFx0XHRcdFx0cHJvZ3AtXHUwMDNlcGdfbmFtZSwgaSwgLXJldCk7XG4rXHRcdFx0XHRpZiAoIWVycm9yKVxuK1x0XHRcdFx0XHRlcnJvciA9IHJldDtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbiBcdFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbmluZGV4IDg0MzQzZmQxZTM1NGIuLjQ2MDUwOGRlOTM3NGYgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbkBAIC04OSw2ICs4OSw3IEBAIFRBUkdFVFMgKz0gbmV0L3BhY2tldGRyaWxsXG4gVEFSR0VUUyArPSBuZXQvcHBwXG4gVEFSR0VUUyArPSBuZXQvcmRzXG4gVEFSR0VUUyArPSBuZXQvdGNwX2FvXG4rVEFSR0VUUyArPSBuZnNkXG4gVEFSR0VUUyArPSBub2xpYmNcbiBUQVJHRVRTICs9IHBjaV9lbmRwb2ludFxuIFRBUkdFVFMgKz0gcGNpZV9id2N0cmxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xOWU2ZGVjMDRkOGU5XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmVcbkBAIC0wLDAgKzEgQEBcbituZnNkX25ldGxpbmtfbGlzdGVuZXJcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZVxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1YWM2NTU0OWQyNTlcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGVcbkBAIC0wLDAgKzEsNiBAQFxuKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitDRkxBR1MgKz0gJChLSERSX0lOQ0xVREVTKSAtV2FsbFxuK1xuK1RFU1RfR0VOX1BST0dTIDo9IG5mc2RfbmV0bGlua19saXN0ZW5lclxuK1xuK2luY2x1ZGUgLi4vbGliLm1rXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2OTQ1ZmY5NTUxYzRcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnXG5AQCAtMCwwICsxLDQgQEBcbitDT05GSUdfTkVUX05TPXlcbitDT05GSUdfSVBWNj15XG4rQ09ORklHX05GU0Q9eVxuK0NPTkZJR19ORlNEX1Y0PXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlMzMwNzY4MGQ3ZDRcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmNcbkBAIC0wLDAgKzEsOTIwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFJlZ3Jlc3Npb24gdGVzdHMgZm9yIHRoZSBORlNEIGdlbmVyaWMtbmV0bGluayBsaXN0ZW5lciBpbnRlcmZhY2VcbisgKiAoTkZTRF9DTURfTElTVEVORVJfU0VUIC8gTkZTRF9DTURfTElTVEVORVJfR0VUKS5cbisgKlxuKyAqIFRocmVlIGdyb3VwczpcbisgKiAgIHZhbGlkYXRpb24gIC0gbWFsZm9ybWVkL2FidXNpdmUgTElTVEVORVJfU0VUIHJlcXVlc3RzIGFyZSByZWplY3RlZCBieVxuKyAqICAgICAgICAgICAgICAgICBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycygpLCBiZWZvcmUgbmZzZF9tdXRleCBpcyB0YWtlbi5cbisgKiAgIGZ1bmN0aW9uYWwgIC0gY3JlYXRlL2FkZC9yZW1vdmUgbGlzdGVuZXJzIGFuZCB2ZXJpZnkgTElTVEVORVJfR0VUXG4rICogICAgICAgICAgICAgICAgIHJlZmxlY3RzIHRoZSBzZXQgKHJvdW5kLXRyaXAgb2YgdHJhbnNwb3J0ICsgYWRkcjpwb3J0KS5cbisgKiAgIHNlbWFudGljcyAgIC0gb25jZSB0aHJlYWRzIGFyZSBydW5uaW5nIChUSFJFQURTX1NFVCkgYSBsaXN0ZW5lciBjaGFuZ2VcbisgKiAgICAgICAgICAgICAgICAgaXMgcmVmdXNlZCB3aXRoIC1FQlVTWS5cbisgKlxuKyAqIEVhY2ggdGVzdCBydW5zIGluIGl0cyBvd24gcHJpdmF0ZSBuZXQgKyBtb3VudCBuYW1lc3BhY2UgKHVuc2hhcmUgaW5cbisgKiBGSVhUVVJFX1NFVFVQKS4gL3J1biBpcyBtYXNrZWQgdGhlcmU6IGEgcGF0aG5hbWUgQUZfTE9DQUwgY29ubmVjdCBpcyBub3RcbisgKiBzY29wZWQgYnkgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBzaW5jZSB1bml4X2ZpbmRfYnNkKCkgcmVzb2x2ZXMgYnkgaW5vZGVcbisgKiBhbmQgdGFrZXMgbm8gc3RydWN0IG5ldCwgc28gdGhlIGtlcm5lbCdzIHJwY2JpbmQgY2xpZW50IHdvdWxkIG90aGVyd2lzZSBiZVxuKyAqIGFibGUgdG8gcmVhY2ggdGhlIHJwY2JpbmQgcnVubmluZyBvbiB0aGUgaG9zdC4gQW55dGhpbmcgdGhhdCBjcmVhdGVzIGFcbisgKiBzZXJ2IGlzIHNlcnZlZCBieSB0aGUgcGVyLW5ldG5zIHJwY2JpbmQgc3R1YiBiZWxvdyBpbnN0ZWFkLlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjcG9sbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc2NoZWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkZGVmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpbnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW91bnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9wcmN0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3NvY2tldC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY25ldC9pZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbmV0aW5ldC9pbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbmV0bGluay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZ2VuZXRsaW5rLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcIi4uL2tzZWxmdGVzdF9oYXJuZXNzLmhcIlxuK1xuKy8qIE5GU0QgZ2VuZXJpYy1uZXRsaW5rIGNvbnN0YW50cyAoZnJvbSBsaW51eC9uZnNkX25ldGxpbmsuaCkuICovXG4rI2RlZmluZSBORlNEX0ZBTUlMWV9OQU1FXHRcdFwibmZzZFwiXG4rI2RlZmluZSBORlNEX0NNRF9USFJFQURTX1NFVFx0XHQyXG4rI2RlZmluZSBORlNEX0NNRF9MSVNURU5FUl9TRVRcdFx0NlxuKyNkZWZpbmUgTkZTRF9DTURfTElTVEVORVJfR0VUXHRcdDdcbisjZGVmaW5lIE5GU0RfQV9TRVJWRVJfVEhSRUFEU1x0XHQxXG4rI2RlZmluZSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUlx0XHQxXHQvKiBwZXItbGlzdGVuZXIgbmVzdCAqL1xuKyNkZWZpbmUgTkZTRF9BX1NPQ0tfQUREUlx0XHQxXHQvKiBpbnNpZGUgdGhlIG5lc3QgKi9cbisjZGVmaW5lIE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXHQyXHQvKiBpbnNpZGUgdGhlIG5lc3QgKi9cbitcbisjZGVmaW5lIE5MQV9BTElHTjQobGVuKVx0XHRcdCgoKGxlbikgKyAzKSBcdTAwMjYgfjMpXG4rI2RlZmluZSBURVNUX1BPUlRcdFx0XHQyMDA0OVxuKyNkZWZpbmUgTUFYX0xJU1RFTkVSU1x0XHRcdDhcbisjZGVmaW5lIFJFQ1ZfVElNRU9fU0VDXHRcdFx0MzBcbitcbitzdGF0aWMgaW50IG5mc2RfZmFtaWx5O1x0XHRcdC8qIHNldCBwZXItdGVzdCBpbiBGSVhUVVJFX1NFVFVQICovXG4rXG4rc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKm1zZylcbit7XG4rXHRwZXJyb3IobXNnKTtcbitcdGV4aXQoMSk7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gbWluaW1hbCBnZW5lcmljLW5ldGxpbmsgcGx1bWJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuK1xuK3N0YXRpYyBpbnQgZ2VubF9vcGVuKHZvaWQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX25sIHNhID0geyAubmxfZmFtaWx5ID0gQUZfTkVUTElOSyB9O1xuK1x0c3RydWN0IHRpbWV2YWwgdHYgPSB7IC50dl9zZWMgPSBSRUNWX1RJTUVPX1NFQyB9O1xuK1x0aW50IGZkID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX0dFTkVSSUMpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRkaWUoXCJzb2NrZXQoTkVUTElOS19HRU5FUklDKVwiKTtcbitcdGlmIChiaW5kKGZkLCAodm9pZCAqKVx1MDAyNnNhLCBzaXplb2Yoc2EpKSBcdTAwM2MgMClcbitcdFx0ZGllKFwiYmluZChuZXRsaW5rKVwiKTtcbitcdHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCBcdTAwMjZ0diwgc2l6ZW9mKHR2KSk7XG4rXHRyZXR1cm4gZmQ7XG4rfVxuK1xuKy8qIEFwcGVuZCBhbiBhdHRyaWJ1dGUgYXQgQG9mZjsgcmV0dXJuIHRoZSBuZXcgKGFsaWduZWQpIG9mZnNldC4gKi9cbitzdGF0aWMgaW50IHB1dF9hdHRyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgdWludDE2X3QgdHlwZSxcbitcdFx0ICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pXG4re1xuK1x0c3RydWN0IG5sYXR0ciAqbmEgPSAodm9pZCAqKShidWYgKyBvZmYpO1xuK1xuK1x0bmEtXHUwMDNlbmxhX3R5cGUgPSB0eXBlO1xuK1x0bmEtXHUwMDNlbmxhX2xlbiA9IE5MQV9IRFJMRU4gKyBsZW47XG4rXHRpZiAobGVuKVxuK1x0XHRtZW1jcHkoYnVmICsgb2ZmICsgTkxBX0hEUkxFTiwgZGF0YSwgbGVuKTtcbitcdHJldHVybiBvZmYgKyBOTEFfQUxJR040KE5MQV9IRFJMRU4gKyBsZW4pO1xuK31cbitcbisvKiBCdWlsZCBhIGdlbmwgbWVzc2FnZSBoZWFkZXIgaW50byBAYnVmOyByZXR1cm4gdGhlIG9mZnNldCBwYXN0IGl0LiAqL1xuK3N0YXRpYyBpbnQgZ2VubF9oZHIoY2hhciAqYnVmLCB1aW50MTZfdCB0eXBlLCB1aW50MTZfdCBmbGFncywgdWludDhfdCBjbWQpXG4re1xuK1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbitcdHN0cnVjdCBnZW5sbXNnaGRyICpnbmwgPSAodm9pZCAqKShidWYgKyBOTE1TR19IRFJMRU4pO1xuK1xuK1x0bWVtc2V0KGJ1ZiwgMCwgTkxNU0dfSERSTEVOICsgR0VOTF9IRFJMRU4pO1xuK1x0bmxoLVx1MDAzZW5sbXNnX3R5cGUgPSB0eXBlO1xuK1x0bmxoLVx1MDAzZW5sbXNnX2ZsYWdzID0gZmxhZ3M7XG4rXHRubGgtXHUwMDNlbmxtc2dfc2VxID0gMTtcbitcdGdubC1cdTAwM2VjbWQgPSBjbWQ7XG4rXHRnbmwtXHUwMDNldmVyc2lvbiA9IDE7XG4rXHRyZXR1cm4gTkxNU0dfSERSTEVOICsgR0VOTF9IRFJMRU47XG4rfVxuK1xuKy8qIFNlbmQgYW4gbmZzZCBjb21tYW5kIHdpdGggYW4gQUNLOyByZXR1cm4gdGhlIEFDSyBlcnJubyAoXHUwMDNjPSAwKS4gKi9cbitzdGF0aWMgaW50IGdlbmxfcmVxdWVzdCh1aW50OF90IGNtZCwgY29uc3QgY2hhciAqYXR0cnMsIGludCBhdHRyc19sZW4pXG4re1xuK1x0Y2hhciBidWZbMSBcdTAwM2NcdTAwM2MgMjBdLCByYnVmWzQwOTZdO1xuK1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbitcdGludCBmZCA9IGdlbmxfb3BlbigpO1xuK1x0aW50IG9mZiwgbiwgcmV0O1xuK1xuK1x0b2ZmID0gZ2VubF9oZHIoYnVmLCBuZnNkX2ZhbWlseSwgTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0FDSywgY21kKTtcbitcdGlmIChhdHRyc19sZW4pIHtcbitcdFx0bWVtY3B5KGJ1ZiArIG9mZiwgYXR0cnMsIGF0dHJzX2xlbik7XG4rXHRcdG9mZiArPSBhdHRyc19sZW47XG4rXHR9XG4rXHRubGgtXHUwMDNlbmxtc2dfbGVuID0gb2ZmO1xuK1xuK1x0aWYgKHNlbmQoZmQsIGJ1Ziwgb2ZmLCAwKSBcdTAwM2MgMClcbitcdFx0ZGllKFwic2VuZChnZW5sKVwiKTtcbitcbitcdG4gPSByZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApO1xuK1x0aWYgKG4gXHUwMDNjIDApXG4rXHRcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcbitcdGVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbitcdFx0cmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS1cdTAwM2VlcnJvcjtcbitcdGVsc2VcbitcdFx0cmV0ID0gMDtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qIFNlbmQgYSBjb21tYW5kIGFuZCByZXR1cm4gdGhlIGZ1bGwgcmVwbHkgbWVzc2FnZTsgLWVycm5vIG9uIGZhaWx1cmUuICovXG4rc3RhdGljIGludCBnZW5sX3JlcXVlc3RfcmVwbHkodWludDhfdCBjbWQsIGNoYXIgKnJidWYsIHNpemVfdCBybGVuKVxuK3tcbitcdGNoYXIgYnVmWzI1Nl07XG4rXHRzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmO1xuK1x0aW50IGZkID0gZ2VubF9vcGVuKCk7XG4rXHRpbnQgb2ZmLCBuLCByZXQ7XG4rXG4rXHRvZmYgPSBnZW5sX2hkcihidWYsIG5mc2RfZmFtaWx5LCBOTE1fRl9SRVFVRVNULCBjbWQpO1xuK1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbitcbitcdGlmIChzZW5kKGZkLCBidWYsIG9mZiwgMCkgXHUwMDNjIDApXG4rXHRcdGRpZShcInNlbmQoZ2VubCByZXBseSlcIik7XG4rXG4rXHRuID0gcmVjdihmZCwgcmJ1ZiwgcmxlbiwgMCk7XG4rXHRpZiAobiBcdTAwM2MgMClcbitcdFx0cmV0ID0gKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgPyAtRVRJTUVET1VUIDogLWVycm5vO1xuK1x0ZWxzZSBpZiAoKChzdHJ1Y3Qgbmxtc2doZHIgKilyYnVmKS1cdTAwM2VubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKVxuK1x0XHRyZXQgPSAoKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEocmJ1ZikpLVx1MDAzZWVycm9yO1xuK1x0ZWxzZVxuK1x0XHRyZXQgPSBuO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyogUmVzb2x2ZSB0aGUgXCJuZnNkXCIgZ2VubCBmYW1pbHkgaWQ7IC0xIGlmIG5vdCByZWdpc3RlcmVkLiAqL1xuK3N0YXRpYyBpbnQgZ2VubF9yZXNvbHZlX25mc2Qodm9pZClcbit7XG4rXHRjaGFyIGJ1ZlsxMDI0XSwgcmJ1Zls0MDk2XTtcbitcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4rXHRzdHJ1Y3Qgbmxtc2doZHIgKnJoID0gKHZvaWQgKilyYnVmO1xuK1x0c3RydWN0IG5sYXR0ciAqbmE7XG4rXHRpbnQgZmQsIG9mZiwgbGVmdCwgaWQgPSAtMTtcbitcbitcdGZkID0gZ2VubF9vcGVuKCk7XG4rXHRvZmYgPSBnZW5sX2hkcihidWYsIEdFTkxfSURfQ1RSTCwgTkxNX0ZfUkVRVUVTVCwgQ1RSTF9DTURfR0VURkFNSUxZKTtcbitcdG9mZiA9IHB1dF9hdHRyKGJ1Ziwgb2ZmLCBDVFJMX0FUVFJfRkFNSUxZX05BTUUsXG4rXHRcdCAgICAgICBORlNEX0ZBTUlMWV9OQU1FLCBzaXplb2YoTkZTRF9GQU1JTFlfTkFNRSkpO1xuK1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbitcbitcdGlmIChzZW5kKGZkLCBidWYsIG9mZiwgMCkgXHUwMDNjIDApXG4rXHRcdGRpZShcInNlbmQoR0VURkFNSUxZKVwiKTtcbitcdGlmIChyZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApIFx1MDAzYyAwKVxuK1x0XHRkaWUoXCJyZWN2KEdFVEZBTUlMWSlcIik7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRpZiAocmgtXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0bmEgPSAodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEocmgpICsgR0VOTF9IRFJMRU4pO1xuK1x0bGVmdCA9IHJoLVx1MDAzZW5sbXNnX2xlbiAtIE5MTVNHX0hEUkxFTiAtIEdFTkxfSERSTEVOO1xuK1x0d2hpbGUgKGxlZnQgXHUwMDNlPSAoaW50KU5MQV9IRFJMRU4pIHtcbitcdFx0aWYgKG5hLVx1MDAzZW5sYV90eXBlID09IENUUkxfQVRUUl9GQU1JTFlfSUQpIHtcbitcdFx0XHRpZCA9ICoodWludDE2X3QgKikoKGNoYXIgKiluYSArIE5MQV9IRFJMRU4pO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHRcdGxlZnQgLT0gTkxBX0FMSUdONChuYS1cdTAwM2VubGFfbGVuKTtcbitcdFx0bmEgPSAodm9pZCAqKSgoY2hhciAqKW5hICsgTkxBX0FMSUdONChuYS1cdTAwM2VubGFfbGVuKSk7XG4rXHR9XG4rXHRyZXR1cm4gaWQ7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gbGlzdGVuZXIgcmVxdWVzdCBidWlsZGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rLyogRmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIG5lZ2F0aXZlIHRlc3RzOiBhbnkgZmllbGQgY2FuIGJlIG9taXR0ZWQvbWFsZm9ybWVkLiAqL1xuK3N0cnVjdCByYXdfbGlzdGVuZXIge1xuK1x0Y29uc3QgY2hhciAqeHBydDtcdC8qIE5VTEwgLVx1MDAzZSBvbWl0IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FICovXG4rXHRpbnQgZW1pdF9hZGRyO1x0XHQvKiAwIC1cdTAwM2Ugb21pdCBORlNEX0FfU09DS19BRERSICovXG4rXHRjb25zdCB2b2lkICphZGRyO1xuK1x0aW50IGFkZHJfbGVuO1x0XHQvKiBieXRlcyB0byBlbWl0IGZvciBORlNEX0FfU09DS19BRERSICovXG4rfTtcbitcbitzdGF0aWMgaW50IHB1dF9yYXdfbGlzdGVuZXIoY2hhciAqYnVmLCBpbnQgb2ZmLCBjb25zdCBzdHJ1Y3QgcmF3X2xpc3RlbmVyICpyKVxuK3tcbitcdHN0cnVjdCBubGF0dHIgKm5lc3QgPSAodm9pZCAqKShidWYgKyBvZmYpO1xuK1x0aW50IGlubmVyID0gb2ZmICsgTkxBX0hEUkxFTjtcbitcbitcdGlmIChyLVx1MDAzZWVtaXRfYWRkcilcbitcdFx0aW5uZXIgPSBwdXRfYXR0cihidWYsIGlubmVyLCBORlNEX0FfU09DS19BRERSLCByLVx1MDAzZWFkZHIsIHItXHUwMDNlYWRkcl9sZW4pO1xuK1x0aWYgKHItXHUwMDNleHBydClcbitcdFx0aW5uZXIgPSBwdXRfYXR0cihidWYsIGlubmVyLCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSxcbitcdFx0XHRcdCByLVx1MDAzZXhwcnQsIHN0cmxlbihyLVx1MDAzZXhwcnQpICsgMSk7XG4rXHRuZXN0LVx1MDAzZW5sYV90eXBlID0gTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgfCBOTEFfRl9ORVNURUQ7XG4rXHRuZXN0LVx1MDAzZW5sYV9sZW4gPSBpbm5lciAtIG9mZjtcbitcdHJldHVybiBvZmYgKyBOTEFfQUxJR040KG5lc3QtXHUwMDNlbmxhX2xlbik7XG4rfVxuK1xuKy8qIFdlbGwtZm9ybWVkIGxvb3BiYWNrIGxpc3RlbmVyIGZvciBAZmFtaWx5IChBRl9JTkVUIG9yIEFGX0lORVQ2KS4gKi9cbitzdGF0aWMgaW50IHB1dF9saXN0ZW5lcl9hZihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IGNoYXIgKnhwcnQsIGludCBmYW1pbHksXG4rXHRcdFx0ICAgdWludDE2X3QgcG9ydClcbit7XG4rXHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHswfTtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSB4cHJ0LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSBcdTAwMjZzcyB9O1xuK1xuK1x0aWYgKGZhbWlseSA9PSBBRl9JTkVUNikge1xuK1x0XHRzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzNiA9ICh2b2lkICopXHUwMDI2c3M7XG4rXG4rXHRcdHM2LVx1MDAzZXNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7XG4rXHRcdHM2LVx1MDAzZXNpbjZfcG9ydCA9IGh0b25zKHBvcnQpO1xuK1x0XHRzNi1cdTAwM2VzaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrO1xuK1x0XHRyLmFkZHJfbGVuID0gc2l6ZW9mKCpzNik7XG4rXHR9IGVsc2Uge1xuK1x0XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gKnM0ID0gKHZvaWQgKilcdTAwMjZzcztcbitcbitcdFx0czQtXHUwMDNlc2luX2ZhbWlseSA9IEFGX0lORVQ7XG4rXHRcdHM0LVx1MDAzZXNpbl9wb3J0ID0gaHRvbnMocG9ydCk7XG4rXHRcdHM0LVx1MDAzZXNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7XG4rXHRcdHIuYWRkcl9sZW4gPSBzaXplb2YoKnM0KTtcbitcdH1cbitcdHJldHVybiBwdXRfcmF3X2xpc3RlbmVyKGJ1Ziwgb2ZmLCBcdTAwMjZyKTtcbit9XG4rXG4rc3RhdGljIGludCBwdXRfbGlzdGVuZXIoY2hhciAqYnVmLCBpbnQgb2ZmLCBjb25zdCBjaGFyICp4cHJ0LCB1aW50MTZfdCBwb3J0KVxuK3tcbitcdHJldHVybiBwdXRfbGlzdGVuZXJfYWYoYnVmLCBvZmYsIHhwcnQsIEFGX0lORVQsIHBvcnQpO1xuK31cbitcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIExJU1RFTkVSX0dFVCBwYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbitcbitzdHJ1Y3QgbGlzdGVuZXJfZW50IHtcbitcdGNoYXIgeHBydFsxNl07XG4rXHRpbnQgZmFtaWx5O1xuK1x0dWludDE2X3QgcG9ydDtcbitcdHN0cnVjdCBpbl9hZGRyIGE0O1xuK1x0c3RydWN0IGluNl9hZGRyIGE2O1xuK307XG4rXG4rc3RhdGljIGludCBwYXJzZV9saXN0ZW5lcl9nZXQoY29uc3QgY2hhciAqcmJ1ZiwgaW50IGxlbixcbitcdFx0XHQgICAgICBzdHJ1Y3QgbGlzdGVuZXJfZW50ICpvdXQsIGludCBtYXgpXG4re1xuK1x0Y29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGggPSAoY29uc3Qgdm9pZCAqKXJidWY7XG4rXHRjb25zdCBzdHJ1Y3QgbmxhdHRyICpuYTtcbitcdGludCBsZWZ0LCBjb3VudCA9IDA7XG4rXG4rXHQodm9pZClsZW47XG4rXHRuYSA9IChjb25zdCB2b2lkICopKHJidWYgKyBOTE1TR19IRFJMRU4gKyBHRU5MX0hEUkxFTik7XG4rXHRsZWZ0ID0gbmxoLVx1MDAzZW5sbXNnX2xlbiAtIE5MTVNHX0hEUkxFTiAtIEdFTkxfSERSTEVOO1xuK1xuK1x0d2hpbGUgKGxlZnQgXHUwMDNlPSAoaW50KU5MQV9IRFJMRU4pIHtcbitcdFx0aW50IGFsZW4gPSBuYS1cdTAwM2VubGFfbGVuO1xuK1xuK1x0XHRpZiAoKG5hLVx1MDAzZW5sYV90eXBlIFx1MDAyNiBOTEFfVFlQRV9NQVNLKSA9PSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIGNvdW50IFx1MDAzYyBtYXgpIHtcbitcdFx0XHRjb25zdCBzdHJ1Y3QgbmxhdHRyICppbiA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgKyBOTEFfSERSTEVOKTtcbitcdFx0XHRpbnQgaWxlZnQgPSBhbGVuIC0gTkxBX0hEUkxFTjtcbitcdFx0XHRzdHJ1Y3QgbGlzdGVuZXJfZW50ICplID0gXHUwMDI2b3V0W2NvdW50XTtcbitcbitcdFx0XHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XG4rXHRcdFx0d2hpbGUgKGlsZWZ0IFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XG4rXHRcdFx0XHRjb25zdCB2b2lkICpkID0gKGNvbnN0IGNoYXIgKilpbiArIE5MQV9IRFJMRU47XG4rXHRcdFx0XHRpbnQgdCA9IGluLVx1MDAzZW5sYV90eXBlIFx1MDAyNiBOTEFfVFlQRV9NQVNLO1xuK1xuK1x0XHRcdFx0aWYgKHQgPT0gTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUpIHtcbitcdFx0XHRcdFx0c3RybmNweShlLVx1MDAzZXhwcnQsIGQsIHNpemVvZihlLVx1MDAzZXhwcnQpIC0gMSk7XG4rXHRcdFx0XHR9IGVsc2UgaWYgKHQgPT0gTkZTRF9BX1NPQ0tfQUREUikge1xuK1x0XHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc3MgPSBkO1xuK1xuK1x0XHRcdFx0XHRlLVx1MDAzZWZhbWlseSA9IHNzLVx1MDAzZXNzX2ZhbWlseTtcbitcdFx0XHRcdFx0aWYgKHNzLVx1MDAzZXNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7XG4rXHRcdFx0XHRcdFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzID0gZDtcbitcbitcdFx0XHRcdFx0XHRlLVx1MDAzZWE0ID0gcy1cdTAwM2VzaW5fYWRkcjtcbitcdFx0XHRcdFx0XHRlLVx1MDAzZXBvcnQgPSBudG9ocyhzLVx1MDAzZXNpbl9wb3J0KTtcbitcdFx0XHRcdFx0fSBlbHNlIGlmIChzcy1cdTAwM2Vzc19mYW1pbHkgPT0gQUZfSU5FVDYpIHtcbitcdFx0XHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzID0gZDtcbitcbitcdFx0XHRcdFx0XHRlLVx1MDAzZWE2ID0gcy1cdTAwM2VzaW42X2FkZHI7XG4rXHRcdFx0XHRcdFx0ZS1cdTAwM2Vwb3J0ID0gbnRvaHMocy1cdTAwM2VzaW42X3BvcnQpO1xuK1x0XHRcdFx0XHR9XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRpbGVmdCAtPSBOTEFfQUxJR040KGluLVx1MDAzZW5sYV9sZW4pO1xuK1x0XHRcdFx0aW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKWluICsgTkxBX0FMSUdONChpbi1cdTAwM2VubGFfbGVuKSk7XG4rXHRcdFx0fVxuK1x0XHRcdGNvdW50Kys7XG4rXHRcdH1cbitcdFx0bGVmdCAtPSBOTEFfQUxJR040KGFsZW4pO1xuK1x0XHRuYSA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgKyBOTEFfQUxJR040KGFsZW4pKTtcbitcdH1cbitcdHJldHVybiBjb3VudDtcbit9XG4rXG4rLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZW5pZW5jZSB3cmFwcGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rc3RhdGljIGludCBsaXN0ZW5lcl9zZXQoY29uc3QgY2hhciAqYXR0cnMsIGludCBsZW4pXG4re1xuK1x0cmV0dXJuIGdlbmxfcmVxdWVzdChORlNEX0NNRF9MSVNURU5FUl9TRVQsIGF0dHJzLCBsZW4pO1xuK31cbitcbisvKiBGZXRjaCB0aGUgY3VycmVudCBsaXN0ZW5lcnM7IHJldHVybnMgY291bnQgKFx1MDAzZT0wKSBvciAtZXJybm8uICovXG4rc3RhdGljIGludCBsaXN0ZW5lcl9nZXQoc3RydWN0IGxpc3RlbmVyX2VudCAqb3V0LCBpbnQgbWF4KVxuK3tcbitcdGNoYXIgcmJ1Zls4MTkyXTtcbitcdGludCBuID0gZ2VubF9yZXF1ZXN0X3JlcGx5KE5GU0RfQ01EX0xJU1RFTkVSX0dFVCwgcmJ1Ziwgc2l6ZW9mKHJidWYpKTtcbitcbitcdGlmIChuIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gbjtcbitcdHJldHVybiBwYXJzZV9saXN0ZW5lcl9nZXQocmJ1Ziwgbiwgb3V0LCBtYXgpO1xuK31cbitcbitzdGF0aWMgc3RydWN0IGxpc3RlbmVyX2VudCAqZmluZF9saXN0ZW5lcihzdHJ1Y3QgbGlzdGVuZXJfZW50ICplLCBpbnQgbixcbitcdFx0XHRcdFx0ICBjb25zdCBjaGFyICp4cHJ0LCBpbnQgZmFtaWx5LFxuK1x0XHRcdFx0XHQgIHVpbnQxNl90IHBvcnQpXG4re1xuK1x0aW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdGlmIChlW2ldLmZhbWlseSA9PSBmYW1pbHkgXHUwMDI2XHUwMDI2IGVbaV0ucG9ydCA9PSBwb3J0IFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgIXN0cmNtcChlW2ldLnhwcnQsIHhwcnQpKVxuK1x0XHRcdHJldHVybiBcdTAwMjZlW2ldO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qIFN0YXJ0IChAbiBcdTAwM2UgMCkgb3Igc3RvcCAoQG4gPT0gMCkgbmZzZCB0aHJlYWRzIGluIHRoaXMgbmV0bnMuICovXG4rc3RhdGljIGludCB0aHJlYWRzX3NldChpbnQgbilcbit7XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdHVpbnQzMl90IHYgPSBuO1xuK1x0aW50IG9mZiA9IHB1dF9hdHRyKGF0dHJzLCAwLCBORlNEX0FfU0VSVkVSX1RIUkVBRFMsIFx1MDAyNnYsIHNpemVvZih2KSk7XG4rXG4rXHRyZXR1cm4gZ2VubF9yZXF1ZXN0KE5GU0RfQ01EX1RIUkVBRFNfU0VULCBhdHRycywgb2ZmKTtcbit9XG4rXG4rLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBwZXItbmV0bnMgbG9jYWwgcnBjYmluZCBzdHViIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbitcbisvKlxuKyAqIENyZWF0aW5nIGEgbGlzdGVuZXIgcmVnaXN0ZXJzIHdpdGggcnBjYmluZDogc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2EoKVxuKyAqIHBhc3NlcyBmbGFncyBvZiAwLCBzbyBwbWFwX3JlZ2lzdGVyIGlzIHRydWUgaW4gc3ZjX3NldHVwX3NvY2tldCgpLCBhbmRcbisgKiBuZnNkX3ZlcnNpb24zIGlzIHJlZ2lzdGVyYWJsZSBieSBkZWZhdWx0IGFuZCBkb2VzIG5vdCBzZXQgdnNfcnBjYl9vcHRubCxcbisgKiBzbyBhIHJlZ2lzdHJhdGlvbiBmYWlsdXJlIGFib3J0cyBsaXN0ZW5lciBjcmVhdGlvbi4gVGhlIGFic3RyYWN0IEFGX0xPQ0FMXG4rICogbmFtZSB0aGUga2VybmVsIHRyaWVzIGZpcnN0IGlzIHBlci1uZXRucyAodW5peF9maW5kX2Fic3RyYWN0KCkgdGFrZXMgYVxuKyAqIHN0cnVjdCBuZXQpLCBzbyBhbnN3ZXIgaXQgaGVyZSBhbmQgc3RheSBvdXQgb2YgdGhlIGhvc3QncyBycGNiaW5kLlxuKyAqXG4rICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZFxuKyAqIFNFVC9VTlNFVCBnZXQgVFJVRSwgZm9yIGJvdGggUlBDQlZFUlNfMiBhbmQgUlBDQlZFUlNfNC4gdjQgaGFzIHRvIGJlXG4rICogYW5zd2VyZWQgYmVjYXVzZSBfX3N2Y19ycGNiX3JlZ2lzdGVyNigpIHR1cm5zIGEgdjQgcmVmdXNhbCBpbnRvXG4rICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLlxuKyAqXG4rICogSW4gUlBDQl9TVFVCX1JFRlVTRSBtb2RlIFNFVCBpcyBhbnN3ZXJlZCBGQUxTRSBpbnN0ZWFkLCB3aGljaFxuKyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seVxuKyAqIHN2Y191bnJlZ2lzdGVyKCkgaXNzdWVzIGl0LCBhbmQgaXQgZGlzY2FyZHMgdGhlIHJlc3VsdC5cbisgKi9cbisjZGVmaW5lIFJQQ0JfUFJPR1JBTVx0XHQxMDAwMDBcbisjZGVmaW5lIFJQQ0JfUFJPQ19OVUxMXHRcdDBcbisjZGVmaW5lIFJQQ0JfUFJPQ19TRVRcdFx0MVxuKyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUXHRcdDJcbisjZGVmaW5lIFJQQ0JfQUJTVFJBQ1RfTkFNRVx0XCIvcnVuL3JwY2JpbmQuc29ja1wiXG4rI2RlZmluZSBSUENCX1NUVUJfTUFYQ09OTlx0NFxuK1xuK2VudW0geyBSUENCX1NUVUJfQUNDRVBULCBSUENCX1NUVUJfUkVGVVNFIH07XG4rXG4rc3RhdGljIGludCBycGNiX3N0dWJfbGlzdGVuKHZvaWQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3VuIHN1biA9IHsgLnN1bl9mYW1pbHkgPSBBRl9VTklYIH07XG4rXHRzaXplX3QgbmxlbiA9IHN0cmxlbihSUENCX0FCU1RSQUNUX05BTUUpO1xuK1x0c29ja2xlbl90IGFsZW47XG4rXHRpbnQgZmQ7XG4rXG4rXHQvKiBBYnN0cmFjdCBuYW1lcyBhcmUgbGVuZ3RoLWRlbGltaXRlZCwgc28gdGhlIGxlbmd0aCBtdXN0IG1hdGNoLiAqL1xuK1x0bWVtY3B5KHN1bi5zdW5fcGF0aCArIDEsIFJQQ0JfQUJTVFJBQ1RfTkFNRSwgbmxlbik7XG4rXHRhbGVuID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyAxICsgbmxlbjtcbitcbitcdGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0aWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZzdW4sIGFsZW4pIFx1MDAzYyAwIHx8XG4rXHQgICAgbGlzdGVuKGZkLCBSUENCX1NUVUJfTUFYQ09OTikgXHUwMDNjIDApIHtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRyZXR1cm4gZmQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnBjYl9zdHViX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pXG4re1xuK1x0c2l6ZV90IGRvbmUgPSAwO1xuK1xuK1x0d2hpbGUgKGRvbmUgXHUwMDNjIGxlbikge1xuK1x0XHRzc2l6ZV90IG4gPSByZWFkKGZkLCAoY2hhciAqKWJ1ZiArIGRvbmUsIGxlbiAtIGRvbmUpO1xuK1xuK1x0XHRpZiAobiBcdTAwM2M9IDApXG4rXHRcdFx0cmV0dXJuIC0xO1xuK1x0XHRkb25lICs9IG47XG4rXHR9XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyogSGFuZGxlIG9uZSByZWNvcmQtbWFya2VkIFJQQyBjYWxsLiBSZXR1cm5zIC0xIHdoZW4gdGhlIHBlZXIgaXMgZG9uZS4gKi9cbitzdGF0aWMgaW50IHJwY2Jfc3R1Yl9jYWxsKGludCBmZCwgaW50IG1vZGUpXG4re1xuK1x0dWludDMyX3QgbWFyaywgY2FsbFs2XSwgcmVwWzddO1xuK1x0dW5zaWduZWQgaW50IGxlbiwgbnJlcCA9IDY7XG4rXHRzaXplX3QgcmVwbGVuO1xuK1xuK1x0aWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBcdTAwMjZtYXJrLCBzaXplb2YobWFyaykpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRsZW4gPSBudG9obChtYXJrKSBcdTAwMjYgMHg3ZmZmZmZmZjtcbitcdGlmIChsZW4gXHUwMDNjIHNpemVvZihjYWxsKSB8fCBsZW4gXHUwMDNlIDQwOTYpXG4rXHRcdHJldHVybiAtMTtcbitcdGlmIChycGNiX3N0dWJfcmVhZChmZCwgY2FsbCwgc2l6ZW9mKGNhbGwpKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0LyogeGlkLCBtc2dfdHlwZSwgcnBjdmVycywgcHJvZywgdmVycywgcHJvYzsgdGhlIHJlc3QgaXMgZGlzY2FyZGVkICovXG4rXHRmb3IgKGxlbiAtPSBzaXplb2YoY2FsbCk7IGxlbjsgKSB7XG4rXHRcdGNoYXIgc2lua1syNTZdO1xuK1x0XHR1bnNpZ25lZCBpbnQgbiA9IGxlbiBcdTAwM2Ugc2l6ZW9mKHNpbmspID8gc2l6ZW9mKHNpbmspIDogbGVuO1xuK1xuK1x0XHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIHNpbmssIG4pKVxuK1x0XHRcdHJldHVybiAtMTtcbitcdFx0bGVuIC09IG47XG4rXHR9XG4rXG4rXHRyZXBbMF0gPSBjYWxsWzBdO1x0XHQvKiB4aWQgKi9cbitcdHJlcFsxXSA9IGh0b25sKDEpO1x0XHQvKiBSRVBMWSAqL1xuK1x0cmVwWzJdID0gaHRvbmwoMCk7XHRcdC8qIE1TR19BQ0NFUFRFRCAqL1xuK1x0cmVwWzNdID0gaHRvbmwoMCk7XHRcdC8qIHZlcmlmaWVyIGZsYXZvciBBVVRIX05VTEwgKi9cbitcdHJlcFs0XSA9IGh0b25sKDApO1x0XHQvKiB2ZXJpZmllciBsZW5ndGggKi9cbitcdHJlcFs1XSA9IGh0b25sKDApO1x0XHQvKiBTVUNDRVNTICovXG4rXG4rXHRpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7XG4rXHRcdHJlcFs1XSA9IGh0b25sKDEpO1x0LyogUFJPR19VTkFWQUlMICovXG4rXHR9IGVsc2Uge1xuK1x0XHRzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7XG4rXHRcdGNhc2UgUlBDQl9QUk9DX05VTEw6XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgUlBDQl9QUk9DX1NFVDpcbitcdFx0XHRyZXBbNl0gPSBodG9ubChtb2RlID09IFJQQ0JfU1RVQl9SRUZVU0UgPyAwIDogMSk7XG4rXHRcdFx0bnJlcCA9IDc7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgUlBDQl9QUk9DX1VOU0VUOlxuK1x0XHRcdHJlcFs2XSA9IGh0b25sKDEpO1x0LyogVFJVRSAqL1xuK1x0XHRcdG5yZXAgPSA3O1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdHJlcFs1XSA9IGh0b25sKDMpO1x0LyogUFJPQ19VTkFWQUlMICovXG4rXHRcdH1cbitcdH1cbitcbitcdHJlcGxlbiA9IG5yZXAgKiBzaXplb2YocmVwWzBdKTtcbitcdG1hcmsgPSBodG9ubCgweDgwMDAwMDAwIHwgcmVwbGVuKTtcbitcdGlmICh3cml0ZShmZCwgXHUwMDI2bWFyaywgc2l6ZW9mKG1hcmspKSAhPSAoc3NpemVfdClzaXplb2YobWFyaykgfHxcbitcdCAgICB3cml0ZShmZCwgcmVwLCByZXBsZW4pICE9IChzc2l6ZV90KXJlcGxlbilcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSlcbit7XG4rXHRzdHJ1Y3QgcG9sbGZkIHBmZFsxICsgUlBDQl9TVFVCX01BWENPTk5dO1xuK1x0bmZkc190IG4gPSAxLCBpO1xuK1xuK1x0cGZkWzBdLmZkID0gbGZkO1xuK1xuK1x0Zm9yICg7Oykge1xuK1x0XHQvKiBzdG9wIHBvbGxpbmcgdGhlIGxpc3RlbmVyIHdoZW4gZnVsbCwgb3IgcG9sbCgpIHNwaW5zICovXG4rXHRcdHBmZFswXS5ldmVudHMgPSBuIFx1MDAzYyAxICsgUlBDQl9TVFVCX01BWENPTk4gPyBQT0xMSU4gOiAwO1xuK1xuK1x0XHRpZiAocG9sbChwZmQsIG4sIC0xKSBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm47XG4rXG4rXHRcdGlmIChwZmRbMF0ucmV2ZW50cyBcdTAwMjYgUE9MTElOKSB7XG4rXHRcdFx0aW50IGMgPSBhY2NlcHQobGZkLCBOVUxMLCBOVUxMKTtcbitcbitcdFx0XHRpZiAoYyBcdTAwM2U9IDApIHtcbitcdFx0XHRcdHBmZFtuXS5mZCA9IGM7XG4rXHRcdFx0XHRwZmRbbl0uZXZlbnRzID0gUE9MTElOO1xuK1x0XHRcdFx0bisrO1xuK1x0XHRcdH1cbitcdFx0fVxuK1xuK1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBuOyBpKyspIHtcbitcdFx0XHRpZiAoIShwZmRbaV0ucmV2ZW50cyBcdTAwMjYgKFBPTExJTiB8IFBPTExIVVAgfCBQT0xMRVJSKSkpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRpZiAocnBjYl9zdHViX2NhbGwocGZkW2ldLmZkLCBtb2RlKSkge1xuK1x0XHRcdFx0Y2xvc2UocGZkW2ldLmZkKTtcbitcdFx0XHRcdHBmZFtpXSA9IHBmZFstLW5dO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0fVxuK31cbitcbisvKiBSZXR1cm5zIHRoZSBzdHViJ3MgcGlkLCBvciAtMS4gVGhlIHNvY2tldCBpcyBsaXN0ZW5pbmcgYmVmb3JlIHdlIGZvcmsuICovXG4rc3RhdGljIHBpZF90IHJwY2Jfc3R1Yl9zdGFydChpbnQgbW9kZSlcbit7XG4rXHRpbnQgbGZkID0gcnBjYl9zdHViX2xpc3RlbigpO1xuK1x0cGlkX3QgcGlkO1xuK1xuK1x0aWYgKGxmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cGlkID0gZm9yaygpO1xuK1x0aWYgKHBpZCBcdTAwM2MgMCkge1xuK1x0XHRjbG9zZShsZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRpZiAocGlkID09IDApIHtcbitcdFx0c2lnbmFsKFNJR1BJUEUsIFNJR19JR04pO1xuK1x0XHRwcmN0bChQUl9TRVRfUERFQVRIU0lHLCBTSUdLSUxMKTtcbitcdFx0aWYgKGdldHBwaWQoKSA9PSAxKVx0XHQvKiByYWNlZCB3aXRoIHBhcmVudCBleGl0ICovXG4rXHRcdFx0X2V4aXQoMCk7XG4rXHRcdHJwY2Jfc3R1Yl9zZXJ2ZShsZmQsIG1vZGUpO1xuK1x0XHRfZXhpdCgwKTtcbitcdH1cbitcbitcdGNsb3NlKGxmZCk7XG4rXHRyZXR1cm4gcGlkO1xuK31cbitcbisvKlxuKyAqIFN3YXAgdGhlIHN0dWIgZm9yIG9uZSBpbiBAbW9kZS4gU2FmZSBiZWZvcmUgdGhlIGZpcnN0IHJlcXVlc3Q6IG5vIHNlcnZcbisgKiBleGlzdHMgeWV0LCBzbyB0aGUga2VybmVsIGhhcyBub3QgY29ubmVjdGVkIGFuZCB0aGUgYWJzdHJhY3QgbmFtZSBpcyBmcmVlXG4rICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLlxuKyAqL1xuK3N0YXRpYyBpbnQgcnBjYl9zdHViX3Jlc3RhcnQocGlkX3QgKnBpZCwgaW50IG1vZGUpXG4re1xuK1x0aWYgKCpwaWQgXHUwMDNlIDApIHtcbitcdFx0a2lsbCgqcGlkLCBTSUdLSUxMKTtcbitcdFx0d2FpdHBpZCgqcGlkLCBOVUxMLCAwKTtcbitcdH1cbitcdCpwaWQgPSBycGNiX3N0dWJfc3RhcnQobW9kZSk7XG4rXHRyZXR1cm4gKnBpZCBcdTAwM2UgMCA/IDAgOiAtMTtcbit9XG4rXG4rLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rRklYVFVSRShuZnNkX2xpc3RlbmVyKSB7XG4rXHRwaWRfdCBycGNiZDtcbit9O1xuK1xuK0ZJWFRVUkVfU0VUVVAobmZzZF9saXN0ZW5lcilcbit7XG4rXHRzdHJ1Y3QgaWZyZXEgaWZyID0gezB9O1xuK1x0c3RydWN0IHN0YXQgc3Q7XG4rXHRpbnQgcztcbitcbitcdGlmIChnZXRldWlkKCkgIT0gMClcbitcdFx0U0tJUChyZXR1cm4sIFwibXVzdCBiZSBydW4gYXMgcm9vdFwiKTtcbitcdGlmICh1bnNoYXJlKENMT05FX05FV05FVCB8IENMT05FX05FV05TKSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwidW5zaGFyZShORVdORVR8TkVXTlMpOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0aWYgKG1vdW50KFwiXCIsIFwiL1wiLCBOVUxMLCBNU19SRUMgfCBNU19QUklWQVRFLCBOVUxMKSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwibW91bnQoLyBwcml2YXRlKTogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcbitcdC8qXG4rXHQgKiBLZWVwIHRoZSBrZXJuZWwncyBycGNiaW5kIGNsaWVudCBpbnNpZGUgdGhpcyBuYW1lc3BhY2UuIFRoZVxuK1x0ICogYWJzdHJhY3Qgc29ja2V0IGl0IHRyaWVzIGZpcnN0IGlzIHBlci1uZXRucywgYnV0IHRoZVxuK1x0ICogXCIvdmFyL3J1bi9ycGNiaW5kLnNvY2tcIiBmYWxsYmFjayBpcyBub3QsIHNvIGhpZGUgdGhlIHBhdGguXG4rXHQgKi9cbitcdGlmIChtb3VudChcInRtcGZzXCIsIFwiL3J1blwiLCBcInRtcGZzXCIsIDAsIE5VTEwpIFx1MDAzYyAwKVxuK1x0XHRTS0lQKHJldHVybiwgXCJtb3VudCh0bXBmcyBvbiAvcnVuKTogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdGlmIChsc3RhdChcIi92YXIvcnVuXCIsIFx1MDAyNnN0KSA9PSAwIFx1MDAyNlx1MDAyNiBTX0lTRElSKHN0LnN0X21vZGUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIG1vdW50KFwidG1wZnNcIiwgXCIvdmFyL3J1blwiLCBcInRtcGZzXCIsIDAsIE5VTEwpIFx1MDAzYyAwKVxuK1x0XHRTS0lQKHJldHVybiwgXCJtb3VudCh0bXBmcyBvbiAvdmFyL3J1bik6ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXG4rXHQvKiBCcmluZyBsb29wYmFjayB1cCBzbyBsaXN0ZW5lciBiaW5kcyAoMTI3LjAuMC4xIC8gOjoxKSB3b3JrLiAqL1xuK1x0cyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTtcbitcdEFTU0VSVF9HRShzLCAwKTtcbitcdHN0cmNweShpZnIuaWZyX25hbWUsIFwibG9cIik7XG4rXHRBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ0dJRkZMQUdTLCBcdTAwMjZpZnIpKTtcbitcdGlmci5pZnJfZmxhZ3MgfD0gSUZGX1VQIHwgSUZGX1JVTk5JTkc7XG4rXHRBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ1NJRkZMQUdTLCBcdTAwMjZpZnIpKTtcbitcdGNsb3NlKHMpO1xuK1xuK1x0bmZzZF9mYW1pbHkgPSBnZW5sX3Jlc29sdmVfbmZzZCgpO1xuK1x0aWYgKG5mc2RfZmFtaWx5IFx1MDAzYyAwKVxuK1x0XHRTS0lQKHJldHVybiwgXCJuZnNkIGdlbmwgZmFtaWx5IG5vdCBmb3VuZCAobW9kcHJvYmUgbmZzZD8pXCIpO1xuK1xuK1x0c2VsZi1cdTAwM2VycGNiZCA9IHJwY2Jfc3R1Yl9zdGFydChSUENCX1NUVUJfQUNDRVBUKTtcbitcdGlmIChzZWxmLVx1MDAzZXJwY2JkIFx1MDAzYyAwKVxuK1x0XHRTS0lQKHJldHVybiwgXCJjYW5ub3Qgc3RhcnQgdGhlIHJwY2JpbmQgc3R1YjogJXNcIixcbitcdFx0ICAgICBzdHJlcnJvcihlcnJubykpO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKG5mc2RfbGlzdGVuZXIpXG4re1xuK1x0aWYgKHNlbGYtXHUwMDNlcnBjYmQgXHUwMDNlIDApIHtcbitcdFx0a2lsbChzZWxmLVx1MDAzZXJwY2JkLCBTSUdLSUxMKTtcbitcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXJwY2JkLCBOVUxMLCAwKTtcbitcdH1cbit9XG4rXG4rLyogPT09PT09PT09PT09PT09PT09PT09IHZhbGlkYXRpb24gLyBuZWdhdGl2ZSA9PT09PT09PT09PT09PT09PT09PT0gKi9cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2VtcHR5X2xpc3Rfb2spXG4re1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfdG9vX21hbnkpXG4re1xuK1x0c3RhdGljIGNoYXIgYXR0cnNbMSBcdTAwM2NcdTAwM2MgMjBdO1xuK1x0aW50IGksIG9mZiA9IDA7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyAxMDI1OyBpKyspXHRcdC8qIFx1MDAzZSBORlNEX05MX0xJU1RFTkVSX01BWCAoMTAyNCkgKi9cbitcdFx0b2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXHRFWFBFQ1RfRVEoLUUyQklHLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX21pc3NpbmdfYWRkcilcbit7XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcInRjcFwiLCAuZW1pdF9hZGRyID0gMCB9O1xuK1x0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFx1MDAyNnIpO1xuK1xuK1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ190cmFuc3BvcnQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX2luIHM0ID0geyAuc2luX2ZhbWlseSA9IEFGX0lORVQsIC5zaW5fcG9ydCA9IGh0b25zKFRFU1RfUE9SVCkgfTtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBOVUxMLCAuZW1pdF9hZGRyID0gMSxcbitcdFx0XHRcdCAgLmFkZHIgPSBcdTAwMjZzNCwgLmFkZHJfbGVuID0gc2l6ZW9mKHM0KSB9O1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4rXG4rXHRFWFBFQ1RfRVEoLUVJTlZBTCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rLypcbisgKiBBIG5hbWUgbWF0Y2hpbmcgbm8gdHJhbnNwb3J0IGNsYXNzIG11c3QgYmUgcmVmdXNlZCBiZWZvcmUgbmZzZF9tdXRleCBpc1xuKyAqIHRha2VuLCBzbyBpdCBuZXZlciByZWFjaGVzIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCkgYW5kIGl0c1xuKyAqIHJlcXVlc3RfbW9kdWxlKFwic3ZjJXNcIiwgbmFtZSkgdXBjYWxsLlxuKyAqL1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX3RyYW5zcG9ydClcbit7XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwiYm9ndXNfeHBydFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0RVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYWRkcl90b29fc2hvcnQpXG4re1xuK1x0dW5zaWduZWQgY2hhciB0aW55ID0gMDtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcInRjcFwiLCAuZW1pdF9hZGRyID0gMSxcbitcdFx0XHRcdCAgLmFkZHIgPSBcdTAwMjZ0aW55LCAuYWRkcl9sZW4gPSAxIH07XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXRfc2hvcnQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX2luIHM0ID0geyAuc2luX2ZhbWlseSA9IEFGX0lORVQsIC5zaW5fcG9ydCA9IGh0b25zKFRFU1RfUE9SVCkgfTtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcInRjcFwiLCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSBcdTAwMjZzNCxcbitcdFx0XHRcdCAgLmFkZHJfbGVuID0gc2l6ZW9mKHNhX2ZhbWlseV90KSArIDIgfTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFx1MDAyNnIpO1xuK1xuK1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldDZfc2hvcnQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2czYsXG4rXHRcdFx0XHQgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2JhZF9mYW1pbHkpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7IC5zc19mYW1pbHkgPSBBRl9VTklYIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2c3MsXG4rXHRcdFx0XHQgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7IC5zc19mYW1pbHkgPSBBRl9VTklYIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIGJhZCA9IHsgLnhwcnQgPSBcInRjcFwiLCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSBcdTAwMjZzcyxcbitcdFx0XHRcdCAgICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuK1x0Y2hhciBhdHRyc1sxMjhdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXHUwMDI2YmFkKTtcbitcdC8qIFRoZSB3aG9sZSByZXF1ZXN0IGlzIHJlamVjdGVkIGR1cmluZyB2YWxpZGF0aW9uOyBub3RoaW5nIGFwcGxpZWQuICovXG4rXHRFWFBFQ1RfRVEoLUVBRk5PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rLypcbisgKiBBIHJlamVjdGVkIHJlcXVlc3QgbXVzdCBsZWF2ZSB0aGUgbGlzdGVuZXJzIHRoYXQgYXJlIGFscmVhZHkgdXAgYWxvbmUuXG4rICogVGhlIGVycm5vIGFsb25lIGRvZXMgbm90IHNob3cgdGhhdDogc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2EoKSByZXR1cm5zXG4rICogLUVQUk9UT05PU1VQUE9SVCBmb3IgYW4gdW5rbm93biBuYW1lIHRvby4gV2hhdCBkaWZmZXJzIGlzIGhvdyBmYXIgdGhlXG4rICogcmVxdWVzdCBnZXRzIC0tIHdpdGhvdXQgdGhlIGNoZWNrIGluIG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKCksXG4rICogbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCgpIGhhcyBhbHJlYWR5IG1vdmVkIHRoZSB1bm1hdGNoZWQgdGNwIGxpc3RlbmVyXG4rICogb2ZmIHN2X3Blcm1zb2NrcyBhbmQgcnVuIHN2Y194cHJ0X2Rlc3Ryb3lfYWxsKCkgb24gaXQgYnkgdGhlIHRpbWUgdGhlXG4rICogbmFtZSBmYWlscy5cbisgKi9cbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3JlamVjdF9rZWVwc19saXN0ZW5lcnMpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGdvb2RbNjRdLCBiYWRbNjRdO1xuK1x0aW50IG9nID0gcHV0X2xpc3RlbmVyKGdvb2QsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXHRpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYmFkLCAwLCBcImJvZ3VzX3hwcnRcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoZ29vZCwgb2cpKTtcbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXG4rXHRFWFBFQ1RfRVEoLUVQUk9UT05PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGJhZCwgb2IpKTtcbitcbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gZnVuY3Rpb25hbCAvIHJvdW5kLXRyaXAgPT09PT09PT09PT09PT09PT09PT09ICovXG4rXG4rLyogTElTVEVORVJfR0VUIHdpdGggbm8gc2VydiBpbiB0aGlzIG5ldG5zIHJldHVybnMgYW4gZW1wdHkgbGlzdC4gKi9cbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19nZXRfZW1wdHkpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdGNwKVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCBcInRjcFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbitcdEVYUEVDVF9FUShodG9ubChJTkFERFJfTE9PUEJBQ0spLCBnb3RbMF0uYTQuc19hZGRyKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX3VkcClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ1ZHBcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ1ZHBcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2NyZWF0ZV9tdWx0aSlcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbMTI4XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXCJ1ZHBcIiwgVEVTVF9QT1JUKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0QVNTRVJUX0VRKDIsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwidWRwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19pZGVtcG90ZW50KVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcdFx0LyogcmUtc2V0IHNhbWUgbGlzdCAqL1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2FkZClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgb25lWzY0XSwgdHdvWzEyOF07XG4rXHRpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1x0aW50IG8yID0gcHV0X2xpc3RlbmVyKHR3bywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdG8yID0gcHV0X2xpc3RlbmVyKHR3bywgbzIsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpO1x0XHQvKiBhZGQgdWRwLCBrZWVwIHRjcCAqL1xuK1x0QVNTRVJUX0VRKDIsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwidWRwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19yZW1vdmVfc3Vic2V0KVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBib3RoWzEyOF0sIG9uZVs2NF07XG4rXHRpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcdGludCBvbyA9IHB1dF9saXN0ZW5lcihvbmUsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvYiA9IHB1dF9saXN0ZW5lcihib3RoLCBvYiwgXCJ1ZHBcIiwgVEVTVF9QT1JUKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYm90aCwgb2IpKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvbykpO1x0XHQvKiBkcm9wIHVkcCAqL1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2VtcHR5X2Rlc3Ryb3lzKVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcdFx0LyogZW1wdHkgLVx1MDAzZSBkZXN0cm95IHNlcnYgKi9cbitcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYsIHM7XG4rXG4rXHRzID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7XG4rXHRpZiAocyBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwiSVB2NiB1bmF2YWlsYWJsZTogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdGNsb3NlKHMpO1xuK1xuK1x0b2ZmID0gcHV0X2xpc3RlbmVyX2FmKGF0dHJzLCAwLCBcInRjcFwiLCBBRl9JTkVUNiwgVEVTVF9QT1JUKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ0Y3BcIiwgQUZfSU5FVDYsIFRFU1RfUE9SVCkpO1xuK1x0RVhQRUNUX0VRKDAsIG1lbWNtcChcdTAwMjZnb3RbMF0uYTYsIFx1MDAyNmluNmFkZHJfbG9vcGJhY2ssIHNpemVvZihpbjZhZGRyX2xvb3BiYWNrKSkpO1xuK31cbitcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gcnBjYmluZCByZWdpc3RyYXRpb24gPT09PT09PT09PT09PT09PT09PT09ICovXG4rXG4rLypcbisgKiBBIHJwY2JpbmQgdGhhdCByZWZ1c2VzIHRoZSByZWdpc3RyYXRpb24gbXVzdCBmYWlsIGxpc3RlbmVyIGNyZWF0aW9uLFxuKyAqIHdoYXRldmVyIENPTkZJR19ORlNfTE9DQUxJTyBpcyBzZXQgdG8uXG4rICpcbisgKiBUaGUgZXJyb3IgaGFzIHRvIHN1cnZpdmUgc3ZjX3JlZ2lzdGVyKCkncyB3YWxrIG92ZXIgc3ZfcHJvZ3JhbXMgdG8gZ2V0XG4rICogaGVyZS4gV2l0aCBDT05GSUdfTkZTX0xPQ0FMSU89eSB0aGUgdHJhaWxpbmcgbmZzbG9jYWxpbyBwcm9ncmFtIGhhcyBvbmx5XG4rICogYSBOVUxMIGFuZCBhIHZzX2hpZGRlbiB2ZXJzaW9uLCBhbmQgc3ZjX2dlbmVyaWNfcnBjYmluZF9zZXQoKSByZXBvcnRzIDBcbisgKiBmb3IgYm90aCwgc28gYW4gc3ZjX3JlZ2lzdGVyKCkgdGhhdCBrZWVwcyB0aGUgbGFzdCByZXN1bHQgcmF0aGVyIHRoYW4gdGhlXG4rICogZmlyc3QgaGFuZHMgYmFjayBzdWNjZXNzIGFuZCB0aGUgbGlzdGVuZXIgY29tZXMgdXAgcmVnYXJkbGVzcy5cbisgKi9cbitURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX3JlZ2lzdGVyX3JlZnVzZWQpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRBU1NFUlRfRVEoMCwgcnBjYl9zdHViX3Jlc3RhcnQoXHUwMDI2c2VsZi1cdTAwM2VycGNiZCwgUlBDQl9TVFVCX1JFRlVTRSkpO1xuK1xuK1x0RVhQRUNUX0VRKC1FQUNDRVMsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK31cbitcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gdGhyZWFkcyAvIC1FQlVTWSBzZW1hbnRpY3MgPT09PT09PT09PT09PT09PT09PT09ICovXG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX2NoYW5nZSlcbit7XG4rXHRjaGFyIG9uZVs2NF0sIHR3b1sxMjhdO1xuK1x0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcdGludCBvMiA9IHB1dF9saXN0ZW5lcih0d28sIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCBcInVkcFwiLCBURVNUX1BPUlQpO1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7XG4rXHRBU1NFUlRfRVEoMCwgdGhyZWFkc19zZXQoMSkpO1x0XHRcdC8qIHRocmVhZHMgbm93IHJ1bm5pbmcgKi9cbitcdEVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7XHQvKiBhZGQgcmVmdXNlZCAqL1xuK1x0dGhyZWFkc19zZXQoMCk7XHRcdFx0XHRcdC8qIHN0b3AgYmVmb3JlIG5ldG5zIGV4aXQgKi9cbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX3JlbW92ZSlcbit7XG4rXHRjaGFyIG9uZVs2NF07XG4rXHRpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7XG4rXHRBU1NFUlRfRVEoMCwgdGhyZWFkc19zZXQoMSkpO1xuK1x0RVhQRUNUX0VRKC1FQlVTWSwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcdC8qIHJlbW92ZSByZWZ1c2VkICovXG4rXHR0aHJlYWRzX3NldCgwKTtcbit9XG4rXG4rVEVTVF9IQVJORVNTX01BSU5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL3NldHRpbmdzIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5nc1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjYwOTFiNDVkMjI2YmFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3NcbkBAIC0wLDAgKzEgQEBcbit0aW1lb3V0PTEyMFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MjcuOTA3NTI2NDc5WiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkxNzU0MTU5OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFRoaXMgTkZTZCBOZXRsaW5rIExpc3RlbmVyIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdGhlIGNvcmUgY2hhbmdlcyBhbmQgcG90ZW50aWFsIGltcGxpY2F0aW9ucywgZXNwZWNpYWxseSByZWdhcmRpbmcgc2VjdXJpdHkgYW5kIHN0YWJpbGl0eSwgZ2l2ZW4gbXkgZXhwZXJ0aXNlIGluIHRoaXMgYXJlYS5cblxuRmlyc3QsIEkgc2VlIG1vZGlmaWNhdGlvbnMgdG8gYGZzL25mc2QvbmZzY3RsLmNgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AsIGFuZCBgbmV0L3N1bnJwYy9zdmMuY2AsIGFsb25nc2lkZSBhIG5ldyBzZWxmLXRlc3QgZm9yIHRoZSBORlNkIG5ldGxpbmsgbGlzdGVuZXIuIEdvb2QgdG8gc2VlIHRoZSBhZGRpdGlvbiBvZiBhIHNlbGZ0ZXN0OyB0aGF0J3MgY3JpdGljYWwgZm9yIHJlZ3Jlc3Npb24gcHJldmVudGlvbi5cblxuSW4gYGZzL25mc2QvbmZzY3RsLmNgLCB0aGUgaW50cm9kdWN0aW9uIG9mIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgIGFuZCB0aGUgbW9kaWZpY2F0aW9uIG9mIGBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVyc2AgaW1tZWRpYXRlbHkgY2F0Y2ggbXkgZXllLiBTcGVjaWZpY2FsbHksIEkgbm90ZSB0aGUgbGltaXRpbmcgb2YgbGlzdGVuZXJzIHRvIGBORlNEX05MX0xJU1RFTkVSX01BWGAgKDEwMjQpLCBhIHNlbnNpYmxlIHByZWNhdXRpb24gYWdhaW5zdCBEb1MuIFRoZSBpbmNsdXNpb24gb2YgdGhlIGNoZWNrIHVzaW5nIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgIHdpdGhpbiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIGlzIGFsc28gd2VsY29tZS4gVGhlIGNoYW5nZSB0byBzZXQgdGhlIGVycm9yIG1lc3NhZ2UgdmlhIGBOTF9TRVRfRVJSX01TR19GTVRgIGluIGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBvbiBgc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2FgIGZhaWx1cmUgaXMgYSBnb29kIGRlYnVnZ2luZyBpbXByb3ZlbWVudC5cblxuTW92aW5nIHRvIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgdGhlIGFkZGl0aW9uIGFuZCB1c2Ugb2YgYHJwY2JfbG9jYWxfdGltZW91dGAgaW4gYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAgc3VnZ2VzdHMgYSBwb3RlbnRpYWwgcGVyZm9ybWFuY2Ugb3Igcm9idXN0bmVzcyBpbXByb3ZlbWVudCByZWxhdGVkIHRvIGxvY2FsIFJQQyBjb25uZWN0aW9ucy4gSSdsbCBuZWVkIHRvIGV4YW1pbmUgdGhlIHRpbWVvdXQgdmFsdWVzIGFuZCB0aGVpciBpbXBhY3Qgb24gb3ZlcmFsbCBSUEMgbGF0ZW5jeS5cblxuSW4gYG5ldC9zdW5ycGMvc3ZjLmNgLCB0aGUgY2hhbmdlIHRvIGBzdmNfcmVnaXN0ZXJgIHRvIHJldGFpbiB0aGUgZmlyc3QgZXJyb3IgZnJvbSBgcHJvZ3AtXHUwMDNlcGdfcnBjYmluZF9zZXRgIGlzIGEgc2lnbmlmaWNhbnQgb25lLiBUaGUgcHJldmlvdXMgYmVoYXZpb3Igb2Ygb3ZlcndyaXRpbmcgYW4gaW5pdGlhbCBlcnJvciB3aXRoIHplcm8gaXMsIGZyYW5rbHksIGluY29ycmVjdCBhbmQgY291bGQgbGVhZCB0byBzaWxlbnQgZmFpbHVyZXMuIFRoaXMgaXMgYSBjbGVhciBpbXByb3ZlbWVudCBpbiBlcnJvciByZXBvcnRpbmcsIGFuZCBJJ20gZ2xhZCB0byBzZWUgdGhpcyBjb3JyZWN0aW9uLlxuXG5Ob3csIG15IG1vcmUgaW1tZWRpYXRlIGNvbmNlcm4gaXMgd2l0aCB0aGUgcG90ZW50aWFsIGZvciB2dWxuZXJhYmlsaXRpZXMuIEkgc2VlIGEgcG90ZW50aWFsIGFyZWEgdG8gYXNzZXNzIGluIGBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVyc2AuIFNwZWNpZmljYWxseSB0aGUgZm9sbG93aW5nIGxpbmVzOlxuXG5gYGBjXG5cdFx0aWYgKCF0YltORlNEX0FfU09DS19BRERSXSB8fCAhdGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKVxuXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG5cblx0XHRpZiAoIW5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChubGFfZGF0YSh0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pKSlcblx0XHRcdHJldHVybiAtRVBST1RPTk9TVVBQT1JUO1xuYGBgXG5IZXJlLCBgbmxhX2RhdGFgIHJldHJpZXZlcyB0aGUgcGF5bG9hZCBvZiBhIG5ldGxpbmsgYXR0cmlidXRlLiBUaGlzIGlzIGJlaW5nIHBhc3NlZCB0byBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCwgd2hpY2gsIGZyb20gYSBicmllZiBnbGFuY2UsIHNlZW1zIHRvIHVzZSBgc3RyY21wYC4gTXkgcXVlc3Rpb24gaXMsIGlzIHRoZSBwYXlsb2FkIG9mIHRoaXMgbmV0bGluayBhdHRyaWJ1dGUgZ3VhcmFudGVlZCB0byBiZSBudWxsLXRlcm1pbmF0ZWQ/IElmIG5vdCwgd2UgaGF2ZSBhIGNsZWFyIHBvdGVudGlhbCBmb3IgYSBidWZmZXIgb3ZlcmZsb3cgd2l0aCBgc3RyY21wYC4gSSAqbXVzdCogdmVyaWZ5IHRoZSBkZWZpbml0aW9uIG9mIGBuZnNkX3NvY2tfbmxfcG9saWN5YCBpbiBgZnMvbmZzZC9uZnNjdGwuY2AgdG8gc2VlIGlmIHRoZSBuZXRsaW5rIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGFkZHJlc3NlcyBudWxsIHRlcm1pbmF0aW9uLiBUaGlzIGlzIGEgY3JpdGljYWwgcG9pbnQgdGhhdCBuZWVkcyBhIHRob3JvdWdoIGludmVzdGlnYXRpb24gdG8gZW5zdXJlIHRoaXMgcGF0Y2ggZG9lc24ndCBpbnRyb2R1Y2UgYSBzZWN1cml0eSBob2xlLiBUaGlzIGlzIHRoZSBmaXJzdCB0aGluZyBJJ2xsIGNoZWNrLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjAyNSwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU3OSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjQwOjM3LjA4Mjk0Njc2NVoiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzY1NDI2OTY5OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZnNkX3NvY2tfbmxfcG9saWN5XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL25mc2QvbmV0bGluay5jPTM1PWNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiArIDFdID0ge1xcbi0tXFxuZnMvbmZzZC9uZXRsaW5rLmMtMzgtXFxuZnMvbmZzZC9uZXRsaW5rLmM6Mzk6Y29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZzZF9zb2NrX25sX3BvbGljeVtORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSArIDFdID0ge1xcbmZzL25mc2QvbmV0bGluay5jLTQwLVxcdFtORlNEX0FfU09DS19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCB9LFxcbi0tXFxuZnMvbmZzZC9uZXRsaW5rLmM9ODI9c3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfbGlzdGVuZXJfc2V0X25sX3BvbGljeVtORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiArIDFdID0ge1xcbmZzL25mc2QvbmV0bGluay5jOjgzOlxcdFtORlNEX0FfU0VSVkVSX1NPQ0tfQUREUl0gPSBOTEFfUE9MSUNZX05FU1RFRChuZnNkX3NvY2tfbmxfcG9saWN5KSxcXG5mcy9uZnNkL25ldGxpbmsuYy04NC19O1xcbi0tXFxuZnMvbmZzZC9uZXRsaW5rLmg9MTk9ZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiArIDFdO1xcbmZzL25mc2QvbmV0bGluay5oOjIwOmV4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnNkX3NvY2tfbmxfcG9saWN5W05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FICsgMV07XFxuZnMvbmZzZC9uZXRsaW5rLmgtMjEtZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc3ZjX2V4cG9ydF9ubF9wb2xpY3lbTkZTRF9BX1NWQ19FWFBPUlRfRlNJRCArIDFdO1xcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYz0yMDA1PXN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4tLVxcbmZzL25mc2QvbmZzY3RsLmMtMjAyMi1cXHRcXHRlcnIgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXFxuZnMvbmZzZC9uZnNjdGwuYzoyMDIzOlxcdFxcdFxcdFxcdCAgICAgICBuZnNkX3NvY2tfbmxfcG9saWN5LCBpbmZvLVxcdTAwM2VleHRhY2spO1xcbmZzL25mc2QvbmZzY3RsLmMtMjAyNC1cXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG4tLVxcbmZzL25mc2QvbmZzY3RsLmM9MjA2Mz1pbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYy0yMTEwLVxcdFxcdGlmIChubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXFxuZnMvbmZzZC9uZnNjdGwuYzoyMTExOlxcdFxcdFxcdFxcdCAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby1cXHUwMDNlZXh0YWNrKSBcXHUwMDNjIDApXFxuZnMvbmZzZC9uZnNjdGwuYy0yMTEyLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYy0yMTY2LVxcdFxcdGlmIChubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXFxuZnMvbmZzZC9uZnNjdGwuYzoyMTY3OlxcdFxcdFxcdFxcdCAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby1cXHUwMDNlZXh0YWNrKSBcXHUwMDNjIDApXFxuZnMvbmZzZC9uZnNjdGwuYy0yMTY4LVxcdFxcdFxcdGNvbnRpbnVlO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTo0MDo0MC43MzcyMjEzMzRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQ2MTQ1MTM5MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgTkZTIE5ldGxpbmsgUG9saWN5KipcblxuT2theSwgdGltZSB0byBnZXQgdG8gdGhlIGhlYXJ0IG9mIHRoaXMuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIHRoZSBgbmZzZF9zb2NrX25sX3BvbGljeWAgc3RydWN0dXJlLiBJIGltbWVkaWF0ZWx5IGtub3cgdGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGRlZmluZXMgdGhlIE5ldGxpbmsgbWVzc2FnZSBwb2xpY3kgZm9yIHRoZSBORlMgc2VydmVyJ3Mgc29ja2V0IGludGVyYWN0aW9uLiBJJ2xsIG5lZWQgdG8gZ28gZGlyZWN0bHkgdG8gYGZzL25mc2QvbmV0bGluay5jYCDigJMgdGhhdCdzIHRoZSBvYnZpb3VzIHBsYWNlLiBMZXQncyBzZWUgd2hhdCB0aGF0IHBvbGljeSBkZWZpbml0aW9uIHJldmVhbHMgYWJvdXQgdGhlIGV4cGVjdGVkIG1lc3NhZ2UgZm9ybWF0LCBkYXRhIHR5cGVzLCBhbmQgYW55IHNlY3VyaXR5IHJlc3RyaWN0aW9ucyBpbiBwbGFjZS4gVW5kZXJzdGFuZGluZyB0aGlzIHBvbGljeSBpcyBjcnVjaWFsIGZvciBkaWFnbm9zaW5nIG9yIGRldmVsb3BpbmcgYW55IE5ldGxpbmstYmFzZWQgdG9vbHMgdGhhdCBpbnRlcmFjdCB3aXRoIHRoZSBORlMgc2VydmVyLiBJJ20gZXhwZWN0aW5nIHRoaXMgcG9saWN5IHRvIG91dGxpbmUgdGhlIGF0dHJpYnV0ZXMgYWNjZXB0ZWQgYnkgYG5mc2RgIGFuZCB0aGVpciBhc3NvY2lhdGVkIHZhbGlkYXRpb25zLiBUaGUgZGV0YWlscyBvZiB0aGUgcG9saWN5IGFyZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgZXhwZWN0ZWQgY29udGVudCBvZiB0aGUgaW5jb21pbmcgYW5kIG91dGdvaW5nIE5ldGxpbmsgbWVzc2FnZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MTg3LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6NDQuMTk4Njc1NDg3WiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk4MjYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL25mc2QvbmV0bGluay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM1LFxuICBcIkxpbmVDb3VudFwiOiAxNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDM1OlxcdGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiArIDFdID0ge1xcbiAgMzY6XFx0XFx0W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTl0gPSBOTEFfUE9MSUNZX05FU1RFRChuZnNkX2ZzbG9jYXRpb25fbmxfcG9saWN5KSxcXG4gIDM3OlxcdH07XFxuICAzODpcXHRcXG4gIDM5OlxcdGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc29ja19ubF9wb2xpY3lbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUgKyAxXSA9IHtcXG4gIDQwOlxcdFxcdFtORlNEX0FfU09DS19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCB9LFxcbiAgNDE6XFx0XFx0W05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSA9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgfSxcXG4gIDQyOlxcdH07XFxuICA0MzpcXHRcXG4gIDQ0OlxcdGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc3ZjX2V4cG9ydF9ubF9wb2xpY3lbTkZTRF9BX1NWQ19FWFBPUlRfRlNJRCArIDFdID0ge1xcbiAgNDU6XFx0XFx0W05GU0RfQV9TVkNfRVhQT1JUX1NFUU5PXSA9IHsgLnR5cGUgPSBOTEFfVTY0LCB9LFxcbiAgNDY6XFx0XFx0W05GU0RfQV9TVkNfRVhQT1JUX0NMSUVOVF0gPSB7IC50eXBlID0gTkxBX05VTF9TVFJJTkcsIH0sXFxuICA0NzpcXHRcXHRbTkZTRF9BX1NWQ19FWFBPUlRfUEFUSF0gPSB7IC50eXBlID0gTkxBX05VTF9TVFJJTkcsIH0sXFxuICA0ODpcXHRcXHRbTkZTRF9BX1NWQ19FWFBPUlRfTkVHQVRJVkVdID0geyAudHlwZSA9IE5MQV9GTEFHLCB9LFxcbiAgNDk6XFx0XFx0W05GU0RfQV9TVkNfRVhQT1JUX0VYUElSWV0gPSB7IC50eXBlID0gTkxBX1U2NCwgfSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6NDQuMTk4Nzc3MDM3WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkzNjAxMzM2MzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUmVhc29uaW5nIFRocm91Z2ggdGhlIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgcmVnYXJkaW5nIHRoZSBgW05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXWAgZGVmaW5pdGlvbiwga25vd2luZyB0aGF0IGAudHlwZSA9IE5MQV9OVUxfU1RSSU5HYCBndWFyYW50ZWVzIHRoYXQgYG5sYV9kYXRhKHRiW05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSlgIHdpbGwgYmUgbnVsbC10ZXJtaW5hdGVkLiBUaGlzIGlzIGNydWNpYWwgZm9yIGF2b2lkaW5nIGFueSBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW5zIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBUaGUgcGF0Y2ggaXRzZWxmIGRvZXNuJ3QgaW50cm9kdWNlIGFueSBuZXcgYWxsb2NhdGlvbnMsIHNvIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLiBUaGUgY2hhbmdlcyBhcmUgYWxsIGNlbnRlcmVkIGFyb3VuZCB2YWxpZGF0aW9uIGFuZCBlcnJvciBoYW5kbGluZywgd2hpY2ggaXMgcHJlY2lzZWx5IHRoZSBraW5kIG9mIHRoaW5nIEtBU0FOIGFuZCBvdGhlciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFyZSBkZXNpZ25lZCB0byBjYXRjaCBpZiBzb21ldGhpbmcgc2xpcHMgdGhyb3VnaC4gU28sIGluIHRlcm1zIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCB0aGlzIHNlY3Rpb24gaXMgYSBub24taXNzdWUuXG5cbk5leHQsIEkgbmVlZCB0byBjb25maXJtIHRoZSBgc3ZjX3JlZ2lzdGVyYCBjaGFuZ2VzLiBJdCBsb29rcyBsaWtlIGl0J3MgYSBzaW1wbGUsIGFuZCByYXRoZXIgc3RyYWlnaHRmb3J3YXJkLCBmaXggZm9yIGFuIGVycm9yIGNvZGUgcHJvcGFnYXRpb24gYnVnLiBUaGUgcGF0Y2ggaXMgc2ltcGx5IGVuc3VyaW5nIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuIE5vIG5ldyBtZW1vcnkgaXMgYmVpbmcgaW50cm9kdWNlZCBhbmQgbm8gbWVtb3J5IHRoYXQgZXhpc3RlZCBiZWZvcmUgaXMgYmVpbmcgY2hhbmdlZCB0byBiZSB1bmluaXRpYWxpemVkLlxuXG5GaW5hbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNoYW5nZXMgaW4gYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAuIEl0IHNlZW1zIHRoZSB1cGRhdGUgYWRkcyBhIGBycGNiX2xvY2FsX3RpbWVvdXRgLiBJdCBpcyBkZWZpbmluZyBhIGxvY2FsIHRpbWVvdXQgd2l0aCBhbiBpbml0aXZhbCBvZiBgMSAqIEhaYCwgYSBtYXh2YWwgb2YgYDEgKiBIWmAsIGFuZCBgMGAgcmV0cmllcy4gVGhpcyBhcHBlYXJzIHRvIGJlIHNldHRpbmcgdXAgYSB0aW1lb3V0IHN0cnVjdHVyZSwgYnV0IGFnYWluLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoYXQgSSBjYW4gc2VlIGhlcmUuXG5cbkJhc2VkIG9uIHRoaXMgcmV2aWV3LCBJJ20gY29uZmlkZW50IHRoYXQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gV2UgY2FuIHNhZmVseSBtYXJrIE5lZWRzS01TQU4gYXMgZmFsc2UuIEknbGwgc3VtbWFyaXplIHRoaXMgcmVhc29uaW5nIGZvciBteSBub3RlcyBhbmQgdGhlIHJldmlld2Vycy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg4NzMsIk91dHB1dFRva2VucyI6MjU2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTEyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6NTMuNTU4OTEyNzUxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYxNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyB2YWxpZGF0aW9uIGNoZWNrcyBmb3IgTkZTRCBuZXRsaW5rIGxpc3RlbmVyIGF0dHJpYnV0ZXMgKGUuZy4sIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHRvIGBORlNEX05MX0xJU1RFTkVSX01BWGAgYW5kIHZhbGlkYXRpbmcgdGhlIHRyYW5zcG9ydCBuYW1lIHZpYSBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCkuIEl0IGFsc28gZml4ZXMgZXJyb3IgY29kZSBwcm9wYWdhdGlvbiBpbiBgc3ZjX3JlZ2lzdGVyYCBhbmQgc2V0cyBhIGxvY2FsIHRpbWVvdXQgZm9yIHJwY2JpbmQgY2xpZW50cy4gXFxuXFxuVGhlIG5ldGxpbmsgYXR0cmlidXRlIGBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRWAgaXMgZGVmaW5lZCBhcyBgTkxBX05VTF9TVFJJTkdgIGluIGBuZnNkX3NvY2tfbmxfcG9saWN5YCwgZW5zdXJpbmcgdGhhdCBgbmxhX2RhdGEoKWAgcmV0dXJucyBhIHByb3Blcmx5IG51bGwtdGVybWluYXRlZCBzdHJpbmcgYmVmb3JlIGl0IGlzIHBhc3NlZCB0byBgc3RyY21wKClgIGluIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgLiBcXG5cXG5ObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBvciBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCB0aGVyZSBhcmUgbm8gY2hhbmdlcyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBBbnkgcG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBsb2dpYyBidWdzKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGRlZmF1bHQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHZhbGlkYXRpb24gY2hlY2tzIGZvciBORlNEIG5ldGxpbmsgbGlzdGVuZXIgYXR0cmlidXRlcyAoZS5nLiwgbGltaXRpbmcgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgdG8gYE5GU0RfTkxfTElTVEVORVJfTUFYYCBhbmQgdmFsaWRhdGluZyB0aGUgdHJhbnNwb3J0IG5hbWUgdmlhIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgKS4gSXQgYWxzbyBmaXhlcyBlcnJvciBjb2RlIHByb3BhZ2F0aW9uIGluIGBzdmNfcmVnaXN0ZXJgIGFuZCBzZXRzIGEgbG9jYWwgdGltZW91dCBmb3IgcnBjYmluZCBjbGllbnRzLiBcXG5cXG5UaGUgbmV0bGluayBhdHRyaWJ1dGUgYE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FYCBpcyBkZWZpbmVkIGFzIGBOTEFfTlVMX1NUUklOR2AgaW4gYG5mc2Rfc29ja19ubF9wb2xpY3lgLCBlbnN1cmluZyB0aGF0IGBubGFfZGF0YSgpYCByZXR1cm5zIGEgcHJvcGVybHkgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIGBzdHJjbXAoKWAgaW4gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAuIFxcblxcbk5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIG9yIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnkuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvZ2ljIGJ1Z3MpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-10 21:34:52 +0000 UTC FinishedAt: 2026-08-10 21:40:55 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "6b8c8af514d739d0335f5579b585e02babe8a727", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NFSD", "NFSD_V4", "SUNRPC", "NET_NS", "IPV6" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "6b8c8af514d739d0335f5579b585e02babe8a727", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NFSD", "NFSD_V4", "SUNRPC", "NET_NS", "IPV6" ], "series_id": "f83e0325-9b4d-49dc-8c51-d591fefe8752" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "nfsd_nl_listener_set_doit", "svc_register", "rpcb_create_local" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjM5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05GU0QmIzM0OywKICAgICYjMzQ7TkZTRF9WNCYjMzQ7LAogICAgJiMzNDtTVU5SUEMmIzM0OywKICAgICYjMzQ7TkVUX05TJiMzNDssCiAgICAmIzM0O0lQVjYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0JiMzNDssCiAgICAmIzM0O3N2Y19yZWdpc3RlciYjMzQ7LAogICAgJiMzNDtycGNiX2NyZWF0ZV9sb2NhbCYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHZhbGlkYXRpb24gY2hlY2tzIGZvciBORlNEIG5ldGxpbmsgbGlzdGVuZXIgYXR0cmlidXRlcyAoZS5nLiwgbGltaXRpbmcgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgdG8gYE5GU0RfTkxfTElTVEVORVJfTUFYYCBhbmQgdmFsaWRhdGluZyB0aGUgdHJhbnNwb3J0IG5hbWUgdmlhIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgKS4gSXQgYWxzbyBmaXhlcyBlcnJvciBjb2RlIHByb3BhZ2F0aW9uIGluIGBzdmNfcmVnaXN0ZXJgIGFuZCBzZXRzIGEgbG9jYWwgdGltZW91dCBmb3IgcnBjYmluZCBjbGllbnRzLiBcblxuVGhlIG5ldGxpbmsgYXR0cmlidXRlIGBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRWAgaXMgZGVmaW5lZCBhcyBgTkxBX05VTF9TVFJJTkdgIGluIGBuZnNkX3NvY2tfbmxfcG9saWN5YCwgZW5zdXJpbmcgdGhhdCBgbmxhX2RhdGEoKWAgcmV0dXJucyBhIHByb3Blcmx5IG51bGwtdGVybWluYXRlZCBzdHJpbmcgYmVmb3JlIGl0IGlzIHBhc3NlZCB0byBgc3RyY21wKClgIGluIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgLiBcblxuTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgb3Igc2VudCB0byB1c2VyIHNwYWNlLCBhbmQgdGhlcmUgYXJlIG5vIGNoYW5nZXMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIG1lbW9yeS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9naWMgYnVncykgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBkZWZhdWx0IHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTozOTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDYwMWViNzA0OGZkMWNjMzcxOTUxZjU4YWYwMGNjMjUwZjllMmJhYzNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAxMCAyMTozOTozNyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuY1xuaW5kZXggN2UxZDVhNWQ2NTExZS4uZjczYTJlYTQyNTU3MSAxMDA2NDRcbi0tLSBhL2ZzL25mc2QvbmZzY3RsLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL25mc2QvbmZzY3RsLmNcbkBAIC0xOTczLDIxICYjNDM7MTk3MywzOSBAQCBpbnQgbmZzZF9ubF92ZXJzaW9uX2dldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogVHJhbnNwb3J0IGNsYXNzZXMgTkZTRCBrbm93cyBob3cgdG8gaW5zdGFudGlhdGUuIFZldHRpbmcgdGhlIG5hbWUgaGVyZVxuJiM0MzsgKiBrZWVwcyBhIGJvZ3VzIHN0cmluZyBmcm9tIHJlYWNoaW5nIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCksIHdoZXJlIGFuXG4mIzQzOyAqIHVua25vd24gbmFtZSB0cmlnZ2VycyBhIHJlcXVlc3RfbW9kdWxlKFwmIzM0O3N2YyVzXCYjMzQ7LCBuYW1lKSB1cGNhbGwgdW5kZXJcbiYjNDM7ICogbmZzZF9tdXRleC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKVxuJiM0Mzt7XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdXBwb3J0ZWRbXSA9IHsgXCYjMzQ7dGNwXCYjMzQ7LCBcJiMzNDt1ZHBcJiMzNDssIFwmIzM0O3JkbWFcJiMzNDsgfTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShzdXBwb3J0ZWQpOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICghc3RyY21wKG5hbWUsIHN1cHBvcnRlZFtpXSkpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogVXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgYSBzaW5nbGUgcmVxdWVzdCBtYXkgY2FycnkuICovXG4mIzQzOyNkZWZpbmUgTkZTRF9OTF9MSVNURU5FUl9NQVhcdDEwMjRcbiYjNDM7XG4gLyoqXG4gICogbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMgLSBzYW5pdHktY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgZnJvbSB1c2VybGFuZFxuICAqIEBpbmZvOiBuZXRsaW5rIG1ldGFkYXRhIGFuZCBjb21tYW5kIGFyZ3VtZW50c1xuICAqXG4tICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCBlYWNoIGVudHJ5XG4tICogaXMgd2VsbC1mb3JtZWQ6IGl0IHBhcnNlcyBhZ2FpbnN0IHRoZSBwb2xpY3ksIGNhcnJpZXMgYm90aCBhbiBhZGRyZXNzIGFuZFxuLSAqIGEgdHJhbnNwb3J0IG5hbWUsIGFuZCB0aGUgYWRkcmVzcyBpcyBsb25nIGVub3VnaCBmb3IgaXRzIGZhbWlseS4gRG9pbmdcbi0gKiB0aGlzIHVwIGZyb250IGxldHMgdGhlIGNhbGxlcnMgYmVsb3cgYXNzdW1lIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkIGFuZFxuLSAqIGd1YXJhbnRlZXMgd2UgbWFrZSBubyBjaGFuZ2VzIHdoZW4gdGhlIHJlcXVlc3QgaXMgbWFsZm9ybWVkLlxuJiM0MzsgKiBXYWxrIGV2ZXJ5IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIGF0dHJpYnV0ZSBhbmQgY29uZmlybSB0aGF0IHRoZSBsaXN0IGlzXG4mIzQzOyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC5cbiAgKlxuICAqIFJldHVybjogMCBpZiBldmVyeSBlbnRyeSBpcyB2YWxpZCwgb3IgYSBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UuXG4gICovXG4gc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIHtcbiBcdGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHI7XG4mIzQzO1x0dW5zaWduZWQgaW50IGNvdW50ID0gMDtcbiBcdGludCByZW07XG4gXG4gXHRubG1zZ19mb3JfZWFjaF9hdHRyX3R5cGUoYXR0ciwgTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIsIGluZm8tXHUwMDNlbmxoZHIsXG5AQCAtMTk5Niw2ICYjNDM7MjAxNCwxMSBAQCBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRcdHN0cnVjdCBzb2NrYWRkciAqc2E7XG4gXHRcdGludCBlcnI7XG4gXG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2NvdW50IFx1MDAzZSBORlNEX05MX0xJU1RFTkVSX01BWCkge1xuJiM0MztcdFx0XHROTF9TRVRfRVJSX01TRyhpbmZvLVx1MDAzZWV4dGFjaywgXCYjMzQ7dG9vIG1hbnkgbGlzdGVuZXJzXCYjMzQ7KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FMkJJRztcbiYjNDM7XHRcdH1cbiYjNDM7XG4gXHRcdGVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5GU0RfQV9TT0NLX01BWCwgYXR0cixcbiBcdFx0XHRcdCAgICAgICBuZnNkX3NvY2tfbmxfcG9saWN5LCBpbmZvLVx1MDAzZWV4dGFjayk7XG4gXHRcdGlmIChlcnIgXHUwMDNjIDApXG5AQCAtMjAwNCw2ICYjNDM7MjAyNyw5IEBAIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdFx0aWYgKCF0YltORlNEX0FfU09DS19BRERSXSB8fCAhdGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuJiM0MztcdFx0aWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRVBST1RPTk9TVVBQT1JUO1xuJiM0MztcbiBcdFx0c2EgPSBubGFfZGF0YSh0YltORlNEX0FfU09DS19BRERSXSk7XG4gXHRcdGlmIChubGFfbGVuKHRiW05GU0RfQV9TT0NLX0FERFJdKSBcdTAwM2Mgc2l6ZW9mKHNhLVx1MDAzZXNhX2ZhbWlseSkpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG5AQCAtMjE1Niw4ICYjNDM7MjE4MiwxMiBAQCBpbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRyZXQgPSBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYShzZXJ2LCB4Y2xfbmFtZSwgbmV0LCBzYSwgMCxcbiBcdFx0XHRcdFx0ICAgICAgY3VycmVudF9jcmVkKCkpO1xuIFx0XHQvKiBhbHdheXMgc2F2ZSB0aGUgbGF0ZXN0IGVycm9yICovXG4tXHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdE5MX1NFVF9FUlJfTVNHX0ZNVChpbmZvLVx1MDAzZWV4dGFjayxcbiYjNDM7XHRcdFx0XHRcdCAgIFwmIzM0O2Nhbm5vdCBjcmVhdGUgJXMgbGlzdGVuZXI6ICVkXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgeGNsX25hbWUsIHJldCk7XG4gXHRcdFx0ZXJyID0gcmV0O1xuJiM0MztcdFx0fVxuIFx0fVxuIFxuIFx0aWYgKCFzZXJ2LVx1MDAzZXN2X25ydGhyZWFkcyBcdTAwMjZcdTAwMjYgbGlzdF9lbXB0eShcdTAwMjZubi1cdTAwM2VuZnNkX3NlcnYtXHUwMDNlc3ZfcGVybXNvY2tzKSlcbmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuY1xuaW5kZXggNmFhMzcyMTg4Yzg2YS4uMGFhMzc2YjgyYTUyNiAxMDA2NDRcbi0tLSBhL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcbkBAIC0yMjEsNiAmIzQzOzIyMSwxNiBAQCBzdGF0aWMgdm9pZCBycGNiX3NldF9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBycGNfY2xudCAqY2xudCxcbiAjIGRlZmluZSBTVU5fTEVOKHB0cikgKG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpXHRcdFxcXG4gXHRcdCAgICAgICYjNDM7IDEgJiM0Mzsgc3RybGVuKChwdHIpLVx1MDAzZXN1bl9wYXRoICYjNDM7IDEpKVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBUaGUga2VybmVsJiMzOTtzIHJwY2JpbmQgY2xpZW50IHRhbGtzIG9ubHkgdG8gdGhlIGxvY2FsIHJwY2JpbmQsIG92ZXIgbG9vcGJhY2tcbiYjNDM7ICogb3IgYSBsb2NhbCBBRl9MT0NBTCBzb2NrZXQsIHdoZXJlIGEgaGVhbHRoeSBycGNiaW5kIGFuc3dlcnMgaW4gbWljcm9zZWNvbmRzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBycGNfdGltZW91dCBycGNiX2xvY2FsX3RpbWVvdXQgPSB7XG4mIzQzO1x0LnRvX2luaXR2YWxcdD0gMSAqIEhaLFxuJiM0MztcdC50b19tYXh2YWxcdD0gMSAqIEhaLFxuJiM0MztcdC50b19yZXRyaWVzXHQ9IDAsXG4mIzQzO307XG4mIzQzO1xuIC8qXG4gICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlXG4gICogaXMgcmV0dXJuZWQuXG5AQCAtMjM4LDYgJiM0MzsyNDgsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2FmX2xvY2FsKHN0cnVjdCBuZXQgKm5ldCxcbiBcdFx0LnZlcnNpb25cdD0gUlBDQlZFUlNfMixcbiBcdFx0LmF1dGhmbGF2b3JcdD0gUlBDX0FVVEhfTlVMTCxcbiBcdFx0LmNyZWRcdFx0PSBjdXJyZW50X2NyZWQoKSxcbiYjNDM7XHRcdC50aW1lb3V0XHQ9IFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcbiBcdFx0LypcbiBcdFx0ICogV2UgdHVybiBvZmYgdGhlIGlkbGUgdGltZW91dCB0byBwcmV2ZW50IHRoZSBrZXJuZWxcbiBcdFx0ICogZnJvbSBhdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3RpbmcgdGhlIHNvY2tldC5cbkBAIC0zMTIsNiAmIzQzOzMyMyw3IEBAIHN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfbmV0KHN0cnVjdCBuZXQgKm5ldClcbiBcdFx0LnZlcnNpb25cdD0gUlBDQlZFUlNfMixcbiBcdFx0LmF1dGhmbGF2b3JcdD0gUlBDX0FVVEhfVU5JWCxcbiBcdFx0LmNyZWRcdFx0PSBjdXJyZW50X2NyZWQoKSxcbiYjNDM7XHRcdC50aW1lb3V0XHQ9IFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcbiBcdFx0LmZsYWdzXHRcdD0gUlBDX0NMTlRfQ1JFQVRFX05PUElORyxcbiBcdH07XG4gXHRzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsICpjbG50NDtcbmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuY1xuaW5kZXggMDVjM2U2ZTJmNjU5NC4uZTljZmNlYjFhMzM0MiAxMDA2NDRcbi0tLSBhL25ldC9zdW5ycGMvc3ZjLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvc3ZjLmNcbkBAIC0xMjA4LDEzICYjNDM7MTIwOCwxNiBAQCBpbnQgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0LFxuIFx0XHRzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2dwID0gXHUwMDI2c2Vydi1cdTAwM2Vzdl9wcm9ncmFtc1twXTtcbiBcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcHJvZ3AtXHUwMDNlcGdfbnZlcnM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGludCByZXQ7XG4gXG4tXHRcdFx0ZXJyb3IgPSBwcm9ncC1cdTAwM2VwZ19ycGNiaW5kX3NldChuZXQsIHByb2dwLCBpLFxuJiM0MztcdFx0XHRyZXQgPSBwcm9ncC1cdTAwM2VwZ19ycGNiaW5kX3NldChuZXQsIHByb2dwLCBpLFxuIFx0XHRcdFx0XHRmYW1pbHksIHByb3RvLCBwb3J0KTtcbi1cdFx0XHRpZiAoZXJyb3IgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuIFx0XHRcdFx0cHJpbnRrKEtFUk5fV0FSTklORyBcJiMzNDtzdmM6IGZhaWxlZCB0byByZWdpc3RlciBcJiMzNDtcbiBcdFx0XHRcdFx0XCYjMzQ7JXN2JXUgUlBDIHNlcnZpY2UgKGVycm5vICVkKS5cXG5cJiMzNDssXG4tXHRcdFx0XHRcdHByb2dwLVx1MDAzZXBnX25hbWUsIGksIC1lcnJvcik7XG4mIzQzO1x0XHRcdFx0XHRwcm9ncC1cdTAwM2VwZ19uYW1lLCBpLCAtcmV0KTtcbiYjNDM7XHRcdFx0XHRpZiAoIWVycm9yKVxuJiM0MztcdFx0XHRcdFx0ZXJyb3IgPSByZXQ7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4gXHRcdH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5pbmRleCA4NDM0M2ZkMWUzNTRiLi40NjA1MDhkZTkzNzRmIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5AQCAtODksNiAmIzQzOzg5LDcgQEAgVEFSR0VUUyAmIzQzOz0gbmV0L3BhY2tldGRyaWxsXG4gVEFSR0VUUyAmIzQzOz0gbmV0L3BwcFxuIFRBUkdFVFMgJiM0Mzs9IG5ldC9yZHNcbiBUQVJHRVRTICYjNDM7PSBuZXQvdGNwX2FvXG4mIzQzO1RBUkdFVFMgJiM0Mzs9IG5mc2RcbiBUQVJHRVRTICYjNDM7PSBub2xpYmNcbiBUQVJHRVRTICYjNDM7PSBwY2lfZW5kcG9pbnRcbiBUQVJHRVRTICYjNDM7PSBwY2llX2J3Y3RybFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvLmdpdGlnbm9yZVxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE5ZTZkZWMwNGQ4ZTlcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvLmdpdGlnbm9yZVxuQEAgLTAsMCAmIzQzOzEgQEBcbiYjNDM7bmZzZF9uZXRsaW5rX2xpc3RlbmVyXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xNWFjNjU1NDlkMjU5XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlXG5AQCAtMCwwICYjNDM7MSw2IEBAXG4mIzQzOyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7Q0ZMQUdTICYjNDM7PSAkKEtIRFJfSU5DTFVERVMpIC1XYWxsXG4mIzQzO1xuJiM0MztURVNUX0dFTl9QUk9HUyA6PSBuZnNkX25ldGxpbmtfbGlzdGVuZXJcbiYjNDM7XG4mIzQzO2luY2x1ZGUgLi4vbGliLm1rXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2OTQ1ZmY5NTUxYzRcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnXG5AQCAtMCwwICYjNDM7MSw0IEBAXG4mIzQzO0NPTkZJR19ORVRfTlM9eVxuJiM0MztDT05GSUdfSVBWNj15XG4mIzQzO0NPTkZJR19ORlNEPXlcbiYjNDM7Q09ORklHX05GU0RfVjQ9eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uM2UzMzA3NjgwZDdkNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuY1xuQEAgLTAsMCAmIzQzOzEsOTIwIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIFJlZ3Jlc3Npb24gdGVzdHMgZm9yIHRoZSBORlNEIGdlbmVyaWMtbmV0bGluayBsaXN0ZW5lciBpbnRlcmZhY2VcbiYjNDM7ICogKE5GU0RfQ01EX0xJU1RFTkVSX1NFVCAvIE5GU0RfQ01EX0xJU1RFTkVSX0dFVCkuXG4mIzQzOyAqXG4mIzQzOyAqIFRocmVlIGdyb3VwczpcbiYjNDM7ICogICB2YWxpZGF0aW9uICAtIG1hbGZvcm1lZC9hYnVzaXZlIExJU1RFTkVSX1NFVCByZXF1ZXN0cyBhcmUgcmVqZWN0ZWQgYnlcbiYjNDM7ICogICAgICAgICAgICAgICAgIG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKCksIGJlZm9yZSBuZnNkX211dGV4IGlzIHRha2VuLlxuJiM0MzsgKiAgIGZ1bmN0aW9uYWwgIC0gY3JlYXRlL2FkZC9yZW1vdmUgbGlzdGVuZXJzIGFuZCB2ZXJpZnkgTElTVEVORVJfR0VUXG4mIzQzOyAqICAgICAgICAgICAgICAgICByZWZsZWN0cyB0aGUgc2V0IChyb3VuZC10cmlwIG9mIHRyYW5zcG9ydCAmIzQzOyBhZGRyOnBvcnQpLlxuJiM0MzsgKiAgIHNlbWFudGljcyAgIC0gb25jZSB0aHJlYWRzIGFyZSBydW5uaW5nIChUSFJFQURTX1NFVCkgYSBsaXN0ZW5lciBjaGFuZ2VcbiYjNDM7ICogICAgICAgICAgICAgICAgIGlzIHJlZnVzZWQgd2l0aCAtRUJVU1kuXG4mIzQzOyAqXG4mIzQzOyAqIEVhY2ggdGVzdCBydW5zIGluIGl0cyBvd24gcHJpdmF0ZSBuZXQgJiM0MzsgbW91bnQgbmFtZXNwYWNlICh1bnNoYXJlIGluXG4mIzQzOyAqIEZJWFRVUkVfU0VUVVApLiAvcnVuIGlzIG1hc2tlZCB0aGVyZTogYSBwYXRobmFtZSBBRl9MT0NBTCBjb25uZWN0IGlzIG5vdFxuJiM0MzsgKiBzY29wZWQgYnkgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBzaW5jZSB1bml4X2ZpbmRfYnNkKCkgcmVzb2x2ZXMgYnkgaW5vZGVcbiYjNDM7ICogYW5kIHRha2VzIG5vIHN0cnVjdCBuZXQsIHNvIHRoZSBrZXJuZWwmIzM5O3MgcnBjYmluZCBjbGllbnQgd291bGQgb3RoZXJ3aXNlIGJlXG4mIzQzOyAqIGFibGUgdG8gcmVhY2ggdGhlIHJwY2JpbmQgcnVubmluZyBvbiB0aGUgaG9zdC4gQW55dGhpbmcgdGhhdCBjcmVhdGVzIGFcbiYjNDM7ICogc2VydiBpcyBzZXJ2ZWQgYnkgdGhlIHBlci1uZXRucyBycGNiaW5kIHN0dWIgYmVsb3cgaW5zdGVhZC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nwb2xsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc2NoZWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRkZWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpbnQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tb3VudC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9wcmN0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy90aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXQvaWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXRpbmV0L2luLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbmV0bGluay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2dlbmV0bGluay5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDsuLi9rc2VsZnRlc3RfaGFybmVzcy5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsvKiBORlNEIGdlbmVyaWMtbmV0bGluayBjb25zdGFudHMgKGZyb20gbGludXgvbmZzZF9uZXRsaW5rLmgpLiAqL1xuJiM0MzsjZGVmaW5lIE5GU0RfRkFNSUxZX05BTUVcdFx0XCYjMzQ7bmZzZFwmIzM0O1xuJiM0MzsjZGVmaW5lIE5GU0RfQ01EX1RIUkVBRFNfU0VUXHRcdDJcbiYjNDM7I2RlZmluZSBORlNEX0NNRF9MSVNURU5FUl9TRVRcdFx0NlxuJiM0MzsjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX0dFVFx0XHQ3XG4mIzQzOyNkZWZpbmUgTkZTRF9BX1NFUlZFUl9USFJFQURTXHRcdDFcbiYjNDM7I2RlZmluZSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUlx0XHQxXHQvKiBwZXItbGlzdGVuZXIgbmVzdCAqL1xuJiM0MzsjZGVmaW5lIE5GU0RfQV9TT0NLX0FERFJcdFx0MVx0LyogaW5zaWRlIHRoZSBuZXN0ICovXG4mIzQzOyNkZWZpbmUgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVcdDJcdC8qIGluc2lkZSB0aGUgbmVzdCAqL1xuJiM0MztcbiYjNDM7I2RlZmluZSBOTEFfQUxJR040KGxlbilcdFx0XHQoKChsZW4pICYjNDM7IDMpIFx1MDAyNiB+MylcbiYjNDM7I2RlZmluZSBURVNUX1BPUlRcdFx0XHQyMDA0OVxuJiM0MzsjZGVmaW5lIE1BWF9MSVNURU5FUlNcdFx0XHQ4XG4mIzQzOyNkZWZpbmUgUkVDVl9USU1FT19TRUNcdFx0XHQzMFxuJiM0MztcbiYjNDM7c3RhdGljIGludCBuZnNkX2ZhbWlseTtcdFx0XHQvKiBzZXQgcGVyLXRlc3QgaW4gRklYVFVSRV9TRVRVUCAqL1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKm1zZylcbiYjNDM7e1xuJiM0MztcdHBlcnJvcihtc2cpO1xuJiM0MztcdGV4aXQoMSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gbWluaW1hbCBnZW5lcmljLW5ldGxpbmsgcGx1bWJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZW5sX29wZW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9ubCBzYSA9IHsgLm5sX2ZhbWlseSA9IEFGX05FVExJTksgfTtcbiYjNDM7XHRzdHJ1Y3QgdGltZXZhbCB0diA9IHsgLnR2X3NlYyA9IFJFQ1ZfVElNRU9fU0VDIH07XG4mIzQzO1x0aW50IGZkID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX0dFTkVSSUMpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRkaWUoXCYjMzQ7c29ja2V0KE5FVExJTktfR0VORVJJQylcJiMzNDspO1xuJiM0MztcdGlmIChiaW5kKGZkLCAodm9pZCAqKVx1MDAyNnNhLCBzaXplb2Yoc2EpKSBcdTAwM2MgMClcbiYjNDM7XHRcdGRpZShcJiMzNDtiaW5kKG5ldGxpbmspXCYjMzQ7KTtcbiYjNDM7XHRzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgXHUwMDI2dHYsIHNpemVvZih0dikpO1xuJiM0MztcdHJldHVybiBmZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQXBwZW5kIGFuIGF0dHJpYnV0ZSBhdCBAb2ZmOyByZXR1cm4gdGhlIG5ldyAoYWxpZ25lZCkgb2Zmc2V0LiAqL1xuJiM0MztzdGF0aWMgaW50IHB1dF9hdHRyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgdWludDE2X3QgdHlwZSxcbiYjNDM7XHRcdCAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG5sYXR0ciAqbmEgPSAodm9pZCAqKShidWYgJiM0Mzsgb2ZmKTtcbiYjNDM7XG4mIzQzO1x0bmEtXHUwMDNlbmxhX3R5cGUgPSB0eXBlO1xuJiM0MztcdG5hLVx1MDAzZW5sYV9sZW4gPSBOTEFfSERSTEVOICYjNDM7IGxlbjtcbiYjNDM7XHRpZiAobGVuKVxuJiM0MztcdFx0bWVtY3B5KGJ1ZiAmIzQzOyBvZmYgJiM0MzsgTkxBX0hEUkxFTiwgZGF0YSwgbGVuKTtcbiYjNDM7XHRyZXR1cm4gb2ZmICYjNDM7IE5MQV9BTElHTjQoTkxBX0hEUkxFTiAmIzQzOyBsZW4pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBCdWlsZCBhIGdlbmwgbWVzc2FnZSBoZWFkZXIgaW50byBAYnVmOyByZXR1cm4gdGhlIG9mZnNldCBwYXN0IGl0LiAqL1xuJiM0MztzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbiYjNDM7XHRzdHJ1Y3QgZ2VubG1zZ2hkciAqZ25sID0gKHZvaWQgKikoYnVmICYjNDM7IE5MTVNHX0hEUkxFTik7XG4mIzQzO1xuJiM0MztcdG1lbXNldChidWYsIDAsIE5MTVNHX0hEUkxFTiAmIzQzOyBHRU5MX0hEUkxFTik7XG4mIzQzO1x0bmxoLVx1MDAzZW5sbXNnX3R5cGUgPSB0eXBlO1xuJiM0MztcdG5saC1cdTAwM2VubG1zZ19mbGFncyA9IGZsYWdzO1xuJiM0MztcdG5saC1cdTAwM2VubG1zZ19zZXEgPSAxO1xuJiM0MztcdGdubC1cdTAwM2VjbWQgPSBjbWQ7XG4mIzQzO1x0Z25sLVx1MDAzZXZlcnNpb24gPSAxO1xuJiM0MztcdHJldHVybiBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU47XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFNlbmQgYW4gbmZzZCBjb21tYW5kIHdpdGggYW4gQUNLOyByZXR1cm4gdGhlIEFDSyBlcnJubyAoXHUwMDNjPSAwKS4gKi9cbiYjNDM7c3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBidWZbMSBcdTAwM2NcdTAwM2MgMjBdLCByYnVmWzQwOTZdO1xuJiM0MztcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4mIzQzO1x0aW50IGZkID0gZ2VubF9vcGVuKCk7XG4mIzQzO1x0aW50IG9mZiwgbiwgcmV0O1xuJiM0MztcbiYjNDM7XHRvZmYgPSBnZW5sX2hkcihidWYsIG5mc2RfZmFtaWx5LCBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNLLCBjbWQpO1xuJiM0MztcdGlmIChhdHRyc19sZW4pIHtcbiYjNDM7XHRcdG1lbWNweShidWYgJiM0Mzsgb2ZmLCBhdHRycywgYXR0cnNfbGVuKTtcbiYjNDM7XHRcdG9mZiAmIzQzOz0gYXR0cnNfbGVuO1xuJiM0MztcdH1cbiYjNDM7XHRubGgtXHUwMDNlbmxtc2dfbGVuID0gb2ZmO1xuJiM0MztcbiYjNDM7XHRpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApIFx1MDAzYyAwKVxuJiM0MztcdFx0ZGllKFwmIzM0O3NlbmQoZ2VubClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRuID0gcmVjdihmZCwgcmJ1Ziwgc2l6ZW9mKHJidWYpLCAwKTtcbiYjNDM7XHRpZiAobiBcdTAwM2MgMClcbiYjNDM7XHRcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcbiYjNDM7XHRlbHNlIGlmICgoKHN0cnVjdCBubG1zZ2hkciAqKXJidWYpLVx1MDAzZW5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpXG4mIzQzO1x0XHRyZXQgPSAoKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEocmJ1ZikpLVx1MDAzZWVycm9yO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldCA9IDA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFNlbmQgYSBjb21tYW5kIGFuZCByZXR1cm4gdGhlIGZ1bGwgcmVwbHkgbWVzc2FnZTsgLWVycm5vIG9uIGZhaWx1cmUuICovXG4mIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXF1ZXN0X3JlcGx5KHVpbnQ4X3QgY21kLCBjaGFyICpyYnVmLCBzaXplX3QgcmxlbilcbiYjNDM7e1xuJiM0MztcdGNoYXIgYnVmWzI1Nl07XG4mIzQzO1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbiYjNDM7XHRpbnQgZmQgPSBnZW5sX29wZW4oKTtcbiYjNDM7XHRpbnQgb2ZmLCBuLCByZXQ7XG4mIzQzO1xuJiM0MztcdG9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QsIGNtZCk7XG4mIzQzO1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbiYjNDM7XG4mIzQzO1x0aWYgKHNlbmQoZmQsIGJ1Ziwgb2ZmLCAwKSBcdTAwM2MgMClcbiYjNDM7XHRcdGRpZShcJiMzNDtzZW5kKGdlbmwgcmVwbHkpXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0biA9IHJlY3YoZmQsIHJidWYsIHJsZW4sIDApO1xuJiM0MztcdGlmIChuIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0ID0gKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgPyAtRVRJTUVET1VUIDogLWVycm5vO1xuJiM0MztcdGVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbiYjNDM7XHRcdHJldCA9ICgoc3RydWN0IG5sbXNnZXJyICopTkxNU0dfREFUQShyYnVmKSktXHUwMDNlZXJyb3I7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0cmV0ID0gbjtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVzb2x2ZSB0aGUgXCYjMzQ7bmZzZFwmIzM0OyBnZW5sIGZhbWlseSBpZDsgLTEgaWYgbm90IHJlZ2lzdGVyZWQuICovXG4mIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXNvbHZlX25mc2Qodm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgYnVmWzEwMjRdLCByYnVmWzQwOTZdO1xuJiM0MztcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4mIzQzO1x0c3RydWN0IG5sbXNnaGRyICpyaCA9ICh2b2lkICopcmJ1ZjtcbiYjNDM7XHRzdHJ1Y3QgbmxhdHRyICpuYTtcbiYjNDM7XHRpbnQgZmQsIG9mZiwgbGVmdCwgaWQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBnZW5sX29wZW4oKTtcbiYjNDM7XHRvZmYgPSBnZW5sX2hkcihidWYsIEdFTkxfSURfQ1RSTCwgTkxNX0ZfUkVRVUVTVCwgQ1RSTF9DTURfR0VURkFNSUxZKTtcbiYjNDM7XHRvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLFxuJiM0MztcdFx0ICAgICAgIE5GU0RfRkFNSUxZX05BTUUsIHNpemVvZihORlNEX0ZBTUlMWV9OQU1FKSk7XG4mIzQzO1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbiYjNDM7XG4mIzQzO1x0aWYgKHNlbmQoZmQsIGJ1Ziwgb2ZmLCAwKSBcdTAwM2MgMClcbiYjNDM7XHRcdGRpZShcJiMzNDtzZW5kKEdFVEZBTUlMWSlcJiMzNDspO1xuJiM0MztcdGlmIChyZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApIFx1MDAzYyAwKVxuJiM0MztcdFx0ZGllKFwmIzM0O3JlY3YoR0VURkFNSUxZKVwmIzM0Oyk7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRpZiAocmgtXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0bmEgPSAodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEocmgpICYjNDM7IEdFTkxfSERSTEVOKTtcbiYjNDM7XHRsZWZ0ID0gcmgtXHUwMDNlbmxtc2dfbGVuIC0gTkxNU0dfSERSTEVOIC0gR0VOTF9IRFJMRU47XG4mIzQzO1x0d2hpbGUgKGxlZnQgXHUwMDNlPSAoaW50KU5MQV9IRFJMRU4pIHtcbiYjNDM7XHRcdGlmIChuYS1cdTAwM2VubGFfdHlwZSA9PSBDVFJMX0FUVFJfRkFNSUxZX0lEKSB7XG4mIzQzO1x0XHRcdGlkID0gKih1aW50MTZfdCAqKSgoY2hhciAqKW5hICYjNDM7IE5MQV9IRFJMRU4pO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGxlZnQgLT0gTkxBX0FMSUdONChuYS1cdTAwM2VubGFfbGVuKTtcbiYjNDM7XHRcdG5hID0gKHZvaWQgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfQUxJR040KG5hLVx1MDAzZW5sYV9sZW4pKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGlkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGxpc3RlbmVyIHJlcXVlc3QgYnVpbGRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJiM0MztcbiYjNDM7LyogRmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIG5lZ2F0aXZlIHRlc3RzOiBhbnkgZmllbGQgY2FuIGJlIG9taXR0ZWQvbWFsZm9ybWVkLiAqL1xuJiM0MztzdHJ1Y3QgcmF3X2xpc3RlbmVyIHtcbiYjNDM7XHRjb25zdCBjaGFyICp4cHJ0O1x0LyogTlVMTCAtXHUwMDNlIG9taXQgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUgKi9cbiYjNDM7XHRpbnQgZW1pdF9hZGRyO1x0XHQvKiAwIC1cdTAwM2Ugb21pdCBORlNEX0FfU09DS19BRERSICovXG4mIzQzO1x0Y29uc3Qgdm9pZCAqYWRkcjtcbiYjNDM7XHRpbnQgYWRkcl9sZW47XHRcdC8qIGJ5dGVzIHRvIGVtaXQgZm9yIE5GU0RfQV9TT0NLX0FERFIgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcHV0X3Jhd19saXN0ZW5lcihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IHN0cnVjdCByYXdfbGlzdGVuZXIgKnIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbmxhdHRyICpuZXN0ID0gKHZvaWQgKikoYnVmICYjNDM7IG9mZik7XG4mIzQzO1x0aW50IGlubmVyID0gb2ZmICYjNDM7IE5MQV9IRFJMRU47XG4mIzQzO1xuJiM0MztcdGlmIChyLVx1MDAzZWVtaXRfYWRkcilcbiYjNDM7XHRcdGlubmVyID0gcHV0X2F0dHIoYnVmLCBpbm5lciwgTkZTRF9BX1NPQ0tfQUREUiwgci1cdTAwM2VhZGRyLCByLVx1MDAzZWFkZHJfbGVuKTtcbiYjNDM7XHRpZiAoci1cdTAwM2V4cHJ0KVxuJiM0MztcdFx0aW5uZXIgPSBwdXRfYXR0cihidWYsIGlubmVyLCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSxcbiYjNDM7XHRcdFx0XHQgci1cdTAwM2V4cHJ0LCBzdHJsZW4oci1cdTAwM2V4cHJ0KSAmIzQzOyAxKTtcbiYjNDM7XHRuZXN0LVx1MDAzZW5sYV90eXBlID0gTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgfCBOTEFfRl9ORVNURUQ7XG4mIzQzO1x0bmVzdC1cdTAwM2VubGFfbGVuID0gaW5uZXIgLSBvZmY7XG4mIzQzO1x0cmV0dXJuIG9mZiAmIzQzOyBOTEFfQUxJR040KG5lc3QtXHUwMDNlbmxhX2xlbik7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFdlbGwtZm9ybWVkIGxvb3BiYWNrIGxpc3RlbmVyIGZvciBAZmFtaWx5IChBRl9JTkVUIG9yIEFGX0lORVQ2KS4gKi9cbiYjNDM7c3RhdGljIGludCBwdXRfbGlzdGVuZXJfYWYoY2hhciAqYnVmLCBpbnQgb2ZmLCBjb25zdCBjaGFyICp4cHJ0LCBpbnQgZmFtaWx5LFxuJiM0MztcdFx0XHQgICB1aW50MTZfdCBwb3J0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7MH07XG4mIzQzO1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IHhwcnQsIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnNzIH07XG4mIzQzO1xuJiM0MztcdGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHtcbiYjNDM7XHRcdHN0cnVjdCBzb2NrYWRkcl9pbjYgKnM2ID0gKHZvaWQgKilcdTAwMjZzcztcbiYjNDM7XG4mIzQzO1x0XHRzNi1cdTAwM2VzaW42X2ZhbWlseSA9IEFGX0lORVQ2O1xuJiM0MztcdFx0czYtXHUwMDNlc2luNl9wb3J0ID0gaHRvbnMocG9ydCk7XG4mIzQzO1x0XHRzNi1cdTAwM2VzaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrO1xuJiM0MztcdFx0ci5hZGRyX2xlbiA9IHNpemVvZigqczYpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gKnM0ID0gKHZvaWQgKilcdTAwMjZzcztcbiYjNDM7XG4mIzQzO1x0XHRzNC1cdTAwM2VzaW5fZmFtaWx5ID0gQUZfSU5FVDtcbiYjNDM7XHRcdHM0LVx1MDAzZXNpbl9wb3J0ID0gaHRvbnMocG9ydCk7XG4mIzQzO1x0XHRzNC1cdTAwM2VzaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spO1xuJiM0MztcdFx0ci5hZGRyX2xlbiA9IHNpemVvZigqczQpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gcHV0X3Jhd19saXN0ZW5lcihidWYsIG9mZiwgXHUwMDI2cik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgdWludDE2X3QgcG9ydClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBwdXRfbGlzdGVuZXJfYWYoYnVmLCBvZmYsIHhwcnQsIEFGX0lORVQsIHBvcnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIExJU1RFTkVSX0dFVCBwYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiYjNDM7XG4mIzQzO3N0cnVjdCBsaXN0ZW5lcl9lbnQge1xuJiM0MztcdGNoYXIgeHBydFsxNl07XG4mIzQzO1x0aW50IGZhbWlseTtcbiYjNDM7XHR1aW50MTZfdCBwb3J0O1xuJiM0MztcdHN0cnVjdCBpbl9hZGRyIGE0O1xuJiM0MztcdHN0cnVjdCBpbjZfYWRkciBhNjtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGFyc2VfbGlzdGVuZXJfZ2V0KGNvbnN0IGNoYXIgKnJidWYsIGludCBsZW4sXG4mIzQzO1x0XHRcdCAgICAgIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKm91dCwgaW50IG1heClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHZvaWQgKilyYnVmO1xuJiM0MztcdGNvbnN0IHN0cnVjdCBubGF0dHIgKm5hO1xuJiM0MztcdGludCBsZWZ0LCBjb3VudCA9IDA7XG4mIzQzO1xuJiM0MztcdCh2b2lkKWxlbjtcbiYjNDM7XHRuYSA9IChjb25zdCB2b2lkICopKHJidWYgJiM0MzsgTkxNU0dfSERSTEVOICYjNDM7IEdFTkxfSERSTEVOKTtcbiYjNDM7XHRsZWZ0ID0gbmxoLVx1MDAzZW5sbXNnX2xlbiAtIE5MTVNHX0hEUkxFTiAtIEdFTkxfSERSTEVOO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAobGVmdCBcdTAwM2U9IChpbnQpTkxBX0hEUkxFTikge1xuJiM0MztcdFx0aW50IGFsZW4gPSBuYS1cdTAwM2VubGFfbGVuO1xuJiM0MztcbiYjNDM7XHRcdGlmICgobmEtXHUwMDNlbmxhX3R5cGUgXHUwMDI2IE5MQV9UWVBFX01BU0spID09IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIGNvdW50IFx1MDAzYyBtYXgpIHtcbiYjNDM7XHRcdFx0Y29uc3Qgc3RydWN0IG5sYXR0ciAqaW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICYjNDM7IE5MQV9IRFJMRU4pO1xuJiM0MztcdFx0XHRpbnQgaWxlZnQgPSBhbGVuIC0gTkxBX0hEUkxFTjtcbiYjNDM7XHRcdFx0c3RydWN0IGxpc3RlbmVyX2VudCAqZSA9IFx1MDAyNm91dFtjb3VudF07XG4mIzQzO1xuJiM0MztcdFx0XHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XG4mIzQzO1x0XHRcdHdoaWxlIChpbGVmdCBcdTAwM2U9IChpbnQpTkxBX0hEUkxFTikge1xuJiM0MztcdFx0XHRcdGNvbnN0IHZvaWQgKmQgPSAoY29uc3QgY2hhciAqKWluICYjNDM7IE5MQV9IRFJMRU47XG4mIzQzO1x0XHRcdFx0aW50IHQgPSBpbi1cdTAwM2VubGFfdHlwZSBcdTAwMjYgTkxBX1RZUEVfTUFTSztcbiYjNDM7XG4mIzQzO1x0XHRcdFx0aWYgKHQgPT0gTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUpIHtcbiYjNDM7XHRcdFx0XHRcdHN0cm5jcHkoZS1cdTAwM2V4cHJ0LCBkLCBzaXplb2YoZS1cdTAwM2V4cHJ0KSAtIDEpO1xuJiM0MztcdFx0XHRcdH0gZWxzZSBpZiAodCA9PSBORlNEX0FfU09DS19BRERSKSB7XG4mIzQzO1x0XHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc3MgPSBkO1xuJiM0MztcbiYjNDM7XHRcdFx0XHRcdGUtXHUwMDNlZmFtaWx5ID0gc3MtXHUwMDNlc3NfZmFtaWx5O1xuJiM0MztcdFx0XHRcdFx0aWYgKHNzLVx1MDAzZXNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7XG4mIzQzO1x0XHRcdFx0XHRcdGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqcyA9IGQ7XG4mIzQzO1xuJiM0MztcdFx0XHRcdFx0XHRlLVx1MDAzZWE0ID0gcy1cdTAwM2VzaW5fYWRkcjtcbiYjNDM7XHRcdFx0XHRcdFx0ZS1cdTAwM2Vwb3J0ID0gbnRvaHMocy1cdTAwM2VzaW5fcG9ydCk7XG4mIzQzO1x0XHRcdFx0XHR9IGVsc2UgaWYgKHNzLVx1MDAzZXNzX2ZhbWlseSA9PSBBRl9JTkVUNikge1xuJiM0MztcdFx0XHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzID0gZDtcbiYjNDM7XG4mIzQzO1x0XHRcdFx0XHRcdGUtXHUwMDNlYTYgPSBzLVx1MDAzZXNpbjZfYWRkcjtcbiYjNDM7XHRcdFx0XHRcdFx0ZS1cdTAwM2Vwb3J0ID0gbnRvaHMocy1cdTAwM2VzaW42X3BvcnQpO1xuJiM0MztcdFx0XHRcdFx0fVxuJiM0MztcdFx0XHRcdH1cbiYjNDM7XHRcdFx0XHRpbGVmdCAtPSBOTEFfQUxJR040KGluLVx1MDAzZW5sYV9sZW4pO1xuJiM0MztcdFx0XHRcdGluID0gKGNvbnN0IHZvaWQgKikoKGNoYXIgKilpbiAmIzQzOyBOTEFfQUxJR040KGluLVx1MDAzZW5sYV9sZW4pKTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRsZWZ0IC09IE5MQV9BTElHTjQoYWxlbik7XG4mIzQzO1x0XHRuYSA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgJiM0MzsgTkxBX0FMSUdONChhbGVuKSk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBjb3VudDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZW5pZW5jZSB3cmFwcGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGxpc3RlbmVyX3NldChjb25zdCBjaGFyICphdHRycywgaW50IGxlbilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfTElTVEVORVJfU0VULCBhdHRycywgbGVuKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRmV0Y2ggdGhlIGN1cnJlbnQgbGlzdGVuZXJzOyByZXR1cm5zIGNvdW50IChcdTAwM2U9MCkgb3IgLWVycm5vLiAqL1xuJiM0MztzdGF0aWMgaW50IGxpc3RlbmVyX2dldChzdHJ1Y3QgbGlzdGVuZXJfZW50ICpvdXQsIGludCBtYXgpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIHJidWZbODE5Ml07XG4mIzQzO1x0aW50IG4gPSBnZW5sX3JlcXVlc3RfcmVwbHkoTkZTRF9DTURfTElTVEVORVJfR0VULCByYnVmLCBzaXplb2YocmJ1ZikpO1xuJiM0MztcbiYjNDM7XHRpZiAobiBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiBuO1xuJiM0MztcdHJldHVybiBwYXJzZV9saXN0ZW5lcl9nZXQocmJ1Ziwgbiwgb3V0LCBtYXgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGxpc3RlbmVyX2VudCAqZmluZF9saXN0ZW5lcihzdHJ1Y3QgbGlzdGVuZXJfZW50ICplLCBpbnQgbixcbiYjNDM7XHRcdFx0XHRcdCAgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSxcbiYjNDM7XHRcdFx0XHRcdCAgdWludDE2X3QgcG9ydClcbiYjNDM7e1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmIChlW2ldLmZhbWlseSA9PSBmYW1pbHkgXHUwMDI2XHUwMDI2IGVbaV0ucG9ydCA9PSBwb3J0IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICFzdHJjbXAoZVtpXS54cHJ0LCB4cHJ0KSlcbiYjNDM7XHRcdFx0cmV0dXJuIFx1MDAyNmVbaV07XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFN0YXJ0IChAbiBcdTAwM2UgMCkgb3Igc3RvcCAoQG4gPT0gMCkgbmZzZCB0aHJlYWRzIGluIHRoaXMgbmV0bnMuICovXG4mIzQzO3N0YXRpYyBpbnQgdGhyZWFkc19zZXQoaW50IG4pXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHR1aW50MzJfdCB2ID0gbjtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X2F0dHIoYXR0cnMsIDAsIE5GU0RfQV9TRVJWRVJfVEhSRUFEUywgXHUwMDI2diwgc2l6ZW9mKHYpKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGdlbmxfcmVxdWVzdChORlNEX0NNRF9USFJFQURTX1NFVCwgYXR0cnMsIG9mZik7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyLW5ldG5zIGxvY2FsIHJwY2JpbmQgc3R1YiAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBDcmVhdGluZyBhIGxpc3RlbmVyIHJlZ2lzdGVycyB3aXRoIHJwY2JpbmQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKClcbiYjNDM7ICogcGFzc2VzIGZsYWdzIG9mIDAsIHNvIHBtYXBfcmVnaXN0ZXIgaXMgdHJ1ZSBpbiBzdmNfc2V0dXBfc29ja2V0KCksIGFuZFxuJiM0MzsgKiBuZnNkX3ZlcnNpb24zIGlzIHJlZ2lzdGVyYWJsZSBieSBkZWZhdWx0IGFuZCBkb2VzIG5vdCBzZXQgdnNfcnBjYl9vcHRubCxcbiYjNDM7ICogc28gYSByZWdpc3RyYXRpb24gZmFpbHVyZSBhYm9ydHMgbGlzdGVuZXIgY3JlYXRpb24uIFRoZSBhYnN0cmFjdCBBRl9MT0NBTFxuJiM0MzsgKiBuYW1lIHRoZSBrZXJuZWwgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zICh1bml4X2ZpbmRfYWJzdHJhY3QoKSB0YWtlcyBhXG4mIzQzOyAqIHN0cnVjdCBuZXQpLCBzbyBhbnN3ZXIgaXQgaGVyZSBhbmQgc3RheSBvdXQgb2YgdGhlIGhvc3QmIzM5O3MgcnBjYmluZC5cbiYjNDM7ICpcbiYjNDM7ICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZFxuJiM0MzsgKiBTRVQvVU5TRVQgZ2V0IFRSVUUsIGZvciBib3RoIFJQQ0JWRVJTXzIgYW5kIFJQQ0JWRVJTXzQuIHY0IGhhcyB0byBiZVxuJiM0MzsgKiBhbnN3ZXJlZCBiZWNhdXNlIF9fc3ZjX3JwY2JfcmVnaXN0ZXI2KCkgdHVybnMgYSB2NCByZWZ1c2FsIGludG9cbiYjNDM7ICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLlxuJiM0MzsgKlxuJiM0MzsgKiBJbiBSUENCX1NUVUJfUkVGVVNFIG1vZGUgU0VUIGlzIGFuc3dlcmVkIEZBTFNFIGluc3RlYWQsIHdoaWNoXG4mIzQzOyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seVxuJiM0MzsgKiBzdmNfdW5yZWdpc3RlcigpIGlzc3VlcyBpdCwgYW5kIGl0IGRpc2NhcmRzIHRoZSByZXN1bHQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIFJQQ0JfUFJPR1JBTVx0XHQxMDAwMDBcbiYjNDM7I2RlZmluZSBSUENCX1BST0NfTlVMTFx0XHQwXG4mIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1NFVFx0XHQxXG4mIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUXHRcdDJcbiYjNDM7I2RlZmluZSBSUENCX0FCU1RSQUNUX05BTUVcdFwmIzM0Oy9ydW4vcnBjYmluZC5zb2NrXCYjMzQ7XG4mIzQzOyNkZWZpbmUgUlBDQl9TVFVCX01BWENPTk5cdDRcbiYjNDM7XG4mIzQzO2VudW0geyBSUENCX1NUVUJfQUNDRVBULCBSUENCX1NUVUJfUkVGVVNFIH07XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9saXN0ZW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl91biBzdW4gPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9O1xuJiM0MztcdHNpemVfdCBubGVuID0gc3RybGVuKFJQQ0JfQUJTVFJBQ1RfTkFNRSk7XG4mIzQzO1x0c29ja2xlbl90IGFsZW47XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHQvKiBBYnN0cmFjdCBuYW1lcyBhcmUgbGVuZ3RoLWRlbGltaXRlZCwgc28gdGhlIGxlbmd0aCBtdXN0IG1hdGNoLiAqL1xuJiM0MztcdG1lbWNweShzdW4uc3VuX3BhdGggJiM0MzsgMSwgUlBDQl9BQlNUUkFDVF9OQU1FLCBubGVuKTtcbiYjNDM7XHRhbGVuID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgJiM0MzsgMSAmIzQzOyBubGVuO1xuJiM0MztcbiYjNDM7XHRmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopXHUwMDI2c3VuLCBhbGVuKSBcdTAwM2MgMCB8fFxuJiM0MztcdCAgICBsaXN0ZW4oZmQsIFJQQ0JfU1RVQl9NQVhDT05OKSBcdTAwM2MgMCkge1xuJiM0MztcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gZmQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgZG9uZSA9IDA7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChkb25lIFx1MDAzYyBsZW4pIHtcbiYjNDM7XHRcdHNzaXplX3QgbiA9IHJlYWQoZmQsIChjaGFyICopYnVmICYjNDM7IGRvbmUsIGxlbiAtIGRvbmUpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChuIFx1MDAzYz0gMClcbiYjNDM7XHRcdFx0cmV0dXJuIC0xO1xuJiM0MztcdFx0ZG9uZSAmIzQzOz0gbjtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIEhhbmRsZSBvbmUgcmVjb3JkLW1hcmtlZCBSUEMgY2FsbC4gUmV0dXJucyAtMSB3aGVuIHRoZSBwZWVyIGlzIGRvbmUuICovXG4mIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX2NhbGwoaW50IGZkLCBpbnQgbW9kZSlcbiYjNDM7e1xuJiM0MztcdHVpbnQzMl90IG1hcmssIGNhbGxbNl0sIHJlcFs3XTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgbGVuLCBucmVwID0gNjtcbiYjNDM7XHRzaXplX3QgcmVwbGVuO1xuJiM0MztcbiYjNDM7XHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIFx1MDAyNm1hcmssIHNpemVvZihtYXJrKSkpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0bGVuID0gbnRvaGwobWFyaykgXHUwMDI2IDB4N2ZmZmZmZmY7XG4mIzQzO1x0aWYgKGxlbiBcdTAwM2Mgc2l6ZW9mKGNhbGwpIHx8IGxlbiBcdTAwM2UgNDA5NilcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdC8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqL1xuJiM0MztcdGZvciAobGVuIC09IHNpemVvZihjYWxsKTsgbGVuOyApIHtcbiYjNDM7XHRcdGNoYXIgc2lua1syNTZdO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IG4gPSBsZW4gXHUwMDNlIHNpemVvZihzaW5rKSA/IHNpemVvZihzaW5rKSA6IGxlbjtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIHNpbmssIG4pKVxuJiM0MztcdFx0XHRyZXR1cm4gLTE7XG4mIzQzO1x0XHRsZW4gLT0gbjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJlcFswXSA9IGNhbGxbMF07XHRcdC8qIHhpZCAqL1xuJiM0MztcdHJlcFsxXSA9IGh0b25sKDEpO1x0XHQvKiBSRVBMWSAqL1xuJiM0MztcdHJlcFsyXSA9IGh0b25sKDApO1x0XHQvKiBNU0dfQUNDRVBURUQgKi9cbiYjNDM7XHRyZXBbM10gPSBodG9ubCgwKTtcdFx0LyogdmVyaWZpZXIgZmxhdm9yIEFVVEhfTlVMTCAqL1xuJiM0MztcdHJlcFs0XSA9IGh0b25sKDApO1x0XHQvKiB2ZXJpZmllciBsZW5ndGggKi9cbiYjNDM7XHRyZXBbNV0gPSBodG9ubCgwKTtcdFx0LyogU1VDQ0VTUyAqL1xuJiM0MztcbiYjNDM7XHRpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7XG4mIzQzO1x0XHRyZXBbNV0gPSBodG9ubCgxKTtcdC8qIFBST0dfVU5BVkFJTCAqL1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7XG4mIzQzO1x0XHRjYXNlIFJQQ0JfUFJPQ19OVUxMOlxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgUlBDQl9QUk9DX1NFVDpcbiYjNDM7XHRcdFx0cmVwWzZdID0gaHRvbmwobW9kZSA9PSBSUENCX1NUVUJfUkVGVVNFID8gMCA6IDEpO1xuJiM0MztcdFx0XHRucmVwID0gNztcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIFJQQ0JfUFJPQ19VTlNFVDpcbiYjNDM7XHRcdFx0cmVwWzZdID0gaHRvbmwoMSk7XHQvKiBUUlVFICovXG4mIzQzO1x0XHRcdG5yZXAgPSA3O1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHJlcFs1XSA9IGh0b25sKDMpO1x0LyogUFJPQ19VTkFWQUlMICovXG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXBsZW4gPSBucmVwICogc2l6ZW9mKHJlcFswXSk7XG4mIzQzO1x0bWFyayA9IGh0b25sKDB4ODAwMDAwMDAgfCByZXBsZW4pO1xuJiM0MztcdGlmICh3cml0ZShmZCwgXHUwMDI2bWFyaywgc2l6ZW9mKG1hcmspKSAhPSAoc3NpemVfdClzaXplb2YobWFyaykgfHxcbiYjNDM7XHQgICAgd3JpdGUoZmQsIHJlcCwgcmVwbGVuKSAhPSAoc3NpemVfdClyZXBsZW4pXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBwb2xsZmQgcGZkWzEgJiM0MzsgUlBDQl9TVFVCX01BWENPTk5dO1xuJiM0MztcdG5mZHNfdCBuID0gMSwgaTtcbiYjNDM7XG4mIzQzO1x0cGZkWzBdLmZkID0gbGZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHQvKiBzdG9wIHBvbGxpbmcgdGhlIGxpc3RlbmVyIHdoZW4gZnVsbCwgb3IgcG9sbCgpIHNwaW5zICovXG4mIzQzO1x0XHRwZmRbMF0uZXZlbnRzID0gbiBcdTAwM2MgMSAmIzQzOyBSUENCX1NUVUJfTUFYQ09OTiA/IFBPTExJTiA6IDA7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHBvbGwocGZkLCBuLCAtMSkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocGZkWzBdLnJldmVudHMgXHUwMDI2IFBPTExJTikge1xuJiM0MztcdFx0XHRpbnQgYyA9IGFjY2VwdChsZmQsIE5VTEwsIE5VTEwpO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKGMgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHRcdFx0cGZkW25dLmZkID0gYztcbiYjNDM7XHRcdFx0XHRwZmRbbl0uZXZlbnRzID0gUE9MTElOO1xuJiM0MztcdFx0XHRcdG4mIzQzOyYjNDM7O1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKCEocGZkW2ldLnJldmVudHMgXHUwMDI2IChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikpKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRpZiAocnBjYl9zdHViX2NhbGwocGZkW2ldLmZkLCBtb2RlKSkge1xuJiM0MztcdFx0XHRcdGNsb3NlKHBmZFtpXS5mZCk7XG4mIzQzO1x0XHRcdFx0cGZkW2ldID0gcGZkWy0tbl07XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJldHVybnMgdGhlIHN0dWImIzM5O3MgcGlkLCBvciAtMS4gVGhlIHNvY2tldCBpcyBsaXN0ZW5pbmcgYmVmb3JlIHdlIGZvcmsuICovXG4mIzQzO3N0YXRpYyBwaWRfdCBycGNiX3N0dWJfc3RhcnQoaW50IG1vZGUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgbGZkID0gcnBjYl9zdHViX2xpc3RlbigpO1xuJiM0MztcdHBpZF90IHBpZDtcbiYjNDM7XG4mIzQzO1x0aWYgKGxmZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cGlkID0gZm9yaygpO1xuJiM0MztcdGlmIChwaWQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGNsb3NlKGxmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChwaWQgPT0gMCkge1xuJiM0MztcdFx0c2lnbmFsKFNJR1BJUEUsIFNJR19JR04pO1xuJiM0MztcdFx0cHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lHS0lMTCk7XG4mIzQzO1x0XHRpZiAoZ2V0cHBpZCgpID09IDEpXHRcdC8qIHJhY2VkIHdpdGggcGFyZW50IGV4aXQgKi9cbiYjNDM7XHRcdFx0X2V4aXQoMCk7XG4mIzQzO1x0XHRycGNiX3N0dWJfc2VydmUobGZkLCBtb2RlKTtcbiYjNDM7XHRcdF9leGl0KDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Y2xvc2UobGZkKTtcbiYjNDM7XHRyZXR1cm4gcGlkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBTd2FwIHRoZSBzdHViIGZvciBvbmUgaW4gQG1vZGUuIFNhZmUgYmVmb3JlIHRoZSBmaXJzdCByZXF1ZXN0OiBubyBzZXJ2XG4mIzQzOyAqIGV4aXN0cyB5ZXQsIHNvIHRoZSBrZXJuZWwgaGFzIG5vdCBjb25uZWN0ZWQgYW5kIHRoZSBhYnN0cmFjdCBuYW1lIGlzIGZyZWVcbiYjNDM7ICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBycGNiX3N0dWJfcmVzdGFydChwaWRfdCAqcGlkLCBpbnQgbW9kZSlcbiYjNDM7e1xuJiM0MztcdGlmICgqcGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRraWxsKCpwaWQsIFNJR0tJTEwpO1xuJiM0MztcdFx0d2FpdHBpZCgqcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0KnBpZCA9IHJwY2Jfc3R1Yl9zdGFydChtb2RlKTtcbiYjNDM7XHRyZXR1cm4gKnBpZCBcdTAwM2UgMCA/IDAgOiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4mIzQzO1xuJiM0MztGSVhUVVJFKG5mc2RfbGlzdGVuZXIpIHtcbiYjNDM7XHRwaWRfdCBycGNiZDtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO0ZJWFRVUkVfU0VUVVAobmZzZF9saXN0ZW5lcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpZnJlcSBpZnIgPSB7MH07XG4mIzQzO1x0c3RydWN0IHN0YXQgc3Q7XG4mIzQzO1x0aW50IHM7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRldWlkKCkgIT0gMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDttdXN0IGJlIHJ1biBhcyByb290XCYjMzQ7KTtcbiYjNDM7XHRpZiAodW5zaGFyZShDTE9ORV9ORVdORVQgfCBDTE9ORV9ORVdOUykgXHUwMDNjIDApXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7dW5zaGFyZShORVdORVR8TkVXTlMpOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRpZiAobW91bnQoXCYjMzQ7XCYjMzQ7LCBcJiMzNDsvXCYjMzQ7LCBOVUxMLCBNU19SRUMgfCBNU19QUklWQVRFLCBOVUxMKSBcdTAwM2MgMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDttb3VudCgvIHByaXZhdGUpOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBLZWVwIHRoZSBrZXJuZWwmIzM5O3MgcnBjYmluZCBjbGllbnQgaW5zaWRlIHRoaXMgbmFtZXNwYWNlLiBUaGVcbiYjNDM7XHQgKiBhYnN0cmFjdCBzb2NrZXQgaXQgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zLCBidXQgdGhlXG4mIzQzO1x0ICogXCYjMzQ7L3Zhci9ydW4vcnBjYmluZC5zb2NrXCYjMzQ7IGZhbGxiYWNrIGlzIG5vdCwgc28gaGlkZSB0aGUgcGF0aC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAobW91bnQoXCYjMzQ7dG1wZnNcJiMzNDssIFwmIzM0Oy9ydW5cJiMzNDssIFwmIzM0O3RtcGZzXCYjMzQ7LCAwLCBOVUxMKSBcdTAwM2MgMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDttb3VudCh0bXBmcyBvbiAvcnVuKTogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0aWYgKGxzdGF0KFwmIzM0Oy92YXIvcnVuXCYjMzQ7LCBcdTAwMjZzdCkgPT0gMCBcdTAwMjZcdTAwMjYgU19JU0RJUihzdC5zdF9tb2RlKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgbW91bnQoXCYjMzQ7dG1wZnNcJiMzNDssIFwmIzM0Oy92YXIvcnVuXCYjMzQ7LCBcJiMzNDt0bXBmc1wmIzM0OywgMCwgTlVMTCkgXHUwMDNjIDApXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7bW91bnQodG1wZnMgb24gL3Zhci9ydW4pOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XG4mIzQzO1x0LyogQnJpbmcgbG9vcGJhY2sgdXAgc28gbGlzdGVuZXIgYmluZHMgKDEyNy4wLjAuMSAvIDo6MSkgd29yay4gKi9cbiYjNDM7XHRzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApO1xuJiM0MztcdEFTU0VSVF9HRShzLCAwKTtcbiYjNDM7XHRzdHJjcHkoaWZyLmlmcl9uYW1lLCBcJiMzNDtsb1wmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIGlvY3RsKHMsIFNJT0NHSUZGTEFHUywgXHUwMDI2aWZyKSk7XG4mIzQzO1x0aWZyLmlmcl9mbGFncyB8PSBJRkZfVVAgfCBJRkZfUlVOTklORztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ1NJRkZMQUdTLCBcdTAwMjZpZnIpKTtcbiYjNDM7XHRjbG9zZShzKTtcbiYjNDM7XG4mIzQzO1x0bmZzZF9mYW1pbHkgPSBnZW5sX3Jlc29sdmVfbmZzZCgpO1xuJiM0MztcdGlmIChuZnNkX2ZhbWlseSBcdTAwM2MgMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtuZnNkIGdlbmwgZmFtaWx5IG5vdCBmb3VuZCAobW9kcHJvYmUgbmZzZD8pXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0c2VsZi1cdTAwM2VycGNiZCA9IHJwY2Jfc3R1Yl9zdGFydChSUENCX1NUVUJfQUNDRVBUKTtcbiYjNDM7XHRpZiAoc2VsZi1cdTAwM2VycGNiZCBcdTAwM2MgMClcbiYjNDM7XHRcdFNLSVAocmV0dXJuLCBcJiMzNDtjYW5ub3Qgc3RhcnQgdGhlIHJwY2JpbmQgc3R1YjogJXNcJiMzNDssXG4mIzQzO1x0XHQgICAgIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO0ZJWFRVUkVfVEVBUkRPV04obmZzZF9saXN0ZW5lcilcbiYjNDM7e1xuJiM0MztcdGlmIChzZWxmLVx1MDAzZXJwY2JkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRraWxsKHNlbGYtXHUwMDNlcnBjYmQsIFNJR0tJTEwpO1xuJiM0MztcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXJwY2JkLCBOVUxMLCAwKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSB2YWxpZGF0aW9uIC8gbmVnYXRpdmUgPT09PT09PT09PT09PT09PT09PT09ICovXG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2VtcHR5X2xpc3Rfb2spXG4mIzQzO3tcbiYjNDM7XHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF90b29fbWFueSlcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBjaGFyIGF0dHJzWzEgXHUwMDNjXHUwMDNjIDIwXTtcbiYjNDM7XHRpbnQgaSwgb2ZmID0gMDtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgMTAyNTsgaSYjNDM7JiM0MzspXHRcdC8qIFx1MDAzZSBORlNEX05MX0xJU1RFTkVSX01BWCAoMTAyNCkgKi9cbiYjNDM7XHRcdG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgb2ZmLCBcJiMzNDt1ZHBcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1x0RVhQRUNUX0VRKC1FMkJJRywgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9taXNzaW5nX2FkZHIpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCYjMzQ7dGNwXCYjMzQ7LCAuZW1pdF9hZGRyID0gMCB9O1xuJiM0MztcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ190cmFuc3BvcnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gczQgPSB7IC5zaW5fZmFtaWx5ID0gQUZfSU5FVCwgLnNpbl9wb3J0ID0gaHRvbnMoVEVTVF9QT1JUKSB9O1xuJiM0MztcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBOVUxMLCAuZW1pdF9hZGRyID0gMSxcbiYjNDM7XHRcdFx0XHQgIC5hZGRyID0gXHUwMDI2czQsIC5hZGRyX2xlbiA9IHNpemVvZihzNCkgfTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIG5hbWUgbWF0Y2hpbmcgbm8gdHJhbnNwb3J0IGNsYXNzIG11c3QgYmUgcmVmdXNlZCBiZWZvcmUgbmZzZF9tdXRleCBpc1xuJiM0MzsgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHNcbiYjNDM7ICogcmVxdWVzdF9tb2R1bGUoXCYjMzQ7c3ZjJXNcJiMzNDssIG5hbWUpIHVwY2FsbC5cbiYjNDM7ICovXG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX3RyYW5zcG9ydClcbiYjNDM7e1xuJiM0MztcdGNoYXIgYXR0cnNbNjRdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwmIzM0O2JvZ3VzX3hwcnRcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUSgtRVBST1RPTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2FkZHJfdG9vX3Nob3J0KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgY2hhciB0aW55ID0gMDtcbiYjNDM7XHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCYjMzQ7dGNwXCYjMzQ7LCAuZW1pdF9hZGRyID0gMSxcbiYjNDM7XHRcdFx0XHQgIC5hZGRyID0gXHUwMDI2dGlueSwgLmFkZHJfbGVuID0gMSB9O1xuJiM0MztcdGNoYXIgYXR0cnNbNjRdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldF9zaG9ydClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4mIzQzO1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFwmIzM0O3RjcFwmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2czQsXG4mIzQzO1x0XHRcdFx0ICAuYWRkcl9sZW4gPSBzaXplb2Yoc2FfZmFtaWx5X3QpICYjNDM7IDIgfTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXQ2X3Nob3J0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4mIzQzO1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFwmIzM0O3RjcFwmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2czYsXG4mIzQzO1x0XHRcdFx0ICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuJiM0MztcdGNoYXIgYXR0cnNbNjRdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX2ZhbWlseSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9O1xuJiM0MztcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcJiMzNDt0Y3BcJiMzNDssIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnNzLFxuJiM0MztcdFx0XHRcdCAgLmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgfTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHsgLnNzX2ZhbWlseSA9IEFGX1VOSVggfTtcbiYjNDM7XHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIGJhZCA9IHsgLnhwcnQgPSBcJiMzNDt0Y3BcJiMzNDssIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnNzLFxuJiM0MztcdFx0XHRcdCAgICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuJiM0MztcdGNoYXIgYXR0cnNbMTI4XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXHUwMDI2YmFkKTtcbiYjNDM7XHQvKiBUaGUgd2hvbGUgcmVxdWVzdCBpcyByZWplY3RlZCBkdXJpbmcgdmFsaWRhdGlvbjsgbm90aGluZyBhcHBsaWVkLiAqL1xuJiM0MztcdEVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIHJlamVjdGVkIHJlcXVlc3QgbXVzdCBsZWF2ZSB0aGUgbGlzdGVuZXJzIHRoYXQgYXJlIGFscmVhZHkgdXAgYWxvbmUuXG4mIzQzOyAqIFRoZSBlcnJubyBhbG9uZSBkb2VzIG5vdCBzaG93IHRoYXQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCkgcmV0dXJuc1xuJiM0MzsgKiAtRVBST1RPTk9TVVBQT1JUIGZvciBhbiB1bmtub3duIG5hbWUgdG9vLiBXaGF0IGRpZmZlcnMgaXMgaG93IGZhciB0aGVcbiYjNDM7ICogcmVxdWVzdCBnZXRzIC0tIHdpdGhvdXQgdGhlIGNoZWNrIGluIG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKCksXG4mIzQzOyAqIG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoKSBoYXMgYWxyZWFkeSBtb3ZlZCB0aGUgdW5tYXRjaGVkIHRjcCBsaXN0ZW5lclxuJiM0MzsgKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGVcbiYjNDM7ICogbmFtZSBmYWlscy5cbiYjNDM7ICovXG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfcmVqZWN0X2tlZXBzX2xpc3RlbmVycylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuJiM0MztcdGNoYXIgZ29vZFs2NF0sIGJhZFs2NF07XG4mIzQzO1x0aW50IG9nID0gcHV0X2xpc3RlbmVyKGdvb2QsIDAsIFwmIzM0O3RjcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XHRpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYmFkLCAwLCBcJiMzNDtib2d1c194cHJ0XCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGdvb2QsIG9nKSk7XG4mIzQzO1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChiYWQsIG9iKSk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4mIzQzO1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCBcJiMzNDt0Y3BcJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gZnVuY3Rpb25hbCAvIHJvdW5kLXRyaXAgPT09PT09PT09PT09PT09PT09PT09ICovXG4mIzQzO1xuJiM0MzsvKiBMSVNURU5FUl9HRVQgd2l0aCBubyBzZXJ2IGluIHRoaXMgbmV0bnMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiAqL1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19nZXRfZW1wdHkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbiYjNDM7XG4mIzQzO1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX3RjcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuJiM0MztcdGNoYXIgYXR0cnNbNjRdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwmIzM0O3RjcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4mIzQzO1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbiYjNDM7XHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwmIzM0O3RjcFwmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4mIzQzO1x0RVhQRUNUX0VRKGh0b25sKElOQUREUl9MT09QQkFDSyksIGdvdFswXS5hNC5zX2FkZHIpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdWRwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4mIzQzO1x0Y2hhciBhdHRyc1s2NF07XG4mIzQzO1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCYjMzQ7dWRwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCYjMzQ7dWRwXCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX211bHRpKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4mIzQzO1x0Y2hhciBhdHRyc1sxMjhdO1xuJiM0MztcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwmIzM0O3RjcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XG4mIzQzO1x0b2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsIFwmIzM0O3VkcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXCYjMzQ7dGNwXCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbiYjNDM7XHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwmIzM0O3VkcFwmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lkZW1wb3RlbnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0MztcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1x0XHQvKiByZS1zZXQgc2FtZSBsaXN0ICovXG4mIzQzO1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbiYjNDM7XHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwmIzM0O3RjcFwmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2FkZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuJiM0MztcdGNoYXIgb25lWzY0XSwgdHdvWzEyOF07XG4mIzQzO1x0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcdGludCBvMiA9IHB1dF9saXN0ZW5lcih0d28sIDAsIFwmIzM0O3RjcFwmIzM0OywgVEVTVF9QT1JUKTtcbiYjNDM7XG4mIzQzO1x0bzIgPSBwdXRfbGlzdGVuZXIodHdvLCBvMiwgXCYjMzQ7dWRwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvMSkpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpO1x0XHQvKiBhZGQgdWRwLCBrZWVwIHRjcCAqL1xuJiM0MztcdEFTU0VSVF9FUSgyLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4mIzQzO1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcJiMzNDt0Y3BcJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXCYjMzQ7dWRwXCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfcmVtb3ZlX3N1YnNldClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuJiM0MztcdGNoYXIgYm90aFsxMjhdLCBvbmVbNjRdO1xuJiM0MztcdGludCBvYiA9IHB1dF9saXN0ZW5lcihib3RoLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1x0aW50IG9vID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRvYiA9IHB1dF9saXN0ZW5lcihib3RoLCBvYiwgXCYjMzQ7dWRwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYm90aCwgb2IpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgb28pKTtcdFx0LyogZHJvcCB1ZHAgKi9cbiYjNDM7XHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCYjMzQ7dGNwXCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfZW1wdHlfZGVzdHJveXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuJiM0MztcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpO1x0XHQvKiBlbXB0eSAtXHUwMDNlIGRlc3Ryb3kgc2VydiAqL1xuJiM0MztcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbiYjNDM7XHRjaGFyIGF0dHJzWzY0XTtcbiYjNDM7XHRpbnQgb2ZmLCBzO1xuJiM0MztcbiYjNDM7XHRzID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7XG4mIzQzO1x0aWYgKHMgXHUwMDNjIDApXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7SVB2NiB1bmF2YWlsYWJsZTogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0Y2xvc2Uocyk7XG4mIzQzO1xuJiM0MztcdG9mZiA9IHB1dF9saXN0ZW5lcl9hZihhdHRycywgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBBRl9JTkVUNiwgVEVTVF9QT1JUKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0MztcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCYjMzQ7dGNwXCYjMzQ7LCBBRl9JTkVUNiwgVEVTVF9QT1JUKSk7XG4mIzQzO1x0RVhQRUNUX0VRKDAsIG1lbWNtcChcdTAwMjZnb3RbMF0uYTYsIFx1MDAyNmluNmFkZHJfbG9vcGJhY2ssIHNpemVvZihpbjZhZGRyX2xvb3BiYWNrKSkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gcnBjYmluZCByZWdpc3RyYXRpb24gPT09PT09PT09PT09PT09PT09PT09ICovXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIHJwY2JpbmQgdGhhdCByZWZ1c2VzIHRoZSByZWdpc3RyYXRpb24gbXVzdCBmYWlsIGxpc3RlbmVyIGNyZWF0aW9uLFxuJiM0MzsgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgZXJyb3IgaGFzIHRvIHN1cnZpdmUgc3ZjX3JlZ2lzdGVyKCkmIzM5O3Mgd2FsayBvdmVyIHN2X3Byb2dyYW1zIHRvIGdldFxuJiM0MzsgKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHlcbiYjNDM7ICogYSBOVUxMIGFuZCBhIHZzX2hpZGRlbiB2ZXJzaW9uLCBhbmQgc3ZjX2dlbmVyaWNfcnBjYmluZF9zZXQoKSByZXBvcnRzIDBcbiYjNDM7ICogZm9yIGJvdGgsIHNvIGFuIHN2Y19yZWdpc3RlcigpIHRoYXQga2VlcHMgdGhlIGxhc3QgcmVzdWx0IHJhdGhlciB0aGFuIHRoZVxuJiM0MzsgKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLlxuJiM0MzsgKi9cbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9yZWdpc3Rlcl9yZWZ1c2VkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4mIzQzO1x0Y2hhciBhdHRyc1s2NF07XG4mIzQzO1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgcnBjYl9zdHViX3Jlc3RhcnQoXHUwMDI2c2VsZi1cdTAwM2VycGNiZCwgUlBDQl9TVFVCX1JFRlVTRSkpO1xuJiM0MztcbiYjNDM7XHRFWFBFQ1RfRVEoLUVBQ0NFUywgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbiYjNDM7XHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gdGhyZWFkcyAvIC1FQlVTWSBzZW1hbnRpY3MgPT09PT09PT09PT09PT09PT09PT09ICovXG4mIzQzO1xuJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fY2hhbmdlKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBvbmVbNjRdLCB0d29bMTI4XTtcbiYjNDM7XHRpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1x0aW50IG8yID0gcHV0X2xpc3RlbmVyKHR3bywgMCwgXCYjMzQ7dGNwXCYjMzQ7LCBURVNUX1BPUlQpO1xuJiM0MztcbiYjNDM7XHRvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCBcJiMzNDt1ZHBcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcdFx0XHQvKiB0aHJlYWRzIG5vdyBydW5uaW5nICovXG4mIzQzO1x0RVhQRUNUX0VRKC1FQlVTWSwgbGlzdGVuZXJfc2V0KHR3bywgbzIpKTtcdC8qIGFkZCByZWZ1c2VkICovXG4mIzQzO1x0dGhyZWFkc19zZXQoMCk7XHRcdFx0XHRcdC8qIHN0b3AgYmVmb3JlIG5ldG5zIGV4aXQgKi9cbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX3JlbW92ZSlcbiYjNDM7e1xuJiM0MztcdGNoYXIgb25lWzY0XTtcbiYjNDM7XHRpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcJiMzNDt0Y3BcJiMzNDssIFRFU1RfUE9SVCk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvMSkpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7XG4mIzQzO1x0RVhQRUNUX0VRKC1FQlVTWSwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcdC8qIHJlbW92ZSByZWZ1c2VkICovXG4mIzQzO1x0dGhyZWFkc19zZXQoMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3Ncbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MDkxYjQ1ZDIyNmJhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL3NldHRpbmdzXG5AQCAtMCwwICYjNDM7MSBAQFxuJiM0Mzt0aW1lb3V0PTEyMFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjM5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtORlNEJiMzNDssCiAgICAmIzM0O05GU0RfVjQmIzM0OywKICAgICYjMzQ7U1VOUlBDJiMzNDssCiAgICAmIzM0O05FVF9OUyYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCYjMzQ7LAogICAgJiMzNDtzdmNfcmVnaXN0ZXImIzM0OywKICAgICYjMzQ7cnBjYl9jcmVhdGVfbG9jYWwmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDYwMWViNzA0OGZkMWNjMzcxOTUxZjU4YWYwMGNjMjUwZjllMmJhYzMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAxMCAyMTozOTozNyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDdlMWQ1YTVkNjUxMWUuLmY3M2EyZWE0MjU1NzEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTk3MywyMSAmIzQzOzE5NzMsMzkgQEAgaW50IG5mc2RfbmxfdmVyc2lvbl9nZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCXJldHVybiBlcnI7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFRyYW5zcG9ydCBjbGFzc2VzIE5GU0Qga25vd3MgaG93IHRvIGluc3RhbnRpYXRlLiBWZXR0aW5nIHRoZSBuYW1lIGhlcmUKJiM0MzsgKiBrZWVwcyBhIGJvZ3VzIHN0cmluZyBmcm9tIHJlYWNoaW5nIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCksIHdoZXJlIGFuCiYjNDM7ICogdW5rbm93biBuYW1lIHRyaWdnZXJzIGEgcmVxdWVzdF9tb2R1bGUoJiMzNDtzdmMlcyYjMzQ7LCBuYW1lKSB1cGNhbGwgdW5kZXIKJiM0MzsgKiBuZnNkX211dGV4LgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdXBwb3J0ZWRbXSA9IHsgJiMzNDt0Y3AmIzM0OywgJiMzNDt1ZHAmIzM0OywgJiMzNDtyZG1hJiMzNDsgfTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKHN1cHBvcnRlZCk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKCFzdHJjbXAobmFtZSwgc3VwcG9ydGVkW2ldKSkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKiBVcHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBhIHNpbmdsZSByZXF1ZXN0IG1heSBjYXJyeS4gKi8KJiM0MzsjZGVmaW5lIE5GU0RfTkxfTElTVEVORVJfTUFYCTEwMjQKJiM0MzsKIC8qKgogICogbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMgLSBzYW5pdHktY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgZnJvbSB1c2VybGFuZAogICogQGluZm86IG5ldGxpbmsgbWV0YWRhdGEgYW5kIGNvbW1hbmQgYXJndW1lbnRzCiAgKgotICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCBlYWNoIGVudHJ5Ci0gKiBpcyB3ZWxsLWZvcm1lZDogaXQgcGFyc2VzIGFnYWluc3QgdGhlIHBvbGljeSwgY2FycmllcyBib3RoIGFuIGFkZHJlc3MgYW5kCi0gKiBhIHRyYW5zcG9ydCBuYW1lLCBhbmQgdGhlIGFkZHJlc3MgaXMgbG9uZyBlbm91Z2ggZm9yIGl0cyBmYW1pbHkuIERvaW5nCi0gKiB0aGlzIHVwIGZyb250IGxldHMgdGhlIGNhbGxlcnMgYmVsb3cgYXNzdW1lIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkIGFuZAotICogZ3VhcmFudGVlcyB3ZSBtYWtlIG5vIGNoYW5nZXMgd2hlbiB0aGUgcmVxdWVzdCBpcyBtYWxmb3JtZWQuCiYjNDM7ICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCB0aGUgbGlzdCBpcwomIzQzOyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC4KICAqCiAgKiBSZXR1cm46IDAgaWYgZXZlcnkgZW50cnkgaXMgdmFsaWQsIG9yIGEgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cjsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAlpbnQgcmVtOwogCiAJbmxtc2dfZm9yX2VhY2hfYXR0cl90eXBlKGF0dHIsIE5GU0RfQV9TRVJWRVJfU09DS19BRERSLCBpbmZvLSZndDtubGhkciwKQEAgLTE5OTYsNiAmIzQzOzIwMTQsMTEgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCQlzdHJ1Y3Qgc29ja2FkZHIgKnNhOwogCQlpbnQgZXJyOwogCiYjNDM7CQlpZiAoJiM0MzsmIzQzO2NvdW50ICZndDsgTkZTRF9OTF9MSVNURU5FUl9NQVgpIHsKJiM0MzsJCQlOTF9TRVRfRVJSX01TRyhpbmZvLSZndDtleHRhY2ssICYjMzQ7dG9vIG1hbnkgbGlzdGVuZXJzJiMzNDspOwomIzQzOwkJCXJldHVybiAtRTJCSUc7CiYjNDM7CQl9CiYjNDM7CiAJCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5GU0RfQV9TT0NLX01BWCwgYXR0ciwKIAkJCQkgICAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby0mZ3Q7ZXh0YWNrKTsKIAkJaWYgKGVyciAmbHQ7IDApCkBAIC0yMDA0LDYgJiM0MzsyMDI3LDkgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCQlpZiAoIXRiW05GU0RfQV9TT0NLX0FERFJdIHx8ICF0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAomIzQzOwkJaWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpCiYjNDM7CQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiYjNDM7CiAJCXNhID0gbmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfQUREUl0pOwogCQlpZiAobmxhX2xlbih0YltORlNEX0FfU09DS19BRERSXSkgJmx0OyBzaXplb2Yoc2EtJmd0O3NhX2ZhbWlseSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIxNTYsOCAmIzQzOzIxODIsMTIgQEAgaW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIAkJcmV0ID0gc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2Eoc2VydiwgeGNsX25hbWUsIG5ldCwgc2EsIDAsCiAJCQkJCSAgICAgIGN1cnJlbnRfY3JlZCgpKTsKIAkJLyogYWx3YXlzIHNhdmUgdGhlIGxhdGVzdCBlcnJvciAqLwotCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWlmIChyZXQgJmx0OyAwKSB7CiYjNDM7CQkJTkxfU0VUX0VSUl9NU0dfRk1UKGluZm8tJmd0O2V4dGFjaywKJiM0MzsJCQkJCSAgICYjMzQ7Y2Fubm90IGNyZWF0ZSAlcyBsaXN0ZW5lcjogJWQmIzM0OywKJiM0MzsJCQkJCSAgIHhjbF9uYW1lLCByZXQpOwogCQkJZXJyID0gcmV0OwomIzQzOwkJfQogCX0KIAogCWlmICghc2Vydi0mZ3Q7c3ZfbnJ0aHJlYWRzICZhbXA7JmFtcDsgbGlzdF9lbXB0eSgmYW1wO25uLSZndDtuZnNkX3NlcnYtJmd0O3N2X3Blcm1zb2NrcykpCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCA2YWEzNzIxODhjODZhLi4wYWEzNzZiODJhNTI2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTIyMSw2ICYjNDM7MjIxLDE2IEBAIHN0YXRpYyB2b2lkIHJwY2Jfc2V0X2xvY2FsKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHJwY19jbG50ICpjbG50LAogIyBkZWZpbmUgU1VOX0xFTihwdHIpIChvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKQkJXAogCQkgICAgICAmIzQzOyAxICYjNDM7IHN0cmxlbigocHRyKS0mZ3Q7c3VuX3BhdGggJiM0MzsgMSkpCiAKJiM0MzsvKgomIzQzOyAqIFRoZSBrZXJuZWwmIzM5O3MgcnBjYmluZCBjbGllbnQgdGFsa3Mgb25seSB0byB0aGUgbG9jYWwgcnBjYmluZCwgb3ZlciBsb29wYmFjawomIzQzOyAqIG9yIGEgbG9jYWwgQUZfTE9DQUwgc29ja2V0LCB3aGVyZSBhIGhlYWx0aHkgcnBjYmluZCBhbnN3ZXJzIGluIG1pY3Jvc2Vjb25kcy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHJwY190aW1lb3V0IHJwY2JfbG9jYWxfdGltZW91dCA9IHsKJiM0MzsJLnRvX2luaXR2YWwJPSAxICogSFosCiYjNDM7CS50b19tYXh2YWwJPSAxICogSFosCiYjNDM7CS50b19yZXRyaWVzCT0gMCwKJiM0Mzt9OwomIzQzOwogLyoKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQogICogaXMgcmV0dXJuZWQuCkBAIC0yMzgsNiAmIzQzOzI0OCw3IEBAIHN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfYWZfbG9jYWwoc3RydWN0IG5ldCAqbmV0LAogCQkudmVyc2lvbgk9IFJQQ0JWRVJTXzIsCiAJCS5hdXRoZmxhdm9yCT0gUlBDX0FVVEhfTlVMTCwKIAkJLmNyZWQJCT0gY3VycmVudF9jcmVkKCksCiYjNDM7CQkudGltZW91dAk9ICZhbXA7cnBjYl9sb2NhbF90aW1lb3V0LAogCQkvKgogCQkgKiBXZSB0dXJuIG9mZiB0aGUgaWRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGtlcm5lbAogCQkgKiBmcm9tIGF1dG9tYXRpY2FsbHkgZGlzY29ubmVjdGluZyB0aGUgc29ja2V0LgpAQCAtMzEyLDYgJiM0MzszMjMsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX25ldChzdHJ1Y3QgbmV0ICpuZXQpCiAJCS52ZXJzaW9uCT0gUlBDQlZFUlNfMiwKIAkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9VTklYLAogCQkuY3JlZAkJPSBjdXJyZW50X2NyZWQoKSwKJiM0MzsJCS50aW1lb3V0CT0gJmFtcDtycGNiX2xvY2FsX3RpbWVvdXQsCiAJCS5mbGFncwkJPSBSUENfQ0xOVF9DUkVBVEVfTk9QSU5HLAogCX07CiAJc3RydWN0IHJwY19jbG50ICpjbG50LCAqY2xudDQ7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCAwNWMzZTZlMmY2NTk0Li5lOWNmY2ViMWEzMzQyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTEyMDgsMTMgJiM0MzsxMjA4LDE2IEBAIGludCBzdmNfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBzdHJ1Y3QgbmV0ICpuZXQsCiAJCXN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZ3AgPSAmYW1wO3NlcnYtJmd0O3N2X3Byb2dyYW1zW3BdOwogCiAJCWZvciAoaSA9IDA7IGkgJmx0OyBwcm9ncC0mZ3Q7cGdfbnZlcnM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaW50IHJldDsKIAotCQkJZXJyb3IgPSBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSwKJiM0MzsJCQlyZXQgPSBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSwKIAkJCQkJZmFtaWx5LCBwcm90bywgcG9ydCk7Ci0JCQlpZiAoZXJyb3IgJmx0OyAwKSB7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICYjMzQ7c3ZjOiBmYWlsZWQgdG8gcmVnaXN0ZXIgJiMzNDsKIAkJCQkJJiMzNDslc3YldSBSUEMgc2VydmljZSAoZXJybm8gJWQpLlxuJiMzNDssCi0JCQkJCXByb2dwLSZndDtwZ19uYW1lLCBpLCAtZXJyb3IpOwomIzQzOwkJCQkJcHJvZ3AtJmd0O3BnX25hbWUsIGksIC1yZXQpOwomIzQzOwkJCQlpZiAoIWVycm9yKQomIzQzOwkJCQkJZXJyb3IgPSByZXQ7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKaW5kZXggODQzNDNmZDFlMzU0Yi4uNDYwNTA4ZGU5Mzc0ZiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKQEAgLTg5LDYgJiM0Mzs4OSw3IEBAIFRBUkdFVFMgJiM0Mzs9IG5ldC9wYWNrZXRkcmlsbAogVEFSR0VUUyAmIzQzOz0gbmV0L3BwcAogVEFSR0VUUyAmIzQzOz0gbmV0L3JkcwogVEFSR0VUUyAmIzQzOz0gbmV0L3RjcF9hbwomIzQzO1RBUkdFVFMgJiM0Mzs9IG5mc2QKIFRBUkdFVFMgJiM0Mzs9IG5vbGliYwogVEFSR0VUUyAmIzQzOz0gcGNpX2VuZHBvaW50CiBUQVJHRVRTICYjNDM7PSBwY2llX2J3Y3RybApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE5ZTZkZWMwNGQ4ZTkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmUKQEAgLTAsMCAmIzQzOzEgQEAKJiM0MztuZnNkX25ldGxpbmtfbGlzdGVuZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1YWM2NTU0OWQyNTkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlCkBAIC0wLDAgJiM0MzsxLDYgQEAKJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7Q0ZMQUdTICYjNDM7PSAkKEtIRFJfSU5DTFVERVMpIC1XYWxsCiYjNDM7CiYjNDM7VEVTVF9HRU5fUFJPR1MgOj0gbmZzZF9uZXRsaW5rX2xpc3RlbmVyCiYjNDM7CiYjNDM7aW5jbHVkZSAuLi9saWIubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uZTY5NDVmZjk1NTFjNAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnCkBAIC0wLDAgJiM0MzsxLDQgQEAKJiM0MztDT05GSUdfTkVUX05TPXkKJiM0MztDT05GSUdfSVBWNj15CiYjNDM7Q09ORklHX05GU0Q9eQomIzQzO0NPTkZJR19ORlNEX1Y0PXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlMzMwNzY4MGQ3ZDQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jCkBAIC0wLDAgJiM0MzsxLDkyMCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBSZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUgTkZTRCBnZW5lcmljLW5ldGxpbmsgbGlzdGVuZXIgaW50ZXJmYWNlCiYjNDM7ICogKE5GU0RfQ01EX0xJU1RFTkVSX1NFVCAvIE5GU0RfQ01EX0xJU1RFTkVSX0dFVCkuCiYjNDM7ICoKJiM0MzsgKiBUaHJlZSBncm91cHM6CiYjNDM7ICogICB2YWxpZGF0aW9uICAtIG1hbGZvcm1lZC9hYnVzaXZlIExJU1RFTkVSX1NFVCByZXF1ZXN0cyBhcmUgcmVqZWN0ZWQgYnkKJiM0MzsgKiAgICAgICAgICAgICAgICAgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwgYmVmb3JlIG5mc2RfbXV0ZXggaXMgdGFrZW4uCiYjNDM7ICogICBmdW5jdGlvbmFsICAtIGNyZWF0ZS9hZGQvcmVtb3ZlIGxpc3RlbmVycyBhbmQgdmVyaWZ5IExJU1RFTkVSX0dFVAomIzQzOyAqICAgICAgICAgICAgICAgICByZWZsZWN0cyB0aGUgc2V0IChyb3VuZC10cmlwIG9mIHRyYW5zcG9ydCAmIzQzOyBhZGRyOnBvcnQpLgomIzQzOyAqICAgc2VtYW50aWNzICAgLSBvbmNlIHRocmVhZHMgYXJlIHJ1bm5pbmcgKFRIUkVBRFNfU0VUKSBhIGxpc3RlbmVyIGNoYW5nZQomIzQzOyAqICAgICAgICAgICAgICAgICBpcyByZWZ1c2VkIHdpdGggLUVCVVNZLgomIzQzOyAqCiYjNDM7ICogRWFjaCB0ZXN0IHJ1bnMgaW4gaXRzIG93biBwcml2YXRlIG5ldCAmIzQzOyBtb3VudCBuYW1lc3BhY2UgKHVuc2hhcmUgaW4KJiM0MzsgKiBGSVhUVVJFX1NFVFVQKS4gL3J1biBpcyBtYXNrZWQgdGhlcmU6IGEgcGF0aG5hbWUgQUZfTE9DQUwgY29ubmVjdCBpcyBub3QKJiM0MzsgKiBzY29wZWQgYnkgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBzaW5jZSB1bml4X2ZpbmRfYnNkKCkgcmVzb2x2ZXMgYnkgaW5vZGUKJiM0MzsgKiBhbmQgdGFrZXMgbm8gc3RydWN0IG5ldCwgc28gdGhlIGtlcm5lbCYjMzk7cyBycGNiaW5kIGNsaWVudCB3b3VsZCBvdGhlcndpc2UgYmUKJiM0MzsgKiBhYmxlIHRvIHJlYWNoIHRoZSBycGNiaW5kIHJ1bm5pbmcgb24gdGhlIGhvc3QuIEFueXRoaW5nIHRoYXQgY3JlYXRlcyBhCiYjNDM7ICogc2VydiBpcyBzZXJ2ZWQgYnkgdGhlIHBlci1uZXRucyBycGNiaW5kIHN0dWIgYmVsb3cgaW5zdGVhZC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2NoZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGRlZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpbnQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21vdW50LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9wcmN0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc29ja2V0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bmV0L2lmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O25ldGluZXQvaW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbmV0bGluay5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9nZW5ldGxpbmsuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0Oy4uL2tzZWxmdGVzdF9oYXJuZXNzLmgmIzM0OwomIzQzOwomIzQzOy8qIE5GU0QgZ2VuZXJpYy1uZXRsaW5rIGNvbnN0YW50cyAoZnJvbSBsaW51eC9uZnNkX25ldGxpbmsuaCkuICovCiYjNDM7I2RlZmluZSBORlNEX0ZBTUlMWV9OQU1FCQkmIzM0O25mc2QmIzM0OwomIzQzOyNkZWZpbmUgTkZTRF9DTURfVEhSRUFEU19TRVQJCTIKJiM0MzsjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX1NFVAkJNgomIzQzOyNkZWZpbmUgTkZTRF9DTURfTElTVEVORVJfR0VUCQk3CiYjNDM7I2RlZmluZSBORlNEX0FfU0VSVkVSX1RIUkVBRFMJCTEKJiM0MzsjZGVmaW5lIE5GU0RfQV9TRVJWRVJfU09DS19BRERSCQkxCS8qIHBlci1saXN0ZW5lciBuZXN0ICovCiYjNDM7I2RlZmluZSBORlNEX0FfU09DS19BRERSCQkxCS8qIGluc2lkZSB0aGUgbmVzdCAqLwomIzQzOyNkZWZpbmUgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUJMgkvKiBpbnNpZGUgdGhlIG5lc3QgKi8KJiM0MzsKJiM0MzsjZGVmaW5lIE5MQV9BTElHTjQobGVuKQkJCSgoKGxlbikgJiM0MzsgMykgJmFtcDsgfjMpCiYjNDM7I2RlZmluZSBURVNUX1BPUlQJCQkyMDA0OQomIzQzOyNkZWZpbmUgTUFYX0xJU1RFTkVSUwkJCTgKJiM0MzsjZGVmaW5lIFJFQ1ZfVElNRU9fU0VDCQkJMzAKJiM0MzsKJiM0MztzdGF0aWMgaW50IG5mc2RfZmFtaWx5OwkJCS8qIHNldCBwZXItdGVzdCBpbiBGSVhUVVJFX1NFVFVQICovCiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKm1zZykKJiM0Mzt7CiYjNDM7CXBlcnJvcihtc2cpOwomIzQzOwlleGl0KDEpOwomIzQzO30KJiM0MzsKJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIG1pbmltYWwgZ2VuZXJpYy1uZXRsaW5rIHBsdW1iaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdlbmxfb3Blbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX25sIHNhID0geyAubmxfZmFtaWx5ID0gQUZfTkVUTElOSyB9OwomIzQzOwlzdHJ1Y3QgdGltZXZhbCB0diA9IHsgLnR2X3NlYyA9IFJFQ1ZfVElNRU9fU0VDIH07CiYjNDM7CWludCBmZCA9IHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19HRU5FUklDKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NvY2tldChORVRMSU5LX0dFTkVSSUMpJiMzNDspOwomIzQzOwlpZiAoYmluZChmZCwgKHZvaWQgKikmYW1wO3NhLCBzaXplb2Yoc2EpKSAmbHQ7IDApCiYjNDM7CQlkaWUoJiMzNDtiaW5kKG5ldGxpbmspJiMzNDspOwomIzQzOwlzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJmFtcDt0diwgc2l6ZW9mKHR2KSk7CiYjNDM7CXJldHVybiBmZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQXBwZW5kIGFuIGF0dHJpYnV0ZSBhdCBAb2ZmOyByZXR1cm4gdGhlIG5ldyAoYWxpZ25lZCkgb2Zmc2V0LiAqLwomIzQzO3N0YXRpYyBpbnQgcHV0X2F0dHIoY2hhciAqYnVmLCBpbnQgb2ZmLCB1aW50MTZfdCB0eXBlLAomIzQzOwkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbmxhdHRyICpuYSA9ICh2b2lkICopKGJ1ZiAmIzQzOyBvZmYpOwomIzQzOwomIzQzOwluYS0mZ3Q7bmxhX3R5cGUgPSB0eXBlOwomIzQzOwluYS0mZ3Q7bmxhX2xlbiA9IE5MQV9IRFJMRU4gJiM0MzsgbGVuOwomIzQzOwlpZiAobGVuKQomIzQzOwkJbWVtY3B5KGJ1ZiAmIzQzOyBvZmYgJiM0MzsgTkxBX0hEUkxFTiwgZGF0YSwgbGVuKTsKJiM0MzsJcmV0dXJuIG9mZiAmIzQzOyBOTEFfQUxJR040KE5MQV9IRFJMRU4gJiM0MzsgbGVuKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQnVpbGQgYSBnZW5sIG1lc3NhZ2UgaGVhZGVyIGludG8gQGJ1ZjsgcmV0dXJuIHRoZSBvZmZzZXQgcGFzdCBpdC4gKi8KJiM0MztzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKQomIzQzO3sKJiM0MzsJc3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjsKJiM0MzsJc3RydWN0IGdlbmxtc2doZHIgKmdubCA9ICh2b2lkICopKGJ1ZiAmIzQzOyBOTE1TR19IRFJMRU4pOwomIzQzOwomIzQzOwltZW1zZXQoYnVmLCAwLCBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU4pOwomIzQzOwlubGgtJmd0O25sbXNnX3R5cGUgPSB0eXBlOwomIzQzOwlubGgtJmd0O25sbXNnX2ZsYWdzID0gZmxhZ3M7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfc2VxID0gMTsKJiM0MzsJZ25sLSZndDtjbWQgPSBjbWQ7CiYjNDM7CWdubC0mZ3Q7dmVyc2lvbiA9IDE7CiYjNDM7CXJldHVybiBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU47CiYjNDM7fQomIzQzOwomIzQzOy8qIFNlbmQgYW4gbmZzZCBjb21tYW5kIHdpdGggYW4gQUNLOyByZXR1cm4gdGhlIEFDSyBlcnJubyAoJmx0Oz0gMCkuICovCiYjNDM7c3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKQomIzQzO3sKJiM0MzsJY2hhciBidWZbMSAmbHQ7Jmx0OyAyMF0sIHJidWZbNDA5Nl07CiYjNDM7CXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7CiYjNDM7CWludCBmZCA9IGdlbmxfb3BlbigpOwomIzQzOwlpbnQgb2ZmLCBuLCByZXQ7CiYjNDM7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0ssIGNtZCk7CiYjNDM7CWlmIChhdHRyc19sZW4pIHsKJiM0MzsJCW1lbWNweShidWYgJiM0Mzsgb2ZmLCBhdHRycywgYXR0cnNfbGVuKTsKJiM0MzsJCW9mZiAmIzQzOz0gYXR0cnNfbGVuOwomIzQzOwl9CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoZ2VubCkmIzM0Oyk7CiYjNDM7CiYjNDM7CW4gPSByZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApOwomIzQzOwlpZiAobiAmbHQ7IDApCiYjNDM7CQlyZXQgPSAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSA/IC1FVElNRURPVVQgOiAtZXJybm87CiYjNDM7CWVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktJmd0O25sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpCiYjNDM7CQlyZXQgPSAoKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEocmJ1ZikpLSZndDtlcnJvcjsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gMDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKiBTZW5kIGEgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBmdWxsIHJlcGx5IG1lc3NhZ2U7IC1lcnJubyBvbiBmYWlsdXJlLiAqLwomIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXF1ZXN0X3JlcGx5KHVpbnQ4X3QgY21kLCBjaGFyICpyYnVmLCBzaXplX3QgcmxlbikKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzI1Nl07CiYjNDM7CXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7CiYjNDM7CWludCBmZCA9IGdlbmxfb3BlbigpOwomIzQzOwlpbnQgb2ZmLCBuLCByZXQ7CiYjNDM7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QsIGNtZCk7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoZ2VubCByZXBseSkmIzM0Oyk7CiYjNDM7CiYjNDM7CW4gPSByZWN2KGZkLCByYnVmLCBybGVuLCAwKTsKJiM0MzsJaWYgKG4gJmx0OyAwKQomIzQzOwkJcmV0ID0gKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgPyAtRVRJTUVET1VUIDogLWVycm5vOwomIzQzOwllbHNlIGlmICgoKHN0cnVjdCBubG1zZ2hkciAqKXJidWYpLSZndDtubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKQomIzQzOwkJcmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS0mZ3Q7ZXJyb3I7CiYjNDM7CWVsc2UKJiM0MzsJCXJldCA9IG47CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVzb2x2ZSB0aGUgJiMzNDtuZnNkJiMzNDsgZ2VubCBmYW1pbHkgaWQ7IC0xIGlmIG5vdCByZWdpc3RlcmVkLiAqLwomIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXNvbHZlX25mc2Qodm9pZCkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzEwMjRdLCByYnVmWzQwOTZdOwomIzQzOwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmOwomIzQzOwlzdHJ1Y3Qgbmxtc2doZHIgKnJoID0gKHZvaWQgKilyYnVmOwomIzQzOwlzdHJ1Y3QgbmxhdHRyICpuYTsKJiM0MzsJaW50IGZkLCBvZmYsIGxlZnQsIGlkID0gLTE7CiYjNDM7CiYjNDM7CWZkID0gZ2VubF9vcGVuKCk7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgR0VOTF9JRF9DVFJMLCBOTE1fRl9SRVFVRVNULCBDVFJMX0NNRF9HRVRGQU1JTFkpOwomIzQzOwlvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLAomIzQzOwkJICAgICAgIE5GU0RfRkFNSUxZX05BTUUsIHNpemVvZihORlNEX0ZBTUlMWV9OQU1FKSk7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoR0VURkFNSUxZKSYjMzQ7KTsKJiM0MzsJaWYgKHJlY3YoZmQsIHJidWYsIHNpemVvZihyYnVmKSwgMCkgJmx0OyAwKQomIzQzOwkJZGllKCYjMzQ7cmVjdihHRVRGQU1JTFkpJiMzNDspOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWlmIChyaC0mZ3Q7bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJbmEgPSAodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEocmgpICYjNDM7IEdFTkxfSERSTEVOKTsKJiM0MzsJbGVmdCA9IHJoLSZndDtubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjsKJiM0MzsJd2hpbGUgKGxlZnQgJmd0Oz0gKGludClOTEFfSERSTEVOKSB7CiYjNDM7CQlpZiAobmEtJmd0O25sYV90eXBlID09IENUUkxfQVRUUl9GQU1JTFlfSUQpIHsKJiM0MzsJCQlpZCA9ICoodWludDE2X3QgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfSERSTEVOKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWxlZnQgLT0gTkxBX0FMSUdONChuYS0mZ3Q7bmxhX2xlbik7CiYjNDM7CQluYSA9ICh2b2lkICopKChjaGFyICopbmEgJiM0MzsgTkxBX0FMSUdONChuYS0mZ3Q7bmxhX2xlbikpOwomIzQzOwl9CiYjNDM7CXJldHVybiBpZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBsaXN0ZW5lciByZXF1ZXN0IGJ1aWxkZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MzsvKiBGaW5lLWdyYWluZWQgY29udHJvbCBmb3IgbmVnYXRpdmUgdGVzdHM6IGFueSBmaWVsZCBjYW4gYmUgb21pdHRlZC9tYWxmb3JtZWQuICovCiYjNDM7c3RydWN0IHJhd19saXN0ZW5lciB7CiYjNDM7CWNvbnN0IGNoYXIgKnhwcnQ7CS8qIE5VTEwgLSZndDsgb21pdCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSAqLwomIzQzOwlpbnQgZW1pdF9hZGRyOwkJLyogMCAtJmd0OyBvbWl0IE5GU0RfQV9TT0NLX0FERFIgKi8KJiM0MzsJY29uc3Qgdm9pZCAqYWRkcjsKJiM0MzsJaW50IGFkZHJfbGVuOwkJLyogYnl0ZXMgdG8gZW1pdCBmb3IgTkZTRF9BX1NPQ0tfQUREUiAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBwdXRfcmF3X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3Qgc3RydWN0IHJhd19saXN0ZW5lciAqcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBubGF0dHIgKm5lc3QgPSAodm9pZCAqKShidWYgJiM0Mzsgb2ZmKTsKJiM0MzsJaW50IGlubmVyID0gb2ZmICYjNDM7IE5MQV9IRFJMRU47CiYjNDM7CiYjNDM7CWlmIChyLSZndDtlbWl0X2FkZHIpCiYjNDM7CQlpbm5lciA9IHB1dF9hdHRyKGJ1ZiwgaW5uZXIsIE5GU0RfQV9TT0NLX0FERFIsIHItJmd0O2FkZHIsIHItJmd0O2FkZHJfbGVuKTsKJiM0MzsJaWYgKHItJmd0O3hwcnQpCiYjNDM7CQlpbm5lciA9IHB1dF9hdHRyKGJ1ZiwgaW5uZXIsIE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FLAomIzQzOwkJCQkgci0mZ3Q7eHBydCwgc3RybGVuKHItJmd0O3hwcnQpICYjNDM7IDEpOwomIzQzOwluZXN0LSZndDtubGFfdHlwZSA9IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIHwgTkxBX0ZfTkVTVEVEOwomIzQzOwluZXN0LSZndDtubGFfbGVuID0gaW5uZXIgLSBvZmY7CiYjNDM7CXJldHVybiBvZmYgJiM0MzsgTkxBX0FMSUdONChuZXN0LSZndDtubGFfbGVuKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogV2VsbC1mb3JtZWQgbG9vcGJhY2sgbGlzdGVuZXIgZm9yIEBmYW1pbHkgKEFGX0lORVQgb3IgQUZfSU5FVDYpLiAqLwomIzQzO3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyX2FmKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSwKJiM0MzsJCQkgICB1aW50MTZfdCBwb3J0KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7MH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSB4cHJ0LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3NzIH07CiYjNDM7CiYjNDM7CWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnM2ID0gKHZvaWQgKikmYW1wO3NzOwomIzQzOwomIzQzOwkJczYtJmd0O3NpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiYjNDM7CQlzNi0mZ3Q7c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7CiYjNDM7CQlzNi0mZ3Q7c2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKJiM0MzsJCXIuYWRkcl9sZW4gPSBzaXplb2YoKnM2KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbiAqczQgPSAodm9pZCAqKSZhbXA7c3M7CiYjNDM7CiYjNDM7CQlzNC0mZ3Q7c2luX2ZhbWlseSA9IEFGX0lORVQ7CiYjNDM7CQlzNC0mZ3Q7c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKJiM0MzsJCXM0LSZndDtzaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOwomIzQzOwkJci5hZGRyX2xlbiA9IHNpemVvZigqczQpOwomIzQzOwl9CiYjNDM7CXJldHVybiBwdXRfcmF3X2xpc3RlbmVyKGJ1Ziwgb2ZmLCAmYW1wO3IpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHB1dF9saXN0ZW5lcihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IGNoYXIgKnhwcnQsIHVpbnQxNl90IHBvcnQpCiYjNDM7ewomIzQzOwlyZXR1cm4gcHV0X2xpc3RlbmVyX2FmKGJ1Ziwgb2ZmLCB4cHJ0LCBBRl9JTkVULCBwb3J0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBMSVNURU5FUl9HRVQgcGFyc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7c3RydWN0IGxpc3RlbmVyX2VudCB7CiYjNDM7CWNoYXIgeHBydFsxNl07CiYjNDM7CWludCBmYW1pbHk7CiYjNDM7CXVpbnQxNl90IHBvcnQ7CiYjNDM7CXN0cnVjdCBpbl9hZGRyIGE0OwomIzQzOwlzdHJ1Y3QgaW42X2FkZHIgYTY7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHBhcnNlX2xpc3RlbmVyX2dldChjb25zdCBjaGFyICpyYnVmLCBpbnQgbGVuLAomIzQzOwkJCSAgICAgIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKm91dCwgaW50IG1heCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHZvaWQgKilyYnVmOwomIzQzOwljb25zdCBzdHJ1Y3QgbmxhdHRyICpuYTsKJiM0MzsJaW50IGxlZnQsIGNvdW50ID0gMDsKJiM0MzsKJiM0MzsJKHZvaWQpbGVuOwomIzQzOwluYSA9IChjb25zdCB2b2lkICopKHJidWYgJiM0MzsgTkxNU0dfSERSTEVOICYjNDM7IEdFTkxfSERSTEVOKTsKJiM0MzsJbGVmdCA9IG5saC0mZ3Q7bmxtc2dfbGVuIC0gTkxNU0dfSERSTEVOIC0gR0VOTF9IRFJMRU47CiYjNDM7CiYjNDM7CXdoaWxlIChsZWZ0ICZndDs9IChpbnQpTkxBX0hEUkxFTikgewomIzQzOwkJaW50IGFsZW4gPSBuYS0mZ3Q7bmxhX2xlbjsKJiM0MzsKJiM0MzsJCWlmICgobmEtJmd0O25sYV90eXBlICZhbXA7IE5MQV9UWVBFX01BU0spID09IE5GU0RfQV9TRVJWRVJfU09DS19BRERSICZhbXA7JmFtcDsKJiM0MzsJCSAgICBjb3VudCAmbHQ7IG1heCkgewomIzQzOwkJCWNvbnN0IHN0cnVjdCBubGF0dHIgKmluID0gKGNvbnN0IHZvaWQgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfSERSTEVOKTsKJiM0MzsJCQlpbnQgaWxlZnQgPSBhbGVuIC0gTkxBX0hEUkxFTjsKJiM0MzsJCQlzdHJ1Y3QgbGlzdGVuZXJfZW50ICplID0gJmFtcDtvdXRbY291bnRdOwomIzQzOwomIzQzOwkJCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKJiM0MzsJCQl3aGlsZSAoaWxlZnQgJmd0Oz0gKGludClOTEFfSERSTEVOKSB7CiYjNDM7CQkJCWNvbnN0IHZvaWQgKmQgPSAoY29uc3QgY2hhciAqKWluICYjNDM7IE5MQV9IRFJMRU47CiYjNDM7CQkJCWludCB0ID0gaW4tJmd0O25sYV90eXBlICZhbXA7IE5MQV9UWVBFX01BU0s7CiYjNDM7CiYjNDM7CQkJCWlmICh0ID09IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FKSB7CiYjNDM7CQkJCQlzdHJuY3B5KGUtJmd0O3hwcnQsIGQsIHNpemVvZihlLSZndDt4cHJ0KSAtIDEpOwomIzQzOwkJCQl9IGVsc2UgaWYgKHQgPT0gTkZTRF9BX1NPQ0tfQUREUikgewomIzQzOwkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzID0gZDsKJiM0MzsKJiM0MzsJCQkJCWUtJmd0O2ZhbWlseSA9IHNzLSZndDtzc19mYW1pbHk7CiYjNDM7CQkJCQlpZiAoc3MtJmd0O3NzX2ZhbWlseSA9PSBBRl9JTkVUKSB7CiYjNDM7CQkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzID0gZDsKJiM0MzsKJiM0MzsJCQkJCQllLSZndDthNCA9IHMtJmd0O3Npbl9hZGRyOwomIzQzOwkJCQkJCWUtJmd0O3BvcnQgPSBudG9ocyhzLSZndDtzaW5fcG9ydCk7CiYjNDM7CQkJCQl9IGVsc2UgaWYgKHNzLSZndDtzc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKJiM0MzsJCQkJCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzID0gZDsKJiM0MzsKJiM0MzsJCQkJCQllLSZndDthNiA9IHMtJmd0O3NpbjZfYWRkcjsKJiM0MzsJCQkJCQllLSZndDtwb3J0ID0gbnRvaHMocy0mZ3Q7c2luNl9wb3J0KTsKJiM0MzsJCQkJCX0KJiM0MzsJCQkJfQomIzQzOwkJCQlpbGVmdCAtPSBOTEFfQUxJR040KGluLSZndDtubGFfbGVuKTsKJiM0MzsJCQkJaW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKWluICYjNDM7IE5MQV9BTElHTjQoaW4tJmd0O25sYV9sZW4pKTsKJiM0MzsJCQl9CiYjNDM7CQkJY291bnQmIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJbGVmdCAtPSBOTEFfQUxJR040KGFsZW4pOwomIzQzOwkJbmEgPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICYjNDM7IE5MQV9BTElHTjQoYWxlbikpOwomIzQzOwl9CiYjNDM7CXJldHVybiBjb3VudDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZW5pZW5jZSB3cmFwcGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7c3RhdGljIGludCBsaXN0ZW5lcl9zZXQoY29uc3QgY2hhciAqYXR0cnMsIGludCBsZW4pCiYjNDM7ewomIzQzOwlyZXR1cm4gZ2VubF9yZXF1ZXN0KE5GU0RfQ01EX0xJU1RFTkVSX1NFVCwgYXR0cnMsIGxlbik7CiYjNDM7fQomIzQzOwomIzQzOy8qIEZldGNoIHRoZSBjdXJyZW50IGxpc3RlbmVyczsgcmV0dXJucyBjb3VudCAoJmd0Oz0wKSBvciAtZXJybm8uICovCiYjNDM7c3RhdGljIGludCBsaXN0ZW5lcl9nZXQoc3RydWN0IGxpc3RlbmVyX2VudCAqb3V0LCBpbnQgbWF4KQomIzQzO3sKJiM0MzsJY2hhciByYnVmWzgxOTJdOwomIzQzOwlpbnQgbiA9IGdlbmxfcmVxdWVzdF9yZXBseShORlNEX0NNRF9MSVNURU5FUl9HRVQsIHJidWYsIHNpemVvZihyYnVmKSk7CiYjNDM7CiYjNDM7CWlmIChuICZsdDsgMCkKJiM0MzsJCXJldHVybiBuOwomIzQzOwlyZXR1cm4gcGFyc2VfbGlzdGVuZXJfZ2V0KHJidWYsIG4sIG91dCwgbWF4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmZpbmRfbGlzdGVuZXIoc3RydWN0IGxpc3RlbmVyX2VudCAqZSwgaW50IG4sCiYjNDM7CQkJCQkgIGNvbnN0IGNoYXIgKnhwcnQsIGludCBmYW1pbHksCiYjNDM7CQkJCQkgIHVpbnQxNl90IHBvcnQpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKGVbaV0uZmFtaWx5ID09IGZhbWlseSAmYW1wOyZhbXA7IGVbaV0ucG9ydCA9PSBwb3J0ICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc3RyY21wKGVbaV0ueHBydCwgeHBydCkpCiYjNDM7CQkJcmV0dXJuICZhbXA7ZVtpXTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIFN0YXJ0IChAbiAmZ3Q7IDApIG9yIHN0b3AgKEBuID09IDApIG5mc2QgdGhyZWFkcyBpbiB0aGlzIG5ldG5zLiAqLwomIzQzO3N0YXRpYyBpbnQgdGhyZWFkc19zZXQoaW50IG4pCiYjNDM7ewomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJdWludDMyX3QgdiA9IG47CiYjNDM7CWludCBvZmYgPSBwdXRfYXR0cihhdHRycywgMCwgTkZTRF9BX1NFUlZFUl9USFJFQURTLCAmYW1wO3YsIHNpemVvZih2KSk7CiYjNDM7CiYjNDM7CXJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfVEhSRUFEU19TRVQsIGF0dHJzLCBvZmYpOwomIzQzO30KJiM0MzsKJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIHBlci1uZXRucyBsb2NhbCBycGNiaW5kIHN0dWIgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogQ3JlYXRpbmcgYSBsaXN0ZW5lciByZWdpc3RlcnMgd2l0aCBycGNiaW5kOiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpCiYjNDM7ICogcGFzc2VzIGZsYWdzIG9mIDAsIHNvIHBtYXBfcmVnaXN0ZXIgaXMgdHJ1ZSBpbiBzdmNfc2V0dXBfc29ja2V0KCksIGFuZAomIzQzOyAqIG5mc2RfdmVyc2lvbjMgaXMgcmVnaXN0ZXJhYmxlIGJ5IGRlZmF1bHQgYW5kIGRvZXMgbm90IHNldCB2c19ycGNiX29wdG5sLAomIzQzOyAqIHNvIGEgcmVnaXN0cmF0aW9uIGZhaWx1cmUgYWJvcnRzIGxpc3RlbmVyIGNyZWF0aW9uLiBUaGUgYWJzdHJhY3QgQUZfTE9DQUwKJiM0MzsgKiBuYW1lIHRoZSBrZXJuZWwgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zICh1bml4X2ZpbmRfYWJzdHJhY3QoKSB0YWtlcyBhCiYjNDM7ICogc3RydWN0IG5ldCksIHNvIGFuc3dlciBpdCBoZXJlIGFuZCBzdGF5IG91dCBvZiB0aGUgaG9zdCYjMzk7cyBycGNiaW5kLgomIzQzOyAqCiYjNDM7ICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZAomIzQzOyAqIFNFVC9VTlNFVCBnZXQgVFJVRSwgZm9yIGJvdGggUlBDQlZFUlNfMiBhbmQgUlBDQlZFUlNfNC4gdjQgaGFzIHRvIGJlCiYjNDM7ICogYW5zd2VyZWQgYmVjYXVzZSBfX3N2Y19ycGNiX3JlZ2lzdGVyNigpIHR1cm5zIGEgdjQgcmVmdXNhbCBpbnRvCiYjNDM7ICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLgomIzQzOyAqCiYjNDM7ICogSW4gUlBDQl9TVFVCX1JFRlVTRSBtb2RlIFNFVCBpcyBhbnN3ZXJlZCBGQUxTRSBpbnN0ZWFkLCB3aGljaAomIzQzOyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seQomIzQzOyAqIHN2Y191bnJlZ2lzdGVyKCkgaXNzdWVzIGl0LCBhbmQgaXQgZGlzY2FyZHMgdGhlIHJlc3VsdC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJQQ0JfUFJPR1JBTQkJMTAwMDAwCiYjNDM7I2RlZmluZSBSUENCX1BST0NfTlVMTAkJMAomIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1NFVAkJMQomIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUCQkyCiYjNDM7I2RlZmluZSBSUENCX0FCU1RSQUNUX05BTUUJJiMzNDsvcnVuL3JwY2JpbmQuc29jayYjMzQ7CiYjNDM7I2RlZmluZSBSUENCX1NUVUJfTUFYQ09OTgk0CiYjNDM7CiYjNDM7ZW51bSB7IFJQQ0JfU1RVQl9BQ0NFUFQsIFJQQ0JfU1RVQl9SRUZVU0UgfTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9saXN0ZW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl91biBzdW4gPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9OwomIzQzOwlzaXplX3QgbmxlbiA9IHN0cmxlbihSUENCX0FCU1RSQUNUX05BTUUpOwomIzQzOwlzb2NrbGVuX3QgYWxlbjsKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwkvKiBBYnN0cmFjdCBuYW1lcyBhcmUgbGVuZ3RoLWRlbGltaXRlZCwgc28gdGhlIGxlbmd0aCBtdXN0IG1hdGNoLiAqLwomIzQzOwltZW1jcHkoc3VuLnN1bl9wYXRoICYjNDM7IDEsIFJQQ0JfQUJTVFJBQ1RfTkFNRSwgbmxlbik7CiYjNDM7CWFsZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSAmIzQzOyAxICYjNDM7IG5sZW47CiYjNDM7CiYjNDM7CWZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYW1wO3N1biwgYWxlbikgJmx0OyAwIHx8CiYjNDM7CSAgICBsaXN0ZW4oZmQsIFJQQ0JfU1RVQl9NQVhDT05OKSAmbHQ7IDApIHsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCiYjNDM7ewomIzQzOwlzaXplX3QgZG9uZSA9IDA7CiYjNDM7CiYjNDM7CXdoaWxlIChkb25lICZsdDsgbGVuKSB7CiYjNDM7CQlzc2l6ZV90IG4gPSByZWFkKGZkLCAoY2hhciAqKWJ1ZiAmIzQzOyBkb25lLCBsZW4gLSBkb25lKTsKJiM0MzsKJiM0MzsJCWlmIChuICZsdDs9IDApCiYjNDM7CQkJcmV0dXJuIC0xOwomIzQzOwkJZG9uZSAmIzQzOz0gbjsKJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogSGFuZGxlIG9uZSByZWNvcmQtbWFya2VkIFJQQyBjYWxsLiBSZXR1cm5zIC0xIHdoZW4gdGhlIHBlZXIgaXMgZG9uZS4gKi8KJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9jYWxsKGludCBmZCwgaW50IG1vZGUpCiYjNDM7ewomIzQzOwl1aW50MzJfdCBtYXJrLCBjYWxsWzZdLCByZXBbN107CiYjNDM7CXVuc2lnbmVkIGludCBsZW4sIG5yZXAgPSA2OwomIzQzOwlzaXplX3QgcmVwbGVuOwomIzQzOwomIzQzOwlpZiAocnBjYl9zdHViX3JlYWQoZmQsICZhbXA7bWFyaywgc2l6ZW9mKG1hcmspKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbGVuID0gbnRvaGwobWFyaykgJmFtcDsgMHg3ZmZmZmZmZjsKJiM0MzsJaWYgKGxlbiAmbHQ7IHNpemVvZihjYWxsKSB8fCBsZW4gJmd0OyA0MDk2KQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CS8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqLwomIzQzOwlmb3IgKGxlbiAtPSBzaXplb2YoY2FsbCk7IGxlbjsgKSB7CiYjNDM7CQljaGFyIHNpbmtbMjU2XTsKJiM0MzsJCXVuc2lnbmVkIGludCBuID0gbGVuICZndDsgc2l6ZW9mKHNpbmspID8gc2l6ZW9mKHNpbmspIDogbGVuOwomIzQzOwomIzQzOwkJaWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBzaW5rLCBuKSkKJiM0MzsJCQlyZXR1cm4gLTE7CiYjNDM7CQlsZW4gLT0gbjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXBbMF0gPSBjYWxsWzBdOwkJLyogeGlkICovCiYjNDM7CXJlcFsxXSA9IGh0b25sKDEpOwkJLyogUkVQTFkgKi8KJiM0MzsJcmVwWzJdID0gaHRvbmwoMCk7CQkvKiBNU0dfQUNDRVBURUQgKi8KJiM0MzsJcmVwWzNdID0gaHRvbmwoMCk7CQkvKiB2ZXJpZmllciBmbGF2b3IgQVVUSF9OVUxMICovCiYjNDM7CXJlcFs0XSA9IGh0b25sKDApOwkJLyogdmVyaWZpZXIgbGVuZ3RoICovCiYjNDM7CXJlcFs1XSA9IGh0b25sKDApOwkJLyogU1VDQ0VTUyAqLwomIzQzOwomIzQzOwlpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7CiYjNDM7CQlyZXBbNV0gPSBodG9ubCgxKTsJLyogUFJPR19VTkFWQUlMICovCiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7CiYjNDM7CQljYXNlIFJQQ0JfUFJPQ19OVUxMOgomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSUENCX1BST0NfU0VUOgomIzQzOwkJCXJlcFs2XSA9IGh0b25sKG1vZGUgPT0gUlBDQl9TVFVCX1JFRlVTRSA/IDAgOiAxKTsKJiM0MzsJCQlucmVwID0gNzsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgUlBDQl9QUk9DX1VOU0VUOgomIzQzOwkJCXJlcFs2XSA9IGh0b25sKDEpOwkvKiBUUlVFICovCiYjNDM7CQkJbnJlcCA9IDc7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXJlcFs1XSA9IGh0b25sKDMpOwkvKiBQUk9DX1VOQVZBSUwgKi8KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXBsZW4gPSBucmVwICogc2l6ZW9mKHJlcFswXSk7CiYjNDM7CW1hcmsgPSBodG9ubCgweDgwMDAwMDAwIHwgcmVwbGVuKTsKJiM0MzsJaWYgKHdyaXRlKGZkLCAmYW1wO21hcmssIHNpemVvZihtYXJrKSkgIT0gKHNzaXplX3Qpc2l6ZW9mKG1hcmspIHx8CiYjNDM7CSAgICB3cml0ZShmZCwgcmVwLCByZXBsZW4pICE9IChzc2l6ZV90KXJlcGxlbikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkWzEgJiM0MzsgUlBDQl9TVFVCX01BWENPTk5dOwomIzQzOwluZmRzX3QgbiA9IDEsIGk7CiYjNDM7CiYjNDM7CXBmZFswXS5mZCA9IGxmZDsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJLyogc3RvcCBwb2xsaW5nIHRoZSBsaXN0ZW5lciB3aGVuIGZ1bGwsIG9yIHBvbGwoKSBzcGlucyAqLwomIzQzOwkJcGZkWzBdLmV2ZW50cyA9IG4gJmx0OyAxICYjNDM7IFJQQ0JfU1RVQl9NQVhDT05OID8gUE9MTElOIDogMDsKJiM0MzsKJiM0MzsJCWlmIChwb2xsKHBmZCwgbiwgLTEpICZsdDsgMCkKJiM0MzsJCQlyZXR1cm47CiYjNDM7CiYjNDM7CQlpZiAocGZkWzBdLnJldmVudHMgJmFtcDsgUE9MTElOKSB7CiYjNDM7CQkJaW50IGMgPSBhY2NlcHQobGZkLCBOVUxMLCBOVUxMKTsKJiM0MzsKJiM0MzsJCQlpZiAoYyAmZ3Q7PSAwKSB7CiYjNDM7CQkJCXBmZFtuXS5mZCA9IGM7CiYjNDM7CQkJCXBmZFtuXS5ldmVudHMgPSBQT0xMSU47CiYjNDM7CQkJCW4mIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZvciAoaSA9IDE7IGkgJmx0OyBuOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICghKHBmZFtpXS5yZXZlbnRzICZhbXA7IChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikpKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlpZiAocnBjYl9zdHViX2NhbGwocGZkW2ldLmZkLCBtb2RlKSkgewomIzQzOwkJCQljbG9zZShwZmRbaV0uZmQpOwomIzQzOwkJCQlwZmRbaV0gPSBwZmRbLS1uXTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmV0dXJucyB0aGUgc3R1YiYjMzk7cyBwaWQsIG9yIC0xLiBUaGUgc29ja2V0IGlzIGxpc3RlbmluZyBiZWZvcmUgd2UgZm9yay4gKi8KJiM0MztzdGF0aWMgcGlkX3QgcnBjYl9zdHViX3N0YXJ0KGludCBtb2RlKQomIzQzO3sKJiM0MzsJaW50IGxmZCA9IHJwY2Jfc3R1Yl9saXN0ZW4oKTsKJiM0MzsJcGlkX3QgcGlkOwomIzQzOwomIzQzOwlpZiAobGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlpZiAocGlkICZsdDsgMCkgewomIzQzOwkJY2xvc2UobGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZiAocGlkID09IDApIHsKJiM0MzsJCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKJiM0MzsJCXByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpOwomIzQzOwkJaWYgKGdldHBwaWQoKSA9PSAxKQkJLyogcmFjZWQgd2l0aCBwYXJlbnQgZXhpdCAqLwomIzQzOwkJCV9leGl0KDApOwomIzQzOwkJcnBjYl9zdHViX3NlcnZlKGxmZCwgbW9kZSk7CiYjNDM7CQlfZXhpdCgwKTsKJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZShsZmQpOwomIzQzOwlyZXR1cm4gcGlkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN3YXAgdGhlIHN0dWIgZm9yIG9uZSBpbiBAbW9kZS4gU2FmZSBiZWZvcmUgdGhlIGZpcnN0IHJlcXVlc3Q6IG5vIHNlcnYKJiM0MzsgKiBleGlzdHMgeWV0LCBzbyB0aGUga2VybmVsIGhhcyBub3QgY29ubmVjdGVkIGFuZCB0aGUgYWJzdHJhY3QgbmFtZSBpcyBmcmVlCiYjNDM7ICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3Jlc3RhcnQocGlkX3QgKnBpZCwgaW50IG1vZGUpCiYjNDM7ewomIzQzOwlpZiAoKnBpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoKnBpZCwgU0lHS0lMTCk7CiYjNDM7CQl3YWl0cGlkKCpwaWQsIE5VTEwsIDApOwomIzQzOwl9CiYjNDM7CSpwaWQgPSBycGNiX3N0dWJfc3RhcnQobW9kZSk7CiYjNDM7CXJldHVybiAqcGlkICZndDsgMCA/IDAgOiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7RklYVFVSRShuZnNkX2xpc3RlbmVyKSB7CiYjNDM7CXBpZF90IHJwY2JkOwomIzQzO307CiYjNDM7CiYjNDM7RklYVFVSRV9TRVRVUChuZnNkX2xpc3RlbmVyKQomIzQzO3sKJiM0MzsJc3RydWN0IGlmcmVxIGlmciA9IHswfTsKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBzOwomIzQzOwomIzQzOwlpZiAoZ2V0ZXVpZCgpICE9IDApCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDttdXN0IGJlIHJ1biBhcyByb290JiMzNDspOwomIzQzOwlpZiAodW5zaGFyZShDTE9ORV9ORVdORVQgfCBDTE9ORV9ORVdOUykgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7dW5zaGFyZShORVdORVR8TkVXTlMpOiAlcyYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwlpZiAobW91bnQoJiMzNDsmIzM0OywgJiMzNDsvJiMzNDssIE5VTEwsIE1TX1JFQyB8IE1TX1BSSVZBVEUsIE5VTEwpICZsdDsgMCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O21vdW50KC8gcHJpdmF0ZSk6ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEtlZXAgdGhlIGtlcm5lbCYjMzk7cyBycGNiaW5kIGNsaWVudCBpbnNpZGUgdGhpcyBuYW1lc3BhY2UuIFRoZQomIzQzOwkgKiBhYnN0cmFjdCBzb2NrZXQgaXQgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zLCBidXQgdGhlCiYjNDM7CSAqICYjMzQ7L3Zhci9ydW4vcnBjYmluZC5zb2NrJiMzNDsgZmFsbGJhY2sgaXMgbm90LCBzbyBoaWRlIHRoZSBwYXRoLgomIzQzOwkgKi8KJiM0MzsJaWYgKG1vdW50KCYjMzQ7dG1wZnMmIzM0OywgJiMzNDsvcnVuJiMzNDssICYjMzQ7dG1wZnMmIzM0OywgMCwgTlVMTCkgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bW91bnQodG1wZnMgb24gL3J1bik6ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CWlmIChsc3RhdCgmIzM0Oy92YXIvcnVuJiMzNDssICZhbXA7c3QpID09IDAgJmFtcDsmYW1wOyBTX0lTRElSKHN0LnN0X21vZGUpICZhbXA7JmFtcDsKJiM0MzsJICAgIG1vdW50KCYjMzQ7dG1wZnMmIzM0OywgJiMzNDsvdmFyL3J1biYjMzQ7LCAmIzM0O3RtcGZzJiMzNDssIDAsIE5VTEwpICZsdDsgMCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O21vdW50KHRtcGZzIG9uIC92YXIvcnVuKTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsKJiM0MzsJLyogQnJpbmcgbG9vcGJhY2sgdXAgc28gbGlzdGVuZXIgYmluZHMgKDEyNy4wLjAuMSAvIDo6MSkgd29yay4gKi8KJiM0MzsJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKJiM0MzsJQVNTRVJUX0dFKHMsIDApOwomIzQzOwlzdHJjcHkoaWZyLmlmcl9uYW1lLCAmIzM0O2xvJiMzNDspOwomIzQzOwlBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ0dJRkZMQUdTLCAmYW1wO2lmcikpOwomIzQzOwlpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUCB8IElGRl9SVU5OSU5HOwomIzQzOwlBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ1NJRkZMQUdTLCAmYW1wO2lmcikpOwomIzQzOwljbG9zZShzKTsKJiM0MzsKJiM0MzsJbmZzZF9mYW1pbHkgPSBnZW5sX3Jlc29sdmVfbmZzZCgpOwomIzQzOwlpZiAobmZzZF9mYW1pbHkgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bmZzZCBnZW5sIGZhbWlseSBub3QgZm91bmQgKG1vZHByb2JlIG5mc2Q/KSYjMzQ7KTsKJiM0MzsKJiM0MzsJc2VsZi0mZ3Q7cnBjYmQgPSBycGNiX3N0dWJfc3RhcnQoUlBDQl9TVFVCX0FDQ0VQVCk7CiYjNDM7CWlmIChzZWxmLSZndDtycGNiZCAmbHQ7IDApCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtjYW5ub3Qgc3RhcnQgdGhlIHJwY2JpbmQgc3R1YjogJXMmIzM0OywKJiM0MzsJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihuZnNkX2xpc3RlbmVyKQomIzQzO3sKJiM0MzsJaWYgKHNlbGYtJmd0O3JwY2JkICZndDsgMCkgewomIzQzOwkJa2lsbChzZWxmLSZndDtycGNiZCwgU0lHS0lMTCk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3JwY2JkLCBOVUxMLCAwKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gdmFsaWRhdGlvbiAvIG5lZ2F0aXZlID09PT09PT09PT09PT09PT09PT09PSAqLwomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfZW1wdHlfbGlzdF9vaykKJiM0Mzt7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3Rvb19tYW55KQomIzQzO3sKJiM0MzsJc3RhdGljIGNoYXIgYXR0cnNbMSAmbHQ7Jmx0OyAyMF07CiYjNDM7CWludCBpLCBvZmYgPSAwOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgMTAyNTsgaSYjNDM7JiM0MzspCQkvKiAmZ3Q7IE5GU0RfTkxfTElTVEVORVJfTUFYICgxMDI0KSAqLwomIzQzOwkJb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUVYUEVDVF9FUSgtRTJCSUcsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ19hZGRyKQomIzQzO3sKJiM0MzsJY2hhciBhdHRyc1s2NF07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMCB9OwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ190cmFuc3BvcnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gczQgPSB7IC5zaW5fZmFtaWx5ID0gQUZfSU5FVCwgLnNpbl9wb3J0ID0gaHRvbnMoVEVTVF9QT1JUKSB9OwomIzQzOwlzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gTlVMTCwgLmVtaXRfYWRkciA9IDEsCiYjNDM7CQkJCSAgLmFkZHIgPSAmYW1wO3M0LCAuYWRkcl9sZW4gPSBzaXplb2YoczQpIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBuYW1lIG1hdGNoaW5nIG5vIHRyYW5zcG9ydCBjbGFzcyBtdXN0IGJlIHJlZnVzZWQgYmVmb3JlIG5mc2RfbXV0ZXggaXMKJiM0MzsgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHMKJiM0MzsgKiByZXF1ZXN0X21vZHVsZSgmIzM0O3N2YyVzJiMzNDssIG5hbWUpIHVwY2FsbC4KJiM0MzsgKi8KJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2JhZF90cmFuc3BvcnQpCiYjNDM7ewomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDtib2d1c194cHJ0JiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRVBST1RPTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2FkZHJfdG9vX3Nob3J0KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgY2hhciB0aW55ID0gMDsKJiM0MzsJc3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9ICYjMzQ7dGNwJiMzNDssIC5lbWl0X2FkZHIgPSAxLAomIzQzOwkJCQkgIC5hZGRyID0gJmFtcDt0aW55LCAuYWRkcl9sZW4gPSAxIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldF9zaG9ydCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3M0LAomIzQzOwkJCQkgIC5hZGRyX2xlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgJiM0MzsgMiB9OwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsICZhbXA7cik7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXQ2X3Nob3J0KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3M2LAomIzQzOwkJCQkgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX2ZhbWlseSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9OwomIzQzOwlzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gJiMzNDt0Y3AmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gJmFtcDtzcywKJiM0MzsJCQkJICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9OwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsICZhbXA7cik7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHsgLnNzX2ZhbWlseSA9IEFGX1VOSVggfTsKJiM0MzsJc3RydWN0IHJhd19saXN0ZW5lciBiYWQgPSB7IC54cHJ0ID0gJiMzNDt0Y3AmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gJmFtcDtzcywKJiM0MzsJCQkJICAgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07CiYjNDM7CWNoYXIgYXR0cnNbMTI4XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgb2ZmLCAmYW1wO2JhZCk7CiYjNDM7CS8qIFRoZSB3aG9sZSByZXF1ZXN0IGlzIHJlamVjdGVkIGR1cmluZyB2YWxpZGF0aW9uOyBub3RoaW5nIGFwcGxpZWQuICovCiYjNDM7CUVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEEgcmVqZWN0ZWQgcmVxdWVzdCBtdXN0IGxlYXZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBhcmUgYWxyZWFkeSB1cCBhbG9uZS4KJiM0MzsgKiBUaGUgZXJybm8gYWxvbmUgZG9lcyBub3Qgc2hvdyB0aGF0OiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIHJldHVybnMKJiM0MzsgKiAtRVBST1RPTk9TVVBQT1JUIGZvciBhbiB1bmtub3duIG5hbWUgdG9vLiBXaGF0IGRpZmZlcnMgaXMgaG93IGZhciB0aGUKJiM0MzsgKiByZXF1ZXN0IGdldHMgLS0gd2l0aG91dCB0aGUgY2hlY2sgaW4gbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwKJiM0MzsgKiBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KCkgaGFzIGFscmVhZHkgbW92ZWQgdGhlIHVubWF0Y2hlZCB0Y3AgbGlzdGVuZXIKJiM0MzsgKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGUKJiM0MzsgKiBuYW1lIGZhaWxzLgomIzQzOyAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfcmVqZWN0X2tlZXBzX2xpc3RlbmVycykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGdvb2RbNjRdLCBiYWRbNjRdOwomIzQzOwlpbnQgb2cgPSBwdXRfbGlzdGVuZXIoZ29vZCwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG9iID0gcHV0X2xpc3RlbmVyKGJhZCwgMCwgJiMzNDtib2d1c194cHJ0JiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoZ29vZCwgb2cpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChiYWQsIG9iKSk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7CUVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSBmdW5jdGlvbmFsIC8gcm91bmQtdHJpcCA9PT09PT09PT09PT09PT09PT09PT0gKi8KJiM0MzsKJiM0MzsvKiBMSVNURU5FUl9HRVQgd2l0aCBubyBzZXJ2IGluIHRoaXMgbmV0bnMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2dldF9lbXB0eSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwomIzQzOwlFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdGNwKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsJRVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCAmIzM0O3RjcCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTsKJiM0MzsJRVhQRUNUX0VRKGh0b25sKElOQUREUl9MT09QQkFDSyksIGdvdFswXS5hNC5zX2FkZHIpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdWRwKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3VkcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsJRVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCAmIzM0O3VkcCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX211bHRpKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbMTI4XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzOwlBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dWRwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19pZGVtcG90ZW50KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJRVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CQkvKiByZS1zZXQgc2FtZSBsaXN0ICovCiYjNDM7CUFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7CUVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2FkZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIG9uZVs2NF0sIHR3b1sxMjhdOwomIzQzOwlpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwlpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCAmIzM0O3VkcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7CQkvKiBhZGQgdWRwLCBrZWVwIHRjcCAqLwomIzQzOwlBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dWRwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19yZW1vdmVfc3Vic2V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYm90aFsxMjhdLCBvbmVbNjRdOwomIzQzOwlpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG9vID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgb2IsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYm90aCwgb2IpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG9vKSk7CQkvKiBkcm9wIHVkcCAqLwomIzQzOwlBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19lbXB0eV9kZXN0cm95cykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpOwkJLyogZW1wdHkgLSZndDsgZGVzdHJveSBzZXJ2ICovCiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTsKJiM0MzsJY2hhciBhdHRyc1s2NF07CiYjNDM7CWludCBvZmYsIHM7CiYjNDM7CiYjNDM7CXMgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJaWYgKHMgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7SVB2NiB1bmF2YWlsYWJsZTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJY2xvc2Uocyk7CiYjNDM7CiYjNDM7CW9mZiA9IHB1dF9saXN0ZW5lcl9hZihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVDYsIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzOwlBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQ2LCBURVNUX1BPUlQpKTsKJiM0MzsJRVhQRUNUX0VRKDAsIG1lbWNtcCgmYW1wO2dvdFswXS5hNiwgJmFtcDtpbjZhZGRyX2xvb3BiYWNrLCBzaXplb2YoaW42YWRkcl9sb29wYmFjaykpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogPT09PT09PT09PT09PT09PT09PT09IHJwY2JpbmQgcmVnaXN0cmF0aW9uID09PT09PT09PT09PT09PT09PT09PSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBycGNiaW5kIHRoYXQgcmVmdXNlcyB0aGUgcmVnaXN0cmF0aW9uIG11c3QgZmFpbCBsaXN0ZW5lciBjcmVhdGlvbiwKJiM0MzsgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLgomIzQzOyAqCiYjNDM7ICogVGhlIGVycm9yIGhhcyB0byBzdXJ2aXZlIHN2Y19yZWdpc3RlcigpJiMzOTtzIHdhbGsgb3ZlciBzdl9wcm9ncmFtcyB0byBnZXQKJiM0MzsgKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHkKJiM0MzsgKiBhIE5VTEwgYW5kIGEgdnNfaGlkZGVuIHZlcnNpb24sIGFuZCBzdmNfZ2VuZXJpY19ycGNiaW5kX3NldCgpIHJlcG9ydHMgMAomIzQzOyAqIGZvciBib3RoLCBzbyBhbiBzdmNfcmVnaXN0ZXIoKSB0aGF0IGtlZXBzIHRoZSBsYXN0IHJlc3VsdCByYXRoZXIgdGhhbiB0aGUKJiM0MzsgKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLgomIzQzOyAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBzZW1fcmVnaXN0ZXJfcmVmdXNlZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHJwY2Jfc3R1Yl9yZXN0YXJ0KCZhbXA7c2VsZi0mZ3Q7cnBjYmQsIFJQQ0JfU1RVQl9SRUZVU0UpKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FQUNDRVMsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSB0aHJlYWRzIC8gLUVCVVNZIHNlbWFudGljcyA9PT09PT09PT09PT09PT09PT09PT0gKi8KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fY2hhbmdlKQomIzQzO3sKJiM0MzsJY2hhciBvbmVbNjRdLCB0d29bMTI4XTsKJiM0MzsJaW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG8yID0gcHV0X2xpc3RlbmVyKHR3bywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJbzIgPSBwdXRfbGlzdGVuZXIodHdvLCBvMiwgJiMzNDt1ZHAmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7CQkJLyogdGhyZWFkcyBub3cgcnVubmluZyAqLwomIzQzOwlFWFBFQ1RfRVEoLUVCVVNZLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpOwkvKiBhZGQgcmVmdXNlZCAqLwomIzQzOwl0aHJlYWRzX3NldCgwKTsJCQkJCS8qIHN0b3AgYmVmb3JlIG5ldG5zIGV4aXQgKi8KJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX3JlbW92ZSkKJiM0Mzt7CiYjNDM7CWNoYXIgb25lWzY0XTsKJiM0MzsJaW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7CiYjNDM7CUVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7CS8qIHJlbW92ZSByZWZ1c2VkICovCiYjNDM7CXRocmVhZHNfc2V0KDApOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0hBUk5FU1NfTUFJTgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjA5MWI0NWQyMjZiYQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3MKQEAgLTAsMCAmIzQzOzEgQEAKJiM0Mzt0aW1lb3V0PTEyMAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjAyOAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDUyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE5GUyBhbmQgUlBDIFBhdGNoIFNlcmllcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBzZXJpZXMsIGFuZCBpdCYjMzk7cyB0b3VjaGluZyBzb21lIHByZXR0eSBjcml0aWNhbCBhcmVhczogYGZzL25mc2QvbmZzY3RsLmNgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AsIGFuZCBgbmV0L3N1bnJwYy9zdmMuY2AuIFBsdXMsIHRoZXJlJiMzOTtzIGEgbmV3IHNlbGZ0ZXN0LCB3aGljaCBpcyBhbHdheXMgZ29vZC4gTGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCkZpcnN0LCBgZnMvbmZzZC9uZnNjdGwuY2AgaGFzIGNoYW5nZXMgdGhhdCBhcmUgYWRkaW5nIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzIHVzaW5nIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgIGFuZCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyB3aXRoIGBORlNEX05MX0xJU1RFTkVSX01BWGAuIFRoaXMgaXMgaW1wb3J0YW50IGZvciByb2J1c3RuZXNzIGFuZCBwcmV2ZW50aW5nIHJlc291cmNlIGV4aGF1c3Rpb24uCgpUaGVuLCBvdmVyIGluIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgdGhlcmUmIzM5O3MgYSB0aW1lb3V0IGJlaW5nIGFkZGVkIGZvciBsb2NhbCBycGNiaW5kIGNhbGxzIChgcnBjYl9sb2NhbF90aW1lb3V0YCkuIFRoYXQmIzM5O3MgbGlrZWx5IGFpbWVkIGF0IGhhbmRsaW5nIHBvdGVudGlhbCBibG9ja2luZyBzY2VuYXJpb3MgbW9yZSBncmFjZWZ1bGx5LgoKRmluYWxseSwgYG5ldC9zdW5ycGMvc3ZjLmNgIHNlZW1zIHRvIGJlIGZpeGluZyBhbiBlcnJvciBoYW5kbGluZyBpc3N1ZSBpbiBgc3ZjX3JlZ2lzdGVyYCwgbWFraW5nIGl0IHJldHVybiB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQsIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhhdC4gVGhpcyBpcyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IGNoYW5nZSB0aGF0IGltcHJvdmVzIHRoZSBlcnJvciByZXBvcnRpbmcuCgpJIG5lZWQgdG8gY29uZmlybSB0aGVzZSBmdW5jdGlvbnMmIzM5OyByZWFjaGFiaWxpdHkgYW5kIGZ1bmN0aW9uYWwgaW1wYWN0LCBzbyBJIGFtIGdvaW5nIHRvIGNoZWNrIHRob3NlIGZpbGVzIHNwZWNpZmljYWxseS4gSSYjMzk7dmUgbm90ZWQgdGhhdCBgZnMvbmZzZC9uZnNjdGwuY2AgaXMgdG91Y2hpbmcgYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYCBhbmQgYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AgaXMgZ29pbmcgdG8gZGVhbCB3aXRoIGBycGNiX2NyZWF0ZV9hZl9sb2NhbGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgLCBhbmQgYG5ldC9zdW5ycGMvc3ZjLmNgIGNoYW5nZXMgYXJlIGdvaW5nIHRvIGltcGFjdCBgc3ZjX3JlZ2lzdGVyYC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWZpbml0ZWx5IGNvcmUga2VybmVsIGxvZ2ljLCBhbmQgdGhlIGNoYW5nZXMgYXJlIGRlZmluaXRlbHkgcmVhY2hhYmxlIGFuZCB3aWxsIGhhdmUgZnVuY3Rpb25hbCBpbXBhY3QuCgpOb3csIEkgd2FudCB0byBjb25maXJtIHdoZXRoZXIgdGhlc2UgZnVuY3Rpb25zIGFyZSBzdGF0aWMgb3Igbm90LiBUaGlzIGFmZmVjdHMgdGhlaXIgc2NvcGUgYW5kIGhvdyB0aGV5JiMzOTtyZSB1c2VkLgpJIGZvdW5kIHRoYXQgYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYCBpcyBzdGF0aWMsIHdoaWxlIGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBpcyBub3QuIEluIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgSSBjb25maXJtZWQgdGhhdCBib3RoIGBycGNiX2NyZWF0ZV9hZl9sb2NhbGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgIGFyZSBzdGF0aWMuIEZpbmFsbHksIGBzdmNfcmVnaXN0ZXJgIGluIGBuZXQvc3VucnBjL3N2Yy5jYCBpcyBub3Qgc3RhdGljLgoKSSYjMzk7bSBnb2luZyB0byBsZXZlcmFnZSBgZ3JlcHBlcmAgbm93IHRvIHRyYWNrIGRvd24gYWxsIHRoZSBwcmVjaXNlIGRlZmluaXRpb25zIGFuZCB1c2FnZXMgb2YgZWFjaCBmdW5jdGlvbiB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9uZnNkL25ldGxpbmsuYz0xMjI9c3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX3NwbGl0X29wcyBuZnNkX25sX29wc1tdID0ge1xuLS1cbmZzL25mc2QvbmV0bGluay5jLTE1My1cdFx0LmNtZFx0XHQ9IE5GU0RfQ01EX0xJU1RFTkVSX1NFVCxcbmZzL25mc2QvbmV0bGluay5jOjE1NDpcdFx0LmRvaXRcdFx0PSBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0LFxuZnMvbmZzZC9uZXRsaW5rLmMtMTU1LVx0XHQucG9saWN5XHRcdD0gbmZzZF9saXN0ZW5lcl9zZXRfbmxfcG9saWN5LFxuLS1cbmZzL25mc2QvbmV0bGluay5oPTI5PWludCBuZnNkX25sX3ZlcnNpb25fZ2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7XG5mcy9uZnNkL25ldGxpbmsuaDozMDppbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTtcbmZzL25mc2QvbmV0bGluay5oLTMxLWludCBuZnNkX25sX2xpc3RlbmVyX2dldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pO1xuLS1cbmZzL25mc2QvbmZzY3RsLmM9MjAwNT1zdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4tLVxuZnMvbmZzZC9uZnNjdGwuYy0yMDU2LS8qKlxuZnMvbmZzZC9uZnNjdGwuYzoyMDU3OiAqIG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQgLSBzZXQgdGhlIG5mcyBydW5uaW5nIHNvY2tldHNcbmZzL25mc2QvbmZzY3RsLmMtMjA1OC0gKiBAc2tiOiByZXBseSBidWZmZXJcbi0tXG5mcy9uZnNkL25mc2N0bC5jLTIwNjItICovXG5mcy9uZnNkL25mc2N0bC5jOjIwNjM6aW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbmZzL25mc2QvbmZzY3RsLmMtMjA2NC17XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuYz03MTY9VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9zZWNvbmRfZW50cnlfYmFkKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMtNzMzLSAqIHJlcXVlc3QgZ2V0cyAtLSB3aXRob3V0IHRoZSBjaGVjayBpbiBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycygpLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuYzo3MzQ6ICogbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCgpIGhhcyBhbHJlYWR5IG1vdmVkIHRoZSB1bm1hdGNoZWQgdGNwIGxpc3RlbmVyXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTczNS0gKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGVcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzg0OQoJCQkJCQkJb3V0cHV0OiAxNwoJCQkJCQkJdGhvdWdodHM6IDMzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgaW5pdGlhbCB0aG91Z2h0cywgZnJhbWVkIGFzIGEgY29uY2lzZSBzdW1tYXJ5IGZvciBhbiBleHBlcnQ6CgoqKlByaW9yaXRpemluZyBGdXp6aW5nIFRhcmdldHMqKgoKQWxyaWdodCwgbG9va2luZyBhdCB0aGlzIGNvZGUsIG15IG1pbmQgaW1tZWRpYXRlbHkganVtcHMgdG8gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLiBTZWVtcyBsaWtlIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nLiBJdCYjMzk7cyBnb3QgdGhhdCBuZXR3b3JrIGludGVyYWN0aW9uIGVsZW1lbnQsIHdoaWNoIG9mdGVuIG1lYW5zIGNvbXBsZXggaW5wdXQgaGFuZGxpbmcgYW5kIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMuCgpOb3csIEkmIzM5O20gYWxzbyBjb25zaWRlcmluZyBgc3ZjX3JlZ2lzdGVyYC4gSXQmIzM5O3MgYSBrZXkgZnVuY3Rpb24gZm9yIHNlcnZpY2UgcmVnaXN0cmF0aW9uLCBhbHdheXMgYSBzZW5zaXRpdmUgYXJlYSBmcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUuIEkgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIGRhdGEgZmxvd3MgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbiBwb2ludHMgaW4gdGhpcyBhcmVhLiBCb3RoIHNlZW0gbGlrZSBnb29kIHN0YXJ0aW5nIHBvaW50cywgYnV0IGl0JiMzOTtzIGltcG9ydGFudCB0byBhc3Nlc3Mgd2hpY2ggb25lIHByZXNlbnRzIHRoZSBtb3N0IGltbWVkaWF0ZSByaXNrIG9yIGhpZ2hlc3QgcG90ZW50aWFsIGZvciByZXdhcmQgaW4gdGVybXMgb2YgdW5jb3ZlcmluZyB2dWxuZXJhYmlsaXRpZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3ZjX3JlZ2lzdGVyJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oPTQ3ND12b2lkXHRcdCAgIHN2Y19wcm9jZXNzX2JjKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKTtcbmluY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oOjQ3NTppbnRcdFx0ICAgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqLCBzdHJ1Y3QgbmV0ICosIGNvbnN0IGludCxcbmluY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oLTQ3Ni1cdFx0XHRcdGNvbnN0IHVuc2lnbmVkIHNob3J0LCBjb25zdCB1bnNpZ25lZCBzaG9ydCk7XG4tLVxubmV0L3N1bnJwYy9zdmMuYz0xMDc0PXN0YXRpYyBpbnQgX19zdmNfcnBjYl9yZWdpc3RlcjYoc3RydWN0IG5ldCAqbmV0LCBjb25zdCB1MzIgcHJvZ3JhbSxcbi0tXG5uZXQvc3VucnBjL3N2Yy5jLTExMTctICovXG5uZXQvc3VucnBjL3N2Yy5jOjExMTg6c3RhdGljIGludCBfX3N2Y19yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKnByb2duYW1lLFxubmV0L3N1bnJwYy9zdmMuYy0xMTE5LVx0XHRcdCAgY29uc3QgdTMyIHByb2dyYW0sIGNvbnN0IHUzMiB2ZXJzaW9uLFxuLS1cbm5ldC9zdW5ycGMvc3ZjLmMtMTEzNy1cbm5ldC9zdW5ycGMvc3ZjLmM6MTEzODpcdHRyYWNlX3N2Y19yZWdpc3Rlcihwcm9nbmFtZSwgdmVyc2lvbiwgZmFtaWx5LCBwcm90b2NvbCwgcG9ydCwgZXJyb3IpO1xubmV0L3N1bnJwYy9zdmMuYy0xMTM5LVx0cmV0dXJuIGVycm9yO1xuLS1cbm5ldC9zdW5ycGMvc3ZjLmM9MTE0Mz1pbnQgc3ZjX3JwY2JpbmRfc2V0X3ZlcnNpb24oc3RydWN0IG5ldCAqbmV0LFxuLS1cbm5ldC9zdW5ycGMvc3ZjLmMtMTE0OC17XG5uZXQvc3VucnBjL3N2Yy5jOjExNDk6XHRyZXR1cm4gX19zdmNfcmVnaXN0ZXIobmV0LCBwcm9ncC1cdTAwM2VwZ19uYW1lLCBwcm9ncC1cdTAwM2VwZ19wcm9nLFxubmV0L3N1bnJwYy9zdmMuYy0xMTUwLVx0XHRcdFx0dmVyc2lvbiwgZmFtaWx5LCBwcm90bywgcG9ydCk7XG4tLVxubmV0L3N1bnJwYy9zdmMuYz0xMTg0PUVYUE9SVF9TWU1CT0xfR1BMKHN2Y19nZW5lcmljX3JwY2JpbmRfc2V0KTtcbi0tXG5uZXQvc3VucnBjL3N2Yy5jLTExODYtLyoqXG5uZXQvc3VucnBjL3N2Yy5jOjExODc6ICogc3ZjX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYW4gUlBDIHNlcnZpY2Ugd2l0aCB0aGUgbG9jYWwgcG9ydG1hcHBlclxubmV0L3N1bnJwYy9zdmMuYy0xMTg4LSAqIEBzZXJ2OiBzdmNfc2VydiBzdHJ1Y3QgZm9yIHRoZSBzZXJ2aWNlIHRvIHJlZ2lzdGVyXG4tLVxubmV0L3N1bnJwYy9zdmMuYy0xMTk1LSAqL1xubmV0L3N1bnJwYy9zdmMuYzoxMTk2OmludCBzdmNfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBzdHJ1Y3QgbmV0ICpuZXQsXG5uZXQvc3VucnBjL3N2Yy5jLTExOTctXHRcdCBjb25zdCBpbnQgZmFtaWx5LCBjb25zdCB1bnNpZ25lZCBzaG9ydCBwcm90byxcbi0tXG5uZXQvc3VucnBjL3N2Y194cHJ0LmM9MTEwNz1zdGF0aWMgdm9pZCBzdmNfZGVsZXRlX3hwcnQoc3RydWN0IHN2Y194cHJ0ICp4cHJ0KVxuLS1cbm5ldC9zdW5ycGMvc3ZjX3hwcnQuYy0xMTE4LVxubmV0L3N1bnJwYy9zdmNfeHBydC5jOjExMTk6XHRcdGlmIChzdmNfcmVnaXN0ZXIoc2VydiwgeHBydC1cdTAwM2V4cHRfbmV0LCBzb2NrLVx1MDAzZXNrLVx1MDAzZXNrX2ZhbWlseSxcbm5ldC9zdW5ycGMvc3ZjX3hwcnQuYy0xMTIwLVx0XHRcdFx0IHNvY2stXHUwMDNlc2stXHUwMDNlc2tfcHJvdG9jb2wsIDApIFx1MDAzYyAwKVxuLS1cbm5ldC9zdW5ycGMvc3Zjc29jay5jPTE0Mzk9c3RhdGljIHN0cnVjdCBzdmNfc29jayAqc3ZjX3NldHVwX3NvY2tldChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsXG4tLVxubmV0L3N1bnJwYy9zdmNzb2NrLmMtMTQ3Mi1cbm5ldC9zdW5ycGMvc3Zjc29jay5jOjE0NzM6XHRcdGVyciA9IHN2Y19yZWdpc3RlcihzZXJ2LCBzb2NrX25ldChzb2NrLVx1MDAzZXNrKSwgaW5ldC1cdTAwM2Vza19mYW1pbHksXG5uZXQvc3VucnBjL3N2Y3NvY2suYy0xNDc0LVx0XHRcdFx0ICAgICBpbmV0LVx1MDAzZXNrX3Byb3RvY29sLFxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM9ODUyPVRFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuYy04NzUtICpcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM6ODc2OiAqIFRoZSBlcnJvciBoYXMgdG8gc3Vydml2ZSBzdmNfcmVnaXN0ZXIoKSYjMzk7cyB3YWxrIG92ZXIgc3ZfcHJvZ3JhbXMgdG8gZ2V0XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg3Ny0gKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMtODc4LSAqIGEgTlVMTCBhbmQgYSB2c19oaWRkZW4gdmVyc2lvbiwgYW5kIHN2Y19nZW5lcmljX3JwY2JpbmRfc2V0KCkgcmVwb3J0cyAwXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jOjg3OTogKiBmb3IgYm90aCwgc28gYW4gc3ZjX3JlZ2lzdGVyKCkgdGhhdCBrZWVwcyB0aGUgbGFzdCByZXN1bHQgcmF0aGVyIHRoYW4gdGhlXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg4MC0gKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MjQzCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZywgY29uc2lkZXJpbmcgSSYjMzk7bSB0cnlpbmcgdG8gc2VsZWN0IHRoZSBiZXN0IGZ1bmN0aW9uIGZvciBzb21ldGhpbmc6CgoqKkZ1bmN0aW9uIENhbmRpZGF0ZSBFdmFsdWF0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGBzdmNfcmVnaXN0ZXJgIGxvb2tzIGxpa2UgYSBzdHJvbmcgY29udGVuZGVyLiBIb3dldmVyLCBJIG5lZWQgdG8gYmUgdGhvcm91Z2guIFRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIGl0JiMzOTtzIHRoZSBiZXN0IG9wdGlvbiwgb3IgaWYgdGhlcmUgbWlnaHQgYmUgc29tZXRoaW5nIGV2ZW4gbW9yZSBwZXJmZWN0bHkgc3VpdGVkIGZvciBteSBuZWVkcy4KCkkmIzM5O20gbm93IHRoaW5raW5nIGFib3V0IGBycGNiX2NyZWF0ZV9hZl9sb2NhbGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgLiBUaGUgaW1tZWRpYXRlIGNvbmNlcm4gaXMgdGhhdCB0aGV5IGFyZSBzdGF0aWMgZnVuY3Rpb25zLiBTdGF0aWMgZnVuY3Rpb25zIGhhdmUgdGhlaXIgc2NvcGUgbGltaXRlZC4gVGhlIG1haW4gaXNzdWUgaGVyZSBpcyBpZiB0aGUgY2FsbC1zaXRlcyBhcmUgYWxzbyB3aXRoaW4gdGhhdCBzY29wZS4gQXJlIHRoZXkgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4gb3RoZXIgc3RhdGljIGZ1bmN0aW9ucywgb3IgYXJlIHRoZXkgY2FsbGVkIGZyb20gYSBub24tc3RhdGljIGNvbnRleHQ/IFRoaXMgaXMgdGhlIGNydWNpYWwgcG9pbnQgZm9yIGRldGVybWluaW5nIGlmIHRoZXkgd2lsbCB3b3JrIGFzIGRlc2lyZWQsIGVzcGVjaWFsbHkgY29uc2lkZXJpbmcgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgbGFyZ2VyIGRlc2lnbi4gSWYgdGhleSYjMzk7cmUgY2FsbGVkIG91dHNpZGUgdGhlaXIgc3RhdGljIHNjb3BlLCBJIGhhdmUgYSBwcm9ibGVtLiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlIGNhbGwgZ3JhcGggYW5kIHRoZWlyIHJlc3BlY3RpdmUgY29udGV4dHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cnBjYl9jcmVhdGVfYWZfbG9jYWwmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0yMjg9c3RhdGljIGNvbnN0IHN0cnVjdCBycGNfdGltZW91dCBycGNiX2xvY2FsX3RpbWVvdXQgPSB7XG4tLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yMzctICovXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjIzODpzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2FmX2xvY2FsKHN0cnVjdCBuZXQgKm5ldCxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjM5LVx0XHRcdFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX3VuICphZGRyKVxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9Mjg1PXN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfYWJzdHJhY3Qoc3RydWN0IG5ldCAqbmV0KVxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjkxLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyOTI6XHRyZXR1cm4gcnBjYl9jcmVhdGVfYWZfbG9jYWwobmV0LCBcdTAwMjZycGNiX2xvY2FsYWRkcl9hYnN0cmFjdCk7XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI5My19XG4tLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0yOTU9c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF91bml4KHN0cnVjdCBuZXQgKm5ldClcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMwMS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzAyOlx0cmV0dXJuIHJwY2JfY3JlYXRlX2FmX2xvY2FsKG5ldCwgXHUwMDI2cnBjYl9sb2NhbGFkZHJfdW5peCk7XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMwMy19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTk4OTEKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBzdW1tYXJ5LCB0YWtpbmcgdGhlIHBlcnNwZWN0aXZlIG9mIHNvbWVvbmUgZGVlcGx5IGZhbWlsaWFyIHdpdGggc3lzdGVtIGludGVybmFsczoKCioqVHJhY2luZyB0aGUgT3JpZ2lucyBvZiBBYnN0cmFjdCBhbmQgVW5peCBEb21haW4gU29ja2V0IENyZWF0aW9uIGluIHJwY2JpbmQqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsaWZlY3ljbGUgb2YgYWJzdHJhY3QgYW5kIFVuaXggZG9tYWluIHNvY2tldCBjcmVhdGlvbiB3aXRoaW4gYHJwY2JpbmRgLiBNeSBmb2N1cyBpcyBvbiB0cmFjaW5nIGhvdyB0aGVzZSBtZWNoYW5pc21zIGFyZSAqaW5zdGFudGlhdGVkKiDigJMgc3BlY2lmaWNhbGx5LCB0aGUgY2FsbHMgdG8gYHJwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0YCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX3VuaXhgLiBJIHdhbnQgdG8gaWRlbnRpZnkgdGhlIGluaXRpYXRpbmcgcG9pbnRzLCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCwgYW5kIGFueSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdGhhdCBpbmZsdWVuY2UgdGhlaXIgaW52b2NhdGlvbi4gVGhpcyBsZXZlbCBvZiBkZXRhaWwgaXMgY3J1Y2lhbCBmb3IgcmVhbGx5IHVuZGVyc3RhbmRpbmcgdGhlIGJlaGF2aW9yIG9mIGBycGNiaW5kYCB3aGVuIGRlYWxpbmcgd2l0aCB2YXJpb3VzIHNvY2tldCB0eXBlcy4gS25vd2luZyAqd2hlcmUqIGFuZCAqd2h5KiB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aWxsIHJldmVhbCBhIGxvdCBhYm91dCB0aGUgYXBwbGljYXRpb24gYXJjaGl0ZWN0dXJlLCBpdHMgZXJyb3IgaGFuZGxpbmcsIGFuZCwgcG9zc2libHksIGFueSB2dWxuZXJhYmlsaXRpZXMgb3Igb3B0aW1pemF0aW9ucyB0aGF0IG1pZ2h0IGJlIHByZXNlbnQuIExldCYjMzk7cyBkaWcgaW4gYW5kIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3JwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9zdW5ycGMvcnBjYl9jbG50LmM9MjM4PXN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfYWZfbG9jYWwoc3RydWN0IG5ldCAqbmV0LFxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjg0LVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyODU6c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChzdHJ1Y3QgbmV0ICpuZXQpXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI4Ni17XG4tLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0zNTc9aW50IHJwY2JfY3JlYXRlX2xvY2FsKHN0cnVjdCBuZXQgKm5ldClcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2OC1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY5Olx0aWYgKHJwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0KG5ldCkgIT0gMCBcdTAwMjZcdTAwMjZcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzcwLVx0ICAgIHJwY2JfY3JlYXRlX2xvY2FsX3VuaXgobmV0KSAhPSAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDM5MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgcnBjYl9jcmVhdGVfbG9jYWxgKioKCk9rYXksIHNvIGBycGNiX2NyZWF0ZV9sb2NhbGAgaXNuJiMzOTt0IGRlY2xhcmVkIGFzIGBzdGF0aWNgLiBUaGF0IGltbWVkaWF0ZWx5IHBpcXVlcyBteSBpbnRlcmVzdC4gTm9uLXN0YXRpYyBmdW5jdGlvbnMgdXN1YWxseSBpbXBseSBhIGJyb2FkZXIgc2NvcGUgb2YgdXNhZ2UsIHBvdGVudGlhbGx5IGluZGljYXRpbmcgaXQmIzM5O3MgcGFydCBvZiBhIHB1YmxpYyBpbnRlcmZhY2UsIG9yIGF0IGxlYXN0IGNhbGxlZCBmcm9tIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiB0aGUgY29kZWJhc2UuIEdpdmVuIHRoYXQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgdGhvcm91Z2hseSBhbmFseXplIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYmVpbmcgKnVzZWQqLiBUaW1lIHRvIHRyYWNrIGRvd24gYWxsIGl0cyBjYWxsIHNpdGVzIGFuZCB1bmRlcnN0YW5kIGl0cyByb2xlIGluIHRoaXMgc3lzdGVtLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGl0cyBpbXBhY3QgYW5kIGltcG9ydGFuY2UuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb250ZXh0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtycGNiX2NyZWF0ZV9sb2NhbCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50Lmg9MTk3PXN0cnVjdCBycGNfeHBydFx0KnJwY190YXNrX2dldF94cHJ0KHN0cnVjdCBycGNfY2xudCAqY2xudCxcbi0tXG5pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgtMTk5LVxuaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oOjIwMDppbnRcdFx0cnBjYl9jcmVhdGVfbG9jYWwoc3RydWN0IG5ldCAqKTtcbmluY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaC0yMDEtdm9pZFx0XHRycGNiX3B1dF9sb2NhbChzdHJ1Y3QgbmV0ICopO1xuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9MjA2PXN0YXRpYyB2b2lkIHJwY2Jfc2V0X2xvY2FsKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHJwY19jbG50ICpjbG50LFxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjExLVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyMTI6XHQvKiBQcm90ZWN0ZWQgYnkgcnBjYl9jcmVhdGVfbG9jYWxfbXV0ZXggKi9cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjEzLVx0c24tXHUwMDNlcnBjYl9sb2NhbF9jbG50ID0gY2xudDtcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jPTIzOD1zdGF0aWMgaW50IHJwY2JfY3JlYXRlX2FmX2xvY2FsKHN0cnVjdCBuZXQgKm5ldCxcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI4NC1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6Mjg1OnN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfYWJzdHJhY3Qoc3RydWN0IG5ldCAqbmV0KVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yODYte1xuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjk0LVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyOTU6c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF91bml4KHN0cnVjdCBuZXQgKm5ldClcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjk2LXtcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMwOC0gKi9cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzA5OnN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfbmV0KHN0cnVjdCBuZXQgKm5ldClcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzEwLXtcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM1Ni0gKi9cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzU3OmludCBycGNiX2NyZWF0ZV9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQpXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM1OC17XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM1OTpcdHN0YXRpYyBERUZJTkVfTVVURVgocnBjYl9jcmVhdGVfbG9jYWxfbXV0ZXgpO1xubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0zNjAtXHRpbnQgcmVzdWx0ID0gMDtcbi0tXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2NC1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY1Olx0bXV0ZXhfbG9jayhcdTAwMjZycGNiX2NyZWF0ZV9sb2NhbF9tdXRleCk7XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2Ni1cdGlmIChycGNiX2dldF9sb2NhbChuZXQpKVxuLS1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzY4LVxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzozNjk6XHRpZiAocnBjYl9jcmVhdGVfbG9jYWxfYWJzdHJhY3QobmV0KSAhPSAwIFx1MDAyNlx1MDAyNlxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzozNzA6XHQgICAgcnBjYl9jcmVhdGVfbG9jYWxfdW5peChuZXQpICE9IDApXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM3MTpcdFx0cmVzdWx0ID0gcnBjYl9jcmVhdGVfbG9jYWxfbmV0KG5ldCk7XG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM3Mi1cbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzczLW91dDpcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6Mzc0Olx0bXV0ZXhfdW5sb2NrKFx1MDAyNnJwY2JfY3JlYXRlX2xvY2FsX211dGV4KTtcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzc1LVx0cmV0dXJuIHJlc3VsdDtcbi0tXG5uZXQvc3VucnBjL3N2Yy5jPTMwMT1zdGF0aWMgaW50IHN2Y19ycGNiX3NldHVwKHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0KVxuLS1cbm5ldC9zdW5ycGMvc3ZjLmMtMzA0LVxubmV0L3N1bnJwYy9zdmMuYzozMDU6XHRlcnIgPSBycGNiX2NyZWF0ZV9sb2NhbChuZXQpO1xubmV0L3N1bnJwYy9zdmMuYy0zMDYtXHRpZiAoZXJyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTYzMwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDEzOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFJQQyBTZXJ2ZXIgU2V0dXAgYW5kIFJlbGF0ZWQgQ29uZmlndXJhdGlvbnMqKgoKT2theSwgc28gSSBzZWUgdGhhdCBgcnBjYl9jcmVhdGVfbG9jYWxgIGlzIGJlaW5nIGNhbGxlZCBmcm9tIHdpdGhpbiBgc3ZjX3JwY2Jfc2V0dXBgLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBSUEMgc2VydmVyIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuIFRoYXQgbWFrZXMgc2Vuc2U7IGl0JiMzOTtzIGEgY3JpdGljYWwgcGFydCBvZiB0aGUgc2V0dXAuIEkmIzM5O3ZlIGFsc28gbm90ZWQgdGhhdCB0aGUgY29kZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLCBgcnBjYl9jcmVhdGVfbG9jYWxgLCBhbmQgYHN2Y19yZWdpc3RlcmAuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGtleSB0byB0aGUgbmV3IGJlaGF2aW9yLgoKTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZW5hYmxpbmcgdGhpcyBuZXcgZnVuY3Rpb25hbGl0eS4gTGV0JiMzOTtzIHNlZS4uLiB0aGUgc2VsZnRlc3QgY29uZmlnIG1lbnRpb25zIGBDT05GSUdfTkVUX05TPXlgLCBgQ09ORklHX0lQVjY9eWAsIGBDT05GSUdfTkZTRD15YCwgYW5kIGBDT05GSUdfTkZTRF9WND15YC4gVGhhdCBnaXZlcyBtZSBhIHN0YXJ0aW5nIHBvaW50LiBgTkVUX05TYCBpcyBjbGVhcmx5IGltcG9ydGFudCBmb3IgbmV0d29yayBuYW1lc3BhY2VzLCBgSVBWNmAgZm9yIG9idmlvdXMgcmVhc29ucywgYW5kIGBORlNEYC9gTkZTRF9WNGAgcmVsYXRlIHRvIHRoZSBORlMgc2VydmVyIGl0c2VsZi4gSSYjMzk7bGwgbmVlZCB0byBkaWcgZGVlcGVyLCB0aG91Z2guCgpJIHNob3VsZCBleGFtaW5lIGBmcy9uZnNkL0tjb25maWdgIHRvIGxvb2sgZm9yIGFueSBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBvciByZWxhdGlvbnNoaXBzIHRoYXQgbWlnaHQgYmUgbGVzcyBvYnZpb3VzLiBUaGVyZSBjb3VsZCBiZSBvdGhlciByZWxhdGVkIGtlcm5lbCBmZWF0dXJlcyBvciBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgYWxzbyBpbnZvbHZlZC4gSXQmIzM5O3MgaW1wb3J0YW50IHRvIGhhdmUgYSBjb21wbGV0ZSBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL25mc2QvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgTkZTRFxuICAgMzpcdFx0dHJpc3RhdGUgXCYjMzQ7TkZTIHNlcnZlciBzdXBwb3J0XCYjMzQ7XG4gICA0Olx0XHRkZXBlbmRzIG9uIElORVRcbiAgIDU6XHRcdGRlcGVuZHMgb24gRklMRV9MT0NLSU5HXG4gICA2Olx0XHRkZXBlbmRzIG9uIEZTTk9USUZZXG4gICA3Olx0XHRzZWxlY3QgQ1JDMzJcbiAgIDg6XHRcdHNlbGVjdCBDUllQVE9fTElCX01ENSBpZiBORlNEX0xFR0FDWV9DTElFTlRfVFJBQ0tJTkdcbiAgIDk6XHRcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NiBpZiBORlNEX1Y0XG4gIDEwOlx0XHRzZWxlY3QgQ1JZUFRPICMgcmVxdWlyZWQgYnkgUlBDU0VDX0dTU19LUkI1IGFuZCBzaWduZWQgZmlsZWhhbmRsZXNcbiAgMTE6XHRcdHNlbGVjdCBMT0NLRFxuICAxMjpcdFx0c2VsZWN0IFNVTlJQQ1xuICAxMzpcdFx0c2VsZWN0IEVYUE9SVEZTXG4gIDE0Olx0XHRzZWxlY3QgTkZTX0NPTU1PTlxuICAxNTpcdFx0c2VsZWN0IE5GU19BQ0xfU1VQUE9SVCBpZiBORlNEX1YyX0FDTFxuICAxNjpcdFx0c2VsZWN0IE5GU19BQ0xfU1VQUE9SVCBpZiBORlNEX1YzX0FDTFxuICAxNzpcdFx0ZGVwZW5kcyBvbiBNVUxUSVVTRVJcbiAgMTg6XHRcdGhlbHBcbiAgMTk6XHRcdCAgQ2hvb3NlIFkgaGVyZSBpZiB5b3Ugd2FudCB0byBhbGxvdyBvdGhlciBjb21wdXRlcnMgdG8gYWNjZXNzXG4gIDIwOlx0XHQgIGZpbGVzIHJlc2lkaW5nIG9uIHRoaXMgc3lzdGVtIHVzaW5nIFN1biYjMzk7cyBOZXR3b3JrIEZpbGUgU3lzdGVtXG4gIDIxOlx0XHQgIHByb3RvY29sLiAgVG8gY29tcGlsZSB0aGUgTkZTIHNlcnZlciBzdXBwb3J0IGFzIGEgbW9kdWxlLFxuICAyMjpcdFx0ICBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG5mc2QuXG4gIDIzOlx0XG4gIDI0Olx0XHQgIFlvdSBtYXkgY2hvb3NlIHRvIHVzZSBhIHVzZXItc3BhY2UgTkZTIHNlcnZlciBpbnN0ZWFkLCBpbiB3aGljaFxuICAyNTpcdFx0ICBjYXNlIHlvdSBjYW4gY2hvb3NlIE4gaGVyZS5cbiAgMjY6XHRcbiAgMjc6XHRcdCAgVG8gZXhwb3J0IGxvY2FsIGZpbGUgc3lzdGVtcyB1c2luZyBORlMsIHlvdSBhbHNvIG5lZWQgdG8gaW5zdGFsbFxuICAyODpcdFx0ICB1c2VyIHNwYWNlIHByb2dyYW1zIHdoaWNoIGNhbiBiZSBmb3VuZCBpbiB0aGUgTGludXggbmZzLXV0aWxzXG4gIDI5Olx0XHQgIHBhY2thZ2UsIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9saW51eC1uZnMub3JnLy4gIE1vcmUgZGV0YWlsIGFib3V0XG4gIDMwOlx0XHQgIHRoZSBMaW51eCBORlMgc2VydmVyIGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB2aWEgdGhlXG4gIDMxOlx0XHQgIGV4cG9ydHMoNSkgbWFuIHBhZ2UuXG4gIDMyOlx0XG4gIDMzOlx0XHQgIEJlbG93IHlvdSBjYW4gY2hvb3NlIHdoaWNoIHZlcnNpb25zIG9mIHRoZSBORlMgcHJvdG9jb2wgYXJlXG4gIDM0Olx0XHQgIGF2YWlsYWJsZSB0byBjbGllbnRzIG1vdW50aW5nIHRoZSBORlMgc2VydmVyIG9uIHRoaXMgc3lzdGVtLlxuICAzNTpcdFx0ICBTdXBwb3J0IGZvciBORlMgdmVyc2lvbiAzIChSRkMgMTgxMykgaXMgYWx3YXlzIGF2YWlsYWJsZSB3aGVuXG4gIDM2Olx0XHQgIENPTkZJR19ORlNEIGlzIHNlbGVjdGVkLlxuICAzNzpcdFxuICAzODpcdFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuICAzOTpcdFxuICA0MDpcdGNvbmZpZyBORlNEX1YyXG4gIDQxOlx0XHRib29sIFwmIzM0O05GUyBzZXJ2ZXIgc3VwcG9ydCBmb3IgTkZTIHZlcnNpb24gMiAoREVQUkVDQVRFRClcJiMzNDtcbiAgNDI6XHRcdGRlcGVuZHMgb24gTkZTRFxuICA0MzpcdFx0ZGVmYXVsdCBuXG4gIDQ0Olx0XHRoZWxwXG4gIDQ1Olx0XHQgIE5GU3YyIChSRkMgMTA5NCkgd2FzIHRoZSBmaXJzdCBwdWJsaWNseS1yZWxlYXNlZCB2ZXJzaW9uIG9mIE5GUy5cbiAgNDY6XHRcdCAgVW5sZXNzIHlvdSBhcmUgaG9zdGluZyBhbmNpZW50ICgxOTkwJiMzOTtzIGVyYSkgTkZTIGNsaWVudHMsIHlvdSBkb24mIzM5O3RcbiAgNDc6XHRcdCAgbmVlZCB0aGlzLlxuICA0ODpcdFxuICA0OTpcdFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuICA1MDpcdFxuICA1MTpcdGNvbmZpZyBORlNEX1YyX0FDTFxuICA1MjpcdFx0Ym9vbCBcJiMzNDtORlMgc2VydmVyIHN1cHBvcnQgZm9yIHRoZSBORlN2MiBBQ0wgcHJvdG9jb2wgZXh0ZW5zaW9uXCYjMzQ7XG4gIDUzOlx0XHRkZXBlbmRzIG9uIE5GU0RfVjJcbiAgNTQ6XHRcbiAgNTU6XHRjb25maWcgTkZTRF9WM19BQ0xcbiAgNTY6XHRcdGJvb2wgXCYjMzQ7TkZTIHNlcnZlciBzdXBwb3J0IGZvciB0aGUgTkZTdjMgQUNMIHByb3RvY29sIGV4dGVuc2lvblwmIzM0O1xuICA1NzpcdFx0ZGVwZW5kcyBvbiBORlNEXG4gIDU4Olx0XHRoZWxwXG4gIDU5Olx0XHQgIFNvbGFyaXMgTkZTIHNlcnZlcnMgc3VwcG9ydCBhbiBhdXhpbGlhcnkgTkZTdjMgQUNMIHByb3RvY29sIHRoYXRcbiAgNjA6XHRcdCAgbmV2ZXIgYmVjYW1lIGFuIG9mZmljaWFsIHBhcnQgb2YgdGhlIE5GUyB2ZXJzaW9uIDMgcHJvdG9jb2wuXG4gIDYxOlx0XHQgIFRoaXMgcHJvdG9jb2wgZXh0ZW5zaW9uIGFsbG93cyBhcHBsaWNhdGlvbnMgb24gTkZTIGNsaWVudHMgdG9cbiAgNjI6XHRcdCAgbWFuaXB1bGF0ZSBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyBvbiBmaWxlcyByZXNpZGluZyBvbiBORlNcbiAgNjM6XHRcdCAgc2VydmVycy4gIE5GUyBzZXJ2ZXJzIGVuZm9yY2UgUE9TSVggQUNMcyBvbiBsb2NhbCBmaWxlcyB3aGV0aGVyXG4gIDY0Olx0XHQgIHRoaXMgcHJvdG9jb2wgaXMgYXZhaWxhYmxlIG9yIG5vdC5cbiAgNjU6XHRcbiAgNjY6XHRcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGluIHlvdXIgc3lzdGVtJiMzOTtzIE5GUyBzZXJ2ZXIgZm9yIHRoZVxuICA2NzpcdFx0ICBORlN2MyBBQ0wgcHJvdG9jb2wgZXh0ZW5zaW9uIGFsbG93aW5nIE5GUyBjbGllbnRzIHRvIG1hbmlwdWxhdGVcbiAgNjg6XHRcdCAgUE9TSVggQUNMcyBvbiBmaWxlcyBleHBvcnRlZCBieSB5b3VyIHN5c3RlbSYjMzk7cyBORlMgc2VydmVyLiAgTkZTXG4gIDY5Olx0XHQgIGNsaWVudHMgd2hpY2ggc3VwcG9ydCB0aGUgU29sYXJpcyBORlN2MyBBQ0wgcHJvdG9jb2wgY2FuIHRoZW5cbiAgNzA6XHRcdCAgYWNjZXNzIGFuZCBtb2RpZnkgQUNMcyBvbiB5b3VyIE5GUyBzZXJ2ZXIuXG4gIDcxOlx0XG4gIDcyOlx0XHQgIFRvIHN0b3JlIEFDTHMgb24geW91ciBORlMgc2VydmVyLCB5b3UgYWxzbyBuZWVkIHRvIGVuYWJsZSBBQ0wtXG4gIDczOlx0XHQgIHJlbGF0ZWQgQ09ORklHIG9wdGlvbnMgZm9yIHlvdXIgbG9jYWwgZmlsZSBzeXN0ZW1zIG9mIGNob2ljZS5cbiAgNzQ6XHRcbiAgNzU6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiAgNzY6XHRcbiAgNzc6XHRjb25maWcgTkZTRF9WNFxuICA3ODpcdFx0Ym9vbCBcJiMzNDtORlMgc2VydmVyIHN1cHBvcnQgZm9yIE5GUyB2ZXJzaW9uIDRcJiMzNDtcbiAgNzk6XHRcdGRlcGVuZHMgb24gTkZTRCBcdTAwMjZcdTAwMjYgUFJPQ19GU1xuICA4MDpcdFx0c2VsZWN0IEZTX1BPU0lYX0FDTFxuICA4MTpcdFx0c2VsZWN0IFJQQ1NFQ19HU1NfS1JCNVxuICA4MjpcdFx0c2VsZWN0IEdSQUNFX1BFUklPRFxuICA4MzpcdFx0c2VsZWN0IE5GU19WNF8yX1NTQ19IRUxQRVIgaWYgTkZTX1Y0XzJcbiAgODQ6XHRcdGhlbHBcbiAgODU6XHRcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGluIHlvdXIgc3lzdGVtJiMzOTtzIE5GUyBzZXJ2ZXIgZm9yXG4gIDg2Olx0XHQgIHZlcnNpb24gNCBvZiB0aGUgTkZTIHByb3RvY29sIChSRkMgMzUzMCkuXG4gIDg3Olx0XG4gIDg4Olx0XHQgIFRvIGV4cG9ydCBmaWxlcyB1c2luZyBORlN2NCwgeW91IG5lZWQgdG8gaW5zdGFsbCBhZGRpdGlvbmFsIHVzZXJcbiAgODk6XHRcdCAgc3BhY2UgcHJvZ3JhbXMgd2hpY2ggY2FuIGJlIGZvdW5kIGluIHRoZSBMaW51eCBuZnMtdXRpbHMgcGFja2FnZSxcbiAgOTA6XHRcdCAgYXZhaWxhYmxlIGZyb20gaHR0cDovL2xpbnV4LW5mcy5vcmcvLlxuICA5MTpcdFxuICA5MjpcdFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuICA5MzpcdFxuICA5NDpcdGNvbmZpZyBORlNEX1BORlNcbiAgOTU6XHRcdGJvb2xcbiAgOTY6XHRcbiAgOTc6XHRjb25maWcgTkZTRF9CTE9DS0xBWU9VVFxuICA5ODpcdFx0Ym9vbCBcJiMzNDtORlN2NC4xIHNlcnZlciBzdXBwb3J0IGZvciBwTkZTIGJsb2NrIGxheW91dHNcJiMzNDtcbiAgOTk6XHRcdGRlcGVuZHMgb24gTkZTRF9WNCBcdTAwMjZcdTAwMjYgQkxPQ0tcbiAxMDA6XHRcdHNlbGVjdCBORlNEX1BORlNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM1NTgKCQkJCQkJCW91dHB1dDogMTU1CgkJCQkJCQl0aG91Z2h0czogNDgzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBORlMgTmV0bGluayBMaXN0ZW5lciBDb25maWd1cmF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gcmV2ZWFsZWQgYSBmZXcga2V5IG9wdGlvbnMgdGhhdCBzZWVtIHJlbGV2YW50IHRvIHRoaXMgYXJlYTogYE5GU0RgLCBgTkZTRF9WNGAsIGBTVU5SUENgLCBgSU5FVGAsIGBGSUxFX0xPQ0tJTkdgLCBgRlNOT1RJRllgLCBgTVVMVElVU0VSYCwgYW5kIGBQUk9DX0ZTYC4gVGhlIGZhY3QgdGhhdCBgU1VOUlBDYCBpcyBzZWxlY3RlZCBieSBgTkZTRGAgaXMgc29tZXRoaW5nIEkmIzM5O2xsIGtlZXAgaW4gbWluZC4gQWxzbywgdGhlIGluY2x1c2lvbiBvZiBgTkVUX05TYCBhbmQgYElQVjZgIGZyb20gdGhlIHNlbGZ0ZXN0IGNvbmZpZyBpcyBpbnRlcmVzdGluZywgbGV0JiMzOTtzIGtlZXAgdGhlbSBpbiBtaW5kLCBldmVuIGlmIHRoZXkgYXJlbiYjMzk7dCBleHBsaWNpdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuCgpJIGluaXRpYWxseSBmbGFnZ2VkIGEgZmV3IGZ1bmN0aW9uIHN5bWJvbHMgYXMgcG90ZW50aWFsIGFyZWFzIG9mIGZvY3VzOiBgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdGAsIGBzdmNfcmVnaXN0ZXJgLCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsYC4gSG93ZXZlciwgYWZ0ZXIgYSBjbG9zZXIgbG9vaywgaXQgc2VlbXMgbm9uZSBvZiB0aGVzZSBhcmUgbGlrZWx5IHRvIGJlIG9uIGEgcGVyZm9ybWFuY2UtY3JpdGljYWwgcGF0aC4gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgIGlzIGEgbmV0bGluayBjb21tYW5kIGhhbmRsZXIsIHdoaWNoIGlzbiYjMzk7dCB0eXBpY2FsbHkgaG90LiBTaW1pbGFybHksIGJvdGggYHN2Y19yZWdpc3RlcmAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbGAgYXJlIGNhbGxlZCBkdXJpbmcgdGhlIHNldHVwIG9mIFJQQyBzZXJ2aWNlcywgbm90IGR1cmluZyBhY3R1YWwgZGF0YSB0cmFuc2Zlci4KCkkgdGhlbiBkaWQgYSBxdWljayBzYW5pdHkgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55IG90aGVyIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSByZWxldmFudCwgSSBjaGVja2VkIHRoZSBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5lYXJieS4gVGhlIGZ1bmN0aW9ucyBgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnNgLCBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCwgYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCwgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgIGFwcGVhciB0byBiZSBzdGF0aWMsIHdoaWNoIGxpa2VseSBtZWFucyB0aGV5IGFyZSBlaXRoZXIgaW5saW5lZCBvciBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLgoKU28sIGNpcmNsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZvY3VzIHN5bWJvbHM6CgoqICAgYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgCiogICBgc3ZjX3JlZ2lzdGVyYAoqICAgYHJwY2JfY3JlYXRlX2xvY2FsYAoKTm93LCBsZXQmIzM5O3MgY29uZmlybSB0aGF0IGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBpcyB0aGUgKm9ubHkqIG5ldGxpbmsgaGFuZGxlciBiZWluZyBtb2RpZmllZC4gWWVzLCBpdCBsb29rcyBsaWtlIGl0IGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgbGlzdGVuZXIgc2V0IGNvbW1hbmQuCgpOZXh0LCBJIG5lZWQgdG8gbWFrZSBhIG5vdGUgb2YgdGhlIHJlbGV2YW50IGBFbmFibGVDb25maWdzYDoKCiogICBgTkZTRGAKKiAgIGBORlNEX1Y0YAoqICAgYFNVTlJQQ2AgKEFnYWluLCBub3RpbmcgaXRzIGRlcGVuZGVuY3kpCiogICBgTkVUX05TYAoqICAgYElQVjZgCgpJJiMzOTtsbCB2ZXJpZnkgdGhhdCBgU1VOUlBDYCBpcyBpbmRlZWQgYSBjb25maWcgb3B0aW9uLCB3aGljaCBpdCBpcy4gRmluYWxseSwgSSYjMzk7bGwgY29uZmlybSB0aGF0IGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBpcyBhY3R1YWxseSBjb21waWxlZCBpbi4gWWVzLCBpdCYjMzk7cyBsb2NhdGVkIHdpdGhpbiBgZnMvbmZzZC9uZnNjdGwuY2AsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGBuZnNkYCBtb2R1bGUuIE5vdyBJIHdpbGwgY29tcGlsZSB0aGUgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05GU0QmIzM0OywKICAgICYjMzQ7TkZTRF9WNCYjMzQ7LAogICAgJiMzNDtTVU5SUEMmIzM0OywKICAgICYjMzQ7TkVUX05TJiMzNDssCiAgICAmIzM0O0lQVjYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0JiMzNDssCiAgICAmIzM0O3N2Y19yZWdpc3RlciYjMzQ7LAogICAgJiMzNDtycGNiX2NyZWF0ZV9sb2NhbCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgTkZTRCBuZXRsaW5rIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gbG9naWMsIGFkZHMgdmFsaWRhdGlvbiBmb3IgdHJhbnNwb3J0IGNsYXNzZXMsIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycywgaW50cm9kdWNlcyBhIHRpbWVvdXQgZm9yIGxvY2FsIHJwY2JpbmQgY2FsbHMsIGFuZCBmaXhlcyBlcnJvciBoYW5kbGluZyBpbiBzdmNfcmVnaXN0ZXIuIFRoZXNlIGFyZSByZWFjaGFibGUgY29yZSBrZXJuZWwgY2hhbmdlcyBpbiB0aGUgTkZTIHNlcnZlciBhbmQgUlBDIHN1YnN5c3RlbXMgdGhhdCBoYXZlIGZ1bmN0aW9uYWwgaW1wYWN0IGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtORlNEJiMzNDssCiAgICAmIzM0O05GU0RfVjQmIzM0OywKICAgICYjMzQ7U1VOUlBDJiMzNDssCiAgICAmIzM0O05FVF9OUyYjMzQ7LAogICAgJiMzNDtJUFY2JiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCYjMzQ7LAogICAgJiMzNDtzdmNfcmVnaXN0ZXImIzM0OywKICAgICYjMzQ7cnBjYl9jcmVhdGVfbG9jYWwmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyB2YWxpZGF0aW9uIGNoZWNrcyBmb3IgTkZTRCBuZXRsaW5rIGxpc3RlbmVyIGF0dHJpYnV0ZXMgKGUuZy4sIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHRvIGBORlNEX05MX0xJU1RFTkVSX01BWGAgYW5kIHZhbGlkYXRpbmcgdGhlIHRyYW5zcG9ydCBuYW1lIHZpYSBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCkuIEl0IGFsc28gZml4ZXMgZXJyb3IgY29kZSBwcm9wYWdhdGlvbiBpbiBgc3ZjX3JlZ2lzdGVyYCBhbmQgc2V0cyBhIGxvY2FsIHRpbWVvdXQgZm9yIHJwY2JpbmQgY2xpZW50cy4gXG5cblRoZSBuZXRsaW5rIGF0dHJpYnV0ZSBgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVgIGlzIGRlZmluZWQgYXMgYE5MQV9OVUxfU1RSSU5HYCBpbiBgbmZzZF9zb2NrX25sX3BvbGljeWAsIGVuc3VyaW5nIHRoYXQgYG5sYV9kYXRhKClgIHJldHVybnMgYSBwcm9wZXJseSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJlZm9yZSBpdCBpcyBwYXNzZWQgdG8gYHN0cmNtcCgpYCBpbiBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYC4gXG5cbk5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIG9yIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnkuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvZ2ljIGJ1Z3MpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDYwMWViNzA0OGZkMWNjMzcxOTUxZjU4YWYwMGNjMjUwZjllMmJhYzMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAxMCAyMTozOTozNyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDdlMWQ1YTVkNjUxMWUuLmY3M2EyZWE0MjU1NzEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTk3MywyMSAmIzQzOzE5NzMsMzkgQEAgaW50IG5mc2RfbmxfdmVyc2lvbl9nZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCXJldHVybiBlcnI7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFRyYW5zcG9ydCBjbGFzc2VzIE5GU0Qga25vd3MgaG93IHRvIGluc3RhbnRpYXRlLiBWZXR0aW5nIHRoZSBuYW1lIGhlcmUKJiM0MzsgKiBrZWVwcyBhIGJvZ3VzIHN0cmluZyBmcm9tIHJlYWNoaW5nIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCksIHdoZXJlIGFuCiYjNDM7ICogdW5rbm93biBuYW1lIHRyaWdnZXJzIGEgcmVxdWVzdF9tb2R1bGUoJiMzNDtzdmMlcyYjMzQ7LCBuYW1lKSB1cGNhbGwgdW5kZXIKJiM0MzsgKiBuZnNkX211dGV4LgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdXBwb3J0ZWRbXSA9IHsgJiMzNDt0Y3AmIzM0OywgJiMzNDt1ZHAmIzM0OywgJiMzNDtyZG1hJiMzNDsgfTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKHN1cHBvcnRlZCk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKCFzdHJjbXAobmFtZSwgc3VwcG9ydGVkW2ldKSkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKiBVcHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBhIHNpbmdsZSByZXF1ZXN0IG1heSBjYXJyeS4gKi8KJiM0MzsjZGVmaW5lIE5GU0RfTkxfTElTVEVORVJfTUFYCTEwMjQKJiM0MzsKIC8qKgogICogbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMgLSBzYW5pdHktY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgZnJvbSB1c2VybGFuZAogICogQGluZm86IG5ldGxpbmsgbWV0YWRhdGEgYW5kIGNvbW1hbmQgYXJndW1lbnRzCiAgKgotICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCBlYWNoIGVudHJ5Ci0gKiBpcyB3ZWxsLWZvcm1lZDogaXQgcGFyc2VzIGFnYWluc3QgdGhlIHBvbGljeSwgY2FycmllcyBib3RoIGFuIGFkZHJlc3MgYW5kCi0gKiBhIHRyYW5zcG9ydCBuYW1lLCBhbmQgdGhlIGFkZHJlc3MgaXMgbG9uZyBlbm91Z2ggZm9yIGl0cyBmYW1pbHkuIERvaW5nCi0gKiB0aGlzIHVwIGZyb250IGxldHMgdGhlIGNhbGxlcnMgYmVsb3cgYXNzdW1lIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkIGFuZAotICogZ3VhcmFudGVlcyB3ZSBtYWtlIG5vIGNoYW5nZXMgd2hlbiB0aGUgcmVxdWVzdCBpcyBtYWxmb3JtZWQuCiYjNDM7ICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCB0aGUgbGlzdCBpcwomIzQzOyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC4KICAqCiAgKiBSZXR1cm46IDAgaWYgZXZlcnkgZW50cnkgaXMgdmFsaWQsIG9yIGEgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cjsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAlpbnQgcmVtOwogCiAJbmxtc2dfZm9yX2VhY2hfYXR0cl90eXBlKGF0dHIsIE5GU0RfQV9TRVJWRVJfU09DS19BRERSLCBpbmZvLSZndDtubGhkciwKQEAgLTE5OTYsNiAmIzQzOzIwMTQsMTEgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCQlzdHJ1Y3Qgc29ja2FkZHIgKnNhOwogCQlpbnQgZXJyOwogCiYjNDM7CQlpZiAoJiM0MzsmIzQzO2NvdW50ICZndDsgTkZTRF9OTF9MSVNURU5FUl9NQVgpIHsKJiM0MzsJCQlOTF9TRVRfRVJSX01TRyhpbmZvLSZndDtleHRhY2ssICYjMzQ7dG9vIG1hbnkgbGlzdGVuZXJzJiMzNDspOwomIzQzOwkJCXJldHVybiAtRTJCSUc7CiYjNDM7CQl9CiYjNDM7CiAJCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5GU0RfQV9TT0NLX01BWCwgYXR0ciwKIAkJCQkgICAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby0mZ3Q7ZXh0YWNrKTsKIAkJaWYgKGVyciAmbHQ7IDApCkBAIC0yMDA0LDYgJiM0MzsyMDI3LDkgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCQlpZiAoIXRiW05GU0RfQV9TT0NLX0FERFJdIHx8ICF0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAomIzQzOwkJaWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpCiYjNDM7CQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiYjNDM7CiAJCXNhID0gbmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfQUREUl0pOwogCQlpZiAobmxhX2xlbih0YltORlNEX0FfU09DS19BRERSXSkgJmx0OyBzaXplb2Yoc2EtJmd0O3NhX2ZhbWlseSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIxNTYsOCAmIzQzOzIxODIsMTIgQEAgaW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIAkJcmV0ID0gc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2Eoc2VydiwgeGNsX25hbWUsIG5ldCwgc2EsIDAsCiAJCQkJCSAgICAgIGN1cnJlbnRfY3JlZCgpKTsKIAkJLyogYWx3YXlzIHNhdmUgdGhlIGxhdGVzdCBlcnJvciAqLwotCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWlmIChyZXQgJmx0OyAwKSB7CiYjNDM7CQkJTkxfU0VUX0VSUl9NU0dfRk1UKGluZm8tJmd0O2V4dGFjaywKJiM0MzsJCQkJCSAgICYjMzQ7Y2Fubm90IGNyZWF0ZSAlcyBsaXN0ZW5lcjogJWQmIzM0OywKJiM0MzsJCQkJCSAgIHhjbF9uYW1lLCByZXQpOwogCQkJZXJyID0gcmV0OwomIzQzOwkJfQogCX0KIAogCWlmICghc2Vydi0mZ3Q7c3ZfbnJ0aHJlYWRzICZhbXA7JmFtcDsgbGlzdF9lbXB0eSgmYW1wO25uLSZndDtuZnNkX3NlcnYtJmd0O3N2X3Blcm1zb2NrcykpCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCA2YWEzNzIxODhjODZhLi4wYWEzNzZiODJhNTI2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTIyMSw2ICYjNDM7MjIxLDE2IEBAIHN0YXRpYyB2b2lkIHJwY2Jfc2V0X2xvY2FsKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHJwY19jbG50ICpjbG50LAogIyBkZWZpbmUgU1VOX0xFTihwdHIpIChvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKQkJXAogCQkgICAgICAmIzQzOyAxICYjNDM7IHN0cmxlbigocHRyKS0mZ3Q7c3VuX3BhdGggJiM0MzsgMSkpCiAKJiM0MzsvKgomIzQzOyAqIFRoZSBrZXJuZWwmIzM5O3MgcnBjYmluZCBjbGllbnQgdGFsa3Mgb25seSB0byB0aGUgbG9jYWwgcnBjYmluZCwgb3ZlciBsb29wYmFjawomIzQzOyAqIG9yIGEgbG9jYWwgQUZfTE9DQUwgc29ja2V0LCB3aGVyZSBhIGhlYWx0aHkgcnBjYmluZCBhbnN3ZXJzIGluIG1pY3Jvc2Vjb25kcy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHJwY190aW1lb3V0IHJwY2JfbG9jYWxfdGltZW91dCA9IHsKJiM0MzsJLnRvX2luaXR2YWwJPSAxICogSFosCiYjNDM7CS50b19tYXh2YWwJPSAxICogSFosCiYjNDM7CS50b19yZXRyaWVzCT0gMCwKJiM0Mzt9OwomIzQzOwogLyoKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQogICogaXMgcmV0dXJuZWQuCkBAIC0yMzgsNiAmIzQzOzI0OCw3IEBAIHN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfYWZfbG9jYWwoc3RydWN0IG5ldCAqbmV0LAogCQkudmVyc2lvbgk9IFJQQ0JWRVJTXzIsCiAJCS5hdXRoZmxhdm9yCT0gUlBDX0FVVEhfTlVMTCwKIAkJLmNyZWQJCT0gY3VycmVudF9jcmVkKCksCiYjNDM7CQkudGltZW91dAk9ICZhbXA7cnBjYl9sb2NhbF90aW1lb3V0LAogCQkvKgogCQkgKiBXZSB0dXJuIG9mZiB0aGUgaWRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGtlcm5lbAogCQkgKiBmcm9tIGF1dG9tYXRpY2FsbHkgZGlzY29ubmVjdGluZyB0aGUgc29ja2V0LgpAQCAtMzEyLDYgJiM0MzszMjMsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX25ldChzdHJ1Y3QgbmV0ICpuZXQpCiAJCS52ZXJzaW9uCT0gUlBDQlZFUlNfMiwKIAkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9VTklYLAogCQkuY3JlZAkJPSBjdXJyZW50X2NyZWQoKSwKJiM0MzsJCS50aW1lb3V0CT0gJmFtcDtycGNiX2xvY2FsX3RpbWVvdXQsCiAJCS5mbGFncwkJPSBSUENfQ0xOVF9DUkVBVEVfTk9QSU5HLAogCX07CiAJc3RydWN0IHJwY19jbG50ICpjbG50LCAqY2xudDQ7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCAwNWMzZTZlMmY2NTk0Li5lOWNmY2ViMWEzMzQyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTEyMDgsMTMgJiM0MzsxMjA4LDE2IEBAIGludCBzdmNfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBzdHJ1Y3QgbmV0ICpuZXQsCiAJCXN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZ3AgPSAmYW1wO3NlcnYtJmd0O3N2X3Byb2dyYW1zW3BdOwogCiAJCWZvciAoaSA9IDA7IGkgJmx0OyBwcm9ncC0mZ3Q7cGdfbnZlcnM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaW50IHJldDsKIAotCQkJZXJyb3IgPSBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSwKJiM0MzsJCQlyZXQgPSBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSwKIAkJCQkJZmFtaWx5LCBwcm90bywgcG9ydCk7Ci0JCQlpZiAoZXJyb3IgJmx0OyAwKSB7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICYjMzQ7c3ZjOiBmYWlsZWQgdG8gcmVnaXN0ZXIgJiMzNDsKIAkJCQkJJiMzNDslc3YldSBSUEMgc2VydmljZSAoZXJybm8gJWQpLlxuJiMzNDssCi0JCQkJCXByb2dwLSZndDtwZ19uYW1lLCBpLCAtZXJyb3IpOwomIzQzOwkJCQkJcHJvZ3AtJmd0O3BnX25hbWUsIGksIC1yZXQpOwomIzQzOwkJCQlpZiAoIWVycm9yKQomIzQzOwkJCQkJZXJyb3IgPSByZXQ7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKaW5kZXggODQzNDNmZDFlMzU0Yi4uNDYwNTA4ZGU5Mzc0ZiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKQEAgLTg5LDYgJiM0Mzs4OSw3IEBAIFRBUkdFVFMgJiM0Mzs9IG5ldC9wYWNrZXRkcmlsbAogVEFSR0VUUyAmIzQzOz0gbmV0L3BwcAogVEFSR0VUUyAmIzQzOz0gbmV0L3JkcwogVEFSR0VUUyAmIzQzOz0gbmV0L3RjcF9hbwomIzQzO1RBUkdFVFMgJiM0Mzs9IG5mc2QKIFRBUkdFVFMgJiM0Mzs9IG5vbGliYwogVEFSR0VUUyAmIzQzOz0gcGNpX2VuZHBvaW50CiBUQVJHRVRTICYjNDM7PSBwY2llX2J3Y3RybApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE5ZTZkZWMwNGQ4ZTkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmUKQEAgLTAsMCAmIzQzOzEgQEAKJiM0MztuZnNkX25ldGxpbmtfbGlzdGVuZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1YWM2NTU0OWQyNTkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlCkBAIC0wLDAgJiM0MzsxLDYgQEAKJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7Q0ZMQUdTICYjNDM7PSAkKEtIRFJfSU5DTFVERVMpIC1XYWxsCiYjNDM7CiYjNDM7VEVTVF9HRU5fUFJPR1MgOj0gbmZzZF9uZXRsaW5rX2xpc3RlbmVyCiYjNDM7CiYjNDM7aW5jbHVkZSAuLi9saWIubWsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uZTY5NDVmZjk1NTFjNAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnCkBAIC0wLDAgJiM0MzsxLDQgQEAKJiM0MztDT05GSUdfTkVUX05TPXkKJiM0MztDT05GSUdfSVBWNj15CiYjNDM7Q09ORklHX05GU0Q9eQomIzQzO0NPTkZJR19ORlNEX1Y0PXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlMzMwNzY4MGQ3ZDQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jCkBAIC0wLDAgJiM0MzsxLDkyMCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBSZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUgTkZTRCBnZW5lcmljLW5ldGxpbmsgbGlzdGVuZXIgaW50ZXJmYWNlCiYjNDM7ICogKE5GU0RfQ01EX0xJU1RFTkVSX1NFVCAvIE5GU0RfQ01EX0xJU1RFTkVSX0dFVCkuCiYjNDM7ICoKJiM0MzsgKiBUaHJlZSBncm91cHM6CiYjNDM7ICogICB2YWxpZGF0aW9uICAtIG1hbGZvcm1lZC9hYnVzaXZlIExJU1RFTkVSX1NFVCByZXF1ZXN0cyBhcmUgcmVqZWN0ZWQgYnkKJiM0MzsgKiAgICAgICAgICAgICAgICAgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwgYmVmb3JlIG5mc2RfbXV0ZXggaXMgdGFrZW4uCiYjNDM7ICogICBmdW5jdGlvbmFsICAtIGNyZWF0ZS9hZGQvcmVtb3ZlIGxpc3RlbmVycyBhbmQgdmVyaWZ5IExJU1RFTkVSX0dFVAomIzQzOyAqICAgICAgICAgICAgICAgICByZWZsZWN0cyB0aGUgc2V0IChyb3VuZC10cmlwIG9mIHRyYW5zcG9ydCAmIzQzOyBhZGRyOnBvcnQpLgomIzQzOyAqICAgc2VtYW50aWNzICAgLSBvbmNlIHRocmVhZHMgYXJlIHJ1bm5pbmcgKFRIUkVBRFNfU0VUKSBhIGxpc3RlbmVyIGNoYW5nZQomIzQzOyAqICAgICAgICAgICAgICAgICBpcyByZWZ1c2VkIHdpdGggLUVCVVNZLgomIzQzOyAqCiYjNDM7ICogRWFjaCB0ZXN0IHJ1bnMgaW4gaXRzIG93biBwcml2YXRlIG5ldCAmIzQzOyBtb3VudCBuYW1lc3BhY2UgKHVuc2hhcmUgaW4KJiM0MzsgKiBGSVhUVVJFX1NFVFVQKS4gL3J1biBpcyBtYXNrZWQgdGhlcmU6IGEgcGF0aG5hbWUgQUZfTE9DQUwgY29ubmVjdCBpcyBub3QKJiM0MzsgKiBzY29wZWQgYnkgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBzaW5jZSB1bml4X2ZpbmRfYnNkKCkgcmVzb2x2ZXMgYnkgaW5vZGUKJiM0MzsgKiBhbmQgdGFrZXMgbm8gc3RydWN0IG5ldCwgc28gdGhlIGtlcm5lbCYjMzk7cyBycGNiaW5kIGNsaWVudCB3b3VsZCBvdGhlcndpc2UgYmUKJiM0MzsgKiBhYmxlIHRvIHJlYWNoIHRoZSBycGNiaW5kIHJ1bm5pbmcgb24gdGhlIGhvc3QuIEFueXRoaW5nIHRoYXQgY3JlYXRlcyBhCiYjNDM7ICogc2VydiBpcyBzZXJ2ZWQgYnkgdGhlIHBlci1uZXRucyBycGNiaW5kIHN0dWIgYmVsb3cgaW5zdGVhZC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3BvbGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2NoZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGRlZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpbnQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21vdW50LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9wcmN0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc29ja2V0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bmV0L2lmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O25ldGluZXQvaW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbmV0bGluay5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9nZW5ldGxpbmsuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0Oy4uL2tzZWxmdGVzdF9oYXJuZXNzLmgmIzM0OwomIzQzOwomIzQzOy8qIE5GU0QgZ2VuZXJpYy1uZXRsaW5rIGNvbnN0YW50cyAoZnJvbSBsaW51eC9uZnNkX25ldGxpbmsuaCkuICovCiYjNDM7I2RlZmluZSBORlNEX0ZBTUlMWV9OQU1FCQkmIzM0O25mc2QmIzM0OwomIzQzOyNkZWZpbmUgTkZTRF9DTURfVEhSRUFEU19TRVQJCTIKJiM0MzsjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX1NFVAkJNgomIzQzOyNkZWZpbmUgTkZTRF9DTURfTElTVEVORVJfR0VUCQk3CiYjNDM7I2RlZmluZSBORlNEX0FfU0VSVkVSX1RIUkVBRFMJCTEKJiM0MzsjZGVmaW5lIE5GU0RfQV9TRVJWRVJfU09DS19BRERSCQkxCS8qIHBlci1saXN0ZW5lciBuZXN0ICovCiYjNDM7I2RlZmluZSBORlNEX0FfU09DS19BRERSCQkxCS8qIGluc2lkZSB0aGUgbmVzdCAqLwomIzQzOyNkZWZpbmUgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUJMgkvKiBpbnNpZGUgdGhlIG5lc3QgKi8KJiM0MzsKJiM0MzsjZGVmaW5lIE5MQV9BTElHTjQobGVuKQkJCSgoKGxlbikgJiM0MzsgMykgJmFtcDsgfjMpCiYjNDM7I2RlZmluZSBURVNUX1BPUlQJCQkyMDA0OQomIzQzOyNkZWZpbmUgTUFYX0xJU1RFTkVSUwkJCTgKJiM0MzsjZGVmaW5lIFJFQ1ZfVElNRU9fU0VDCQkJMzAKJiM0MzsKJiM0MztzdGF0aWMgaW50IG5mc2RfZmFtaWx5OwkJCS8qIHNldCBwZXItdGVzdCBpbiBGSVhUVVJFX1NFVFVQICovCiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKm1zZykKJiM0Mzt7CiYjNDM7CXBlcnJvcihtc2cpOwomIzQzOwlleGl0KDEpOwomIzQzO30KJiM0MzsKJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIG1pbmltYWwgZ2VuZXJpYy1uZXRsaW5rIHBsdW1iaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdlbmxfb3Blbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX25sIHNhID0geyAubmxfZmFtaWx5ID0gQUZfTkVUTElOSyB9OwomIzQzOwlzdHJ1Y3QgdGltZXZhbCB0diA9IHsgLnR2X3NlYyA9IFJFQ1ZfVElNRU9fU0VDIH07CiYjNDM7CWludCBmZCA9IHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19HRU5FUklDKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NvY2tldChORVRMSU5LX0dFTkVSSUMpJiMzNDspOwomIzQzOwlpZiAoYmluZChmZCwgKHZvaWQgKikmYW1wO3NhLCBzaXplb2Yoc2EpKSAmbHQ7IDApCiYjNDM7CQlkaWUoJiMzNDtiaW5kKG5ldGxpbmspJiMzNDspOwomIzQzOwlzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJmFtcDt0diwgc2l6ZW9mKHR2KSk7CiYjNDM7CXJldHVybiBmZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQXBwZW5kIGFuIGF0dHJpYnV0ZSBhdCBAb2ZmOyByZXR1cm4gdGhlIG5ldyAoYWxpZ25lZCkgb2Zmc2V0LiAqLwomIzQzO3N0YXRpYyBpbnQgcHV0X2F0dHIoY2hhciAqYnVmLCBpbnQgb2ZmLCB1aW50MTZfdCB0eXBlLAomIzQzOwkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbmxhdHRyICpuYSA9ICh2b2lkICopKGJ1ZiAmIzQzOyBvZmYpOwomIzQzOwomIzQzOwluYS0mZ3Q7bmxhX3R5cGUgPSB0eXBlOwomIzQzOwluYS0mZ3Q7bmxhX2xlbiA9IE5MQV9IRFJMRU4gJiM0MzsgbGVuOwomIzQzOwlpZiAobGVuKQomIzQzOwkJbWVtY3B5KGJ1ZiAmIzQzOyBvZmYgJiM0MzsgTkxBX0hEUkxFTiwgZGF0YSwgbGVuKTsKJiM0MzsJcmV0dXJuIG9mZiAmIzQzOyBOTEFfQUxJR040KE5MQV9IRFJMRU4gJiM0MzsgbGVuKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQnVpbGQgYSBnZW5sIG1lc3NhZ2UgaGVhZGVyIGludG8gQGJ1ZjsgcmV0dXJuIHRoZSBvZmZzZXQgcGFzdCBpdC4gKi8KJiM0MztzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKQomIzQzO3sKJiM0MzsJc3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjsKJiM0MzsJc3RydWN0IGdlbmxtc2doZHIgKmdubCA9ICh2b2lkICopKGJ1ZiAmIzQzOyBOTE1TR19IRFJMRU4pOwomIzQzOwomIzQzOwltZW1zZXQoYnVmLCAwLCBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU4pOwomIzQzOwlubGgtJmd0O25sbXNnX3R5cGUgPSB0eXBlOwomIzQzOwlubGgtJmd0O25sbXNnX2ZsYWdzID0gZmxhZ3M7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfc2VxID0gMTsKJiM0MzsJZ25sLSZndDtjbWQgPSBjbWQ7CiYjNDM7CWdubC0mZ3Q7dmVyc2lvbiA9IDE7CiYjNDM7CXJldHVybiBOTE1TR19IRFJMRU4gJiM0MzsgR0VOTF9IRFJMRU47CiYjNDM7fQomIzQzOwomIzQzOy8qIFNlbmQgYW4gbmZzZCBjb21tYW5kIHdpdGggYW4gQUNLOyByZXR1cm4gdGhlIEFDSyBlcnJubyAoJmx0Oz0gMCkuICovCiYjNDM7c3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKQomIzQzO3sKJiM0MzsJY2hhciBidWZbMSAmbHQ7Jmx0OyAyMF0sIHJidWZbNDA5Nl07CiYjNDM7CXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7CiYjNDM7CWludCBmZCA9IGdlbmxfb3BlbigpOwomIzQzOwlpbnQgb2ZmLCBuLCByZXQ7CiYjNDM7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0ssIGNtZCk7CiYjNDM7CWlmIChhdHRyc19sZW4pIHsKJiM0MzsJCW1lbWNweShidWYgJiM0Mzsgb2ZmLCBhdHRycywgYXR0cnNfbGVuKTsKJiM0MzsJCW9mZiAmIzQzOz0gYXR0cnNfbGVuOwomIzQzOwl9CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoZ2VubCkmIzM0Oyk7CiYjNDM7CiYjNDM7CW4gPSByZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApOwomIzQzOwlpZiAobiAmbHQ7IDApCiYjNDM7CQlyZXQgPSAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSA/IC1FVElNRURPVVQgOiAtZXJybm87CiYjNDM7CWVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktJmd0O25sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpCiYjNDM7CQlyZXQgPSAoKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEocmJ1ZikpLSZndDtlcnJvcjsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gMDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKiBTZW5kIGEgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBmdWxsIHJlcGx5IG1lc3NhZ2U7IC1lcnJubyBvbiBmYWlsdXJlLiAqLwomIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXF1ZXN0X3JlcGx5KHVpbnQ4X3QgY21kLCBjaGFyICpyYnVmLCBzaXplX3QgcmxlbikKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzI1Nl07CiYjNDM7CXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7CiYjNDM7CWludCBmZCA9IGdlbmxfb3BlbigpOwomIzQzOwlpbnQgb2ZmLCBuLCByZXQ7CiYjNDM7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QsIGNtZCk7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoZ2VubCByZXBseSkmIzM0Oyk7CiYjNDM7CiYjNDM7CW4gPSByZWN2KGZkLCByYnVmLCBybGVuLCAwKTsKJiM0MzsJaWYgKG4gJmx0OyAwKQomIzQzOwkJcmV0ID0gKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgPyAtRVRJTUVET1VUIDogLWVycm5vOwomIzQzOwllbHNlIGlmICgoKHN0cnVjdCBubG1zZ2hkciAqKXJidWYpLSZndDtubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKQomIzQzOwkJcmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS0mZ3Q7ZXJyb3I7CiYjNDM7CWVsc2UKJiM0MzsJCXJldCA9IG47CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVzb2x2ZSB0aGUgJiMzNDtuZnNkJiMzNDsgZ2VubCBmYW1pbHkgaWQ7IC0xIGlmIG5vdCByZWdpc3RlcmVkLiAqLwomIzQzO3N0YXRpYyBpbnQgZ2VubF9yZXNvbHZlX25mc2Qodm9pZCkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmWzEwMjRdLCByYnVmWzQwOTZdOwomIzQzOwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmOwomIzQzOwlzdHJ1Y3Qgbmxtc2doZHIgKnJoID0gKHZvaWQgKilyYnVmOwomIzQzOwlzdHJ1Y3QgbmxhdHRyICpuYTsKJiM0MzsJaW50IGZkLCBvZmYsIGxlZnQsIGlkID0gLTE7CiYjNDM7CiYjNDM7CWZkID0gZ2VubF9vcGVuKCk7CiYjNDM7CW9mZiA9IGdlbmxfaGRyKGJ1ZiwgR0VOTF9JRF9DVFJMLCBOTE1fRl9SRVFVRVNULCBDVFJMX0NNRF9HRVRGQU1JTFkpOwomIzQzOwlvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLAomIzQzOwkJICAgICAgIE5GU0RfRkFNSUxZX05BTUUsIHNpemVvZihORlNEX0ZBTUlMWV9OQU1FKSk7CiYjNDM7CW5saC0mZ3Q7bmxtc2dfbGVuID0gb2ZmOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApICZsdDsgMCkKJiM0MzsJCWRpZSgmIzM0O3NlbmQoR0VURkFNSUxZKSYjMzQ7KTsKJiM0MzsJaWYgKHJlY3YoZmQsIHJidWYsIHNpemVvZihyYnVmKSwgMCkgJmx0OyAwKQomIzQzOwkJZGllKCYjMzQ7cmVjdihHRVRGQU1JTFkpJiMzNDspOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWlmIChyaC0mZ3Q7bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJbmEgPSAodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEocmgpICYjNDM7IEdFTkxfSERSTEVOKTsKJiM0MzsJbGVmdCA9IHJoLSZndDtubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjsKJiM0MzsJd2hpbGUgKGxlZnQgJmd0Oz0gKGludClOTEFfSERSTEVOKSB7CiYjNDM7CQlpZiAobmEtJmd0O25sYV90eXBlID09IENUUkxfQVRUUl9GQU1JTFlfSUQpIHsKJiM0MzsJCQlpZCA9ICoodWludDE2X3QgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfSERSTEVOKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWxlZnQgLT0gTkxBX0FMSUdONChuYS0mZ3Q7bmxhX2xlbik7CiYjNDM7CQluYSA9ICh2b2lkICopKChjaGFyICopbmEgJiM0MzsgTkxBX0FMSUdONChuYS0mZ3Q7bmxhX2xlbikpOwomIzQzOwl9CiYjNDM7CXJldHVybiBpZDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBsaXN0ZW5lciByZXF1ZXN0IGJ1aWxkZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MzsvKiBGaW5lLWdyYWluZWQgY29udHJvbCBmb3IgbmVnYXRpdmUgdGVzdHM6IGFueSBmaWVsZCBjYW4gYmUgb21pdHRlZC9tYWxmb3JtZWQuICovCiYjNDM7c3RydWN0IHJhd19saXN0ZW5lciB7CiYjNDM7CWNvbnN0IGNoYXIgKnhwcnQ7CS8qIE5VTEwgLSZndDsgb21pdCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSAqLwomIzQzOwlpbnQgZW1pdF9hZGRyOwkJLyogMCAtJmd0OyBvbWl0IE5GU0RfQV9TT0NLX0FERFIgKi8KJiM0MzsJY29uc3Qgdm9pZCAqYWRkcjsKJiM0MzsJaW50IGFkZHJfbGVuOwkJLyogYnl0ZXMgdG8gZW1pdCBmb3IgTkZTRF9BX1NPQ0tfQUREUiAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBwdXRfcmF3X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3Qgc3RydWN0IHJhd19saXN0ZW5lciAqcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBubGF0dHIgKm5lc3QgPSAodm9pZCAqKShidWYgJiM0Mzsgb2ZmKTsKJiM0MzsJaW50IGlubmVyID0gb2ZmICYjNDM7IE5MQV9IRFJMRU47CiYjNDM7CiYjNDM7CWlmIChyLSZndDtlbWl0X2FkZHIpCiYjNDM7CQlpbm5lciA9IHB1dF9hdHRyKGJ1ZiwgaW5uZXIsIE5GU0RfQV9TT0NLX0FERFIsIHItJmd0O2FkZHIsIHItJmd0O2FkZHJfbGVuKTsKJiM0MzsJaWYgKHItJmd0O3hwcnQpCiYjNDM7CQlpbm5lciA9IHB1dF9hdHRyKGJ1ZiwgaW5uZXIsIE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FLAomIzQzOwkJCQkgci0mZ3Q7eHBydCwgc3RybGVuKHItJmd0O3hwcnQpICYjNDM7IDEpOwomIzQzOwluZXN0LSZndDtubGFfdHlwZSA9IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIHwgTkxBX0ZfTkVTVEVEOwomIzQzOwluZXN0LSZndDtubGFfbGVuID0gaW5uZXIgLSBvZmY7CiYjNDM7CXJldHVybiBvZmYgJiM0MzsgTkxBX0FMSUdONChuZXN0LSZndDtubGFfbGVuKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogV2VsbC1mb3JtZWQgbG9vcGJhY2sgbGlzdGVuZXIgZm9yIEBmYW1pbHkgKEFGX0lORVQgb3IgQUZfSU5FVDYpLiAqLwomIzQzO3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyX2FmKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSwKJiM0MzsJCQkgICB1aW50MTZfdCBwb3J0KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7MH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSB4cHJ0LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3NzIH07CiYjNDM7CiYjNDM7CWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnM2ID0gKHZvaWQgKikmYW1wO3NzOwomIzQzOwomIzQzOwkJczYtJmd0O3NpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiYjNDM7CQlzNi0mZ3Q7c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7CiYjNDM7CQlzNi0mZ3Q7c2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKJiM0MzsJCXIuYWRkcl9sZW4gPSBzaXplb2YoKnM2KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXN0cnVjdCBzb2NrYWRkcl9pbiAqczQgPSAodm9pZCAqKSZhbXA7c3M7CiYjNDM7CiYjNDM7CQlzNC0mZ3Q7c2luX2ZhbWlseSA9IEFGX0lORVQ7CiYjNDM7CQlzNC0mZ3Q7c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKJiM0MzsJCXM0LSZndDtzaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOwomIzQzOwkJci5hZGRyX2xlbiA9IHNpemVvZigqczQpOwomIzQzOwl9CiYjNDM7CXJldHVybiBwdXRfcmF3X2xpc3RlbmVyKGJ1Ziwgb2ZmLCAmYW1wO3IpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHB1dF9saXN0ZW5lcihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IGNoYXIgKnhwcnQsIHVpbnQxNl90IHBvcnQpCiYjNDM7ewomIzQzOwlyZXR1cm4gcHV0X2xpc3RlbmVyX2FmKGJ1Ziwgb2ZmLCB4cHJ0LCBBRl9JTkVULCBwb3J0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBMSVNURU5FUl9HRVQgcGFyc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7c3RydWN0IGxpc3RlbmVyX2VudCB7CiYjNDM7CWNoYXIgeHBydFsxNl07CiYjNDM7CWludCBmYW1pbHk7CiYjNDM7CXVpbnQxNl90IHBvcnQ7CiYjNDM7CXN0cnVjdCBpbl9hZGRyIGE0OwomIzQzOwlzdHJ1Y3QgaW42X2FkZHIgYTY7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHBhcnNlX2xpc3RlbmVyX2dldChjb25zdCBjaGFyICpyYnVmLCBpbnQgbGVuLAomIzQzOwkJCSAgICAgIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKm91dCwgaW50IG1heCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHZvaWQgKilyYnVmOwomIzQzOwljb25zdCBzdHJ1Y3QgbmxhdHRyICpuYTsKJiM0MzsJaW50IGxlZnQsIGNvdW50ID0gMDsKJiM0MzsKJiM0MzsJKHZvaWQpbGVuOwomIzQzOwluYSA9IChjb25zdCB2b2lkICopKHJidWYgJiM0MzsgTkxNU0dfSERSTEVOICYjNDM7IEdFTkxfSERSTEVOKTsKJiM0MzsJbGVmdCA9IG5saC0mZ3Q7bmxtc2dfbGVuIC0gTkxNU0dfSERSTEVOIC0gR0VOTF9IRFJMRU47CiYjNDM7CiYjNDM7CXdoaWxlIChsZWZ0ICZndDs9IChpbnQpTkxBX0hEUkxFTikgewomIzQzOwkJaW50IGFsZW4gPSBuYS0mZ3Q7bmxhX2xlbjsKJiM0MzsKJiM0MzsJCWlmICgobmEtJmd0O25sYV90eXBlICZhbXA7IE5MQV9UWVBFX01BU0spID09IE5GU0RfQV9TRVJWRVJfU09DS19BRERSICZhbXA7JmFtcDsKJiM0MzsJCSAgICBjb3VudCAmbHQ7IG1heCkgewomIzQzOwkJCWNvbnN0IHN0cnVjdCBubGF0dHIgKmluID0gKGNvbnN0IHZvaWQgKikoKGNoYXIgKiluYSAmIzQzOyBOTEFfSERSTEVOKTsKJiM0MzsJCQlpbnQgaWxlZnQgPSBhbGVuIC0gTkxBX0hEUkxFTjsKJiM0MzsJCQlzdHJ1Y3QgbGlzdGVuZXJfZW50ICplID0gJmFtcDtvdXRbY291bnRdOwomIzQzOwomIzQzOwkJCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKJiM0MzsJCQl3aGlsZSAoaWxlZnQgJmd0Oz0gKGludClOTEFfSERSTEVOKSB7CiYjNDM7CQkJCWNvbnN0IHZvaWQgKmQgPSAoY29uc3QgY2hhciAqKWluICYjNDM7IE5MQV9IRFJMRU47CiYjNDM7CQkJCWludCB0ID0gaW4tJmd0O25sYV90eXBlICZhbXA7IE5MQV9UWVBFX01BU0s7CiYjNDM7CiYjNDM7CQkJCWlmICh0ID09IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FKSB7CiYjNDM7CQkJCQlzdHJuY3B5KGUtJmd0O3hwcnQsIGQsIHNpemVvZihlLSZndDt4cHJ0KSAtIDEpOwomIzQzOwkJCQl9IGVsc2UgaWYgKHQgPT0gTkZTRF9BX1NPQ0tfQUREUikgewomIzQzOwkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzID0gZDsKJiM0MzsKJiM0MzsJCQkJCWUtJmd0O2ZhbWlseSA9IHNzLSZndDtzc19mYW1pbHk7CiYjNDM7CQkJCQlpZiAoc3MtJmd0O3NzX2ZhbWlseSA9PSBBRl9JTkVUKSB7CiYjNDM7CQkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzID0gZDsKJiM0MzsKJiM0MzsJCQkJCQllLSZndDthNCA9IHMtJmd0O3Npbl9hZGRyOwomIzQzOwkJCQkJCWUtJmd0O3BvcnQgPSBudG9ocyhzLSZndDtzaW5fcG9ydCk7CiYjNDM7CQkJCQl9IGVsc2UgaWYgKHNzLSZndDtzc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKJiM0MzsJCQkJCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzID0gZDsKJiM0MzsKJiM0MzsJCQkJCQllLSZndDthNiA9IHMtJmd0O3NpbjZfYWRkcjsKJiM0MzsJCQkJCQllLSZndDtwb3J0ID0gbnRvaHMocy0mZ3Q7c2luNl9wb3J0KTsKJiM0MzsJCQkJCX0KJiM0MzsJCQkJfQomIzQzOwkJCQlpbGVmdCAtPSBOTEFfQUxJR040KGluLSZndDtubGFfbGVuKTsKJiM0MzsJCQkJaW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKWluICYjNDM7IE5MQV9BTElHTjQoaW4tJmd0O25sYV9sZW4pKTsKJiM0MzsJCQl9CiYjNDM7CQkJY291bnQmIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJbGVmdCAtPSBOTEFfQUxJR040KGFsZW4pOwomIzQzOwkJbmEgPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICYjNDM7IE5MQV9BTElHTjQoYWxlbikpOwomIzQzOwl9CiYjNDM7CXJldHVybiBjb3VudDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZW5pZW5jZSB3cmFwcGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7c3RhdGljIGludCBsaXN0ZW5lcl9zZXQoY29uc3QgY2hhciAqYXR0cnMsIGludCBsZW4pCiYjNDM7ewomIzQzOwlyZXR1cm4gZ2VubF9yZXF1ZXN0KE5GU0RfQ01EX0xJU1RFTkVSX1NFVCwgYXR0cnMsIGxlbik7CiYjNDM7fQomIzQzOwomIzQzOy8qIEZldGNoIHRoZSBjdXJyZW50IGxpc3RlbmVyczsgcmV0dXJucyBjb3VudCAoJmd0Oz0wKSBvciAtZXJybm8uICovCiYjNDM7c3RhdGljIGludCBsaXN0ZW5lcl9nZXQoc3RydWN0IGxpc3RlbmVyX2VudCAqb3V0LCBpbnQgbWF4KQomIzQzO3sKJiM0MzsJY2hhciByYnVmWzgxOTJdOwomIzQzOwlpbnQgbiA9IGdlbmxfcmVxdWVzdF9yZXBseShORlNEX0NNRF9MSVNURU5FUl9HRVQsIHJidWYsIHNpemVvZihyYnVmKSk7CiYjNDM7CiYjNDM7CWlmIChuICZsdDsgMCkKJiM0MzsJCXJldHVybiBuOwomIzQzOwlyZXR1cm4gcGFyc2VfbGlzdGVuZXJfZ2V0KHJidWYsIG4sIG91dCwgbWF4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmZpbmRfbGlzdGVuZXIoc3RydWN0IGxpc3RlbmVyX2VudCAqZSwgaW50IG4sCiYjNDM7CQkJCQkgIGNvbnN0IGNoYXIgKnhwcnQsIGludCBmYW1pbHksCiYjNDM7CQkJCQkgIHVpbnQxNl90IHBvcnQpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKGVbaV0uZmFtaWx5ID09IGZhbWlseSAmYW1wOyZhbXA7IGVbaV0ucG9ydCA9PSBwb3J0ICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc3RyY21wKGVbaV0ueHBydCwgeHBydCkpCiYjNDM7CQkJcmV0dXJuICZhbXA7ZVtpXTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIFN0YXJ0IChAbiAmZ3Q7IDApIG9yIHN0b3AgKEBuID09IDApIG5mc2QgdGhyZWFkcyBpbiB0aGlzIG5ldG5zLiAqLwomIzQzO3N0YXRpYyBpbnQgdGhyZWFkc19zZXQoaW50IG4pCiYjNDM7ewomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJdWludDMyX3QgdiA9IG47CiYjNDM7CWludCBvZmYgPSBwdXRfYXR0cihhdHRycywgMCwgTkZTRF9BX1NFUlZFUl9USFJFQURTLCAmYW1wO3YsIHNpemVvZih2KSk7CiYjNDM7CiYjNDM7CXJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfVEhSRUFEU19TRVQsIGF0dHJzLCBvZmYpOwomIzQzO30KJiM0MzsKJiM0MzsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIHBlci1uZXRucyBsb2NhbCBycGNiaW5kIHN0dWIgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogQ3JlYXRpbmcgYSBsaXN0ZW5lciByZWdpc3RlcnMgd2l0aCBycGNiaW5kOiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpCiYjNDM7ICogcGFzc2VzIGZsYWdzIG9mIDAsIHNvIHBtYXBfcmVnaXN0ZXIgaXMgdHJ1ZSBpbiBzdmNfc2V0dXBfc29ja2V0KCksIGFuZAomIzQzOyAqIG5mc2RfdmVyc2lvbjMgaXMgcmVnaXN0ZXJhYmxlIGJ5IGRlZmF1bHQgYW5kIGRvZXMgbm90IHNldCB2c19ycGNiX29wdG5sLAomIzQzOyAqIHNvIGEgcmVnaXN0cmF0aW9uIGZhaWx1cmUgYWJvcnRzIGxpc3RlbmVyIGNyZWF0aW9uLiBUaGUgYWJzdHJhY3QgQUZfTE9DQUwKJiM0MzsgKiBuYW1lIHRoZSBrZXJuZWwgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zICh1bml4X2ZpbmRfYWJzdHJhY3QoKSB0YWtlcyBhCiYjNDM7ICogc3RydWN0IG5ldCksIHNvIGFuc3dlciBpdCBoZXJlIGFuZCBzdGF5IG91dCBvZiB0aGUgaG9zdCYjMzk7cyBycGNiaW5kLgomIzQzOyAqCiYjNDM7ICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZAomIzQzOyAqIFNFVC9VTlNFVCBnZXQgVFJVRSwgZm9yIGJvdGggUlBDQlZFUlNfMiBhbmQgUlBDQlZFUlNfNC4gdjQgaGFzIHRvIGJlCiYjNDM7ICogYW5zd2VyZWQgYmVjYXVzZSBfX3N2Y19ycGNiX3JlZ2lzdGVyNigpIHR1cm5zIGEgdjQgcmVmdXNhbCBpbnRvCiYjNDM7ICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLgomIzQzOyAqCiYjNDM7ICogSW4gUlBDQl9TVFVCX1JFRlVTRSBtb2RlIFNFVCBpcyBhbnN3ZXJlZCBGQUxTRSBpbnN0ZWFkLCB3aGljaAomIzQzOyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seQomIzQzOyAqIHN2Y191bnJlZ2lzdGVyKCkgaXNzdWVzIGl0LCBhbmQgaXQgZGlzY2FyZHMgdGhlIHJlc3VsdC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJQQ0JfUFJPR1JBTQkJMTAwMDAwCiYjNDM7I2RlZmluZSBSUENCX1BST0NfTlVMTAkJMAomIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1NFVAkJMQomIzQzOyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUCQkyCiYjNDM7I2RlZmluZSBSUENCX0FCU1RSQUNUX05BTUUJJiMzNDsvcnVuL3JwY2JpbmQuc29jayYjMzQ7CiYjNDM7I2RlZmluZSBSUENCX1NUVUJfTUFYQ09OTgk0CiYjNDM7CiYjNDM7ZW51bSB7IFJQQ0JfU1RVQl9BQ0NFUFQsIFJQQ0JfU1RVQl9SRUZVU0UgfTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9saXN0ZW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl91biBzdW4gPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9OwomIzQzOwlzaXplX3QgbmxlbiA9IHN0cmxlbihSUENCX0FCU1RSQUNUX05BTUUpOwomIzQzOwlzb2NrbGVuX3QgYWxlbjsKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwkvKiBBYnN0cmFjdCBuYW1lcyBhcmUgbGVuZ3RoLWRlbGltaXRlZCwgc28gdGhlIGxlbmd0aCBtdXN0IG1hdGNoLiAqLwomIzQzOwltZW1jcHkoc3VuLnN1bl9wYXRoICYjNDM7IDEsIFJQQ0JfQUJTVFJBQ1RfTkFNRSwgbmxlbik7CiYjNDM7CWFsZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSAmIzQzOyAxICYjNDM7IG5sZW47CiYjNDM7CiYjNDM7CWZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYW1wO3N1biwgYWxlbikgJmx0OyAwIHx8CiYjNDM7CSAgICBsaXN0ZW4oZmQsIFJQQ0JfU1RVQl9NQVhDT05OKSAmbHQ7IDApIHsKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCiYjNDM7ewomIzQzOwlzaXplX3QgZG9uZSA9IDA7CiYjNDM7CiYjNDM7CXdoaWxlIChkb25lICZsdDsgbGVuKSB7CiYjNDM7CQlzc2l6ZV90IG4gPSByZWFkKGZkLCAoY2hhciAqKWJ1ZiAmIzQzOyBkb25lLCBsZW4gLSBkb25lKTsKJiM0MzsKJiM0MzsJCWlmIChuICZsdDs9IDApCiYjNDM7CQkJcmV0dXJuIC0xOwomIzQzOwkJZG9uZSAmIzQzOz0gbjsKJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogSGFuZGxlIG9uZSByZWNvcmQtbWFya2VkIFJQQyBjYWxsLiBSZXR1cm5zIC0xIHdoZW4gdGhlIHBlZXIgaXMgZG9uZS4gKi8KJiM0MztzdGF0aWMgaW50IHJwY2Jfc3R1Yl9jYWxsKGludCBmZCwgaW50IG1vZGUpCiYjNDM7ewomIzQzOwl1aW50MzJfdCBtYXJrLCBjYWxsWzZdLCByZXBbN107CiYjNDM7CXVuc2lnbmVkIGludCBsZW4sIG5yZXAgPSA2OwomIzQzOwlzaXplX3QgcmVwbGVuOwomIzQzOwomIzQzOwlpZiAocnBjYl9zdHViX3JlYWQoZmQsICZhbXA7bWFyaywgc2l6ZW9mKG1hcmspKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJbGVuID0gbnRvaGwobWFyaykgJmFtcDsgMHg3ZmZmZmZmZjsKJiM0MzsJaWYgKGxlbiAmbHQ7IHNpemVvZihjYWxsKSB8fCBsZW4gJmd0OyA0MDk2KQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CS8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqLwomIzQzOwlmb3IgKGxlbiAtPSBzaXplb2YoY2FsbCk7IGxlbjsgKSB7CiYjNDM7CQljaGFyIHNpbmtbMjU2XTsKJiM0MzsJCXVuc2lnbmVkIGludCBuID0gbGVuICZndDsgc2l6ZW9mKHNpbmspID8gc2l6ZW9mKHNpbmspIDogbGVuOwomIzQzOwomIzQzOwkJaWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBzaW5rLCBuKSkKJiM0MzsJCQlyZXR1cm4gLTE7CiYjNDM7CQlsZW4gLT0gbjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXBbMF0gPSBjYWxsWzBdOwkJLyogeGlkICovCiYjNDM7CXJlcFsxXSA9IGh0b25sKDEpOwkJLyogUkVQTFkgKi8KJiM0MzsJcmVwWzJdID0gaHRvbmwoMCk7CQkvKiBNU0dfQUNDRVBURUQgKi8KJiM0MzsJcmVwWzNdID0gaHRvbmwoMCk7CQkvKiB2ZXJpZmllciBmbGF2b3IgQVVUSF9OVUxMICovCiYjNDM7CXJlcFs0XSA9IGh0b25sKDApOwkJLyogdmVyaWZpZXIgbGVuZ3RoICovCiYjNDM7CXJlcFs1XSA9IGh0b25sKDApOwkJLyogU1VDQ0VTUyAqLwomIzQzOwomIzQzOwlpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7CiYjNDM7CQlyZXBbNV0gPSBodG9ubCgxKTsJLyogUFJPR19VTkFWQUlMICovCiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7CiYjNDM7CQljYXNlIFJQQ0JfUFJPQ19OVUxMOgomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSUENCX1BST0NfU0VUOgomIzQzOwkJCXJlcFs2XSA9IGh0b25sKG1vZGUgPT0gUlBDQl9TVFVCX1JFRlVTRSA/IDAgOiAxKTsKJiM0MzsJCQlucmVwID0gNzsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgUlBDQl9QUk9DX1VOU0VUOgomIzQzOwkJCXJlcFs2XSA9IGh0b25sKDEpOwkvKiBUUlVFICovCiYjNDM7CQkJbnJlcCA9IDc7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXJlcFs1XSA9IGh0b25sKDMpOwkvKiBQUk9DX1VOQVZBSUwgKi8KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXBsZW4gPSBucmVwICogc2l6ZW9mKHJlcFswXSk7CiYjNDM7CW1hcmsgPSBodG9ubCgweDgwMDAwMDAwIHwgcmVwbGVuKTsKJiM0MzsJaWYgKHdyaXRlKGZkLCAmYW1wO21hcmssIHNpemVvZihtYXJrKSkgIT0gKHNzaXplX3Qpc2l6ZW9mKG1hcmspIHx8CiYjNDM7CSAgICB3cml0ZShmZCwgcmVwLCByZXBsZW4pICE9IChzc2l6ZV90KXJlcGxlbikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBwb2xsZmQgcGZkWzEgJiM0MzsgUlBDQl9TVFVCX01BWENPTk5dOwomIzQzOwluZmRzX3QgbiA9IDEsIGk7CiYjNDM7CiYjNDM7CXBmZFswXS5mZCA9IGxmZDsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJLyogc3RvcCBwb2xsaW5nIHRoZSBsaXN0ZW5lciB3aGVuIGZ1bGwsIG9yIHBvbGwoKSBzcGlucyAqLwomIzQzOwkJcGZkWzBdLmV2ZW50cyA9IG4gJmx0OyAxICYjNDM7IFJQQ0JfU1RVQl9NQVhDT05OID8gUE9MTElOIDogMDsKJiM0MzsKJiM0MzsJCWlmIChwb2xsKHBmZCwgbiwgLTEpICZsdDsgMCkKJiM0MzsJCQlyZXR1cm47CiYjNDM7CiYjNDM7CQlpZiAocGZkWzBdLnJldmVudHMgJmFtcDsgUE9MTElOKSB7CiYjNDM7CQkJaW50IGMgPSBhY2NlcHQobGZkLCBOVUxMLCBOVUxMKTsKJiM0MzsKJiM0MzsJCQlpZiAoYyAmZ3Q7PSAwKSB7CiYjNDM7CQkJCXBmZFtuXS5mZCA9IGM7CiYjNDM7CQkJCXBmZFtuXS5ldmVudHMgPSBQT0xMSU47CiYjNDM7CQkJCW4mIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZvciAoaSA9IDE7IGkgJmx0OyBuOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICghKHBmZFtpXS5yZXZlbnRzICZhbXA7IChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikpKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlpZiAocnBjYl9zdHViX2NhbGwocGZkW2ldLmZkLCBtb2RlKSkgewomIzQzOwkJCQljbG9zZShwZmRbaV0uZmQpOwomIzQzOwkJCQlwZmRbaV0gPSBwZmRbLS1uXTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmV0dXJucyB0aGUgc3R1YiYjMzk7cyBwaWQsIG9yIC0xLiBUaGUgc29ja2V0IGlzIGxpc3RlbmluZyBiZWZvcmUgd2UgZm9yay4gKi8KJiM0MztzdGF0aWMgcGlkX3QgcnBjYl9zdHViX3N0YXJ0KGludCBtb2RlKQomIzQzO3sKJiM0MzsJaW50IGxmZCA9IHJwY2Jfc3R1Yl9saXN0ZW4oKTsKJiM0MzsJcGlkX3QgcGlkOwomIzQzOwomIzQzOwlpZiAobGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlpZiAocGlkICZsdDsgMCkgewomIzQzOwkJY2xvc2UobGZkKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZiAocGlkID09IDApIHsKJiM0MzsJCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKJiM0MzsJCXByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpOwomIzQzOwkJaWYgKGdldHBwaWQoKSA9PSAxKQkJLyogcmFjZWQgd2l0aCBwYXJlbnQgZXhpdCAqLwomIzQzOwkJCV9leGl0KDApOwomIzQzOwkJcnBjYl9zdHViX3NlcnZlKGxmZCwgbW9kZSk7CiYjNDM7CQlfZXhpdCgwKTsKJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZShsZmQpOwomIzQzOwlyZXR1cm4gcGlkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN3YXAgdGhlIHN0dWIgZm9yIG9uZSBpbiBAbW9kZS4gU2FmZSBiZWZvcmUgdGhlIGZpcnN0IHJlcXVlc3Q6IG5vIHNlcnYKJiM0MzsgKiBleGlzdHMgeWV0LCBzbyB0aGUga2VybmVsIGhhcyBub3QgY29ubmVjdGVkIGFuZCB0aGUgYWJzdHJhY3QgbmFtZSBpcyBmcmVlCiYjNDM7ICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcnBjYl9zdHViX3Jlc3RhcnQocGlkX3QgKnBpZCwgaW50IG1vZGUpCiYjNDM7ewomIzQzOwlpZiAoKnBpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoKnBpZCwgU0lHS0lMTCk7CiYjNDM7CQl3YWl0cGlkKCpwaWQsIE5VTEwsIDApOwomIzQzOwl9CiYjNDM7CSpwaWQgPSBycGNiX3N0dWJfc3RhcnQobW9kZSk7CiYjNDM7CXJldHVybiAqcGlkICZndDsgMCA/IDAgOiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7RklYVFVSRShuZnNkX2xpc3RlbmVyKSB7CiYjNDM7CXBpZF90IHJwY2JkOwomIzQzO307CiYjNDM7CiYjNDM7RklYVFVSRV9TRVRVUChuZnNkX2xpc3RlbmVyKQomIzQzO3sKJiM0MzsJc3RydWN0IGlmcmVxIGlmciA9IHswfTsKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CWludCBzOwomIzQzOwomIzQzOwlpZiAoZ2V0ZXVpZCgpICE9IDApCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDttdXN0IGJlIHJ1biBhcyByb290JiMzNDspOwomIzQzOwlpZiAodW5zaGFyZShDTE9ORV9ORVdORVQgfCBDTE9ORV9ORVdOUykgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7dW5zaGFyZShORVdORVR8TkVXTlMpOiAlcyYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwlpZiAobW91bnQoJiMzNDsmIzM0OywgJiMzNDsvJiMzNDssIE5VTEwsIE1TX1JFQyB8IE1TX1BSSVZBVEUsIE5VTEwpICZsdDsgMCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O21vdW50KC8gcHJpdmF0ZSk6ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEtlZXAgdGhlIGtlcm5lbCYjMzk7cyBycGNiaW5kIGNsaWVudCBpbnNpZGUgdGhpcyBuYW1lc3BhY2UuIFRoZQomIzQzOwkgKiBhYnN0cmFjdCBzb2NrZXQgaXQgdHJpZXMgZmlyc3QgaXMgcGVyLW5ldG5zLCBidXQgdGhlCiYjNDM7CSAqICYjMzQ7L3Zhci9ydW4vcnBjYmluZC5zb2NrJiMzNDsgZmFsbGJhY2sgaXMgbm90LCBzbyBoaWRlIHRoZSBwYXRoLgomIzQzOwkgKi8KJiM0MzsJaWYgKG1vdW50KCYjMzQ7dG1wZnMmIzM0OywgJiMzNDsvcnVuJiMzNDssICYjMzQ7dG1wZnMmIzM0OywgMCwgTlVMTCkgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bW91bnQodG1wZnMgb24gL3J1bik6ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CWlmIChsc3RhdCgmIzM0Oy92YXIvcnVuJiMzNDssICZhbXA7c3QpID09IDAgJmFtcDsmYW1wOyBTX0lTRElSKHN0LnN0X21vZGUpICZhbXA7JmFtcDsKJiM0MzsJICAgIG1vdW50KCYjMzQ7dG1wZnMmIzM0OywgJiMzNDsvdmFyL3J1biYjMzQ7LCAmIzM0O3RtcGZzJiMzNDssIDAsIE5VTEwpICZsdDsgMCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O21vdW50KHRtcGZzIG9uIC92YXIvcnVuKTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsKJiM0MzsJLyogQnJpbmcgbG9vcGJhY2sgdXAgc28gbGlzdGVuZXIgYmluZHMgKDEyNy4wLjAuMSAvIDo6MSkgd29yay4gKi8KJiM0MzsJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKJiM0MzsJQVNTRVJUX0dFKHMsIDApOwomIzQzOwlzdHJjcHkoaWZyLmlmcl9uYW1lLCAmIzM0O2xvJiMzNDspOwomIzQzOwlBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ0dJRkZMQUdTLCAmYW1wO2lmcikpOwomIzQzOwlpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUCB8IElGRl9SVU5OSU5HOwomIzQzOwlBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ1NJRkZMQUdTLCAmYW1wO2lmcikpOwomIzQzOwljbG9zZShzKTsKJiM0MzsKJiM0MzsJbmZzZF9mYW1pbHkgPSBnZW5sX3Jlc29sdmVfbmZzZCgpOwomIzQzOwlpZiAobmZzZF9mYW1pbHkgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bmZzZCBnZW5sIGZhbWlseSBub3QgZm91bmQgKG1vZHByb2JlIG5mc2Q/KSYjMzQ7KTsKJiM0MzsKJiM0MzsJc2VsZi0mZ3Q7cnBjYmQgPSBycGNiX3N0dWJfc3RhcnQoUlBDQl9TVFVCX0FDQ0VQVCk7CiYjNDM7CWlmIChzZWxmLSZndDtycGNiZCAmbHQ7IDApCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtjYW5ub3Qgc3RhcnQgdGhlIHJwY2JpbmQgc3R1YjogJXMmIzM0OywKJiM0MzsJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihuZnNkX2xpc3RlbmVyKQomIzQzO3sKJiM0MzsJaWYgKHNlbGYtJmd0O3JwY2JkICZndDsgMCkgewomIzQzOwkJa2lsbChzZWxmLSZndDtycGNiZCwgU0lHS0lMTCk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3JwY2JkLCBOVUxMLCAwKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiA9PT09PT09PT09PT09PT09PT09PT0gdmFsaWRhdGlvbiAvIG5lZ2F0aXZlID09PT09PT09PT09PT09PT09PT09PSAqLwomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfZW1wdHlfbGlzdF9vaykKJiM0Mzt7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3Rvb19tYW55KQomIzQzO3sKJiM0MzsJc3RhdGljIGNoYXIgYXR0cnNbMSAmbHQ7Jmx0OyAyMF07CiYjNDM7CWludCBpLCBvZmYgPSAwOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgMTAyNTsgaSYjNDM7JiM0MzspCQkvKiAmZ3Q7IE5GU0RfTkxfTElTVEVORVJfTUFYICgxMDI0KSAqLwomIzQzOwkJb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUVYUEVDVF9FUSgtRTJCSUcsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ19hZGRyKQomIzQzO3sKJiM0MzsJY2hhciBhdHRyc1s2NF07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMCB9OwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ190cmFuc3BvcnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfaW4gczQgPSB7IC5zaW5fZmFtaWx5ID0gQUZfSU5FVCwgLnNpbl9wb3J0ID0gaHRvbnMoVEVTVF9QT1JUKSB9OwomIzQzOwlzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gTlVMTCwgLmVtaXRfYWRkciA9IDEsCiYjNDM7CQkJCSAgLmFkZHIgPSAmYW1wO3M0LCAuYWRkcl9sZW4gPSBzaXplb2YoczQpIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBuYW1lIG1hdGNoaW5nIG5vIHRyYW5zcG9ydCBjbGFzcyBtdXN0IGJlIHJlZnVzZWQgYmVmb3JlIG5mc2RfbXV0ZXggaXMKJiM0MzsgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHMKJiM0MzsgKiByZXF1ZXN0X21vZHVsZSgmIzM0O3N2YyVzJiMzNDssIG5hbWUpIHVwY2FsbC4KJiM0MzsgKi8KJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2JhZF90cmFuc3BvcnQpCiYjNDM7ewomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDtib2d1c194cHJ0JiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRVBST1RPTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2FkZHJfdG9vX3Nob3J0KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgY2hhciB0aW55ID0gMDsKJiM0MzsJc3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9ICYjMzQ7dGNwJiMzNDssIC5lbWl0X2FkZHIgPSAxLAomIzQzOwkJCQkgIC5hZGRyID0gJmFtcDt0aW55LCAuYWRkcl9sZW4gPSAxIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldF9zaG9ydCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3M0LAomIzQzOwkJCQkgIC5hZGRyX2xlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgJiM0MzsgMiB9OwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsICZhbXA7cik7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXQ2X3Nob3J0KQomIzQzO3sKJiM0MzsJc3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07CiYjNDM7CXN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSAmIzM0O3RjcCYjMzQ7LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSAmYW1wO3M2LAomIzQzOwkJCQkgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgJmFtcDtyKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX2ZhbWlseSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9OwomIzQzOwlzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gJiMzNDt0Y3AmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gJmFtcDtzcywKJiM0MzsJCQkJICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9OwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsICZhbXA7cik7CiYjNDM7CiYjNDM7CUVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHsgLnNzX2ZhbWlseSA9IEFGX1VOSVggfTsKJiM0MzsJc3RydWN0IHJhd19saXN0ZW5lciBiYWQgPSB7IC54cHJ0ID0gJiMzNDt0Y3AmIzM0OywgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gJmFtcDtzcywKJiM0MzsJCQkJICAgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07CiYjNDM7CWNoYXIgYXR0cnNbMTI4XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgb2ZmLCAmYW1wO2JhZCk7CiYjNDM7CS8qIFRoZSB3aG9sZSByZXF1ZXN0IGlzIHJlamVjdGVkIGR1cmluZyB2YWxpZGF0aW9uOyBub3RoaW5nIGFwcGxpZWQuICovCiYjNDM7CUVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEEgcmVqZWN0ZWQgcmVxdWVzdCBtdXN0IGxlYXZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBhcmUgYWxyZWFkeSB1cCBhbG9uZS4KJiM0MzsgKiBUaGUgZXJybm8gYWxvbmUgZG9lcyBub3Qgc2hvdyB0aGF0OiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIHJldHVybnMKJiM0MzsgKiAtRVBST1RPTk9TVVBQT1JUIGZvciBhbiB1bmtub3duIG5hbWUgdG9vLiBXaGF0IGRpZmZlcnMgaXMgaG93IGZhciB0aGUKJiM0MzsgKiByZXF1ZXN0IGdldHMgLS0gd2l0aG91dCB0aGUgY2hlY2sgaW4gbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwKJiM0MzsgKiBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KCkgaGFzIGFscmVhZHkgbW92ZWQgdGhlIHVubWF0Y2hlZCB0Y3AgbGlzdGVuZXIKJiM0MzsgKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGUKJiM0MzsgKiBuYW1lIGZhaWxzLgomIzQzOyAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfcmVqZWN0X2tlZXBzX2xpc3RlbmVycykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGdvb2RbNjRdLCBiYWRbNjRdOwomIzQzOwlpbnQgb2cgPSBwdXRfbGlzdGVuZXIoZ29vZCwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG9iID0gcHV0X2xpc3RlbmVyKGJhZCwgMCwgJiMzNDtib2d1c194cHJ0JiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoZ29vZCwgb2cpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChiYWQsIG9iKSk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7CUVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSBmdW5jdGlvbmFsIC8gcm91bmQtdHJpcCA9PT09PT09PT09PT09PT09PT09PT0gKi8KJiM0MzsKJiM0MzsvKiBMSVNURU5FUl9HRVQgd2l0aCBubyBzZXJ2IGluIHRoaXMgbmV0bnMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2dldF9lbXB0eSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwomIzQzOwlFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdGNwKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsJRVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCAmIzM0O3RjcCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTsKJiM0MzsJRVhQRUNUX0VRKGh0b25sKElOQUREUl9MT09QQkFDSyksIGdvdFswXS5hNC5zX2FkZHIpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdWRwKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3VkcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTsKJiM0MzsJRVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCAmIzM0O3VkcCYjMzQ7LCBBRl9JTkVULCBURVNUX1BPUlQpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX211bHRpKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbMTI4XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzOwlBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dWRwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19pZGVtcG90ZW50KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYXR0cnNbNjRdOwomIzQzOwlpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTsKJiM0MzsJRVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CQkvKiByZS1zZXQgc2FtZSBsaXN0ICovCiYjNDM7CUFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7CUVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVCwgVEVTVF9QT1JUKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2FkZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIG9uZVs2NF0sIHR3b1sxMjhdOwomIzQzOwlpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwlpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCAmIzM0O3RjcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwomIzQzOwlvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCAmIzM0O3VkcCYjMzQ7LCBURVNUX1BPUlQpOwomIzQzOwlBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7CQkvKiBhZGQgdWRwLCBrZWVwIHRjcCAqLwomIzQzOwlBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsICYjMzQ7dWRwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19yZW1vdmVfc3Vic2V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107CiYjNDM7CWNoYXIgYm90aFsxMjhdLCBvbmVbNjRdOwomIzQzOwlpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG9vID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgb2IsICYjMzQ7dWRwJiMzNDssIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYm90aCwgb2IpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG9vKSk7CQkvKiBkcm9wIHVkcCAqLwomIzQzOwlBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQsIFRFU1RfUE9SVCkpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19lbXB0eV9kZXN0cm95cykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpOwkJLyogZW1wdHkgLSZndDsgZGVzdHJveSBzZXJ2ICovCiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTsKJiM0MzsJY2hhciBhdHRyc1s2NF07CiYjNDM7CWludCBvZmYsIHM7CiYjNDM7CiYjNDM7CXMgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJaWYgKHMgJmx0OyAwKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7SVB2NiB1bmF2YWlsYWJsZTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJY2xvc2Uocyk7CiYjNDM7CiYjNDM7CW9mZiA9IHB1dF9saXN0ZW5lcl9hZihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgQUZfSU5FVDYsIFRFU1RfUE9SVCk7CiYjNDM7CUFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpOwomIzQzOwlBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpOwomIzQzOwlFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsICYjMzQ7dGNwJiMzNDssIEFGX0lORVQ2LCBURVNUX1BPUlQpKTsKJiM0MzsJRVhQRUNUX0VRKDAsIG1lbWNtcCgmYW1wO2dvdFswXS5hNiwgJmFtcDtpbjZhZGRyX2xvb3BiYWNrLCBzaXplb2YoaW42YWRkcl9sb29wYmFjaykpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogPT09PT09PT09PT09PT09PT09PT09IHJwY2JpbmQgcmVnaXN0cmF0aW9uID09PT09PT09PT09PT09PT09PT09PSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBycGNiaW5kIHRoYXQgcmVmdXNlcyB0aGUgcmVnaXN0cmF0aW9uIG11c3QgZmFpbCBsaXN0ZW5lciBjcmVhdGlvbiwKJiM0MzsgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLgomIzQzOyAqCiYjNDM7ICogVGhlIGVycm9yIGhhcyB0byBzdXJ2aXZlIHN2Y19yZWdpc3RlcigpJiMzOTtzIHdhbGsgb3ZlciBzdl9wcm9ncmFtcyB0byBnZXQKJiM0MzsgKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHkKJiM0MzsgKiBhIE5VTEwgYW5kIGEgdnNfaGlkZGVuIHZlcnNpb24sIGFuZCBzdmNfZ2VuZXJpY19ycGNiaW5kX3NldCgpIHJlcG9ydHMgMAomIzQzOyAqIGZvciBib3RoLCBzbyBhbiBzdmNfcmVnaXN0ZXIoKSB0aGF0IGtlZXBzIHRoZSBsYXN0IHJlc3VsdCByYXRoZXIgdGhhbiB0aGUKJiM0MzsgKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLgomIzQzOyAqLwomIzQzO1RFU1RfRihuZnNkX2xpc3RlbmVyLCBzZW1fcmVnaXN0ZXJfcmVmdXNlZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdOwomIzQzOwljaGFyIGF0dHJzWzY0XTsKJiM0MzsJaW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHJwY2Jfc3R1Yl9yZXN0YXJ0KCZhbXA7c2VsZi0mZ3Q7cnBjYmQsIFJQQ0JfU1RVQl9SRUZVU0UpKTsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKC1FQUNDRVMsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7CiYjNDM7CUVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7CiYjNDM7fQomIzQzOwomIzQzOy8qID09PT09PT09PT09PT09PT09PT09PSB0aHJlYWRzIC8gLUVCVVNZIHNlbWFudGljcyA9PT09PT09PT09PT09PT09PT09PT0gKi8KJiM0MzsKJiM0MztURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fY2hhbmdlKQomIzQzO3sKJiM0MzsJY2hhciBvbmVbNjRdLCB0d29bMTI4XTsKJiM0MzsJaW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJaW50IG8yID0gcHV0X2xpc3RlbmVyKHR3bywgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJbzIgPSBwdXRfbGlzdGVuZXIodHdvLCBvMiwgJiMzNDt1ZHAmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7CQkJLyogdGhyZWFkcyBub3cgcnVubmluZyAqLwomIzQzOwlFWFBFQ1RfRVEoLUVCVVNZLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpOwkvKiBhZGQgcmVmdXNlZCAqLwomIzQzOwl0aHJlYWRzX3NldCgwKTsJCQkJCS8qIHN0b3AgYmVmb3JlIG5ldG5zIGV4aXQgKi8KJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX3JlbW92ZSkKJiM0Mzt7CiYjNDM7CWNoYXIgb25lWzY0XTsKJiM0MzsJaW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgJiMzNDt0Y3AmIzM0OywgVEVTVF9QT1JUKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRzX3NldCgxKSk7CiYjNDM7CUVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7CS8qIHJlbW92ZSByZWZ1c2VkICovCiYjNDM7CXRocmVhZHNfc2V0KDApOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0hBUk5FU1NfTUFJTgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjA5MWI0NWQyMjZiYQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3MKQEAgLTAsMCAmIzQzOzEgQEAKJiM0Mzt0aW1lb3V0PTEyMAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYwMjUKCQkJCQkJCW91dHB1dDogMjMKCQkJCQkJCXRob3VnaHRzOiA1NzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFRoaXMgTkZTZCBOZXRsaW5rIExpc3RlbmVyIFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0aGUgY29yZSBjaGFuZ2VzIGFuZCBwb3RlbnRpYWwgaW1wbGljYXRpb25zLCBlc3BlY2lhbGx5IHJlZ2FyZGluZyBzZWN1cml0eSBhbmQgc3RhYmlsaXR5LCBnaXZlbiBteSBleHBlcnRpc2UgaW4gdGhpcyBhcmVhLgoKRmlyc3QsIEkgc2VlIG1vZGlmaWNhdGlvbnMgdG8gYGZzL25mc2QvbmZzY3RsLmNgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AsIGFuZCBgbmV0L3N1bnJwYy9zdmMuY2AsIGFsb25nc2lkZSBhIG5ldyBzZWxmLXRlc3QgZm9yIHRoZSBORlNkIG5ldGxpbmsgbGlzdGVuZXIuIEdvb2QgdG8gc2VlIHRoZSBhZGRpdGlvbiBvZiBhIHNlbGZ0ZXN0OyB0aGF0JiMzOTtzIGNyaXRpY2FsIGZvciByZWdyZXNzaW9uIHByZXZlbnRpb24uCgpJbiBgZnMvbmZzZC9uZnNjdGwuY2AsIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAgYW5kIHRoZSBtb2RpZmljYXRpb24gb2YgYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYCBpbW1lZGlhdGVseSBjYXRjaCBteSBleWUuIFNwZWNpZmljYWxseSwgSSBub3RlIHRoZSBsaW1pdGluZyBvZiBsaXN0ZW5lcnMgdG8gYE5GU0RfTkxfTElTVEVORVJfTUFYYCAoMTAyNCksIGEgc2Vuc2libGUgcHJlY2F1dGlvbiBhZ2FpbnN0IERvUy4gVGhlIGluY2x1c2lvbiBvZiB0aGUgY2hlY2sgdXNpbmcgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAgd2l0aGluIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MgaXMgYWxzbyB3ZWxjb21lLiBUaGUgY2hhbmdlIHRvIHNldCB0aGUgZXJyb3IgbWVzc2FnZSB2aWEgYE5MX1NFVF9FUlJfTVNHX0ZNVGAgaW4gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgIG9uIGBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYWAgZmFpbHVyZSBpcyBhIGdvb2QgZGVidWdnaW5nIGltcHJvdmVtZW50LgoKTW92aW5nIHRvIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgdGhlIGFkZGl0aW9uIGFuZCB1c2Ugb2YgYHJwY2JfbG9jYWxfdGltZW91dGAgaW4gYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAgc3VnZ2VzdHMgYSBwb3RlbnRpYWwgcGVyZm9ybWFuY2Ugb3Igcm9idXN0bmVzcyBpbXByb3ZlbWVudCByZWxhdGVkIHRvIGxvY2FsIFJQQyBjb25uZWN0aW9ucy4gSSYjMzk7bGwgbmVlZCB0byBleGFtaW5lIHRoZSB0aW1lb3V0IHZhbHVlcyBhbmQgdGhlaXIgaW1wYWN0IG9uIG92ZXJhbGwgUlBDIGxhdGVuY3kuCgpJbiBgbmV0L3N1bnJwYy9zdmMuY2AsIHRoZSBjaGFuZ2UgdG8gYHN2Y19yZWdpc3RlcmAgdG8gcmV0YWluIHRoZSBmaXJzdCBlcnJvciBmcm9tIGBwcm9ncC0mZ3Q7cGdfcnBjYmluZF9zZXRgIGlzIGEgc2lnbmlmaWNhbnQgb25lLiBUaGUgcHJldmlvdXMgYmVoYXZpb3Igb2Ygb3ZlcndyaXRpbmcgYW4gaW5pdGlhbCBlcnJvciB3aXRoIHplcm8gaXMsIGZyYW5rbHksIGluY29ycmVjdCBhbmQgY291bGQgbGVhZCB0byBzaWxlbnQgZmFpbHVyZXMuIFRoaXMgaXMgYSBjbGVhciBpbXByb3ZlbWVudCBpbiBlcnJvciByZXBvcnRpbmcsIGFuZCBJJiMzOTttIGdsYWQgdG8gc2VlIHRoaXMgY29ycmVjdGlvbi4KCk5vdywgbXkgbW9yZSBpbW1lZGlhdGUgY29uY2VybiBpcyB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIHZ1bG5lcmFiaWxpdGllcy4gSSBzZWUgYSBwb3RlbnRpYWwgYXJlYSB0byBhc3Nlc3MgaW4gYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYC4gU3BlY2lmaWNhbGx5IHRoZSBmb2xsb3dpbmcgbGluZXM6CgpgYGBjCgkJaWYgKCF0YltORlNEX0FfU09DS19BRERSXSB8fCAhdGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKQoJCQlyZXR1cm4gLUVJTlZBTDsKCgkJaWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpCgkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwpgYGAKSGVyZSwgYG5sYV9kYXRhYCByZXRyaWV2ZXMgdGhlIHBheWxvYWQgb2YgYSBuZXRsaW5rIGF0dHJpYnV0ZS4gVGhpcyBpcyBiZWluZyBwYXNzZWQgdG8gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAsIHdoaWNoLCBmcm9tIGEgYnJpZWYgZ2xhbmNlLCBzZWVtcyB0byB1c2UgYHN0cmNtcGAuIE15IHF1ZXN0aW9uIGlzLCBpcyB0aGUgcGF5bG9hZCBvZiB0aGlzIG5ldGxpbmsgYXR0cmlidXRlIGd1YXJhbnRlZWQgdG8gYmUgbnVsbC10ZXJtaW5hdGVkPyBJZiBub3QsIHdlIGhhdmUgYSBjbGVhciBwb3RlbnRpYWwgZm9yIGEgYnVmZmVyIG92ZXJmbG93IHdpdGggYHN0cmNtcGAuIEkgKm11c3QqIHZlcmlmeSB0aGUgZGVmaW5pdGlvbiBvZiBgbmZzZF9zb2NrX25sX3BvbGljeWAgaW4gYGZzL25mc2QvbmZzY3RsLmNgIHRvIHNlZSBpZiB0aGUgbmV0bGluayBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBhZGRyZXNzZXMgbnVsbCB0ZXJtaW5hdGlvbi4gVGhpcyBpcyBhIGNyaXRpY2FsIHBvaW50IHRoYXQgbmVlZHMgYSB0aG9yb3VnaCBpbnZlc3RpZ2F0aW9uIHRvIGVuc3VyZSB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhIHNlY3VyaXR5IGhvbGUuIFRoaXMgaXMgdGhlIGZpcnN0IHRoaW5nIEkmIzM5O2xsIGNoZWNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAyMTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtuZnNkX3NvY2tfbmxfcG9saWN5JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL25mc2QvbmV0bGluay5jPTM1PWNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiAmIzQzOyAxXSA9IHtcbi0tXG5mcy9uZnNkL25ldGxpbmsuYy0zOC1cbmZzL25mc2QvbmV0bGluay5jOjM5OmNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc29ja19ubF9wb2xpY3lbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUgJiM0MzsgMV0gPSB7XG5mcy9uZnNkL25ldGxpbmsuYy00MC1cdFtORlNEX0FfU09DS19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCB9LFxuLS1cbmZzL25mc2QvbmV0bGluay5jPTgyPXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnNkX2xpc3RlbmVyX3NldF9ubF9wb2xpY3lbTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgJiM0MzsgMV0gPSB7XG5mcy9uZnNkL25ldGxpbmsuYzo4MzpcdFtORlNEX0FfU0VSVkVSX1NPQ0tfQUREUl0gPSBOTEFfUE9MSUNZX05FU1RFRChuZnNkX3NvY2tfbmxfcG9saWN5KSxcbmZzL25mc2QvbmV0bGluay5jLTg0LX07XG4tLVxuZnMvbmZzZC9uZXRsaW5rLmg9MTk9ZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiAmIzQzOyAxXTtcbmZzL25mc2QvbmV0bGluay5oOjIwOmV4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnNkX3NvY2tfbmxfcG9saWN5W05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FICYjNDM7IDFdO1xuZnMvbmZzZC9uZXRsaW5rLmgtMjEtZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc3ZjX2V4cG9ydF9ubF9wb2xpY3lbTkZTRF9BX1NWQ19FWFBPUlRfRlNJRCAmIzQzOyAxXTtcbi0tXG5mcy9uZnNkL25mc2N0bC5jPTIwMDU9c3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuLS1cbmZzL25mc2QvbmZzY3RsLmMtMjAyMi1cdFx0ZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgTkZTRF9BX1NPQ0tfTUFYLCBhdHRyLFxuZnMvbmZzZC9uZnNjdGwuYzoyMDIzOlx0XHRcdFx0ICAgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXHUwMDNlZXh0YWNrKTtcbmZzL25mc2QvbmZzY3RsLmMtMjAyNC1cdFx0aWYgKGVyciBcdTAwM2MgMClcbi0tXG5mcy9uZnNkL25mc2N0bC5jPTIwNjM9aW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbi0tXG5mcy9uZnNkL25mc2N0bC5jLTIxMTAtXHRcdGlmIChubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXG5mcy9uZnNkL25mc2N0bC5jOjIxMTE6XHRcdFx0XHQgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXHUwMDNlZXh0YWNrKSBcdTAwM2MgMClcbmZzL25mc2QvbmZzY3RsLmMtMjExMi1cdFx0XHRjb250aW51ZTtcbi0tXG5mcy9uZnNkL25mc2N0bC5jLTIxNjYtXHRcdGlmIChubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXG5mcy9uZnNkL25mc2N0bC5jOjIxNjc6XHRcdFx0XHQgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXHUwMDNlZXh0YWNrKSBcdTAwM2MgMClcbmZzL25mc2QvbmZzY3RsLmMtMjE2OC1cdFx0XHRjb250aW51ZTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgxODcKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIHRoZSBORlMgTmV0bGluayBQb2xpY3kqKgoKT2theSwgdGltZSB0byBnZXQgdG8gdGhlIGhlYXJ0IG9mIHRoaXMuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIHRoZSBgbmZzZF9zb2NrX25sX3BvbGljeWAgc3RydWN0dXJlLiBJIGltbWVkaWF0ZWx5IGtub3cgdGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGRlZmluZXMgdGhlIE5ldGxpbmsgbWVzc2FnZSBwb2xpY3kgZm9yIHRoZSBORlMgc2VydmVyJiMzOTtzIHNvY2tldCBpbnRlcmFjdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBnbyBkaXJlY3RseSB0byBgZnMvbmZzZC9uZXRsaW5rLmNgIOKAkyB0aGF0JiMzOTtzIHRoZSBvYnZpb3VzIHBsYWNlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhhdCBwb2xpY3kgZGVmaW5pdGlvbiByZXZlYWxzIGFib3V0IHRoZSBleHBlY3RlZCBtZXNzYWdlIGZvcm1hdCwgZGF0YSB0eXBlcywgYW5kIGFueSBzZWN1cml0eSByZXN0cmljdGlvbnMgaW4gcGxhY2UuIFVuZGVyc3RhbmRpbmcgdGhpcyBwb2xpY3kgaXMgY3J1Y2lhbCBmb3IgZGlhZ25vc2luZyBvciBkZXZlbG9waW5nIGFueSBOZXRsaW5rLWJhc2VkIHRvb2xzIHRoYXQgaW50ZXJhY3Qgd2l0aCB0aGUgTkZTIHNlcnZlci4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBwb2xpY3kgdG8gb3V0bGluZSB0aGUgYXR0cmlidXRlcyBhY2NlcHRlZCBieSBgbmZzZGAgYW5kIHRoZWlyIGFzc29jaWF0ZWQgdmFsaWRhdGlvbnMuIFRoZSBkZXRhaWxzIG9mIHRoZSBwb2xpY3kgYXJlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBleHBlY3RlZCBjb250ZW50IG9mIHRoZSBpbmNvbWluZyBhbmQgb3V0Z29pbmcgTmV0bGluayBtZXNzYWdlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9uZnNkL25ldGxpbmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDE1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgMzU6XHRjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnNkX2ZzbG9jYXRpb25zX25sX3BvbGljeVtORlNEX0FfRlNMT0NBVElPTlNfTE9DQVRJT04gJiM0MzsgMV0gPSB7XG4gIDM2Olx0XHRbTkZTRF9BX0ZTTE9DQVRJT05TX0xPQ0FUSU9OXSA9IE5MQV9QT0xJQ1lfTkVTVEVEKG5mc2RfZnNsb2NhdGlvbl9ubF9wb2xpY3kpLFxuICAzNzpcdH07XG4gIDM4Olx0XG4gIDM5Olx0Y29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZzZF9zb2NrX25sX3BvbGljeVtORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSAmIzQzOyAxXSA9IHtcbiAgNDA6XHRcdFtORlNEX0FfU09DS19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCB9LFxuICA0MTpcdFx0W05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSA9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgfSxcbiAgNDI6XHR9O1xuICA0MzpcdFxuICA0NDpcdGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc3ZjX2V4cG9ydF9ubF9wb2xpY3lbTkZTRF9BX1NWQ19FWFBPUlRfRlNJRCAmIzQzOyAxXSA9IHtcbiAgNDU6XHRcdFtORlNEX0FfU1ZDX0VYUE9SVF9TRVFOT10gPSB7IC50eXBlID0gTkxBX1U2NCwgfSxcbiAgNDY6XHRcdFtORlNEX0FfU1ZDX0VYUE9SVF9DTElFTlRdID0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCB9LFxuICA0NzpcdFx0W05GU0RfQV9TVkNfRVhQT1JUX1BBVEhdID0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCB9LFxuICA0ODpcdFx0W05GU0RfQV9TVkNfRVhQT1JUX05FR0FUSVZFXSA9IHsgLnR5cGUgPSBOTEFfRkxBRywgfSxcbiAgNDk6XHRcdFtORlNEX0FfU1ZDX0VYUE9SVF9FWFBJUlldID0geyAudHlwZSA9IE5MQV9VNjQsIH0sXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDIxOjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4ODczCgkJCQkJCQlvdXRwdXQ6IDI1NgoJCQkJCQkJdGhvdWdodHM6IDUxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipSZWFzb25pbmcgVGhyb3VnaCB0aGUgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHJlZ2FyZGluZyB0aGUgYFtORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV1gIGRlZmluaXRpb24sIGtub3dpbmcgdGhhdCBgLnR5cGUgPSBOTEFfTlVMX1NUUklOR2AgZ3VhcmFudGVlcyB0aGF0IGBubGFfZGF0YSh0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pYCB3aWxsIGJlIG51bGwtdGVybWluYXRlZC4gVGhpcyBpcyBjcnVjaWFsIGZvciBhdm9pZGluZyBhbnkgcG90ZW50aWFsIGJ1ZmZlciBvdmVycnVucyBvciB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhlIHBhdGNoIGl0c2VsZiBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyBhbGxvY2F0aW9ucywgc28gd2UmIzM5O3JlIG5vdCBkZWFsaW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLiBUaGUgY2hhbmdlcyBhcmUgYWxsIGNlbnRlcmVkIGFyb3VuZCB2YWxpZGF0aW9uIGFuZCBlcnJvciBoYW5kbGluZywgd2hpY2ggaXMgcHJlY2lzZWx5IHRoZSBraW5kIG9mIHRoaW5nIEtBU0FOIGFuZCBvdGhlciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFyZSBkZXNpZ25lZCB0byBjYXRjaCBpZiBzb21ldGhpbmcgc2xpcHMgdGhyb3VnaC4gU28sIGluIHRlcm1zIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCB0aGlzIHNlY3Rpb24gaXMgYSBub24taXNzdWUuCgpOZXh0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgYHN2Y19yZWdpc3RlcmAgY2hhbmdlcy4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBhIHNpbXBsZSwgYW5kIHJhdGhlciBzdHJhaWdodGZvcndhcmQsIGZpeCBmb3IgYW4gZXJyb3IgY29kZSBwcm9wYWdhdGlvbiBidWcuIFRoZSBwYXRjaCBpcyBzaW1wbHkgZW5zdXJpbmcgdGhlIGNvcnJlY3QgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4gTm8gbmV3IG1lbW9yeSBpcyBiZWluZyBpbnRyb2R1Y2VkIGFuZCBubyBtZW1vcnkgdGhhdCBleGlzdGVkIGJlZm9yZSBpcyBiZWluZyBjaGFuZ2VkIHRvIGJlIHVuaW5pdGlhbGl6ZWQuCgpGaW5hbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNoYW5nZXMgaW4gYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAuIEl0IHNlZW1zIHRoZSB1cGRhdGUgYWRkcyBhIGBycGNiX2xvY2FsX3RpbWVvdXRgLiBJdCBpcyBkZWZpbmluZyBhIGxvY2FsIHRpbWVvdXQgd2l0aCBhbiBpbml0aXZhbCBvZiBgMSAqIEhaYCwgYSBtYXh2YWwgb2YgYDEgKiBIWmAsIGFuZCBgMGAgcmV0cmllcy4gVGhpcyBhcHBlYXJzIHRvIGJlIHNldHRpbmcgdXAgYSB0aW1lb3V0IHN0cnVjdHVyZSwgYnV0IGFnYWluLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoYXQgSSBjYW4gc2VlIGhlcmUuCgpCYXNlZCBvbiB0aGlzIHJldmlldywgSSYjMzk7bSBjb25maWRlbnQgdGhhdCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBXZSBjYW4gc2FmZWx5IG1hcmsgTmVlZHNLTVNBTiBhcyBmYWxzZS4gSSYjMzk7bGwgc3VtbWFyaXplIHRoaXMgcmVhc29uaW5nIGZvciBteSBub3RlcyBhbmQgdGhlIHJldmlld2Vycy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMjE6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgdmFsaWRhdGlvbiBjaGVja3MgZm9yIE5GU0QgbmV0bGluayBsaXN0ZW5lciBhdHRyaWJ1dGVzIChlLmcuLCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyB0byBgTkZTRF9OTF9MSVNURU5FUl9NQVhgIGFuZCB2YWxpZGF0aW5nIHRoZSB0cmFuc3BvcnQgbmFtZSB2aWEgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGApLiBJdCBhbHNvIGZpeGVzIGVycm9yIGNvZGUgcHJvcGFnYXRpb24gaW4gYHN2Y19yZWdpc3RlcmAgYW5kIHNldHMgYSBsb2NhbCB0aW1lb3V0IGZvciBycGNiaW5kIGNsaWVudHMuIFxuXG5UaGUgbmV0bGluayBhdHRyaWJ1dGUgYE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FYCBpcyBkZWZpbmVkIGFzIGBOTEFfTlVMX1NUUklOR2AgaW4gYG5mc2Rfc29ja19ubF9wb2xpY3lgLCBlbnN1cmluZyB0aGF0IGBubGFfZGF0YSgpYCByZXR1cm5zIGEgcHJvcGVybHkgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIGBzdHJjbXAoKWAgaW4gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAuIFxuXG5ObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBvciBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCB0aGVyZSBhcmUgbm8gY2hhbmdlcyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBBbnkgcG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBsb2dpYyBidWdzKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGRlZmF1bHQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgdmFsaWRhdGlvbiBjaGVja3MgZm9yIE5GU0QgbmV0bGluayBsaXN0ZW5lciBhdHRyaWJ1dGVzIChlLmcuLCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyB0byBgTkZTRF9OTF9MSVNURU5FUl9NQVhgIGFuZCB2YWxpZGF0aW5nIHRoZSB0cmFuc3BvcnQgbmFtZSB2aWEgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGApLiBJdCBhbHNvIGZpeGVzIGVycm9yIGNvZGUgcHJvcGFnYXRpb24gaW4gYHN2Y19yZWdpc3RlcmAgYW5kIHNldHMgYSBsb2NhbCB0aW1lb3V0IGZvciBycGNiaW5kIGNsaWVudHMuIFxuXG5UaGUgbmV0bGluayBhdHRyaWJ1dGUgYE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FYCBpcyBkZWZpbmVkIGFzIGBOTEFfTlVMX1NUUklOR2AgaW4gYG5mc2Rfc29ja19ubF9wb2xpY3lgLCBlbnN1cmluZyB0aGF0IGBubGFfZGF0YSgpYCByZXR1cm5zIGEgcHJvcGVybHkgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIGBzdHJjbXAoKWAgaW4gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAuIFxuXG5ObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBvciBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCB0aGVyZSBhcmUgbm8gY2hhbmdlcyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBBbnkgcG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBsb2dpYyBidWdzKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGRlZmF1bHQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTozOTozOS4yNjIwOTk3OTdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDI5Njg1MDI3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJORlNEXCIsXG4gICAgXCJORlNEX1Y0XCIsXG4gICAgXCJTVU5SUENcIixcbiAgICBcIk5FVF9OU1wiLFxuICAgIFwiSVBWNlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRcIixcbiAgICBcInN2Y19yZWdpc3RlclwiLFxuICAgIFwicnBjYl9jcmVhdGVfbG9jYWxcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHZhbGlkYXRpb24gY2hlY2tzIGZvciBORlNEIG5ldGxpbmsgbGlzdGVuZXIgYXR0cmlidXRlcyAoZS5nLiwgbGltaXRpbmcgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgdG8gYE5GU0RfTkxfTElTVEVORVJfTUFYYCBhbmQgdmFsaWRhdGluZyB0aGUgdHJhbnNwb3J0IG5hbWUgdmlhIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgKS4gSXQgYWxzbyBmaXhlcyBlcnJvciBjb2RlIHByb3BhZ2F0aW9uIGluIGBzdmNfcmVnaXN0ZXJgIGFuZCBzZXRzIGEgbG9jYWwgdGltZW91dCBmb3IgcnBjYmluZCBjbGllbnRzLiBcXG5cXG5UaGUgbmV0bGluayBhdHRyaWJ1dGUgYE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FYCBpcyBkZWZpbmVkIGFzIGBOTEFfTlVMX1NUUklOR2AgaW4gYG5mc2Rfc29ja19ubF9wb2xpY3lgLCBlbnN1cmluZyB0aGF0IGBubGFfZGF0YSgpYCByZXR1cm5zIGEgcHJvcGVybHkgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIGBzdHJjbXAoKWAgaW4gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAuIFxcblxcbk5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIG9yIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnkuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvZ2ljIGJ1Z3MpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6Mzk6MzkuMjYyMTA0MjY4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTIyMTc5MzYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNjAxZWI3MDQ4ZmQxY2MzNzE5NTFmNThhZjAwY2MyNTBmOWUyYmFjM1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIEF1ZyAxMCAyMTozOTozNyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuY1xcbmluZGV4IDdlMWQ1YTVkNjUxMWUuLmY3M2EyZWE0MjU1NzEgMTAwNjQ0XFxuLS0tIGEvZnMvbmZzZC9uZnNjdGwuY1xcbisrKyBiL2ZzL25mc2QvbmZzY3RsLmNcXG5AQCAtMTk3MywyMSArMTk3MywzOSBAQCBpbnQgbmZzZF9ubF92ZXJzaW9uX2dldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFRyYW5zcG9ydCBjbGFzc2VzIE5GU0Qga25vd3MgaG93IHRvIGluc3RhbnRpYXRlLiBWZXR0aW5nIHRoZSBuYW1lIGhlcmVcXG4rICoga2VlcHMgYSBib2d1cyBzdHJpbmcgZnJvbSByZWFjaGluZyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpLCB3aGVyZSBhblxcbisgKiB1bmtub3duIG5hbWUgdHJpZ2dlcnMgYSByZXF1ZXN0X21vZHVsZShcXFwic3ZjJXNcXFwiLCBuYW1lKSB1cGNhbGwgdW5kZXJcXG4rICogbmZzZF9tdXRleC5cXG4rICovXFxuK3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKVxcbit7XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3VwcG9ydGVkW10gPSB7IFxcXCJ0Y3BcXFwiLCBcXFwidWRwXFxcIiwgXFxcInJkbWFcXFwiIH07XFxuK1xcdGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoc3VwcG9ydGVkKTsgaSsrKVxcbitcXHRcXHRpZiAoIXN0cmNtcChuYW1lLCBzdXBwb3J0ZWRbaV0pKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbisvKiBVcHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBhIHNpbmdsZSByZXF1ZXN0IG1heSBjYXJyeS4gKi9cXG4rI2RlZmluZSBORlNEX05MX0xJU1RFTkVSX01BWFxcdDEwMjRcXG4rXFxuIC8qKlxcbiAgKiBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyAtIHNhbml0eS1jaGVjayB0aGUgbGlzdGVuZXIgbGlzdCBmcm9tIHVzZXJsYW5kXFxuICAqIEBpbmZvOiBuZXRsaW5rIG1ldGFkYXRhIGFuZCBjb21tYW5kIGFyZ3VtZW50c1xcbiAgKlxcbi0gKiBXYWxrIGV2ZXJ5IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIGF0dHJpYnV0ZSBhbmQgY29uZmlybSB0aGF0IGVhY2ggZW50cnlcXG4tICogaXMgd2VsbC1mb3JtZWQ6IGl0IHBhcnNlcyBhZ2FpbnN0IHRoZSBwb2xpY3ksIGNhcnJpZXMgYm90aCBhbiBhZGRyZXNzIGFuZFxcbi0gKiBhIHRyYW5zcG9ydCBuYW1lLCBhbmQgdGhlIGFkZHJlc3MgaXMgbG9uZyBlbm91Z2ggZm9yIGl0cyBmYW1pbHkuIERvaW5nXFxuLSAqIHRoaXMgdXAgZnJvbnQgbGV0cyB0aGUgY2FsbGVycyBiZWxvdyBhc3N1bWUgZXZlcnkgZW50cnkgaXMgdmFsaWQgYW5kXFxuLSAqIGd1YXJhbnRlZXMgd2UgbWFrZSBubyBjaGFuZ2VzIHdoZW4gdGhlIHJlcXVlc3QgaXMgbWFsZm9ybWVkLlxcbisgKiBXYWxrIGV2ZXJ5IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIGF0dHJpYnV0ZSBhbmQgY29uZmlybSB0aGF0IHRoZSBsaXN0IGlzXFxuKyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC5cXG4gICpcXG4gICogUmV0dXJuOiAwIGlmIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkLCBvciBhIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZS5cXG4gICovXFxuIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4ge1xcbiBcXHRjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyO1xcbitcXHR1bnNpZ25lZCBpbnQgY291bnQgPSAwO1xcbiBcXHRpbnQgcmVtO1xcbiBcXG4gXFx0bmxtc2dfZm9yX2VhY2hfYXR0cl90eXBlKGF0dHIsIE5GU0RfQV9TRVJWRVJfU09DS19BRERSLCBpbmZvLVxcdTAwM2VubGhkcixcXG5AQCAtMTk5Niw2ICsyMDE0LDExIEBAIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4gXFx0XFx0c3RydWN0IHNvY2thZGRyICpzYTtcXG4gXFx0XFx0aW50IGVycjtcXG4gXFxuK1xcdFxcdGlmICgrK2NvdW50IFxcdTAwM2UgTkZTRF9OTF9MSVNURU5FUl9NQVgpIHtcXG4rXFx0XFx0XFx0TkxfU0VUX0VSUl9NU0coaW5mby1cXHUwMDNlZXh0YWNrLCBcXFwidG9vIG1hbnkgbGlzdGVuZXJzXFxcIik7XFxuK1xcdFxcdFxcdHJldHVybiAtRTJCSUc7XFxuK1xcdFxcdH1cXG4rXFxuIFxcdFxcdGVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5GU0RfQV9TT0NLX01BWCwgYXR0cixcXG4gXFx0XFx0XFx0XFx0ICAgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXFx1MDAzZWV4dGFjayk7XFxuIFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbkBAIC0yMDA0LDYgKzIwMjcsOSBAQCBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXFxuIFxcdFxcdGlmICghdGJbTkZTRF9BX1NPQ0tfQUREUl0gfHwgIXRiW05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbitcXHRcXHRpZiAoIW5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChubGFfZGF0YSh0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7XFxuK1xcbiBcXHRcXHRzYSA9IG5sYV9kYXRhKHRiW05GU0RfQV9TT0NLX0FERFJdKTtcXG4gXFx0XFx0aWYgKG5sYV9sZW4odGJbTkZTRF9BX1NPQ0tfQUREUl0pIFxcdTAwM2Mgc2l6ZW9mKHNhLVxcdTAwM2VzYV9mYW1pbHkpKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5AQCAtMjE1Niw4ICsyMTgyLDEyIEBAIGludCBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXFxuIFxcdFxcdHJldCA9IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKHNlcnYsIHhjbF9uYW1lLCBuZXQsIHNhLCAwLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgICBjdXJyZW50X2NyZWQoKSk7XFxuIFxcdFxcdC8qIGFsd2F5cyBzYXZlIHRoZSBsYXRlc3QgZXJyb3IgKi9cXG4tXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdE5MX1NFVF9FUlJfTVNHX0ZNVChpbmZvLVxcdTAwM2VleHRhY2ssXFxuK1xcdFxcdFxcdFxcdFxcdCAgIFxcXCJjYW5ub3QgY3JlYXRlICVzIGxpc3RlbmVyOiAlZFxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHhjbF9uYW1lLCByZXQpO1xcbiBcXHRcXHRcXHRlcnIgPSByZXQ7XFxuK1xcdFxcdH1cXG4gXFx0fVxcbiBcXG4gXFx0aWYgKCFzZXJ2LVxcdTAwM2Vzdl9ucnRocmVhZHMgXFx1MDAyNlxcdTAwMjYgbGlzdF9lbXB0eShcXHUwMDI2bm4tXFx1MDAzZW5mc2Rfc2Vydi1cXHUwMDNlc3ZfcGVybXNvY2tzKSlcXG5kaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcXG5pbmRleCA2YWEzNzIxODhjODZhLi4wYWEzNzZiODJhNTI2IDEwMDY0NFxcbi0tLSBhL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcXG4rKysgYi9uZXQvc3VucnBjL3JwY2JfY2xudC5jXFxuQEAgLTIyMSw2ICsyMjEsMTYgQEAgc3RhdGljIHZvaWQgcnBjYl9zZXRfbG9jYWwoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsXFxuICMgZGVmaW5lIFNVTl9MRU4ocHRyKSAob2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aClcXHRcXHRcXFxcXFxuIFxcdFxcdCAgICAgICsgMSArIHN0cmxlbigocHRyKS1cXHUwMDNlc3VuX3BhdGggKyAxKSlcXG4gXFxuKy8qXFxuKyAqIFRoZSBrZXJuZWwncyBycGNiaW5kIGNsaWVudCB0YWxrcyBvbmx5IHRvIHRoZSBsb2NhbCBycGNiaW5kLCBvdmVyIGxvb3BiYWNrXFxuKyAqIG9yIGEgbG9jYWwgQUZfTE9DQUwgc29ja2V0LCB3aGVyZSBhIGhlYWx0aHkgcnBjYmluZCBhbnN3ZXJzIGluIG1pY3Jvc2Vjb25kcy5cXG4rICovXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX3RpbWVvdXQgcnBjYl9sb2NhbF90aW1lb3V0ID0ge1xcbitcXHQudG9faW5pdHZhbFxcdD0gMSAqIEhaLFxcbitcXHQudG9fbWF4dmFsXFx0PSAxICogSFosXFxuK1xcdC50b19yZXRyaWVzXFx0PSAwLFxcbit9O1xcbitcXG4gLypcXG4gICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlXFxuICAqIGlzIHJldHVybmVkLlxcbkBAIC0yMzgsNiArMjQ4LDcgQEAgc3RhdGljIGludCBycGNiX2NyZWF0ZV9hZl9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsXFxuIFxcdFxcdC52ZXJzaW9uXFx0PSBSUENCVkVSU18yLFxcbiBcXHRcXHQuYXV0aGZsYXZvclxcdD0gUlBDX0FVVEhfTlVMTCxcXG4gXFx0XFx0LmNyZWRcXHRcXHQ9IGN1cnJlbnRfY3JlZCgpLFxcbitcXHRcXHQudGltZW91dFxcdD0gXFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2UgdHVybiBvZmYgdGhlIGlkbGUgdGltZW91dCB0byBwcmV2ZW50IHRoZSBrZXJuZWxcXG4gXFx0XFx0ICogZnJvbSBhdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3RpbmcgdGhlIHNvY2tldC5cXG5AQCAtMzEyLDYgKzMyMyw3IEBAIHN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfbmV0KHN0cnVjdCBuZXQgKm5ldClcXG4gXFx0XFx0LnZlcnNpb25cXHQ9IFJQQ0JWRVJTXzIsXFxuIFxcdFxcdC5hdXRoZmxhdm9yXFx0PSBSUENfQVVUSF9VTklYLFxcbiBcXHRcXHQuY3JlZFxcdFxcdD0gY3VycmVudF9jcmVkKCksXFxuK1xcdFxcdC50aW1lb3V0XFx0PSBcXHUwMDI2cnBjYl9sb2NhbF90aW1lb3V0LFxcbiBcXHRcXHQuZmxhZ3NcXHRcXHQ9IFJQQ19DTE5UX0NSRUFURV9OT1BJTkcsXFxuIFxcdH07XFxuIFxcdHN0cnVjdCBycGNfY2xudCAqY2xudCwgKmNsbnQ0O1xcbmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuY1xcbmluZGV4IDA1YzNlNmUyZjY1OTQuLmU5Y2ZjZWIxYTMzNDIgMTAwNjQ0XFxuLS0tIGEvbmV0L3N1bnJwYy9zdmMuY1xcbisrKyBiL25ldC9zdW5ycGMvc3ZjLmNcXG5AQCAtMTIwOCwxMyArMTIwOCwxNiBAQCBpbnQgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0LFxcbiBcXHRcXHRzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2dwID0gXFx1MDAyNnNlcnYtXFx1MDAzZXN2X3Byb2dyYW1zW3BdO1xcbiBcXG4gXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHByb2dwLVxcdTAwM2VwZ19udmVyczsgaSsrKSB7XFxuK1xcdFxcdFxcdGludCByZXQ7XFxuIFxcbi1cXHRcXHRcXHRlcnJvciA9IHByb2dwLVxcdTAwM2VwZ19ycGNiaW5kX3NldChuZXQsIHByb2dwLCBpLFxcbitcXHRcXHRcXHRyZXQgPSBwcm9ncC1cXHUwMDNlcGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSxcXG4gXFx0XFx0XFx0XFx0XFx0ZmFtaWx5LCBwcm90bywgcG9ydCk7XFxuLVxcdFxcdFxcdGlmIChlcnJvciBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApIHtcXG4gXFx0XFx0XFx0XFx0cHJpbnRrKEtFUk5fV0FSTklORyBcXFwic3ZjOiBmYWlsZWQgdG8gcmVnaXN0ZXIgXFxcIlxcbiBcXHRcXHRcXHRcXHRcXHRcXFwiJXN2JXUgUlBDIHNlcnZpY2UgKGVycm5vICVkKS5cXFxcblxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdHByb2dwLVxcdTAwM2VwZ19uYW1lLCBpLCAtZXJyb3IpO1xcbitcXHRcXHRcXHRcXHRcXHRwcm9ncC1cXHUwMDNlcGdfbmFtZSwgaSwgLXJldCk7XFxuK1xcdFxcdFxcdFxcdGlmICghZXJyb3IpXFxuK1xcdFxcdFxcdFxcdFxcdGVycm9yID0gcmV0O1xcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHR9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcXG5pbmRleCA4NDM0M2ZkMWUzNTRiLi40NjA1MDhkZTkzNzRmIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcXG5AQCAtODksNiArODksNyBAQCBUQVJHRVRTICs9IG5ldC9wYWNrZXRkcmlsbFxcbiBUQVJHRVRTICs9IG5ldC9wcHBcXG4gVEFSR0VUUyArPSBuZXQvcmRzXFxuIFRBUkdFVFMgKz0gbmV0L3RjcF9hb1xcbitUQVJHRVRTICs9IG5mc2RcXG4gVEFSR0VUUyArPSBub2xpYmNcXG4gVEFSR0VUUyArPSBwY2lfZW5kcG9pbnRcXG4gVEFSR0VUUyArPSBwY2llX2J3Y3RybFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmVcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE5ZTZkZWMwNGQ4ZTlcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlXFxuQEAgLTAsMCArMSBAQFxcbituZnNkX25ldGxpbmtfbGlzdGVuZXJcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGVcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1YWM2NTU0OWQyNTlcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZVxcbkBAIC0wLDAgKzEsNiBAQFxcbisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuK0NGTEFHUyArPSAkKEtIRFJfSU5DTFVERVMpIC1XYWxsXFxuK1xcbitURVNUX0dFTl9QUk9HUyA6PSBuZnNkX25ldGxpbmtfbGlzdGVuZXJcXG4rXFxuK2luY2x1ZGUgLi4vbGliLm1rXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWdcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2OTQ1ZmY5NTUxYzRcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWdcXG5AQCAtMCwwICsxLDQgQEBcXG4rQ09ORklHX05FVF9OUz15XFxuK0NPTkZJR19JUFY2PXlcXG4rQ09ORklHX05GU0Q9eVxcbitDT05GSUdfTkZTRF9WND15XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zZTMzMDc2ODBkN2Q0XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmNcXG5AQCAtMCwwICsxLDkyMCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBSZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUgTkZTRCBnZW5lcmljLW5ldGxpbmsgbGlzdGVuZXIgaW50ZXJmYWNlXFxuKyAqIChORlNEX0NNRF9MSVNURU5FUl9TRVQgLyBORlNEX0NNRF9MSVNURU5FUl9HRVQpLlxcbisgKlxcbisgKiBUaHJlZSBncm91cHM6XFxuKyAqICAgdmFsaWRhdGlvbiAgLSBtYWxmb3JtZWQvYWJ1c2l2ZSBMSVNURU5FUl9TRVQgcmVxdWVzdHMgYXJlIHJlamVjdGVkIGJ5XFxuKyAqICAgICAgICAgICAgICAgICBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycygpLCBiZWZvcmUgbmZzZF9tdXRleCBpcyB0YWtlbi5cXG4rICogICBmdW5jdGlvbmFsICAtIGNyZWF0ZS9hZGQvcmVtb3ZlIGxpc3RlbmVycyBhbmQgdmVyaWZ5IExJU1RFTkVSX0dFVFxcbisgKiAgICAgICAgICAgICAgICAgcmVmbGVjdHMgdGhlIHNldCAocm91bmQtdHJpcCBvZiB0cmFuc3BvcnQgKyBhZGRyOnBvcnQpLlxcbisgKiAgIHNlbWFudGljcyAgIC0gb25jZSB0aHJlYWRzIGFyZSBydW5uaW5nIChUSFJFQURTX1NFVCkgYSBsaXN0ZW5lciBjaGFuZ2VcXG4rICogICAgICAgICAgICAgICAgIGlzIHJlZnVzZWQgd2l0aCAtRUJVU1kuXFxuKyAqXFxuKyAqIEVhY2ggdGVzdCBydW5zIGluIGl0cyBvd24gcHJpdmF0ZSBuZXQgKyBtb3VudCBuYW1lc3BhY2UgKHVuc2hhcmUgaW5cXG4rICogRklYVFVSRV9TRVRVUCkuIC9ydW4gaXMgbWFza2VkIHRoZXJlOiBhIHBhdGhuYW1lIEFGX0xPQ0FMIGNvbm5lY3QgaXMgbm90XFxuKyAqIHNjb3BlZCBieSB0aGUgbmV0d29yayBuYW1lc3BhY2UsIHNpbmNlIHVuaXhfZmluZF9ic2QoKSByZXNvbHZlcyBieSBpbm9kZVxcbisgKiBhbmQgdGFrZXMgbm8gc3RydWN0IG5ldCwgc28gdGhlIGtlcm5lbCdzIHJwY2JpbmQgY2xpZW50IHdvdWxkIG90aGVyd2lzZSBiZVxcbisgKiBhYmxlIHRvIHJlYWNoIHRoZSBycGNiaW5kIHJ1bm5pbmcgb24gdGhlIGhvc3QuIEFueXRoaW5nIHRoYXQgY3JlYXRlcyBhXFxuKyAqIHNlcnYgaXMgc2VydmVkIGJ5IHRoZSBwZXItbmV0bnMgcnBjYmluZCBzdHViIGJlbG93IGluc3RlYWQuXFxuKyAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjcG9sbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc2NoZWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkZGVmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpbnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW91bnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9wcmN0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3NvY2tldC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvc3RhdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3RpbWUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy91bi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY25ldC9pZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbmV0aW5ldC9pbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbmV0bGluay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZ2VuZXRsaW5rLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwiLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFxcXCJcXG4rXFxuKy8qIE5GU0QgZ2VuZXJpYy1uZXRsaW5rIGNvbnN0YW50cyAoZnJvbSBsaW51eC9uZnNkX25ldGxpbmsuaCkuICovXFxuKyNkZWZpbmUgTkZTRF9GQU1JTFlfTkFNRVxcdFxcdFxcXCJuZnNkXFxcIlxcbisjZGVmaW5lIE5GU0RfQ01EX1RIUkVBRFNfU0VUXFx0XFx0MlxcbisjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX1NFVFxcdFxcdDZcXG4rI2RlZmluZSBORlNEX0NNRF9MSVNURU5FUl9HRVRcXHRcXHQ3XFxuKyNkZWZpbmUgTkZTRF9BX1NFUlZFUl9USFJFQURTXFx0XFx0MVxcbisjZGVmaW5lIE5GU0RfQV9TRVJWRVJfU09DS19BRERSXFx0XFx0MVxcdC8qIHBlci1saXN0ZW5lciBuZXN0ICovXFxuKyNkZWZpbmUgTkZTRF9BX1NPQ0tfQUREUlxcdFxcdDFcXHQvKiBpbnNpZGUgdGhlIG5lc3QgKi9cXG4rI2RlZmluZSBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRVxcdDJcXHQvKiBpbnNpZGUgdGhlIG5lc3QgKi9cXG4rXFxuKyNkZWZpbmUgTkxBX0FMSUdONChsZW4pXFx0XFx0XFx0KCgobGVuKSArIDMpIFxcdTAwMjYgfjMpXFxuKyNkZWZpbmUgVEVTVF9QT1JUXFx0XFx0XFx0MjAwNDlcXG4rI2RlZmluZSBNQVhfTElTVEVORVJTXFx0XFx0XFx0OFxcbisjZGVmaW5lIFJFQ1ZfVElNRU9fU0VDXFx0XFx0XFx0MzBcXG4rXFxuK3N0YXRpYyBpbnQgbmZzZF9mYW1pbHk7XFx0XFx0XFx0Lyogc2V0IHBlci10ZXN0IGluIEZJWFRVUkVfU0VUVVAgKi9cXG4rXFxuK3N0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICptc2cpXFxuK3tcXG4rXFx0cGVycm9yKG1zZyk7XFxuK1xcdGV4aXQoMSk7XFxuK31cXG4rXFxuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gbWluaW1hbCBnZW5lcmljLW5ldGxpbmsgcGx1bWJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rc3RhdGljIGludCBnZW5sX29wZW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfbmwgc2EgPSB7IC5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LIH07XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHR2ID0geyAudHZfc2VjID0gUkVDVl9USU1FT19TRUMgfTtcXG4rXFx0aW50IGZkID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX0dFTkVSSUMpO1xcbitcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0ZGllKFxcXCJzb2NrZXQoTkVUTElOS19HRU5FUklDKVxcXCIpO1xcbitcXHRpZiAoYmluZChmZCwgKHZvaWQgKilcXHUwMDI2c2EsIHNpemVvZihzYSkpIFxcdTAwM2MgMClcXG4rXFx0XFx0ZGllKFxcXCJiaW5kKG5ldGxpbmspXFxcIik7XFxuK1xcdHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCBcXHUwMDI2dHYsIHNpemVvZih0dikpO1xcbitcXHRyZXR1cm4gZmQ7XFxuK31cXG4rXFxuKy8qIEFwcGVuZCBhbiBhdHRyaWJ1dGUgYXQgQG9mZjsgcmV0dXJuIHRoZSBuZXcgKGFsaWduZWQpIG9mZnNldC4gKi9cXG4rc3RhdGljIGludCBwdXRfYXR0cihjaGFyICpidWYsIGludCBvZmYsIHVpbnQxNl90IHR5cGUsXFxuK1xcdFxcdCAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKVxcbit7XFxuK1xcdHN0cnVjdCBubGF0dHIgKm5hID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcXG4rXFxuK1xcdG5hLVxcdTAwM2VubGFfdHlwZSA9IHR5cGU7XFxuK1xcdG5hLVxcdTAwM2VubGFfbGVuID0gTkxBX0hEUkxFTiArIGxlbjtcXG4rXFx0aWYgKGxlbilcXG4rXFx0XFx0bWVtY3B5KGJ1ZiArIG9mZiArIE5MQV9IRFJMRU4sIGRhdGEsIGxlbik7XFxuK1xcdHJldHVybiBvZmYgKyBOTEFfQUxJR040KE5MQV9IRFJMRU4gKyBsZW4pO1xcbit9XFxuK1xcbisvKiBCdWlsZCBhIGdlbmwgbWVzc2FnZSBoZWFkZXIgaW50byBAYnVmOyByZXR1cm4gdGhlIG9mZnNldCBwYXN0IGl0LiAqL1xcbitzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKVxcbit7XFxuK1xcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XFxuK1xcdHN0cnVjdCBnZW5sbXNnaGRyICpnbmwgPSAodm9pZCAqKShidWYgKyBOTE1TR19IRFJMRU4pO1xcbitcXG4rXFx0bWVtc2V0KGJ1ZiwgMCwgTkxNU0dfSERSTEVOICsgR0VOTF9IRFJMRU4pO1xcbitcXHRubGgtXFx1MDAzZW5sbXNnX3R5cGUgPSB0eXBlO1xcbitcXHRubGgtXFx1MDAzZW5sbXNnX2ZsYWdzID0gZmxhZ3M7XFxuK1xcdG5saC1cXHUwMDNlbmxtc2dfc2VxID0gMTtcXG4rXFx0Z25sLVxcdTAwM2VjbWQgPSBjbWQ7XFxuK1xcdGdubC1cXHUwMDNldmVyc2lvbiA9IDE7XFxuK1xcdHJldHVybiBOTE1TR19IRFJMRU4gKyBHRU5MX0hEUkxFTjtcXG4rfVxcbitcXG4rLyogU2VuZCBhbiBuZnNkIGNvbW1hbmQgd2l0aCBhbiBBQ0s7IHJldHVybiB0aGUgQUNLIGVycm5vIChcXHUwMDNjPSAwKS4gKi9cXG4rc3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKVxcbit7XFxuK1xcdGNoYXIgYnVmWzEgXFx1MDAzY1xcdTAwM2MgMjBdLCByYnVmWzQwOTZdO1xcbitcXHRzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmO1xcbitcXHRpbnQgZmQgPSBnZW5sX29wZW4oKTtcXG4rXFx0aW50IG9mZiwgbiwgcmV0O1xcbitcXG4rXFx0b2ZmID0gZ2VubF9oZHIoYnVmLCBuZnNkX2ZhbWlseSwgTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0FDSywgY21kKTtcXG4rXFx0aWYgKGF0dHJzX2xlbikge1xcbitcXHRcXHRtZW1jcHkoYnVmICsgb2ZmLCBhdHRycywgYXR0cnNfbGVuKTtcXG4rXFx0XFx0b2ZmICs9IGF0dHJzX2xlbjtcXG4rXFx0fVxcbitcXHRubGgtXFx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcXG4rXFxuK1xcdGlmIChzZW5kKGZkLCBidWYsIG9mZiwgMCkgXFx1MDAzYyAwKVxcbitcXHRcXHRkaWUoXFxcInNlbmQoZ2VubClcXFwiKTtcXG4rXFxuK1xcdG4gPSByZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApO1xcbitcXHRpZiAobiBcXHUwMDNjIDApXFxuK1xcdFxcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcXG4rXFx0ZWxzZSBpZiAoKChzdHJ1Y3Qgbmxtc2doZHIgKilyYnVmKS1cXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcXG4rXFx0XFx0cmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS1cXHUwMDNlZXJyb3I7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cmV0ID0gMDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKiBTZW5kIGEgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBmdWxsIHJlcGx5IG1lc3NhZ2U7IC1lcnJubyBvbiBmYWlsdXJlLiAqL1xcbitzdGF0aWMgaW50IGdlbmxfcmVxdWVzdF9yZXBseSh1aW50OF90IGNtZCwgY2hhciAqcmJ1Ziwgc2l6ZV90IHJsZW4pXFxuK3tcXG4rXFx0Y2hhciBidWZbMjU2XTtcXG4rXFx0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcXG4rXFx0aW50IGZkID0gZ2VubF9vcGVuKCk7XFxuK1xcdGludCBvZmYsIG4sIHJldDtcXG4rXFxuK1xcdG9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QsIGNtZCk7XFxuK1xcdG5saC1cXHUwMDNlbmxtc2dfbGVuID0gb2ZmO1xcbitcXG4rXFx0aWYgKHNlbmQoZmQsIGJ1Ziwgb2ZmLCAwKSBcXHUwMDNjIDApXFxuK1xcdFxcdGRpZShcXFwic2VuZChnZW5sIHJlcGx5KVxcXCIpO1xcbitcXG4rXFx0biA9IHJlY3YoZmQsIHJidWYsIHJsZW4sIDApO1xcbitcXHRpZiAobiBcXHUwMDNjIDApXFxuK1xcdFxcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcXG4rXFx0ZWxzZSBpZiAoKChzdHJ1Y3Qgbmxtc2doZHIgKilyYnVmKS1cXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcXG4rXFx0XFx0cmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS1cXHUwMDNlZXJyb3I7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cmV0ID0gbjtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKiBSZXNvbHZlIHRoZSBcXFwibmZzZFxcXCIgZ2VubCBmYW1pbHkgaWQ7IC0xIGlmIG5vdCByZWdpc3RlcmVkLiAqL1xcbitzdGF0aWMgaW50IGdlbmxfcmVzb2x2ZV9uZnNkKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciBidWZbMTAyNF0sIHJidWZbNDA5Nl07XFxuK1xcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XFxuK1xcdHN0cnVjdCBubG1zZ2hkciAqcmggPSAodm9pZCAqKXJidWY7XFxuK1xcdHN0cnVjdCBubGF0dHIgKm5hO1xcbitcXHRpbnQgZmQsIG9mZiwgbGVmdCwgaWQgPSAtMTtcXG4rXFxuK1xcdGZkID0gZ2VubF9vcGVuKCk7XFxuK1xcdG9mZiA9IGdlbmxfaGRyKGJ1ZiwgR0VOTF9JRF9DVFJMLCBOTE1fRl9SRVFVRVNULCBDVFJMX0NNRF9HRVRGQU1JTFkpO1xcbitcXHRvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLFxcbitcXHRcXHQgICAgICAgTkZTRF9GQU1JTFlfTkFNRSwgc2l6ZW9mKE5GU0RfRkFNSUxZX05BTUUpKTtcXG4rXFx0bmxoLVxcdTAwM2VubG1zZ19sZW4gPSBvZmY7XFxuK1xcbitcXHRpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApIFxcdTAwM2MgMClcXG4rXFx0XFx0ZGllKFxcXCJzZW5kKEdFVEZBTUlMWSlcXFwiKTtcXG4rXFx0aWYgKHJlY3YoZmQsIHJidWYsIHNpemVvZihyYnVmKSwgMCkgXFx1MDAzYyAwKVxcbitcXHRcXHRkaWUoXFxcInJlY3YoR0VURkFNSUxZKVxcXCIpO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRpZiAocmgtXFx1MDAzZW5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdG5hID0gKHZvaWQgKikoKGNoYXIgKilOTE1TR19EQVRBKHJoKSArIEdFTkxfSERSTEVOKTtcXG4rXFx0bGVmdCA9IHJoLVxcdTAwM2VubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjtcXG4rXFx0d2hpbGUgKGxlZnQgXFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XFxuK1xcdFxcdGlmIChuYS1cXHUwMDNlbmxhX3R5cGUgPT0gQ1RSTF9BVFRSX0ZBTUlMWV9JRCkge1xcbitcXHRcXHRcXHRpZCA9ICoodWludDE2X3QgKikoKGNoYXIgKiluYSArIE5MQV9IRFJMRU4pO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRsZWZ0IC09IE5MQV9BTElHTjQobmEtXFx1MDAzZW5sYV9sZW4pO1xcbitcXHRcXHRuYSA9ICh2b2lkICopKChjaGFyICopbmEgKyBOTEFfQUxJR040KG5hLVxcdTAwM2VubGFfbGVuKSk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGlkO1xcbit9XFxuK1xcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGxpc3RlbmVyIHJlcXVlc3QgYnVpbGRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rLyogRmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIG5lZ2F0aXZlIHRlc3RzOiBhbnkgZmllbGQgY2FuIGJlIG9taXR0ZWQvbWFsZm9ybWVkLiAqL1xcbitzdHJ1Y3QgcmF3X2xpc3RlbmVyIHtcXG4rXFx0Y29uc3QgY2hhciAqeHBydDtcXHQvKiBOVUxMIC1cXHUwMDNlIG9taXQgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUgKi9cXG4rXFx0aW50IGVtaXRfYWRkcjtcXHRcXHQvKiAwIC1cXHUwMDNlIG9taXQgTkZTRF9BX1NPQ0tfQUREUiAqL1xcbitcXHRjb25zdCB2b2lkICphZGRyO1xcbitcXHRpbnQgYWRkcl9sZW47XFx0XFx0LyogYnl0ZXMgdG8gZW1pdCBmb3IgTkZTRF9BX1NPQ0tfQUREUiAqL1xcbit9O1xcbitcXG4rc3RhdGljIGludCBwdXRfcmF3X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3Qgc3RydWN0IHJhd19saXN0ZW5lciAqcilcXG4re1xcbitcXHRzdHJ1Y3QgbmxhdHRyICpuZXN0ID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcXG4rXFx0aW50IGlubmVyID0gb2ZmICsgTkxBX0hEUkxFTjtcXG4rXFxuK1xcdGlmIChyLVxcdTAwM2VlbWl0X2FkZHIpXFxuK1xcdFxcdGlubmVyID0gcHV0X2F0dHIoYnVmLCBpbm5lciwgTkZTRF9BX1NPQ0tfQUREUiwgci1cXHUwMDNlYWRkciwgci1cXHUwMDNlYWRkcl9sZW4pO1xcbitcXHRpZiAoci1cXHUwMDNleHBydClcXG4rXFx0XFx0aW5uZXIgPSBwdXRfYXR0cihidWYsIGlubmVyLCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSxcXG4rXFx0XFx0XFx0XFx0IHItXFx1MDAzZXhwcnQsIHN0cmxlbihyLVxcdTAwM2V4cHJ0KSArIDEpO1xcbitcXHRuZXN0LVxcdTAwM2VubGFfdHlwZSA9IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIHwgTkxBX0ZfTkVTVEVEO1xcbitcXHRuZXN0LVxcdTAwM2VubGFfbGVuID0gaW5uZXIgLSBvZmY7XFxuK1xcdHJldHVybiBvZmYgKyBOTEFfQUxJR040KG5lc3QtXFx1MDAzZW5sYV9sZW4pO1xcbit9XFxuK1xcbisvKiBXZWxsLWZvcm1lZCBsb29wYmFjayBsaXN0ZW5lciBmb3IgQGZhbWlseSAoQUZfSU5FVCBvciBBRl9JTkVUNikuICovXFxuK3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyX2FmKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSxcXG4rXFx0XFx0XFx0ICAgdWludDE2X3QgcG9ydClcXG4re1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHswfTtcXG4rXFx0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IHhwcnQsIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFxcdTAwMjZzcyB9O1xcbitcXG4rXFx0aWYgKGZhbWlseSA9PSBBRl9JTkVUNikge1xcbitcXHRcXHRzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzNiA9ICh2b2lkICopXFx1MDAyNnNzO1xcbitcXG4rXFx0XFx0czYtXFx1MDAzZXNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7XFxuK1xcdFxcdHM2LVxcdTAwM2VzaW42X3BvcnQgPSBodG9ucyhwb3J0KTtcXG4rXFx0XFx0czYtXFx1MDAzZXNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7XFxuK1xcdFxcdHIuYWRkcl9sZW4gPSBzaXplb2YoKnM2KTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c3RydWN0IHNvY2thZGRyX2luICpzNCA9ICh2b2lkICopXFx1MDAyNnNzO1xcbitcXG4rXFx0XFx0czQtXFx1MDAzZXNpbl9mYW1pbHkgPSBBRl9JTkVUO1xcbitcXHRcXHRzNC1cXHUwMDNlc2luX3BvcnQgPSBodG9ucyhwb3J0KTtcXG4rXFx0XFx0czQtXFx1MDAzZXNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7XFxuK1xcdFxcdHIuYWRkcl9sZW4gPSBzaXplb2YoKnM0KTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gcHV0X3Jhd19saXN0ZW5lcihidWYsIG9mZiwgXFx1MDAyNnIpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHB1dF9saXN0ZW5lcihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IGNoYXIgKnhwcnQsIHVpbnQxNl90IHBvcnQpXFxuK3tcXG4rXFx0cmV0dXJuIHB1dF9saXN0ZW5lcl9hZihidWYsIG9mZiwgeHBydCwgQUZfSU5FVCwgcG9ydCk7XFxuK31cXG4rXFxuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gTElTVEVORVJfR0VUIHBhcnNpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rc3RydWN0IGxpc3RlbmVyX2VudCB7XFxuK1xcdGNoYXIgeHBydFsxNl07XFxuK1xcdGludCBmYW1pbHk7XFxuK1xcdHVpbnQxNl90IHBvcnQ7XFxuK1xcdHN0cnVjdCBpbl9hZGRyIGE0O1xcbitcXHRzdHJ1Y3QgaW42X2FkZHIgYTY7XFxuK307XFxuK1xcbitzdGF0aWMgaW50IHBhcnNlX2xpc3RlbmVyX2dldChjb25zdCBjaGFyICpyYnVmLCBpbnQgbGVuLFxcbitcXHRcXHRcXHQgICAgICBzdHJ1Y3QgbGlzdGVuZXJfZW50ICpvdXQsIGludCBtYXgpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGggPSAoY29uc3Qgdm9pZCAqKXJidWY7XFxuK1xcdGNvbnN0IHN0cnVjdCBubGF0dHIgKm5hO1xcbitcXHRpbnQgbGVmdCwgY291bnQgPSAwO1xcbitcXG4rXFx0KHZvaWQpbGVuO1xcbitcXHRuYSA9IChjb25zdCB2b2lkICopKHJidWYgKyBOTE1TR19IRFJMRU4gKyBHRU5MX0hEUkxFTik7XFxuK1xcdGxlZnQgPSBubGgtXFx1MDAzZW5sbXNnX2xlbiAtIE5MTVNHX0hEUkxFTiAtIEdFTkxfSERSTEVOO1xcbitcXG4rXFx0d2hpbGUgKGxlZnQgXFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XFxuK1xcdFxcdGludCBhbGVuID0gbmEtXFx1MDAzZW5sYV9sZW47XFxuK1xcbitcXHRcXHRpZiAoKG5hLVxcdTAwM2VubGFfdHlwZSBcXHUwMDI2IE5MQV9UWVBFX01BU0spID09IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBjb3VudCBcXHUwMDNjIG1heCkge1xcbitcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmxhdHRyICppbiA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgKyBOTEFfSERSTEVOKTtcXG4rXFx0XFx0XFx0aW50IGlsZWZ0ID0gYWxlbiAtIE5MQV9IRFJMRU47XFxuK1xcdFxcdFxcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmUgPSBcXHUwMDI2b3V0W2NvdW50XTtcXG4rXFxuK1xcdFxcdFxcdG1lbXNldChlLCAwLCBzaXplb2YoKmUpKTtcXG4rXFx0XFx0XFx0d2hpbGUgKGlsZWZ0IFxcdTAwM2U9IChpbnQpTkxBX0hEUkxFTikge1xcbitcXHRcXHRcXHRcXHRjb25zdCB2b2lkICpkID0gKGNvbnN0IGNoYXIgKilpbiArIE5MQV9IRFJMRU47XFxuK1xcdFxcdFxcdFxcdGludCB0ID0gaW4tXFx1MDAzZW5sYV90eXBlIFxcdTAwMjYgTkxBX1RZUEVfTUFTSztcXG4rXFxuK1xcdFxcdFxcdFxcdGlmICh0ID09IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FKSB7XFxuK1xcdFxcdFxcdFxcdFxcdHN0cm5jcHkoZS1cXHUwMDNleHBydCwgZCwgc2l6ZW9mKGUtXFx1MDAzZXhwcnQpIC0gMSk7XFxuK1xcdFxcdFxcdFxcdH0gZWxzZSBpZiAodCA9PSBORlNEX0FfU09DS19BRERSKSB7XFxuK1xcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpzcyA9IGQ7XFxuK1xcbitcXHRcXHRcXHRcXHRcXHRlLVxcdTAwM2VmYW1pbHkgPSBzcy1cXHUwMDNlc3NfZmFtaWx5O1xcbitcXHRcXHRcXHRcXHRcXHRpZiAoc3MtXFx1MDAzZXNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7XFxuK1xcdFxcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqcyA9IGQ7XFxuK1xcbitcXHRcXHRcXHRcXHRcXHRcXHRlLVxcdTAwM2VhNCA9IHMtXFx1MDAzZXNpbl9hZGRyO1xcbitcXHRcXHRcXHRcXHRcXHRcXHRlLVxcdTAwM2Vwb3J0ID0gbnRvaHMocy1cXHUwMDNlc2luX3BvcnQpO1xcbitcXHRcXHRcXHRcXHRcXHR9IGVsc2UgaWYgKHNzLVxcdTAwM2Vzc19mYW1pbHkgPT0gQUZfSU5FVDYpIHtcXG4rXFx0XFx0XFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqcyA9IGQ7XFxuK1xcbitcXHRcXHRcXHRcXHRcXHRcXHRlLVxcdTAwM2VhNiA9IHMtXFx1MDAzZXNpbjZfYWRkcjtcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ZS1cXHUwMDNlcG9ydCA9IG50b2hzKHMtXFx1MDAzZXNpbjZfcG9ydCk7XFxuK1xcdFxcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHRcXHRpbGVmdCAtPSBOTEFfQUxJR040KGluLVxcdTAwM2VubGFfbGVuKTtcXG4rXFx0XFx0XFx0XFx0aW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKWluICsgTkxBX0FMSUdONChpbi1cXHUwMDNlbmxhX2xlbikpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGNvdW50Kys7XFxuK1xcdFxcdH1cXG4rXFx0XFx0bGVmdCAtPSBOTEFfQUxJR040KGFsZW4pO1xcbitcXHRcXHRuYSA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgKyBOTEFfQUxJR040KGFsZW4pKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gY29udmVuaWVuY2Ugd3JhcHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rc3RhdGljIGludCBsaXN0ZW5lcl9zZXQoY29uc3QgY2hhciAqYXR0cnMsIGludCBsZW4pXFxuK3tcXG4rXFx0cmV0dXJuIGdlbmxfcmVxdWVzdChORlNEX0NNRF9MSVNURU5FUl9TRVQsIGF0dHJzLCBsZW4pO1xcbit9XFxuK1xcbisvKiBGZXRjaCB0aGUgY3VycmVudCBsaXN0ZW5lcnM7IHJldHVybnMgY291bnQgKFxcdTAwM2U9MCkgb3IgLWVycm5vLiAqL1xcbitzdGF0aWMgaW50IGxpc3RlbmVyX2dldChzdHJ1Y3QgbGlzdGVuZXJfZW50ICpvdXQsIGludCBtYXgpXFxuK3tcXG4rXFx0Y2hhciByYnVmWzgxOTJdO1xcbitcXHRpbnQgbiA9IGdlbmxfcmVxdWVzdF9yZXBseShORlNEX0NNRF9MSVNURU5FUl9HRVQsIHJidWYsIHNpemVvZihyYnVmKSk7XFxuK1xcbitcXHRpZiAobiBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiBuO1xcbitcXHRyZXR1cm4gcGFyc2VfbGlzdGVuZXJfZ2V0KHJidWYsIG4sIG91dCwgbWF4KTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmZpbmRfbGlzdGVuZXIoc3RydWN0IGxpc3RlbmVyX2VudCAqZSwgaW50IG4sXFxuK1xcdFxcdFxcdFxcdFxcdCAgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSxcXG4rXFx0XFx0XFx0XFx0XFx0ICB1aW50MTZfdCBwb3J0KVxcbit7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0aWYgKGVbaV0uZmFtaWx5ID09IGZhbWlseSBcXHUwMDI2XFx1MDAyNiBlW2ldLnBvcnQgPT0gcG9ydCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXN0cmNtcChlW2ldLnhwcnQsIHhwcnQpKVxcbitcXHRcXHRcXHRyZXR1cm4gXFx1MDAyNmVbaV07XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKiBTdGFydCAoQG4gXFx1MDAzZSAwKSBvciBzdG9wIChAbiA9PSAwKSBuZnNkIHRocmVhZHMgaW4gdGhpcyBuZXRucy4gKi9cXG4rc3RhdGljIGludCB0aHJlYWRzX3NldChpbnQgbilcXG4re1xcbitcXHRjaGFyIGF0dHJzWzY0XTtcXG4rXFx0dWludDMyX3QgdiA9IG47XFxuK1xcdGludCBvZmYgPSBwdXRfYXR0cihhdHRycywgMCwgTkZTRF9BX1NFUlZFUl9USFJFQURTLCBcXHUwMDI2diwgc2l6ZW9mKHYpKTtcXG4rXFxuK1xcdHJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfVEhSRUFEU19TRVQsIGF0dHJzLCBvZmYpO1xcbit9XFxuK1xcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIHBlci1uZXRucyBsb2NhbCBycGNiaW5kIHN0dWIgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rLypcXG4rICogQ3JlYXRpbmcgYSBsaXN0ZW5lciByZWdpc3RlcnMgd2l0aCBycGNiaW5kOiBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpXFxuKyAqIHBhc3NlcyBmbGFncyBvZiAwLCBzbyBwbWFwX3JlZ2lzdGVyIGlzIHRydWUgaW4gc3ZjX3NldHVwX3NvY2tldCgpLCBhbmRcXG4rICogbmZzZF92ZXJzaW9uMyBpcyByZWdpc3RlcmFibGUgYnkgZGVmYXVsdCBhbmQgZG9lcyBub3Qgc2V0IHZzX3JwY2Jfb3B0bmwsXFxuKyAqIHNvIGEgcmVnaXN0cmF0aW9uIGZhaWx1cmUgYWJvcnRzIGxpc3RlbmVyIGNyZWF0aW9uLiBUaGUgYWJzdHJhY3QgQUZfTE9DQUxcXG4rICogbmFtZSB0aGUga2VybmVsIHRyaWVzIGZpcnN0IGlzIHBlci1uZXRucyAodW5peF9maW5kX2Fic3RyYWN0KCkgdGFrZXMgYVxcbisgKiBzdHJ1Y3QgbmV0KSwgc28gYW5zd2VyIGl0IGhlcmUgYW5kIHN0YXkgb3V0IG9mIHRoZSBob3N0J3MgcnBjYmluZC5cXG4rICpcXG4rICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZFxcbisgKiBTRVQvVU5TRVQgZ2V0IFRSVUUsIGZvciBib3RoIFJQQ0JWRVJTXzIgYW5kIFJQQ0JWRVJTXzQuIHY0IGhhcyB0byBiZVxcbisgKiBhbnN3ZXJlZCBiZWNhdXNlIF9fc3ZjX3JwY2JfcmVnaXN0ZXI2KCkgdHVybnMgYSB2NCByZWZ1c2FsIGludG9cXG4rICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLlxcbisgKlxcbisgKiBJbiBSUENCX1NUVUJfUkVGVVNFIG1vZGUgU0VUIGlzIGFuc3dlcmVkIEZBTFNFIGluc3RlYWQsIHdoaWNoXFxuKyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seVxcbisgKiBzdmNfdW5yZWdpc3RlcigpIGlzc3VlcyBpdCwgYW5kIGl0IGRpc2NhcmRzIHRoZSByZXN1bHQuXFxuKyAqL1xcbisjZGVmaW5lIFJQQ0JfUFJPR1JBTVxcdFxcdDEwMDAwMFxcbisjZGVmaW5lIFJQQ0JfUFJPQ19OVUxMXFx0XFx0MFxcbisjZGVmaW5lIFJQQ0JfUFJPQ19TRVRcXHRcXHQxXFxuKyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUXFx0XFx0MlxcbisjZGVmaW5lIFJQQ0JfQUJTVFJBQ1RfTkFNRVxcdFxcXCIvcnVuL3JwY2JpbmQuc29ja1xcXCJcXG4rI2RlZmluZSBSUENCX1NUVUJfTUFYQ09OTlxcdDRcXG4rXFxuK2VudW0geyBSUENCX1NUVUJfQUNDRVBULCBSUENCX1NUVUJfUkVGVVNFIH07XFxuK1xcbitzdGF0aWMgaW50IHJwY2Jfc3R1Yl9saXN0ZW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfdW4gc3VuID0geyAuc3VuX2ZhbWlseSA9IEFGX1VOSVggfTtcXG4rXFx0c2l6ZV90IG5sZW4gPSBzdHJsZW4oUlBDQl9BQlNUUkFDVF9OQU1FKTtcXG4rXFx0c29ja2xlbl90IGFsZW47XFxuK1xcdGludCBmZDtcXG4rXFxuK1xcdC8qIEFic3RyYWN0IG5hbWVzIGFyZSBsZW5ndGgtZGVsaW1pdGVkLCBzbyB0aGUgbGVuZ3RoIG11c3QgbWF0Y2guICovXFxuK1xcdG1lbWNweShzdW4uc3VuX3BhdGggKyAxLCBSUENCX0FCU1RSQUNUX05BTUUsIG5sZW4pO1xcbitcXHRhbGVuID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyAxICsgbmxlbjtcXG4rXFxuK1xcdGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKVxcdTAwMjZzdW4sIGFsZW4pIFxcdTAwM2MgMCB8fFxcbitcXHQgICAgbGlzdGVuKGZkLCBSUENCX1NUVUJfTUFYQ09OTikgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGNsb3NlKGZkKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcdHJldHVybiBmZDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBycGNiX3N0dWJfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRzaXplX3QgZG9uZSA9IDA7XFxuK1xcbitcXHR3aGlsZSAoZG9uZSBcXHUwMDNjIGxlbikge1xcbitcXHRcXHRzc2l6ZV90IG4gPSByZWFkKGZkLCAoY2hhciAqKWJ1ZiArIGRvbmUsIGxlbiAtIGRvbmUpO1xcbitcXG4rXFx0XFx0aWYgKG4gXFx1MDAzYz0gMClcXG4rXFx0XFx0XFx0cmV0dXJuIC0xO1xcbitcXHRcXHRkb25lICs9IG47XFxuK1xcdH1cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIEhhbmRsZSBvbmUgcmVjb3JkLW1hcmtlZCBSUEMgY2FsbC4gUmV0dXJucyAtMSB3aGVuIHRoZSBwZWVyIGlzIGRvbmUuICovXFxuK3N0YXRpYyBpbnQgcnBjYl9zdHViX2NhbGwoaW50IGZkLCBpbnQgbW9kZSlcXG4re1xcbitcXHR1aW50MzJfdCBtYXJrLCBjYWxsWzZdLCByZXBbN107XFxuK1xcdHVuc2lnbmVkIGludCBsZW4sIG5yZXAgPSA2O1xcbitcXHRzaXplX3QgcmVwbGVuO1xcbitcXG4rXFx0aWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBcXHUwMDI2bWFyaywgc2l6ZW9mKG1hcmspKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRsZW4gPSBudG9obChtYXJrKSBcXHUwMDI2IDB4N2ZmZmZmZmY7XFxuK1xcdGlmIChsZW4gXFx1MDAzYyBzaXplb2YoY2FsbCkgfHwgbGVuIFxcdTAwM2UgNDA5NilcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdC8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqL1xcbitcXHRmb3IgKGxlbiAtPSBzaXplb2YoY2FsbCk7IGxlbjsgKSB7XFxuK1xcdFxcdGNoYXIgc2lua1syNTZdO1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgbiA9IGxlbiBcXHUwMDNlIHNpemVvZihzaW5rKSA/IHNpemVvZihzaW5rKSA6IGxlbjtcXG4rXFxuK1xcdFxcdGlmIChycGNiX3N0dWJfcmVhZChmZCwgc2luaywgbikpXFxuK1xcdFxcdFxcdHJldHVybiAtMTtcXG4rXFx0XFx0bGVuIC09IG47XFxuK1xcdH1cXG4rXFxuK1xcdHJlcFswXSA9IGNhbGxbMF07XFx0XFx0LyogeGlkICovXFxuK1xcdHJlcFsxXSA9IGh0b25sKDEpO1xcdFxcdC8qIFJFUExZICovXFxuK1xcdHJlcFsyXSA9IGh0b25sKDApO1xcdFxcdC8qIE1TR19BQ0NFUFRFRCAqL1xcbitcXHRyZXBbM10gPSBodG9ubCgwKTtcXHRcXHQvKiB2ZXJpZmllciBmbGF2b3IgQVVUSF9OVUxMICovXFxuK1xcdHJlcFs0XSA9IGh0b25sKDApO1xcdFxcdC8qIHZlcmlmaWVyIGxlbmd0aCAqL1xcbitcXHRyZXBbNV0gPSBodG9ubCgwKTtcXHRcXHQvKiBTVUNDRVNTICovXFxuK1xcbitcXHRpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7XFxuK1xcdFxcdHJlcFs1XSA9IGh0b25sKDEpO1xcdC8qIFBST0dfVU5BVkFJTCAqL1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7XFxuK1xcdFxcdGNhc2UgUlBDQl9QUk9DX05VTEw6XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFJQQ0JfUFJPQ19TRVQ6XFxuK1xcdFxcdFxcdHJlcFs2XSA9IGh0b25sKG1vZGUgPT0gUlBDQl9TVFVCX1JFRlVTRSA/IDAgOiAxKTtcXG4rXFx0XFx0XFx0bnJlcCA9IDc7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFJQQ0JfUFJPQ19VTlNFVDpcXG4rXFx0XFx0XFx0cmVwWzZdID0gaHRvbmwoMSk7XFx0LyogVFJVRSAqL1xcbitcXHRcXHRcXHRucmVwID0gNztcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdHJlcFs1XSA9IGh0b25sKDMpO1xcdC8qIFBST0NfVU5BVkFJTCAqL1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJlcGxlbiA9IG5yZXAgKiBzaXplb2YocmVwWzBdKTtcXG4rXFx0bWFyayA9IGh0b25sKDB4ODAwMDAwMDAgfCByZXBsZW4pO1xcbitcXHRpZiAod3JpdGUoZmQsIFxcdTAwMjZtYXJrLCBzaXplb2YobWFyaykpICE9IChzc2l6ZV90KXNpemVvZihtYXJrKSB8fFxcbitcXHQgICAgd3JpdGUoZmQsIHJlcCwgcmVwbGVuKSAhPSAoc3NpemVfdClyZXBsZW4pXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSlcXG4re1xcbitcXHRzdHJ1Y3QgcG9sbGZkIHBmZFsxICsgUlBDQl9TVFVCX01BWENPTk5dO1xcbitcXHRuZmRzX3QgbiA9IDEsIGk7XFxuK1xcbitcXHRwZmRbMF0uZmQgPSBsZmQ7XFxuK1xcbitcXHRmb3IgKDs7KSB7XFxuK1xcdFxcdC8qIHN0b3AgcG9sbGluZyB0aGUgbGlzdGVuZXIgd2hlbiBmdWxsLCBvciBwb2xsKCkgc3BpbnMgKi9cXG4rXFx0XFx0cGZkWzBdLmV2ZW50cyA9IG4gXFx1MDAzYyAxICsgUlBDQl9TVFVCX01BWENPTk4gPyBQT0xMSU4gOiAwO1xcbitcXG4rXFx0XFx0aWYgKHBvbGwocGZkLCBuLCAtMSkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRcXHRpZiAocGZkWzBdLnJldmVudHMgXFx1MDAyNiBQT0xMSU4pIHtcXG4rXFx0XFx0XFx0aW50IGMgPSBhY2NlcHQobGZkLCBOVUxMLCBOVUxMKTtcXG4rXFxuK1xcdFxcdFxcdGlmIChjIFxcdTAwM2U9IDApIHtcXG4rXFx0XFx0XFx0XFx0cGZkW25dLmZkID0gYztcXG4rXFx0XFx0XFx0XFx0cGZkW25dLmV2ZW50cyA9IFBPTExJTjtcXG4rXFx0XFx0XFx0XFx0bisrO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBuOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKCEocGZkW2ldLnJldmVudHMgXFx1MDAyNiAoUE9MTElOIHwgUE9MTEhVUCB8IFBPTExFUlIpKSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGlmIChycGNiX3N0dWJfY2FsbChwZmRbaV0uZmQsIG1vZGUpKSB7XFxuK1xcdFxcdFxcdFxcdGNsb3NlKHBmZFtpXS5mZCk7XFxuK1xcdFxcdFxcdFxcdHBmZFtpXSA9IHBmZFstLW5dO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0fVxcbit9XFxuK1xcbisvKiBSZXR1cm5zIHRoZSBzdHViJ3MgcGlkLCBvciAtMS4gVGhlIHNvY2tldCBpcyBsaXN0ZW5pbmcgYmVmb3JlIHdlIGZvcmsuICovXFxuK3N0YXRpYyBwaWRfdCBycGNiX3N0dWJfc3RhcnQoaW50IG1vZGUpXFxuK3tcXG4rXFx0aW50IGxmZCA9IHJwY2Jfc3R1Yl9saXN0ZW4oKTtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0aWYgKGxmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHBpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKHBpZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0Y2xvc2UobGZkKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcdGlmIChwaWQgPT0gMCkge1xcbitcXHRcXHRzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7XFxuK1xcdFxcdHByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpO1xcbitcXHRcXHRpZiAoZ2V0cHBpZCgpID09IDEpXFx0XFx0LyogcmFjZWQgd2l0aCBwYXJlbnQgZXhpdCAqL1xcbitcXHRcXHRcXHRfZXhpdCgwKTtcXG4rXFx0XFx0cnBjYl9zdHViX3NlcnZlKGxmZCwgbW9kZSk7XFxuK1xcdFxcdF9leGl0KDApO1xcbitcXHR9XFxuK1xcbitcXHRjbG9zZShsZmQpO1xcbitcXHRyZXR1cm4gcGlkO1xcbit9XFxuK1xcbisvKlxcbisgKiBTd2FwIHRoZSBzdHViIGZvciBvbmUgaW4gQG1vZGUuIFNhZmUgYmVmb3JlIHRoZSBmaXJzdCByZXF1ZXN0OiBubyBzZXJ2XFxuKyAqIGV4aXN0cyB5ZXQsIHNvIHRoZSBrZXJuZWwgaGFzIG5vdCBjb25uZWN0ZWQgYW5kIHRoZSBhYnN0cmFjdCBuYW1lIGlzIGZyZWVcXG4rICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLlxcbisgKi9cXG4rc3RhdGljIGludCBycGNiX3N0dWJfcmVzdGFydChwaWRfdCAqcGlkLCBpbnQgbW9kZSlcXG4re1xcbitcXHRpZiAoKnBpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0a2lsbCgqcGlkLCBTSUdLSUxMKTtcXG4rXFx0XFx0d2FpdHBpZCgqcGlkLCBOVUxMLCAwKTtcXG4rXFx0fVxcbitcXHQqcGlkID0gcnBjYl9zdHViX3N0YXJ0KG1vZGUpO1xcbitcXHRyZXR1cm4gKnBpZCBcXHUwMDNlIDAgPyAwIDogLTE7XFxuK31cXG4rXFxuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmaXh0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xcbitcXG4rRklYVFVSRShuZnNkX2xpc3RlbmVyKSB7XFxuK1xcdHBpZF90IHJwY2JkO1xcbit9O1xcbitcXG4rRklYVFVSRV9TRVRVUChuZnNkX2xpc3RlbmVyKVxcbit7XFxuK1xcdHN0cnVjdCBpZnJlcSBpZnIgPSB7MH07XFxuK1xcdHN0cnVjdCBzdGF0IHN0O1xcbitcXHRpbnQgcztcXG4rXFxuK1xcdGlmIChnZXRldWlkKCkgIT0gMClcXG4rXFx0XFx0U0tJUChyZXR1cm4sIFxcXCJtdXN0IGJlIHJ1biBhcyByb290XFxcIik7XFxuK1xcdGlmICh1bnNoYXJlKENMT05FX05FV05FVCB8IENMT05FX05FV05TKSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwidW5zaGFyZShORVdORVR8TkVXTlMpOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdGlmIChtb3VudChcXFwiXFxcIiwgXFxcIi9cXFwiLCBOVUxMLCBNU19SRUMgfCBNU19QUklWQVRFLCBOVUxMKSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibW91bnQoLyBwcml2YXRlKTogJXNcXFwiLCBzdHJlcnJvcihlcnJubykpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogS2VlcCB0aGUga2VybmVsJ3MgcnBjYmluZCBjbGllbnQgaW5zaWRlIHRoaXMgbmFtZXNwYWNlLiBUaGVcXG4rXFx0ICogYWJzdHJhY3Qgc29ja2V0IGl0IHRyaWVzIGZpcnN0IGlzIHBlci1uZXRucywgYnV0IHRoZVxcbitcXHQgKiBcXFwiL3Zhci9ydW4vcnBjYmluZC5zb2NrXFxcIiBmYWxsYmFjayBpcyBub3QsIHNvIGhpZGUgdGhlIHBhdGguXFxuK1xcdCAqL1xcbitcXHRpZiAobW91bnQoXFxcInRtcGZzXFxcIiwgXFxcIi9ydW5cXFwiLCBcXFwidG1wZnNcXFwiLCAwLCBOVUxMKSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibW91bnQodG1wZnMgb24gL3J1bik6ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0aWYgKGxzdGF0KFxcXCIvdmFyL3J1blxcXCIsIFxcdTAwMjZzdCkgPT0gMCBcXHUwMDI2XFx1MDAyNiBTX0lTRElSKHN0LnN0X21vZGUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBtb3VudChcXFwidG1wZnNcXFwiLCBcXFwiL3Zhci9ydW5cXFwiLCBcXFwidG1wZnNcXFwiLCAwLCBOVUxMKSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibW91bnQodG1wZnMgb24gL3Zhci9ydW4pOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcbitcXHQvKiBCcmluZyBsb29wYmFjayB1cCBzbyBsaXN0ZW5lciBiaW5kcyAoMTI3LjAuMC4xIC8gOjoxKSB3b3JrLiAqL1xcbitcXHRzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApO1xcbitcXHRBU1NFUlRfR0UocywgMCk7XFxuK1xcdHN0cmNweShpZnIuaWZyX25hbWUsIFxcXCJsb1xcXCIpO1xcbitcXHRBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ0dJRkZMQUdTLCBcXHUwMDI2aWZyKSk7XFxuK1xcdGlmci5pZnJfZmxhZ3MgfD0gSUZGX1VQIHwgSUZGX1JVTk5JTkc7XFxuK1xcdEFTU0VSVF9FUSgwLCBpb2N0bChzLCBTSU9DU0lGRkxBR1MsIFxcdTAwMjZpZnIpKTtcXG4rXFx0Y2xvc2Uocyk7XFxuK1xcbitcXHRuZnNkX2ZhbWlseSA9IGdlbmxfcmVzb2x2ZV9uZnNkKCk7XFxuK1xcdGlmIChuZnNkX2ZhbWlseSBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibmZzZCBnZW5sIGZhbWlseSBub3QgZm91bmQgKG1vZHByb2JlIG5mc2Q/KVxcXCIpO1xcbitcXG4rXFx0c2VsZi1cXHUwMDNlcnBjYmQgPSBycGNiX3N0dWJfc3RhcnQoUlBDQl9TVFVCX0FDQ0VQVCk7XFxuK1xcdGlmIChzZWxmLVxcdTAwM2VycGNiZCBcXHUwMDNjIDApXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiY2Fubm90IHN0YXJ0IHRoZSBycGNiaW5kIHN0dWI6ICVzXFxcIixcXG4rXFx0XFx0ICAgICBzdHJlcnJvcihlcnJubykpO1xcbit9XFxuK1xcbitGSVhUVVJFX1RFQVJET1dOKG5mc2RfbGlzdGVuZXIpXFxuK3tcXG4rXFx0aWYgKHNlbGYtXFx1MDAzZXJwY2JkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRraWxsKHNlbGYtXFx1MDAzZXJwY2JkLCBTSUdLSUxMKTtcXG4rXFx0XFx0d2FpdHBpZChzZWxmLVxcdTAwM2VycGNiZCwgTlVMTCwgMCk7XFxuK1xcdH1cXG4rfVxcbitcXG4rLyogPT09PT09PT09PT09PT09PT09PT09IHZhbGlkYXRpb24gLyBuZWdhdGl2ZSA9PT09PT09PT09PT09PT09PT09PT0gKi9cXG4rXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfZW1wdHlfbGlzdF9vaylcXG4re1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF90b29fbWFueSlcXG4re1xcbitcXHRzdGF0aWMgY2hhciBhdHRyc1sxIFxcdTAwM2NcXHUwMDNjIDIwXTtcXG4rXFx0aW50IGksIG9mZiA9IDA7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgMTAyNTsgaSsrKVxcdFxcdC8qIFxcdTAwM2UgTkZTRF9OTF9MSVNURU5FUl9NQVggKDEwMjQpICovXFxuK1xcdFxcdG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgb2ZmLCBcXFwidWRwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFx0RVhQRUNUX0VRKC1FMkJJRywgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9taXNzaW5nX2FkZHIpXFxuK3tcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcXFwidGNwXFxcIiwgLmVtaXRfYWRkciA9IDAgfTtcXG4rXFx0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFxcdTAwMjZyKTtcXG4rXFxuK1xcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX21pc3NpbmdfdHJhbnNwb3J0KVxcbit7XFxuK1xcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XFxuK1xcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBOVUxMLCAuZW1pdF9hZGRyID0gMSxcXG4rXFx0XFx0XFx0XFx0ICAuYWRkciA9IFxcdTAwMjZzNCwgLmFkZHJfbGVuID0gc2l6ZW9mKHM0KSB9O1xcbitcXHRjaGFyIGF0dHJzWzY0XTtcXG4rXFx0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFxcdTAwMjZyKTtcXG4rXFxuK1xcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIG5hbWUgbWF0Y2hpbmcgbm8gdHJhbnNwb3J0IGNsYXNzIG11c3QgYmUgcmVmdXNlZCBiZWZvcmUgbmZzZF9tdXRleCBpc1xcbisgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHNcXG4rICogcmVxdWVzdF9tb2R1bGUoXFxcInN2YyVzXFxcIiwgbmFtZSkgdXBjYWxsLlxcbisgKi9cXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9iYWRfdHJhbnNwb3J0KVxcbit7XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwiYm9ndXNfeHBydFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRFWFBFQ1RfRVEoLUVQUk9UT05PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9hZGRyX3Rvb19zaG9ydClcXG4re1xcbitcXHR1bnNpZ25lZCBjaGFyIHRpbnkgPSAwO1xcbitcXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXFxcInRjcFxcXCIsIC5lbWl0X2FkZHIgPSAxLFxcbitcXHRcXHRcXHRcXHQgIC5hZGRyID0gXFx1MDAyNnRpbnksIC5hZGRyX2xlbiA9IDEgfTtcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcXHUwMDI2cik7XFxuK1xcbitcXHRFWFBFQ1RfRVEoLUVJTlZBTCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9pbmV0X3Nob3J0KVxcbit7XFxuK1xcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XFxuK1xcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcXFwidGNwXFxcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXFx1MDAyNnM0LFxcbitcXHRcXHRcXHRcXHQgIC5hZGRyX2xlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgKyAyIH07XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXFx1MDAyNnIpO1xcbitcXG4rXFx0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XFxuK31cXG4rXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldDZfc2hvcnQpXFxuK3tcXG4rXFx0c3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XFxuK1xcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcXFwidGNwXFxcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXFx1MDAyNnM2LFxcbitcXHRcXHRcXHRcXHQgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXFx1MDAyNnIpO1xcbitcXG4rXFx0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XFxuK31cXG4rXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX2ZhbWlseSlcXG4re1xcbitcXHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHsgLnNzX2ZhbWlseSA9IEFGX1VOSVggfTtcXG4rXFx0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFxcXCJ0Y3BcXFwiLCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSBcXHUwMDI2c3MsXFxuK1xcdFxcdFxcdFxcdCAgLmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgfTtcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcXHUwMDI2cik7XFxuK1xcbitcXHRFWFBFQ1RfRVEoLUVBRk5PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9zZWNvbmRfZW50cnlfYmFkKVxcbit7XFxuK1xcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9O1xcbitcXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIGJhZCA9IHsgLnhwcnQgPSBcXFwidGNwXFxcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXFx1MDAyNnNzLFxcbitcXHRcXHRcXHRcXHQgICAgLmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgfTtcXG4rXFx0Y2hhciBhdHRyc1sxMjhdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXFx1MDAyNmJhZCk7XFxuK1xcdC8qIFRoZSB3aG9sZSByZXF1ZXN0IGlzIHJlamVjdGVkIGR1cmluZyB2YWxpZGF0aW9uOyBub3RoaW5nIGFwcGxpZWQuICovXFxuK1xcdEVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIHJlamVjdGVkIHJlcXVlc3QgbXVzdCBsZWF2ZSB0aGUgbGlzdGVuZXJzIHRoYXQgYXJlIGFscmVhZHkgdXAgYWxvbmUuXFxuKyAqIFRoZSBlcnJubyBhbG9uZSBkb2VzIG5vdCBzaG93IHRoYXQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCkgcmV0dXJuc1xcbisgKiAtRVBST1RPTk9TVVBQT1JUIGZvciBhbiB1bmtub3duIG5hbWUgdG9vLiBXaGF0IGRpZmZlcnMgaXMgaG93IGZhciB0aGVcXG4rICogcmVxdWVzdCBnZXRzIC0tIHdpdGhvdXQgdGhlIGNoZWNrIGluIG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKCksXFxuKyAqIG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoKSBoYXMgYWxyZWFkeSBtb3ZlZCB0aGUgdW5tYXRjaGVkIHRjcCBsaXN0ZW5lclxcbisgKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGVcXG4rICogbmFtZSBmYWlscy5cXG4rICovXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfcmVqZWN0X2tlZXBzX2xpc3RlbmVycylcXG4re1xcbitcXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcXG4rXFx0Y2hhciBnb29kWzY0XSwgYmFkWzY0XTtcXG4rXFx0aW50IG9nID0gcHV0X2xpc3RlbmVyKGdvb2QsIDAsIFxcXCJ0Y3BcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYmFkLCAwLCBcXFwiYm9ndXNfeHBydFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGdvb2QsIG9nKSk7XFxuK1xcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XFxuK1xcbitcXHRFWFBFQ1RfRVEoLUVQUk9UT05PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGJhZCwgb2IpKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XFxuK1xcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXFxcInRjcFxcXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xcbit9XFxuK1xcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gZnVuY3Rpb25hbCAvIHJvdW5kLXRyaXAgPT09PT09PT09PT09PT09PT09PT09ICovXFxuK1xcbisvKiBMSVNURU5FUl9HRVQgd2l0aCBubyBzZXJ2IGluIHRoaXMgbmV0bnMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiAqL1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19nZXRfZW1wdHkpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdGNwKVxcbit7XFxuK1xcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xcbitcXHRjaGFyIGF0dHJzWzY0XTtcXG4rXFx0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXFxcInRjcFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXG4rXFx0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcXG4rXFx0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCBcXFwidGNwXFxcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XFxuK1xcdEVYUEVDVF9FUShodG9ubChJTkFERFJfTE9PUEJBQ0spLCBnb3RbMF0uYTQuc19hZGRyKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX3VkcClcXG4re1xcbitcXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFxcXCJ1ZHBcXFwiLCBURVNUX1BPUlQpO1xcbitcXG4rXFx0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XFxuK1xcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XFxuK1xcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXFxcInVkcFxcXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfbXVsdGkpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgYXR0cnNbMTI4XTtcXG4rXFx0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXFxcInRjcFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXFxcInVkcFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRBU1NFUlRfRVEoMiwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbitcXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFxcXCJ0Y3BcXFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcXG4rXFx0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcXFwidWRwXFxcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XFxuK31cXG4rXFxuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lkZW1wb3RlbnQpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcXHRcXHQvKiByZS1zZXQgc2FtZSBsaXN0ICovXFxuK1xcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XFxuK1xcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXFxcInRjcFxcXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19hZGQpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgb25lWzY0XSwgdHdvWzEyOF07XFxuK1xcdGludCBvMSA9IHB1dF9saXN0ZW5lcihvbmUsIDAsIFxcXCJ0Y3BcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdG8yID0gcHV0X2xpc3RlbmVyKHR3bywgbzIsIFxcXCJ1ZHBcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTtcXG4rXFx0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7XFx0XFx0LyogYWRkIHVkcCwga2VlcCB0Y3AgKi9cXG4rXFx0QVNTRVJUX0VRKDIsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcXG4rXFx0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcXFwidGNwXFxcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XFxuK1xcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXFxcInVkcFxcXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19yZW1vdmVfc3Vic2V0KVxcbit7XFxuK1xcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xcbitcXHRjaGFyIGJvdGhbMTI4XSwgb25lWzY0XTtcXG4rXFx0aW50IG9iID0gcHV0X2xpc3RlbmVyKGJvdGgsIDAsIFxcXCJ0Y3BcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRpbnQgb28gPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdG9iID0gcHV0X2xpc3RlbmVyKGJvdGgsIG9iLCBcXFwidWRwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFx0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChib3RoLCBvYikpO1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgb28pKTtcXHRcXHQvKiBkcm9wIHVkcCAqL1xcbitcXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbitcXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFxcXCJ0Y3BcXFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfZW1wdHlfZGVzdHJveXMpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcXHRcXHQvKiBlbXB0eSAtXFx1MDAzZSBkZXN0cm95IHNlcnYgKi9cXG4rXFx0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcXG4rfVxcbitcXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfaXB2NilcXG4re1xcbitcXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcXG4rXFx0Y2hhciBhdHRyc1s2NF07XFxuK1xcdGludCBvZmYsIHM7XFxuK1xcbitcXHRzID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7XFxuK1xcdGlmIChzIFxcdTAwM2MgMClcXG4rXFx0XFx0U0tJUChyZXR1cm4sIFxcXCJJUHY2IHVuYXZhaWxhYmxlOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdGNsb3NlKHMpO1xcbitcXG4rXFx0b2ZmID0gcHV0X2xpc3RlbmVyX2FmKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgQUZfSU5FVDYsIFRFU1RfUE9SVCk7XFxuK1xcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbitcXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFxcXCJ0Y3BcXFwiLCBBRl9JTkVUNiwgVEVTVF9QT1JUKSk7XFxuK1xcdEVYUEVDVF9FUSgwLCBtZW1jbXAoXFx1MDAyNmdvdFswXS5hNiwgXFx1MDAyNmluNmFkZHJfbG9vcGJhY2ssIHNpemVvZihpbjZhZGRyX2xvb3BiYWNrKSkpO1xcbit9XFxuK1xcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gcnBjYmluZCByZWdpc3RyYXRpb24gPT09PT09PT09PT09PT09PT09PT09ICovXFxuK1xcbisvKlxcbisgKiBBIHJwY2JpbmQgdGhhdCByZWZ1c2VzIHRoZSByZWdpc3RyYXRpb24gbXVzdCBmYWlsIGxpc3RlbmVyIGNyZWF0aW9uLFxcbisgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLlxcbisgKlxcbisgKiBUaGUgZXJyb3IgaGFzIHRvIHN1cnZpdmUgc3ZjX3JlZ2lzdGVyKCkncyB3YWxrIG92ZXIgc3ZfcHJvZ3JhbXMgdG8gZ2V0XFxuKyAqIGhlcmUuIFdpdGggQ09ORklHX05GU19MT0NBTElPPXkgdGhlIHRyYWlsaW5nIG5mc2xvY2FsaW8gcHJvZ3JhbSBoYXMgb25seVxcbisgKiBhIE5VTEwgYW5kIGEgdnNfaGlkZGVuIHZlcnNpb24sIGFuZCBzdmNfZ2VuZXJpY19ycGNiaW5kX3NldCgpIHJlcG9ydHMgMFxcbisgKiBmb3IgYm90aCwgc28gYW4gc3ZjX3JlZ2lzdGVyKCkgdGhhdCBrZWVwcyB0aGUgbGFzdCByZXN1bHQgcmF0aGVyIHRoYW4gdGhlXFxuKyAqIGZpcnN0IGhhbmRzIGJhY2sgc3VjY2VzcyBhbmQgdGhlIGxpc3RlbmVyIGNvbWVzIHVwIHJlZ2FyZGxlc3MuXFxuKyAqL1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX3JlZ2lzdGVyX3JlZnVzZWQpXFxuK3tcXG4rXFx0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XFxuK1xcdGNoYXIgYXR0cnNbNjRdO1xcbitcXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCBycGNiX3N0dWJfcmVzdGFydChcXHUwMDI2c2VsZi1cXHUwMDNlcnBjYmQsIFJQQ0JfU1RVQl9SRUZVU0UpKTtcXG4rXFxuK1xcdEVYUEVDVF9FUSgtRUFDQ0VTLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xcbitcXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xcbit9XFxuK1xcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gdGhyZWFkcyAvIC1FQlVTWSBzZW1hbnRpY3MgPT09PT09PT09PT09PT09PT09PT09ICovXFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fY2hhbmdlKVxcbit7XFxuK1xcdGNoYXIgb25lWzY0XSwgdHdvWzEyOF07XFxuK1xcdGludCBvMSA9IHB1dF9saXN0ZW5lcihvbmUsIDAsIFxcXCJ0Y3BcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCBcXFwidGNwXFxcIiwgVEVTVF9QT1JUKTtcXG4rXFxuK1xcdG8yID0gcHV0X2xpc3RlbmVyKHR3bywgbzIsIFxcXCJ1ZHBcXFwiLCBURVNUX1BPUlQpO1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTtcXG4rXFx0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcXHRcXHRcXHQvKiB0aHJlYWRzIG5vdyBydW5uaW5nICovXFxuK1xcdEVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7XFx0LyogYWRkIHJlZnVzZWQgKi9cXG4rXFx0dGhyZWFkc19zZXQoMCk7XFx0XFx0XFx0XFx0XFx0Lyogc3RvcCBiZWZvcmUgbmV0bnMgZXhpdCAqL1xcbit9XFxuK1xcbitURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX2J1c3lfb25fcmVtb3ZlKVxcbit7XFxuK1xcdGNoYXIgb25lWzY0XTtcXG4rXFx0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXFxcInRjcFxcXCIsIFRFU1RfUE9SVCk7XFxuK1xcbitcXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTtcXG4rXFx0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcXG4rXFx0RVhQRUNUX0VRKC1FQlVTWSwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcXHQvKiByZW1vdmUgcmVmdXNlZCAqL1xcbitcXHR0aHJlYWRzX3NldCgwKTtcXG4rfVxcbitcXG4rVEVTVF9IQVJORVNTX01BSU5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3NcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjYwOTFiNDVkMjI2YmFcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5nc1xcbkBAIC0wLDAgKzEgQEBcXG4rdGltZW91dD0xMjBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6Mzk6NDAuNzg3MzM5ODc5WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NDcxMTczMTY0ODEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTkZTRFwiLFxuICAgIFwiTkZTRF9WNFwiLFxuICAgIFwiU1VOUlBDXCIsXG4gICAgXCJORVRfTlNcIixcbiAgICBcIklQVjZcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0XCIsXG4gICAgXCJzdmNfcmVnaXN0ZXJcIixcbiAgICBcInJwY2JfY3JlYXRlX2xvY2FsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjAxZWI3MDQ4ZmQxY2MzNzE5NTFmNThhZjAwY2MyNTBmOWUyYmFjM1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDEwIDIxOjM5OjM3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmNcbmluZGV4IDdlMWQ1YTVkNjUxMWUuLmY3M2EyZWE0MjU1NzEgMTAwNjQ0XG4tLS0gYS9mcy9uZnNkL25mc2N0bC5jXG4rKysgYi9mcy9uZnNkL25mc2N0bC5jXG5AQCAtMTk3MywyMSArMTk3MywzOSBAQCBpbnQgbmZzZF9ubF92ZXJzaW9uX2dldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbisvKlxuKyAqIFRyYW5zcG9ydCBjbGFzc2VzIE5GU0Qga25vd3MgaG93IHRvIGluc3RhbnRpYXRlLiBWZXR0aW5nIHRoZSBuYW1lIGhlcmVcbisgKiBrZWVwcyBhIGJvZ3VzIHN0cmluZyBmcm9tIHJlYWNoaW5nIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCksIHdoZXJlIGFuXG4rICogdW5rbm93biBuYW1lIHRyaWdnZXJzIGEgcmVxdWVzdF9tb2R1bGUoXCJzdmMlc1wiLCBuYW1lKSB1cGNhbGwgdW5kZXJcbisgKiBuZnNkX211dGV4LlxuKyAqL1xuK3N0YXRpYyBib29sIG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChjb25zdCBjaGFyICpuYW1lKVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3VwcG9ydGVkW10gPSB7IFwidGNwXCIsIFwidWRwXCIsIFwicmRtYVwiIH07XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoc3VwcG9ydGVkKTsgaSsrKVxuK1x0XHRpZiAoIXN0cmNtcChuYW1lLCBzdXBwb3J0ZWRbaV0pKVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisvKiBVcHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBhIHNpbmdsZSByZXF1ZXN0IG1heSBjYXJyeS4gKi9cbisjZGVmaW5lIE5GU0RfTkxfTElTVEVORVJfTUFYXHQxMDI0XG4rXG4gLyoqXG4gICogbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMgLSBzYW5pdHktY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgZnJvbSB1c2VybGFuZFxuICAqIEBpbmZvOiBuZXRsaW5rIG1ldGFkYXRhIGFuZCBjb21tYW5kIGFyZ3VtZW50c1xuICAqXG4tICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCBlYWNoIGVudHJ5XG4tICogaXMgd2VsbC1mb3JtZWQ6IGl0IHBhcnNlcyBhZ2FpbnN0IHRoZSBwb2xpY3ksIGNhcnJpZXMgYm90aCBhbiBhZGRyZXNzIGFuZFxuLSAqIGEgdHJhbnNwb3J0IG5hbWUsIGFuZCB0aGUgYWRkcmVzcyBpcyBsb25nIGVub3VnaCBmb3IgaXRzIGZhbWlseS4gRG9pbmdcbi0gKiB0aGlzIHVwIGZyb250IGxldHMgdGhlIGNhbGxlcnMgYmVsb3cgYXNzdW1lIGV2ZXJ5IGVudHJ5IGlzIHZhbGlkIGFuZFxuLSAqIGd1YXJhbnRlZXMgd2UgbWFrZSBubyBjaGFuZ2VzIHdoZW4gdGhlIHJlcXVlc3QgaXMgbWFsZm9ybWVkLlxuKyAqIFdhbGsgZXZlcnkgTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgYXR0cmlidXRlIGFuZCBjb25maXJtIHRoYXQgdGhlIGxpc3QgaXNcbisgKiBub3Qgb3ZlcnNpemVkIGFuZCB0aGF0IGVhY2ggZW50cnkgaXMgd2VsbC1mb3JtZWQuXG4gICpcbiAgKiBSZXR1cm46IDAgaWYgZXZlcnkgZW50cnkgaXMgdmFsaWQsIG9yIGEgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlLlxuICAqL1xuIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiB7XG4gXHRjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyO1xuK1x0dW5zaWduZWQgaW50IGNvdW50ID0gMDtcbiBcdGludCByZW07XG4gXG4gXHRubG1zZ19mb3JfZWFjaF9hdHRyX3R5cGUoYXR0ciwgTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIsIGluZm8tXHUwMDNlbmxoZHIsXG5AQCAtMTk5Niw2ICsyMDE0LDExIEBAIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdFx0c3RydWN0IHNvY2thZGRyICpzYTtcbiBcdFx0aW50IGVycjtcbiBcbitcdFx0aWYgKCsrY291bnQgXHUwMDNlIE5GU0RfTkxfTElTVEVORVJfTUFYKSB7XG4rXHRcdFx0TkxfU0VUX0VSUl9NU0coaW5mby1cdTAwM2VleHRhY2ssIFwidG9vIG1hbnkgbGlzdGVuZXJzXCIpO1xuK1x0XHRcdHJldHVybiAtRTJCSUc7XG4rXHRcdH1cbitcbiBcdFx0ZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgTkZTRF9BX1NPQ0tfTUFYLCBhdHRyLFxuIFx0XHRcdFx0ICAgICAgIG5mc2Rfc29ja19ubF9wb2xpY3ksIGluZm8tXHUwMDNlZXh0YWNrKTtcbiBcdFx0aWYgKGVyciBcdTAwM2MgMClcbkBAIC0yMDA0LDYgKzIwMjcsOSBAQCBzdGF0aWMgaW50IG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRcdGlmICghdGJbTkZTRF9BX1NPQ0tfQUREUl0gfHwgIXRiW05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSlcbiBcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbitcdFx0aWYgKCFuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWQobmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKSkpXG4rXHRcdFx0cmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7XG4rXG4gXHRcdHNhID0gbmxhX2RhdGEodGJbTkZTRF9BX1NPQ0tfQUREUl0pO1xuIFx0XHRpZiAobmxhX2xlbih0YltORlNEX0FfU09DS19BRERSXSkgXHUwMDNjIHNpemVvZihzYS1cdTAwM2VzYV9mYW1pbHkpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTIxNTYsOCArMjE4MiwxMiBAQCBpbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRyZXQgPSBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYShzZXJ2LCB4Y2xfbmFtZSwgbmV0LCBzYSwgMCxcbiBcdFx0XHRcdFx0ICAgICAgY3VycmVudF9jcmVkKCkpO1xuIFx0XHQvKiBhbHdheXMgc2F2ZSB0aGUgbGF0ZXN0IGVycm9yICovXG4tXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbitcdFx0XHROTF9TRVRfRVJSX01TR19GTVQoaW5mby1cdTAwM2VleHRhY2ssXG4rXHRcdFx0XHRcdCAgIFwiY2Fubm90IGNyZWF0ZSAlcyBsaXN0ZW5lcjogJWRcIixcbitcdFx0XHRcdFx0ICAgeGNsX25hbWUsIHJldCk7XG4gXHRcdFx0ZXJyID0gcmV0O1xuK1x0XHR9XG4gXHR9XG4gXG4gXHRpZiAoIXNlcnYtXHUwMDNlc3ZfbnJ0aHJlYWRzIFx1MDAyNlx1MDAyNiBsaXN0X2VtcHR5KFx1MDAyNm5uLVx1MDAzZW5mc2Rfc2Vydi1cdTAwM2Vzdl9wZXJtc29ja3MpKVxuZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjYl9jbG50LmMgYi9uZXQvc3VucnBjL3JwY2JfY2xudC5jXG5pbmRleCA2YWEzNzIxODhjODZhLi4wYWEzNzZiODJhNTI2IDEwMDY0NFxuLS0tIGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuY1xuKysrIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuY1xuQEAgLTIyMSw2ICsyMjEsMTYgQEAgc3RhdGljIHZvaWQgcnBjYl9zZXRfbG9jYWwoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsXG4gIyBkZWZpbmUgU1VOX0xFTihwdHIpIChvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKVx0XHRcXFxuIFx0XHQgICAgICArIDEgKyBzdHJsZW4oKHB0ciktXHUwMDNlc3VuX3BhdGggKyAxKSlcbiBcbisvKlxuKyAqIFRoZSBrZXJuZWwncyBycGNiaW5kIGNsaWVudCB0YWxrcyBvbmx5IHRvIHRoZSBsb2NhbCBycGNiaW5kLCBvdmVyIGxvb3BiYWNrXG4rICogb3IgYSBsb2NhbCBBRl9MT0NBTCBzb2NrZXQsIHdoZXJlIGEgaGVhbHRoeSBycGNiaW5kIGFuc3dlcnMgaW4gbWljcm9zZWNvbmRzLlxuKyAqL1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX3RpbWVvdXQgcnBjYl9sb2NhbF90aW1lb3V0ID0ge1xuK1x0LnRvX2luaXR2YWxcdD0gMSAqIEhaLFxuK1x0LnRvX21heHZhbFx0PSAxICogSFosXG4rXHQudG9fcmV0cmllc1x0PSAwLFxuK307XG4rXG4gLypcbiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8gdmFsdWVcbiAgKiBpcyByZXR1cm5lZC5cbkBAIC0yMzgsNiArMjQ4LDcgQEAgc3RhdGljIGludCBycGNiX2NyZWF0ZV9hZl9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsXG4gXHRcdC52ZXJzaW9uXHQ9IFJQQ0JWRVJTXzIsXG4gXHRcdC5hdXRoZmxhdm9yXHQ9IFJQQ19BVVRIX05VTEwsXG4gXHRcdC5jcmVkXHRcdD0gY3VycmVudF9jcmVkKCksXG4rXHRcdC50aW1lb3V0XHQ9IFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcbiBcdFx0LypcbiBcdFx0ICogV2UgdHVybiBvZmYgdGhlIGlkbGUgdGltZW91dCB0byBwcmV2ZW50IHRoZSBrZXJuZWxcbiBcdFx0ICogZnJvbSBhdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3RpbmcgdGhlIHNvY2tldC5cbkBAIC0zMTIsNiArMzIzLDcgQEAgc3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF9uZXQoc3RydWN0IG5ldCAqbmV0KVxuIFx0XHQudmVyc2lvblx0PSBSUENCVkVSU18yLFxuIFx0XHQuYXV0aGZsYXZvclx0PSBSUENfQVVUSF9VTklYLFxuIFx0XHQuY3JlZFx0XHQ9IGN1cnJlbnRfY3JlZCgpLFxuK1x0XHQudGltZW91dFx0PSBcdTAwMjZycGNiX2xvY2FsX3RpbWVvdXQsXG4gXHRcdC5mbGFnc1x0XHQ9IFJQQ19DTE5UX0NSRUFURV9OT1BJTkcsXG4gXHR9O1xuIFx0c3RydWN0IHJwY19jbG50ICpjbG50LCAqY2xudDQ7XG5kaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmMuYyBiL25ldC9zdW5ycGMvc3ZjLmNcbmluZGV4IDA1YzNlNmUyZjY1OTQuLmU5Y2ZjZWIxYTMzNDIgMTAwNjQ0XG4tLS0gYS9uZXQvc3VucnBjL3N2Yy5jXG4rKysgYi9uZXQvc3VucnBjL3N2Yy5jXG5AQCAtMTIwOCwxMyArMTIwOCwxNiBAQCBpbnQgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0LFxuIFx0XHRzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2dwID0gXHUwMDI2c2Vydi1cdTAwM2Vzdl9wcm9ncmFtc1twXTtcbiBcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcHJvZ3AtXHUwMDNlcGdfbnZlcnM7IGkrKykge1xuK1x0XHRcdGludCByZXQ7XG4gXG4tXHRcdFx0ZXJyb3IgPSBwcm9ncC1cdTAwM2VwZ19ycGNiaW5kX3NldChuZXQsIHByb2dwLCBpLFxuK1x0XHRcdHJldCA9IHByb2dwLVx1MDAzZXBnX3JwY2JpbmRfc2V0KG5ldCwgcHJvZ3AsIGksXG4gXHRcdFx0XHRcdGZhbWlseSwgcHJvdG8sIHBvcnQpO1xuLVx0XHRcdGlmIChlcnJvciBcdTAwM2MgMCkge1xuK1x0XHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbiBcdFx0XHRcdHByaW50ayhLRVJOX1dBUk5JTkcgXCJzdmM6IGZhaWxlZCB0byByZWdpc3RlciBcIlxuIFx0XHRcdFx0XHRcIiVzdiV1IFJQQyBzZXJ2aWNlIChlcnJubyAlZCkuXFxuXCIsXG4tXHRcdFx0XHRcdHByb2dwLVx1MDAzZXBnX25hbWUsIGksIC1lcnJvcik7XG4rXHRcdFx0XHRcdHByb2dwLVx1MDAzZXBnX25hbWUsIGksIC1yZXQpO1xuK1x0XHRcdFx0aWYgKCFlcnJvcilcbitcdFx0XHRcdFx0ZXJyb3IgPSByZXQ7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4gXHRcdH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5pbmRleCA4NDM0M2ZkMWUzNTRiLi40NjA1MDhkZTkzNzRmIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5AQCAtODksNiArODksNyBAQCBUQVJHRVRTICs9IG5ldC9wYWNrZXRkcmlsbFxuIFRBUkdFVFMgKz0gbmV0L3BwcFxuIFRBUkdFVFMgKz0gbmV0L3Jkc1xuIFRBUkdFVFMgKz0gbmV0L3RjcF9hb1xuK1RBUkdFVFMgKz0gbmZzZFxuIFRBUkdFVFMgKz0gbm9saWJjXG4gVEFSR0VUUyArPSBwY2lfZW5kcG9pbnRcbiBUQVJHRVRTICs9IHBjaWVfYndjdHJsXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTllNmRlYzA0ZDhlOVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC8uZ2l0aWdub3JlXG5AQCAtMCwwICsxIEBAXG4rbmZzZF9uZXRsaW5rX2xpc3RlbmVyXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xNWFjNjU1NDlkMjU5XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlXG5AQCAtMCwwICsxLDYgQEBcbisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rQ0ZMQUdTICs9ICQoS0hEUl9JTkNMVURFUykgLVdhbGxcbitcbitURVNUX0dFTl9QUk9HUyA6PSBuZnNkX25ldGxpbmtfbGlzdGVuZXJcbitcbitpbmNsdWRlIC4uL2xpYi5ta1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWdcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lNjk0NWZmOTU1MWM0XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL2NvbmZpZ1xuQEAgLTAsMCArMSw0IEBAXG4rQ09ORklHX05FVF9OUz15XG4rQ09ORklHX0lQVjY9eVxuK0NPTkZJR19ORlNEPXlcbitDT05GSUdfTkZTRF9WND15XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zZTMzMDc2ODBkN2Q0XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jXG5AQCAtMCwwICsxLDkyMCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBSZWdyZXNzaW9uIHRlc3RzIGZvciB0aGUgTkZTRCBnZW5lcmljLW5ldGxpbmsgbGlzdGVuZXIgaW50ZXJmYWNlXG4rICogKE5GU0RfQ01EX0xJU1RFTkVSX1NFVCAvIE5GU0RfQ01EX0xJU1RFTkVSX0dFVCkuXG4rICpcbisgKiBUaHJlZSBncm91cHM6XG4rICogICB2YWxpZGF0aW9uICAtIG1hbGZvcm1lZC9hYnVzaXZlIExJU1RFTkVSX1NFVCByZXF1ZXN0cyBhcmUgcmVqZWN0ZWQgYnlcbisgKiAgICAgICAgICAgICAgICAgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSwgYmVmb3JlIG5mc2RfbXV0ZXggaXMgdGFrZW4uXG4rICogICBmdW5jdGlvbmFsICAtIGNyZWF0ZS9hZGQvcmVtb3ZlIGxpc3RlbmVycyBhbmQgdmVyaWZ5IExJU1RFTkVSX0dFVFxuKyAqICAgICAgICAgICAgICAgICByZWZsZWN0cyB0aGUgc2V0IChyb3VuZC10cmlwIG9mIHRyYW5zcG9ydCArIGFkZHI6cG9ydCkuXG4rICogICBzZW1hbnRpY3MgICAtIG9uY2UgdGhyZWFkcyBhcmUgcnVubmluZyAoVEhSRUFEU19TRVQpIGEgbGlzdGVuZXIgY2hhbmdlXG4rICogICAgICAgICAgICAgICAgIGlzIHJlZnVzZWQgd2l0aCAtRUJVU1kuXG4rICpcbisgKiBFYWNoIHRlc3QgcnVucyBpbiBpdHMgb3duIHByaXZhdGUgbmV0ICsgbW91bnQgbmFtZXNwYWNlICh1bnNoYXJlIGluXG4rICogRklYVFVSRV9TRVRVUCkuIC9ydW4gaXMgbWFza2VkIHRoZXJlOiBhIHBhdGhuYW1lIEFGX0xPQ0FMIGNvbm5lY3QgaXMgbm90XG4rICogc2NvcGVkIGJ5IHRoZSBuZXR3b3JrIG5hbWVzcGFjZSwgc2luY2UgdW5peF9maW5kX2JzZCgpIHJlc29sdmVzIGJ5IGlub2RlXG4rICogYW5kIHRha2VzIG5vIHN0cnVjdCBuZXQsIHNvIHRoZSBrZXJuZWwncyBycGNiaW5kIGNsaWVudCB3b3VsZCBvdGhlcndpc2UgYmVcbisgKiBhYmxlIHRvIHJlYWNoIHRoZSBycGNiaW5kIHJ1bm5pbmcgb24gdGhlIGhvc3QuIEFueXRoaW5nIHRoYXQgY3JlYXRlcyBhXG4rICogc2VydiBpcyBzZXJ2ZWQgYnkgdGhlIHBlci1uZXRucyBycGNiaW5kIHN0dWIgYmVsb3cgaW5zdGVhZC5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3BvbGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NjaGVkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGRlZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21vdW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvcHJjdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy90aW1lLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvaWYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY25ldGluZXQvaW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldGxpbmsuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2dlbmV0bGluay5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCIuLi9rc2VsZnRlc3RfaGFybmVzcy5oXCJcbitcbisvKiBORlNEIGdlbmVyaWMtbmV0bGluayBjb25zdGFudHMgKGZyb20gbGludXgvbmZzZF9uZXRsaW5rLmgpLiAqL1xuKyNkZWZpbmUgTkZTRF9GQU1JTFlfTkFNRVx0XHRcIm5mc2RcIlxuKyNkZWZpbmUgTkZTRF9DTURfVEhSRUFEU19TRVRcdFx0MlxuKyNkZWZpbmUgTkZTRF9DTURfTElTVEVORVJfU0VUXHRcdDZcbisjZGVmaW5lIE5GU0RfQ01EX0xJU1RFTkVSX0dFVFx0XHQ3XG4rI2RlZmluZSBORlNEX0FfU0VSVkVSX1RIUkVBRFNcdFx0MVxuKyNkZWZpbmUgTkZTRF9BX1NFUlZFUl9TT0NLX0FERFJcdFx0MVx0LyogcGVyLWxpc3RlbmVyIG5lc3QgKi9cbisjZGVmaW5lIE5GU0RfQV9TT0NLX0FERFJcdFx0MVx0LyogaW5zaWRlIHRoZSBuZXN0ICovXG4rI2RlZmluZSBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRVx0Mlx0LyogaW5zaWRlIHRoZSBuZXN0ICovXG4rXG4rI2RlZmluZSBOTEFfQUxJR040KGxlbilcdFx0XHQoKChsZW4pICsgMykgXHUwMDI2IH4zKVxuKyNkZWZpbmUgVEVTVF9QT1JUXHRcdFx0MjAwNDlcbisjZGVmaW5lIE1BWF9MSVNURU5FUlNcdFx0XHQ4XG4rI2RlZmluZSBSRUNWX1RJTUVPX1NFQ1x0XHRcdDMwXG4rXG4rc3RhdGljIGludCBuZnNkX2ZhbWlseTtcdFx0XHQvKiBzZXQgcGVyLXRlc3QgaW4gRklYVFVSRV9TRVRVUCAqL1xuK1xuK3N0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICptc2cpXG4re1xuK1x0cGVycm9yKG1zZyk7XG4rXHRleGl0KDEpO1xuK31cbitcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIG1pbmltYWwgZ2VuZXJpYy1uZXRsaW5rIHBsdW1iaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbitcbitzdGF0aWMgaW50IGdlbmxfb3Blbih2b2lkKVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9ubCBzYSA9IHsgLm5sX2ZhbWlseSA9IEFGX05FVExJTksgfTtcbitcdHN0cnVjdCB0aW1ldmFsIHR2ID0geyAudHZfc2VjID0gUkVDVl9USU1FT19TRUMgfTtcbitcdGludCBmZCA9IHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19HRU5FUklDKTtcbitcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0ZGllKFwic29ja2V0KE5FVExJTktfR0VORVJJQylcIik7XG4rXHRpZiAoYmluZChmZCwgKHZvaWQgKilcdTAwMjZzYSwgc2l6ZW9mKHNhKSkgXHUwMDNjIDApXG4rXHRcdGRpZShcImJpbmQobmV0bGluaylcIik7XG4rXHRzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgXHUwMDI2dHYsIHNpemVvZih0dikpO1xuK1x0cmV0dXJuIGZkO1xuK31cbitcbisvKiBBcHBlbmQgYW4gYXR0cmlidXRlIGF0IEBvZmY7IHJldHVybiB0aGUgbmV3IChhbGlnbmVkKSBvZmZzZXQuICovXG4rc3RhdGljIGludCBwdXRfYXR0cihjaGFyICpidWYsIGludCBvZmYsIHVpbnQxNl90IHR5cGUsXG4rXHRcdCAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKVxuK3tcbitcdHN0cnVjdCBubGF0dHIgKm5hID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcbitcbitcdG5hLVx1MDAzZW5sYV90eXBlID0gdHlwZTtcbitcdG5hLVx1MDAzZW5sYV9sZW4gPSBOTEFfSERSTEVOICsgbGVuO1xuK1x0aWYgKGxlbilcbitcdFx0bWVtY3B5KGJ1ZiArIG9mZiArIE5MQV9IRFJMRU4sIGRhdGEsIGxlbik7XG4rXHRyZXR1cm4gb2ZmICsgTkxBX0FMSUdONChOTEFfSERSTEVOICsgbGVuKTtcbit9XG4rXG4rLyogQnVpbGQgYSBnZW5sIG1lc3NhZ2UgaGVhZGVyIGludG8gQGJ1ZjsgcmV0dXJuIHRoZSBvZmZzZXQgcGFzdCBpdC4gKi9cbitzdGF0aWMgaW50IGdlbmxfaGRyKGNoYXIgKmJ1ZiwgdWludDE2X3QgdHlwZSwgdWludDE2X3QgZmxhZ3MsIHVpbnQ4X3QgY21kKVxuK3tcbitcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4rXHRzdHJ1Y3QgZ2VubG1zZ2hkciAqZ25sID0gKHZvaWQgKikoYnVmICsgTkxNU0dfSERSTEVOKTtcbitcbitcdG1lbXNldChidWYsIDAsIE5MTVNHX0hEUkxFTiArIEdFTkxfSERSTEVOKTtcbitcdG5saC1cdTAwM2VubG1zZ190eXBlID0gdHlwZTtcbitcdG5saC1cdTAwM2VubG1zZ19mbGFncyA9IGZsYWdzO1xuK1x0bmxoLVx1MDAzZW5sbXNnX3NlcSA9IDE7XG4rXHRnbmwtXHUwMDNlY21kID0gY21kO1xuK1x0Z25sLVx1MDAzZXZlcnNpb24gPSAxO1xuK1x0cmV0dXJuIE5MTVNHX0hEUkxFTiArIEdFTkxfSERSTEVOO1xuK31cbitcbisvKiBTZW5kIGFuIG5mc2QgY29tbWFuZCB3aXRoIGFuIEFDSzsgcmV0dXJuIHRoZSBBQ0sgZXJybm8gKFx1MDAzYz0gMCkuICovXG4rc3RhdGljIGludCBnZW5sX3JlcXVlc3QodWludDhfdCBjbWQsIGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgYXR0cnNfbGVuKVxuK3tcbitcdGNoYXIgYnVmWzEgXHUwMDNjXHUwMDNjIDIwXSwgcmJ1Zls0MDk2XTtcbitcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4rXHRpbnQgZmQgPSBnZW5sX29wZW4oKTtcbitcdGludCBvZmYsIG4sIHJldDtcbitcbitcdG9mZiA9IGdlbmxfaGRyKGJ1ZiwgbmZzZF9mYW1pbHksIE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0ssIGNtZCk7XG4rXHRpZiAoYXR0cnNfbGVuKSB7XG4rXHRcdG1lbWNweShidWYgKyBvZmYsIGF0dHJzLCBhdHRyc19sZW4pO1xuK1x0XHRvZmYgKz0gYXR0cnNfbGVuO1xuK1x0fVxuK1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbitcbitcdGlmIChzZW5kKGZkLCBidWYsIG9mZiwgMCkgXHUwMDNjIDApXG4rXHRcdGRpZShcInNlbmQoZ2VubClcIik7XG4rXG4rXHRuID0gcmVjdihmZCwgcmJ1Ziwgc2l6ZW9mKHJidWYpLCAwKTtcbitcdGlmIChuIFx1MDAzYyAwKVxuK1x0XHRyZXQgPSAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSA/IC1FVElNRURPVVQgOiAtZXJybm87XG4rXHRlbHNlIGlmICgoKHN0cnVjdCBubG1zZ2hkciAqKXJidWYpLVx1MDAzZW5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpXG4rXHRcdHJldCA9ICgoc3RydWN0IG5sbXNnZXJyICopTkxNU0dfREFUQShyYnVmKSktXHUwMDNlZXJyb3I7XG4rXHRlbHNlXG4rXHRcdHJldCA9IDA7XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKiBTZW5kIGEgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBmdWxsIHJlcGx5IG1lc3NhZ2U7IC1lcnJubyBvbiBmYWlsdXJlLiAqL1xuK3N0YXRpYyBpbnQgZ2VubF9yZXF1ZXN0X3JlcGx5KHVpbnQ4X3QgY21kLCBjaGFyICpyYnVmLCBzaXplX3Qgcmxlbilcbit7XG4rXHRjaGFyIGJ1ZlsyNTZdO1xuK1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbitcdGludCBmZCA9IGdlbmxfb3BlbigpO1xuK1x0aW50IG9mZiwgbiwgcmV0O1xuK1xuK1x0b2ZmID0gZ2VubF9oZHIoYnVmLCBuZnNkX2ZhbWlseSwgTkxNX0ZfUkVRVUVTVCwgY21kKTtcbitcdG5saC1cdTAwM2VubG1zZ19sZW4gPSBvZmY7XG4rXG4rXHRpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApIFx1MDAzYyAwKVxuK1x0XHRkaWUoXCJzZW5kKGdlbmwgcmVwbHkpXCIpO1xuK1xuK1x0biA9IHJlY3YoZmQsIHJidWYsIHJsZW4sIDApO1xuK1x0aWYgKG4gXHUwMDNjIDApXG4rXHRcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcbitcdGVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbitcdFx0cmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS1cdTAwM2VlcnJvcjtcbitcdGVsc2VcbitcdFx0cmV0ID0gbjtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qIFJlc29sdmUgdGhlIFwibmZzZFwiIGdlbmwgZmFtaWx5IGlkOyAtMSBpZiBub3QgcmVnaXN0ZXJlZC4gKi9cbitzdGF0aWMgaW50IGdlbmxfcmVzb2x2ZV9uZnNkKHZvaWQpXG4re1xuK1x0Y2hhciBidWZbMTAyNF0sIHJidWZbNDA5Nl07XG4rXHRzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmO1xuK1x0c3RydWN0IG5sbXNnaGRyICpyaCA9ICh2b2lkICopcmJ1ZjtcbitcdHN0cnVjdCBubGF0dHIgKm5hO1xuK1x0aW50IGZkLCBvZmYsIGxlZnQsIGlkID0gLTE7XG4rXG4rXHRmZCA9IGdlbmxfb3BlbigpO1xuK1x0b2ZmID0gZ2VubF9oZHIoYnVmLCBHRU5MX0lEX0NUUkwsIE5MTV9GX1JFUVVFU1QsIENUUkxfQ01EX0dFVEZBTUlMWSk7XG4rXHRvZmYgPSBwdXRfYXR0cihidWYsIG9mZiwgQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLFxuK1x0XHQgICAgICAgTkZTRF9GQU1JTFlfTkFNRSwgc2l6ZW9mKE5GU0RfRkFNSUxZX05BTUUpKTtcbitcdG5saC1cdTAwM2VubG1zZ19sZW4gPSBvZmY7XG4rXG4rXHRpZiAoc2VuZChmZCwgYnVmLCBvZmYsIDApIFx1MDAzYyAwKVxuK1x0XHRkaWUoXCJzZW5kKEdFVEZBTUlMWSlcIik7XG4rXHRpZiAocmVjdihmZCwgcmJ1Ziwgc2l6ZW9mKHJidWYpLCAwKSBcdTAwM2MgMClcbitcdFx0ZGllKFwicmVjdihHRVRGQU1JTFkpXCIpO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0aWYgKHJoLVx1MDAzZW5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdG5hID0gKHZvaWQgKikoKGNoYXIgKilOTE1TR19EQVRBKHJoKSArIEdFTkxfSERSTEVOKTtcbitcdGxlZnQgPSByaC1cdTAwM2VubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjtcbitcdHdoaWxlIChsZWZ0IFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XG4rXHRcdGlmIChuYS1cdTAwM2VubGFfdHlwZSA9PSBDVFJMX0FUVFJfRkFNSUxZX0lEKSB7XG4rXHRcdFx0aWQgPSAqKHVpbnQxNl90ICopKChjaGFyICopbmEgKyBOTEFfSERSTEVOKTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRsZWZ0IC09IE5MQV9BTElHTjQobmEtXHUwMDNlbmxhX2xlbik7XG4rXHRcdG5hID0gKHZvaWQgKikoKGNoYXIgKiluYSArIE5MQV9BTElHTjQobmEtXHUwMDNlbmxhX2xlbikpO1xuK1x0fVxuK1x0cmV0dXJuIGlkO1xuK31cbitcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGxpc3RlbmVyIHJlcXVlc3QgYnVpbGRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuK1xuKy8qIEZpbmUtZ3JhaW5lZCBjb250cm9sIGZvciBuZWdhdGl2ZSB0ZXN0czogYW55IGZpZWxkIGNhbiBiZSBvbWl0dGVkL21hbGZvcm1lZC4gKi9cbitzdHJ1Y3QgcmF3X2xpc3RlbmVyIHtcbitcdGNvbnN0IGNoYXIgKnhwcnQ7XHQvKiBOVUxMIC1cdTAwM2Ugb21pdCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSAqL1xuK1x0aW50IGVtaXRfYWRkcjtcdFx0LyogMCAtXHUwMDNlIG9taXQgTkZTRF9BX1NPQ0tfQUREUiAqL1xuK1x0Y29uc3Qgdm9pZCAqYWRkcjtcbitcdGludCBhZGRyX2xlbjtcdFx0LyogYnl0ZXMgdG8gZW1pdCBmb3IgTkZTRF9BX1NPQ0tfQUREUiAqL1xuK307XG4rXG4rc3RhdGljIGludCBwdXRfcmF3X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3Qgc3RydWN0IHJhd19saXN0ZW5lciAqcilcbit7XG4rXHRzdHJ1Y3QgbmxhdHRyICpuZXN0ID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcbitcdGludCBpbm5lciA9IG9mZiArIE5MQV9IRFJMRU47XG4rXG4rXHRpZiAoci1cdTAwM2VlbWl0X2FkZHIpXG4rXHRcdGlubmVyID0gcHV0X2F0dHIoYnVmLCBpbm5lciwgTkZTRF9BX1NPQ0tfQUREUiwgci1cdTAwM2VhZGRyLCByLVx1MDAzZWFkZHJfbGVuKTtcbitcdGlmIChyLVx1MDAzZXhwcnQpXG4rXHRcdGlubmVyID0gcHV0X2F0dHIoYnVmLCBpbm5lciwgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUsXG4rXHRcdFx0XHQgci1cdTAwM2V4cHJ0LCBzdHJsZW4oci1cdTAwM2V4cHJ0KSArIDEpO1xuK1x0bmVzdC1cdTAwM2VubGFfdHlwZSA9IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIHwgTkxBX0ZfTkVTVEVEO1xuK1x0bmVzdC1cdTAwM2VubGFfbGVuID0gaW5uZXIgLSBvZmY7XG4rXHRyZXR1cm4gb2ZmICsgTkxBX0FMSUdONChuZXN0LVx1MDAzZW5sYV9sZW4pO1xuK31cbitcbisvKiBXZWxsLWZvcm1lZCBsb29wYmFjayBsaXN0ZW5lciBmb3IgQGZhbWlseSAoQUZfSU5FVCBvciBBRl9JTkVUNikuICovXG4rc3RhdGljIGludCBwdXRfbGlzdGVuZXJfYWYoY2hhciAqYnVmLCBpbnQgb2ZmLCBjb25zdCBjaGFyICp4cHJ0LCBpbnQgZmFtaWx5LFxuK1x0XHRcdCAgIHVpbnQxNl90IHBvcnQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7MH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0geHBydCwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2c3MgfTtcbitcbitcdGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHtcbitcdFx0c3RydWN0IHNvY2thZGRyX2luNiAqczYgPSAodm9pZCAqKVx1MDAyNnNzO1xuK1xuK1x0XHRzNi1cdTAwM2VzaW42X2ZhbWlseSA9IEFGX0lORVQ2O1xuK1x0XHRzNi1cdTAwM2VzaW42X3BvcnQgPSBodG9ucyhwb3J0KTtcbitcdFx0czYtXHUwMDNlc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjaztcbitcdFx0ci5hZGRyX2xlbiA9IHNpemVvZigqczYpO1xuK1x0fSBlbHNlIHtcbitcdFx0c3RydWN0IHNvY2thZGRyX2luICpzNCA9ICh2b2lkICopXHUwMDI2c3M7XG4rXG4rXHRcdHM0LVx1MDAzZXNpbl9mYW1pbHkgPSBBRl9JTkVUO1xuK1x0XHRzNC1cdTAwM2VzaW5fcG9ydCA9IGh0b25zKHBvcnQpO1xuK1x0XHRzNC1cdTAwM2VzaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spO1xuK1x0XHRyLmFkZHJfbGVuID0gc2l6ZW9mKCpzNCk7XG4rXHR9XG4rXHRyZXR1cm4gcHV0X3Jhd19saXN0ZW5lcihidWYsIG9mZiwgXHUwMDI2cik7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcHV0X2xpc3RlbmVyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgY29uc3QgY2hhciAqeHBydCwgdWludDE2X3QgcG9ydClcbit7XG4rXHRyZXR1cm4gcHV0X2xpc3RlbmVyX2FmKGJ1Ziwgb2ZmLCB4cHJ0LCBBRl9JTkVULCBwb3J0KTtcbit9XG4rXG4rLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBMSVNURU5FUl9HRVQgcGFyc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rc3RydWN0IGxpc3RlbmVyX2VudCB7XG4rXHRjaGFyIHhwcnRbMTZdO1xuK1x0aW50IGZhbWlseTtcbitcdHVpbnQxNl90IHBvcnQ7XG4rXHRzdHJ1Y3QgaW5fYWRkciBhNDtcbitcdHN0cnVjdCBpbjZfYWRkciBhNjtcbit9O1xuK1xuK3N0YXRpYyBpbnQgcGFyc2VfbGlzdGVuZXJfZ2V0KGNvbnN0IGNoYXIgKnJidWYsIGludCBsZW4sXG4rXHRcdFx0ICAgICAgc3RydWN0IGxpc3RlbmVyX2VudCAqb3V0LCBpbnQgbWF4KVxuK3tcbitcdGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHZvaWQgKilyYnVmO1xuK1x0Y29uc3Qgc3RydWN0IG5sYXR0ciAqbmE7XG4rXHRpbnQgbGVmdCwgY291bnQgPSAwO1xuK1xuK1x0KHZvaWQpbGVuO1xuK1x0bmEgPSAoY29uc3Qgdm9pZCAqKShyYnVmICsgTkxNU0dfSERSTEVOICsgR0VOTF9IRFJMRU4pO1xuK1x0bGVmdCA9IG5saC1cdTAwM2VubG1zZ19sZW4gLSBOTE1TR19IRFJMRU4gLSBHRU5MX0hEUkxFTjtcbitcbitcdHdoaWxlIChsZWZ0IFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XG4rXHRcdGludCBhbGVuID0gbmEtXHUwMDNlbmxhX2xlbjtcbitcbitcdFx0aWYgKChuYS1cdTAwM2VubGFfdHlwZSBcdTAwMjYgTkxBX1RZUEVfTUFTSykgPT0gTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBjb3VudCBcdTAwM2MgbWF4KSB7XG4rXHRcdFx0Y29uc3Qgc3RydWN0IG5sYXR0ciAqaW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICsgTkxBX0hEUkxFTik7XG4rXHRcdFx0aW50IGlsZWZ0ID0gYWxlbiAtIE5MQV9IRFJMRU47XG4rXHRcdFx0c3RydWN0IGxpc3RlbmVyX2VudCAqZSA9IFx1MDAyNm91dFtjb3VudF07XG4rXG4rXHRcdFx0bWVtc2V0KGUsIDAsIHNpemVvZigqZSkpO1xuK1x0XHRcdHdoaWxlIChpbGVmdCBcdTAwM2U9IChpbnQpTkxBX0hEUkxFTikge1xuK1x0XHRcdFx0Y29uc3Qgdm9pZCAqZCA9IChjb25zdCBjaGFyICopaW4gKyBOTEFfSERSTEVOO1xuK1x0XHRcdFx0aW50IHQgPSBpbi1cdTAwM2VubGFfdHlwZSBcdTAwMjYgTkxBX1RZUEVfTUFTSztcbitcbitcdFx0XHRcdGlmICh0ID09IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FKSB7XG4rXHRcdFx0XHRcdHN0cm5jcHkoZS1cdTAwM2V4cHJ0LCBkLCBzaXplb2YoZS1cdTAwM2V4cHJ0KSAtIDEpO1xuK1x0XHRcdFx0fSBlbHNlIGlmICh0ID09IE5GU0RfQV9TT0NLX0FERFIpIHtcbitcdFx0XHRcdFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzID0gZDtcbitcbitcdFx0XHRcdFx0ZS1cdTAwM2VmYW1pbHkgPSBzcy1cdTAwM2Vzc19mYW1pbHk7XG4rXHRcdFx0XHRcdGlmIChzcy1cdTAwM2Vzc19mYW1pbHkgPT0gQUZfSU5FVCkge1xuK1x0XHRcdFx0XHRcdGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqcyA9IGQ7XG4rXG4rXHRcdFx0XHRcdFx0ZS1cdTAwM2VhNCA9IHMtXHUwMDNlc2luX2FkZHI7XG4rXHRcdFx0XHRcdFx0ZS1cdTAwM2Vwb3J0ID0gbnRvaHMocy1cdTAwM2VzaW5fcG9ydCk7XG4rXHRcdFx0XHRcdH0gZWxzZSBpZiAoc3MtXHUwMDNlc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7XG4rXHRcdFx0XHRcdFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqcyA9IGQ7XG4rXG4rXHRcdFx0XHRcdFx0ZS1cdTAwM2VhNiA9IHMtXHUwMDNlc2luNl9hZGRyO1xuK1x0XHRcdFx0XHRcdGUtXHUwMDNlcG9ydCA9IG50b2hzKHMtXHUwMDNlc2luNl9wb3J0KTtcbitcdFx0XHRcdFx0fVxuK1x0XHRcdFx0fVxuK1x0XHRcdFx0aWxlZnQgLT0gTkxBX0FMSUdONChpbi1cdTAwM2VubGFfbGVuKTtcbitcdFx0XHRcdGluID0gKGNvbnN0IHZvaWQgKikoKGNoYXIgKilpbiArIE5MQV9BTElHTjQoaW4tXHUwMDNlbmxhX2xlbikpO1xuK1x0XHRcdH1cbitcdFx0XHRjb3VudCsrO1xuK1x0XHR9XG4rXHRcdGxlZnQgLT0gTkxBX0FMSUdONChhbGVuKTtcbitcdFx0bmEgPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKW5hICsgTkxBX0FMSUdONChhbGVuKSk7XG4rXHR9XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gY29udmVuaWVuY2Ugd3JhcHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuK1xuK3N0YXRpYyBpbnQgbGlzdGVuZXJfc2V0KGNvbnN0IGNoYXIgKmF0dHJzLCBpbnQgbGVuKVxuK3tcbitcdHJldHVybiBnZW5sX3JlcXVlc3QoTkZTRF9DTURfTElTVEVORVJfU0VULCBhdHRycywgbGVuKTtcbit9XG4rXG4rLyogRmV0Y2ggdGhlIGN1cnJlbnQgbGlzdGVuZXJzOyByZXR1cm5zIGNvdW50IChcdTAwM2U9MCkgb3IgLWVycm5vLiAqL1xuK3N0YXRpYyBpbnQgbGlzdGVuZXJfZ2V0KHN0cnVjdCBsaXN0ZW5lcl9lbnQgKm91dCwgaW50IG1heClcbit7XG4rXHRjaGFyIHJidWZbODE5Ml07XG4rXHRpbnQgbiA9IGdlbmxfcmVxdWVzdF9yZXBseShORlNEX0NNRF9MSVNURU5FUl9HRVQsIHJidWYsIHNpemVvZihyYnVmKSk7XG4rXG4rXHRpZiAobiBcdTAwM2MgMClcbitcdFx0cmV0dXJuIG47XG4rXHRyZXR1cm4gcGFyc2VfbGlzdGVuZXJfZ2V0KHJidWYsIG4sIG91dCwgbWF4KTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBsaXN0ZW5lcl9lbnQgKmZpbmRfbGlzdGVuZXIoc3RydWN0IGxpc3RlbmVyX2VudCAqZSwgaW50IG4sXG4rXHRcdFx0XHRcdCAgY29uc3QgY2hhciAqeHBydCwgaW50IGZhbWlseSxcbitcdFx0XHRcdFx0ICB1aW50MTZfdCBwb3J0KVxuK3tcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKVxuK1x0XHRpZiAoZVtpXS5mYW1pbHkgPT0gZmFtaWx5IFx1MDAyNlx1MDAyNiBlW2ldLnBvcnQgPT0gcG9ydCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICFzdHJjbXAoZVtpXS54cHJ0LCB4cHJ0KSlcbitcdFx0XHRyZXR1cm4gXHUwMDI2ZVtpXTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiBTdGFydCAoQG4gXHUwMDNlIDApIG9yIHN0b3AgKEBuID09IDApIG5mc2QgdGhyZWFkcyBpbiB0aGlzIG5ldG5zLiAqL1xuK3N0YXRpYyBpbnQgdGhyZWFkc19zZXQoaW50IG4pXG4re1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHR1aW50MzJfdCB2ID0gbjtcbitcdGludCBvZmYgPSBwdXRfYXR0cihhdHRycywgMCwgTkZTRF9BX1NFUlZFUl9USFJFQURTLCBcdTAwMjZ2LCBzaXplb2YodikpO1xuK1xuK1x0cmV0dXJuIGdlbmxfcmVxdWVzdChORlNEX0NNRF9USFJFQURTX1NFVCwgYXR0cnMsIG9mZik7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyLW5ldG5zIGxvY2FsIHJwY2JpbmQgc3R1YiAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rLypcbisgKiBDcmVhdGluZyBhIGxpc3RlbmVyIHJlZ2lzdGVycyB3aXRoIHJwY2JpbmQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKClcbisgKiBwYXNzZXMgZmxhZ3Mgb2YgMCwgc28gcG1hcF9yZWdpc3RlciBpcyB0cnVlIGluIHN2Y19zZXR1cF9zb2NrZXQoKSwgYW5kXG4rICogbmZzZF92ZXJzaW9uMyBpcyByZWdpc3RlcmFibGUgYnkgZGVmYXVsdCBhbmQgZG9lcyBub3Qgc2V0IHZzX3JwY2Jfb3B0bmwsXG4rICogc28gYSByZWdpc3RyYXRpb24gZmFpbHVyZSBhYm9ydHMgbGlzdGVuZXIgY3JlYXRpb24uIFRoZSBhYnN0cmFjdCBBRl9MT0NBTFxuKyAqIG5hbWUgdGhlIGtlcm5lbCB0cmllcyBmaXJzdCBpcyBwZXItbmV0bnMgKHVuaXhfZmluZF9hYnN0cmFjdCgpIHRha2VzIGFcbisgKiBzdHJ1Y3QgbmV0KSwgc28gYW5zd2VyIGl0IGhlcmUgYW5kIHN0YXkgb3V0IG9mIHRoZSBob3N0J3MgcnBjYmluZC5cbisgKlxuKyAqIEFyZ3VtZW50cyBhcmUgbmV2ZXIgZGVjb2RlZC4gVGhlIE5VTEwgcHJvY2VkdXJlIGdldHMgYW4gZW1wdHkgc3VjY2VzcyBhbmRcbisgKiBTRVQvVU5TRVQgZ2V0IFRSVUUsIGZvciBib3RoIFJQQ0JWRVJTXzIgYW5kIFJQQ0JWRVJTXzQuIHY0IGhhcyB0byBiZVxuKyAqIGFuc3dlcmVkIGJlY2F1c2UgX19zdmNfcnBjYl9yZWdpc3RlcjYoKSB0dXJucyBhIHY0IHJlZnVzYWwgaW50b1xuKyAqIC1FQUZOT1NVUFBPUlQsIHdoaWNoIHdvdWxkIGZhaWwgZXZlcnkgSVB2NiBsaXN0ZW5lci5cbisgKlxuKyAqIEluIFJQQ0JfU1RVQl9SRUZVU0UgbW9kZSBTRVQgaXMgYW5zd2VyZWQgRkFMU0UgaW5zdGVhZCwgd2hpY2hcbisgKiBycGNiX3JlZ2lzdGVyX2NhbGwoKSByZXBvcnRzIGFzIC1FQUNDRVMuIFVOU0VUIGlzIGxlZnQgYWxvbmU6IG9ubHlcbisgKiBzdmNfdW5yZWdpc3RlcigpIGlzc3VlcyBpdCwgYW5kIGl0IGRpc2NhcmRzIHRoZSByZXN1bHQuXG4rICovXG4rI2RlZmluZSBSUENCX1BST0dSQU1cdFx0MTAwMDAwXG4rI2RlZmluZSBSUENCX1BST0NfTlVMTFx0XHQwXG4rI2RlZmluZSBSUENCX1BST0NfU0VUXHRcdDFcbisjZGVmaW5lIFJQQ0JfUFJPQ19VTlNFVFx0XHQyXG4rI2RlZmluZSBSUENCX0FCU1RSQUNUX05BTUVcdFwiL3J1bi9ycGNiaW5kLnNvY2tcIlxuKyNkZWZpbmUgUlBDQl9TVFVCX01BWENPTk5cdDRcbitcbitlbnVtIHsgUlBDQl9TVFVCX0FDQ0VQVCwgUlBDQl9TVFVCX1JFRlVTRSB9O1xuK1xuK3N0YXRpYyBpbnQgcnBjYl9zdHViX2xpc3Rlbih2b2lkKVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl91biBzdW4gPSB7IC5zdW5fZmFtaWx5ID0gQUZfVU5JWCB9O1xuK1x0c2l6ZV90IG5sZW4gPSBzdHJsZW4oUlBDQl9BQlNUUkFDVF9OQU1FKTtcbitcdHNvY2tsZW5fdCBhbGVuO1xuK1x0aW50IGZkO1xuK1xuK1x0LyogQWJzdHJhY3QgbmFtZXMgYXJlIGxlbmd0aC1kZWxpbWl0ZWQsIHNvIHRoZSBsZW5ndGggbXVzdCBtYXRjaC4gKi9cbitcdG1lbWNweShzdW4uc3VuX3BhdGggKyAxLCBSUENCX0FCU1RSQUNUX05BTUUsIG5sZW4pO1xuK1x0YWxlbiA9IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpICsgMSArIG5sZW47XG4rXG4rXHRmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcdGlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopXHUwMDI2c3VuLCBhbGVuKSBcdTAwM2MgMCB8fFxuK1x0ICAgIGxpc3RlbihmZCwgUlBDQl9TVFVCX01BWENPTk4pIFx1MDAzYyAwKSB7XG4rXHRcdGNsb3NlKGZkKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0cmV0dXJuIGZkO1xuK31cbitcbitzdGF0aWMgaW50IHJwY2Jfc3R1Yl9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKVxuK3tcbitcdHNpemVfdCBkb25lID0gMDtcbitcbitcdHdoaWxlIChkb25lIFx1MDAzYyBsZW4pIHtcbitcdFx0c3NpemVfdCBuID0gcmVhZChmZCwgKGNoYXIgKilidWYgKyBkb25lLCBsZW4gLSBkb25lKTtcbitcbitcdFx0aWYgKG4gXHUwMDNjPSAwKVxuK1x0XHRcdHJldHVybiAtMTtcbitcdFx0ZG9uZSArPSBuO1xuK1x0fVxuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIEhhbmRsZSBvbmUgcmVjb3JkLW1hcmtlZCBSUEMgY2FsbC4gUmV0dXJucyAtMSB3aGVuIHRoZSBwZWVyIGlzIGRvbmUuICovXG4rc3RhdGljIGludCBycGNiX3N0dWJfY2FsbChpbnQgZmQsIGludCBtb2RlKVxuK3tcbitcdHVpbnQzMl90IG1hcmssIGNhbGxbNl0sIHJlcFs3XTtcbitcdHVuc2lnbmVkIGludCBsZW4sIG5yZXAgPSA2O1xuK1x0c2l6ZV90IHJlcGxlbjtcbitcbitcdGlmIChycGNiX3N0dWJfcmVhZChmZCwgXHUwMDI2bWFyaywgc2l6ZW9mKG1hcmspKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0bGVuID0gbnRvaGwobWFyaykgXHUwMDI2IDB4N2ZmZmZmZmY7XG4rXHRpZiAobGVuIFx1MDAzYyBzaXplb2YoY2FsbCkgfHwgbGVuIFx1MDAzZSA0MDk2KVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIGNhbGwsIHNpemVvZihjYWxsKSkpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdC8qIHhpZCwgbXNnX3R5cGUsIHJwY3ZlcnMsIHByb2csIHZlcnMsIHByb2M7IHRoZSByZXN0IGlzIGRpc2NhcmRlZCAqL1xuK1x0Zm9yIChsZW4gLT0gc2l6ZW9mKGNhbGwpOyBsZW47ICkge1xuK1x0XHRjaGFyIHNpbmtbMjU2XTtcbitcdFx0dW5zaWduZWQgaW50IG4gPSBsZW4gXHUwMDNlIHNpemVvZihzaW5rKSA/IHNpemVvZihzaW5rKSA6IGxlbjtcbitcbitcdFx0aWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBzaW5rLCBuKSlcbitcdFx0XHRyZXR1cm4gLTE7XG4rXHRcdGxlbiAtPSBuO1xuK1x0fVxuK1xuK1x0cmVwWzBdID0gY2FsbFswXTtcdFx0LyogeGlkICovXG4rXHRyZXBbMV0gPSBodG9ubCgxKTtcdFx0LyogUkVQTFkgKi9cbitcdHJlcFsyXSA9IGh0b25sKDApO1x0XHQvKiBNU0dfQUNDRVBURUQgKi9cbitcdHJlcFszXSA9IGh0b25sKDApO1x0XHQvKiB2ZXJpZmllciBmbGF2b3IgQVVUSF9OVUxMICovXG4rXHRyZXBbNF0gPSBodG9ubCgwKTtcdFx0LyogdmVyaWZpZXIgbGVuZ3RoICovXG4rXHRyZXBbNV0gPSBodG9ubCgwKTtcdFx0LyogU1VDQ0VTUyAqL1xuK1xuK1x0aWYgKG50b2hsKGNhbGxbM10pICE9IFJQQ0JfUFJPR1JBTSkge1xuK1x0XHRyZXBbNV0gPSBodG9ubCgxKTtcdC8qIFBST0dfVU5BVkFJTCAqL1xuK1x0fSBlbHNlIHtcbitcdFx0c3dpdGNoIChudG9obChjYWxsWzVdKSkge1xuK1x0XHRjYXNlIFJQQ0JfUFJPQ19OVUxMOlxuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJQQ0JfUFJPQ19TRVQ6XG4rXHRcdFx0cmVwWzZdID0gaHRvbmwobW9kZSA9PSBSUENCX1NUVUJfUkVGVVNFID8gMCA6IDEpO1xuK1x0XHRcdG5yZXAgPSA3O1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJQQ0JfUFJPQ19VTlNFVDpcbitcdFx0XHRyZXBbNl0gPSBodG9ubCgxKTtcdC8qIFRSVUUgKi9cbitcdFx0XHRucmVwID0gNztcbitcdFx0XHRicmVhaztcbitcdFx0ZGVmYXVsdDpcbitcdFx0XHRyZXBbNV0gPSBodG9ubCgzKTtcdC8qIFBST0NfVU5BVkFJTCAqL1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXBsZW4gPSBucmVwICogc2l6ZW9mKHJlcFswXSk7XG4rXHRtYXJrID0gaHRvbmwoMHg4MDAwMDAwMCB8IHJlcGxlbik7XG4rXHRpZiAod3JpdGUoZmQsIFx1MDAyNm1hcmssIHNpemVvZihtYXJrKSkgIT0gKHNzaXplX3Qpc2l6ZW9mKG1hcmspIHx8XG4rXHQgICAgd3JpdGUoZmQsIHJlcCwgcmVwbGVuKSAhPSAoc3NpemVfdClyZXBsZW4pXG4rXHRcdHJldHVybiAtMTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBycGNiX3N0dWJfc2VydmUoaW50IGxmZCwgaW50IG1vZGUpXG4re1xuK1x0c3RydWN0IHBvbGxmZCBwZmRbMSArIFJQQ0JfU1RVQl9NQVhDT05OXTtcbitcdG5mZHNfdCBuID0gMSwgaTtcbitcbitcdHBmZFswXS5mZCA9IGxmZDtcbitcbitcdGZvciAoOzspIHtcbitcdFx0Lyogc3RvcCBwb2xsaW5nIHRoZSBsaXN0ZW5lciB3aGVuIGZ1bGwsIG9yIHBvbGwoKSBzcGlucyAqL1xuK1x0XHRwZmRbMF0uZXZlbnRzID0gbiBcdTAwM2MgMSArIFJQQ0JfU1RVQl9NQVhDT05OID8gUE9MTElOIDogMDtcbitcbitcdFx0aWYgKHBvbGwocGZkLCBuLCAtMSkgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuO1xuK1xuK1x0XHRpZiAocGZkWzBdLnJldmVudHMgXHUwMDI2IFBPTExJTikge1xuK1x0XHRcdGludCBjID0gYWNjZXB0KGxmZCwgTlVMTCwgTlVMTCk7XG4rXG4rXHRcdFx0aWYgKGMgXHUwMDNlPSAwKSB7XG4rXHRcdFx0XHRwZmRbbl0uZmQgPSBjO1xuK1x0XHRcdFx0cGZkW25dLmV2ZW50cyA9IFBPTExJTjtcbitcdFx0XHRcdG4rKztcbitcdFx0XHR9XG4rXHRcdH1cbitcbitcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbjsgaSsrKSB7XG4rXHRcdFx0aWYgKCEocGZkW2ldLnJldmVudHMgXHUwMDI2IChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0aWYgKHJwY2Jfc3R1Yl9jYWxsKHBmZFtpXS5mZCwgbW9kZSkpIHtcbitcdFx0XHRcdGNsb3NlKHBmZFtpXS5mZCk7XG4rXHRcdFx0XHRwZmRbaV0gPSBwZmRbLS1uXTtcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbit9XG4rXG4rLyogUmV0dXJucyB0aGUgc3R1YidzIHBpZCwgb3IgLTEuIFRoZSBzb2NrZXQgaXMgbGlzdGVuaW5nIGJlZm9yZSB3ZSBmb3JrLiAqL1xuK3N0YXRpYyBwaWRfdCBycGNiX3N0dWJfc3RhcnQoaW50IG1vZGUpXG4re1xuK1x0aW50IGxmZCA9IHJwY2Jfc3R1Yl9saXN0ZW4oKTtcbitcdHBpZF90IHBpZDtcbitcbitcdGlmIChsZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHBpZCA9IGZvcmsoKTtcbitcdGlmIChwaWQgXHUwMDNjIDApIHtcbitcdFx0Y2xvc2UobGZkKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0aWYgKHBpZCA9PSAwKSB7XG4rXHRcdHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTtcbitcdFx0cHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lHS0lMTCk7XG4rXHRcdGlmIChnZXRwcGlkKCkgPT0gMSlcdFx0LyogcmFjZWQgd2l0aCBwYXJlbnQgZXhpdCAqL1xuK1x0XHRcdF9leGl0KDApO1xuK1x0XHRycGNiX3N0dWJfc2VydmUobGZkLCBtb2RlKTtcbitcdFx0X2V4aXQoMCk7XG4rXHR9XG4rXG4rXHRjbG9zZShsZmQpO1xuK1x0cmV0dXJuIHBpZDtcbit9XG4rXG4rLypcbisgKiBTd2FwIHRoZSBzdHViIGZvciBvbmUgaW4gQG1vZGUuIFNhZmUgYmVmb3JlIHRoZSBmaXJzdCByZXF1ZXN0OiBubyBzZXJ2XG4rICogZXhpc3RzIHlldCwgc28gdGhlIGtlcm5lbCBoYXMgbm90IGNvbm5lY3RlZCBhbmQgdGhlIGFic3RyYWN0IG5hbWUgaXMgZnJlZVxuKyAqIGFnYWluIG9uY2UgdGhlIG9sZCBzdHViIGhhcyBiZWVuIHJlYXBlZC5cbisgKi9cbitzdGF0aWMgaW50IHJwY2Jfc3R1Yl9yZXN0YXJ0KHBpZF90ICpwaWQsIGludCBtb2RlKVxuK3tcbitcdGlmICgqcGlkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoKnBpZCwgU0lHS0lMTCk7XG4rXHRcdHdhaXRwaWQoKnBpZCwgTlVMTCwgMCk7XG4rXHR9XG4rXHQqcGlkID0gcnBjYl9zdHViX3N0YXJ0KG1vZGUpO1xuK1x0cmV0dXJuICpwaWQgXHUwMDNlIDAgPyAwIDogLTE7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmaXh0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuK1xuK0ZJWFRVUkUobmZzZF9saXN0ZW5lcikge1xuK1x0cGlkX3QgcnBjYmQ7XG4rfTtcbitcbitGSVhUVVJFX1NFVFVQKG5mc2RfbGlzdGVuZXIpXG4re1xuK1x0c3RydWN0IGlmcmVxIGlmciA9IHswfTtcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1x0aW50IHM7XG4rXG4rXHRpZiAoZ2V0ZXVpZCgpICE9IDApXG4rXHRcdFNLSVAocmV0dXJuLCBcIm11c3QgYmUgcnVuIGFzIHJvb3RcIik7XG4rXHRpZiAodW5zaGFyZShDTE9ORV9ORVdORVQgfCBDTE9ORV9ORVdOUykgXHUwMDNjIDApXG4rXHRcdFNLSVAocmV0dXJuLCBcInVuc2hhcmUoTkVXTkVUfE5FV05TKTogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdGlmIChtb3VudChcIlwiLCBcIi9cIiwgTlVMTCwgTVNfUkVDIHwgTVNfUFJJVkFURSwgTlVMTCkgXHUwMDNjIDApXG4rXHRcdFNLSVAocmV0dXJuLCBcIm1vdW50KC8gcHJpdmF0ZSk6ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXG4rXHQvKlxuK1x0ICogS2VlcCB0aGUga2VybmVsJ3MgcnBjYmluZCBjbGllbnQgaW5zaWRlIHRoaXMgbmFtZXNwYWNlLiBUaGVcbitcdCAqIGFic3RyYWN0IHNvY2tldCBpdCB0cmllcyBmaXJzdCBpcyBwZXItbmV0bnMsIGJ1dCB0aGVcbitcdCAqIFwiL3Zhci9ydW4vcnBjYmluZC5zb2NrXCIgZmFsbGJhY2sgaXMgbm90LCBzbyBoaWRlIHRoZSBwYXRoLlxuK1x0ICovXG4rXHRpZiAobW91bnQoXCJ0bXBmc1wiLCBcIi9ydW5cIiwgXCJ0bXBmc1wiLCAwLCBOVUxMKSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwibW91bnQodG1wZnMgb24gL3J1bik6ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRpZiAobHN0YXQoXCIvdmFyL3J1blwiLCBcdTAwMjZzdCkgPT0gMCBcdTAwMjZcdTAwMjYgU19JU0RJUihzdC5zdF9tb2RlKSBcdTAwMjZcdTAwMjZcbitcdCAgICBtb3VudChcInRtcGZzXCIsIFwiL3Zhci9ydW5cIiwgXCJ0bXBmc1wiLCAwLCBOVUxMKSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwibW91bnQodG1wZnMgb24gL3Zhci9ydW4pOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1xuK1x0LyogQnJpbmcgbG9vcGJhY2sgdXAgc28gbGlzdGVuZXIgYmluZHMgKDEyNy4wLjAuMSAvIDo6MSkgd29yay4gKi9cbitcdHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7XG4rXHRBU1NFUlRfR0UocywgMCk7XG4rXHRzdHJjcHkoaWZyLmlmcl9uYW1lLCBcImxvXCIpO1xuK1x0QVNTRVJUX0VRKDAsIGlvY3RsKHMsIFNJT0NHSUZGTEFHUywgXHUwMDI2aWZyKSk7XG4rXHRpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUCB8IElGRl9SVU5OSU5HO1xuK1x0QVNTRVJUX0VRKDAsIGlvY3RsKHMsIFNJT0NTSUZGTEFHUywgXHUwMDI2aWZyKSk7XG4rXHRjbG9zZShzKTtcbitcbitcdG5mc2RfZmFtaWx5ID0gZ2VubF9yZXNvbHZlX25mc2QoKTtcbitcdGlmIChuZnNkX2ZhbWlseSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwibmZzZCBnZW5sIGZhbWlseSBub3QgZm91bmQgKG1vZHByb2JlIG5mc2Q/KVwiKTtcbitcbitcdHNlbGYtXHUwMDNlcnBjYmQgPSBycGNiX3N0dWJfc3RhcnQoUlBDQl9TVFVCX0FDQ0VQVCk7XG4rXHRpZiAoc2VsZi1cdTAwM2VycGNiZCBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwiY2Fubm90IHN0YXJ0IHRoZSBycGNiaW5kIHN0dWI6ICVzXCIsXG4rXHRcdCAgICAgc3RyZXJyb3IoZXJybm8pKTtcbit9XG4rXG4rRklYVFVSRV9URUFSRE9XTihuZnNkX2xpc3RlbmVyKVxuK3tcbitcdGlmIChzZWxmLVx1MDAzZXJwY2JkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwoc2VsZi1cdTAwM2VycGNiZCwgU0lHS0lMTCk7XG4rXHRcdHdhaXRwaWQoc2VsZi1cdTAwM2VycGNiZCwgTlVMTCwgMCk7XG4rXHR9XG4rfVxuK1xuKy8qID09PT09PT09PT09PT09PT09PT09PSB2YWxpZGF0aW9uIC8gbmVnYXRpdmUgPT09PT09PT09PT09PT09PT09PT09ICovXG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9lbXB0eV9saXN0X29rKVxuK3tcbitcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9zZXQoTlVMTCwgMCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3Rvb19tYW55KVxuK3tcbitcdHN0YXRpYyBjaGFyIGF0dHJzWzEgXHUwMDNjXHUwMDNjIDIwXTtcbitcdGludCBpLCBvZmYgPSAwO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgMTAyNTsgaSsrKVx0XHQvKiBcdTAwM2UgTkZTRF9OTF9MSVNURU5FUl9NQVggKDEwMjQpICovXG4rXHRcdG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgb2ZmLCBcInVkcFwiLCBURVNUX1BPUlQpO1xuK1x0RVhQRUNUX0VRKC1FMkJJRywgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9taXNzaW5nX2FkZHIpXG4re1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDAgfTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX21pc3NpbmdfdHJhbnNwb3J0KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gTlVMTCwgLmVtaXRfYWRkciA9IDEsXG4rXHRcdFx0XHQgIC5hZGRyID0gXHUwMDI2czQsIC5hZGRyX2xlbiA9IHNpemVvZihzNCkgfTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFx1MDAyNnIpO1xuK1xuK1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuKy8qXG4rICogQSBuYW1lIG1hdGNoaW5nIG5vIHRyYW5zcG9ydCBjbGFzcyBtdXN0IGJlIHJlZnVzZWQgYmVmb3JlIG5mc2RfbXV0ZXggaXNcbisgKiB0YWtlbiwgc28gaXQgbmV2ZXIgcmVhY2hlcyBzdmNfeHBydF9jcmVhdGVfZnJvbV9zYSgpIGFuZCBpdHNcbisgKiByZXF1ZXN0X21vZHVsZShcInN2YyVzXCIsIG5hbWUpIHVwY2FsbC5cbisgKi9cbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2JhZF90cmFuc3BvcnQpXG4re1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcImJvZ3VzX3hwcnRcIiwgVEVTVF9QT1JUKTtcbitcbitcdEVYUEVDVF9FUSgtRVBST1RPTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2FkZHJfdG9vX3Nob3J0KVxuK3tcbitcdHVuc2lnbmVkIGNoYXIgdGlueSA9IDA7XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsXG4rXHRcdFx0XHQgIC5hZGRyID0gXHUwMDI2dGlueSwgLmFkZHJfbGVuID0gMSB9O1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4rXG4rXHRFWFBFQ1RfRVEoLUVJTlZBTCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9pbmV0X3Nob3J0KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9pbiBzNCA9IHsgLnNpbl9mYW1pbHkgPSBBRl9JTkVULCAuc2luX3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2czQsXG4rXHRcdFx0XHQgIC5hZGRyX2xlbiA9IHNpemVvZihzYV9mYW1pbHlfdCkgKyAyIH07XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXQ2X3Nob3J0KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9pbjYgczYgPSB7IC5zaW42X2ZhbWlseSA9IEFGX0lORVQ2LCAuc2luNl9wb3J0ID0gaHRvbnMoVEVTVF9QT1JUKSB9O1xuK1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFwidGNwXCIsIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnM2LFxuK1x0XHRcdFx0ICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4rXG4rXHRFWFBFQ1RfRVEoLUVJTlZBTCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9iYWRfZmFtaWx5KVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9O1xuK1x0c3RydWN0IHJhd19saXN0ZW5lciByID0geyAueHBydCA9IFwidGNwXCIsIC5lbWl0X2FkZHIgPSAxLCAuYWRkciA9IFx1MDAyNnNzLFxuK1x0XHRcdFx0ICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4rXG4rXHRFWFBFQ1RfRVEoLUVBRk5PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9zZWNvbmRfZW50cnlfYmFkKVxuK3tcbitcdHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzID0geyAuc3NfZmFtaWx5ID0gQUZfVU5JWCB9O1xuK1x0c3RydWN0IHJhd19saXN0ZW5lciBiYWQgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2c3MsXG4rXHRcdFx0XHQgICAgLmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgfTtcbitcdGNoYXIgYXR0cnNbMTI4XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCBvZmYsIFx1MDAyNmJhZCk7XG4rXHQvKiBUaGUgd2hvbGUgcmVxdWVzdCBpcyByZWplY3RlZCBkdXJpbmcgdmFsaWRhdGlvbjsgbm90aGluZyBhcHBsaWVkLiAqL1xuK1x0RVhQRUNUX0VRKC1FQUZOT1NVUFBPUlQsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuKy8qXG4rICogQSByZWplY3RlZCByZXF1ZXN0IG11c3QgbGVhdmUgdGhlIGxpc3RlbmVycyB0aGF0IGFyZSBhbHJlYWR5IHVwIGFsb25lLlxuKyAqIFRoZSBlcnJubyBhbG9uZSBkb2VzIG5vdCBzaG93IHRoYXQ6IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCkgcmV0dXJuc1xuKyAqIC1FUFJPVE9OT1NVUFBPUlQgZm9yIGFuIHVua25vd24gbmFtZSB0b28uIFdoYXQgZGlmZmVycyBpcyBob3cgZmFyIHRoZVxuKyAqIHJlcXVlc3QgZ2V0cyAtLSB3aXRob3V0IHRoZSBjaGVjayBpbiBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycygpLFxuKyAqIG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoKSBoYXMgYWxyZWFkeSBtb3ZlZCB0aGUgdW5tYXRjaGVkIHRjcCBsaXN0ZW5lclxuKyAqIG9mZiBzdl9wZXJtc29ja3MgYW5kIHJ1biBzdmNfeHBydF9kZXN0cm95X2FsbCgpIG9uIGl0IGJ5IHRoZSB0aW1lIHRoZVxuKyAqIG5hbWUgZmFpbHMuXG4rICovXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHZhbF9yZWplY3Rfa2VlcHNfbGlzdGVuZXJzKVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBnb29kWzY0XSwgYmFkWzY0XTtcbitcdGludCBvZyA9IHB1dF9saXN0ZW5lcihnb29kLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1x0aW50IG9iID0gcHV0X2xpc3RlbmVyKGJhZCwgMCwgXCJib2d1c194cHJ0XCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGdvb2QsIG9nKSk7XG4rXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK1xuK1x0RVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChiYWQsIG9iKSk7XG4rXG4rXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCBcInRjcFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbit9XG4rXG4rLyogPT09PT09PT09PT09PT09PT09PT09IGZ1bmN0aW9uYWwgLyByb3VuZC10cmlwID09PT09PT09PT09PT09PT09PT09PSAqL1xuK1xuKy8qIExJU1RFTkVSX0dFVCB3aXRoIG5vIHNlcnYgaW4gdGhpcyBuZXRucyByZXR1cm5zIGFuIGVtcHR5IGxpc3QuICovXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfZ2V0X2VtcHR5KVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX3RjcClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rXHRFWFBFQ1RfRVEoaHRvbmwoSU5BRERSX0xPT1BCQUNLKSwgZ290WzBdLmE0LnNfYWRkcik7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2NyZWF0ZV91ZHApXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidWRwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfbXVsdGkpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGF0dHJzWzEyOF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0b2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbitcdEFTU0VSVF9FUSgyLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcInVkcFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfaWRlbXBvdGVudClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XHRcdC8qIHJlLXNldCBzYW1lIGxpc3QgKi9cbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19hZGQpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIG9uZVs2NF0sIHR3b1sxMjhdO1xuK1x0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcdGludCBvMiA9IHB1dF9saXN0ZW5lcih0d28sIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCBcInVkcFwiLCBURVNUX1BPUlQpO1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KHR3bywgbzIpKTtcdFx0LyogYWRkIHVkcCwga2VlcCB0Y3AgKi9cbitcdEFTU0VSVF9FUSgyLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAyLCBcInVkcFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfcmVtb3ZlX3N1YnNldClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYm90aFsxMjhdLCBvbmVbNjRdO1xuK1x0aW50IG9iID0gcHV0X2xpc3RlbmVyKGJvdGgsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXHRpbnQgb28gPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0b2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgb2IsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGJvdGgsIG9iKSk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgb28pKTtcdFx0LyogZHJvcCB1ZHAgKi9cbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19lbXB0eV9kZXN0cm95cylcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7XHRcdC8qIGVtcHR5IC1cdTAwM2UgZGVzdHJveSBzZXJ2ICovXG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19pcHY2KVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmLCBzO1xuK1xuK1x0cyA9IHNvY2tldChBRl9JTkVUNiwgU09DS19TVFJFQU0sIDApO1xuK1x0aWYgKHMgXHUwMDNjIDApXG4rXHRcdFNLSVAocmV0dXJuLCBcIklQdjYgdW5hdmFpbGFibGU6ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRjbG9zZShzKTtcbitcbitcdG9mZiA9IHB1dF9saXN0ZW5lcl9hZihhdHRycywgMCwgXCJ0Y3BcIiwgQUZfSU5FVDYsIFRFU1RfUE9SVCk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidGNwXCIsIEFGX0lORVQ2LCBURVNUX1BPUlQpKTtcbitcdEVYUEVDVF9FUSgwLCBtZW1jbXAoXHUwMDI2Z290WzBdLmE2LCBcdTAwMjZpbjZhZGRyX2xvb3BiYWNrLCBzaXplb2YoaW42YWRkcl9sb29wYmFjaykpKTtcbit9XG4rXG4rLyogPT09PT09PT09PT09PT09PT09PT09IHJwY2JpbmQgcmVnaXN0cmF0aW9uID09PT09PT09PT09PT09PT09PT09PSAqL1xuK1xuKy8qXG4rICogQSBycGNiaW5kIHRoYXQgcmVmdXNlcyB0aGUgcmVnaXN0cmF0aW9uIG11c3QgZmFpbCBsaXN0ZW5lciBjcmVhdGlvbixcbisgKiB3aGF0ZXZlciBDT05GSUdfTkZTX0xPQ0FMSU8gaXMgc2V0IHRvLlxuKyAqXG4rICogVGhlIGVycm9yIGhhcyB0byBzdXJ2aXZlIHN2Y19yZWdpc3RlcigpJ3Mgd2FsayBvdmVyIHN2X3Byb2dyYW1zIHRvIGdldFxuKyAqIGhlcmUuIFdpdGggQ09ORklHX05GU19MT0NBTElPPXkgdGhlIHRyYWlsaW5nIG5mc2xvY2FsaW8gcHJvZ3JhbSBoYXMgb25seVxuKyAqIGEgTlVMTCBhbmQgYSB2c19oaWRkZW4gdmVyc2lvbiwgYW5kIHN2Y19nZW5lcmljX3JwY2JpbmRfc2V0KCkgcmVwb3J0cyAwXG4rICogZm9yIGJvdGgsIHNvIGFuIHN2Y19yZWdpc3RlcigpIHRoYXQga2VlcHMgdGhlIGxhc3QgcmVzdWx0IHJhdGhlciB0aGFuIHRoZVxuKyAqIGZpcnN0IGhhbmRzIGJhY2sgc3VjY2VzcyBhbmQgdGhlIGxpc3RlbmVyIGNvbWVzIHVwIHJlZ2FyZGxlc3MuXG4rICovXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9yZWdpc3Rlcl9yZWZ1c2VkKVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIHJwY2Jfc3R1Yl9yZXN0YXJ0KFx1MDAyNnNlbGYtXHUwMDNlcnBjYmQsIFJQQ0JfU1RVQl9SRUZVU0UpKTtcbitcbitcdEVYUEVDVF9FUSgtRUFDQ0VTLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbit9XG4rXG4rLyogPT09PT09PT09PT09PT09PT09PT09IHRocmVhZHMgLyAtRUJVU1kgc2VtYW50aWNzID09PT09PT09PT09PT09PT09PT09PSAqL1xuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBzZW1fYnVzeV9vbl9jaGFuZ2UpXG4re1xuK1x0Y2hhciBvbmVbNjRdLCB0d29bMTI4XTtcbitcdGludCBvMSA9IHB1dF9saXN0ZW5lcihvbmUsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXHRpbnQgbzIgPSBwdXRfbGlzdGVuZXIodHdvLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0bzIgPSBwdXRfbGlzdGVuZXIodHdvLCBvMiwgXCJ1ZHBcIiwgVEVTVF9QT1JUKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvMSkpO1xuK1x0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcdFx0XHQvKiB0aHJlYWRzIG5vdyBydW5uaW5nICovXG4rXHRFWFBFQ1RfRVEoLUVCVVNZLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpO1x0LyogYWRkIHJlZnVzZWQgKi9cbitcdHRocmVhZHNfc2V0KDApO1x0XHRcdFx0XHQvKiBzdG9wIGJlZm9yZSBuZXRucyBleGl0ICovXG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBzZW1fYnVzeV9vbl9yZW1vdmUpXG4re1xuK1x0Y2hhciBvbmVbNjRdO1xuK1x0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvMSkpO1xuK1x0QVNTRVJUX0VRKDAsIHRocmVhZHNfc2V0KDEpKTtcbitcdEVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7XHQvKiByZW1vdmUgcmVmdXNlZCAqL1xuK1x0dGhyZWFkc19zZXQoMCk7XG4rfVxuK1xuK1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5ncyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3Ncbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MDkxYjQ1ZDIyNmJhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL3NldHRpbmdzXG5AQCAtMCwwICsxIEBAXG4rdGltZW91dD0xMjBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjM5OjQwLjc4NzM0MjQwOFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg2NTExMzAxNTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBORlMgYW5kIFJQQyBQYXRjaCBTZXJpZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHNlcmllcywgYW5kIGl0J3MgdG91Y2hpbmcgc29tZSBwcmV0dHkgY3JpdGljYWwgYXJlYXM6IGBmcy9uZnNkL25mc2N0bC5jYCwgYG5ldC9zdW5ycGMvcnBjYl9jbG50LmNgLCBhbmQgYG5ldC9zdW5ycGMvc3ZjLmNgLiBQbHVzLCB0aGVyZSdzIGEgbmV3IHNlbGZ0ZXN0LCB3aGljaCBpcyBhbHdheXMgZ29vZC4gTGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG5GaXJzdCwgYGZzL25mc2QvbmZzY3RsLmNgIGhhcyBjaGFuZ2VzIHRoYXQgYXJlIGFkZGluZyB2YWxpZGF0aW9uIGZvciB0cmFuc3BvcnQgY2xhc3NlcyB1c2luZyBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCBhbmQgbGltaXRpbmcgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgd2l0aCBgTkZTRF9OTF9MSVNURU5FUl9NQVhgLiBUaGlzIGlzIGltcG9ydGFudCBmb3Igcm9idXN0bmVzcyBhbmQgcHJldmVudGluZyByZXNvdXJjZSBleGhhdXN0aW9uLlxuXG5UaGVuLCBvdmVyIGluIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgdGhlcmUncyBhIHRpbWVvdXQgYmVpbmcgYWRkZWQgZm9yIGxvY2FsIHJwY2JpbmQgY2FsbHMgKGBycGNiX2xvY2FsX3RpbWVvdXRgKS4gVGhhdCdzIGxpa2VseSBhaW1lZCBhdCBoYW5kbGluZyBwb3RlbnRpYWwgYmxvY2tpbmcgc2NlbmFyaW9zIG1vcmUgZ3JhY2VmdWxseS5cblxuRmluYWxseSwgYG5ldC9zdW5ycGMvc3ZjLmNgIHNlZW1zIHRvIGJlIGZpeGluZyBhbiBlcnJvciBoYW5kbGluZyBpc3N1ZSBpbiBgc3ZjX3JlZ2lzdGVyYCwgbWFraW5nIGl0IHJldHVybiB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQsIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhhdC4gVGhpcyBpcyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IGNoYW5nZSB0aGF0IGltcHJvdmVzIHRoZSBlcnJvciByZXBvcnRpbmcuXG5cbkkgbmVlZCB0byBjb25maXJtIHRoZXNlIGZ1bmN0aW9ucycgcmVhY2hhYmlsaXR5IGFuZCBmdW5jdGlvbmFsIGltcGFjdCwgc28gSSBhbSBnb2luZyB0byBjaGVjayB0aG9zZSBmaWxlcyBzcGVjaWZpY2FsbHkuIEkndmUgbm90ZWQgdGhhdCBgZnMvbmZzZC9uZnNjdGwuY2AgaXMgdG91Y2hpbmcgYG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzYCBhbmQgYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AgaXMgZ29pbmcgdG8gZGVhbCB3aXRoIGBycGNiX2NyZWF0ZV9hZl9sb2NhbGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgLCBhbmQgYG5ldC9zdW5ycGMvc3ZjLmNgIGNoYW5nZXMgYXJlIGdvaW5nIHRvIGltcGFjdCBgc3ZjX3JlZ2lzdGVyYC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWZpbml0ZWx5IGNvcmUga2VybmVsIGxvZ2ljLCBhbmQgdGhlIGNoYW5nZXMgYXJlIGRlZmluaXRlbHkgcmVhY2hhYmxlIGFuZCB3aWxsIGhhdmUgZnVuY3Rpb25hbCBpbXBhY3QuXG5cbk5vdywgSSB3YW50IHRvIGNvbmZpcm0gd2hldGhlciB0aGVzZSBmdW5jdGlvbnMgYXJlIHN0YXRpYyBvciBub3QuIFRoaXMgYWZmZWN0cyB0aGVpciBzY29wZSBhbmQgaG93IHRoZXkncmUgdXNlZC5cbkkgZm91bmQgdGhhdCBgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnNgIGlzIHN0YXRpYywgd2hpbGUgYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgIGlzIG5vdC4gSW4gYG5ldC9zdW5ycGMvcnBjYl9jbG50LmNgLCBJIGNvbmZpcm1lZCB0aGF0IGJvdGggYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAgYXJlIHN0YXRpYy4gRmluYWxseSwgYHN2Y19yZWdpc3RlcmAgaW4gYG5ldC9zdW5ycGMvc3ZjLmNgIGlzIG5vdCBzdGF0aWMuXG5cbkknbSBnb2luZyB0byBsZXZlcmFnZSBgZ3JlcHBlcmAgbm93IHRvIHRyYWNrIGRvd24gYWxsIHRoZSBwcmVjaXNlIGRlZmluaXRpb25zIGFuZCB1c2FnZXMgb2YgZWFjaCBmdW5jdGlvbiB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MDI4LCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTI5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6Mzk6NDkuNDM4NDc1NjcyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNDE5Mzc3MjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9uZnNkL25ldGxpbmsuYz0xMjI9c3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX3NwbGl0X29wcyBuZnNkX25sX29wc1tdID0ge1xcbi0tXFxuZnMvbmZzZC9uZXRsaW5rLmMtMTUzLVxcdFxcdC5jbWRcXHRcXHQ9IE5GU0RfQ01EX0xJU1RFTkVSX1NFVCxcXG5mcy9uZnNkL25ldGxpbmsuYzoxNTQ6XFx0XFx0LmRvaXRcXHRcXHQ9IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQsXFxuZnMvbmZzZC9uZXRsaW5rLmMtMTU1LVxcdFxcdC5wb2xpY3lcXHRcXHQ9IG5mc2RfbGlzdGVuZXJfc2V0X25sX3BvbGljeSxcXG4tLVxcbmZzL25mc2QvbmV0bGluay5oPTI5PWludCBuZnNkX25sX3ZlcnNpb25fZ2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7XFxuZnMvbmZzZC9uZXRsaW5rLmg6MzA6aW50IG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7XFxuZnMvbmZzZC9uZXRsaW5rLmgtMzEtaW50IG5mc2RfbmxfbGlzdGVuZXJfZ2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7XFxuLS1cXG5mcy9uZnNkL25mc2N0bC5jPTIwMDU9c3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYy0yMDU2LS8qKlxcbmZzL25mc2QvbmZzY3RsLmM6MjA1NzogKiBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0IC0gc2V0IHRoZSBuZnMgcnVubmluZyBzb2NrZXRzXFxuZnMvbmZzZC9uZnNjdGwuYy0yMDU4LSAqIEBza2I6IHJlcGx5IGJ1ZmZlclxcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYy0yMDYyLSAqL1xcbmZzL25mc2QvbmZzY3RsLmM6MjA2MzppbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbmZzL25mc2QvbmZzY3RsLmMtMjA2NC17XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jPTcxNj1URVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTczMy0gKiByZXF1ZXN0IGdldHMgLS0gd2l0aG91dCB0aGUgY2hlY2sgaW4gbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoKSxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jOjczNDogKiBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KCkgaGFzIGFscmVhZHkgbW92ZWQgdGhlIHVubWF0Y2hlZCB0Y3AgbGlzdGVuZXJcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTczNS0gKiBvZmYgc3ZfcGVybXNvY2tzIGFuZCBydW4gc3ZjX3hwcnRfZGVzdHJveV9hbGwoKSBvbiBpdCBieSB0aGUgdGltZSB0aGVcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6Mzk6NTEuNTgwNDE4NDY5WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzAwOTIyMDYyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgaW5pdGlhbCB0aG91Z2h0cywgZnJhbWVkIGFzIGEgY29uY2lzZSBzdW1tYXJ5IGZvciBhbiBleHBlcnQ6XG5cbioqUHJpb3JpdGl6aW5nIEZ1enppbmcgVGFyZ2V0cyoqXG5cbkFscmlnaHQsIGxvb2tpbmcgYXQgdGhpcyBjb2RlLCBteSBtaW5kIGltbWVkaWF0ZWx5IGp1bXBzIHRvIGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YC4gU2VlbXMgbGlrZSBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gSXQncyBnb3QgdGhhdCBuZXR3b3JrIGludGVyYWN0aW9uIGVsZW1lbnQsIHdoaWNoIG9mdGVuIG1lYW5zIGNvbXBsZXggaW5wdXQgaGFuZGxpbmcgYW5kIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMuXG5cbk5vdywgSSdtIGFsc28gY29uc2lkZXJpbmcgYHN2Y19yZWdpc3RlcmAuIEl0J3MgYSBrZXkgZnVuY3Rpb24gZm9yIHNlcnZpY2UgcmVnaXN0cmF0aW9uLCBhbHdheXMgYSBzZW5zaXRpdmUgYXJlYSBmcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUuIEkgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIGRhdGEgZmxvd3MgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbiBwb2ludHMgaW4gdGhpcyBhcmVhLiBCb3RoIHNlZW0gbGlrZSBnb29kIHN0YXJ0aW5nIHBvaW50cywgYnV0IGl0J3MgaW1wb3J0YW50IHRvIGFzc2VzcyB3aGljaCBvbmUgcHJlc2VudHMgdGhlIG1vc3QgaW1tZWRpYXRlIHJpc2sgb3IgaGlnaGVzdCBwb3RlbnRpYWwgZm9yIHJld2FyZCBpbiB0ZXJtcyBvZiB1bmNvdmVyaW5nIHZ1bG5lcmFiaWxpdGllcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc4NDksIk91dHB1dFRva2VucyI6MTcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTozOTo1NC41ODk2NDI1MjRaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI3NzY2MDU3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdmNfcmVnaXN0ZXJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmg9NDc0PXZvaWRcXHRcXHQgICBzdmNfcHJvY2Vzc19iYyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHN2Y19ycXN0ICpycXN0cCk7XFxuaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmg6NDc1OmludFxcdFxcdCAgIHN2Y19yZWdpc3Rlcihjb25zdCBzdHJ1Y3Qgc3ZjX3NlcnYgKiwgc3RydWN0IG5ldCAqLCBjb25zdCBpbnQsXFxuaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgtNDc2LVxcdFxcdFxcdFxcdGNvbnN0IHVuc2lnbmVkIHNob3J0LCBjb25zdCB1bnNpZ25lZCBzaG9ydCk7XFxuLS1cXG5uZXQvc3VucnBjL3N2Yy5jPTEwNzQ9c3RhdGljIGludCBfX3N2Y19ycGNiX3JlZ2lzdGVyNihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHUzMiBwcm9ncmFtLFxcbi0tXFxubmV0L3N1bnJwYy9zdmMuYy0xMTE3LSAqL1xcbm5ldC9zdW5ycGMvc3ZjLmM6MTExODpzdGF0aWMgaW50IF9fc3ZjX3JlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCwgY29uc3QgY2hhciAqcHJvZ25hbWUsXFxubmV0L3N1bnJwYy9zdmMuYy0xMTE5LVxcdFxcdFxcdCAgY29uc3QgdTMyIHByb2dyYW0sIGNvbnN0IHUzMiB2ZXJzaW9uLFxcbi0tXFxubmV0L3N1bnJwYy9zdmMuYy0xMTM3LVxcbm5ldC9zdW5ycGMvc3ZjLmM6MTEzODpcXHR0cmFjZV9zdmNfcmVnaXN0ZXIocHJvZ25hbWUsIHZlcnNpb24sIGZhbWlseSwgcHJvdG9jb2wsIHBvcnQsIGVycm9yKTtcXG5uZXQvc3VucnBjL3N2Yy5jLTExMzktXFx0cmV0dXJuIGVycm9yO1xcbi0tXFxubmV0L3N1bnJwYy9zdmMuYz0xMTQzPWludCBzdmNfcnBjYmluZF9zZXRfdmVyc2lvbihzdHJ1Y3QgbmV0ICpuZXQsXFxuLS1cXG5uZXQvc3VucnBjL3N2Yy5jLTExNDgte1xcbm5ldC9zdW5ycGMvc3ZjLmM6MTE0OTpcXHRyZXR1cm4gX19zdmNfcmVnaXN0ZXIobmV0LCBwcm9ncC1cXHUwMDNlcGdfbmFtZSwgcHJvZ3AtXFx1MDAzZXBnX3Byb2csXFxubmV0L3N1bnJwYy9zdmMuYy0xMTUwLVxcdFxcdFxcdFxcdHZlcnNpb24sIGZhbWlseSwgcHJvdG8sIHBvcnQpO1xcbi0tXFxubmV0L3N1bnJwYy9zdmMuYz0xMTg0PUVYUE9SVF9TWU1CT0xfR1BMKHN2Y19nZW5lcmljX3JwY2JpbmRfc2V0KTtcXG4tLVxcbm5ldC9zdW5ycGMvc3ZjLmMtMTE4Ni0vKipcXG5uZXQvc3VucnBjL3N2Yy5jOjExODc6ICogc3ZjX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYW4gUlBDIHNlcnZpY2Ugd2l0aCB0aGUgbG9jYWwgcG9ydG1hcHBlclxcbm5ldC9zdW5ycGMvc3ZjLmMtMTE4OC0gKiBAc2Vydjogc3ZjX3NlcnYgc3RydWN0IGZvciB0aGUgc2VydmljZSB0byByZWdpc3Rlclxcbi0tXFxubmV0L3N1bnJwYy9zdmMuYy0xMTk1LSAqL1xcbm5ldC9zdW5ycGMvc3ZjLmM6MTE5NjppbnQgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0LFxcbm5ldC9zdW5ycGMvc3ZjLmMtMTE5Ny1cXHRcXHQgY29uc3QgaW50IGZhbWlseSwgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG8sXFxuLS1cXG5uZXQvc3VucnBjL3N2Y194cHJ0LmM9MTEwNz1zdGF0aWMgdm9pZCBzdmNfZGVsZXRlX3hwcnQoc3RydWN0IHN2Y194cHJ0ICp4cHJ0KVxcbi0tXFxubmV0L3N1bnJwYy9zdmNfeHBydC5jLTExMTgtXFxubmV0L3N1bnJwYy9zdmNfeHBydC5jOjExMTk6XFx0XFx0aWYgKHN2Y19yZWdpc3RlcihzZXJ2LCB4cHJ0LVxcdTAwM2V4cHRfbmV0LCBzb2NrLVxcdTAwM2Vzay1cXHUwMDNlc2tfZmFtaWx5LFxcbm5ldC9zdW5ycGMvc3ZjX3hwcnQuYy0xMTIwLVxcdFxcdFxcdFxcdCBzb2NrLVxcdTAwM2Vzay1cXHUwMDNlc2tfcHJvdG9jb2wsIDApIFxcdTAwM2MgMClcXG4tLVxcbm5ldC9zdW5ycGMvc3Zjc29jay5jPTE0Mzk9c3RhdGljIHN0cnVjdCBzdmNfc29jayAqc3ZjX3NldHVwX3NvY2tldChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsXFxuLS1cXG5uZXQvc3VucnBjL3N2Y3NvY2suYy0xNDcyLVxcbm5ldC9zdW5ycGMvc3Zjc29jay5jOjE0NzM6XFx0XFx0ZXJyID0gc3ZjX3JlZ2lzdGVyKHNlcnYsIHNvY2tfbmV0KHNvY2stXFx1MDAzZXNrKSwgaW5ldC1cXHUwMDNlc2tfZmFtaWx5LFxcbm5ldC9zdW5ycGMvc3Zjc29jay5jLTE0NzQtXFx0XFx0XFx0XFx0ICAgICBpbmV0LVxcdTAwM2Vza19wcm90b2NvbCxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM9ODUyPVRFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg3NS0gKlxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM6ODc2OiAqIFRoZSBlcnJvciBoYXMgdG8gc3Vydml2ZSBzdmNfcmVnaXN0ZXIoKSdzIHdhbGsgb3ZlciBzdl9wcm9ncmFtcyB0byBnZXRcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg3Ny0gKiBoZXJlLiBXaXRoIENPTkZJR19ORlNfTE9DQUxJTz15IHRoZSB0cmFpbGluZyBuZnNsb2NhbGlvIHByb2dyYW0gaGFzIG9ubHlcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg3OC0gKiBhIE5VTEwgYW5kIGEgdnNfaGlkZGVuIHZlcnNpb24sIGFuZCBzdmNfZ2VuZXJpY19ycGNiaW5kX3NldCgpIHJlcG9ydHMgMFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmM6ODc5OiAqIGZvciBib3RoLCBzbyBhbiBzdmNfcmVnaXN0ZXIoKSB0aGF0IGtlZXBzIHRoZSBsYXN0IHJlc3VsdCByYXRoZXIgdGhhbiB0aGVcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jLTg4MC0gKiBmaXJzdCBoYW5kcyBiYWNrIHN1Y2Nlc3MgYW5kIHRoZSBsaXN0ZW5lciBjb21lcyB1cCByZWdhcmRsZXNzLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTozOTo1Ni44NjczMTEzNTJaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzEzMjg1MTQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdW5kZXJzdGFuZGluZywgY29uc2lkZXJpbmcgSSdtIHRyeWluZyB0byBzZWxlY3QgdGhlIGJlc3QgZnVuY3Rpb24gZm9yIHNvbWV0aGluZzpcblxuKipGdW5jdGlvbiBDYW5kaWRhdGUgRXZhbHVhdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIHNlZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgYHN2Y19yZWdpc3RlcmAgbG9va3MgbGlrZSBhIHN0cm9uZyBjb250ZW5kZXIuIEhvd2V2ZXIsIEkgbmVlZCB0byBiZSB0aG9yb3VnaC4gVGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgaXQncyB0aGUgYmVzdCBvcHRpb24sIG9yIGlmIHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyBldmVuIG1vcmUgcGVyZmVjdGx5IHN1aXRlZCBmb3IgbXkgbmVlZHMuXG5cbkknbSBub3cgdGhpbmtpbmcgYWJvdXQgYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAuIFRoZSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGF0IHRoZXkgYXJlIHN0YXRpYyBmdW5jdGlvbnMuIFN0YXRpYyBmdW5jdGlvbnMgaGF2ZSB0aGVpciBzY29wZSBsaW1pdGVkLiBUaGUgbWFpbiBpc3N1ZSBoZXJlIGlzIGlmIHRoZSBjYWxsLXNpdGVzIGFyZSBhbHNvIHdpdGhpbiB0aGF0IHNjb3BlLiBBcmUgdGhleSBvbmx5IGNhbGxlZCBmcm9tIHdpdGhpbiBvdGhlciBzdGF0aWMgZnVuY3Rpb25zLCBvciBhcmUgdGhleSBjYWxsZWQgZnJvbSBhIG5vbi1zdGF0aWMgY29udGV4dD8gVGhpcyBpcyB0aGUgY3J1Y2lhbCBwb2ludCBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhleSB3aWxsIHdvcmsgYXMgZGVzaXJlZCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBsYXJnZXIgZGVzaWduLiBJZiB0aGV5J3JlIGNhbGxlZCBvdXRzaWRlIHRoZWlyIHN0YXRpYyBzY29wZSwgSSBoYXZlIGEgcHJvYmxlbS4gSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoZSBjYWxsIGdyYXBoIGFuZCB0aGVpciByZXNwZWN0aXZlIGNvbnRleHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTI0MywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjQwOjAwLjU4MDYwMDA1N1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjAzMzY5MTYzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJwY2JfY3JlYXRlX2FmX2xvY2FsXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9MjI4PXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX3RpbWVvdXQgcnBjYl9sb2NhbF90aW1lb3V0ID0ge1xcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yMzctICovXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyMzg6c3RhdGljIGludCBycGNiX2NyZWF0ZV9hZl9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yMzktXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX3VuICphZGRyKVxcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0yODU9c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChzdHJ1Y3QgbmV0ICpuZXQpXFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI5MS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjI5MjpcXHRyZXR1cm4gcnBjYl9jcmVhdGVfYWZfbG9jYWwobmV0LCBcXHUwMDI2cnBjYl9sb2NhbGFkZHJfYWJzdHJhY3QpO1xcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjkzLX1cXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9Mjk1PXN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfdW5peChzdHJ1Y3QgbmV0ICpuZXQpXFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMwMS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjMwMjpcXHRyZXR1cm4gcnBjYl9jcmVhdGVfYWZfbG9jYWwobmV0LCBcXHUwMDI2cnBjYl9sb2NhbGFkZHJfdW5peCk7XFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0zMDMtfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTo0MDowMi43ODM5NzQxOVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2NTcyMjk3MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBzdW1tYXJ5LCB0YWtpbmcgdGhlIHBlcnNwZWN0aXZlIG9mIHNvbWVvbmUgZGVlcGx5IGZhbWlsaWFyIHdpdGggc3lzdGVtIGludGVybmFsczpcblxuKipUcmFjaW5nIHRoZSBPcmlnaW5zIG9mIEFic3RyYWN0IGFuZCBVbml4IERvbWFpbiBTb2NrZXQgQ3JlYXRpb24gaW4gcnBjYmluZCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbGlmZWN5Y2xlIG9mIGFic3RyYWN0IGFuZCBVbml4IGRvbWFpbiBzb2NrZXQgY3JlYXRpb24gd2l0aGluIGBycGNiaW5kYC4gTXkgZm9jdXMgaXMgb24gdHJhY2luZyBob3cgdGhlc2UgbWVjaGFuaXNtcyBhcmUgKmluc3RhbnRpYXRlZCog4oCTIHNwZWNpZmljYWxseSwgdGhlIGNhbGxzIHRvIGBycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdGAgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF91bml4YC4gSSB3YW50IHRvIGlkZW50aWZ5IHRoZSBpbml0aWF0aW5nIHBvaW50cywgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQsIGFuZCBhbnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHRoYXQgaW5mbHVlbmNlIHRoZWlyIGludm9jYXRpb24uIFRoaXMgbGV2ZWwgb2YgZGV0YWlsIGlzIGNydWNpYWwgZm9yIHJlYWxseSB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciBvZiBgcnBjYmluZGAgd2hlbiBkZWFsaW5nIHdpdGggdmFyaW91cyBzb2NrZXQgdHlwZXMuIEtub3dpbmcgKndoZXJlKiBhbmQgKndoeSogdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2lsbCByZXZlYWwgYSBsb3QgYWJvdXQgdGhlIGFwcGxpY2F0aW9uIGFyY2hpdGVjdHVyZSwgaXRzIGVycm9yIGhhbmRsaW5nLCBhbmQsIHBvc3NpYmx5LCBhbnkgdnVsbmVyYWJpbGl0aWVzIG9yIG9wdGltaXphdGlvbnMgdGhhdCBtaWdodCBiZSBwcmVzZW50LiBMZXQncyBkaWcgaW4gYW5kIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5ODkxLCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MDYuNDQxMjA2MDI5WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTEzNDQxOTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9zdW5ycGMvcnBjYl9jbG50LmM9MjM4PXN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfYWZfbG9jYWwoc3RydWN0IG5ldCAqbmV0LFxcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yODQtXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzoyODU6c3RhdGljIGludCBycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChzdHJ1Y3QgbmV0ICpuZXQpXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0yODYte1xcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0zNTc9aW50IHJwY2JfY3JlYXRlX2xvY2FsKHN0cnVjdCBuZXQgKm5ldClcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzY4LVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY5OlxcdGlmIChycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChuZXQpICE9IDAgXFx1MDAyNlxcdTAwMjZcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM3MC1cXHQgICAgcnBjYl9jcmVhdGVfbG9jYWxfdW5peChuZXQpICE9IDApXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjQwOjA4LjU1NDY1NjQ2OFoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyOTY1NTAxNDc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBgcnBjYl9jcmVhdGVfbG9jYWxgKipcblxuT2theSwgc28gYHJwY2JfY3JlYXRlX2xvY2FsYCBpc24ndCBkZWNsYXJlZCBhcyBgc3RhdGljYC4gVGhhdCBpbW1lZGlhdGVseSBwaXF1ZXMgbXkgaW50ZXJlc3QuIE5vbi1zdGF0aWMgZnVuY3Rpb25zIHVzdWFsbHkgaW1wbHkgYSBicm9hZGVyIHNjb3BlIG9mIHVzYWdlLCBwb3RlbnRpYWxseSBpbmRpY2F0aW5nIGl0J3MgcGFydCBvZiBhIHB1YmxpYyBpbnRlcmZhY2UsIG9yIGF0IGxlYXN0IGNhbGxlZCBmcm9tIHZhcmlvdXMgcGxhY2VzIHdpdGhpbiB0aGUgY29kZWJhc2UuIEdpdmVuIHRoYXQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCB0aG9yb3VnaGx5IGFuYWx5emUgd2hlcmUgdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBiZWluZyAqdXNlZCouIFRpbWUgdG8gdHJhY2sgZG93biBhbGwgaXRzIGNhbGwgc2l0ZXMgYW5kIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gdGhpcyBzeXN0ZW0uIFRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaXRzIGltcGFjdCBhbmQgaW1wb3J0YW5jZS4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbnRleHQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMzkxLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MTEuNTIwMTYwNTA3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTg1MDg1OTA0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJwY2JfY3JlYXRlX2xvY2FsXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaD0xOTc9c3RydWN0IHJwY194cHJ0XFx0KnJwY190YXNrX2dldF94cHJ0KHN0cnVjdCBycGNfY2xudCAqY2xudCxcXG4tLVxcbmluY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaC0xOTktXFxuaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oOjIwMDppbnRcXHRcXHRycGNiX2NyZWF0ZV9sb2NhbChzdHJ1Y3QgbmV0ICopO1xcbmluY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaC0yMDEtdm9pZFxcdFxcdHJwY2JfcHV0X2xvY2FsKHN0cnVjdCBuZXQgKik7XFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jPTIwNj1zdGF0aWMgdm9pZCBycGNiX3NldF9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBycGNfY2xudCAqY2xudCxcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjExLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MjEyOlxcdC8qIFByb3RlY3RlZCBieSBycGNiX2NyZWF0ZV9sb2NhbF9tdXRleCAqL1xcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjEzLVxcdHNuLVxcdTAwM2VycGNiX2xvY2FsX2NsbnQgPSBjbG50O1xcbi0tXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYz0yMzg9c3RhdGljIGludCBycGNiX2NyZWF0ZV9hZl9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsXFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI4NC1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjI4NTpzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX2Fic3RyYWN0KHN0cnVjdCBuZXQgKm5ldClcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI4Ni17XFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTI5NC1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjI5NTpzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX3VuaXgoc3RydWN0IG5ldCAqbmV0KVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMjk2LXtcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzA4LSAqL1xcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzA5OnN0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWxfbmV0KHN0cnVjdCBuZXQgKm5ldClcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTMxMC17XFxuLS1cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM1Ni0gKi9cXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM1NzppbnQgcnBjYl9jcmVhdGVfbG9jYWwoc3RydWN0IG5ldCAqbmV0KVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzU4LXtcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM1OTpcXHRzdGF0aWMgREVGSU5FX01VVEVYKHJwY2JfY3JlYXRlX2xvY2FsX211dGV4KTtcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2MC1cXHRpbnQgcmVzdWx0ID0gMDtcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzY0LVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY1OlxcdG11dGV4X2xvY2soXFx1MDAyNnJwY2JfY3JlYXRlX2xvY2FsX211dGV4KTtcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jLTM2Ni1cXHRpZiAocnBjYl9nZXRfbG9jYWwobmV0KSlcXG4tLVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzY4LVxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6MzY5OlxcdGlmIChycGNiX2NyZWF0ZV9sb2NhbF9hYnN0cmFjdChuZXQpICE9IDAgXFx1MDAyNlxcdTAwMjZcXG5uZXQvc3VucnBjL3JwY2JfY2xudC5jOjM3MDpcXHQgICAgcnBjYl9jcmVhdGVfbG9jYWxfdW5peChuZXQpICE9IDApXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYzozNzE6XFx0XFx0cmVzdWx0ID0gcnBjYl9jcmVhdGVfbG9jYWxfbmV0KG5ldCk7XFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0zNzItXFxubmV0L3N1bnJwYy9ycGNiX2NsbnQuYy0zNzMtb3V0Olxcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmM6Mzc0OlxcdG11dGV4X3VubG9jayhcXHUwMDI2cnBjYl9jcmVhdGVfbG9jYWxfbXV0ZXgpO1xcbm5ldC9zdW5ycGMvcnBjYl9jbG50LmMtMzc1LVxcdHJldHVybiByZXN1bHQ7XFxuLS1cXG5uZXQvc3VucnBjL3N2Yy5jPTMwMT1zdGF0aWMgaW50IHN2Y19ycGNiX3NldHVwKHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IG5ldCAqbmV0KVxcbi0tXFxubmV0L3N1bnJwYy9zdmMuYy0zMDQtXFxubmV0L3N1bnJwYy9zdmMuYzozMDU6XFx0ZXJyID0gcnBjYl9jcmVhdGVfbG9jYWwobmV0KTtcXG5uZXQvc3VucnBjL3N2Yy5jLTMwNi1cXHRpZiAoZXJyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTo0MDoxMy43MDUyNTE3MzFaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY2NDg3ODMyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFJQQyBTZXJ2ZXIgU2V0dXAgYW5kIFJlbGF0ZWQgQ29uZmlndXJhdGlvbnMqKlxuXG5Pa2F5LCBzbyBJIHNlZSB0aGF0IGBycGNiX2NyZWF0ZV9sb2NhbGAgaXMgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGBzdmNfcnBjYl9zZXR1cGAsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIFJQQyBzZXJ2ZXIgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4gVGhhdCBtYWtlcyBzZW5zZTsgaXQncyBhIGNyaXRpY2FsIHBhcnQgb2YgdGhlIHNldHVwLiBJJ3ZlIGFsc28gbm90ZWQgdGhhdCB0aGUgY29kZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gYG5mc2RfbmxfbGlzdGVuZXJfc2V0X2RvaXRgLCBgcnBjYl9jcmVhdGVfbG9jYWxgLCBhbmQgYHN2Y19yZWdpc3RlcmAuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGtleSB0byB0aGUgbmV3IGJlaGF2aW9yLlxuXG5Ob3csIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBlbmFibGluZyB0aGlzIG5ldyBmdW5jdGlvbmFsaXR5LiBMZXQncyBzZWUuLi4gdGhlIHNlbGZ0ZXN0IGNvbmZpZyBtZW50aW9ucyBgQ09ORklHX05FVF9OUz15YCwgYENPTkZJR19JUFY2PXlgLCBgQ09ORklHX05GU0Q9eWAsIGFuZCBgQ09ORklHX05GU0RfVjQ9eWAuIFRoYXQgZ2l2ZXMgbWUgYSBzdGFydGluZyBwb2ludC4gYE5FVF9OU2AgaXMgY2xlYXJseSBpbXBvcnRhbnQgZm9yIG5ldHdvcmsgbmFtZXNwYWNlcywgYElQVjZgIGZvciBvYnZpb3VzIHJlYXNvbnMsIGFuZCBgTkZTRGAvYE5GU0RfVjRgIHJlbGF0ZSB0byB0aGUgTkZTIHNlcnZlciBpdHNlbGYuIEknbGwgbmVlZCB0byBkaWcgZGVlcGVyLCB0aG91Z2guXG5cbkkgc2hvdWxkIGV4YW1pbmUgYGZzL25mc2QvS2NvbmZpZ2AgdG8gbG9vayBmb3IgYW55IGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIHJlbGF0aW9uc2hpcHMgdGhhdCBtaWdodCBiZSBsZXNzIG9idmlvdXMuIFRoZXJlIGNvdWxkIGJlIG90aGVyIHJlbGF0ZWQga2VybmVsIGZlYXR1cmVzIG9yIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSBhbHNvIGludm9sdmVkLiBJdCdzIGltcG9ydGFudCB0byBoYXZlIGEgY29tcGxldGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE2MzMsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MTguMzcwMTMzMDc5WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NDMxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9uZnNkL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgTkZTRFxcbiAgIDM6XFx0XFx0dHJpc3RhdGUgXFxcIk5GUyBzZXJ2ZXIgc3VwcG9ydFxcXCJcXG4gICA0OlxcdFxcdGRlcGVuZHMgb24gSU5FVFxcbiAgIDU6XFx0XFx0ZGVwZW5kcyBvbiBGSUxFX0xPQ0tJTkdcXG4gICA2OlxcdFxcdGRlcGVuZHMgb24gRlNOT1RJRllcXG4gICA3OlxcdFxcdHNlbGVjdCBDUkMzMlxcbiAgIDg6XFx0XFx0c2VsZWN0IENSWVBUT19MSUJfTUQ1IGlmIE5GU0RfTEVHQUNZX0NMSUVOVF9UUkFDS0lOR1xcbiAgIDk6XFx0XFx0c2VsZWN0IENSWVBUT19MSUJfU0hBMjU2IGlmIE5GU0RfVjRcXG4gIDEwOlxcdFxcdHNlbGVjdCBDUllQVE8gIyByZXF1aXJlZCBieSBSUENTRUNfR1NTX0tSQjUgYW5kIHNpZ25lZCBmaWxlaGFuZGxlc1xcbiAgMTE6XFx0XFx0c2VsZWN0IExPQ0tEXFxuICAxMjpcXHRcXHRzZWxlY3QgU1VOUlBDXFxuICAxMzpcXHRcXHRzZWxlY3QgRVhQT1JURlNcXG4gIDE0OlxcdFxcdHNlbGVjdCBORlNfQ09NTU9OXFxuICAxNTpcXHRcXHRzZWxlY3QgTkZTX0FDTF9TVVBQT1JUIGlmIE5GU0RfVjJfQUNMXFxuICAxNjpcXHRcXHRzZWxlY3QgTkZTX0FDTF9TVVBQT1JUIGlmIE5GU0RfVjNfQUNMXFxuICAxNzpcXHRcXHRkZXBlbmRzIG9uIE1VTFRJVVNFUlxcbiAgMTg6XFx0XFx0aGVscFxcbiAgMTk6XFx0XFx0ICBDaG9vc2UgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGFsbG93IG90aGVyIGNvbXB1dGVycyB0byBhY2Nlc3NcXG4gIDIwOlxcdFxcdCAgZmlsZXMgcmVzaWRpbmcgb24gdGhpcyBzeXN0ZW0gdXNpbmcgU3VuJ3MgTmV0d29yayBGaWxlIFN5c3RlbVxcbiAgMjE6XFx0XFx0ICBwcm90b2NvbC4gIFRvIGNvbXBpbGUgdGhlIE5GUyBzZXJ2ZXIgc3VwcG9ydCBhcyBhIG1vZHVsZSxcXG4gIDIyOlxcdFxcdCAgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBuZnNkLlxcbiAgMjM6XFx0XFxuICAyNDpcXHRcXHQgIFlvdSBtYXkgY2hvb3NlIHRvIHVzZSBhIHVzZXItc3BhY2UgTkZTIHNlcnZlciBpbnN0ZWFkLCBpbiB3aGljaFxcbiAgMjU6XFx0XFx0ICBjYXNlIHlvdSBjYW4gY2hvb3NlIE4gaGVyZS5cXG4gIDI2OlxcdFxcbiAgMjc6XFx0XFx0ICBUbyBleHBvcnQgbG9jYWwgZmlsZSBzeXN0ZW1zIHVzaW5nIE5GUywgeW91IGFsc28gbmVlZCB0byBpbnN0YWxsXFxuICAyODpcXHRcXHQgIHVzZXIgc3BhY2UgcHJvZ3JhbXMgd2hpY2ggY2FuIGJlIGZvdW5kIGluIHRoZSBMaW51eCBuZnMtdXRpbHNcXG4gIDI5OlxcdFxcdCAgcGFja2FnZSwgYXZhaWxhYmxlIGZyb20gaHR0cDovL2xpbnV4LW5mcy5vcmcvLiAgTW9yZSBkZXRhaWwgYWJvdXRcXG4gIDMwOlxcdFxcdCAgdGhlIExpbnV4IE5GUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIHZpYSB0aGVcXG4gIDMxOlxcdFxcdCAgZXhwb3J0cyg1KSBtYW4gcGFnZS5cXG4gIDMyOlxcdFxcbiAgMzM6XFx0XFx0ICBCZWxvdyB5b3UgY2FuIGNob29zZSB3aGljaCB2ZXJzaW9ucyBvZiB0aGUgTkZTIHByb3RvY29sIGFyZVxcbiAgMzQ6XFx0XFx0ICBhdmFpbGFibGUgdG8gY2xpZW50cyBtb3VudGluZyB0aGUgTkZTIHNlcnZlciBvbiB0aGlzIHN5c3RlbS5cXG4gIDM1OlxcdFxcdCAgU3VwcG9ydCBmb3IgTkZTIHZlcnNpb24gMyAoUkZDIDE4MTMpIGlzIGFsd2F5cyBhdmFpbGFibGUgd2hlblxcbiAgMzY6XFx0XFx0ICBDT05GSUdfTkZTRCBpcyBzZWxlY3RlZC5cXG4gIDM3OlxcdFxcbiAgMzg6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgMzk6XFx0XFxuICA0MDpcXHRjb25maWcgTkZTRF9WMlxcbiAgNDE6XFx0XFx0Ym9vbCBcXFwiTkZTIHNlcnZlciBzdXBwb3J0IGZvciBORlMgdmVyc2lvbiAyIChERVBSRUNBVEVEKVxcXCJcXG4gIDQyOlxcdFxcdGRlcGVuZHMgb24gTkZTRFxcbiAgNDM6XFx0XFx0ZGVmYXVsdCBuXFxuICA0NDpcXHRcXHRoZWxwXFxuICA0NTpcXHRcXHQgIE5GU3YyIChSRkMgMTA5NCkgd2FzIHRoZSBmaXJzdCBwdWJsaWNseS1yZWxlYXNlZCB2ZXJzaW9uIG9mIE5GUy5cXG4gIDQ2OlxcdFxcdCAgVW5sZXNzIHlvdSBhcmUgaG9zdGluZyBhbmNpZW50ICgxOTkwJ3MgZXJhKSBORlMgY2xpZW50cywgeW91IGRvbid0XFxuICA0NzpcXHRcXHQgIG5lZWQgdGhpcy5cXG4gIDQ4OlxcdFxcbiAgNDk6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgNTA6XFx0XFxuICA1MTpcXHRjb25maWcgTkZTRF9WMl9BQ0xcXG4gIDUyOlxcdFxcdGJvb2wgXFxcIk5GUyBzZXJ2ZXIgc3VwcG9ydCBmb3IgdGhlIE5GU3YyIEFDTCBwcm90b2NvbCBleHRlbnNpb25cXFwiXFxuICA1MzpcXHRcXHRkZXBlbmRzIG9uIE5GU0RfVjJcXG4gIDU0OlxcdFxcbiAgNTU6XFx0Y29uZmlnIE5GU0RfVjNfQUNMXFxuICA1NjpcXHRcXHRib29sIFxcXCJORlMgc2VydmVyIHN1cHBvcnQgZm9yIHRoZSBORlN2MyBBQ0wgcHJvdG9jb2wgZXh0ZW5zaW9uXFxcIlxcbiAgNTc6XFx0XFx0ZGVwZW5kcyBvbiBORlNEXFxuICA1ODpcXHRcXHRoZWxwXFxuICA1OTpcXHRcXHQgIFNvbGFyaXMgTkZTIHNlcnZlcnMgc3VwcG9ydCBhbiBhdXhpbGlhcnkgTkZTdjMgQUNMIHByb3RvY29sIHRoYXRcXG4gIDYwOlxcdFxcdCAgbmV2ZXIgYmVjYW1lIGFuIG9mZmljaWFsIHBhcnQgb2YgdGhlIE5GUyB2ZXJzaW9uIDMgcHJvdG9jb2wuXFxuICA2MTpcXHRcXHQgIFRoaXMgcHJvdG9jb2wgZXh0ZW5zaW9uIGFsbG93cyBhcHBsaWNhdGlvbnMgb24gTkZTIGNsaWVudHMgdG9cXG4gIDYyOlxcdFxcdCAgbWFuaXB1bGF0ZSBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyBvbiBmaWxlcyByZXNpZGluZyBvbiBORlNcXG4gIDYzOlxcdFxcdCAgc2VydmVycy4gIE5GUyBzZXJ2ZXJzIGVuZm9yY2UgUE9TSVggQUNMcyBvbiBsb2NhbCBmaWxlcyB3aGV0aGVyXFxuICA2NDpcXHRcXHQgIHRoaXMgcHJvdG9jb2wgaXMgYXZhaWxhYmxlIG9yIG5vdC5cXG4gIDY1OlxcdFxcbiAgNjY6XFx0XFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgaW4geW91ciBzeXN0ZW0ncyBORlMgc2VydmVyIGZvciB0aGVcXG4gIDY3OlxcdFxcdCAgTkZTdjMgQUNMIHByb3RvY29sIGV4dGVuc2lvbiBhbGxvd2luZyBORlMgY2xpZW50cyB0byBtYW5pcHVsYXRlXFxuICA2ODpcXHRcXHQgIFBPU0lYIEFDTHMgb24gZmlsZXMgZXhwb3J0ZWQgYnkgeW91ciBzeXN0ZW0ncyBORlMgc2VydmVyLiAgTkZTXFxuICA2OTpcXHRcXHQgIGNsaWVudHMgd2hpY2ggc3VwcG9ydCB0aGUgU29sYXJpcyBORlN2MyBBQ0wgcHJvdG9jb2wgY2FuIHRoZW5cXG4gIDcwOlxcdFxcdCAgYWNjZXNzIGFuZCBtb2RpZnkgQUNMcyBvbiB5b3VyIE5GUyBzZXJ2ZXIuXFxuICA3MTpcXHRcXG4gIDcyOlxcdFxcdCAgVG8gc3RvcmUgQUNMcyBvbiB5b3VyIE5GUyBzZXJ2ZXIsIHlvdSBhbHNvIG5lZWQgdG8gZW5hYmxlIEFDTC1cXG4gIDczOlxcdFxcdCAgcmVsYXRlZCBDT05GSUcgb3B0aW9ucyBmb3IgeW91ciBsb2NhbCBmaWxlIHN5c3RlbXMgb2YgY2hvaWNlLlxcbiAgNzQ6XFx0XFxuICA3NTpcXHRcXHQgIElmIHVuc3VyZSwgc2F5IE4uXFxuICA3NjpcXHRcXG4gIDc3OlxcdGNvbmZpZyBORlNEX1Y0XFxuICA3ODpcXHRcXHRib29sIFxcXCJORlMgc2VydmVyIHN1cHBvcnQgZm9yIE5GUyB2ZXJzaW9uIDRcXFwiXFxuICA3OTpcXHRcXHRkZXBlbmRzIG9uIE5GU0QgXFx1MDAyNlxcdTAwMjYgUFJPQ19GU1xcbiAgODA6XFx0XFx0c2VsZWN0IEZTX1BPU0lYX0FDTFxcbiAgODE6XFx0XFx0c2VsZWN0IFJQQ1NFQ19HU1NfS1JCNVxcbiAgODI6XFx0XFx0c2VsZWN0IEdSQUNFX1BFUklPRFxcbiAgODM6XFx0XFx0c2VsZWN0IE5GU19WNF8yX1NTQ19IRUxQRVIgaWYgTkZTX1Y0XzJcXG4gIDg0OlxcdFxcdGhlbHBcXG4gIDg1OlxcdFxcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGluIHlvdXIgc3lzdGVtJ3MgTkZTIHNlcnZlciBmb3JcXG4gIDg2OlxcdFxcdCAgdmVyc2lvbiA0IG9mIHRoZSBORlMgcHJvdG9jb2wgKFJGQyAzNTMwKS5cXG4gIDg3OlxcdFxcbiAgODg6XFx0XFx0ICBUbyBleHBvcnQgZmlsZXMgdXNpbmcgTkZTdjQsIHlvdSBuZWVkIHRvIGluc3RhbGwgYWRkaXRpb25hbCB1c2VyXFxuICA4OTpcXHRcXHQgIHNwYWNlIHByb2dyYW1zIHdoaWNoIGNhbiBiZSBmb3VuZCBpbiB0aGUgTGludXggbmZzLXV0aWxzIHBhY2thZ2UsXFxuICA5MDpcXHRcXHQgIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9saW51eC1uZnMub3JnLy5cXG4gIDkxOlxcdFxcbiAgOTI6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcbiAgOTM6XFx0XFxuICA5NDpcXHRjb25maWcgTkZTRF9QTkZTXFxuICA5NTpcXHRcXHRib29sXFxuICA5NjpcXHRcXG4gIDk3OlxcdGNvbmZpZyBORlNEX0JMT0NLTEFZT1VUXFxuICA5ODpcXHRcXHRib29sIFxcXCJORlN2NC4xIHNlcnZlciBzdXBwb3J0IGZvciBwTkZTIGJsb2NrIGxheW91dHNcXFwiXFxuICA5OTpcXHRcXHRkZXBlbmRzIG9uIE5GU0RfVjQgXFx1MDAyNlxcdTAwMjYgQkxPQ0tcXG4gMTAwOlxcdFxcdHNlbGVjdCBORlNEX1BORlNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MTguMzcwMjkwMTU5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjk0MDI2NzQ3MDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE5GUyBOZXRsaW5rIExpc3RlbmVyIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gcmV2ZWFsZWQgYSBmZXcga2V5IG9wdGlvbnMgdGhhdCBzZWVtIHJlbGV2YW50IHRvIHRoaXMgYXJlYTogYE5GU0RgLCBgTkZTRF9WNGAsIGBTVU5SUENgLCBgSU5FVGAsIGBGSUxFX0xPQ0tJTkdgLCBgRlNOT1RJRllgLCBgTVVMVElVU0VSYCwgYW5kIGBQUk9DX0ZTYC4gVGhlIGZhY3QgdGhhdCBgU1VOUlBDYCBpcyBzZWxlY3RlZCBieSBgTkZTRGAgaXMgc29tZXRoaW5nIEknbGwga2VlcCBpbiBtaW5kLiBBbHNvLCB0aGUgaW5jbHVzaW9uIG9mIGBORVRfTlNgIGFuZCBgSVBWNmAgZnJvbSB0aGUgc2VsZnRlc3QgY29uZmlnIGlzIGludGVyZXN0aW5nLCBsZXQncyBrZWVwIHRoZW0gaW4gbWluZCwgZXZlbiBpZiB0aGV5IGFyZW4ndCBleHBsaWNpdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cbkkgaW5pdGlhbGx5IGZsYWdnZWQgYSBmZXcgZnVuY3Rpb24gc3ltYm9scyBhcyBwb3RlbnRpYWwgYXJlYXMgb2YgZm9jdXM6IGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCwgYHN2Y19yZWdpc3RlcmAsIGFuZCBgcnBjYl9jcmVhdGVfbG9jYWxgLiBIb3dldmVyLCBhZnRlciBhIGNsb3NlciBsb29rLCBpdCBzZWVtcyBub25lIG9mIHRoZXNlIGFyZSBsaWtlbHkgdG8gYmUgb24gYSBwZXJmb3JtYW5jZS1jcml0aWNhbCBwYXRoLiBgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdGAgaXMgYSBuZXRsaW5rIGNvbW1hbmQgaGFuZGxlciwgd2hpY2ggaXNuJ3QgdHlwaWNhbGx5IGhvdC4gU2ltaWxhcmx5LCBib3RoIGBzdmNfcmVnaXN0ZXJgIGFuZCBgcnBjYl9jcmVhdGVfbG9jYWxgIGFyZSBjYWxsZWQgZHVyaW5nIHRoZSBzZXR1cCBvZiBSUEMgc2VydmljZXMsIG5vdCBkdXJpbmcgYWN0dWFsIGRhdGEgdHJhbnNmZXIuXG5cbkkgdGhlbiBkaWQgYSBxdWljayBzYW5pdHkgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55IG90aGVyIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSByZWxldmFudCwgSSBjaGVja2VkIHRoZSBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5lYXJieS4gVGhlIGZ1bmN0aW9ucyBgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnNgLCBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCwgYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCwgYW5kIGBycGNiX2NyZWF0ZV9sb2NhbF9uZXRgIGFwcGVhciB0byBiZSBzdGF0aWMsIHdoaWNoIGxpa2VseSBtZWFucyB0aGV5IGFyZSBlaXRoZXIgaW5saW5lZCBvciBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLlxuXG5TbywgY2lyY2xpbmcgYmFjayB0byB0aGUgb3JpZ2luYWwgZm9jdXMgc3ltYm9sczpcblxuKiAgIGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YFxuKiAgIGBzdmNfcmVnaXN0ZXJgXG4qICAgYHJwY2JfY3JlYXRlX2xvY2FsYFxuXG5Ob3csIGxldCdzIGNvbmZpcm0gdGhhdCBgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdGAgaXMgdGhlICpvbmx5KiBuZXRsaW5rIGhhbmRsZXIgYmVpbmcgbW9kaWZpZWQuIFllcywgaXQgbG9va3MgbGlrZSBpdCBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGxpc3RlbmVyIHNldCBjb21tYW5kLlxuXG5OZXh0LCBJIG5lZWQgdG8gbWFrZSBhIG5vdGUgb2YgdGhlIHJlbGV2YW50IGBFbmFibGVDb25maWdzYDpcblxuKiAgIGBORlNEYFxuKiAgIGBORlNEX1Y0YFxuKiAgIGBTVU5SUENgIChBZ2Fpbiwgbm90aW5nIGl0cyBkZXBlbmRlbmN5KVxuKiAgIGBORVRfTlNgXG4qICAgYElQVjZgXG5cbkknbGwgdmVyaWZ5IHRoYXQgYFNVTlJQQ2AgaXMgaW5kZWVkIGEgY29uZmlnIG9wdGlvbiwgd2hpY2ggaXQgaXMuIEZpbmFsbHksIEknbGwgY29uZmlybSB0aGF0IGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBpcyBhY3R1YWxseSBjb21waWxlZCBpbi4gWWVzLCBpdCdzIGxvY2F0ZWQgd2l0aGluIGBmcy9uZnNkL25mc2N0bC5jYCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgYG5mc2RgIG1vZHVsZS4gTm93IEkgd2lsbCBjb21waWxlIHRoZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzU1OCwiT3V0cHV0VG9rZW5zIjoxNTUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0ODMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTo0MDoyNy43NzI5Njc3ODlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzE2ODM3ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5GU0RcIixcbiAgICBcIk5GU0RfVjRcIixcbiAgICBcIlNVTlJQQ1wiLFxuICAgIFwiTkVUX05TXCIsXG4gICAgXCJJUFY2XCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdFwiLFxuICAgIFwic3ZjX3JlZ2lzdGVyXCIsXG4gICAgXCJycGNiX2NyZWF0ZV9sb2NhbFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBORlNEIG5ldGxpbmsgbGlzdGVuZXIgY29uZmlndXJhdGlvbiBsb2dpYywgYWRkcyB2YWxpZGF0aW9uIGZvciB0cmFuc3BvcnQgY2xhc3NlcywgbGltaXRzIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLCBpbnRyb2R1Y2VzIGEgdGltZW91dCBmb3IgbG9jYWwgcnBjYmluZCBjYWxscywgYW5kIGZpeGVzIGVycm9yIGhhbmRsaW5nIGluIHN2Y19yZWdpc3Rlci4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjaGFuZ2VzIGluIHRoZSBORlMgc2VydmVyIGFuZCBSUEMgc3Vic3lzdGVtcyB0aGF0IGhhdmUgZnVuY3Rpb25hbCBpbXBhY3QgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTkZTRFwiLFxuICAgIFwiTkZTRF9WNFwiLFxuICAgIFwiU1VOUlBDXCIsXG4gICAgXCJORVRfTlNcIixcbiAgICBcIklQVjZcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0XCIsXG4gICAgXCJzdmNfcmVnaXN0ZXJcIixcbiAgICBcInJwY2JfY3JlYXRlX2xvY2FsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIE5GU0QgbmV0bGluayBsaXN0ZW5lciBjb25maWd1cmF0aW9uIGxvZ2ljLCBhZGRzIHZhbGlkYXRpb24gZm9yIHRyYW5zcG9ydCBjbGFzc2VzLCBsaW1pdHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMsIGludHJvZHVjZXMgYSB0aW1lb3V0IGZvciBsb2NhbCBycGNiaW5kIGNhbGxzLCBhbmQgZml4ZXMgZXJyb3IgaGFuZGxpbmcgaW4gc3ZjX3JlZ2lzdGVyLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgaW4gdGhlIE5GUyBzZXJ2ZXIgYW5kIFJQQyBzdWJzeXN0ZW1zIHRoYXQgaGF2ZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MjcuOTA0NjYwOTc5WiIsIlNlcSI6MTcsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTY1NDI3MzgwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjQwOjI3LjkwNzUyNDI5OVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyNTY1MTQwNTc2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgdmFsaWRhdGlvbiBjaGVja3MgZm9yIE5GU0QgbmV0bGluayBsaXN0ZW5lciBhdHRyaWJ1dGVzIChlLmcuLCBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyB0byBgTkZTRF9OTF9MSVNURU5FUl9NQVhgIGFuZCB2YWxpZGF0aW5nIHRoZSB0cmFuc3BvcnQgbmFtZSB2aWEgYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGApLiBJdCBhbHNvIGZpeGVzIGVycm9yIGNvZGUgcHJvcGFnYXRpb24gaW4gYHN2Y19yZWdpc3RlcmAgYW5kIHNldHMgYSBsb2NhbCB0aW1lb3V0IGZvciBycGNiaW5kIGNsaWVudHMuIFxcblxcblRoZSBuZXRsaW5rIGF0dHJpYnV0ZSBgTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVgIGlzIGRlZmluZWQgYXMgYE5MQV9OVUxfU1RSSU5HYCBpbiBgbmZzZF9zb2NrX25sX3BvbGljeWAsIGVuc3VyaW5nIHRoYXQgYG5sYV9kYXRhKClgIHJldHVybnMgYSBwcm9wZXJseSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJlZm9yZSBpdCBpcyBwYXNzZWQgdG8gYHN0cmNtcCgpYCBpbiBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYC4gXFxuXFxuTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgb3Igc2VudCB0byB1c2VyIHNwYWNlLCBhbmQgdGhlcmUgYXJlIG5vIGNoYW5nZXMgdGhhdCBjb3VsZCBleHBvc2UgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIG1lbW9yeS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9naWMgYnVncykgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBkZWZhdWx0IHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2MDFlYjcwNDhmZDFjYzM3MTk1MWY1OGFmMDBjYzI1MGY5ZTJiYWMzXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTAgMjE6Mzk6MzcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuY1xuaW5kZXggN2UxZDVhNWQ2NTExZS4uZjczYTJlYTQyNTU3MSAxMDA2NDRcbi0tLSBhL2ZzL25mc2QvbmZzY3RsLmNcbisrKyBiL2ZzL25mc2QvbmZzY3RsLmNcbkBAIC0xOTczLDIxICsxOTczLDM5IEBAIGludCBuZnNkX25sX3ZlcnNpb25fZ2V0X2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuKy8qXG4rICogVHJhbnNwb3J0IGNsYXNzZXMgTkZTRCBrbm93cyBob3cgdG8gaW5zdGFudGlhdGUuIFZldHRpbmcgdGhlIG5hbWUgaGVyZVxuKyAqIGtlZXBzIGEgYm9ndXMgc3RyaW5nIGZyb20gcmVhY2hpbmcgc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2EoKSwgd2hlcmUgYW5cbisgKiB1bmtub3duIG5hbWUgdHJpZ2dlcnMgYSByZXF1ZXN0X21vZHVsZShcInN2YyVzXCIsIG5hbWUpIHVwY2FsbCB1bmRlclxuKyAqIG5mc2RfbXV0ZXguXG4rICovXG4rc3RhdGljIGJvb2wgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkKGNvbnN0IGNoYXIgKm5hbWUpXG4re1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdXBwb3J0ZWRbXSA9IHsgXCJ0Y3BcIiwgXCJ1ZHBcIiwgXCJyZG1hXCIgfTtcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShzdXBwb3J0ZWQpOyBpKyspXG4rXHRcdGlmICghc3RyY21wKG5hbWUsIHN1cHBvcnRlZFtpXSkpXG4rXHRcdFx0cmV0dXJuIHRydWU7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuKy8qIFVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGEgc2luZ2xlIHJlcXVlc3QgbWF5IGNhcnJ5LiAqL1xuKyNkZWZpbmUgTkZTRF9OTF9MSVNURU5FUl9NQVhcdDEwMjRcbitcbiAvKipcbiAgKiBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyAtIHNhbml0eS1jaGVjayB0aGUgbGlzdGVuZXIgbGlzdCBmcm9tIHVzZXJsYW5kXG4gICogQGluZm86IG5ldGxpbmsgbWV0YWRhdGEgYW5kIGNvbW1hbmQgYXJndW1lbnRzXG4gICpcbi0gKiBXYWxrIGV2ZXJ5IE5GU0RfQV9TRVJWRVJfU09DS19BRERSIGF0dHJpYnV0ZSBhbmQgY29uZmlybSB0aGF0IGVhY2ggZW50cnlcbi0gKiBpcyB3ZWxsLWZvcm1lZDogaXQgcGFyc2VzIGFnYWluc3QgdGhlIHBvbGljeSwgY2FycmllcyBib3RoIGFuIGFkZHJlc3MgYW5kXG4tICogYSB0cmFuc3BvcnQgbmFtZSwgYW5kIHRoZSBhZGRyZXNzIGlzIGxvbmcgZW5vdWdoIGZvciBpdHMgZmFtaWx5LiBEb2luZ1xuLSAqIHRoaXMgdXAgZnJvbnQgbGV0cyB0aGUgY2FsbGVycyBiZWxvdyBhc3N1bWUgZXZlcnkgZW50cnkgaXMgdmFsaWQgYW5kXG4tICogZ3VhcmFudGVlcyB3ZSBtYWtlIG5vIGNoYW5nZXMgd2hlbiB0aGUgcmVxdWVzdCBpcyBtYWxmb3JtZWQuXG4rICogV2FsayBldmVyeSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBhdHRyaWJ1dGUgYW5kIGNvbmZpcm0gdGhhdCB0aGUgbGlzdCBpc1xuKyAqIG5vdCBvdmVyc2l6ZWQgYW5kIHRoYXQgZWFjaCBlbnRyeSBpcyB3ZWxsLWZvcm1lZC5cbiAgKlxuICAqIFJldHVybjogMCBpZiBldmVyeSBlbnRyeSBpcyB2YWxpZCwgb3IgYSBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UuXG4gICovXG4gc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIHtcbiBcdGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHI7XG4rXHR1bnNpZ25lZCBpbnQgY291bnQgPSAwO1xuIFx0aW50IHJlbTtcbiBcbiBcdG5sbXNnX2Zvcl9lYWNoX2F0dHJfdHlwZShhdHRyLCBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiwgaW5mby1cdTAwM2VubGhkcixcbkBAIC0xOTk2LDYgKzIwMTQsMTEgQEAgc3RhdGljIGludCBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRzdHJ1Y3Qgc29ja2FkZHIgKnNhO1xuIFx0XHRpbnQgZXJyO1xuIFxuK1x0XHRpZiAoKytjb3VudCBcdTAwM2UgTkZTRF9OTF9MSVNURU5FUl9NQVgpIHtcbitcdFx0XHROTF9TRVRfRVJSX01TRyhpbmZvLVx1MDAzZWV4dGFjaywgXCJ0b28gbWFueSBsaXN0ZW5lcnNcIik7XG4rXHRcdFx0cmV0dXJuIC1FMkJJRztcbitcdFx0fVxuK1xuIFx0XHRlcnIgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXG4gXHRcdFx0XHQgICAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby1cdTAwM2VleHRhY2spO1xuIFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuQEAgLTIwMDQsNiArMjAyNyw5IEBAIHN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdFx0aWYgKCF0YltORlNEX0FfU09DS19BRERSXSB8fCAhdGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFxuK1x0XHRpZiAoIW5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChubGFfZGF0YSh0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pKSlcbitcdFx0XHRyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDtcbitcbiBcdFx0c2EgPSBubGFfZGF0YSh0YltORlNEX0FfU09DS19BRERSXSk7XG4gXHRcdGlmIChubGFfbGVuKHRiW05GU0RfQV9TT0NLX0FERFJdKSBcdTAwM2Mgc2l6ZW9mKHNhLVx1MDAzZXNhX2ZhbWlseSkpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG5AQCAtMjE1Niw4ICsyMTgyLDEyIEBAIGludCBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRcdHJldCA9IHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKHNlcnYsIHhjbF9uYW1lLCBuZXQsIHNhLCAwLFxuIFx0XHRcdFx0XHQgICAgICBjdXJyZW50X2NyZWQoKSk7XG4gXHRcdC8qIGFsd2F5cyBzYXZlIHRoZSBsYXRlc3QgZXJyb3IgKi9cbi1cdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuK1x0XHRcdE5MX1NFVF9FUlJfTVNHX0ZNVChpbmZvLVx1MDAzZWV4dGFjayxcbitcdFx0XHRcdFx0ICAgXCJjYW5ub3QgY3JlYXRlICVzIGxpc3RlbmVyOiAlZFwiLFxuK1x0XHRcdFx0XHQgICB4Y2xfbmFtZSwgcmV0KTtcbiBcdFx0XHRlcnIgPSByZXQ7XG4rXHRcdH1cbiBcdH1cbiBcbiBcdGlmICghc2Vydi1cdTAwM2Vzdl9ucnRocmVhZHMgXHUwMDI2XHUwMDI2IGxpc3RfZW1wdHkoXHUwMDI2bm4tXHUwMDNlbmZzZF9zZXJ2LVx1MDAzZXN2X3Blcm1zb2NrcykpXG5kaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmNcbmluZGV4IDZhYTM3MjE4OGM4NmEuLjBhYTM3NmI4MmE1MjYgMTAwNjQ0XG4tLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jXG4rKysgYi9uZXQvc3VucnBjL3JwY2JfY2xudC5jXG5AQCAtMjIxLDYgKzIyMSwxNiBAQCBzdGF0aWMgdm9pZCBycGNiX3NldF9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBycGNfY2xudCAqY2xudCxcbiAjIGRlZmluZSBTVU5fTEVOKHB0cikgKG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpXHRcdFxcXG4gXHRcdCAgICAgICsgMSArIHN0cmxlbigocHRyKS1cdTAwM2VzdW5fcGF0aCArIDEpKVxuIFxuKy8qXG4rICogVGhlIGtlcm5lbCdzIHJwY2JpbmQgY2xpZW50IHRhbGtzIG9ubHkgdG8gdGhlIGxvY2FsIHJwY2JpbmQsIG92ZXIgbG9vcGJhY2tcbisgKiBvciBhIGxvY2FsIEFGX0xPQ0FMIHNvY2tldCwgd2hlcmUgYSBoZWFsdGh5IHJwY2JpbmQgYW5zd2VycyBpbiBtaWNyb3NlY29uZHMuXG4rICovXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfdGltZW91dCBycGNiX2xvY2FsX3RpbWVvdXQgPSB7XG4rXHQudG9faW5pdHZhbFx0PSAxICogSFosXG4rXHQudG9fbWF4dmFsXHQ9IDEgKiBIWixcbitcdC50b19yZXRyaWVzXHQ9IDAsXG4rfTtcbitcbiAvKlxuICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZVxuICAqIGlzIHJldHVybmVkLlxuQEAgLTIzOCw2ICsyNDgsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2FmX2xvY2FsKHN0cnVjdCBuZXQgKm5ldCxcbiBcdFx0LnZlcnNpb25cdD0gUlBDQlZFUlNfMixcbiBcdFx0LmF1dGhmbGF2b3JcdD0gUlBDX0FVVEhfTlVMTCxcbiBcdFx0LmNyZWRcdFx0PSBjdXJyZW50X2NyZWQoKSxcbitcdFx0LnRpbWVvdXRcdD0gXHUwMDI2cnBjYl9sb2NhbF90aW1lb3V0LFxuIFx0XHQvKlxuIFx0XHQgKiBXZSB0dXJuIG9mZiB0aGUgaWRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGtlcm5lbFxuIFx0XHQgKiBmcm9tIGF1dG9tYXRpY2FsbHkgZGlzY29ubmVjdGluZyB0aGUgc29ja2V0LlxuQEAgLTMxMiw2ICszMjMsNyBAQCBzdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsX25ldChzdHJ1Y3QgbmV0ICpuZXQpXG4gXHRcdC52ZXJzaW9uXHQ9IFJQQ0JWRVJTXzIsXG4gXHRcdC5hdXRoZmxhdm9yXHQ9IFJQQ19BVVRIX1VOSVgsXG4gXHRcdC5jcmVkXHRcdD0gY3VycmVudF9jcmVkKCksXG4rXHRcdC50aW1lb3V0XHQ9IFx1MDAyNnJwY2JfbG9jYWxfdGltZW91dCxcbiBcdFx0LmZsYWdzXHRcdD0gUlBDX0NMTlRfQ1JFQVRFX05PUElORyxcbiBcdH07XG4gXHRzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsICpjbG50NDtcbmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuY1xuaW5kZXggMDVjM2U2ZTJmNjU5NC4uZTljZmNlYjFhMzM0MiAxMDA2NDRcbi0tLSBhL25ldC9zdW5ycGMvc3ZjLmNcbisrKyBiL25ldC9zdW5ycGMvc3ZjLmNcbkBAIC0xMjA4LDEzICsxMjA4LDE2IEBAIGludCBzdmNfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBzdHJ1Y3QgbmV0ICpuZXQsXG4gXHRcdHN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZ3AgPSBcdTAwMjZzZXJ2LVx1MDAzZXN2X3Byb2dyYW1zW3BdO1xuIFxuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwcm9ncC1cdTAwM2VwZ19udmVyczsgaSsrKSB7XG4rXHRcdFx0aW50IHJldDtcbiBcbi1cdFx0XHRlcnJvciA9IHByb2dwLVx1MDAzZXBnX3JwY2JpbmRfc2V0KG5ldCwgcHJvZ3AsIGksXG4rXHRcdFx0cmV0ID0gcHJvZ3AtXHUwMDNlcGdfcnBjYmluZF9zZXQobmV0LCBwcm9ncCwgaSxcbiBcdFx0XHRcdFx0ZmFtaWx5LCBwcm90bywgcG9ydCk7XG4tXHRcdFx0aWYgKGVycm9yIFx1MDAzYyAwKSB7XG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuIFx0XHRcdFx0cHJpbnRrKEtFUk5fV0FSTklORyBcInN2YzogZmFpbGVkIHRvIHJlZ2lzdGVyIFwiXG4gXHRcdFx0XHRcdFwiJXN2JXUgUlBDIHNlcnZpY2UgKGVycm5vICVkKS5cXG5cIixcbi1cdFx0XHRcdFx0cHJvZ3AtXHUwMDNlcGdfbmFtZSwgaSwgLWVycm9yKTtcbitcdFx0XHRcdFx0cHJvZ3AtXHUwMDNlcGdfbmFtZSwgaSwgLXJldCk7XG4rXHRcdFx0XHRpZiAoIWVycm9yKVxuK1x0XHRcdFx0XHRlcnJvciA9IHJldDtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbiBcdFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbmluZGV4IDg0MzQzZmQxZTM1NGIuLjQ2MDUwOGRlOTM3NGYgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbkBAIC04OSw2ICs4OSw3IEBAIFRBUkdFVFMgKz0gbmV0L3BhY2tldGRyaWxsXG4gVEFSR0VUUyArPSBuZXQvcHBwXG4gVEFSR0VUUyArPSBuZXQvcmRzXG4gVEFSR0VUUyArPSBuZXQvdGNwX2FvXG4rVEFSR0VUUyArPSBuZnNkXG4gVEFSR0VUUyArPSBub2xpYmNcbiBUQVJHRVRTICs9IHBjaV9lbmRwb2ludFxuIFRBUkdFVFMgKz0gcGNpZV9id2N0cmxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xOWU2ZGVjMDRkOGU5XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkLy5naXRpZ25vcmVcbkBAIC0wLDAgKzEgQEBcbituZnNkX25ldGxpbmtfbGlzdGVuZXJcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9NYWtlZmlsZVxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1YWM2NTU0OWQyNTlcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvTWFrZWZpbGVcbkBAIC0wLDAgKzEsNiBAQFxuKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitDRkxBR1MgKz0gJChLSERSX0lOQ0xVREVTKSAtV2FsbFxuK1xuK1RFU1RfR0VOX1BST0dTIDo9IG5mc2RfbmV0bGlua19saXN0ZW5lclxuK1xuK2luY2x1ZGUgLi4vbGliLm1rXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2OTQ1ZmY5NTUxYzRcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvY29uZmlnXG5AQCAtMCwwICsxLDQgQEBcbitDT05GSUdfTkVUX05TPXlcbitDT05GSUdfSVBWNj15XG4rQ09ORklHX05GU0Q9eVxuK0NPTkZJR19ORlNEX1Y0PXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL25mc2RfbmV0bGlua19saXN0ZW5lci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9uZnNkX25ldGxpbmtfbGlzdGVuZXIuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlMzMwNzY4MGQ3ZDRcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2QvbmZzZF9uZXRsaW5rX2xpc3RlbmVyLmNcbkBAIC0wLDAgKzEsOTIwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFJlZ3Jlc3Npb24gdGVzdHMgZm9yIHRoZSBORlNEIGdlbmVyaWMtbmV0bGluayBsaXN0ZW5lciBpbnRlcmZhY2VcbisgKiAoTkZTRF9DTURfTElTVEVORVJfU0VUIC8gTkZTRF9DTURfTElTVEVORVJfR0VUKS5cbisgKlxuKyAqIFRocmVlIGdyb3VwczpcbisgKiAgIHZhbGlkYXRpb24gIC0gbWFsZm9ybWVkL2FidXNpdmUgTElTVEVORVJfU0VUIHJlcXVlc3RzIGFyZSByZWplY3RlZCBieVxuKyAqICAgICAgICAgICAgICAgICBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVycygpLCBiZWZvcmUgbmZzZF9tdXRleCBpcyB0YWtlbi5cbisgKiAgIGZ1bmN0aW9uYWwgIC0gY3JlYXRlL2FkZC9yZW1vdmUgbGlzdGVuZXJzIGFuZCB2ZXJpZnkgTElTVEVORVJfR0VUXG4rICogICAgICAgICAgICAgICAgIHJlZmxlY3RzIHRoZSBzZXQgKHJvdW5kLXRyaXAgb2YgdHJhbnNwb3J0ICsgYWRkcjpwb3J0KS5cbisgKiAgIHNlbWFudGljcyAgIC0gb25jZSB0aHJlYWRzIGFyZSBydW5uaW5nIChUSFJFQURTX1NFVCkgYSBsaXN0ZW5lciBjaGFuZ2VcbisgKiAgICAgICAgICAgICAgICAgaXMgcmVmdXNlZCB3aXRoIC1FQlVTWS5cbisgKlxuKyAqIEVhY2ggdGVzdCBydW5zIGluIGl0cyBvd24gcHJpdmF0ZSBuZXQgKyBtb3VudCBuYW1lc3BhY2UgKHVuc2hhcmUgaW5cbisgKiBGSVhUVVJFX1NFVFVQKS4gL3J1biBpcyBtYXNrZWQgdGhlcmU6IGEgcGF0aG5hbWUgQUZfTE9DQUwgY29ubmVjdCBpcyBub3RcbisgKiBzY29wZWQgYnkgdGhlIG5ldHdvcmsgbmFtZXNwYWNlLCBzaW5jZSB1bml4X2ZpbmRfYnNkKCkgcmVzb2x2ZXMgYnkgaW5vZGVcbisgKiBhbmQgdGFrZXMgbm8gc3RydWN0IG5ldCwgc28gdGhlIGtlcm5lbCdzIHJwY2JpbmQgY2xpZW50IHdvdWxkIG90aGVyd2lzZSBiZVxuKyAqIGFibGUgdG8gcmVhY2ggdGhlIHJwY2JpbmQgcnVubmluZyBvbiB0aGUgaG9zdC4gQW55dGhpbmcgdGhhdCBjcmVhdGVzIGFcbisgKiBzZXJ2IGlzIHNlcnZlZCBieSB0aGUgcGVyLW5ldG5zIHJwY2JpbmQgc3R1YiBiZWxvdyBpbnN0ZWFkLlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjcG9sbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc2NoZWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkZGVmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpbnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW91bnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9wcmN0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3NvY2tldC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY25ldC9pZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbmV0aW5ldC9pbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbmV0bGluay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZ2VuZXRsaW5rLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcIi4uL2tzZWxmdGVzdF9oYXJuZXNzLmhcIlxuK1xuKy8qIE5GU0QgZ2VuZXJpYy1uZXRsaW5rIGNvbnN0YW50cyAoZnJvbSBsaW51eC9uZnNkX25ldGxpbmsuaCkuICovXG4rI2RlZmluZSBORlNEX0ZBTUlMWV9OQU1FXHRcdFwibmZzZFwiXG4rI2RlZmluZSBORlNEX0NNRF9USFJFQURTX1NFVFx0XHQyXG4rI2RlZmluZSBORlNEX0NNRF9MSVNURU5FUl9TRVRcdFx0NlxuKyNkZWZpbmUgTkZTRF9DTURfTElTVEVORVJfR0VUXHRcdDdcbisjZGVmaW5lIE5GU0RfQV9TRVJWRVJfVEhSRUFEU1x0XHQxXG4rI2RlZmluZSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUlx0XHQxXHQvKiBwZXItbGlzdGVuZXIgbmVzdCAqL1xuKyNkZWZpbmUgTkZTRF9BX1NPQ0tfQUREUlx0XHQxXHQvKiBpbnNpZGUgdGhlIG5lc3QgKi9cbisjZGVmaW5lIE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXHQyXHQvKiBpbnNpZGUgdGhlIG5lc3QgKi9cbitcbisjZGVmaW5lIE5MQV9BTElHTjQobGVuKVx0XHRcdCgoKGxlbikgKyAzKSBcdTAwMjYgfjMpXG4rI2RlZmluZSBURVNUX1BPUlRcdFx0XHQyMDA0OVxuKyNkZWZpbmUgTUFYX0xJU1RFTkVSU1x0XHRcdDhcbisjZGVmaW5lIFJFQ1ZfVElNRU9fU0VDXHRcdFx0MzBcbitcbitzdGF0aWMgaW50IG5mc2RfZmFtaWx5O1x0XHRcdC8qIHNldCBwZXItdGVzdCBpbiBGSVhUVVJFX1NFVFVQICovXG4rXG4rc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKm1zZylcbit7XG4rXHRwZXJyb3IobXNnKTtcbitcdGV4aXQoMSk7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gbWluaW1hbCBnZW5lcmljLW5ldGxpbmsgcGx1bWJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuK1xuK3N0YXRpYyBpbnQgZ2VubF9vcGVuKHZvaWQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX25sIHNhID0geyAubmxfZmFtaWx5ID0gQUZfTkVUTElOSyB9O1xuK1x0c3RydWN0IHRpbWV2YWwgdHYgPSB7IC50dl9zZWMgPSBSRUNWX1RJTUVPX1NFQyB9O1xuK1x0aW50IGZkID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX0dFTkVSSUMpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRkaWUoXCJzb2NrZXQoTkVUTElOS19HRU5FUklDKVwiKTtcbitcdGlmIChiaW5kKGZkLCAodm9pZCAqKVx1MDAyNnNhLCBzaXplb2Yoc2EpKSBcdTAwM2MgMClcbitcdFx0ZGllKFwiYmluZChuZXRsaW5rKVwiKTtcbitcdHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCBcdTAwMjZ0diwgc2l6ZW9mKHR2KSk7XG4rXHRyZXR1cm4gZmQ7XG4rfVxuK1xuKy8qIEFwcGVuZCBhbiBhdHRyaWJ1dGUgYXQgQG9mZjsgcmV0dXJuIHRoZSBuZXcgKGFsaWduZWQpIG9mZnNldC4gKi9cbitzdGF0aWMgaW50IHB1dF9hdHRyKGNoYXIgKmJ1ZiwgaW50IG9mZiwgdWludDE2X3QgdHlwZSxcbitcdFx0ICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pXG4re1xuK1x0c3RydWN0IG5sYXR0ciAqbmEgPSAodm9pZCAqKShidWYgKyBvZmYpO1xuK1xuK1x0bmEtXHUwMDNlbmxhX3R5cGUgPSB0eXBlO1xuK1x0bmEtXHUwMDNlbmxhX2xlbiA9IE5MQV9IRFJMRU4gKyBsZW47XG4rXHRpZiAobGVuKVxuK1x0XHRtZW1jcHkoYnVmICsgb2ZmICsgTkxBX0hEUkxFTiwgZGF0YSwgbGVuKTtcbitcdHJldHVybiBvZmYgKyBOTEFfQUxJR040KE5MQV9IRFJMRU4gKyBsZW4pO1xuK31cbitcbisvKiBCdWlsZCBhIGdlbmwgbWVzc2FnZSBoZWFkZXIgaW50byBAYnVmOyByZXR1cm4gdGhlIG9mZnNldCBwYXN0IGl0LiAqL1xuK3N0YXRpYyBpbnQgZ2VubF9oZHIoY2hhciAqYnVmLCB1aW50MTZfdCB0eXBlLCB1aW50MTZfdCBmbGFncywgdWludDhfdCBjbWQpXG4re1xuK1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbitcdHN0cnVjdCBnZW5sbXNnaGRyICpnbmwgPSAodm9pZCAqKShidWYgKyBOTE1TR19IRFJMRU4pO1xuK1xuK1x0bWVtc2V0KGJ1ZiwgMCwgTkxNU0dfSERSTEVOICsgR0VOTF9IRFJMRU4pO1xuK1x0bmxoLVx1MDAzZW5sbXNnX3R5cGUgPSB0eXBlO1xuK1x0bmxoLVx1MDAzZW5sbXNnX2ZsYWdzID0gZmxhZ3M7XG4rXHRubGgtXHUwMDNlbmxtc2dfc2VxID0gMTtcbitcdGdubC1cdTAwM2VjbWQgPSBjbWQ7XG4rXHRnbmwtXHUwMDNldmVyc2lvbiA9IDE7XG4rXHRyZXR1cm4gTkxNU0dfSERSTEVOICsgR0VOTF9IRFJMRU47XG4rfVxuK1xuKy8qIFNlbmQgYW4gbmZzZCBjb21tYW5kIHdpdGggYW4gQUNLOyByZXR1cm4gdGhlIEFDSyBlcnJubyAoXHUwMDNjPSAwKS4gKi9cbitzdGF0aWMgaW50IGdlbmxfcmVxdWVzdCh1aW50OF90IGNtZCwgY29uc3QgY2hhciAqYXR0cnMsIGludCBhdHRyc19sZW4pXG4re1xuK1x0Y2hhciBidWZbMSBcdTAwM2NcdTAwM2MgMjBdLCByYnVmWzQwOTZdO1xuK1x0c3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKWJ1ZjtcbitcdGludCBmZCA9IGdlbmxfb3BlbigpO1xuK1x0aW50IG9mZiwgbiwgcmV0O1xuK1xuK1x0b2ZmID0gZ2VubF9oZHIoYnVmLCBuZnNkX2ZhbWlseSwgTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0FDSywgY21kKTtcbitcdGlmIChhdHRyc19sZW4pIHtcbitcdFx0bWVtY3B5KGJ1ZiArIG9mZiwgYXR0cnMsIGF0dHJzX2xlbik7XG4rXHRcdG9mZiArPSBhdHRyc19sZW47XG4rXHR9XG4rXHRubGgtXHUwMDNlbmxtc2dfbGVuID0gb2ZmO1xuK1xuK1x0aWYgKHNlbmQoZmQsIGJ1Ziwgb2ZmLCAwKSBcdTAwM2MgMClcbitcdFx0ZGllKFwic2VuZChnZW5sKVwiKTtcbitcbitcdG4gPSByZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApO1xuK1x0aWYgKG4gXHUwMDNjIDApXG4rXHRcdHJldCA9IChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spID8gLUVUSU1FRE9VVCA6IC1lcnJubztcbitcdGVsc2UgaWYgKCgoc3RydWN0IG5sbXNnaGRyICopcmJ1ZiktXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbitcdFx0cmV0ID0gKChzdHJ1Y3Qgbmxtc2dlcnIgKilOTE1TR19EQVRBKHJidWYpKS1cdTAwM2VlcnJvcjtcbitcdGVsc2VcbitcdFx0cmV0ID0gMDtcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qIFNlbmQgYSBjb21tYW5kIGFuZCByZXR1cm4gdGhlIGZ1bGwgcmVwbHkgbWVzc2FnZTsgLWVycm5vIG9uIGZhaWx1cmUuICovXG4rc3RhdGljIGludCBnZW5sX3JlcXVlc3RfcmVwbHkodWludDhfdCBjbWQsIGNoYXIgKnJidWYsIHNpemVfdCBybGVuKVxuK3tcbitcdGNoYXIgYnVmWzI1Nl07XG4rXHRzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopYnVmO1xuK1x0aW50IGZkID0gZ2VubF9vcGVuKCk7XG4rXHRpbnQgb2ZmLCBuLCByZXQ7XG4rXG4rXHRvZmYgPSBnZW5sX2hkcihidWYsIG5mc2RfZmFtaWx5LCBOTE1fRl9SRVFVRVNULCBjbWQpO1xuK1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbitcbitcdGlmIChzZW5kKGZkLCBidWYsIG9mZiwgMCkgXHUwMDNjIDApXG4rXHRcdGRpZShcInNlbmQoZ2VubCByZXBseSlcIik7XG4rXG4rXHRuID0gcmVjdihmZCwgcmJ1ZiwgcmxlbiwgMCk7XG4rXHRpZiAobiBcdTAwM2MgMClcbitcdFx0cmV0ID0gKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgPyAtRVRJTUVET1VUIDogLWVycm5vO1xuK1x0ZWxzZSBpZiAoKChzdHJ1Y3Qgbmxtc2doZHIgKilyYnVmKS1cdTAwM2VubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKVxuK1x0XHRyZXQgPSAoKHN0cnVjdCBubG1zZ2VyciAqKU5MTVNHX0RBVEEocmJ1ZikpLVx1MDAzZWVycm9yO1xuK1x0ZWxzZVxuK1x0XHRyZXQgPSBuO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyogUmVzb2x2ZSB0aGUgXCJuZnNkXCIgZ2VubCBmYW1pbHkgaWQ7IC0xIGlmIG5vdCByZWdpc3RlcmVkLiAqL1xuK3N0YXRpYyBpbnQgZ2VubF9yZXNvbHZlX25mc2Qodm9pZClcbit7XG4rXHRjaGFyIGJ1ZlsxMDI0XSwgcmJ1Zls0MDk2XTtcbitcdHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHZvaWQgKilidWY7XG4rXHRzdHJ1Y3Qgbmxtc2doZHIgKnJoID0gKHZvaWQgKilyYnVmO1xuK1x0c3RydWN0IG5sYXR0ciAqbmE7XG4rXHRpbnQgZmQsIG9mZiwgbGVmdCwgaWQgPSAtMTtcbitcbitcdGZkID0gZ2VubF9vcGVuKCk7XG4rXHRvZmYgPSBnZW5sX2hkcihidWYsIEdFTkxfSURfQ1RSTCwgTkxNX0ZfUkVRVUVTVCwgQ1RSTF9DTURfR0VURkFNSUxZKTtcbitcdG9mZiA9IHB1dF9hdHRyKGJ1Ziwgb2ZmLCBDVFJMX0FUVFJfRkFNSUxZX05BTUUsXG4rXHRcdCAgICAgICBORlNEX0ZBTUlMWV9OQU1FLCBzaXplb2YoTkZTRF9GQU1JTFlfTkFNRSkpO1xuK1x0bmxoLVx1MDAzZW5sbXNnX2xlbiA9IG9mZjtcbitcbitcdGlmIChzZW5kKGZkLCBidWYsIG9mZiwgMCkgXHUwMDNjIDApXG4rXHRcdGRpZShcInNlbmQoR0VURkFNSUxZKVwiKTtcbitcdGlmIChyZWN2KGZkLCByYnVmLCBzaXplb2YocmJ1ZiksIDApIFx1MDAzYyAwKVxuK1x0XHRkaWUoXCJyZWN2KEdFVEZBTUlMWSlcIik7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRpZiAocmgtXHUwMDNlbmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUilcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0bmEgPSAodm9pZCAqKSgoY2hhciAqKU5MTVNHX0RBVEEocmgpICsgR0VOTF9IRFJMRU4pO1xuK1x0bGVmdCA9IHJoLVx1MDAzZW5sbXNnX2xlbiAtIE5MTVNHX0hEUkxFTiAtIEdFTkxfSERSTEVOO1xuK1x0d2hpbGUgKGxlZnQgXHUwMDNlPSAoaW50KU5MQV9IRFJMRU4pIHtcbitcdFx0aWYgKG5hLVx1MDAzZW5sYV90eXBlID09IENUUkxfQVRUUl9GQU1JTFlfSUQpIHtcbitcdFx0XHRpZCA9ICoodWludDE2X3QgKikoKGNoYXIgKiluYSArIE5MQV9IRFJMRU4pO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHRcdGxlZnQgLT0gTkxBX0FMSUdONChuYS1cdTAwM2VubGFfbGVuKTtcbitcdFx0bmEgPSAodm9pZCAqKSgoY2hhciAqKW5hICsgTkxBX0FMSUdONChuYS1cdTAwM2VubGFfbGVuKSk7XG4rXHR9XG4rXHRyZXR1cm4gaWQ7XG4rfVxuK1xuKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gbGlzdGVuZXIgcmVxdWVzdCBidWlsZGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rLyogRmluZS1ncmFpbmVkIGNvbnRyb2wgZm9yIG5lZ2F0aXZlIHRlc3RzOiBhbnkgZmllbGQgY2FuIGJlIG9taXR0ZWQvbWFsZm9ybWVkLiAqL1xuK3N0cnVjdCByYXdfbGlzdGVuZXIge1xuK1x0Y29uc3QgY2hhciAqeHBydDtcdC8qIE5VTEwgLVx1MDAzZSBvbWl0IE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FICovXG4rXHRpbnQgZW1pdF9hZGRyO1x0XHQvKiAwIC1cdTAwM2Ugb21pdCBORlNEX0FfU09DS19BRERSICovXG4rXHRjb25zdCB2b2lkICphZGRyO1xuK1x0aW50IGFkZHJfbGVuO1x0XHQvKiBieXRlcyB0byBlbWl0IGZvciBORlNEX0FfU09DS19BRERSICovXG4rfTtcbitcbitzdGF0aWMgaW50IHB1dF9yYXdfbGlzdGVuZXIoY2hhciAqYnVmLCBpbnQgb2ZmLCBjb25zdCBzdHJ1Y3QgcmF3X2xpc3RlbmVyICpyKVxuK3tcbitcdHN0cnVjdCBubGF0dHIgKm5lc3QgPSAodm9pZCAqKShidWYgKyBvZmYpO1xuK1x0aW50IGlubmVyID0gb2ZmICsgTkxBX0hEUkxFTjtcbitcbitcdGlmIChyLVx1MDAzZWVtaXRfYWRkcilcbitcdFx0aW5uZXIgPSBwdXRfYXR0cihidWYsIGlubmVyLCBORlNEX0FfU09DS19BRERSLCByLVx1MDAzZWFkZHIsIHItXHUwMDNlYWRkcl9sZW4pO1xuK1x0aWYgKHItXHUwMDNleHBydClcbitcdFx0aW5uZXIgPSBwdXRfYXR0cihidWYsIGlubmVyLCBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSxcbitcdFx0XHRcdCByLVx1MDAzZXhwcnQsIHN0cmxlbihyLVx1MDAzZXhwcnQpICsgMSk7XG4rXHRuZXN0LVx1MDAzZW5sYV90eXBlID0gTkZTRF9BX1NFUlZFUl9TT0NLX0FERFIgfCBOTEFfRl9ORVNURUQ7XG4rXHRuZXN0LVx1MDAzZW5sYV9sZW4gPSBpbm5lciAtIG9mZjtcbitcdHJldHVybiBvZmYgKyBOTEFfQUxJR040KG5lc3QtXHUwMDNlbmxhX2xlbik7XG4rfVxuK1xuKy8qIFdlbGwtZm9ybWVkIGxvb3BiYWNrIGxpc3RlbmVyIGZvciBAZmFtaWx5IChBRl9JTkVUIG9yIEFGX0lORVQ2KS4gKi9cbitzdGF0aWMgaW50IHB1dF9saXN0ZW5lcl9hZihjaGFyICpidWYsIGludCBvZmYsIGNvbnN0IGNoYXIgKnhwcnQsIGludCBmYW1pbHksXG4rXHRcdFx0ICAgdWludDE2X3QgcG9ydClcbit7XG4rXHRzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcyA9IHswfTtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSB4cHJ0LCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSBcdTAwMjZzcyB9O1xuK1xuK1x0aWYgKGZhbWlseSA9PSBBRl9JTkVUNikge1xuK1x0XHRzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzNiA9ICh2b2lkICopXHUwMDI2c3M7XG4rXG4rXHRcdHM2LVx1MDAzZXNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7XG4rXHRcdHM2LVx1MDAzZXNpbjZfcG9ydCA9IGh0b25zKHBvcnQpO1xuK1x0XHRzNi1cdTAwM2VzaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrO1xuK1x0XHRyLmFkZHJfbGVuID0gc2l6ZW9mKCpzNik7XG4rXHR9IGVsc2Uge1xuK1x0XHRzdHJ1Y3Qgc29ja2FkZHJfaW4gKnM0ID0gKHZvaWQgKilcdTAwMjZzcztcbitcbitcdFx0czQtXHUwMDNlc2luX2ZhbWlseSA9IEFGX0lORVQ7XG4rXHRcdHM0LVx1MDAzZXNpbl9wb3J0ID0gaHRvbnMocG9ydCk7XG4rXHRcdHM0LVx1MDAzZXNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7XG4rXHRcdHIuYWRkcl9sZW4gPSBzaXplb2YoKnM0KTtcbitcdH1cbitcdHJldHVybiBwdXRfcmF3X2xpc3RlbmVyKGJ1Ziwgb2ZmLCBcdTAwMjZyKTtcbit9XG4rXG4rc3RhdGljIGludCBwdXRfbGlzdGVuZXIoY2hhciAqYnVmLCBpbnQgb2ZmLCBjb25zdCBjaGFyICp4cHJ0LCB1aW50MTZfdCBwb3J0KVxuK3tcbitcdHJldHVybiBwdXRfbGlzdGVuZXJfYWYoYnVmLCBvZmYsIHhwcnQsIEFGX0lORVQsIHBvcnQpO1xuK31cbitcbisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIExJU1RFTkVSX0dFVCBwYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbitcbitzdHJ1Y3QgbGlzdGVuZXJfZW50IHtcbitcdGNoYXIgeHBydFsxNl07XG4rXHRpbnQgZmFtaWx5O1xuK1x0dWludDE2X3QgcG9ydDtcbitcdHN0cnVjdCBpbl9hZGRyIGE0O1xuK1x0c3RydWN0IGluNl9hZGRyIGE2O1xuK307XG4rXG4rc3RhdGljIGludCBwYXJzZV9saXN0ZW5lcl9nZXQoY29uc3QgY2hhciAqcmJ1ZiwgaW50IGxlbixcbitcdFx0XHQgICAgICBzdHJ1Y3QgbGlzdGVuZXJfZW50ICpvdXQsIGludCBtYXgpXG4re1xuK1x0Y29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGggPSAoY29uc3Qgdm9pZCAqKXJidWY7XG4rXHRjb25zdCBzdHJ1Y3QgbmxhdHRyICpuYTtcbitcdGludCBsZWZ0LCBjb3VudCA9IDA7XG4rXG4rXHQodm9pZClsZW47XG4rXHRuYSA9IChjb25zdCB2b2lkICopKHJidWYgKyBOTE1TR19IRFJMRU4gKyBHRU5MX0hEUkxFTik7XG4rXHRsZWZ0ID0gbmxoLVx1MDAzZW5sbXNnX2xlbiAtIE5MTVNHX0hEUkxFTiAtIEdFTkxfSERSTEVOO1xuK1xuK1x0d2hpbGUgKGxlZnQgXHUwMDNlPSAoaW50KU5MQV9IRFJMRU4pIHtcbitcdFx0aW50IGFsZW4gPSBuYS1cdTAwM2VubGFfbGVuO1xuK1xuK1x0XHRpZiAoKG5hLVx1MDAzZW5sYV90eXBlIFx1MDAyNiBOTEFfVFlQRV9NQVNLKSA9PSBORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIGNvdW50IFx1MDAzYyBtYXgpIHtcbitcdFx0XHRjb25zdCBzdHJ1Y3QgbmxhdHRyICppbiA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgKyBOTEFfSERSTEVOKTtcbitcdFx0XHRpbnQgaWxlZnQgPSBhbGVuIC0gTkxBX0hEUkxFTjtcbitcdFx0XHRzdHJ1Y3QgbGlzdGVuZXJfZW50ICplID0gXHUwMDI2b3V0W2NvdW50XTtcbitcbitcdFx0XHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XG4rXHRcdFx0d2hpbGUgKGlsZWZ0IFx1MDAzZT0gKGludClOTEFfSERSTEVOKSB7XG4rXHRcdFx0XHRjb25zdCB2b2lkICpkID0gKGNvbnN0IGNoYXIgKilpbiArIE5MQV9IRFJMRU47XG4rXHRcdFx0XHRpbnQgdCA9IGluLVx1MDAzZW5sYV90eXBlIFx1MDAyNiBOTEFfVFlQRV9NQVNLO1xuK1xuK1x0XHRcdFx0aWYgKHQgPT0gTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUpIHtcbitcdFx0XHRcdFx0c3RybmNweShlLVx1MDAzZXhwcnQsIGQsIHNpemVvZihlLVx1MDAzZXhwcnQpIC0gMSk7XG4rXHRcdFx0XHR9IGVsc2UgaWYgKHQgPT0gTkZTRF9BX1NPQ0tfQUREUikge1xuK1x0XHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc3MgPSBkO1xuK1xuK1x0XHRcdFx0XHRlLVx1MDAzZWZhbWlseSA9IHNzLVx1MDAzZXNzX2ZhbWlseTtcbitcdFx0XHRcdFx0aWYgKHNzLVx1MDAzZXNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7XG4rXHRcdFx0XHRcdFx0Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzID0gZDtcbitcbitcdFx0XHRcdFx0XHRlLVx1MDAzZWE0ID0gcy1cdTAwM2VzaW5fYWRkcjtcbitcdFx0XHRcdFx0XHRlLVx1MDAzZXBvcnQgPSBudG9ocyhzLVx1MDAzZXNpbl9wb3J0KTtcbitcdFx0XHRcdFx0fSBlbHNlIGlmIChzcy1cdTAwM2Vzc19mYW1pbHkgPT0gQUZfSU5FVDYpIHtcbitcdFx0XHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzID0gZDtcbitcbitcdFx0XHRcdFx0XHRlLVx1MDAzZWE2ID0gcy1cdTAwM2VzaW42X2FkZHI7XG4rXHRcdFx0XHRcdFx0ZS1cdTAwM2Vwb3J0ID0gbnRvaHMocy1cdTAwM2VzaW42X3BvcnQpO1xuK1x0XHRcdFx0XHR9XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRpbGVmdCAtPSBOTEFfQUxJR040KGluLVx1MDAzZW5sYV9sZW4pO1xuK1x0XHRcdFx0aW4gPSAoY29uc3Qgdm9pZCAqKSgoY2hhciAqKWluICsgTkxBX0FMSUdONChpbi1cdTAwM2VubGFfbGVuKSk7XG4rXHRcdFx0fVxuK1x0XHRcdGNvdW50Kys7XG4rXHRcdH1cbitcdFx0bGVmdCAtPSBOTEFfQUxJR040KGFsZW4pO1xuK1x0XHRuYSA9IChjb25zdCB2b2lkICopKChjaGFyICopbmEgKyBOTEFfQUxJR040KGFsZW4pKTtcbitcdH1cbitcdHJldHVybiBjb3VudDtcbit9XG4rXG4rLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZW5pZW5jZSB3cmFwcGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rc3RhdGljIGludCBsaXN0ZW5lcl9zZXQoY29uc3QgY2hhciAqYXR0cnMsIGludCBsZW4pXG4re1xuK1x0cmV0dXJuIGdlbmxfcmVxdWVzdChORlNEX0NNRF9MSVNURU5FUl9TRVQsIGF0dHJzLCBsZW4pO1xuK31cbitcbisvKiBGZXRjaCB0aGUgY3VycmVudCBsaXN0ZW5lcnM7IHJldHVybnMgY291bnQgKFx1MDAzZT0wKSBvciAtZXJybm8uICovXG4rc3RhdGljIGludCBsaXN0ZW5lcl9nZXQoc3RydWN0IGxpc3RlbmVyX2VudCAqb3V0LCBpbnQgbWF4KVxuK3tcbitcdGNoYXIgcmJ1Zls4MTkyXTtcbitcdGludCBuID0gZ2VubF9yZXF1ZXN0X3JlcGx5KE5GU0RfQ01EX0xJU1RFTkVSX0dFVCwgcmJ1Ziwgc2l6ZW9mKHJidWYpKTtcbitcbitcdGlmIChuIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gbjtcbitcdHJldHVybiBwYXJzZV9saXN0ZW5lcl9nZXQocmJ1Ziwgbiwgb3V0LCBtYXgpO1xuK31cbitcbitzdGF0aWMgc3RydWN0IGxpc3RlbmVyX2VudCAqZmluZF9saXN0ZW5lcihzdHJ1Y3QgbGlzdGVuZXJfZW50ICplLCBpbnQgbixcbitcdFx0XHRcdFx0ICBjb25zdCBjaGFyICp4cHJ0LCBpbnQgZmFtaWx5LFxuK1x0XHRcdFx0XHQgIHVpbnQxNl90IHBvcnQpXG4re1xuK1x0aW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdGlmIChlW2ldLmZhbWlseSA9PSBmYW1pbHkgXHUwMDI2XHUwMDI2IGVbaV0ucG9ydCA9PSBwb3J0IFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgIXN0cmNtcChlW2ldLnhwcnQsIHhwcnQpKVxuK1x0XHRcdHJldHVybiBcdTAwMjZlW2ldO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qIFN0YXJ0IChAbiBcdTAwM2UgMCkgb3Igc3RvcCAoQG4gPT0gMCkgbmZzZCB0aHJlYWRzIGluIHRoaXMgbmV0bnMuICovXG4rc3RhdGljIGludCB0aHJlYWRzX3NldChpbnQgbilcbit7XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdHVpbnQzMl90IHYgPSBuO1xuK1x0aW50IG9mZiA9IHB1dF9hdHRyKGF0dHJzLCAwLCBORlNEX0FfU0VSVkVSX1RIUkVBRFMsIFx1MDAyNnYsIHNpemVvZih2KSk7XG4rXG4rXHRyZXR1cm4gZ2VubF9yZXF1ZXN0KE5GU0RfQ01EX1RIUkVBRFNfU0VULCBhdHRycywgb2ZmKTtcbit9XG4rXG4rLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBwZXItbmV0bnMgbG9jYWwgcnBjYmluZCBzdHViIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbitcbisvKlxuKyAqIENyZWF0aW5nIGEgbGlzdGVuZXIgcmVnaXN0ZXJzIHdpdGggcnBjYmluZDogc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2EoKVxuKyAqIHBhc3NlcyBmbGFncyBvZiAwLCBzbyBwbWFwX3JlZ2lzdGVyIGlzIHRydWUgaW4gc3ZjX3NldHVwX3NvY2tldCgpLCBhbmRcbisgKiBuZnNkX3ZlcnNpb24zIGlzIHJlZ2lzdGVyYWJsZSBieSBkZWZhdWx0IGFuZCBkb2VzIG5vdCBzZXQgdnNfcnBjYl9vcHRubCxcbisgKiBzbyBhIHJlZ2lzdHJhdGlvbiBmYWlsdXJlIGFib3J0cyBsaXN0ZW5lciBjcmVhdGlvbi4gVGhlIGFic3RyYWN0IEFGX0xPQ0FMXG4rICogbmFtZSB0aGUga2VybmVsIHRyaWVzIGZpcnN0IGlzIHBlci1uZXRucyAodW5peF9maW5kX2Fic3RyYWN0KCkgdGFrZXMgYVxuKyAqIHN0cnVjdCBuZXQpLCBzbyBhbnN3ZXIgaXQgaGVyZSBhbmQgc3RheSBvdXQgb2YgdGhlIGhvc3QncyBycGNiaW5kLlxuKyAqXG4rICogQXJndW1lbnRzIGFyZSBuZXZlciBkZWNvZGVkLiBUaGUgTlVMTCBwcm9jZWR1cmUgZ2V0cyBhbiBlbXB0eSBzdWNjZXNzIGFuZFxuKyAqIFNFVC9VTlNFVCBnZXQgVFJVRSwgZm9yIGJvdGggUlBDQlZFUlNfMiBhbmQgUlBDQlZFUlNfNC4gdjQgaGFzIHRvIGJlXG4rICogYW5zd2VyZWQgYmVjYXVzZSBfX3N2Y19ycGNiX3JlZ2lzdGVyNigpIHR1cm5zIGEgdjQgcmVmdXNhbCBpbnRvXG4rICogLUVBRk5PU1VQUE9SVCwgd2hpY2ggd291bGQgZmFpbCBldmVyeSBJUHY2IGxpc3RlbmVyLlxuKyAqXG4rICogSW4gUlBDQl9TVFVCX1JFRlVTRSBtb2RlIFNFVCBpcyBhbnN3ZXJlZCBGQUxTRSBpbnN0ZWFkLCB3aGljaFxuKyAqIHJwY2JfcmVnaXN0ZXJfY2FsbCgpIHJlcG9ydHMgYXMgLUVBQ0NFUy4gVU5TRVQgaXMgbGVmdCBhbG9uZTogb25seVxuKyAqIHN2Y191bnJlZ2lzdGVyKCkgaXNzdWVzIGl0LCBhbmQgaXQgZGlzY2FyZHMgdGhlIHJlc3VsdC5cbisgKi9cbisjZGVmaW5lIFJQQ0JfUFJPR1JBTVx0XHQxMDAwMDBcbisjZGVmaW5lIFJQQ0JfUFJPQ19OVUxMXHRcdDBcbisjZGVmaW5lIFJQQ0JfUFJPQ19TRVRcdFx0MVxuKyNkZWZpbmUgUlBDQl9QUk9DX1VOU0VUXHRcdDJcbisjZGVmaW5lIFJQQ0JfQUJTVFJBQ1RfTkFNRVx0XCIvcnVuL3JwY2JpbmQuc29ja1wiXG4rI2RlZmluZSBSUENCX1NUVUJfTUFYQ09OTlx0NFxuK1xuK2VudW0geyBSUENCX1NUVUJfQUNDRVBULCBSUENCX1NUVUJfUkVGVVNFIH07XG4rXG4rc3RhdGljIGludCBycGNiX3N0dWJfbGlzdGVuKHZvaWQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3VuIHN1biA9IHsgLnN1bl9mYW1pbHkgPSBBRl9VTklYIH07XG4rXHRzaXplX3QgbmxlbiA9IHN0cmxlbihSUENCX0FCU1RSQUNUX05BTUUpO1xuK1x0c29ja2xlbl90IGFsZW47XG4rXHRpbnQgZmQ7XG4rXG4rXHQvKiBBYnN0cmFjdCBuYW1lcyBhcmUgbGVuZ3RoLWRlbGltaXRlZCwgc28gdGhlIGxlbmd0aCBtdXN0IG1hdGNoLiAqL1xuK1x0bWVtY3B5KHN1bi5zdW5fcGF0aCArIDEsIFJQQ0JfQUJTVFJBQ1RfTkFNRSwgbmxlbik7XG4rXHRhbGVuID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyAxICsgbmxlbjtcbitcbitcdGZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0aWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZzdW4sIGFsZW4pIFx1MDAzYyAwIHx8XG4rXHQgICAgbGlzdGVuKGZkLCBSUENCX1NUVUJfTUFYQ09OTikgXHUwMDNjIDApIHtcbitcdFx0Y2xvc2UoZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRyZXR1cm4gZmQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnBjYl9zdHViX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pXG4re1xuK1x0c2l6ZV90IGRvbmUgPSAwO1xuK1xuK1x0d2hpbGUgKGRvbmUgXHUwMDNjIGxlbikge1xuK1x0XHRzc2l6ZV90IG4gPSByZWFkKGZkLCAoY2hhciAqKWJ1ZiArIGRvbmUsIGxlbiAtIGRvbmUpO1xuK1xuK1x0XHRpZiAobiBcdTAwM2M9IDApXG4rXHRcdFx0cmV0dXJuIC0xO1xuK1x0XHRkb25lICs9IG47XG4rXHR9XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyogSGFuZGxlIG9uZSByZWNvcmQtbWFya2VkIFJQQyBjYWxsLiBSZXR1cm5zIC0xIHdoZW4gdGhlIHBlZXIgaXMgZG9uZS4gKi9cbitzdGF0aWMgaW50IHJwY2Jfc3R1Yl9jYWxsKGludCBmZCwgaW50IG1vZGUpXG4re1xuK1x0dWludDMyX3QgbWFyaywgY2FsbFs2XSwgcmVwWzddO1xuK1x0dW5zaWduZWQgaW50IGxlbiwgbnJlcCA9IDY7XG4rXHRzaXplX3QgcmVwbGVuO1xuK1xuK1x0aWYgKHJwY2Jfc3R1Yl9yZWFkKGZkLCBcdTAwMjZtYXJrLCBzaXplb2YobWFyaykpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRsZW4gPSBudG9obChtYXJrKSBcdTAwMjYgMHg3ZmZmZmZmZjtcbitcdGlmIChsZW4gXHUwMDNjIHNpemVvZihjYWxsKSB8fCBsZW4gXHUwMDNlIDQwOTYpXG4rXHRcdHJldHVybiAtMTtcbitcdGlmIChycGNiX3N0dWJfcmVhZChmZCwgY2FsbCwgc2l6ZW9mKGNhbGwpKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0LyogeGlkLCBtc2dfdHlwZSwgcnBjdmVycywgcHJvZywgdmVycywgcHJvYzsgdGhlIHJlc3QgaXMgZGlzY2FyZGVkICovXG4rXHRmb3IgKGxlbiAtPSBzaXplb2YoY2FsbCk7IGxlbjsgKSB7XG4rXHRcdGNoYXIgc2lua1syNTZdO1xuK1x0XHR1bnNpZ25lZCBpbnQgbiA9IGxlbiBcdTAwM2Ugc2l6ZW9mKHNpbmspID8gc2l6ZW9mKHNpbmspIDogbGVuO1xuK1xuK1x0XHRpZiAocnBjYl9zdHViX3JlYWQoZmQsIHNpbmssIG4pKVxuK1x0XHRcdHJldHVybiAtMTtcbitcdFx0bGVuIC09IG47XG4rXHR9XG4rXG4rXHRyZXBbMF0gPSBjYWxsWzBdO1x0XHQvKiB4aWQgKi9cbitcdHJlcFsxXSA9IGh0b25sKDEpO1x0XHQvKiBSRVBMWSAqL1xuK1x0cmVwWzJdID0gaHRvbmwoMCk7XHRcdC8qIE1TR19BQ0NFUFRFRCAqL1xuK1x0cmVwWzNdID0gaHRvbmwoMCk7XHRcdC8qIHZlcmlmaWVyIGZsYXZvciBBVVRIX05VTEwgKi9cbitcdHJlcFs0XSA9IGh0b25sKDApO1x0XHQvKiB2ZXJpZmllciBsZW5ndGggKi9cbitcdHJlcFs1XSA9IGh0b25sKDApO1x0XHQvKiBTVUNDRVNTICovXG4rXG4rXHRpZiAobnRvaGwoY2FsbFszXSkgIT0gUlBDQl9QUk9HUkFNKSB7XG4rXHRcdHJlcFs1XSA9IGh0b25sKDEpO1x0LyogUFJPR19VTkFWQUlMICovXG4rXHR9IGVsc2Uge1xuK1x0XHRzd2l0Y2ggKG50b2hsKGNhbGxbNV0pKSB7XG4rXHRcdGNhc2UgUlBDQl9QUk9DX05VTEw6XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgUlBDQl9QUk9DX1NFVDpcbitcdFx0XHRyZXBbNl0gPSBodG9ubChtb2RlID09IFJQQ0JfU1RVQl9SRUZVU0UgPyAwIDogMSk7XG4rXHRcdFx0bnJlcCA9IDc7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgUlBDQl9QUk9DX1VOU0VUOlxuK1x0XHRcdHJlcFs2XSA9IGh0b25sKDEpO1x0LyogVFJVRSAqL1xuK1x0XHRcdG5yZXAgPSA3O1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdHJlcFs1XSA9IGh0b25sKDMpO1x0LyogUFJPQ19VTkFWQUlMICovXG4rXHRcdH1cbitcdH1cbitcbitcdHJlcGxlbiA9IG5yZXAgKiBzaXplb2YocmVwWzBdKTtcbitcdG1hcmsgPSBodG9ubCgweDgwMDAwMDAwIHwgcmVwbGVuKTtcbitcdGlmICh3cml0ZShmZCwgXHUwMDI2bWFyaywgc2l6ZW9mKG1hcmspKSAhPSAoc3NpemVfdClzaXplb2YobWFyaykgfHxcbitcdCAgICB3cml0ZShmZCwgcmVwLCByZXBsZW4pICE9IChzc2l6ZV90KXJlcGxlbilcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJwY2Jfc3R1Yl9zZXJ2ZShpbnQgbGZkLCBpbnQgbW9kZSlcbit7XG4rXHRzdHJ1Y3QgcG9sbGZkIHBmZFsxICsgUlBDQl9TVFVCX01BWENPTk5dO1xuK1x0bmZkc190IG4gPSAxLCBpO1xuK1xuK1x0cGZkWzBdLmZkID0gbGZkO1xuK1xuK1x0Zm9yICg7Oykge1xuK1x0XHQvKiBzdG9wIHBvbGxpbmcgdGhlIGxpc3RlbmVyIHdoZW4gZnVsbCwgb3IgcG9sbCgpIHNwaW5zICovXG4rXHRcdHBmZFswXS5ldmVudHMgPSBuIFx1MDAzYyAxICsgUlBDQl9TVFVCX01BWENPTk4gPyBQT0xMSU4gOiAwO1xuK1xuK1x0XHRpZiAocG9sbChwZmQsIG4sIC0xKSBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm47XG4rXG4rXHRcdGlmIChwZmRbMF0ucmV2ZW50cyBcdTAwMjYgUE9MTElOKSB7XG4rXHRcdFx0aW50IGMgPSBhY2NlcHQobGZkLCBOVUxMLCBOVUxMKTtcbitcbitcdFx0XHRpZiAoYyBcdTAwM2U9IDApIHtcbitcdFx0XHRcdHBmZFtuXS5mZCA9IGM7XG4rXHRcdFx0XHRwZmRbbl0uZXZlbnRzID0gUE9MTElOO1xuK1x0XHRcdFx0bisrO1xuK1x0XHRcdH1cbitcdFx0fVxuK1xuK1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBuOyBpKyspIHtcbitcdFx0XHRpZiAoIShwZmRbaV0ucmV2ZW50cyBcdTAwMjYgKFBPTExJTiB8IFBPTExIVVAgfCBQT0xMRVJSKSkpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRpZiAocnBjYl9zdHViX2NhbGwocGZkW2ldLmZkLCBtb2RlKSkge1xuK1x0XHRcdFx0Y2xvc2UocGZkW2ldLmZkKTtcbitcdFx0XHRcdHBmZFtpXSA9IHBmZFstLW5dO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0fVxuK31cbitcbisvKiBSZXR1cm5zIHRoZSBzdHViJ3MgcGlkLCBvciAtMS4gVGhlIHNvY2tldCBpcyBsaXN0ZW5pbmcgYmVmb3JlIHdlIGZvcmsuICovXG4rc3RhdGljIHBpZF90IHJwY2Jfc3R1Yl9zdGFydChpbnQgbW9kZSlcbit7XG4rXHRpbnQgbGZkID0gcnBjYl9zdHViX2xpc3RlbigpO1xuK1x0cGlkX3QgcGlkO1xuK1xuK1x0aWYgKGxmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cGlkID0gZm9yaygpO1xuK1x0aWYgKHBpZCBcdTAwM2MgMCkge1xuK1x0XHRjbG9zZShsZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRpZiAocGlkID09IDApIHtcbitcdFx0c2lnbmFsKFNJR1BJUEUsIFNJR19JR04pO1xuK1x0XHRwcmN0bChQUl9TRVRfUERFQVRIU0lHLCBTSUdLSUxMKTtcbitcdFx0aWYgKGdldHBwaWQoKSA9PSAxKVx0XHQvKiByYWNlZCB3aXRoIHBhcmVudCBleGl0ICovXG4rXHRcdFx0X2V4aXQoMCk7XG4rXHRcdHJwY2Jfc3R1Yl9zZXJ2ZShsZmQsIG1vZGUpO1xuK1x0XHRfZXhpdCgwKTtcbitcdH1cbitcbitcdGNsb3NlKGxmZCk7XG4rXHRyZXR1cm4gcGlkO1xuK31cbitcbisvKlxuKyAqIFN3YXAgdGhlIHN0dWIgZm9yIG9uZSBpbiBAbW9kZS4gU2FmZSBiZWZvcmUgdGhlIGZpcnN0IHJlcXVlc3Q6IG5vIHNlcnZcbisgKiBleGlzdHMgeWV0LCBzbyB0aGUga2VybmVsIGhhcyBub3QgY29ubmVjdGVkIGFuZCB0aGUgYWJzdHJhY3QgbmFtZSBpcyBmcmVlXG4rICogYWdhaW4gb25jZSB0aGUgb2xkIHN0dWIgaGFzIGJlZW4gcmVhcGVkLlxuKyAqL1xuK3N0YXRpYyBpbnQgcnBjYl9zdHViX3Jlc3RhcnQocGlkX3QgKnBpZCwgaW50IG1vZGUpXG4re1xuK1x0aWYgKCpwaWQgXHUwMDNlIDApIHtcbitcdFx0a2lsbCgqcGlkLCBTSUdLSUxMKTtcbitcdFx0d2FpdHBpZCgqcGlkLCBOVUxMLCAwKTtcbitcdH1cbitcdCpwaWQgPSBycGNiX3N0dWJfc3RhcnQobW9kZSk7XG4rXHRyZXR1cm4gKnBpZCBcdTAwM2UgMCA/IDAgOiAtMTtcbit9XG4rXG4rLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rRklYVFVSRShuZnNkX2xpc3RlbmVyKSB7XG4rXHRwaWRfdCBycGNiZDtcbit9O1xuK1xuK0ZJWFRVUkVfU0VUVVAobmZzZF9saXN0ZW5lcilcbit7XG4rXHRzdHJ1Y3QgaWZyZXEgaWZyID0gezB9O1xuK1x0c3RydWN0IHN0YXQgc3Q7XG4rXHRpbnQgcztcbitcbitcdGlmIChnZXRldWlkKCkgIT0gMClcbitcdFx0U0tJUChyZXR1cm4sIFwibXVzdCBiZSBydW4gYXMgcm9vdFwiKTtcbitcdGlmICh1bnNoYXJlKENMT05FX05FV05FVCB8IENMT05FX05FV05TKSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwidW5zaGFyZShORVdORVR8TkVXTlMpOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0aWYgKG1vdW50KFwiXCIsIFwiL1wiLCBOVUxMLCBNU19SRUMgfCBNU19QUklWQVRFLCBOVUxMKSBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwibW91bnQoLyBwcml2YXRlKTogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcbitcdC8qXG4rXHQgKiBLZWVwIHRoZSBrZXJuZWwncyBycGNiaW5kIGNsaWVudCBpbnNpZGUgdGhpcyBuYW1lc3BhY2UuIFRoZVxuK1x0ICogYWJzdHJhY3Qgc29ja2V0IGl0IHRyaWVzIGZpcnN0IGlzIHBlci1uZXRucywgYnV0IHRoZVxuK1x0ICogXCIvdmFyL3J1bi9ycGNiaW5kLnNvY2tcIiBmYWxsYmFjayBpcyBub3QsIHNvIGhpZGUgdGhlIHBhdGguXG4rXHQgKi9cbitcdGlmIChtb3VudChcInRtcGZzXCIsIFwiL3J1blwiLCBcInRtcGZzXCIsIDAsIE5VTEwpIFx1MDAzYyAwKVxuK1x0XHRTS0lQKHJldHVybiwgXCJtb3VudCh0bXBmcyBvbiAvcnVuKTogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdGlmIChsc3RhdChcIi92YXIvcnVuXCIsIFx1MDAyNnN0KSA9PSAwIFx1MDAyNlx1MDAyNiBTX0lTRElSKHN0LnN0X21vZGUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIG1vdW50KFwidG1wZnNcIiwgXCIvdmFyL3J1blwiLCBcInRtcGZzXCIsIDAsIE5VTEwpIFx1MDAzYyAwKVxuK1x0XHRTS0lQKHJldHVybiwgXCJtb3VudCh0bXBmcyBvbiAvdmFyL3J1bik6ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXG4rXHQvKiBCcmluZyBsb29wYmFjayB1cCBzbyBsaXN0ZW5lciBiaW5kcyAoMTI3LjAuMC4xIC8gOjoxKSB3b3JrLiAqL1xuK1x0cyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTtcbitcdEFTU0VSVF9HRShzLCAwKTtcbitcdHN0cmNweShpZnIuaWZyX25hbWUsIFwibG9cIik7XG4rXHRBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ0dJRkZMQUdTLCBcdTAwMjZpZnIpKTtcbitcdGlmci5pZnJfZmxhZ3MgfD0gSUZGX1VQIHwgSUZGX1JVTk5JTkc7XG4rXHRBU1NFUlRfRVEoMCwgaW9jdGwocywgU0lPQ1NJRkZMQUdTLCBcdTAwMjZpZnIpKTtcbitcdGNsb3NlKHMpO1xuK1xuK1x0bmZzZF9mYW1pbHkgPSBnZW5sX3Jlc29sdmVfbmZzZCgpO1xuK1x0aWYgKG5mc2RfZmFtaWx5IFx1MDAzYyAwKVxuK1x0XHRTS0lQKHJldHVybiwgXCJuZnNkIGdlbmwgZmFtaWx5IG5vdCBmb3VuZCAobW9kcHJvYmUgbmZzZD8pXCIpO1xuK1xuK1x0c2VsZi1cdTAwM2VycGNiZCA9IHJwY2Jfc3R1Yl9zdGFydChSUENCX1NUVUJfQUNDRVBUKTtcbitcdGlmIChzZWxmLVx1MDAzZXJwY2JkIFx1MDAzYyAwKVxuK1x0XHRTS0lQKHJldHVybiwgXCJjYW5ub3Qgc3RhcnQgdGhlIHJwY2JpbmQgc3R1YjogJXNcIixcbitcdFx0ICAgICBzdHJlcnJvcihlcnJubykpO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKG5mc2RfbGlzdGVuZXIpXG4re1xuK1x0aWYgKHNlbGYtXHUwMDNlcnBjYmQgXHUwMDNlIDApIHtcbitcdFx0a2lsbChzZWxmLVx1MDAzZXJwY2JkLCBTSUdLSUxMKTtcbitcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXJwY2JkLCBOVUxMLCAwKTtcbitcdH1cbit9XG4rXG4rLyogPT09PT09PT09PT09PT09PT09PT09IHZhbGlkYXRpb24gLyBuZWdhdGl2ZSA9PT09PT09PT09PT09PT09PT09PT0gKi9cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2VtcHR5X2xpc3Rfb2spXG4re1xuK1x0RVhQRUNUX0VRKDAsIGxpc3RlbmVyX3NldChOVUxMLCAwKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfdG9vX21hbnkpXG4re1xuK1x0c3RhdGljIGNoYXIgYXR0cnNbMSBcdTAwM2NcdTAwM2MgMjBdO1xuK1x0aW50IGksIG9mZiA9IDA7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyAxMDI1OyBpKyspXHRcdC8qIFx1MDAzZSBORlNEX05MX0xJU1RFTkVSX01BWCAoMTAyNCkgKi9cbitcdFx0b2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCBvZmYsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXHRFWFBFQ1RfRVEoLUUyQklHLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX21pc3NpbmdfYWRkcilcbit7XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcInRjcFwiLCAuZW1pdF9hZGRyID0gMCB9O1xuK1x0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFx1MDAyNnIpO1xuK1xuK1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfbWlzc2luZ190cmFuc3BvcnQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX2luIHM0ID0geyAuc2luX2ZhbWlseSA9IEFGX0lORVQsIC5zaW5fcG9ydCA9IGh0b25zKFRFU1RfUE9SVCkgfTtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBOVUxMLCAuZW1pdF9hZGRyID0gMSxcbitcdFx0XHRcdCAgLmFkZHIgPSBcdTAwMjZzNCwgLmFkZHJfbGVuID0gc2l6ZW9mKHM0KSB9O1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X3Jhd19saXN0ZW5lcihhdHRycywgMCwgXHUwMDI2cik7XG4rXG4rXHRFWFBFQ1RfRVEoLUVJTlZBTCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rLypcbisgKiBBIG5hbWUgbWF0Y2hpbmcgbm8gdHJhbnNwb3J0IGNsYXNzIG11c3QgYmUgcmVmdXNlZCBiZWZvcmUgbmZzZF9tdXRleCBpc1xuKyAqIHRha2VuLCBzbyBpdCBuZXZlciByZWFjaGVzIHN2Y194cHJ0X2NyZWF0ZV9mcm9tX3NhKCkgYW5kIGl0c1xuKyAqIHJlcXVlc3RfbW9kdWxlKFwic3ZjJXNcIiwgbmFtZSkgdXBjYWxsLlxuKyAqL1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYmFkX3RyYW5zcG9ydClcbit7XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwiYm9ndXNfeHBydFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0RVhQRUNUX0VRKC1FUFJPVE9OT1NVUFBPUlQsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfYWRkcl90b29fc2hvcnQpXG4re1xuK1x0dW5zaWduZWQgY2hhciB0aW55ID0gMDtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcInRjcFwiLCAuZW1pdF9hZGRyID0gMSxcbitcdFx0XHRcdCAgLmFkZHIgPSBcdTAwMjZ0aW55LCAuYWRkcl9sZW4gPSAxIH07XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2luZXRfc2hvcnQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX2luIHM0ID0geyAuc2luX2ZhbWlseSA9IEFGX0lORVQsIC5zaW5fcG9ydCA9IGh0b25zKFRFU1RfUE9SVCkgfTtcbitcdHN0cnVjdCByYXdfbGlzdGVuZXIgciA9IHsgLnhwcnQgPSBcInRjcFwiLCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSBcdTAwMjZzNCxcbitcdFx0XHRcdCAgLmFkZHJfbGVuID0gc2l6ZW9mKHNhX2ZhbWlseV90KSArIDIgfTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIDAsIFx1MDAyNnIpO1xuK1xuK1x0RVhQRUNUX0VRKC1FSU5WQUwsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCB2YWxfaW5ldDZfc2hvcnQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX2luNiBzNiA9IHsgLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDYsIC5zaW42X3BvcnQgPSBodG9ucyhURVNUX1BPUlQpIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2czYsXG4rXHRcdFx0XHQgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUlOVkFMLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX2JhZF9mYW1pbHkpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7IC5zc19mYW1pbHkgPSBBRl9VTklYIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIHIgPSB7IC54cHJ0ID0gXCJ0Y3BcIiwgLmVtaXRfYWRkciA9IDEsIC5hZGRyID0gXHUwMDI2c3MsXG4rXHRcdFx0XHQgIC5hZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIH07XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfcmF3X2xpc3RlbmVyKGF0dHJzLCAwLCBcdTAwMjZyKTtcbitcbitcdEVYUEVDVF9FUSgtRUFGTk9TVVBQT1JULCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3NlY29uZF9lbnRyeV9iYWQpXG4re1xuK1x0c3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3MgPSB7IC5zc19mYW1pbHkgPSBBRl9VTklYIH07XG4rXHRzdHJ1Y3QgcmF3X2xpc3RlbmVyIGJhZCA9IHsgLnhwcnQgPSBcInRjcFwiLCAuZW1pdF9hZGRyID0gMSwgLmFkZHIgPSBcdTAwMjZzcyxcbitcdFx0XHRcdCAgICAuYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSB9O1xuK1x0Y2hhciBhdHRyc1sxMjhdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdG9mZiA9IHB1dF9yYXdfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXHUwMDI2YmFkKTtcbitcdC8qIFRoZSB3aG9sZSByZXF1ZXN0IGlzIHJlamVjdGVkIGR1cmluZyB2YWxpZGF0aW9uOyBub3RoaW5nIGFwcGxpZWQuICovXG4rXHRFWFBFQ1RfRVEoLUVBRk5PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcbit9XG4rXG4rLypcbisgKiBBIHJlamVjdGVkIHJlcXVlc3QgbXVzdCBsZWF2ZSB0aGUgbGlzdGVuZXJzIHRoYXQgYXJlIGFscmVhZHkgdXAgYWxvbmUuXG4rICogVGhlIGVycm5vIGFsb25lIGRvZXMgbm90IHNob3cgdGhhdDogc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2EoKSByZXR1cm5zXG4rICogLUVQUk9UT05PU1VQUE9SVCBmb3IgYW4gdW5rbm93biBuYW1lIHRvby4gV2hhdCBkaWZmZXJzIGlzIGhvdyBmYXIgdGhlXG4rICogcmVxdWVzdCBnZXRzIC0tIHdpdGhvdXQgdGhlIGNoZWNrIGluIG5mc2RfbmxfdmFsaWRhdGVfbGlzdGVuZXJzKCksXG4rICogbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdCgpIGhhcyBhbHJlYWR5IG1vdmVkIHRoZSB1bm1hdGNoZWQgdGNwIGxpc3RlbmVyXG4rICogb2ZmIHN2X3Blcm1zb2NrcyBhbmQgcnVuIHN2Y194cHJ0X2Rlc3Ryb3lfYWxsKCkgb24gaXQgYnkgdGhlIHRpbWUgdGhlXG4rICogbmFtZSBmYWlscy5cbisgKi9cbitURVNUX0YobmZzZF9saXN0ZW5lciwgdmFsX3JlamVjdF9rZWVwc19saXN0ZW5lcnMpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGdvb2RbNjRdLCBiYWRbNjRdO1xuK1x0aW50IG9nID0gcHV0X2xpc3RlbmVyKGdvb2QsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXHRpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYmFkLCAwLCBcImJvZ3VzX3hwcnRcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoZ29vZCwgb2cpKTtcbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXG4rXHRFWFBFQ1RfRVEoLUVQUk9UT05PU1VQUE9SVCwgbGlzdGVuZXJfc2V0KGJhZCwgb2IpKTtcbitcbitcdEFTU0VSVF9FUSgxLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDEsIFwidGNwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gZnVuY3Rpb25hbCAvIHJvdW5kLXRyaXAgPT09PT09PT09PT09PT09PT09PT09ICovXG4rXG4rLyogTElTVEVORVJfR0VUIHdpdGggbm8gc2VydiBpbiB0aGlzIG5ldG5zIHJldHVybnMgYW4gZW1wdHkgbGlzdC4gKi9cbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19nZXRfZW1wdHkpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19jcmVhdGVfdGNwKVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rXHRBU1NFUlRfRVEoMSwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK1x0RVhQRUNUX05FKE5VTEwsIGZpbmRfbGlzdGVuZXIoZ290LCAxLCBcInRjcFwiLCBBRl9JTkVULCBURVNUX1BPUlQpKTtcbitcdEVYUEVDVF9FUShodG9ubChJTkFERFJfTE9PUEJBQ0spLCBnb3RbMF0uYTQuc19hZGRyKTtcbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIGZ1bmNfY3JlYXRlX3VkcClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbNjRdO1xuK1x0aW50IG9mZiA9IHB1dF9saXN0ZW5lcihhdHRycywgMCwgXCJ1ZHBcIiwgVEVTVF9QT1JUKTtcbitcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ1ZHBcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2NyZWF0ZV9tdWx0aSlcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgYXR0cnNbMTI4XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIG9mZiwgXCJ1ZHBcIiwgVEVTVF9QT1JUKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0QVNTRVJUX0VRKDIsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwidWRwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19pZGVtcG90ZW50KVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KGF0dHJzLCBvZmYpKTtcdFx0LyogcmUtc2V0IHNhbWUgbGlzdCAqL1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2FkZClcbit7XG4rXHRzdHJ1Y3QgbGlzdGVuZXJfZW50IGdvdFtNQVhfTElTVEVORVJTXTtcbitcdGNoYXIgb25lWzY0XSwgdHdvWzEyOF07XG4rXHRpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1x0aW50IG8yID0gcHV0X2xpc3RlbmVyKHR3bywgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcbitcdG8yID0gcHV0X2xpc3RlbmVyKHR3bywgbzIsIFwidWRwXCIsIFRFU1RfUE9SVCk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuZXJfc2V0KG9uZSwgbzEpKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQodHdvLCBvMikpO1x0XHQvKiBhZGQgdWRwLCBrZWVwIHRjcCAqL1xuK1x0QVNTRVJUX0VRKDIsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMiwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rXHRFWFBFQ1RfTkUoTlVMTCwgZmluZF9saXN0ZW5lcihnb3QsIDIsIFwidWRwXCIsIEFGX0lORVQsIFRFU1RfUE9SVCkpO1xuK31cbitcbitURVNUX0YobmZzZF9saXN0ZW5lciwgZnVuY19yZW1vdmVfc3Vic2V0KVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBib3RoWzEyOF0sIG9uZVs2NF07XG4rXHRpbnQgb2IgPSBwdXRfbGlzdGVuZXIoYm90aCwgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcdGludCBvbyA9IHB1dF9saXN0ZW5lcihvbmUsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvYiA9IHB1dF9saXN0ZW5lcihib3RoLCBvYiwgXCJ1ZHBcIiwgVEVTVF9QT1JUKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYm90aCwgb2IpKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQob25lLCBvbykpO1x0XHQvKiBkcm9wIHVkcCAqL1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ0Y3BcIiwgQUZfSU5FVCwgVEVTVF9QT1JUKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2VtcHR5X2Rlc3Ryb3lzKVxuK3tcbitcdHN0cnVjdCBsaXN0ZW5lcl9lbnQgZ290W01BWF9MSVNURU5FUlNdO1xuK1x0Y2hhciBhdHRyc1s2NF07XG4rXHRpbnQgb2ZmID0gcHV0X2xpc3RlbmVyKGF0dHJzLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcdFx0LyogZW1wdHkgLVx1MDAzZSBkZXN0cm95IHNlcnYgKi9cbitcdEVYUEVDVF9FUSgwLCBsaXN0ZW5lcl9nZXQoZ290LCBNQVhfTElTVEVORVJTKSk7XG4rfVxuK1xuK1RFU1RfRihuZnNkX2xpc3RlbmVyLCBmdW5jX2lwdjYpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYsIHM7XG4rXG4rXHRzID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7XG4rXHRpZiAocyBcdTAwM2MgMClcbitcdFx0U0tJUChyZXR1cm4sIFwiSVB2NiB1bmF2YWlsYWJsZTogJXNcIiwgc3RyZXJyb3IoZXJybm8pKTtcbitcdGNsb3NlKHMpO1xuK1xuK1x0b2ZmID0gcHV0X2xpc3RlbmVyX2FmKGF0dHJzLCAwLCBcInRjcFwiLCBBRl9JTkVUNiwgVEVTVF9QT1JUKTtcbitcdEFTU0VSVF9FUSgwLCBsaXN0ZW5lcl9zZXQoYXR0cnMsIG9mZikpO1xuK1x0QVNTRVJUX0VRKDEsIGxpc3RlbmVyX2dldChnb3QsIE1BWF9MSVNURU5FUlMpKTtcbitcdEVYUEVDVF9ORShOVUxMLCBmaW5kX2xpc3RlbmVyKGdvdCwgMSwgXCJ0Y3BcIiwgQUZfSU5FVDYsIFRFU1RfUE9SVCkpO1xuK1x0RVhQRUNUX0VRKDAsIG1lbWNtcChcdTAwMjZnb3RbMF0uYTYsIFx1MDAyNmluNmFkZHJfbG9vcGJhY2ssIHNpemVvZihpbjZhZGRyX2xvb3BiYWNrKSkpO1xuK31cbitcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gcnBjYmluZCByZWdpc3RyYXRpb24gPT09PT09PT09PT09PT09PT09PT09ICovXG4rXG4rLypcbisgKiBBIHJwY2JpbmQgdGhhdCByZWZ1c2VzIHRoZSByZWdpc3RyYXRpb24gbXVzdCBmYWlsIGxpc3RlbmVyIGNyZWF0aW9uLFxuKyAqIHdoYXRldmVyIENPTkZJR19ORlNfTE9DQUxJTyBpcyBzZXQgdG8uXG4rICpcbisgKiBUaGUgZXJyb3IgaGFzIHRvIHN1cnZpdmUgc3ZjX3JlZ2lzdGVyKCkncyB3YWxrIG92ZXIgc3ZfcHJvZ3JhbXMgdG8gZ2V0XG4rICogaGVyZS4gV2l0aCBDT05GSUdfTkZTX0xPQ0FMSU89eSB0aGUgdHJhaWxpbmcgbmZzbG9jYWxpbyBwcm9ncmFtIGhhcyBvbmx5XG4rICogYSBOVUxMIGFuZCBhIHZzX2hpZGRlbiB2ZXJzaW9uLCBhbmQgc3ZjX2dlbmVyaWNfcnBjYmluZF9zZXQoKSByZXBvcnRzIDBcbisgKiBmb3IgYm90aCwgc28gYW4gc3ZjX3JlZ2lzdGVyKCkgdGhhdCBrZWVwcyB0aGUgbGFzdCByZXN1bHQgcmF0aGVyIHRoYW4gdGhlXG4rICogZmlyc3QgaGFuZHMgYmFjayBzdWNjZXNzIGFuZCB0aGUgbGlzdGVuZXIgY29tZXMgdXAgcmVnYXJkbGVzcy5cbisgKi9cbitURVNUX0YobmZzZF9saXN0ZW5lciwgc2VtX3JlZ2lzdGVyX3JlZnVzZWQpXG4re1xuK1x0c3RydWN0IGxpc3RlbmVyX2VudCBnb3RbTUFYX0xJU1RFTkVSU107XG4rXHRjaGFyIGF0dHJzWzY0XTtcbitcdGludCBvZmYgPSBwdXRfbGlzdGVuZXIoYXR0cnMsIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRBU1NFUlRfRVEoMCwgcnBjYl9zdHViX3Jlc3RhcnQoXHUwMDI2c2VsZi1cdTAwM2VycGNiZCwgUlBDQl9TVFVCX1JFRlVTRSkpO1xuK1xuK1x0RVhQRUNUX0VRKC1FQUNDRVMsIGxpc3RlbmVyX3NldChhdHRycywgb2ZmKSk7XG4rXHRFWFBFQ1RfRVEoMCwgbGlzdGVuZXJfZ2V0KGdvdCwgTUFYX0xJU1RFTkVSUykpO1xuK31cbitcbisvKiA9PT09PT09PT09PT09PT09PT09PT0gdGhyZWFkcyAvIC1FQlVTWSBzZW1hbnRpY3MgPT09PT09PT09PT09PT09PT09PT09ICovXG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX2NoYW5nZSlcbit7XG4rXHRjaGFyIG9uZVs2NF0sIHR3b1sxMjhdO1xuK1x0aW50IG8xID0gcHV0X2xpc3RlbmVyKG9uZSwgMCwgXCJ0Y3BcIiwgVEVTVF9QT1JUKTtcbitcdGludCBvMiA9IHB1dF9saXN0ZW5lcih0d28sIDAsIFwidGNwXCIsIFRFU1RfUE9SVCk7XG4rXG4rXHRvMiA9IHB1dF9saXN0ZW5lcih0d28sIG8yLCBcInVkcFwiLCBURVNUX1BPUlQpO1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7XG4rXHRBU1NFUlRfRVEoMCwgdGhyZWFkc19zZXQoMSkpO1x0XHRcdC8qIHRocmVhZHMgbm93IHJ1bm5pbmcgKi9cbitcdEVYUEVDVF9FUSgtRUJVU1ksIGxpc3RlbmVyX3NldCh0d28sIG8yKSk7XHQvKiBhZGQgcmVmdXNlZCAqL1xuK1x0dGhyZWFkc19zZXQoMCk7XHRcdFx0XHRcdC8qIHN0b3AgYmVmb3JlIG5ldG5zIGV4aXQgKi9cbit9XG4rXG4rVEVTVF9GKG5mc2RfbGlzdGVuZXIsIHNlbV9idXN5X29uX3JlbW92ZSlcbit7XG4rXHRjaGFyIG9uZVs2NF07XG4rXHRpbnQgbzEgPSBwdXRfbGlzdGVuZXIob25lLCAwLCBcInRjcFwiLCBURVNUX1BPUlQpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbmVyX3NldChvbmUsIG8xKSk7XG4rXHRBU1NFUlRfRVEoMCwgdGhyZWFkc19zZXQoMSkpO1xuK1x0RVhQRUNUX0VRKC1FQlVTWSwgbGlzdGVuZXJfc2V0KE5VTEwsIDApKTtcdC8qIHJlbW92ZSByZWZ1c2VkICovXG4rXHR0aHJlYWRzX3NldCgwKTtcbit9XG4rXG4rVEVTVF9IQVJORVNTX01BSU5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZnNkL3NldHRpbmdzIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmZzZC9zZXR0aW5nc1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjYwOTFiNDVkMjI2YmFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25mc2Qvc2V0dGluZ3NcbkBAIC0wLDAgKzEgQEBcbit0aW1lb3V0PTEyMFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6MjcuOTA3NTI2NDc5WiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkxNzU0MTU5OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFRoaXMgTkZTZCBOZXRsaW5rIExpc3RlbmVyIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdGhlIGNvcmUgY2hhbmdlcyBhbmQgcG90ZW50aWFsIGltcGxpY2F0aW9ucywgZXNwZWNpYWxseSByZWdhcmRpbmcgc2VjdXJpdHkgYW5kIHN0YWJpbGl0eSwgZ2l2ZW4gbXkgZXhwZXJ0aXNlIGluIHRoaXMgYXJlYS5cblxuRmlyc3QsIEkgc2VlIG1vZGlmaWNhdGlvbnMgdG8gYGZzL25mc2QvbmZzY3RsLmNgLCBgbmV0L3N1bnJwYy9ycGNiX2NsbnQuY2AsIGFuZCBgbmV0L3N1bnJwYy9zdmMuY2AsIGFsb25nc2lkZSBhIG5ldyBzZWxmLXRlc3QgZm9yIHRoZSBORlNkIG5ldGxpbmsgbGlzdGVuZXIuIEdvb2QgdG8gc2VlIHRoZSBhZGRpdGlvbiBvZiBhIHNlbGZ0ZXN0OyB0aGF0J3MgY3JpdGljYWwgZm9yIHJlZ3Jlc3Npb24gcHJldmVudGlvbi5cblxuSW4gYGZzL25mc2QvbmZzY3RsLmNgLCB0aGUgaW50cm9kdWN0aW9uIG9mIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgIGFuZCB0aGUgbW9kaWZpY2F0aW9uIG9mIGBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVyc2AgaW1tZWRpYXRlbHkgY2F0Y2ggbXkgZXllLiBTcGVjaWZpY2FsbHksIEkgbm90ZSB0aGUgbGltaXRpbmcgb2YgbGlzdGVuZXJzIHRvIGBORlNEX05MX0xJU1RFTkVSX01BWGAgKDEwMjQpLCBhIHNlbnNpYmxlIHByZWNhdXRpb24gYWdhaW5zdCBEb1MuIFRoZSBpbmNsdXNpb24gb2YgdGhlIGNoZWNrIHVzaW5nIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgIHdpdGhpbiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIGlzIGFsc28gd2VsY29tZS4gVGhlIGNoYW5nZSB0byBzZXQgdGhlIGVycm9yIG1lc3NhZ2UgdmlhIGBOTF9TRVRfRVJSX01TR19GTVRgIGluIGBuZnNkX25sX2xpc3RlbmVyX3NldF9kb2l0YCBvbiBgc3ZjX3hwcnRfY3JlYXRlX2Zyb21fc2FgIGZhaWx1cmUgaXMgYSBnb29kIGRlYnVnZ2luZyBpbXByb3ZlbWVudC5cblxuTW92aW5nIHRvIGBuZXQvc3VucnBjL3JwY2JfY2xudC5jYCwgdGhlIGFkZGl0aW9uIGFuZCB1c2Ugb2YgYHJwY2JfbG9jYWxfdGltZW91dGAgaW4gYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAgc3VnZ2VzdHMgYSBwb3RlbnRpYWwgcGVyZm9ybWFuY2Ugb3Igcm9idXN0bmVzcyBpbXByb3ZlbWVudCByZWxhdGVkIHRvIGxvY2FsIFJQQyBjb25uZWN0aW9ucy4gSSdsbCBuZWVkIHRvIGV4YW1pbmUgdGhlIHRpbWVvdXQgdmFsdWVzIGFuZCB0aGVpciBpbXBhY3Qgb24gb3ZlcmFsbCBSUEMgbGF0ZW5jeS5cblxuSW4gYG5ldC9zdW5ycGMvc3ZjLmNgLCB0aGUgY2hhbmdlIHRvIGBzdmNfcmVnaXN0ZXJgIHRvIHJldGFpbiB0aGUgZmlyc3QgZXJyb3IgZnJvbSBgcHJvZ3AtXHUwMDNlcGdfcnBjYmluZF9zZXRgIGlzIGEgc2lnbmlmaWNhbnQgb25lLiBUaGUgcHJldmlvdXMgYmVoYXZpb3Igb2Ygb3ZlcndyaXRpbmcgYW4gaW5pdGlhbCBlcnJvciB3aXRoIHplcm8gaXMsIGZyYW5rbHksIGluY29ycmVjdCBhbmQgY291bGQgbGVhZCB0byBzaWxlbnQgZmFpbHVyZXMuIFRoaXMgaXMgYSBjbGVhciBpbXByb3ZlbWVudCBpbiBlcnJvciByZXBvcnRpbmcsIGFuZCBJJ20gZ2xhZCB0byBzZWUgdGhpcyBjb3JyZWN0aW9uLlxuXG5Ob3csIG15IG1vcmUgaW1tZWRpYXRlIGNvbmNlcm4gaXMgd2l0aCB0aGUgcG90ZW50aWFsIGZvciB2dWxuZXJhYmlsaXRpZXMuIEkgc2VlIGEgcG90ZW50aWFsIGFyZWEgdG8gYXNzZXNzIGluIGBuZnNkX25sX3ZhbGlkYXRlX2xpc3RlbmVyc2AuIFNwZWNpZmljYWxseSB0aGUgZm9sbG93aW5nIGxpbmVzOlxuXG5gYGBjXG5cdFx0aWYgKCF0YltORlNEX0FfU09DS19BRERSXSB8fCAhdGJbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUVdKVxuXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG5cblx0XHRpZiAoIW5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZChubGFfZGF0YSh0YltORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRV0pKSlcblx0XHRcdHJldHVybiAtRVBST1RPTk9TVVBQT1JUO1xuYGBgXG5IZXJlLCBgbmxhX2RhdGFgIHJldHJpZXZlcyB0aGUgcGF5bG9hZCBvZiBhIG5ldGxpbmsgYXR0cmlidXRlLiBUaGlzIGlzIGJlaW5nIHBhc3NlZCB0byBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCwgd2hpY2gsIGZyb20gYSBicmllZiBnbGFuY2UsIHNlZW1zIHRvIHVzZSBgc3RyY21wYC4gTXkgcXVlc3Rpb24gaXMsIGlzIHRoZSBwYXlsb2FkIG9mIHRoaXMgbmV0bGluayBhdHRyaWJ1dGUgZ3VhcmFudGVlZCB0byBiZSBudWxsLXRlcm1pbmF0ZWQ/IElmIG5vdCwgd2UgaGF2ZSBhIGNsZWFyIHBvdGVudGlhbCBmb3IgYSBidWZmZXIgb3ZlcmZsb3cgd2l0aCBgc3RyY21wYC4gSSAqbXVzdCogdmVyaWZ5IHRoZSBkZWZpbml0aW9uIG9mIGBuZnNkX3NvY2tfbmxfcG9saWN5YCBpbiBgZnMvbmZzZC9uZnNjdGwuY2AgdG8gc2VlIGlmIHRoZSBuZXRsaW5rIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGFkZHJlc3NlcyBudWxsIHRlcm1pbmF0aW9uLiBUaGlzIGlzIGEgY3JpdGljYWwgcG9pbnQgdGhhdCBuZWVkcyBhIHRob3JvdWdoIGludmVzdGlnYXRpb24gdG8gZW5zdXJlIHRoaXMgcGF0Y2ggZG9lc24ndCBpbnRyb2R1Y2UgYSBzZWN1cml0eSBob2xlLiBUaGlzIGlzIHRoZSBmaXJzdCB0aGluZyBJJ2xsIGNoZWNrLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjAyNSwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU3OSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDIxOjQwOjM3LjA4Mjk0Njc2NVoiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzY1NDI2OTY5OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZnNkX3NvY2tfbmxfcG9saWN5XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL25mc2QvbmV0bGluay5jPTM1PWNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiArIDFdID0ge1xcbi0tXFxuZnMvbmZzZC9uZXRsaW5rLmMtMzgtXFxuZnMvbmZzZC9uZXRsaW5rLmM6Mzk6Y29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZzZF9zb2NrX25sX3BvbGljeVtORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRSArIDFdID0ge1xcbmZzL25mc2QvbmV0bGluay5jLTQwLVxcdFtORlNEX0FfU09DS19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCB9LFxcbi0tXFxuZnMvbmZzZC9uZXRsaW5rLmM9ODI9c3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfbGlzdGVuZXJfc2V0X25sX3BvbGljeVtORlNEX0FfU0VSVkVSX1NPQ0tfQUREUiArIDFdID0ge1xcbmZzL25mc2QvbmV0bGluay5jOjgzOlxcdFtORlNEX0FfU0VSVkVSX1NPQ0tfQUREUl0gPSBOTEFfUE9MSUNZX05FU1RFRChuZnNkX3NvY2tfbmxfcG9saWN5KSxcXG5mcy9uZnNkL25ldGxpbmsuYy04NC19O1xcbi0tXFxuZnMvbmZzZC9uZXRsaW5rLmg9MTk9ZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiArIDFdO1xcbmZzL25mc2QvbmV0bGluay5oOjIwOmV4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnNkX3NvY2tfbmxfcG9saWN5W05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FICsgMV07XFxuZnMvbmZzZC9uZXRsaW5rLmgtMjEtZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc3ZjX2V4cG9ydF9ubF9wb2xpY3lbTkZTRF9BX1NWQ19FWFBPUlRfRlNJRCArIDFdO1xcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYz0yMDA1PXN0YXRpYyBpbnQgbmZzZF9ubF92YWxpZGF0ZV9saXN0ZW5lcnMoc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4tLVxcbmZzL25mc2QvbmZzY3RsLmMtMjAyMi1cXHRcXHRlcnIgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXFxuZnMvbmZzZC9uZnNjdGwuYzoyMDIzOlxcdFxcdFxcdFxcdCAgICAgICBuZnNkX3NvY2tfbmxfcG9saWN5LCBpbmZvLVxcdTAwM2VleHRhY2spO1xcbmZzL25mc2QvbmZzY3RsLmMtMjAyNC1cXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG4tLVxcbmZzL25mc2QvbmZzY3RsLmM9MjA2Mz1pbnQgbmZzZF9ubF9saXN0ZW5lcl9zZXRfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYy0yMTEwLVxcdFxcdGlmIChubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXFxuZnMvbmZzZC9uZnNjdGwuYzoyMTExOlxcdFxcdFxcdFxcdCAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby1cXHUwMDNlZXh0YWNrKSBcXHUwMDNjIDApXFxuZnMvbmZzZC9uZnNjdGwuYy0yMTEyLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi0tXFxuZnMvbmZzZC9uZnNjdGwuYy0yMTY2LVxcdFxcdGlmIChubGFfcGFyc2VfbmVzdGVkKHRiLCBORlNEX0FfU09DS19NQVgsIGF0dHIsXFxuZnMvbmZzZC9uZnNjdGwuYzoyMTY3OlxcdFxcdFxcdFxcdCAgICAgbmZzZF9zb2NrX25sX3BvbGljeSwgaW5mby1cXHUwMDNlZXh0YWNrKSBcXHUwMDNjIDApXFxuZnMvbmZzZC9uZnNjdGwuYy0yMTY4LVxcdFxcdFxcdGNvbnRpbnVlO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQyMTo0MDo0MC43MzcyMjEzMzRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQ2MTQ1MTM5MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgTkZTIE5ldGxpbmsgUG9saWN5KipcblxuT2theSwgdGltZSB0byBnZXQgdG8gdGhlIGhlYXJ0IG9mIHRoaXMuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIHRoZSBgbmZzZF9zb2NrX25sX3BvbGljeWAgc3RydWN0dXJlLiBJIGltbWVkaWF0ZWx5IGtub3cgdGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGRlZmluZXMgdGhlIE5ldGxpbmsgbWVzc2FnZSBwb2xpY3kgZm9yIHRoZSBORlMgc2VydmVyJ3Mgc29ja2V0IGludGVyYWN0aW9uLiBJJ2xsIG5lZWQgdG8gZ28gZGlyZWN0bHkgdG8gYGZzL25mc2QvbmV0bGluay5jYCDigJMgdGhhdCdzIHRoZSBvYnZpb3VzIHBsYWNlLiBMZXQncyBzZWUgd2hhdCB0aGF0IHBvbGljeSBkZWZpbml0aW9uIHJldmVhbHMgYWJvdXQgdGhlIGV4cGVjdGVkIG1lc3NhZ2UgZm9ybWF0LCBkYXRhIHR5cGVzLCBhbmQgYW55IHNlY3VyaXR5IHJlc3RyaWN0aW9ucyBpbiBwbGFjZS4gVW5kZXJzdGFuZGluZyB0aGlzIHBvbGljeSBpcyBjcnVjaWFsIGZvciBkaWFnbm9zaW5nIG9yIGRldmVsb3BpbmcgYW55IE5ldGxpbmstYmFzZWQgdG9vbHMgdGhhdCBpbnRlcmFjdCB3aXRoIHRoZSBORlMgc2VydmVyLiBJJ20gZXhwZWN0aW5nIHRoaXMgcG9saWN5IHRvIG91dGxpbmUgdGhlIGF0dHJpYnV0ZXMgYWNjZXB0ZWQgYnkgYG5mc2RgIGFuZCB0aGVpciBhc3NvY2lhdGVkIHZhbGlkYXRpb25zLiBUaGUgZGV0YWlscyBvZiB0aGUgcG9saWN5IGFyZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgZXhwZWN0ZWQgY29udGVudCBvZiB0aGUgaW5jb21pbmcgYW5kIG91dGdvaW5nIE5ldGxpbmsgbWVzc2FnZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MTg3LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6NDQuMTk4Njc1NDg3WiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk4MjYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL25mc2QvbmV0bGluay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM1LFxuICBcIkxpbmVDb3VudFwiOiAxNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDM1OlxcdGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2RfZnNsb2NhdGlvbnNfbmxfcG9saWN5W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTiArIDFdID0ge1xcbiAgMzY6XFx0XFx0W05GU0RfQV9GU0xPQ0FUSU9OU19MT0NBVElPTl0gPSBOTEFfUE9MSUNZX05FU1RFRChuZnNkX2ZzbG9jYXRpb25fbmxfcG9saWN5KSxcXG4gIDM3OlxcdH07XFxuICAzODpcXHRcXG4gIDM5OlxcdGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc29ja19ubF9wb2xpY3lbTkZTRF9BX1NPQ0tfVFJBTlNQT1JUX05BTUUgKyAxXSA9IHtcXG4gIDQwOlxcdFxcdFtORlNEX0FfU09DS19BRERSXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCB9LFxcbiAgNDE6XFx0XFx0W05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSA9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgfSxcXG4gIDQyOlxcdH07XFxuICA0MzpcXHRcXG4gIDQ0OlxcdGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mc2Rfc3ZjX2V4cG9ydF9ubF9wb2xpY3lbTkZTRF9BX1NWQ19FWFBPUlRfRlNJRCArIDFdID0ge1xcbiAgNDU6XFx0XFx0W05GU0RfQV9TVkNfRVhQT1JUX1NFUU5PXSA9IHsgLnR5cGUgPSBOTEFfVTY0LCB9LFxcbiAgNDY6XFx0XFx0W05GU0RfQV9TVkNfRVhQT1JUX0NMSUVOVF0gPSB7IC50eXBlID0gTkxBX05VTF9TVFJJTkcsIH0sXFxuICA0NzpcXHRcXHRbTkZTRF9BX1NWQ19FWFBPUlRfUEFUSF0gPSB7IC50eXBlID0gTkxBX05VTF9TVFJJTkcsIH0sXFxuICA0ODpcXHRcXHRbTkZTRF9BX1NWQ19FWFBPUlRfTkVHQVRJVkVdID0geyAudHlwZSA9IE5MQV9GTEFHLCB9LFxcbiAgNDk6XFx0XFx0W05GU0RfQV9TVkNfRVhQT1JUX0VYUElSWV0gPSB7IC50eXBlID0gTkxBX1U2NCwgfSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6NDQuMTk4Nzc3MDM3WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkzNjAxMzM2MzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUmVhc29uaW5nIFRocm91Z2ggdGhlIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgcmVnYXJkaW5nIHRoZSBgW05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXWAgZGVmaW5pdGlvbiwga25vd2luZyB0aGF0IGAudHlwZSA9IE5MQV9OVUxfU1RSSU5HYCBndWFyYW50ZWVzIHRoYXQgYG5sYV9kYXRhKHRiW05GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FXSlgIHdpbGwgYmUgbnVsbC10ZXJtaW5hdGVkLiBUaGlzIGlzIGNydWNpYWwgZm9yIGF2b2lkaW5nIGFueSBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW5zIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBUaGUgcGF0Y2ggaXRzZWxmIGRvZXNuJ3QgaW50cm9kdWNlIGFueSBuZXcgYWxsb2NhdGlvbnMsIHNvIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLiBUaGUgY2hhbmdlcyBhcmUgYWxsIGNlbnRlcmVkIGFyb3VuZCB2YWxpZGF0aW9uIGFuZCBlcnJvciBoYW5kbGluZywgd2hpY2ggaXMgcHJlY2lzZWx5IHRoZSBraW5kIG9mIHRoaW5nIEtBU0FOIGFuZCBvdGhlciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFyZSBkZXNpZ25lZCB0byBjYXRjaCBpZiBzb21ldGhpbmcgc2xpcHMgdGhyb3VnaC4gU28sIGluIHRlcm1zIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCB0aGlzIHNlY3Rpb24gaXMgYSBub24taXNzdWUuXG5cbk5leHQsIEkgbmVlZCB0byBjb25maXJtIHRoZSBgc3ZjX3JlZ2lzdGVyYCBjaGFuZ2VzLiBJdCBsb29rcyBsaWtlIGl0J3MgYSBzaW1wbGUsIGFuZCByYXRoZXIgc3RyYWlnaHRmb3J3YXJkLCBmaXggZm9yIGFuIGVycm9yIGNvZGUgcHJvcGFnYXRpb24gYnVnLiBUaGUgcGF0Y2ggaXMgc2ltcGx5IGVuc3VyaW5nIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuIE5vIG5ldyBtZW1vcnkgaXMgYmVpbmcgaW50cm9kdWNlZCBhbmQgbm8gbWVtb3J5IHRoYXQgZXhpc3RlZCBiZWZvcmUgaXMgYmVpbmcgY2hhbmdlZCB0byBiZSB1bmluaXRpYWxpemVkLlxuXG5GaW5hbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNoYW5nZXMgaW4gYHJwY2JfY3JlYXRlX2FmX2xvY2FsYCBhbmQgYHJwY2JfY3JlYXRlX2xvY2FsX25ldGAuIEl0IHNlZW1zIHRoZSB1cGRhdGUgYWRkcyBhIGBycGNiX2xvY2FsX3RpbWVvdXRgLiBJdCBpcyBkZWZpbmluZyBhIGxvY2FsIHRpbWVvdXQgd2l0aCBhbiBpbml0aXZhbCBvZiBgMSAqIEhaYCwgYSBtYXh2YWwgb2YgYDEgKiBIWmAsIGFuZCBgMGAgcmV0cmllcy4gVGhpcyBhcHBlYXJzIHRvIGJlIHNldHRpbmcgdXAgYSB0aW1lb3V0IHN0cnVjdHVyZSwgYnV0IGFnYWluLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoYXQgSSBjYW4gc2VlIGhlcmUuXG5cbkJhc2VkIG9uIHRoaXMgcmV2aWV3LCBJJ20gY29uZmlkZW50IHRoYXQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gV2UgY2FuIHNhZmVseSBtYXJrIE5lZWRzS01TQU4gYXMgZmFsc2UuIEknbGwgc3VtbWFyaXplIHRoaXMgcmVhc29uaW5nIGZvciBteSBub3RlcyBhbmQgdGhlIHJldmlld2Vycy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg4NzMsIk91dHB1dFRva2VucyI6MjU2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTEyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMjE6NDA6NTMuNTU4OTEyNzUxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYxNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyB2YWxpZGF0aW9uIGNoZWNrcyBmb3IgTkZTRCBuZXRsaW5rIGxpc3RlbmVyIGF0dHJpYnV0ZXMgKGUuZy4sIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHRvIGBORlNEX05MX0xJU1RFTkVSX01BWGAgYW5kIHZhbGlkYXRpbmcgdGhlIHRyYW5zcG9ydCBuYW1lIHZpYSBgbmZzZF9ubF90cmFuc3BvcnRfc3VwcG9ydGVkYCkuIEl0IGFsc28gZml4ZXMgZXJyb3IgY29kZSBwcm9wYWdhdGlvbiBpbiBgc3ZjX3JlZ2lzdGVyYCBhbmQgc2V0cyBhIGxvY2FsIHRpbWVvdXQgZm9yIHJwY2JpbmQgY2xpZW50cy4gXFxuXFxuVGhlIG5ldGxpbmsgYXR0cmlidXRlIGBORlNEX0FfU09DS19UUkFOU1BPUlRfTkFNRWAgaXMgZGVmaW5lZCBhcyBgTkxBX05VTF9TVFJJTkdgIGluIGBuZnNkX3NvY2tfbmxfcG9saWN5YCwgZW5zdXJpbmcgdGhhdCBgbmxhX2RhdGEoKWAgcmV0dXJucyBhIHByb3Blcmx5IG51bGwtdGVybWluYXRlZCBzdHJpbmcgYmVmb3JlIGl0IGlzIHBhc3NlZCB0byBgc3RyY21wKClgIGluIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgLiBcXG5cXG5ObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBvciBzZW50IHRvIHVzZXIgc3BhY2UsIGFuZCB0aGVyZSBhcmUgbm8gY2hhbmdlcyB0aGF0IGNvdWxkIGV4cG9zZSB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBBbnkgcG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMgKHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBsb2dpYyBidWdzKSB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGRlZmF1bHQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHZhbGlkYXRpb24gY2hlY2tzIGZvciBORlNEIG5ldGxpbmsgbGlzdGVuZXIgYXR0cmlidXRlcyAoZS5nLiwgbGltaXRpbmcgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgdG8gYE5GU0RfTkxfTElTVEVORVJfTUFYYCBhbmQgdmFsaWRhdGluZyB0aGUgdHJhbnNwb3J0IG5hbWUgdmlhIGBuZnNkX25sX3RyYW5zcG9ydF9zdXBwb3J0ZWRgKS4gSXQgYWxzbyBmaXhlcyBlcnJvciBjb2RlIHByb3BhZ2F0aW9uIGluIGBzdmNfcmVnaXN0ZXJgIGFuZCBzZXRzIGEgbG9jYWwgdGltZW91dCBmb3IgcnBjYmluZCBjbGllbnRzLiBcXG5cXG5UaGUgbmV0bGluayBhdHRyaWJ1dGUgYE5GU0RfQV9TT0NLX1RSQU5TUE9SVF9OQU1FYCBpcyBkZWZpbmVkIGFzIGBOTEFfTlVMX1NUUklOR2AgaW4gYG5mc2Rfc29ja19ubF9wb2xpY3lgLCBlbnN1cmluZyB0aGF0IGBubGFfZGF0YSgpYCByZXR1cm5zIGEgcHJvcGVybHkgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIGBzdHJjbXAoKWAgaW4gYG5mc2RfbmxfdHJhbnNwb3J0X3N1cHBvcnRlZGAuIFxcblxcbk5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIG9yIHNlbnQgdG8gdXNlciBzcGFjZSwgYW5kIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRoYXQgY291bGQgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgb3IgaGVhcCBtZW1vcnkuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvZ2ljIGJ1Z3MpIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[1] Phase: Succeeded StartedAt: 2026-08-10 21:41:05 +0000 UTC FinishedAt: 2026-08-10 21:41:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-10 21:41:05 +0000 UTC FinishedAt: 2026-08-10 21:41:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2] Phase: Succeeded StartedAt: 2026-08-10 21:41:05 +0000 UTC FinishedAt: 2026-08-11 01:29:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-10 21:41:05 +0000 UTC FinishedAt: 2026-08-11 01:29:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-10 21:41:05 +0000 UTC FinishedAt: 2026-08-10 21:41:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-10 21:41:05 +0000 UTC FinishedAt: 2026-08-10 21:41:11 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-convert-artifact-3874381754/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-10 21:41:15 +0000 UTC FinishedAt: 2026-08-10 21:57:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-10 21:41:15 +0000 UTC FinishedAt: 2026-08-10 21:57:51 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*7a40ece2-61d3-4126-a14a-b24ec0b1ecb8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-convert-artifact-3874381754/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "d8aa843d-ec71-47d4-aa70-e363f0dd6cfe", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-556504424/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-10 21:41:15 +0000 UTC FinishedAt: 2026-08-10 21:57:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*7a40ece2-61d3-4126-a14a-b24ec0b1ecb8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-convert-artifact-3874381754/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "d8aa843d-ec71-47d4-aa70-e363f0dd6cfe", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-556504424/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-10 21:57:51 +0000 UTC FinishedAt: 2026-08-10 21:57:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-10 21:57:51 +0000 UTC FinishedAt: 2026-08-10 21:57:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-10 21:57:51 +0000 UTC FinishedAt: 2026-08-10 21:58:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-10 21:57:51 +0000 UTC FinishedAt: 2026-08-10 21:57:56 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-convert-artifact-384183573/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-10 21:58:02 +0000 UTC FinishedAt: 2026-08-10 21:59:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-10 21:58:02 +0000 UTC FinishedAt: 2026-08-10 21:59:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*d8aa843d-ec71-47d4-aa70-e363f0dd6cfe,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-556504424/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-10 21:59:58 +0000 UTC FinishedAt: 2026-08-10 21:59:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-10 21:59:58 +0000 UTC FinishedAt: 2026-08-10 21:59:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-10 21:59:58 +0000 UTC FinishedAt: 2026-08-10 22:17:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-10 21:59:58 +0000 UTC FinishedAt: 2026-08-10 22:17:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*7a40ece2-61d3-4126-a14a-b24ec0b1ecb8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-convert-artifact-384183573/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "00a1a72a-f55b-4d18-b79b-e5cc0c331bf5", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-498389921/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-10 21:59:58 +0000 UTC FinishedAt: 2026-08-10 22:17:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*7a40ece2-61d3-4126-a14a-b24ec0b1ecb8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-convert-artifact-384183573/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "00a1a72a-f55b-4d18-b79b-e5cc0c331bf5", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-498389921/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-10 22:17:39 +0000 UTC FinishedAt: 2026-08-10 22:17:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-10 22:17:39 +0000 UTC FinishedAt: 2026-08-10 22:17:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-10 22:17:39 +0000 UTC FinishedAt: 2026-08-10 22:19:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-10 22:17:39 +0000 UTC FinishedAt: 2026-08-10 22:19:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*00a1a72a-f55b-4d18-b79b-e5cc0c331bf5,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-498389921/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-10 22:19:38 +0000 UTC FinishedAt: 2026-08-11 01:29:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-10 22:19:38 +0000 UTC FinishedAt: 2026-08-11 01:29:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*d8aa843d-ec71-47d4-aa70-e363f0dd6cfe,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*00a1a72a-f55b-4d18-b79b-e5cc0c331bf5,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-556504424/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-498389921/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-10 22:19:38 +0000 UTC FinishedAt: 2026-08-10 22:19:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-10 22:19:38 +0000 UTC FinishedAt: 2026-08-10 22:19:43 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-convert-artifact-2268424442/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-10 22:19:38 +0000 UTC FinishedAt: 2026-08-10 22:19:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-10 22:19:38 +0000 UTC FinishedAt: 2026-08-10 22:19:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-10 22:19:38 +0000 UTC FinishedAt: 2026-08-10 22:19:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-10 22:19:48 +0000 UTC FinishedAt: 2026-08-11 01:29:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8cf62[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nfsd_nl_listener_set_doit","svc_register","rpcb_create_local"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6b8c8af514d739d0335f5579b585e02babe8a727","config_name":"upstream-apparmor-kasan.config","enable_configs":["NFSD","NFSD_V4","SUNRPC","NET_NS","IPV6"],"series_id":"f83e0325-9b4d-49dc-8c51-d591fefe8752","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-10 22:19:48 +0000 UTC FinishedAt: 2026-08-11 01:29:34 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*d8aa843d-ec71-47d4-aa70-e363f0dd6cfe,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*00a1a72a-f55b-4d18-b79b-e5cc0c331bf5,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-556504424/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-build-action-498389921/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8cf62/series-workflow8cf62-convert-artifact-2268424442/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}