Name: series-workflow6wrsh Phase: Succeeded StartedAt: 2026-09-08 11:15:40 +0000 UTC FinishedAt: 2026-09-08 15:17:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[0] Phase: Succeeded StartedAt: 2026-09-08 11:15:40 +0000 UTC FinishedAt: 2026-09-08 11:36:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[0].run-triage Phase: Succeeded StartedAt: 2026-09-08 11:15:40 +0000 UTC FinishedAt: 2026-09-08 11:36:40 +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": "944a035ecca915ae947905dcfb03f2b9dc6d032c", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BLK_CGROUP_IOCOST_BPF", "BLK_CGROUP_IOCOST", "BLK_CGROUP", "BPF_SYSCALL", "BPF_JIT" ], "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": "944a035ecca915ae947905dcfb03f2b9dc6d032c", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BLK_CGROUP_IOCOST_BPF", "BLK_CGROUP_IOCOST", "BLK_CGROUP", "BPF_SYSCALL", "BPF_JIT" ], "series_id": "da43f7cc-b8ea-45e2-898a-52699aaec518" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "fs" ], "focus_symbols": [ "iocost_bpf_calc_cost", "bpf_iocost_reg", "bpf_iocost_unreg", "ioc_cost_model_write", "ioc_cost_model_prfill", "calc_vtime_cost" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVBfSU9DT1NUX0JQRiYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVCYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpb2Nvc3RfYnBmX2NhbGNfY29zdCYjMzQ7LAogICAgJiMzNDticGZfaW9jb3N0X3JlZyYjMzQ7LAogICAgJiMzNDticGZfaW9jb3N0X3VucmVnJiMzNDssCiAgICAmIzM0O2lvY19jb3N0X21vZGVsX3dyaXRlJiMzNDssCiAgICAmIzM0O2lvY19jb3N0X21vZGVsX3ByZmlsbCYjMzQ7LAogICAgJiMzNDtjYWxjX3Z0aW1lX2Nvc3QmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIHRoZSBibGstaW9jb3N0IEkvTyBjZ3JvdXAgY29udHJvbGxlciwgYWxsb3dpbmcgcGx1Z2dhYmxlIEJQRi1iYXNlZCBjb3N0IGNhbGN1bGF0aW9uLCBhZGRzIGEgbmV3IHRyYWNlcG9pbnQgKGBpb2Nvc3RfaW9jX3RpY2tgKSwgYW5kIHVwZGF0ZXMgdGhlIGNncm91cCB2MiBgaW8uY29zdC5tb2RlbGAgaW50ZXJmYWNlLlxuXG5BbmFseXNpcyByZWdhcmRpbmcgc2FuaXRpemVyczpcbjEuIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4tIEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSBhbmQga2VybmVsLXRvLXVzZXIgaW5mb3JtYXRpb24gbGVha3MuXG4tIEluIHRoaXMgcGF0Y2gsIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgcGFzc2VkIHRvIGBpb2Nvc3RfYnBmX2NhbGNfY29zdCgpYCBhbmQgdGhlIEJQRiBzdHJ1Y3Rfb3BzIGNhbGxiYWNrIGFyZSBzY2FsYXIgaW50ZWdlciB2YWx1ZXMgcGFzc2VkIGJ5IHZhbHVlLlxuLSBPdXRwdXQgcG9pbnRlcnMgKHN1Y2ggYXMgYCpjb3N0cGAgaW4gYGlvY29zdF9icGZfY2FsY19jb3N0YCkgYXJlIHdyaXR0ZW4gYmVmb3JlIHJldHVybiwgYW5kIGFsbCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4gYGJwZmAsIGB1c2VyYCwgYGNvc3RgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gYnJhbmNoaW5nIG9yIHVzZS5cbi0gVGhlIG5ldyB0cmFjZXBvaW50IGBpb2Nvc3RfaW9jX3RpY2tgIGV4cGxpY2l0bHkgYXNzaWducyBhbGwgZmllbGRzIGluIGBUUF9mYXN0X2Fzc2lnbmAuXG4tIE5vIHN0cnVjdHMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBoZWFwIGFsbG9jYXRpb25zIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLlxuXG4yLiBLQVNBTiAvIExPQ0tERVAgYXBwbGljYWJpbGl0eTpcbi0gUG90ZW50aWFsIHJpc2tzIGluIHRoaXMgcGF0Y2ggcmV2b2x2ZSBhcm91bmQgY29uY3VycmVuY3kgKHN5bmNocm9uaXphdGlvbiBvZiBgaW9jb3N0X2JwZl9tb2RlbGAgdmlhIFJDVSwgbXV0ZXhlcywgYW5kIHN0YXRpYyBrZXlzKSBvciBsb2dpYy9ib3VuZHMgZXJyb3JzLCB3aGljaCBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBrZXJuZWwgYnVnIGRldGVjdG9ycywgTE9DS0RFUCwgYW5kIEtBU0FOLlxuXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMgaW4gdGhlIGJsb2NrIGlvY29zdCBjZ3JvdXAgY29udHJvbGxlciAoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRikuIEl0IGFkZHMgc3RydWN0X29wcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBpbnRlZ3JhdGVzIGR5bmFtaWMgQlBGIGNvc3QgY2FsY3VsYXRpb24gaW50byB0aGUgYmlvIHN1Ym1pc3Npb24gcGF0aCwgYW5kIGV4dGVuZHMgdGhlIGNncm91cCBpby5jb3N0Lm1vZGVsIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLiBUaGUgY29kZSBpcyBmdWxseSByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBjZ3JvdXBzIGFuZCB0aGUgQlBGIHN1YnN5c3RlbS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDM0ZWM1MDE2OTJhN2JkZWQzZGNiMTU2Yjg0Y2FiNGQ1ODg4MzU2ZjRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIFNlcCA4IDExOjM1OjQzIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuaW5kZXggOGQyNjAzNzUxYzUxYS4uNTRiMDU3NGNlNTg2YyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0XG5AQCAtMjExNSwxMCAmIzQzOzIxMTUsMjQgQEAgSU8gSW50ZXJmYWNlIEZpbGVzXG4gXHRhcmUgZGVmaW5lZC5cbiBcbiBcdCAgPT09PT1cdFx0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi1cdCAgY3RybFx0XHRcJiMzNDthdXRvXCYjMzQ7IG9yIFwmIzM0O3VzZXJcJiMzNDtcbiYjNDM7XHQgIGN0cmxcdFx0XCYjMzQ7YXV0b1wmIzM0OywgXCYjMzQ7dXNlclwmIzM0OyBvciBcJiMzNDticGZcJiMzNDtcbiBcdCAgbW9kZWxcdFx0VGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gXCYjMzQ7bGluZWFyXCYjMzQ7XG4gXHQgID09PT09XHRcdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gXG4mIzQzO1x0V2hlbiBcJiMzNDtjdHJsXCYjMzQ7IGlzIFwmIzM0O2JwZlwmIzM0OyAob25seSBhdmFpbGFibGUgd2hlblxuJiM0MztcdENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYgaXMgZW5hYmxlZCksIGNvc3QgY2FsY3VsYXRpb24gZm9yXG4mIzQzO1x0dGhlIGRldmljZSBpcyBkaXNwYXRjaGVkIHRvIHRoZSBCUEYgcHJvZ3JhbSByZWdpc3RlcmVkIGFnYWluc3RcbiYjNDM7XHR0aGUgaW9jb3N0X21vZGVsX29wcyBzdHJ1Y3Rfb3BzLiAgV3JpdGluZyBcJiMzNDticGZcJiMzNDsgZmFpbHMgd2l0aCAtRUlOVkFMXG4mIzQzO1x0dW50aWwgc3VjaCBhIHByb2dyYW0gaXMgcmVnaXN0ZXJlZCwgYW5kIGF0IG1vc3Qgb25lIHByb2dyYW0gY2FuXG4mIzQzO1x0YmUgcmVnaXN0ZXJlZCBzeXN0ZW0td2lkZS4gIFRoZSBtb2RlbCBpcyBjYWxsZWQgd2l0aCBzY2FsYXJcbiYjNDM7XHRhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlXG4mIzQzO1x0aXNzdWluZyBjZ3JvdXAsIGZsYWdzOyBzZWUgaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmggZm9yIHRoZWlyXG4mIzQzO1x0bWVhbmluZykgYW5kIHJldHVybnMgYSBjb3N0IGluIHZ0aW1lIHVuaXRzLCBjbGFtcGVkIGJ5IHRoZSBrZXJuZWxcbiYjNDM7XHR0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlc1xuJiM0MztcdHRoZSBJTyBiYWNrIHRvIHRoZSBidWlsdGluIGxpbmVhciBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIG9ubHlcbiYjNDM7XHRoYW5kbGVzIHNvbWUgSU8gdHlwZXMgY2Fubm90IG1ha2UgdGhlIHJlc3QgZnJlZS4gIERldmljZXMgd2hpY2hcbiYjNDM7XHRkb24mIzM5O3Qgb3B0IGluIGtlZXAgdGhlIGJ1aWx0aW4gbGluZWFyIG1vZGVsIHVuY2hhbmdlZC5cbiYjNDM7XG4gXHRXaGVuIFwmIzM0O2N0cmxcJiMzNDsgaXMgXCYjMzQ7YXV0b1wmIzM0OywgdGhlIGtlcm5lbCBtYXkgY2hhbmdlIGFsbCBwYXJhbWV0ZXJzXG4gXHRkeW5hbWljYWxseS4gIFdoZW4gXCYjMzQ7Y3RybFwmIzM0OyBpcyBzZXQgdG8gXCYjMzQ7dXNlclwmIzM0OyBvciBhbnkgb3RoZXJcbiBcdHBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gdG8sIFwmIzM0O2N0cmxcJiMzNDsgYmVjb21lIFwmIzM0O3VzZXJcJiMzNDsgYW5kIHRoZVxuZGlmZiAtLWdpdCBhL2Jsb2NrL0tjb25maWcgYi9ibG9jay9LY29uZmlnXG5pbmRleCA3MGU0YTY2ZDk0MWZmLi5iZjQzYmUyMWUwMGJiIDEwMDY0NFxuLS0tIGEvYmxvY2svS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svS2NvbmZpZ1xuQEAgLTIzMSw0ICYjNDM7MjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OXG4gXG4gc291cmNlIFwmIzM0O2Jsb2NrL0tjb25maWcuaW9zY2hlZFwmIzM0O1xuIFxuJiM0Mztjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4mIzQzO1x0Ym9vbCBcJiMzNDtFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXJcJiMzNDtcbiYjNDM7XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBfSU9DT1NUIFx1MDAyNlx1MDAyNiBCUEZfU1lTQ0FMTCBcdTAwMjZcdTAwMjYgQlBGX0pJVFxuJiM0MztcdGhlbHBcbiYjNDM7XHQgRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVnaXN0ZXJzIHRoZSBcJiMzNDtpb2Nvc3RfbW9kZWxfb3BzXCYjMzQ7IEJQRlxuJiM0MztcdCBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlXG4mIzQzO1x0IGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGhcbiYjNDM7XHQgXCYjMzQ7Y3RybD1icGZcJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLlxuJiM0MztcbiBlbmRpZiAjIEJMT0NLXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uZWU1Y2ViZWVhMDA2ZiAxMDA2NDRcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZVxuQEAgLTM5LDMgJiM0MzszOSw0IEBAIG9iai0kKENPTkZJR19CTEtfSU5MSU5FX0VOQ1JZUFRJT04pXHQmIzQzOz0gYmxrLWNyeXB0by5vIGJsay1jcnlwdG8tcHJvZmlsZS5vIFxcXG4gXHRcdFx0XHRcdCAgIGJsay1jcnlwdG8tc3lzZnMub1xuIG9iai0kKENPTkZJR19CTEtfSU5MSU5FX0VOQ1JZUFRJT05fRkFMTEJBQ0spXHQmIzQzOz0gYmxrLWNyeXB0by1mYWxsYmFjay5vXG4gb2JqLSQoQ09ORklHX0JMT0NLX0hPTERFUl9ERVBSRUNBVEVEKVx0JiM0Mzs9IGhvbGRlci5vXG4mIzQzO29iai0kKENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYpXHQmIzQzOz0gYmxrLWlvY29zdC1icGYub1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMgYi9ibG9jay9ibGstaW9jb3N0LWJwZi5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMGMzNGY1NmRlZDcxZFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWlvY29zdC1icGYuY1xuQEAgLTAsMCAmIzQzOzEsMTUyIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBibGstaW9jb3N0OiBCUEYgc3RydWN0X29wcyBwbHVtYmluZyBmb3IgcGx1Z2dhYmxlIGNvc3QgbW9kZWxzLlxuJiM0MzsgKlxuJiM0MzsgKiBSZWdpc3RlcnMgdGhlIFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDsgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWxcbiYjNDM7ICogY2FuIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lOyBkZXZpY2VzIG9wdCBpbiBwZXItcXVldWUgd2l0aFxuJiM0MzsgKiBcJiMzNDtlY2hvICRERVYgY3RybD1icGYgXHUwMDNlIGlvLmNvc3QubW9kZWxcJiMzNDsuICBEZXZpY2VzIHdpdGhvdXQgYSByZWdpc3RlcmVkXG4mIzQzOyAqIG1vZGVsIGtlZXAgdXNpbmcgdGhlIGJ1aWx0aW4gbGluZWFyIG1vZGVsLlxuJiM0MzsgKi9cbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZl92ZXJpZmllci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2Jsay1pb2Nvc3QuaFx1MDAzZVxuJiM0MztcbiYjNDM7LyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJiMzOTtzIGNoYXJnZWFibGUgY29zdCAqL1xuJiM0MzsjZGVmaW5lIElPQ09TVF9CUEZfTUFYX0NPU1RcdCgxVUxMIFx1MDAzY1x1MDAzYyAzNylcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHMgYnBmX2lvY29zdF9tb2RlbF9vcHM7XG4mIzQzO1xuJiM0MztzdGF0aWMgREVGSU5FX01VVEVYKGlvY29zdF9icGZfcmVnX2xvY2spO1xuJiM0MztzdGF0aWMgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgX19yY3UgKmlvY29zdF9icGZfbW9kZWw7XG4mIzQzO3N0YXRpYyBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShpb2Nvc3RfYnBmX2tleSk7XG4mIzQzO1xuJiM0Mztib29sIGlvY29zdF9icGZfbW9kZWxfcmVnaXN0ZXJlZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHN0YXRpY19icmFuY2hfdW5saWtlbHkoXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvcixcbiYjNDM7XHRcdFx0ICB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzLCB1NjQgKmNvc3RwKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm9wcztcbiYjNDM7XHR1NjQgY29zdDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFx1MDAyNmlvY29zdF9icGZfa2V5KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdG9wcyA9IHJjdV9kZXJlZmVyZW5jZShpb2Nvc3RfYnBmX21vZGVsKTtcbiYjNDM7XHRpZiAoIW9wcykge1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdGNvc3QgPSBvcHMtXHUwMDNlY2FsY19jb3N0KG9wLCBuYnl0ZXMsIHNlY3RvciwgY3Vyc29yLCBpb2NnX2lkLCBmbGFncyk7XG4mIzQzO1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1xuJiM0MztcdGlmICghY29zdClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0KmNvc3RwID0gbWluKGNvc3QsIElPQ09TVF9CUEZfTUFYX0NPU1QpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdChzdHJ1Y3QgYnRmICpidGYpXG4mIzQzO3tcbiYjNDM7XHRzMzIgdHlwZV9pZDtcbiYjNDM7XG4mIzQzO1x0dHlwZV9pZCA9IGJ0Zl9maW5kX2J5X25hbWVfa2luZChidGYsIFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDssIEJURl9LSU5EX1NUUlVDVCk7XG4mIzQzO1x0aWYgKHR5cGVfaWQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBicGZfaW9jb3N0X2luaXRfbWVtYmVyKGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbiYjNDM7XHRcdFx0XHQgIGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXIsXG4mIzQzO1x0XHRcdFx0ICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IGJwZl9pbnNuX2FjY2Vzc19hdXggKmluZm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqXG4mIzQzO2JwZl9pb2Nvc3RfZ2V0X2Z1bmNfcHJvdG8oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkLFxuJiM0MztcdFx0XHQgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBicGZfYmFzZV9mdW5jX3Byb3RvKGZ1bmNfaWQsIHByb2cpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgYnBmX2lvY29zdF92ZXJpZmllcl9vcHMgPSB7XG4mIzQzO1x0LmdldF9mdW5jX3Byb3RvID0gYnBmX2lvY29zdF9nZXRfZnVuY19wcm90byxcbiYjNDM7XHQuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoIW5ld19vcHMtXHUwMDNlY2FsY19jb3N0KVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdGludCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHQvKiB0aGUgY2FsbGVyIG9ubHkgaG9sZHMgdGhlIHBlci1tYXAgbG9jaywgc28gc2VyaWFsaXplIGhlcmUgKi9cbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuJiM0MztcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkpXG4mIzQzO1x0XHRyZXQgPSAtRUJVU1k7XG4mIzQzO1x0ZWxzZSB7XG4mIzQzO1x0XHRzdGF0aWNfYnJhbmNoX2luYyhcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4mIzQzO1x0XHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgbmV3X29wcyk7XG4mIzQzO1x0fVxuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBicGZfaW9jb3N0X3VucmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4mIzQzO3tcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuJiM0MztcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkgPT0ga2RhdGEpIHtcbiYjNDM7XHRcdHJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBOVUxMKTtcbiYjNDM7XHRcdHN0YXRpY19icmFuY2hfZGVjKFx1MDAyNmlvY29zdF9icGZfa2V5KTtcbiYjNDM7XHR9XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdTY0IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxuJiM0MztcdFx0XHRcdCAgICAgdTY0IGN1cnNvciwgdTY0IGlvY2dfaWQsIHU2NCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgX19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMgPSB7XG4mIzQzO1x0LmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0ge1xuJiM0MztcdC52ZXJpZmllcl9vcHMgPSBcdTAwMjZicGZfaW9jb3N0X3ZlcmlmaWVyX29wcyxcbiYjNDM7XHQuaW5pdCA9IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdCxcbiYjNDM7XHQuaW5pdF9tZW1iZXIgPSBicGZfaW9jb3N0X2luaXRfbWVtYmVyLFxuJiM0MztcdC5yZWcgPSBicGZfaW9jb3N0X3JlZyxcbiYjNDM7XHQudW5yZWcgPSBicGZfaW9jb3N0X3VucmVnLFxuJiM0MztcdC5uYW1lID0gXCYjMzQ7aW9jb3N0X21vZGVsX29wc1wmIzM0OyxcbiYjNDM7XHQuY2ZpX3N0dWJzID0gXHUwMDI2X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsXG4mIzQzO1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBicGZfaW9jb3N0X2luaXQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiByZWdpc3Rlcl9icGZfc3RydWN0X29wcyhcdTAwMjZicGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7XG4mIzQzO31cbiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfaW9jb3N0X2luaXQpO1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QuY1xuaW5kZXggMjc0NWJmZmNkNWVlZi4uYTU4YzE2ZmNiMjlmYSAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1pb2Nvc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWlvY29zdC5jXG5AQCAtMTc3LDYgJiM0MzsxNzcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3RpbWVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90aW1lNjQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhcnNlci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2Jsay1pb2Nvc3QuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2xvY2FsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vbG9jYWw2NC5oXHUwMDNlXG5AQCAtNDQ1LDYgJiM0Mzs0NDYsNyBAQCBzdHJ1Y3QgaW9jIHtcbiBcdGludFx0XHRcdFx0YXV0b3BfaWR4O1xuIFx0Ym9vbFx0XHRcdFx0dXNlcl9xb3NfcGFyYW1zOjE7XG4gXHRib29sXHRcdFx0XHR1c2VyX2Nvc3RfbW9kZWw6MTtcbiYjNDM7XHRib29sXHRcdFx0XHRicGZfY29zdF9tb2RlbDtcbiB9O1xuIFxuIHN0cnVjdCBpb2NnX3BjcHVfc3RhdCB7XG5AQCAtMjIzOCw2ICYjNDM7MjI0MCw3IEBAIHN0YXRpYyB2b2lkIGlvY190aW1lcl9mbihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpXG4gXHRzdHJ1Y3QgaW9jX25vdyBub3c7XG4gXHRMSVNUX0hFQUQoc3VycGx1c2VzKTtcbiBcdGludCBucl9kZWJ0b3JzLCBucl9zaG9ydGFnZXMgPSAwLCBucl9sYWdnaW5nID0gMDtcbiYjNDM7XHRpbnQgbnJfYWN0aXZlID0gMDtcbiBcdHU2NCB1c2FnZV91c19zdW0gPSAwO1xuIFx0dTMyIHBwbV9ydGhyO1xuIFx0dTMyIHBwbV93dGhyO1xuQEAgLTIyNzQsNiAmIzQzOzIyNzcsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHR1NjQgdmRvbmUsIHZ0aW1lLCB1c2FnZV91cztcbiBcdFx0dTMyIGh3X2FjdGl2ZSwgaHdfaW51c2U7XG4gXG4mIzQzO1x0XHRucl9hY3RpdmUmIzQzOyYjNDM7O1xuJiM0MztcbiBcdFx0LypcbiBcdFx0ICogQ29sbGVjdCB1bnVzZWQgYW5kIHdpbmQgdnRpbWUgY2xvc2VyIHRvIHZub3cgdG8gcHJldmVudFxuIFx0XHQgKiBpb2NncyBmcm9tIGFjY3VtdWxhdGluZyBhIGxhcmdlIGFtb3VudCBvZiBidWRnZXQuXG5AQCAtMjQ2MCw2ICYjNDM7MjQ2NSw4IEBAIHN0YXRpYyB2b2lkIGlvY190aW1lcl9mbihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpXG4gXHRcdGlvY19yZWZyZXNoX3ZyYXRlKGlvYywgXHUwMDI2bm93KTtcbiBcdH1cbiBcbiYjNDM7XHR0cmFjZV9pb2Nvc3RfaW9jX3RpY2soaW9jLCBucl9hY3RpdmUsIHVzYWdlX3VzX3N1bSk7XG4mIzQzO1xuIFx0c3Bpbl91bmxvY2tfaXJxKFx1MDAyNmlvYy1cdTAwM2Vsb2NrKTtcbiB9XG4gXG5AQCAtMjU3Myw2ICYjNDM7MjU4MCwyMyBAQCBzdGF0aWMgdTY0IGNhbGNfdnRpbWVfY29zdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBpb2NfZ3EgKmlvY2csIGJvb2wgaXNfbWVyZ2UpXG4ge1xuIFx0dTY0IGNvc3Q7XG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4mIzQzO1x0c3RydWN0IGlvYyAqaW9jID0gaW9jZy1cdTAwM2Vpb2M7XG4mIzQzO1xuJiM0MztcdGlmIChSRUFEX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsKSkge1xuJiM0MztcdFx0dTY0IGJwZl9jb3N0O1xuJiM0MztcbiYjNDM7XHRcdGlmIChpb2Nvc3RfYnBmX2NhbGNfY29zdChiaW9fb3AoYmlvKSxcbiYjNDM7XHRcdFx0XHRcdCBiaW8tXHUwMDNlYmlfaXRlci5iaV9zaXplLFxuJiM0MztcdFx0XHRcdFx0IGJpby1cdTAwM2ViaV9pdGVyLmJpX3NlY3RvcixcbiYjNDM7XHRcdFx0XHRcdCBpb2NnLVx1MDAzZWN1cnNvcixcbiYjNDM7XHRcdFx0XHRcdCBpb2NnX3RvX2Jsa2coaW9jZyktXHUwMDNlYmxrY2ctXHUwMDNlY3NzLmlkLFxuJiM0MztcdFx0XHRcdFx0IGlzX21lcmdlID8gSU9DT1NUX0NPU1RfRl9NRVJHRSA6IDAsXG4mIzQzO1x0XHRcdFx0XHQgXHUwMDI2YnBmX2Nvc3QpKVxuJiM0MztcdFx0XHRyZXR1cm4gYnBmX2Nvc3Q7XG4mIzQzO1x0fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4gXHRjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbihiaW8sIGlvY2csIGlzX21lcmdlLCBcdTAwMjZjb3N0KTtcbiBcdHJldHVybiBjb3N0O1xuIH1cbkBAIC0zNDQxLDcgJiM0MzszNDY1LDggQEAgc3RhdGljIHU2NCBpb2NfY29zdF9tb2RlbF9wcmZpbGwoc3RydWN0IHNlcV9maWxlICpzZixcbiBcdHNlcV9wcmludGYoc2YsIFwmIzM0OyVzIGN0cmw9JXMgbW9kZWw9bGluZWFyIFwmIzM0O1xuIFx0XHQgICBcJiMzNDtyYnBzPSVsbHUgcnNlcWlvcHM9JWxsdSBycmFuZGlvcHM9JWxsdSBcJiMzNDtcbiBcdFx0ICAgXCYjMzQ7d2Jwcz0lbGx1IHdzZXFpb3BzPSVsbHUgd3JhbmRpb3BzPSVsbHVcXG5cJiMzNDssXG4tXHRcdCAgIGRuYW1lLCBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsID8gXCYjMzQ7dXNlclwmIzM0OyA6IFwmIzM0O2F1dG9cJiMzNDssXG4mIzQzO1x0XHQgICBkbmFtZSwgaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsID8gXCYjMzQ7YnBmXCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgaW9jLVx1MDAzZXVzZXJfY29zdF9tb2RlbCA/IFwmIzM0O3VzZXJcJiMzNDsgOiBcJiMzNDthdXRvXCYjMzQ7LFxuIFx0XHQgICB1W0lfTENPRUZfUkJQU10sIHVbSV9MQ09FRl9SU0VRSU9QU10sIHVbSV9MQ09FRl9SUkFORElPUFNdLFxuIFx0XHQgICB1W0lfTENPRUZfV0JQU10sIHVbSV9MQ09FRl9XU0VRSU9QU10sIHVbSV9MQ09FRl9XUkFORElPUFNdKTtcbiBcdHNwaW5fdW5sb2NrX2lycShcdTAwMjZpb2MtXHUwMDNlbG9jayk7XG5AQCAtMzQ4MSw3ICYjNDM7MzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHR1bnNpZ25lZCBpbnQgbWVtZmxhZ3M7XG4gXHRzdHJ1Y3QgaW9jICppb2M7XG4gXHR1NjQgdVtOUl9JX0xDT0VGU107XG4tXHRib29sIHVzZXI7XG4mIzQzO1x0Ym9vbCB1c2VyLCBicGY7XG4gXHRjaGFyICpib2R5LCAqcDtcbiBcdGludCByZXQ7XG4gXG5AQCAtMzUxMiw2ICYjNDM7MzUzNyw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHRzcGluX2xvY2tfaXJxKFx1MDAyNmlvYy1cdTAwM2Vsb2NrKTtcbiBcdG1lbWNweSh1LCBpb2MtXHUwMDNlcGFyYW1zLmlfbGNvZWZzLCBzaXplb2YodSkpO1xuIFx0dXNlciA9IGlvYy1cdTAwM2V1c2VyX2Nvc3RfbW9kZWw7XG4mIzQzO1x0YnBmID0gaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsO1xuIFxuIFx0cmV0ID0gLUVJTlZBTDtcbiBcbkBAIC0zNTI3LDExICYjNDM7MzU1MywyMCBAQCBzdGF0aWMgc3NpemVfdCBpb2NfY29zdF9tb2RlbF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmlucHV0LFxuIFx0XHRzd2l0Y2ggKG1hdGNoX3Rva2VuKHAsIGNvc3RfY3RybF90b2tlbnMsIGFyZ3MpKSB7XG4gXHRcdGNhc2UgQ09TVF9DVFJMOlxuIFx0XHRcdG1hdGNoX3N0cmxjcHkoYnVmLCBcdTAwMjZhcmdzWzBdLCBzaXplb2YoYnVmKSk7XG4tXHRcdFx0aWYgKCFzdHJjbXAoYnVmLCBcJiMzNDthdXRvXCYjMzQ7KSlcbiYjNDM7XHRcdFx0aWYgKCFzdHJjbXAoYnVmLCBcJiMzNDthdXRvXCYjMzQ7KSkge1xuIFx0XHRcdFx0dXNlciA9IGZhbHNlO1xuLVx0XHRcdGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcJiMzNDt1c2VyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0XHRicGYgPSBmYWxzZTtcbiYjNDM7XHRcdFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7dXNlclwmIzM0OykpIHtcbiBcdFx0XHRcdHVzZXIgPSB0cnVlO1xuLVx0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRicGYgPSBmYWxzZTtcbiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZcbiYjNDM7XHRcdFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7YnBmXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRcdGlmICghaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKCkpXG4mIzQzO1x0XHRcdFx0XHRnb3RvIHVubG9jaztcbiYjNDM7XHRcdFx0XHR1c2VyID0gZmFsc2U7XG4mIzQzO1x0XHRcdFx0YnBmID0gdHJ1ZTtcbiYjNDM7I2VuZGlmXG4mIzQzO1x0XHRcdH0gZWxzZVxuIFx0XHRcdFx0Z290byB1bmxvY2s7XG4gXHRcdFx0Y29udGludWU7XG4gXHRcdGNhc2UgQ09TVF9NT0RFTDpcbkBAIC0zNTU2LDYgJiM0MzszNTkxLDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCxcbiBcdH0gZWxzZSB7XG4gXHRcdGlvYy1cdTAwM2V1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTtcbiBcdH1cbiYjNDM7XHRXUklURV9PTkNFKGlvYy1cdTAwM2VicGZfY29zdF9tb2RlbCwgYnBmKTtcbiBcdGlvY19yZWZyZXNoX3BhcmFtcyhpb2MsIHRydWUpO1xuIFxuIFx0cmV0ID0gMDtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBiL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzExMWI1YzAzZGMzNlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmhcbkBAIC0wLDAgJiM0MzsxLDU2IEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOyNpZm5kZWYgX0xJTlVYX0JMS19JT0NPU1RfSFxuJiM0MzsjZGVmaW5lIF9MSU5VWF9CTEtfSU9DT1NUX0hcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBQbHVnZ2FibGUgY29zdCBtb2RlbCBpbnRlcmZhY2UgZm9yIGJsay1pb2Nvc3QuXG4mIzQzOyAqXG4mIzQzOyAqIEEgQlBGIHN0cnVjdF9vcHMgaW1wbGVtZW50YXRpb24gcmVnaXN0ZXJlZCBhZ2FpbnN0IFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDtcbiYjNDM7ICogcmVwbGFjZXMgdGhlIGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGhcbiYjNDM7ICogXCYjMzQ7Y3RybD1icGZcJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLiAgVGhlIG1vZGVsIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiB0aGVcbiYjNDM7ICogYXJndW1lbnRzIGJlbG93IGFuZCByZXR1cm5zIHRoZSBjb3N0IG9mIHRoZSBJTyBpbiBkZXZpY2UgdGltZSB1bml0cyxcbiYjNDM7ICogd2hlcmUgMSBzZWNvbmQgb2YgZGV2aWNlIHRpbWUgZXF1YWxzIDJeMzcgKFZUSU1FX1BFUl9TRUMpLiAgVGhlXG4mIzQzOyAqIHJldHVybmVkIHZhbHVlIGlzIGNsYW1wZWQgYnkgdGhlIGtlcm5lbC4gIEEgY29zdCBvZiAwIGRlbGVnYXRlcyB0aGVcbiYjNDM7ICogSU8gYmFjayB0byB0aGUgYnVpbHRpbiBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIGRvZXMgbm90IGhhbmRsZSBhXG4mIzQzOyAqIGdpdmVuIElPIHR5cGUgY2Fubm90IG1ha2UgaXQgZnJlZS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGlvY2dfaWQgYXJndW1lbnQgaWRlbnRpZmllcyB0aGUgaXNzdWluZyBjZ3JvdXAgKGNzcyBpZCkgc28gdGhlXG4mIzQzOyAqIG1vZGVsIGNhbiBrZWVwIHBlci1jZ3JvdXAgc3RhdGUsIGUuZy4gZm9yIG11bHRpLXN0cmVhbSBzZXF1ZW50aWFsaXR5XG4mIzQzOyAqIGRldGVjdGlvbi4gIFRoZSBpZCBpcyBvbmx5IHZhbGlkIHdoaWxlIHRoZSBjZ3JvdXAgZXhpc3RzOiBjc3MgaWRzIGFyZVxuJiM0MzsgKiByZWN5Y2xlZCBvbmNlIHRoZSBjZ3JvdXAgaXMgcmVtb3ZlZCwgc28gbW9kZWxzIG11c3QgdHJlYXQgaXQgYXMgYVxuJiM0MzsgKiB0cmFuc2llbnQga2V5IGFuZCByZXNldCBzdGF0ZSB3aGVuIHRoZXkgb2JzZXJ2ZSBpdCByZXVzZWQuICBXaGV0aGVyXG4mIzQzOyAqIHRoZSBpbnRlcmZhY2UgbmVlZHMgYSByZWxlYXNlKGlvY2dfaWQpIGNhbGxiYWNrIGZvciBzdGF0ZSBjbGVhbnVwIGlzXG4mIzQzOyAqIGFuIG9wZW4gcXVlc3Rpb24uXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBtb2RlbCBpcyBjYWxsZWQgZnJvbSB0aGUgSU8gc3VibWlzc2lvbiBwYXRoIHVuZGVyIFJDVSBhbmQgbXVzdFxuJiM0MzsgKiBub3Qgc2xlZXAuICBPbmx5IHRoZSBiaW8tbGV2ZWwgY2hhcmdpbmcgcGF0aCBjb25zdWx0cyB0aGUgbW9kZWw7XG4mIzQzOyAqIHRoZSByZXF1ZXN0LWxldmVsIHNpemluZyBwYXRoIChjYWxjX3NpemVfdnRpbWVfY29zdCgpKSBrZWVwcyB1c2luZ1xuJiM0MzsgKiB0aGUgYnVpbHRpbiBmb3JtdWxhLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOy8qIGZsYWdzIGZvciBjYWxjX2Nvc3QoKSAqL1xuJiM0MzsjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVx0LyogY2FsbGVkIGZyb20gbWVyZ2UgcGF0aCAqL1xuJiM0MztcbiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMge1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQG9wOlx0XHRSRVFfT1BfKiB2YWx1ZSAodWFwaSBibGtfb3BmLmgpXG4mIzQzO1x0ICogQG5ieXRlczpcdElPIHNpemUgaW4gYnl0ZXNcbiYjNDM7XHQgKiBAc2VjdG9yOlx0c3RhcnRpbmcgc2VjdG9yXG4mIzQzO1x0ICogQGN1cnNvcjpcdGlvY2cgY3Vyc29yIHNlY3RvciwgMCBpZiBub25lIChzZXF1ZW50aWFsaXR5IGhpbnQpXG4mIzQzO1x0ICogQGlvY2dfaWQ6XHRjc3MgaWQgb2YgdGhlIGlzc3VpbmcgY2dyb3VwXG4mIzQzO1x0ICogQGZsYWdzOlx0SU9DT1NUX0NPU1RfRl8qXG4mIzQzO1x0ICovXG4mIzQzO1x0dTY0ICgqY2FsY19jb3N0KSh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsIHU2NCBjdXJzb3IsXG4mIzQzO1x0XHRcdCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2Jvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuJiM0MztcdFx0XHQgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApO1xuJiM0Mztib29sIGlvY29zdF9icGZfbW9kZWxfcmVnaXN0ZXJlZCh2b2lkKTtcbiYjNDM7XG4mIzQzOyNlbmRpZlx0LyogQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRiAqL1xuJiM0MzsjZW5kaWZcdC8qIF9MSU5VWF9CTEtfSU9DT1NUX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXG5pbmRleCBlNzcyYjFiYzYwZDYwLi4yYjlmZjM0OGE0ZjUxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXG5AQCAtMTc4LDYgJiM0MzsxNzgsNDYgQEAgVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY192cmF0ZV9hZGosXG4gXHQpXG4gKTtcbiBcbiYjNDM7LypcbiYjNDM7ICogUGVyaW9kaWMgcGVyLWRldmljZSBzdW1tYXJ5LCBlbWl0dGVkIG9uY2UgcGVyIHBlcmlvZCBmcm9tIHRoZSB0YWlsIG9mXG4mIzQzOyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5XG4mIzQzOyAqIHBlcmlvZCB0aGUgY29udHJvbGxlciBpcyBydW5uaW5nLCBpbmNsdWRpbmcgc3RlYWR5IHN0YXRlcywgYW5kIGNhcnJpZXNcbiYjNDM7ICogdGhlIG92ZXJhbGwgY29udHJvbGxlciBzdGF0ZSBzbyBiYXNpYyBtb25pdG9yaW5nIGRvZXNuJiMzOTt0IHJlcXVpcmUgZHJnbi5cbiYjNDM7ICovXG4mIzQzO1RSQUNFX0VWRU5UKGlvY29zdF9pb2NfdGljayxcbiYjNDM7XG4mIzQzO1x0VFBfUFJPVE8oc3RydWN0IGlvYyAqaW9jLCBpbnQgbnJfYWN0aXZlLCB1NjQgdXNhZ2VfdXNfc3VtKSxcbiYjNDM7XG4mIzQzO1x0VFBfQVJHUyhpb2MsIG5yX2FjdGl2ZSwgdXNhZ2VfdXNfc3VtKSxcbiYjNDM7XG4mIzQzO1x0VFBfU1RSVUNUX19lbnRyeSAoXG4mIzQzO1x0XHRfX3N0cmluZyhkZXZuYW1lLCBpb2NfbmFtZShpb2MpKVxuJiM0MztcdFx0X19maWVsZCh1MzIsIHBlcmlvZF91cylcbiYjNDM7XHRcdF9fZmllbGQodTY0LCB2cmF0ZSlcbiYjNDM7XHRcdF9fZmllbGQoaW50LCBidXN5X2xldmVsKVxuJiM0MztcdFx0X19maWVsZChpbnQsIG5yX2FjdGl2ZSlcbiYjNDM7XHRcdF9fZmllbGQodTMyLCB1c2FnZV9wY3QpXG4mIzQzO1x0XHRfX2ZpZWxkKGludCwgcnVubmluZylcbiYjNDM7XHQpLFxuJiM0MztcbiYjNDM7XHRUUF9mYXN0X2Fzc2lnbihcbiYjNDM7XHRcdF9fYXNzaWduX3N0cihkZXZuYW1lKTtcbiYjNDM7XHRcdF9fZW50cnktXHUwMDNlcGVyaW9kX3VzID0gaW9jLVx1MDAzZXBlcmlvZF91cztcbiYjNDM7XHRcdF9fZW50cnktXHUwMDNldnJhdGUgPSBpb2MtXHUwMDNldnRpbWVfYmFzZV9yYXRlO1xuJiM0MztcdFx0X19lbnRyeS1cdTAwM2VidXN5X2xldmVsID0gaW9jLVx1MDAzZWJ1c3lfbGV2ZWw7XG4mIzQzO1x0XHRfX2VudHJ5LVx1MDAzZW5yX2FjdGl2ZSA9IG5yX2FjdGl2ZTtcbiYjNDM7XHRcdF9fZW50cnktXHUwMDNldXNhZ2VfcGN0ID0gaW9jLVx1MDAzZXBlcmlvZF91cyA/XG4mIzQzO1x0XHRcdGRpdl91NjQodXNhZ2VfdXNfc3VtICogMTAwLCBpb2MtXHUwMDNlcGVyaW9kX3VzKSA6IDA7XG4mIzQzO1x0XHRfX2VudHJ5LVx1MDAzZXJ1bm5pbmcgPSBpb2MtXHUwMDNlcnVubmluZztcbiYjNDM7XHQpLFxuJiM0MztcbiYjNDM7XHRUUF9wcmludGsoXCYjMzQ7WyVzXSBwZXJpb2Q9JXV1cyB2cmF0ZT0lbGx1IGJ1c3k9JWQgYWN0aXZlPSVkIHVzYWdlPSV1JSUgcnVubmluZz0lZFwmIzM0OyxcbiYjNDM7XHRcdF9fZ2V0X3N0cihkZXZuYW1lKSwgX19lbnRyeS1cdTAwM2VwZXJpb2RfdXMsIF9fZW50cnktXHUwMDNldnJhdGUsXG4mIzQzO1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwsIF9fZW50cnktXHUwMDNlbnJfYWN0aXZlLCBfX2VudHJ5LVx1MDAzZXVzYWdlX3BjdCxcbiYjNDM7XHRcdF9fZW50cnktXHUwMDNlcnVubmluZ1xuJiM0MztcdClcbiYjNDM7KTtcbiYjNDM7XG4gVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY2dfZm9yZ2l2ZV9kZWJ0LFxuIFxuIFx0VFBfUFJPVE8oc3RydWN0IGlvY19ncSAqaW9jZywgY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGlvY19ub3cgKm5vdyxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmMxNDlmM2NkMjQzYVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmNcbkBAIC0wLDAgJiM0MzsxLDE1NSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aW9jb3N0X21vZGVsLnNrZWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtpb2Nvc3RfbXMuc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBTd2l0Y2ggYSBkZXZpY2UgdG8gY3RybD1icGYgdGhyb3VnaCBpby5jb3N0Lm1vZGVsIGFuZCB2ZXJpZnkgdGhlXG4mIzQzOyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy5cbiYjNDM7ICogU2hhcmVkIGJ5IHRoZSBleGFtcGxlLW1vZGVsIHRlc3RzIGJlbG93LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldilcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFtdID0gXCYjMzQ7L3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFwmIzM0OztcbiYjNDM7XHRjaGFyIHdvcmRbMjU2XSwgbGluZVsyNTZdLCBidWZbMzAwXTtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XHRpbnQgZXJyLCBmb3VuZCA9IDA7XG4mIzQzO1xuJiM0MztcdGZwID0gZm9wZW4ocGF0aCwgXCYjMzQ7ciYjNDM7XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWZwKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7b3BlbiAlczogJXNcJiMzNDssIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbiYjNDM7XHRcdGlmIChzc2NhbmYobGluZSwgXCYjMzQ7JTI1NXNcJiMzNDssIHdvcmQpID09IDEgXHUwMDI2XHUwMDI2ICFzdHJjbXAod29yZCwgZGV2KSkge1xuJiM0MztcdFx0XHRmb3VuZCA9IDE7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRpZiAoIWZvdW5kKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7JXMgaGFzIG5vIGlvY29zdCBsaW5lXCYjMzQ7LCBkZXYpO1xuJiM0MztcdFx0ZmNsb3NlKGZwKTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwmIzM0OyVzIGN0cmw9YnBmXCYjMzQ7LCBkZXYpO1xuJiM0MztcdGVyciA9IGZwcmludGYoZnAsIFwmIzM0OyVzXFxuXCYjMzQ7LCBidWYpO1xuJiM0MztcdGlmIChlcnIgXHUwMDNjPSAwKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7d3JpdGUgY3RybD1icGYgZmFpbGVkXCYjMzQ7KTtcbiYjNDM7XHRcdGZjbG9zZShmcCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGZmbHVzaChmcCk7XG4mIzQzO1xuJiM0MztcdHJld2luZChmcCk7XG4mIzQzO1x0Zm91bmQgPSAwO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xuJiM0MztcdFx0aWYgKHNzY2FuZihsaW5lLCBcJiMzNDslMjU1c1wmIzM0Oywgd29yZCkgPT0gMSBcdTAwMjZcdTAwMjYgIXN0cmNtcCh3b3JkLCBkZXYpKSB7XG4mIzQzO1x0XHRcdGZvdW5kID0gc3Ryc3RyKGxpbmUsIFwmIzM0O2N0cmw9YnBmXCYjMzQ7KSAhPSBOVUxMO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFmb3VuZClcbiYjNDM7XHRcdFRIX0xPRyhcJiMzNDtyZWFkYmFjayBkb2VzIG5vdCBzaG93IGN0cmw9YnBmXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZnByaW50ZihmcCwgXCYjMzQ7JXMgY3RybD1hdXRvXFxuXCYjMzQ7LCBkZXYpO1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGZvdW5kID8gMCA6IC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRGSUxFICpmcCA9IGZvcGVuKFwmIzM0Oy9zeXMvZnMvY2dyb3VwL2lvLmNvc3QucW9zXCYjMzQ7LCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZwKVxuJiM0MztcdFx0ZmNsb3NlKGZwKTtcbiYjNDM7XHRyZXR1cm4gZnAgIT0gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUmVnaXN0ZXIgdGhlIGV4YW1wbGUgY29zdCBtb2RlbCBhbmQgc3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmLlxuJiM0MzsgKiBJTyBhY2NvdW50aW5nIGl0c2VsZiBpcyBub3QgY2hlY2tlZCBoZXJlOyBpdCBuZWVkcyBhIGRldmljZSBkb2luZ1xuJiM0MzsgKiByZWFsIElPIHVuZGVyIGlvY29zdCBhbmQgaXMgY292ZXJlZCBieSB0aGUga2VybmVsLXNpZGUgdmFsaWRhdGlvblxuJiM0MzsgKiBkZXNjcmliZWQgaW4gdGhlIGNvdmVyIGxldHRlci5cbiYjNDM7ICpcbiYjNDM7ICogUmVxdWlyZXMgcm9vdCwgY2dyb3VwIHYyIGFuZCBhIGRldmljZSB3aXRoIGlvY29zdCBzdXBwb3J0LiAgVGhlXG4mIzQzOyAqIGRldmljZSBtdXN0IGJlIGdpdmVuIGFzIG1ham9yOm1pbm9yIGluICRJT0NPU1RfVEVTVF9ERVYsIG90aGVyd2lzZVxuJiM0MzsgKiB0aGUgdGVzdCBpcyBza2lwcGVkLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCBzZXJpYWxfdGVzdF9pb2Nvc3RfbW9kZWwodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpb2Nvc3RfbW9kZWwgKnNrZWw7XG4mIzQzO1x0Y2hhciB3b3JkWzI1Nl0sICpkZXY7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0ZGV2ID0gZ2V0ZW52KFwmIzM0O0lPQ09TVF9URVNUX0RFVlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHtcbiYjNDM7XHRcdHRlc3RfX3NraXAoKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcJiMzNDtpb2Nvc3RfbW91bnRlZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdC8qIG5lZ2F0aXZlOiBjdHJsPWJwZiBtdXN0IGJlIHJlamVjdGVkIHdoaWxlIG5vIG1vZGVsIGlzXG4mIzQzO1x0ICogcmVnaXN0ZXJlZCwgc28gYSB0eXBvIGNhbm5vdCBzaWxlbnRseSBkaXNhYmxlIGNvc3QgbW9kZWxcbiYjNDM7XHQgKiB1cGRhdGVzICovXG4mIzQzO1x0aWYgKHNzY2FuZihkZXYsIFwmIzM0OyUyNTVzXCYjMzQ7LCB3b3JkKSAhPSAxKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHtcbiYjNDM7XHRcdGNoYXIgcGF0aFtdID0gXCYjMzQ7L3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFwmIzM0OztcbiYjNDM7XHRcdGNoYXIgYnVmWzMwMF07XG4mIzQzO1x0XHRGSUxFICpmcCA9IGZvcGVuKHBhdGgsIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwmIzM0OyVzIGN0cmw9YnBmXFxuXCYjMzQ7LCB3b3JkKTtcbiYjNDM7XHRcdGVyciA9IDA7XG4mIzQzO1x0XHRpZiAoZnApIHtcbiYjNDM7XHRcdFx0ZXJyID0gZnByaW50ZihmcCwgXCYjMzQ7JXNcJiMzNDssIGJ1ZikgXHUwMDNjPSAwO1xuJiM0MztcdFx0XHRmY2xvc2UoZnApO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0QVNTRVJUX1RSVUUoZXJyLCBcJiMzNDtjdHJsX2JwZl93aXRob3V0X21vZGVsX3JlamVjdGVkXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBpb2Nvc3RfbW9kZWxfX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7c2tlbF9vcGVuX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHQvKiBhdHRhY2hpbmcgdGhlIHN0cnVjdF9vcHMgcmVnaXN0ZXJzIHRoZSBtb2RlbDsgYSBzZWNvbmRcbiYjNDM7XHQgKiByZWdpc3RyYXRpb24gb2YgdGhlIHNhbWUgb3BzIHdvdWxkIGZhaWwgd2l0aCBFQlVTWSAqL1xuJiM0MztcdGVyciA9IGlvY29zdF9tb2RlbF9fYXR0YWNoKHNrZWwpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZXJyLCBcJiMzNDthdHRhY2hcJiMzNDspKVxuJiM0MztcdFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXCYjMzQ7c3dpdGNoX2FuZF9yZWFkYmFja1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlvY29zdF9tb2RlbF9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2FtZSBjaGVjayBmb3IgdGhlIG11bHRpLXN0cmVhbSBleGFtcGxlIG1vZGVsLiAgT25seSBvbmUgbW9kZWwgY2FuXG4mIzQzOyAqIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lLCBzbyB0aGlzIHRlc3QgbXVzdCBydW4gc2VwYXJhdGVseSBmcm9tXG4mIzQzOyAqIHRlc3RfaW9jb3N0X21vZGVsOyBib3RoIGFyZSBzZXJpYWwuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbF9zdHJlYW1zKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgaW9jb3N0X21zICpza2VsO1xuJiM0MztcdGNoYXIgKmRldjtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRkZXYgPSBnZXRlbnYoXCYjMzQ7SU9DT1NUX1RFU1RfREVWXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWRldiB8fCBnZXRldWlkKCkgIT0gMCkge1xuJiM0MztcdFx0dGVzdF9fc2tpcCgpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIUFTU0VSVF9UUlVFKGRldl9oYXNfaW9jb3N0KCksIFwmIzM0O2lvY29zdF9tb3VudGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGlvY29zdF9tc19fb3Blbl9hbmRfbG9hZCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtza2VsX29wZW5fbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IGlvY29zdF9tc19fYXR0YWNoKHNrZWwpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZXJyLCBcJiMzNDthdHRhY2hcJiMzNDspKVxuJiM0MztcdFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXCYjMzQ7c3dpdGNoX2FuZF9yZWFkYmFja1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlvY29zdF9tc19fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmFcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCAmIzQzOzEsOTEgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbiYjNDM7LypcbiYjNDM7ICogRXhhbXBsZSBpb2Nvc3QgY29zdCBtb2RlbDogdGhlIGJ1aWx0aW4gbGluZWFyIEhERCBmb3JtdWxhIHdpdGggYWxsXG4mIzQzOyAqIGNvc3RzIGRvdWJsZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBjb25zdGFudHMgbWlycm9yIHdoYXQgY2FsY19sY29lZnMoKSBkZXJpdmVzIGZyb20gdGhlIEFVVE9QX0hERFxuJiM0MzsgKiBkZWZhdWx0cyAocmJwcz0xNzQwMTkxNzYgcnNlcWlvcHM9NDE3MDggcnJhbmRpb3BzPTM3MCwgdy1zaWRlXG4mIzQzOyAqIGFuYWxvZykgaW4gdnRpbWUgdW5pdHMgd2hlcmUgMXMgPT0gMl4zNywgZXhwcmVzc2VkIHdpdGggdGhlIHNhbWVcbiYjNDM7ICogcm91bmQtdXAgZGl2aXNpb25zIHNvIHRoZXkgY2Fubm90IGRyaWZ0IGZyb20gdGhlIGtlcm5lbCwgc28gYVxuJiM0MzsgKiBkZXZpY2Ugc3dpdGNoZWQgdG8gY3RybD1icGYgd2l0aCB0aGlzIG1vZGVsIHJlZ2lzdGVyZWQgY2hhcmdlc1xuJiM0MzsgKiBleGFjdGx5IHR3aWNlIHRoZSBidWlsdGluIG1vZGVsIHVuZGVyIHRoZSBzYW1lIHdvcmtsb2FkLCB3aGljaFxuJiM0MzsgKiBtYWtlcyBpdCBhIGNvbnZlbmllbnQgd2F5IHRvIHZlcmlmeSB0aGF0IGFjY291bnRpbmcgZ29lcyB0aHJvdWdoXG4mIzQzOyAqIHRoZSBCUEYgcGF0aC5cbiYjNDM7ICovXG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuJiM0MztcbiYjNDM7LyogVlRJTUVfUEVSX1NFQyBjb21lcyBmcm9tIHZtbGludXguaCAoYSBCVEYgZW51bSBjb25zdGFudCkgKi9cbiYjNDM7I2RlZmluZSBJT0NfUEFHRV9TSVpFXHRcdDQwOTZcbiYjNDM7I2RlZmluZSBJT0NfU0VDVF9UT19QQUdFX1NISUZUXHQzXHQvKiA1MTJCIHNlY3RvcnMgdG8gNGtCIHBhZ2VzICovXG4mIzQzOyNkZWZpbmUgTENPRUZfUkFORElPX1BBR0VTXHQ0MDk2XHQvKiAxNk1CIHNlZWsgdGhyZXNob2xkICovXG4mIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRVx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXG4mIzQzO1xuJiM0MzsvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcbiYjNDM7ICogY29tcGlsZSB0aW1lICovXG4mIzQzOyNkZWZpbmUgUlUoeCwgeSlcdFx0KCh4KSAvICh5KSAmIzQzOyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJCUFNcdDE3NDAxOTE3NlVMTFxuJiM0MzsjZGVmaW5lIFJTRVFJT1BTXHQ0MTcwOFVMTFxuJiM0MzsjZGVmaW5lIFJSQU5ESU9QU1x0MzcwVUxMXG4mIzQzOyNkZWZpbmUgV0JQU1x0MTc4MDc1ODY2VUxMXG4mIzQzOyNkZWZpbmUgV1NFUUlPUFNcdDQyNzA1VUxMXG4mIzQzOyNkZWZpbmUgV1JBTkRJT1BTXHQzNzhVTExcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUlBBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShSQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4mIzQzOyNkZWZpbmUgUlNFUUlPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXG4mIzQzOyNkZWZpbmUgUlJBTkRJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSlcbiYjNDM7I2RlZmluZSBXUEFHRVx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFdCUFMsIElPQ19QQUdFX1NJWkUpKSlcbiYjNDM7I2RlZmluZSBXU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcbiYjNDM7I2RlZmluZSBXUkFORElPXHQoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKVxuJiM0MztcbiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSB1NjQgYnVpbHRpbl9jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbiYjNDM7XHRcdFx0XHRcdHU2NCBjdXJzb3IsIHU2NCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHU2NCBwYWdlcywgc2Vla19wYWdlcyA9IDAsIGJhc2UsIGNvZWZfcGFnZTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFuYnl0ZXMpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChvcCkge1xuJiM0MztcdGNhc2UgUkVRX09QX1JFQUQ6XG4mIzQzO1x0XHRiYXNlID0gUlNFUUlPO1xuJiM0MztcdFx0Y29lZl9wYWdlID0gUlBBR0U7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFJFUV9PUF9XUklURTpcbiYjNDM7XHRcdGJhc2UgPSBXU0VRSU87XG4mIzQzO1x0XHRjb2VmX3BhZ2UgPSBXUEFHRTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjdXJzb3IpIHtcbiYjNDM7XHRcdHNlZWtfcGFnZXMgPSBzZWN0b3IgXHUwMDNlIGN1cnNvciA/IHNlY3RvciAtIGN1cnNvclxuJiM0MztcdFx0XHRcdFx0ICAgICA6IGN1cnNvciAtIHNlY3RvcjtcbiYjNDM7XHRcdHNlZWtfcGFnZXMgXHUwMDNlXHUwMDNlPSBJT0NfU0VDVF9UT19QQUdFX1NISUZUO1xuJiM0MztcdFx0aWYgKHNlZWtfcGFnZXMgXHUwMDNlIExDT0VGX1JBTkRJT19QQUdFUylcbiYjNDM7XHRcdFx0YmFzZSA9IChvcCA9PSBSRVFfT1BfUkVBRCkgPyBSUkFORElPIDogV1JBTkRJTztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHBhZ2VzID0gUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKTtcbiYjNDM7XHRpZiAoZmxhZ3MgXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpXG4mIzQzO1x0XHRiYXNlID0gMDtcbiYjNDM7XHRyZXR1cm4gYmFzZSAmIzQzOyBwYWdlcyAqIGNvZWZfcGFnZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N0cnVjdF9vcHNcJiMzNDspXG4mIzQzO3U2NCBCUEZfUFJPRyhpb2Nvc3RfMnhfY2FsY19jb3N0LCB1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4mIzQzO1x0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDIgKiBidWlsdGluX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGZsYWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0Oy5zdHJ1Y3Rfb3BzXCYjMzQ7KVxuJiM0MztzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfMnggPSB7XG4mIzQzO1x0LmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0XzJ4X2NhbGNfY29zdCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40NjVmZDVkNWM2MmUwXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmNcbkBAIC0wLDAgJiM0MzsxLDEyMiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuJiM0MzsvKlxuJiM0MzsgKiBFeGFtcGxlIG11bHRpLXN0cmVhbSBzZXF1ZW50aWFsaXR5IGRldGVjdGlvbiBjb3N0IG1vZGVsLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgYnVpbHRpbiBtb2RlbCBrZWVwcyBhIHNpbmdsZSBjdXJzb3IgcGVyIGNncm91cCwgc28gdHdvXG4mIzQzOyAqIGludGVybGVhdmVkIHNlcXVlbnRpYWwgcmVhZGVycyBpbiBvbmUgY2dyb3VwIGFyZSBhbGwgcHJpY2VkIHJhbmRvbVxuJiM0MzsgKiAobWVhc3VyZWQgODl4IG92ZXJjaGFyZ2UsIDEyLjl4IHRocm91Z2hwdXQgY29sbGFwc2UpLCB3aGlsZSByYW5kb21cbiYjNDM7ICogSU8gaW5zaWRlIGEgaG90IHdpbmRvdyBzbWFsbGVyIHRoYW4gdGhlIDE2TUIgc2VlayB0aHJlc2hvbGQgaXNcbiYjNDM7ICogcHJpY2VkIHNlcXVlbnRpYWwgKG1lYXN1cmVkIDEwN3ggdW5kZXJjaGFyZ2UpLiAgVGhpcyBtb2RlbCByZXBsYWNlc1xuJiM0MzsgKiB0aGUgc2luZ2xlIGN1cnNvciB3aXRoIGEgcGVyLWNncm91cCB0YWJsZSBvZiBzdHJlYW0gc2xvdHMsIGtleWVkIGJ5XG4mIzQzOyAqIHRoZSBpb2NnX2lkIGFyZ3VtZW50OiBhbiBJTyBpcyBzZXF1ZW50aWFsIGlmZiBpdHMgc2VjdG9yIG1hdGNoZXMgdGhlXG4mIzQzOyAqIGV4cGVjdGVkIG5leHQgc2VjdG9yIG9mIGFueSB0cmFja2VkIHN0cmVhbS4gIEludGVybGVhdmVkIHN0cmVhbXNcbiYjNDM7ICoga2VlcCB0aGVpciBvd24gc2xvdHMsIGFuZCB3aW5kb3dlZCByYW5kb20gSU8gcmFyZWx5IG1hdGNoZXMgYVxuJiM0MzsgKiBtb3ZpbmcgZXhwZWN0YXRpb24uXG4mIzQzOyAqL1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bWxpbnV4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7XG4mIzQzOy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXG4mIzQzOyNkZWZpbmUgSU9DX1BBR0VfU0laRVx0XHQ0MDk2XG4mIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRVx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXG4mIzQzO1xuJiM0MzsvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcbiYjNDM7ICogY29tcGlsZSB0aW1lICovXG4mIzQzOyNkZWZpbmUgUlUoeCwgeSlcdFx0KCh4KSAvICh5KSAmIzQzOyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJCUFNcdDE3NDAxOTE3NlVMTFxuJiM0MzsjZGVmaW5lIFJTRVFJT1BTXHQ0MTcwOFVMTFxuJiM0MzsjZGVmaW5lIFJSQU5ESU9QU1x0MzcwVUxMXG4mIzQzOyNkZWZpbmUgV0JQU1x0MTc4MDc1ODY2VUxMXG4mIzQzOyNkZWZpbmUgV1NFUUlPUFNcdDQyNzA1VUxMXG4mIzQzOyNkZWZpbmUgV1JBTkRJT1BTXHQzNzhVTExcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUlBBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShSQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4mIzQzOyNkZWZpbmUgUlNFUUlPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXG4mIzQzOyNkZWZpbmUgUlJBTkRJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSlcbiYjNDM7I2RlZmluZSBXUEFHRVx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFdCUFMsIElPQ19QQUdFX1NJWkUpKSlcbiYjNDM7I2RlZmluZSBXU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcbiYjNDM7I2RlZmluZSBXUkFORElPXHQoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKVxuJiM0MztcbiYjNDM7I2RlZmluZSBOU0xPVFNcdDRcbiYjNDM7XG4mIzQzO3N0cnVjdCBzdHJlYW1zIHtcbiYjNDM7XHRfX3U2NCBleHBlY3RlZFtOU0xPVFNdO1x0LyogbmV4dCBleHBlY3RlZCBzZWN0b3IsIHBlciBzdHJlYW0gKi9cbiYjNDM7XHRfX3U2NCBzdGFtcFtOU0xPVFNdO1x0LyogTFJVIHN0YW1wLCAwID0gZW1wdHkgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCBfX3U2NCk7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgc3RyZWFtcyk7XG4mIzQzO1x0X191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4mIzQzO30gc3RyZWFtX3RhYiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N0cnVjdF9vcHNcJiMzNDspXG4mIzQzO3U2NCBCUEZfUFJPRyhpb2Nvc3RfbXNfY2FsY19jb3N0LCB1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4mIzQzO1x0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN0cmVhbXMgKnM7XG4mIzQzO1x0dTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdztcbiYjNDM7XHR1MzIgaSwgdmljdGltID0gMCwgZm91bmQgPSAweEZGRkZGRkZGO1xuJiM0MztcbiYjNDM7XHRpZiAob3AgIT0gUkVRX09QX1JFQUQgXHUwMDI2XHUwMDI2IG9wICE9IFJFUV9PUF9XUklURSlcbiYjNDM7XHRcdHJldHVybiAwO1x0LyogZGVsZWdhdGUgdGhlIHJlc3QgdG8gYnVpbHRpbiAqL1xuJiM0MztcdGlmICghbmJ5dGVzKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGlmIChvcCA9PSBSRVFfT1BfUkVBRCkge1xuJiM0MztcdFx0cGFnZSA9IFJQQUdFOyBzZXFpbyA9IFJTRVFJTzsgcmFuZGlvID0gUlJBTkRJTztcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0cGFnZSA9IFdQQUdFOyBzZXFpbyA9IFdTRVFJTzsgcmFuZGlvID0gV1JBTkRJTztcbiYjNDM7XHR9XG4mIzQzO1x0YWR2YW5jZSA9IFJVKG5ieXRlcywgNTEyKTtcdC8qIHNlY3RvcnMgKi9cbiYjNDM7XG4mIzQzO1x0cyA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2c3RyZWFtX3RhYiwgXHUwMDI2aW9jZ19pZCk7XG4mIzQzO1x0aWYgKCFzKSB7XG4mIzQzO1x0XHRzdHJ1Y3Qgc3RyZWFtcyB6ZXJvID0ge307XG4mIzQzO1xuJiM0MztcdFx0YnBmX21hcF91cGRhdGVfZWxlbShcdTAwMjZzdHJlYW1fdGFiLCBcdTAwMjZpb2NnX2lkLCBcdTAwMjZ6ZXJvLFxuJiM0MztcdFx0XHRcdCAgICBCUEZfTk9FWElTVCk7XG4mIzQzO1x0XHRzID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZzdHJlYW1fdGFiLCBcdTAwMjZpb2NnX2lkKTtcbiYjNDM7XHRcdGlmICghcylcbiYjNDM7XHRcdFx0cmV0dXJuIHNlcWlvICYjNDM7IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZsYWdzIFx1MDAyNiBJT0NPU1RfQ09TVF9GX01FUkdFKSB7XG4mIzQzO1x0XHRiYXNlID0gMDtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bm93ID0gYnBmX2t0aW1lX2dldF9ucygpO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5TTE9UUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChzLVx1MDAzZWV4cGVjdGVkW2ldID09IHNlY3RvciBcdTAwMjZcdTAwMjYgcy1cdTAwM2VzdGFtcFtpXSkge1xuJiM0MztcdFx0XHRmb3VuZCA9IGk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRpZiAoZm91bmQgIT0gMHhGRkZGRkZGRikge1xuJiM0MztcdFx0YmFzZSA9IHNlcWlvO1xuJiM0MztcdFx0cy1cdTAwM2VleHBlY3RlZFtmb3VuZF0gPSBzZWN0b3IgJiM0MzsgYWR2YW5jZTtcbiYjNDM7XHRcdHMtXHUwMDNlc3RhbXBbZm91bmRdID0gbm93O1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRiYXNlID0gcmFuZGlvO1xuJiM0MztcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgTlNMT1RTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAocy1cdTAwM2VzdGFtcFtpXSBcdTAwM2Mgcy1cdTAwM2VzdGFtcFt2aWN0aW1dKVxuJiM0MztcdFx0XHRcdHZpY3RpbSA9IGk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzLVx1MDAzZWV4cGVjdGVkW3ZpY3RpbV0gPSBzZWN0b3IgJiM0MzsgYWR2YW5jZTtcbiYjNDM7XHRcdHMtXHUwMDNlc3RhbXBbdmljdGltXSA9IG5vdztcbiYjNDM7XHR9XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gYmFzZSAmIzQzOyBSVShuYnl0ZXMsIElPQ19QQUdFX1NJWkUpICogcGFnZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0Oy5zdHJ1Y3Rfb3BzXCYjMzQ7KVxuJiM0MztzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfbXMgPSB7XG4mIzQzO1x0LmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0X21zX2NhbGNfY29zdCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVF9CUEYmIzM0OywKICAgICYjMzQ7QkxLX0NHUk9VUF9JT0NPU1QmIzM0OywKICAgICYjMzQ7QkxLX0NHUk9VUCYjMzQ7LAogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtCUEZfSklUJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aW9jb3N0X2JwZl9jYWxjX2Nvc3QmIzM0OywKICAgICYjMzQ7YnBmX2lvY29zdF9yZWcmIzM0OywKICAgICYjMzQ7YnBmX2lvY29zdF91bnJlZyYjMzQ7LAogICAgJiMzNDtpb2NfY29zdF9tb2RlbF93cml0ZSYjMzQ7LAogICAgJiMzNDtpb2NfY29zdF9tb2RlbF9wcmZpbGwmIzM0OywKICAgICYjMzQ7Y2FsY192dGltZV9jb3N0JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdF9vcHMgc3VwcG9ydCBmb3IgcGx1Z2dhYmxlIGNvc3QgbW9kZWxzIGluIHRoZSBibG9jayBpb2Nvc3QgY2dyb3VwIGNvbnRyb2xsZXIgKENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYpLiBJdCBhZGRzIHN0cnVjdF9vcHMgcmVnaXN0cmF0aW9uL3VucmVnaXN0cmF0aW9uIGNhbGxiYWNrcywgaW50ZWdyYXRlcyBkeW5hbWljIEJQRiBjb3N0IGNhbGN1bGF0aW9uIGludG8gdGhlIGJpbyBzdWJtaXNzaW9uIHBhdGgsIGFuZCBleHRlbmRzIHRoZSBjZ3JvdXAgaW8uY29zdC5tb2RlbCBjb25maWd1cmF0aW9uIGludGVyZmFjZS4gVGhlIGNvZGUgaXMgZnVsbHkgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgY2dyb3VwcyBhbmQgdGhlIEJQRiBzdWJzeXN0ZW0uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBTZXAgOCAxMTozNTo0MyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdAppbmRleCA4ZDI2MDM3NTFjNTFhLi41NGIwNTc0Y2U1ODZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12Mi5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0CkBAIC0yMTE1LDEwICYjNDM7MjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXMKIAlhcmUgZGVmaW5lZC4KIAogCSAgPT09PT0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JICBjdHJsCQkmIzM0O2F1dG8mIzM0OyBvciAmIzM0O3VzZXImIzM0OwomIzQzOwkgIGN0cmwJCSYjMzQ7YXV0byYjMzQ7LCAmIzM0O3VzZXImIzM0OyBvciAmIzM0O2JwZiYjMzQ7CiAJICBtb2RlbAkJVGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gJiMzNDtsaW5lYXImIzM0OwogCSAgPT09PT0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKJiM0MzsJV2hlbiAmIzM0O2N0cmwmIzM0OyBpcyAmIzM0O2JwZiYjMzQ7IChvbmx5IGF2YWlsYWJsZSB3aGVuCiYjNDM7CUNPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYgaXMgZW5hYmxlZCksIGNvc3QgY2FsY3VsYXRpb24gZm9yCiYjNDM7CXRoZSBkZXZpY2UgaXMgZGlzcGF0Y2hlZCB0byB0aGUgQlBGIHByb2dyYW0gcmVnaXN0ZXJlZCBhZ2FpbnN0CiYjNDM7CXRoZSBpb2Nvc3RfbW9kZWxfb3BzIHN0cnVjdF9vcHMuICBXcml0aW5nICYjMzQ7YnBmJiMzNDsgZmFpbHMgd2l0aCAtRUlOVkFMCiYjNDM7CXVudGlsIHN1Y2ggYSBwcm9ncmFtIGlzIHJlZ2lzdGVyZWQsIGFuZCBhdCBtb3N0IG9uZSBwcm9ncmFtIGNhbgomIzQzOwliZSByZWdpc3RlcmVkIHN5c3RlbS13aWRlLiAgVGhlIG1vZGVsIGlzIGNhbGxlZCB3aXRoIHNjYWxhcgomIzQzOwlhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlCiYjNDM7CWlzc3VpbmcgY2dyb3VwLCBmbGFnczsgc2VlIGluY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGZvciB0aGVpcgomIzQzOwltZWFuaW5nKSBhbmQgcmV0dXJucyBhIGNvc3QgaW4gdnRpbWUgdW5pdHMsIGNsYW1wZWQgYnkgdGhlIGtlcm5lbAomIzQzOwl0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlcwomIzQzOwl0aGUgSU8gYmFjayB0byB0aGUgYnVpbHRpbiBsaW5lYXIgZm9ybXVsYSwgc28gYSBtb2RlbCB3aGljaCBvbmx5CiYjNDM7CWhhbmRsZXMgc29tZSBJTyB0eXBlcyBjYW5ub3QgbWFrZSB0aGUgcmVzdCBmcmVlLiAgRGV2aWNlcyB3aGljaAomIzQzOwlkb24mIzM5O3Qgb3B0IGluIGtlZXAgdGhlIGJ1aWx0aW4gbGluZWFyIG1vZGVsIHVuY2hhbmdlZC4KJiM0MzsKIAlXaGVuICYjMzQ7Y3RybCYjMzQ7IGlzICYjMzQ7YXV0byYjMzQ7LCB0aGUga2VybmVsIG1heSBjaGFuZ2UgYWxsIHBhcmFtZXRlcnMKIAlkeW5hbWljYWxseS4gIFdoZW4gJiMzNDtjdHJsJiMzNDsgaXMgc2V0IHRvICYjMzQ7dXNlciYjMzQ7IG9yIGFueSBvdGhlcgogCXBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gdG8sICYjMzQ7Y3RybCYjMzQ7IGJlY29tZSAmIzM0O3VzZXImIzM0OyBhbmQgdGhlCmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCA3MGU0YTY2ZDk0MWZmLi5iZjQzYmUyMWUwMGJiIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL0tjb25maWcKQEAgLTIzMSw0ICYjNDM7MjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OCiAKIHNvdXJjZSAmIzM0O2Jsb2NrL0tjb25maWcuaW9zY2hlZCYjMzQ7CiAKJiM0Mztjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGCiYjNDM7CWJvb2wgJiMzNDtFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXImIzM0OwomIzQzOwlkZXBlbmRzIG9uIEJMS19DR1JPVVBfSU9DT1NUICZhbXA7JmFtcDsgQlBGX1NZU0NBTEwgJmFtcDsmYW1wOyBCUEZfSklUCiYjNDM7CWhlbHAKJiM0MzsJIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHJlZ2lzdGVycyB0aGUgJiMzNDtpb2Nvc3RfbW9kZWxfb3BzJiMzNDsgQlBGCiYjNDM7CSBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlCiYjNDM7CSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoCiYjNDM7CSAmIzM0O2N0cmw9YnBmJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLgomIzQzOwogZW5kaWYgIyBCTE9DSwpkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCBlN2JkMzIwZTNkNjk3Li5lZTVjZWJlZWEwMDZmIDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZQpAQCAtMzksMyAmIzQzOzM5LDQgQEAgb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTikJJiM0Mzs9IGJsay1jcnlwdG8ubyBibGstY3J5cHRvLXByb2ZpbGUubyBcCiAJCQkJCSAgIGJsay1jcnlwdG8tc3lzZnMubwogb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSykJJiM0Mzs9IGJsay1jcnlwdG8tZmFsbGJhY2subwogb2JqLSQoQ09ORklHX0JMT0NLX0hPTERFUl9ERVBSRUNBVEVEKQkmIzQzOz0gaG9sZGVyLm8KJiM0MztvYmotJChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKQkmIzQzOz0gYmxrLWlvY29zdC1icGYubwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWlvY29zdC1icGYuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMGMzNGY1NmRlZDcxZAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMKQEAgLTAsMCAmIzQzOzEsMTUyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy4KJiM0MzsgKgomIzQzOyAqIFJlZ2lzdGVycyB0aGUgJiMzNDtpb2Nvc3RfbW9kZWxfb3BzJiMzNDsgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWwKJiM0MzsgKiBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBhIHRpbWU7IGRldmljZXMgb3B0IGluIHBlci1xdWV1ZSB3aXRoCiYjNDM7ICogJiMzNDtlY2hvICRERVYgY3RybD1icGYgJmd0OyBpby5jb3N0Lm1vZGVsJiMzNDsuICBEZXZpY2VzIHdpdGhvdXQgYSByZWdpc3RlcmVkCiYjNDM7ICogbW9kZWwga2VlcCB1c2luZyB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwuCiYjNDM7ICovCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmX3ZlcmlmaWVyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ibGstaW9jb3N0LmgmZ3Q7CiYjNDM7CiYjNDM7LyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJiMzOTtzIGNoYXJnZWFibGUgY29zdCAqLwomIzQzOyNkZWZpbmUgSU9DT1NUX0JQRl9NQVhfQ09TVAkoMVVMTCAmbHQ7Jmx0OyAzNykKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzOwomIzQzOwomIzQzO3N0YXRpYyBERUZJTkVfTVVURVgoaW9jb3N0X2JwZl9yZWdfbG9jayk7CiYjNDM7c3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fcmN1ICppb2Nvc3RfYnBmX21vZGVsOwomIzQzO3N0YXRpYyBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShpb2Nvc3RfYnBmX2tleSk7CiYjNDM7CiYjNDM7Ym9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhbXA7aW9jb3N0X2JwZl9rZXkpOwomIzQzO30KJiM0MzsKJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqb3BzOwomIzQzOwl1NjQgY29zdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhbXA7aW9jb3N0X2JwZl9rZXkpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW9wcyA9IHJjdV9kZXJlZmVyZW5jZShpb2Nvc3RfYnBmX21vZGVsKTsKJiM0MzsJaWYgKCFvcHMpIHsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWNvc3QgPSBvcHMtJmd0O2NhbGNfY29zdChvcCwgbmJ5dGVzLCBzZWN0b3IsIGN1cnNvciwgaW9jZ19pZCwgZmxhZ3MpOwomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJaWYgKCFjb3N0KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkqY29zdHAgPSBtaW4oY29zdCwgSU9DT1NUX0JQRl9NQVhfQ09TVCk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdChzdHJ1Y3QgYnRmICpidGYpCiYjNDM7ewomIzQzOwlzMzIgdHlwZV9pZDsKJiM0MzsKJiM0MzsJdHlwZV9pZCA9IGJ0Zl9maW5kX2J5X25hbWVfa2luZChidGYsICYjMzQ7aW9jb3N0X21vZGVsX29wcyYjMzQ7LCBCVEZfS0lORF9TVFJVQ1QpOwomIzQzOwlpZiAodHlwZV9pZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnBmX2lvY29zdF9pbml0X21lbWJlcihjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsCiYjNDM7CQkJCSAgY29uc3Qgc3RydWN0IGJ0Zl9tZW1iZXIgKm1lbWJlciwKJiM0MzsJCQkJICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsCiYjNDM7CQkJCSAgICAgICBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLAomIzQzOwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLAomIzQzOwkJCQkgICAgICAgc3RydWN0IGJwZl9pbnNuX2FjY2Vzc19hdXggKmluZm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqCiYjNDM7YnBmX2lvY29zdF9nZXRfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQsCiYjNDM7CQkJICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0gewomIzQzOwkuZ2V0X2Z1bmNfcHJvdG8gPSBicGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvLAomIzQzOwkuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhOwomIzQzOwomIzQzOwlpZiAoIW5ld19vcHMtJmd0O2NhbGNfY29zdCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJLyogdGhlIGNhbGxlciBvbmx5IGhvbGRzIHRoZSBwZXItbWFwIGxvY2ssIHNvIHNlcmlhbGl6ZSBoZXJlICovCiYjNDM7CW11dGV4X2xvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0MzsJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsKSkKJiM0MzsJCXJldCA9IC1FQlVTWTsKJiM0MzsJZWxzZSB7CiYjNDM7CQlzdGF0aWNfYnJhbmNoX2luYygmYW1wO2lvY29zdF9icGZfa2V5KTsKJiM0MzsJCXJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBuZXdfb3BzKTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX2lvY29zdF91bnJlZyh2b2lkICprZGF0YSwgc3RydWN0IGJwZl9saW5rICpsaW5rKQomIzQzO3sKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO2lvY29zdF9icGZfcmVnX2xvY2spOwomIzQzOwlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpID09IGtkYXRhKSB7CiYjNDM7CQlyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7CiYjNDM7CQlzdGF0aWNfYnJhbmNoX2RlYygmYW1wO2lvY29zdF9icGZfa2V5KTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwKJiM0MzsJCQkJICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKQomIzQzO3sKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyA9IHsKJiM0MzsJLmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0gewomIzQzOwkudmVyaWZpZXJfb3BzID0gJmFtcDticGZfaW9jb3N0X3ZlcmlmaWVyX29wcywKJiM0MzsJLmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsCiYjNDM7CS5pbml0X21lbWJlciA9IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIsCiYjNDM7CS5yZWcgPSBicGZfaW9jb3N0X3JlZywKJiM0MzsJLnVucmVnID0gYnBmX2lvY29zdF91bnJlZywKJiM0MzsJLm5hbWUgPSAmIzM0O2lvY29zdF9tb2RlbF9vcHMmIzM0OywKJiM0MzsJLmNmaV9zdHVicyA9ICZhbXA7X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsCiYjNDM7CS5vd25lciA9IFRISVNfTU9EVUxFLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2lvY29zdF9pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoJmFtcDticGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QuYwppbmRleCAyNzQ1YmZmY2Q1ZWVmLi5hNThjMTZmY2IyOWZhIDEwMDY0NAotLS0gYS9ibG9jay9ibGstaW9jb3N0LmMKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWlvY29zdC5jCkBAIC0xNzcsNiAmIzQzOzE3Nyw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvdGltZXIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC90aW1lNjQuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wYXJzZXIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYmxrLWlvY29zdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL3NpZ25hbC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9sb2NhbC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9sb2NhbDY0LmgmZ3Q7CkBAIC00NDUsNiAmIzQzOzQ0Niw3IEBAIHN0cnVjdCBpb2MgewogCWludAkJCQlhdXRvcF9pZHg7CiAJYm9vbAkJCQl1c2VyX3Fvc19wYXJhbXM6MTsKIAlib29sCQkJCXVzZXJfY29zdF9tb2RlbDoxOwomIzQzOwlib29sCQkJCWJwZl9jb3N0X21vZGVsOwogfTsKIAogc3RydWN0IGlvY2dfcGNwdV9zdGF0IHsKQEAgLTIyMzgsNiAmIzQzOzIyNDAsNyBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogCXN0cnVjdCBpb2Nfbm93IG5vdzsKIAlMSVNUX0hFQUQoc3VycGx1c2VzKTsKIAlpbnQgbnJfZGVidG9ycywgbnJfc2hvcnRhZ2VzID0gMCwgbnJfbGFnZ2luZyA9IDA7CiYjNDM7CWludCBucl9hY3RpdmUgPSAwOwogCXU2NCB1c2FnZV91c19zdW0gPSAwOwogCXUzMiBwcG1fcnRocjsKIAl1MzIgcHBtX3d0aHI7CkBAIC0yMjc0LDYgJiM0MzsyMjc3LDggQEAgc3RhdGljIHZvaWQgaW9jX3RpbWVyX2ZuKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIAkJdTY0IHZkb25lLCB2dGltZSwgdXNhZ2VfdXM7CiAJCXUzMiBod19hY3RpdmUsIGh3X2ludXNlOwogCiYjNDM7CQlucl9hY3RpdmUmIzQzOyYjNDM7OwomIzQzOwogCQkvKgogCQkgKiBDb2xsZWN0IHVudXNlZCBhbmQgd2luZCB2dGltZSBjbG9zZXIgdG8gdm5vdyB0byBwcmV2ZW50CiAJCSAqIGlvY2dzIGZyb20gYWNjdW11bGF0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGJ1ZGdldC4KQEAgLTI0NjAsNiAmIzQzOzI0NjUsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogCQlpb2NfcmVmcmVzaF92cmF0ZShpb2MsICZhbXA7bm93KTsKIAl9CiAKJiM0MzsJdHJhY2VfaW9jb3N0X2lvY190aWNrKGlvYywgbnJfYWN0aXZlLCB1c2FnZV91c19zdW0pOwomIzQzOwogCXNwaW5fdW5sb2NrX2lycSgmYW1wO2lvYy0mZ3Q7bG9jayk7CiB9CiAKQEAgLTI1NzMsNiAmIzQzOzI1ODAsMjMgQEAgc3RhdGljIHU2NCBjYWxjX3Z0aW1lX2Nvc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLCBib29sIGlzX21lcmdlKQogewogCXU2NCBjb3N0OwogCiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYKJiM0MzsJc3RydWN0IGlvYyAqaW9jID0gaW9jZy0mZ3Q7aW9jOwomIzQzOwomIzQzOwlpZiAoUkVBRF9PTkNFKGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWwpKSB7CiYjNDM7CQl1NjQgYnBmX2Nvc3Q7CiYjNDM7CiYjNDM7CQlpZiAoaW9jb3N0X2JwZl9jYWxjX2Nvc3QoYmlvX29wKGJpbyksCiYjNDM7CQkJCQkgYmlvLSZndDtiaV9pdGVyLmJpX3NpemUsCiYjNDM7CQkJCQkgYmlvLSZndDtiaV9pdGVyLmJpX3NlY3RvciwKJiM0MzsJCQkJCSBpb2NnLSZndDtjdXJzb3IsCiYjNDM7CQkJCQkgaW9jZ190b19ibGtnKGlvY2cpLSZndDtibGtjZy0mZ3Q7Y3NzLmlkLAomIzQzOwkJCQkJIGlzX21lcmdlID8gSU9DT1NUX0NPU1RfRl9NRVJHRSA6IDAsCiYjNDM7CQkJCQkgJmFtcDticGZfY29zdCkpCiYjNDM7CQkJcmV0dXJuIGJwZl9jb3N0OwomIzQzOwl9CiYjNDM7I2VuZGlmCiYjNDM7CiAJY2FsY192dGltZV9jb3N0X2J1aWx0aW4oYmlvLCBpb2NnLCBpc19tZXJnZSwgJmFtcDtjb3N0KTsKIAlyZXR1cm4gY29zdDsKIH0KQEAgLTM0NDEsNyAmIzQzOzM0NjUsOCBAQCBzdGF0aWMgdTY0IGlvY19jb3N0X21vZGVsX3ByZmlsbChzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLAogCXNlcV9wcmludGYoc2YsICYjMzQ7JXMgY3RybD0lcyBtb2RlbD1saW5lYXIgJiMzNDsKIAkJICAgJiMzNDtyYnBzPSVsbHUgcnNlcWlvcHM9JWxsdSBycmFuZGlvcHM9JWxsdSAmIzM0OwogCQkgICAmIzM0O3dicHM9JWxsdSB3c2VxaW9wcz0lbGx1IHdyYW5kaW9wcz0lbGx1XG4mIzM0OywKLQkJICAgZG5hbWUsIGlvYy0mZ3Q7dXNlcl9jb3N0X21vZGVsID8gJiMzNDt1c2VyJiMzNDsgOiAmIzM0O2F1dG8mIzM0OywKJiM0MzsJCSAgIGRuYW1lLCBpb2MtJmd0O2JwZl9jb3N0X21vZGVsID8gJiMzNDticGYmIzM0OyA6CiYjNDM7CQkJICAgaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWwgPyAmIzM0O3VzZXImIzM0OyA6ICYjMzQ7YXV0byYjMzQ7LAogCQkgICB1W0lfTENPRUZfUkJQU10sIHVbSV9MQ09FRl9SU0VRSU9QU10sIHVbSV9MQ09FRl9SUkFORElPUFNdLAogCQkgICB1W0lfTENPRUZfV0JQU10sIHVbSV9MQ09FRl9XU0VRSU9QU10sIHVbSV9MQ09FRl9XUkFORElPUFNdKTsKIAlzcGluX3VubG9ja19pcnEoJmFtcDtpb2MtJmd0O2xvY2spOwpAQCAtMzQ4MSw3ICYjNDM7MzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsCiAJdW5zaWduZWQgaW50IG1lbWZsYWdzOwogCXN0cnVjdCBpb2MgKmlvYzsKIAl1NjQgdVtOUl9JX0xDT0VGU107Ci0JYm9vbCB1c2VyOwomIzQzOwlib29sIHVzZXIsIGJwZjsKIAljaGFyICpib2R5LCAqcDsKIAlpbnQgcmV0OwogCkBAIC0zNTEyLDYgJiM0MzszNTM3LDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCwKIAlzcGluX2xvY2tfaXJxKCZhbXA7aW9jLSZndDtsb2NrKTsKIAltZW1jcHkodSwgaW9jLSZndDtwYXJhbXMuaV9sY29lZnMsIHNpemVvZih1KSk7CiAJdXNlciA9IGlvYy0mZ3Q7dXNlcl9jb3N0X21vZGVsOwomIzQzOwlicGYgPSBpb2MtJmd0O2JwZl9jb3N0X21vZGVsOwogCiAJcmV0ID0gLUVJTlZBTDsKIApAQCAtMzUyNywxMSAmIzQzOzM1NTMsMjAgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCwKIAkJc3dpdGNoIChtYXRjaF90b2tlbihwLCBjb3N0X2N0cmxfdG9rZW5zLCBhcmdzKSkgewogCQljYXNlIENPU1RfQ1RSTDoKIAkJCW1hdGNoX3N0cmxjcHkoYnVmLCAmYW1wO2FyZ3NbMF0sIHNpemVvZihidWYpKTsKLQkJCWlmICghc3RyY21wKGJ1ZiwgJiMzNDthdXRvJiMzNDspKQomIzQzOwkJCWlmICghc3RyY21wKGJ1ZiwgJiMzNDthdXRvJiMzNDspKSB7CiAJCQkJdXNlciA9IGZhbHNlOwotCQkJZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7dXNlciYjMzQ7KSkKJiM0MzsJCQkJYnBmID0gZmFsc2U7CiYjNDM7CQkJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDt1c2VyJiMzNDspKSB7CiAJCQkJdXNlciA9IHRydWU7Ci0JCQllbHNlCiYjNDM7CQkJCWJwZiA9IGZhbHNlOwomIzQzOyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGCiYjNDM7CQkJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDticGYmIzM0OykpIHsKJiM0MzsJCQkJaWYgKCFpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQoKSkKJiM0MzsJCQkJCWdvdG8gdW5sb2NrOwomIzQzOwkJCQl1c2VyID0gZmFsc2U7CiYjNDM7CQkJCWJwZiA9IHRydWU7CiYjNDM7I2VuZGlmCiYjNDM7CQkJfSBlbHNlCiAJCQkJZ290byB1bmxvY2s7CiAJCQljb250aW51ZTsKIAkJY2FzZSBDT1NUX01PREVMOgpAQCAtMzU1Niw2ICYjNDM7MzU5MSw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsCiAJfSBlbHNlIHsKIAkJaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTsKIAl9CiYjNDM7CVdSSVRFX09OQ0UoaW9jLSZndDticGZfY29zdF9tb2RlbCwgYnBmKTsKIAlpb2NfcmVmcmVzaF9wYXJhbXMoaW9jLCB0cnVlKTsKIAogCXJldCA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBiL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjcxMTFiNWMwM2RjMzYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaApAQCAtMCwwICYjNDM7MSw1NiBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7I2lmbmRlZiBfTElOVVhfQkxLX0lPQ09TVF9ICiYjNDM7I2RlZmluZSBfTElOVVhfQkxLX0lPQ09TVF9ICiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFBsdWdnYWJsZSBjb3N0IG1vZGVsIGludGVyZmFjZSBmb3IgYmxrLWlvY29zdC4KJiM0MzsgKgomIzQzOyAqIEEgQlBGIHN0cnVjdF9vcHMgaW1wbGVtZW50YXRpb24gcmVnaXN0ZXJlZCBhZ2FpbnN0ICYjMzQ7aW9jb3N0X21vZGVsX29wcyYjMzQ7CiYjNDM7ICogcmVwbGFjZXMgdGhlIGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGgKJiM0MzsgKiAmIzM0O2N0cmw9YnBmJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLiAgVGhlIG1vZGVsIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiB0aGUKJiM0MzsgKiBhcmd1bWVudHMgYmVsb3cgYW5kIHJldHVybnMgdGhlIGNvc3Qgb2YgdGhlIElPIGluIGRldmljZSB0aW1lIHVuaXRzLAomIzQzOyAqIHdoZXJlIDEgc2Vjb25kIG9mIGRldmljZSB0aW1lIGVxdWFscyAyXjM3IChWVElNRV9QRVJfU0VDKS4gIFRoZQomIzQzOyAqIHJldHVybmVkIHZhbHVlIGlzIGNsYW1wZWQgYnkgdGhlIGtlcm5lbC4gIEEgY29zdCBvZiAwIGRlbGVnYXRlcyB0aGUKJiM0MzsgKiBJTyBiYWNrIHRvIHRoZSBidWlsdGluIGZvcm11bGEsIHNvIGEgbW9kZWwgd2hpY2ggZG9lcyBub3QgaGFuZGxlIGEKJiM0MzsgKiBnaXZlbiBJTyB0eXBlIGNhbm5vdCBtYWtlIGl0IGZyZWUuCiYjNDM7ICoKJiM0MzsgKiBUaGUgaW9jZ19pZCBhcmd1bWVudCBpZGVudGlmaWVzIHRoZSBpc3N1aW5nIGNncm91cCAoY3NzIGlkKSBzbyB0aGUKJiM0MzsgKiBtb2RlbCBjYW4ga2VlcCBwZXItY2dyb3VwIHN0YXRlLCBlLmcuIGZvciBtdWx0aS1zdHJlYW0gc2VxdWVudGlhbGl0eQomIzQzOyAqIGRldGVjdGlvbi4gIFRoZSBpZCBpcyBvbmx5IHZhbGlkIHdoaWxlIHRoZSBjZ3JvdXAgZXhpc3RzOiBjc3MgaWRzIGFyZQomIzQzOyAqIHJlY3ljbGVkIG9uY2UgdGhlIGNncm91cCBpcyByZW1vdmVkLCBzbyBtb2RlbHMgbXVzdCB0cmVhdCBpdCBhcyBhCiYjNDM7ICogdHJhbnNpZW50IGtleSBhbmQgcmVzZXQgc3RhdGUgd2hlbiB0aGV5IG9ic2VydmUgaXQgcmV1c2VkLiAgV2hldGhlcgomIzQzOyAqIHRoZSBpbnRlcmZhY2UgbmVlZHMgYSByZWxlYXNlKGlvY2dfaWQpIGNhbGxiYWNrIGZvciBzdGF0ZSBjbGVhbnVwIGlzCiYjNDM7ICogYW4gb3BlbiBxdWVzdGlvbi4KJiM0MzsgKgomIzQzOyAqIFRoZSBtb2RlbCBpcyBjYWxsZWQgZnJvbSB0aGUgSU8gc3VibWlzc2lvbiBwYXRoIHVuZGVyIFJDVSBhbmQgbXVzdAomIzQzOyAqIG5vdCBzbGVlcC4gIE9ubHkgdGhlIGJpby1sZXZlbCBjaGFyZ2luZyBwYXRoIGNvbnN1bHRzIHRoZSBtb2RlbDsKJiM0MzsgKiB0aGUgcmVxdWVzdC1sZXZlbCBzaXppbmcgcGF0aCAoY2FsY19zaXplX3Z0aW1lX2Nvc3QoKSkga2VlcHMgdXNpbmcKJiM0MzsgKiB0aGUgYnVpbHRpbiBmb3JtdWxhLgomIzQzOyAqLwomIzQzOwomIzQzOy8qIGZsYWdzIGZvciBjYWxjX2Nvc3QoKSAqLwomIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRQkoMVVMTCAmbHQ7Jmx0OyAwKQkvKiBjYWxsZWQgZnJvbSBtZXJnZSBwYXRoICovCiYjNDM7CiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgewomIzQzOwkvKgomIzQzOwkgKiBAb3A6CQlSRVFfT1BfKiB2YWx1ZSAodWFwaSBibGtfb3BmLmgpCiYjNDM7CSAqIEBuYnl0ZXM6CUlPIHNpemUgaW4gYnl0ZXMKJiM0MzsJICogQHNlY3RvcjoJc3RhcnRpbmcgc2VjdG9yCiYjNDM7CSAqIEBjdXJzb3I6CWlvY2cgY3Vyc29yIHNlY3RvciwgMCBpZiBub25lIChzZXF1ZW50aWFsaXR5IGhpbnQpCiYjNDM7CSAqIEBpb2NnX2lkOgljc3MgaWQgb2YgdGhlIGlzc3VpbmcgY2dyb3VwCiYjNDM7CSAqIEBmbGFnczoJSU9DT1NUX0NPU1RfRl8qCiYjNDM7CSAqLwomIzQzOwl1NjQgKCpjYWxjX2Nvc3QpKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgdTY0IGlvY2dfaWQsIHU2NCBmbGFncyk7CiYjNDM7fTsKJiM0MzsKJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApOwomIzQzO2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpOwomIzQzOwomIzQzOyNlbmRpZgkvKiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGICovCiYjNDM7I2VuZGlmCS8qIF9MSU5VWF9CTEtfSU9DT1NUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKaW5kZXggZTc3MmIxYmM2MGQ2MC4uMmI5ZmYzNDhhNGY1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKQEAgLTE3OCw2ICYjNDM7MTc4LDQ2IEBAIFRSQUNFX0VWRU5UKGlvY29zdF9pb2NfdnJhdGVfYWRqLAogCSkKICk7CiAKJiM0MzsvKgomIzQzOyAqIFBlcmlvZGljIHBlci1kZXZpY2Ugc3VtbWFyeSwgZW1pdHRlZCBvbmNlIHBlciBwZXJpb2QgZnJvbSB0aGUgdGFpbCBvZgomIzQzOyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5CiYjNDM7ICogcGVyaW9kIHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGluY2x1ZGluZyBzdGVhZHkgc3RhdGVzLCBhbmQgY2FycmllcwomIzQzOyAqIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3RhdGUgc28gYmFzaWMgbW9uaXRvcmluZyBkb2VzbiYjMzk7dCByZXF1aXJlIGRyZ24uCiYjNDM7ICovCiYjNDM7VFJBQ0VfRVZFTlQoaW9jb3N0X2lvY190aWNrLAomIzQzOwomIzQzOwlUUF9QUk9UTyhzdHJ1Y3QgaW9jICppb2MsIGludCBucl9hY3RpdmUsIHU2NCB1c2FnZV91c19zdW0pLAomIzQzOwomIzQzOwlUUF9BUkdTKGlvYywgbnJfYWN0aXZlLCB1c2FnZV91c19zdW0pLAomIzQzOwomIzQzOwlUUF9TVFJVQ1RfX2VudHJ5ICgKJiM0MzsJCV9fc3RyaW5nKGRldm5hbWUsIGlvY19uYW1lKGlvYykpCiYjNDM7CQlfX2ZpZWxkKHUzMiwgcGVyaW9kX3VzKQomIzQzOwkJX19maWVsZCh1NjQsIHZyYXRlKQomIzQzOwkJX19maWVsZChpbnQsIGJ1c3lfbGV2ZWwpCiYjNDM7CQlfX2ZpZWxkKGludCwgbnJfYWN0aXZlKQomIzQzOwkJX19maWVsZCh1MzIsIHVzYWdlX3BjdCkKJiM0MzsJCV9fZmllbGQoaW50LCBydW5uaW5nKQomIzQzOwkpLAomIzQzOwomIzQzOwlUUF9mYXN0X2Fzc2lnbigKJiM0MzsJCV9fYXNzaWduX3N0cihkZXZuYW1lKTsKJiM0MzsJCV9fZW50cnktJmd0O3BlcmlvZF91cyA9IGlvYy0mZ3Q7cGVyaW9kX3VzOwomIzQzOwkJX19lbnRyeS0mZ3Q7dnJhdGUgPSBpb2MtJmd0O3Z0aW1lX2Jhc2VfcmF0ZTsKJiM0MzsJCV9fZW50cnktJmd0O2J1c3lfbGV2ZWwgPSBpb2MtJmd0O2J1c3lfbGV2ZWw7CiYjNDM7CQlfX2VudHJ5LSZndDtucl9hY3RpdmUgPSBucl9hY3RpdmU7CiYjNDM7CQlfX2VudHJ5LSZndDt1c2FnZV9wY3QgPSBpb2MtJmd0O3BlcmlvZF91cyA/CiYjNDM7CQkJZGl2X3U2NCh1c2FnZV91c19zdW0gKiAxMDAsIGlvYy0mZ3Q7cGVyaW9kX3VzKSA6IDA7CiYjNDM7CQlfX2VudHJ5LSZndDtydW5uaW5nID0gaW9jLSZndDtydW5uaW5nOwomIzQzOwkpLAomIzQzOwomIzQzOwlUUF9wcmludGsoJiMzNDtbJXNdIHBlcmlvZD0ldXVzIHZyYXRlPSVsbHUgYnVzeT0lZCBhY3RpdmU9JWQgdXNhZ2U9JXUlJSBydW5uaW5nPSVkJiMzNDssCiYjNDM7CQlfX2dldF9zdHIoZGV2bmFtZSksIF9fZW50cnktJmd0O3BlcmlvZF91cywgX19lbnRyeS0mZ3Q7dnJhdGUsCiYjNDM7CQlfX2VudHJ5LSZndDtidXN5X2xldmVsLCBfX2VudHJ5LSZndDtucl9hY3RpdmUsIF9fZW50cnktJmd0O3VzYWdlX3BjdCwKJiM0MzsJCV9fZW50cnktJmd0O3J1bm5pbmcKJiM0MzsJKQomIzQzOyk7CiYjNDM7CiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsCiAKIAlUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmMKQEAgLTAsMCAmIzQzOzEsMTU1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDtpb2Nvc3RfbW9kZWwuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2lvY29zdF9tcy5za2VsLmgmIzM0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZQomIzQzOyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KJiM0MzsgKiBTaGFyZWQgYnkgdGhlIGV4YW1wbGUtbW9kZWwgdGVzdHMgYmVsb3cuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldikKJiM0Mzt7CiYjNDM7CWNoYXIgcGF0aFtdID0gJiMzNDsvc3lzL2ZzL2Nncm91cC9pby5jb3N0Lm1vZGVsJiMzNDs7CiYjNDM7CWNoYXIgd29yZFsyNTZdLCBsaW5lWzI1Nl0sIGJ1ZlszMDBdOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJaW50IGVyciwgZm91bmQgPSAwOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHBhdGgsICYjMzQ7ciYjNDM7JiMzNDspOwomIzQzOwlpZiAoIWZwKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtvcGVuICVzOiAlcyYjMzQ7LCBwYXRoLCBzdHJlcnJvcihlcnJubykpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyUyNTVzJiMzNDssIHdvcmQpID09IDEgJmFtcDsmYW1wOyAhc3RyY21wKHdvcmQsIGRldikpIHsKJiM0MzsJCQlmb3VuZCA9IDE7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKCFmb3VuZCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7JXMgaGFzIG5vIGlvY29zdCBsaW5lJiMzNDssIGRldik7CiYjNDM7CQlmY2xvc2UoZnApOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXMgY3RybD1icGYmIzM0OywgZGV2KTsKJiM0MzsJZXJyID0gZnByaW50ZihmcCwgJiMzNDslc1xuJiMzNDssIGJ1Zik7CiYjNDM7CWlmIChlcnIgJmx0Oz0gMCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7d3JpdGUgY3RybD1icGYgZmFpbGVkJiMzNDspOwomIzQzOwkJZmNsb3NlKGZwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlmZmx1c2goZnApOwomIzQzOwomIzQzOwlyZXdpbmQoZnApOwomIzQzOwlmb3VuZCA9IDA7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyUyNTVzJiMzNDssIHdvcmQpID09IDEgJmFtcDsmYW1wOyAhc3RyY21wKHdvcmQsIGRldikpIHsKJiM0MzsJCQlmb3VuZCA9IHN0cnN0cihsaW5lLCAmIzM0O2N0cmw9YnBmJiMzNDspICE9IE5VTEw7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKCFmb3VuZCkKJiM0MzsJCVRIX0xPRygmIzM0O3JlYWRiYWNrIGRvZXMgbm90IHNob3cgY3RybD1icGYmIzM0Oyk7CiYjNDM7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JXMgY3RybD1hdXRvXG4mIzM0OywgZGV2KTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGZvdW5kID8gMCA6IC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpCiYjNDM7ewomIzQzOwlGSUxFICpmcCA9IGZvcGVuKCYjMzQ7L3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5xb3MmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzOwomIzQzOwlpZiAoZnApCiYjNDM7CQlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gZnAgIT0gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZWdpc3RlciB0aGUgZXhhbXBsZSBjb3N0IG1vZGVsIGFuZCBzd2l0Y2ggYSBkZXZpY2UgdG8gY3RybD1icGYuCiYjNDM7ICogSU8gYWNjb3VudGluZyBpdHNlbGYgaXMgbm90IGNoZWNrZWQgaGVyZTsgaXQgbmVlZHMgYSBkZXZpY2UgZG9pbmcKJiM0MzsgKiByZWFsIElPIHVuZGVyIGlvY29zdCBhbmQgaXMgY292ZXJlZCBieSB0aGUga2VybmVsLXNpZGUgdmFsaWRhdGlvbgomIzQzOyAqIGRlc2NyaWJlZCBpbiB0aGUgY292ZXIgbGV0dGVyLgomIzQzOyAqCiYjNDM7ICogUmVxdWlyZXMgcm9vdCwgY2dyb3VwIHYyIGFuZCBhIGRldmljZSB3aXRoIGlvY29zdCBzdXBwb3J0LiAgVGhlCiYjNDM7ICogZGV2aWNlIG11c3QgYmUgZ2l2ZW4gYXMgbWFqb3I6bWlub3IgaW4gJElPQ09TVF9URVNUX0RFViwgb3RoZXJ3aXNlCiYjNDM7ICogdGhlIHRlc3QgaXMgc2tpcHBlZC4KJiM0MzsgKi8KJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvY29zdF9tb2RlbCAqc2tlbDsKJiM0MzsJY2hhciB3b3JkWzI1Nl0sICpkZXY7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWRldiA9IGdldGVudigmIzM0O0lPQ09TVF9URVNUX0RFViYjMzQ7KTsKJiM0MzsJaWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKGRldl9oYXNfaW9jb3N0KCksICYjMzQ7aW9jb3N0X21vdW50ZWQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qIG5lZ2F0aXZlOiBjdHJsPWJwZiBtdXN0IGJlIHJlamVjdGVkIHdoaWxlIG5vIG1vZGVsIGlzCiYjNDM7CSAqIHJlZ2lzdGVyZWQsIHNvIGEgdHlwbyBjYW5ub3Qgc2lsZW50bHkgZGlzYWJsZSBjb3N0IG1vZGVsCiYjNDM7CSAqIHVwZGF0ZXMgKi8KJiM0MzsJaWYgKHNzY2FuZihkZXYsICYjMzQ7JTI1NXMmIzM0Oywgd29yZCkgIT0gMSkKJiM0MzsJCXJldHVybjsKJiM0MzsJewomIzQzOwkJY2hhciBwYXRoW10gPSAmIzM0Oy9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWwmIzM0OzsKJiM0MzsJCWNoYXIgYnVmWzMwMF07CiYjNDM7CQlGSUxFICpmcCA9IGZvcGVuKHBhdGgsICYjMzQ7dyYjMzQ7KTsKJiM0MzsKJiM0MzsJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXMgY3RybD1icGZcbiYjMzQ7LCB3b3JkKTsKJiM0MzsJCWVyciA9IDA7CiYjNDM7CQlpZiAoZnApIHsKJiM0MzsJCQllcnIgPSBmcHJpbnRmKGZwLCAmIzM0OyVzJiMzNDssIGJ1ZikgJmx0Oz0gMDsKJiM0MzsJCQlmY2xvc2UoZnApOwomIzQzOwkJfQomIzQzOwkJQVNTRVJUX1RSVUUoZXJyLCAmIzM0O2N0cmxfYnBmX3dpdGhvdXRfbW9kZWxfcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2tlbCA9IGlvY29zdF9tb2RlbF9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtza2VsX29wZW5fbG9hZCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJLyogYXR0YWNoaW5nIHRoZSBzdHJ1Y3Rfb3BzIHJlZ2lzdGVycyB0aGUgbW9kZWw7IGEgc2Vjb25kCiYjNDM7CSAqIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc2FtZSBvcHMgd291bGQgZmFpbCB3aXRoIEVCVVNZICovCiYjNDM7CWVyciA9IGlvY29zdF9tb2RlbF9fYXR0YWNoKHNrZWwpOwomIzQzOwlpZiAoQVNTRVJUX09LKGVyciwgJiMzNDthdHRhY2gmIzM0OykpCiYjNDM7CQlBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCAmIzM0O3N3aXRjaF9hbmRfcmVhZGJhY2smIzM0Oyk7CiYjNDM7CiYjNDM7CWlvY29zdF9tb2RlbF9fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTYW1lIGNoZWNrIGZvciB0aGUgbXVsdGktc3RyZWFtIGV4YW1wbGUgbW9kZWwuICBPbmx5IG9uZSBtb2RlbCBjYW4KJiM0MzsgKiBiZSByZWdpc3RlcmVkIGF0IGEgdGltZSwgc28gdGhpcyB0ZXN0IG11c3QgcnVuIHNlcGFyYXRlbHkgZnJvbQomIzQzOyAqIHRlc3RfaW9jb3N0X21vZGVsOyBib3RoIGFyZSBzZXJpYWwuCiYjNDM7ICovCiYjNDM7dm9pZCBzZXJpYWxfdGVzdF9pb2Nvc3RfbW9kZWxfc3RyZWFtcyh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvY29zdF9tcyAqc2tlbDsKJiM0MzsJY2hhciAqZGV2OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlkZXYgPSBnZXRlbnYoJiMzNDtJT0NPU1RfVEVTVF9ERVYmIzM0Oyk7CiYjNDM7CWlmICghZGV2IHx8IGdldGV1aWQoKSAhPSAwKSB7CiYjNDM7CQl0ZXN0X19za2lwKCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCAmIzM0O2lvY29zdF9tb3VudGVkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlza2VsID0gaW9jb3N0X21zX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3NrZWxfb3Blbl9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBpb2Nvc3RfbXNfX2F0dGFjaChza2VsKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhlcnIsICYjMzQ7YXR0YWNoJiMzNDspKQomIzQzOwkJQVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgJiMzNDtzd2l0Y2hfYW5kX3JlYWRiYWNrJiMzNDspOwomIzQzOwomIzQzOwlpb2Nvc3RfbXNfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tb2RlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21vZGVsLmMKQEAgLTAsMCAmIzQzOzEsOTEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovCiYjNDM7LyoKJiM0MzsgKiBFeGFtcGxlIGlvY29zdCBjb3N0IG1vZGVsOiB0aGUgYnVpbHRpbiBsaW5lYXIgSEREIGZvcm11bGEgd2l0aCBhbGwKJiM0MzsgKiBjb3N0cyBkb3VibGVkLgomIzQzOyAqCiYjNDM7ICogVGhlIGNvbnN0YW50cyBtaXJyb3Igd2hhdCBjYWxjX2xjb2VmcygpIGRlcml2ZXMgZnJvbSB0aGUgQVVUT1BfSERECiYjNDM7ICogZGVmYXVsdHMgKHJicHM9MTc0MDE5MTc2IHJzZXFpb3BzPTQxNzA4IHJyYW5kaW9wcz0zNzAsIHctc2lkZQomIzQzOyAqIGFuYWxvZykgaW4gdnRpbWUgdW5pdHMgd2hlcmUgMXMgPT0gMl4zNywgZXhwcmVzc2VkIHdpdGggdGhlIHNhbWUKJiM0MzsgKiByb3VuZC11cCBkaXZpc2lvbnMgc28gdGhleSBjYW5ub3QgZHJpZnQgZnJvbSB0aGUga2VybmVsLCBzbyBhCiYjNDM7ICogZGV2aWNlIHN3aXRjaGVkIHRvIGN0cmw9YnBmIHdpdGggdGhpcyBtb2RlbCByZWdpc3RlcmVkIGNoYXJnZXMKJiM0MzsgKiBleGFjdGx5IHR3aWNlIHRoZSBidWlsdGluIG1vZGVsIHVuZGVyIHRoZSBzYW1lIHdvcmtsb2FkLCB3aGljaAomIzQzOyAqIG1ha2VzIGl0IGEgY29udmVuaWVudCB3YXkgdG8gdmVyaWZ5IHRoYXQgYWNjb3VudGluZyBnb2VzIHRocm91Z2gKJiM0MzsgKiB0aGUgQlBGIHBhdGguCiYjNDM7ICovCiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7LyogVlRJTUVfUEVSX1NFQyBjb21lcyBmcm9tIHZtbGludXguaCAoYSBCVEYgZW51bSBjb25zdGFudCkgKi8KJiM0MzsjZGVmaW5lIElPQ19QQUdFX1NJWkUJCTQwOTYKJiM0MzsjZGVmaW5lIElPQ19TRUNUX1RPX1BBR0VfU0hJRlQJMwkvKiA1MTJCIHNlY3RvcnMgdG8gNGtCIHBhZ2VzICovCiYjNDM7I2RlZmluZSBMQ09FRl9SQU5ESU9fUEFHRVMJNDA5NgkvKiAxNk1CIHNlZWsgdGhyZXNob2xkICovCiYjNDM7I2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFCSgxVUxMICZsdDsmbHQ7IDApCS8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi8KJiM0MzsKJiM0MzsvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXQKJiM0MzsgKiBjb21waWxlIHRpbWUgKi8KJiM0MzsjZGVmaW5lIFJVKHgsIHkpCQkoKHgpIC8gKHkpICYjNDM7ICgoKHgpICUgKHkpKSA/IDEgOiAwKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFJCUFMJMTc0MDE5MTc2VUxMCiYjNDM7I2RlZmluZSBSU0VRSU9QUwk0MTcwOFVMTAomIzQzOyNkZWZpbmUgUlJBTkRJT1BTCTM3MFVMTAomIzQzOyNkZWZpbmUgV0JQUwkxNzgwNzU4NjZVTEwKJiM0MzsjZGVmaW5lIFdTRVFJT1BTCTQyNzA1VUxMCiYjNDM7I2RlZmluZSBXUkFORElPUFMJMzc4VUxMCiYjNDM7CiYjNDM7I2RlZmluZSBSUEFHRQkoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKQomIzQzOyNkZWZpbmUgUlNFUUlPCShSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSkKJiM0MzsjZGVmaW5lIFJSQU5ESU8JKFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSkKJiM0MzsjZGVmaW5lIFdQQUdFCShSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpCiYjNDM7I2RlZmluZSBXU0VRSU8JKFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKQomIzQzOyNkZWZpbmUgV1JBTkRJTwkoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTY0IGJ1aWx0aW5fY29zdCh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsCiYjNDM7CQkJCQl1NjQgY3Vyc29yLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwl1NjQgcGFnZXMsIHNlZWtfcGFnZXMgPSAwLCBiYXNlLCBjb2VmX3BhZ2U7CiYjNDM7CiYjNDM7CWlmICghbmJ5dGVzKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXN3aXRjaCAob3ApIHsKJiM0MzsJY2FzZSBSRVFfT1BfUkVBRDoKJiM0MzsJCWJhc2UgPSBSU0VRSU87CiYjNDM7CQljb2VmX3BhZ2UgPSBSUEFHRTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJFUV9PUF9XUklURToKJiM0MzsJCWJhc2UgPSBXU0VRSU87CiYjNDM7CQljb2VmX3BhZ2UgPSBXUEFHRTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGN1cnNvcikgewomIzQzOwkJc2Vla19wYWdlcyA9IHNlY3RvciAmZ3Q7IGN1cnNvciA/IHNlY3RvciAtIGN1cnNvcgomIzQzOwkJCQkJICAgICA6IGN1cnNvciAtIHNlY3RvcjsKJiM0MzsJCXNlZWtfcGFnZXMgJmd0OyZndDs9IElPQ19TRUNUX1RPX1BBR0VfU0hJRlQ7CiYjNDM7CQlpZiAoc2Vla19wYWdlcyAmZ3Q7IExDT0VGX1JBTkRJT19QQUdFUykKJiM0MzsJCQliYXNlID0gKG9wID09IFJFUV9PUF9SRUFEKSA/IFJSQU5ESU8gOiBXUkFORElPOwomIzQzOwl9CiYjNDM7CiYjNDM7CXBhZ2VzID0gUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKTsKJiM0MzsJaWYgKGZsYWdzICZhbXA7IElPQ09TVF9DT1NUX0ZfTUVSR0UpCiYjNDM7CQliYXNlID0gMDsKJiM0MzsJcmV0dXJuIGJhc2UgJiM0MzsgcGFnZXMgKiBjb2VmX3BhZ2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N0cnVjdF9vcHMmIzM0OykKJiM0Mzt1NjQgQlBGX1BST0coaW9jb3N0XzJ4X2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLAomIzQzOwkgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwlyZXR1cm4gMiAqIGJ1aWx0aW5fY29zdChvcCwgbmJ5dGVzLCBzZWN0b3IsIGN1cnNvciwgZmxhZ3MpOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDsuc3RydWN0X29wcyYjMzQ7KQomIzQzO3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIGlvY29zdF8yeCA9IHsKJiM0MzsJLmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0XzJ4X2NhbGNfY29zdCwKJiM0Mzt9OwomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjQ2NWZkNWQ1YzYyZTAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmMKQEAgLTAsMCAmIzQzOzEsMTIyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOy8qCiYjNDM7ICogRXhhbXBsZSBtdWx0aS1zdHJlYW0gc2VxdWVudGlhbGl0eSBkZXRlY3Rpb24gY29zdCBtb2RlbC4KJiM0MzsgKgomIzQzOyAqIFRoZSBidWlsdGluIG1vZGVsIGtlZXBzIGEgc2luZ2xlIGN1cnNvciBwZXIgY2dyb3VwLCBzbyB0d28KJiM0MzsgKiBpbnRlcmxlYXZlZCBzZXF1ZW50aWFsIHJlYWRlcnMgaW4gb25lIGNncm91cCBhcmUgYWxsIHByaWNlZCByYW5kb20KJiM0MzsgKiAobWVhc3VyZWQgODl4IG92ZXJjaGFyZ2UsIDEyLjl4IHRocm91Z2hwdXQgY29sbGFwc2UpLCB3aGlsZSByYW5kb20KJiM0MzsgKiBJTyBpbnNpZGUgYSBob3Qgd2luZG93IHNtYWxsZXIgdGhhbiB0aGUgMTZNQiBzZWVrIHRocmVzaG9sZCBpcwomIzQzOyAqIHByaWNlZCBzZXF1ZW50aWFsIChtZWFzdXJlZCAxMDd4IHVuZGVyY2hhcmdlKS4gIFRoaXMgbW9kZWwgcmVwbGFjZXMKJiM0MzsgKiB0aGUgc2luZ2xlIGN1cnNvciB3aXRoIGEgcGVyLWNncm91cCB0YWJsZSBvZiBzdHJlYW0gc2xvdHMsIGtleWVkIGJ5CiYjNDM7ICogdGhlIGlvY2dfaWQgYXJndW1lbnQ6IGFuIElPIGlzIHNlcXVlbnRpYWwgaWZmIGl0cyBzZWN0b3IgbWF0Y2hlcyB0aGUKJiM0MzsgKiBleHBlY3RlZCBuZXh0IHNlY3RvciBvZiBhbnkgdHJhY2tlZCBzdHJlYW0uICBJbnRlcmxlYXZlZCBzdHJlYW1zCiYjNDM7ICoga2VlcCB0aGVpciBvd24gc2xvdHMsIGFuZCB3aW5kb3dlZCByYW5kb20gSU8gcmFyZWx5IG1hdGNoZXMgYQomIzQzOyAqIG1vdmluZyBleHBlY3RhdGlvbi4KJiM0MzsgKi8KJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsKJiM0MzsvKiBWVElNRV9QRVJfU0VDIGNvbWVzIGZyb20gdm1saW51eC5oIChhIEJURiBlbnVtIGNvbnN0YW50KSAqLwomIzQzOyNkZWZpbmUgSU9DX1BBR0VfU0laRQkJNDA5NgomIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRQkoMVVMTCAmbHQ7Jmx0OyAwKQkvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovCiYjNDM7CiYjNDM7LyogRElWNjRfVTY0X1JPVU5EX1VQIC8gRElWX1JPVU5EX1VQX1VMTCBlcXVpdmFsZW50cywgZm9sZGVkIGF0CiYjNDM7ICogY29tcGlsZSB0aW1lICovCiYjNDM7I2RlZmluZSBSVSh4LCB5KQkJKCh4KSAvICh5KSAmIzQzOyAoKCh4KSAlICh5KSkgPyAxIDogMCkpCiYjNDM7CiYjNDM7I2RlZmluZSBSQlBTCTE3NDAxOTE3NlVMTAomIzQzOyNkZWZpbmUgUlNFUUlPUFMJNDE3MDhVTEwKJiM0MzsjZGVmaW5lIFJSQU5ESU9QUwkzNzBVTEwKJiM0MzsjZGVmaW5lIFdCUFMJMTc4MDc1ODY2VUxMCiYjNDM7I2RlZmluZSBXU0VRSU9QUwk0MjcwNVVMTAomIzQzOyNkZWZpbmUgV1JBTkRJT1BTCTM3OFVMTAomIzQzOwomIzQzOyNkZWZpbmUgUlBBR0UJKFJVKFZUSU1FX1BFUl9TRUMsIFJVKFJCUFMsIElPQ19QQUdFX1NJWkUpKSkKJiM0MzsjZGVmaW5lIFJTRVFJTwkoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpCiYjNDM7I2RlZmluZSBSUkFORElPCShSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpCiYjNDM7I2RlZmluZSBXUEFHRQkoUlUoVlRJTUVfUEVSX1NFQywgUlUoV0JQUywgSU9DX1BBR0VfU0laRSkpKQomIzQzOyNkZWZpbmUgV1NFUUlPCShSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSkKJiM0MzsjZGVmaW5lIFdSQU5ESU8JKFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSkKJiM0MzsKJiM0MzsjZGVmaW5lIE5TTE9UUwk0CiYjNDM7CiYjNDM7c3RydWN0IHN0cmVhbXMgewomIzQzOwlfX3U2NCBleHBlY3RlZFtOU0xPVFNdOwkvKiBuZXh0IGV4cGVjdGVkIHNlY3RvciwgcGVyIHN0cmVhbSAqLwomIzQzOwlfX3U2NCBzdGFtcFtOU0xPVFNdOwkvKiBMUlUgc3RhbXAsIDAgPSBlbXB0eSAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTsKJiM0MzsJX190eXBlKGtleSwgX191NjQpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCBzdHJlYW1zKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCA2NCk7CiYjNDM7fSBzdHJlYW1fdGFiIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO1NFQygmIzM0O3N0cnVjdF9vcHMmIzM0OykKJiM0Mzt1NjQgQlBGX1BST0coaW9jb3N0X21zX2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLAomIzQzOwkgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RyZWFtcyAqczsKJiM0MzsJdTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdzsKJiM0MzsJdTMyIGksIHZpY3RpbSA9IDAsIGZvdW5kID0gMHhGRkZGRkZGRjsKJiM0MzsKJiM0MzsJaWYgKG9wICE9IFJFUV9PUF9SRUFEICZhbXA7JmFtcDsgb3AgIT0gUkVRX09QX1dSSVRFKQomIzQzOwkJcmV0dXJuIDA7CS8qIGRlbGVnYXRlIHRoZSByZXN0IHRvIGJ1aWx0aW4gKi8KJiM0MzsJaWYgKCFuYnl0ZXMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJaWYgKG9wID09IFJFUV9PUF9SRUFEKSB7CiYjNDM7CQlwYWdlID0gUlBBR0U7IHNlcWlvID0gUlNFUUlPOyByYW5kaW8gPSBSUkFORElPOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcGFnZSA9IFdQQUdFOyBzZXFpbyA9IFdTRVFJTzsgcmFuZGlvID0gV1JBTkRJTzsKJiM0MzsJfQomIzQzOwlhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpOwkvKiBzZWN0b3JzICovCiYjNDM7CiYjNDM7CXMgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7c3RyZWFtX3RhYiwgJmFtcDtpb2NnX2lkKTsKJiM0MzsJaWYgKCFzKSB7CiYjNDM7CQlzdHJ1Y3Qgc3RyZWFtcyB6ZXJvID0ge307CiYjNDM7CiYjNDM7CQlicGZfbWFwX3VwZGF0ZV9lbGVtKCZhbXA7c3RyZWFtX3RhYiwgJmFtcDtpb2NnX2lkLCAmYW1wO3plcm8sCiYjNDM7CQkJCSAgICBCUEZfTk9FWElTVCk7CiYjNDM7CQlzID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3N0cmVhbV90YWIsICZhbXA7aW9jZ19pZCk7CiYjNDM7CQlpZiAoIXMpCiYjNDM7CQkJcmV0dXJuIHNlcWlvICYjNDM7IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmbGFncyAmYW1wOyBJT0NPU1RfQ09TVF9GX01FUkdFKSB7CiYjNDM7CQliYXNlID0gMDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5vdyA9IGJwZl9rdGltZV9nZXRfbnMoKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5TTE9UUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChzLSZndDtleHBlY3RlZFtpXSA9PSBzZWN0b3IgJmFtcDsmYW1wOyBzLSZndDtzdGFtcFtpXSkgewomIzQzOwkJCWZvdW5kID0gaTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlpZiAoZm91bmQgIT0gMHhGRkZGRkZGRikgewomIzQzOwkJYmFzZSA9IHNlcWlvOwomIzQzOwkJcy0mZ3Q7ZXhwZWN0ZWRbZm91bmRdID0gc2VjdG9yICYjNDM7IGFkdmFuY2U7CiYjNDM7CQlzLSZndDtzdGFtcFtmb3VuZF0gPSBub3c7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQliYXNlID0gcmFuZGlvOwomIzQzOwkJZm9yIChpID0gMTsgaSAmbHQ7IE5TTE9UUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAocy0mZ3Q7c3RhbXBbaV0gJmx0OyBzLSZndDtzdGFtcFt2aWN0aW1dKQomIzQzOwkJCQl2aWN0aW0gPSBpOwomIzQzOwkJfQomIzQzOwkJcy0mZ3Q7ZXhwZWN0ZWRbdmljdGltXSA9IHNlY3RvciAmIzQzOyBhZHZhbmNlOwomIzQzOwkJcy0mZ3Q7c3RhbXBbdmljdGltXSA9IG5vdzsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJcmV0dXJuIGJhc2UgJiM0MzsgUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKSAqIHBhZ2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0Oy5zdHJ1Y3Rfb3BzJiMzNDspCiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgaW9jb3N0X21zID0gewomIzQzOwkuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LAomIzQzO307CiYjNDM7CiYjNDM7Y2hhciBMSUNFTlNFW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNDMxCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIEJQRi1CYXNlZCBJL08gQ29zdCBNb2RlbCBQYXRjaCBTZXJpZXMqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoIHNlcmllcy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGJyZWFrIGRvd24gdGhlIGNoYW5nZXMgbWV0aG9kaWNhbGx5LiBGaXJzdCwgSSBuZWVkIGEgY2xlYXIgdW5kZXJzdGFuZGluZyBvZiB3aGF0JiMzOTtzIGJlaW5nIGludHJvZHVjZWQgYW5kIG1vZGlmaWVkLiBCYXNlZCBvbiB0aGUgcGF0Y2ggc3VtbWFyeSwgaXQgbG9va3MgbGlrZSB0aGlzIGlzIGEgZm9jdXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIEJQRi1iYXNlZCBJL08gY29zdCBtb2RlbCB3aXRoaW4gdGhlIGJsb2NrIGxheWVyLCB3aGljaCBpcyBzb21ldGhpbmcgSSYjMzk7bSB2ZXJ5IGludGVyZXN0ZWQgaW4uCgpTcGVjaWZpY2FsbHksIGl0IGxvb2tzIGxpa2U6CgoxLiAgQSBuZXcgS2NvbmZpZyBvcHRpb24sIGBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGYCwgaXMgYmVpbmcgYWRkZWQgdG8gZW5hYmxlIHRoZSBmZWF0dXJlLiBHb29kLCBmaW5lLWdyYWluZWQgY29udHJvbCBpcyBhbHdheXMgYXBwcmVjaWF0ZWQuCjIuICBXZSBoYXZlIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYCwgd2hpY2ggaW1wbGllcyB0aGUgY29yZSBCUEYgaW50ZWdyYXRpb24uIFRoYXQgZmlsZSByZWdpc3RlcnMgYGlvY29zdF9tb2RlbF9vcHNgIGFzIGEgQlBGIGBzdHJ1Y3Rfb3BzYC4gTWFrZXMgc2Vuc2UuIFRoaXMgaXMgaG93IHRoZSBCUEYgY29kZSB3aWxsIGhvb2sgaW50byB0aGUgSS9PIGNvc3QgY2FsY3VsYXRpb24uCjMuICBUaGUgY2hhbmdlcyBpbiBgYmxvY2svYmxrLWlvY29zdC5jYCBhcmUgd2hlcmUgdGhlIHJ1YmJlciBtZWV0cyB0aGUgcm9hZC4gYGNhbGNfdnRpbWVfY29zdGAgaXMgbm93IHVzaW5nIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAuIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyB0aGF0IGZ1bmN0aW9uIHdvcmtzIGFuZCBpbnRlcmFjdHMgd2l0aCB0aGUgQlBGIHByb2dyYW0uIFRoZSBtb2RpZmljYXRpb24gdG8gYGlvY19jb3N0X21vZGVsX3ByZmlsbGAgYW5kIGBpb2NfY29zdF9tb2RlbF93cml0ZWAgdG8gaGFuZGxlIGBjdHJsPWJwZmAgaXMgY3J1Y2lhbCBmb3IgY29uZmlndXJpbmcgdGhlIEJQRi1iYXNlZCBtb2RlbCB2aWEgY2dyb3Vwcy4gUGx1cywgYSBuZXcgdHJhY2Vwb2ludCwgYHRyYWNlX2lvY29zdF9pb2NfdGlja2AsIGlzIGFkZGVkIHRvIGBpb2NfdGltZXJfZm5gLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgZGVidWdnaW5nIGFuZCB0cmFjaW5nLgo0LiAgQWRkaW5nIGEgaGVhZGVyIGZpbGUgYGluY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oYCBtYWtlcyBzZW5zZSwgYXMgYSByZXBvc2l0b3J5IGZvciBhbnkgbmV3IGRlZmluaXRpb25zIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzLgo1LiAgQSBuZXcgdHJhY2UgZXZlbnQgZGVmaW5pdGlvbiBpbiBgaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhgLCBpcyBhIHZlcnkgcG9zaXRpdmUgYWRkaXRpb24uIFRyYWNlcG9pbnRzIGFyZSBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMgYW5kIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBCUEYgbG9naWMgaXMgYmVoYXZpbmcuCjYuICBUaGUgaW5jbHVzaW9uIG9mIHNlbGZ0ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLy4uLmAgaXMgZXhjZWxsZW50ISBDb21wcmVoZW5zaXZlIHRlc3RpbmcgaXMgbm9uLW5lZ290aWFibGUgZm9yIHNvbWV0aGluZyBsaWtlIHRoaXMuCgpOZXh0LCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgaXMgYWN0dWFsbHkgKnVzYWJsZSogaW4gdHlwaWNhbCBlbnZpcm9ubWVudHMuIFJlYWNoaW5nIFFFTVUvS1ZNIFZNcywgYXMgd2VsbCBhcyBhIHZhcmlldHkgb2YgY29udGFpbmVyIHN5c3RlbXMsIGlzIGtleS4gVGhhbmtmdWxseSwgdGhlIHRleHQgY29uZmlybXMgdGhhdCB0aGlzIGludGVncmF0ZXMgd2l0aCB0aGUgc3RhbmRhcmQgY2dyb3VwL2Jsb2NrIGxheWVyLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBjZ3JvdXBzIHYyIChgaW8uY29zdC5tb2RlbGApLiBUaGUgdXNlIG9mIEJQRiBzdHJ1Y3Rfb3BzIChgQlBGX01BUF9DUkVBVEVgLCBgQlBGX0xJTktfQ1JFQVRFYCkgaXMgYWxzbyBwcm9taXNpbmcsIHdoaWNoIG1lYW5zIHRoaXMgY291bGQgYmUgYWNjZXNzaWJsZSBpbiBhIHdpZGUgdmFyaWV0eSBvZiBjaXJjdW1zdGFuY2VzLgoKTXkgbmV4dCBzdGVwIGlzIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bGwgbmVlZCB0byB1c2UgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBjb2RlLCB1bmRlcnN0YW5kIHRoZSBuZXcgc3ltYm9scywgYW5kIGZpZ3VyZSBvdXQgdGhlIGV4YWN0IEtjb25maWcgZGVwZW5kZW5jaWVzLiBJJiMzOTttIGtlZW4gdG8gc2VlIHRoZSBkZXRhaWxzIG9mIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBCUEYgcHJvZ3JhbXMuIEkmIzM5O20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gdGhlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBhbmQgd2hldGhlciB0aGVyZSBhcmUgYW55IHBvdGVudGlhbCBnb3RjaGFzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBob3cgdGhpcyBhZmZlY3RzIHRoZSBvdmVyYWxsIEkvTyBwYXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0JMS19DR1JPVVBfSU9DT1NUJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtibG9jay9LY29uZmlnPTE0NT1jb25maWcgQkxLX0NHUk9VUF9GQ19BUFBJRFxuLS1cbmJsb2NrL0tjb25maWctMTUzLVxuYmxvY2svS2NvbmZpZzoxNTQ6Y29uZmlnIEJMS19DR1JPVVBfSU9DT1NUXG5ibG9jay9LY29uZmlnLTE1NS1cdGJvb2wgXCYjMzQ7RW5hYmxlIHN1cHBvcnQgZm9yIGNvc3QgbW9kZWwgYmFzZWQgY2dyb3VwIElPIGNvbnRyb2xsZXJcJiMzNDtcbi0tXG5ibG9jay9LY29uZmlnPTIzMj1zb3VyY2UgXCYjMzQ7YmxvY2svS2NvbmZpZy5pb3NjaGVkXCYjMzQ7XG5ibG9jay9LY29uZmlnLTIzMy1cbmJsb2NrL0tjb25maWc6MjM0OmNvbmZpZyBCTEtfQ0dST1VQX0lPQ09TVF9CUEZcbmJsb2NrL0tjb25maWctMjM1LVx0Ym9vbCBcJiMzNDtFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXJcJiMzNDtcbmJsb2NrL0tjb25maWc6MjM2Olx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQX0lPQ09TVCBcdTAwMjZcdTAwMjYgQlBGX1NZU0NBTEwgXHUwMDI2XHUwMDI2IEJQRl9KSVRcbmJsb2NrL0tjb25maWctMjM3LVx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0ODE1CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gSS9PIENvc3QgYW5kIERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgbG9va2luZyBhdCBgQkxLX0NHUk9VUF9JT0NPU1RgLCBhbmQgbXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGxldCYjMzk7cyBub3QganVzdCBpc29sYXRlIHRoZSBmZWF0dXJlIGl0c2VsZi4gV2UgbmVlZCB0byBkbyBhIGZ1bGwgZGVwZW5kZW5jeSBhdWRpdCBvbiB0aGlzLiBJJiMzOTttIGFscmVhZHkgbWVudGFsbHkgcnVubmluZyB0aHJvdWdoIHRoZSBrZXJuZWwgaW5mcmFzdHJ1Y3R1cmUg4oCTIHdoYXQgb3RoZXIgY29tcG9uZW50cywgbW9kdWxlcywgb3Igc3Vic3lzdGVtcyBtaWdodCBiZSBpbmRpcmVjdGx5IGFmZmVjdGVkLCBvciBkZXBlbmQgb24gdGhlIGNvcnJlY3Qgb3BlcmF0aW9uIG9mIGBCTEtfQ0dST1VQX0lPQ09TVGA/IFRoaW5raW5nIGFib3V0IHRoaXMsIEkgbmVlZCB0byBjb25zaWRlciB0aGluZ3MgbGlrZSBibG9jayBsYXllciBhY2NvdW50aW5nLCBjZ3JvdXAgaW50ZWdyYXRpb25zLCBhbmQgYW55IHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aCBzY2hlZHVsZXIgaW1wbGVtZW50YXRpb25zLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IGJ5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgcmVmZXJlbmNlcyB0byBtYWtlIHN1cmUgSSBnZXQgdGhlIHdob2xlIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtibG9jay9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNTA6XHRcdCAgY2dyb3VwIGFwcGxpY2F0aW9ucy4gSXQgZW5hYmxlcyB0aGUgRmFicmljIGFuZCB0aGUgc3RvcmFnZSB0YXJnZXRzIHRvXG4gMTUxOlx0XHQgIGlkZW50aWZ5LCBtb25pdG9yLCBhbmQgaGFuZGxlIEZDIHRyYWZmaWMgYmFzZWQgb24gVk0gdGFncyBieSBpbnNlcnRpbmdcbiAxNTI6XHRcdCAgYXBwbGljYXRpb24gc3BlY2lmaWMgaWRlbnRpZmljYXRpb24gaW50byB0aGUgRkMgZnJhbWUuXG4gMTUzOlx0XG4gMTU0Olx0Y29uZmlnIEJMS19DR1JPVVBfSU9DT1NUXG4gMTU1Olx0XHRib29sIFwmIzM0O0VuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXCYjMzQ7XG4gMTU2Olx0XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcbiAxNTc6XHRcdHNlbGVjdCBCTEtfUlFfQUxMT0NfVElNRVxuIDE1ODpcdFx0aGVscFxuIDE1OTpcdFx0RW5hYmxpbmcgdGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgLndlaWdodCBpbnRlcmZhY2UgZm9yIGNvc3RcbiAxNjA6XHRcdG1vZGVsIGJhc2VkIHByb3BvcnRpb25hbCBJTyBjb250cm9sLiAgVGhlIElPIGNvbnRyb2xsZXJcbiAxNjE6XHRcdGRpc3RyaWJ1dGVzIElPIGNhcGFjaXR5IGJldHdlZW4gZGlmZmVyZW50IGdyb3VwcyBiYXNlZCBvblxuIDE2MjpcdFx0dGhlaXIgc2hhcmUgb2YgdGhlIG92ZXJhbGwgd2VpZ2h0IGRpc3RyaWJ1dGlvbi5cbiAxNjM6XHRcbiAxNjQ6XHRjb25maWcgQkxLX0NHUk9VUF9JT1BSSU9cbiAxNjU6XHRcdGJvb2wgXCYjMzQ7Q2dyb3VwIEkvTyBjb250cm9sbGVyIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzXCYjMzQ7XG4gMTY2Olx0XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcbiAxNjc6XHRcdGhlbHBcbiAxNjg6XHRcdEVuYWJsZSB0aGUgLnByaW8gaW50ZXJmYWNlIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzIHRvXG4gMTY5Olx0XHRyZXF1ZXN0cy4gVGhlIEkvTyBwcmlvcml0eSBjbGFzcyBhZmZlY3RzIHRoZSBvcmRlciBpbiB3aGljaCBhbiBJL09cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTM2OQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBCUEYgSS9PIENvc3QgQW5hbHlzaXMgQ29kZSoqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBkZXRhaWxzLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGBibGstaW9jb3N0LWJwZi5jYCBjb2RlLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgZ29pbmcgdG8gYmUgZnVuY3Rpb25zIGFuZCBzeW1ib2xzIGRlZmluZWQgd2l0aGluIHRoYXQgZmlsZS4gSSYjMzk7bSB0aGlua2luZyBJJiMzOTtsbCBzdGFydCBieSBsaXN0aW5nIG91dCB0aGUgZnVuY3Rpb25zIHRvIGdldCBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgb2YgaG93IHRoZSBjb2RlIGlzIHN0cnVjdHVyZWQsIGFuZCB0aGVuIGRyaWxsIGRvd24gaW50byBhbnkgaW50ZXJlc3Rpbmcgc3ltYm9scywgcGFydGljdWxhcmx5IHRob3NlIHJlbGF0ZWQgdG8gdGhlIGNvc3QgYWNjb3VudGluZyBvciBhbnkgQlBGIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBhcmUgYmVpbmcgbGV2ZXJhZ2VkLiBVbmRlcnN0YW5kaW5nIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgQlBGIHByb2dyYW0gYW5kIHRoZSBicm9hZGVyIGtlcm5lbCBmcmFtZXdvcmsgaXMga2V5IHRvIHRoaXMgYW5hbHlzaXMuIEkgd2FudCB0byBzZWUgaG93IHRoZXkmIzM5O3ZlIGluc3RydW1lbnRlZCB0aGUgYmxvY2sgbGF5ZXIgYW5kIHdoaWNoIGV2ZW50cyB0aGV5JiMzOTtyZSB0cmFja2luZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiAgIDI6XHQvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuICAgMzpcdFxuICAgNDpcdC8qXG4gICA1Olx0ICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy5cbiAgIDY6XHQgKlxuICAgNzpcdCAqIFJlZ2lzdGVycyB0aGUgXCYjMzQ7aW9jb3N0X21vZGVsX29wc1wmIzM0OyBzdHJ1Y3Rfb3BzIHR5cGUuICBBdCBtb3N0IG9uZSBtb2RlbFxuICAgODpcdCAqIGNhbiBiZSByZWdpc3RlcmVkIGF0IGEgdGltZTsgZGV2aWNlcyBvcHQgaW4gcGVyLXF1ZXVlIHdpdGhcbiAgIDk6XHQgKiBcJiMzNDtlY2hvICRERVYgY3RybD1icGYgXHUwMDNlIGlvLmNvc3QubW9kZWxcJiMzNDsuICBEZXZpY2VzIHdpdGhvdXQgYSByZWdpc3RlcmVkXG4gIDEwOlx0ICogbW9kZWwga2VlcCB1c2luZyB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwuXG4gIDExOlx0ICovXG4gIDEyOlx0I2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4gIDEzOlx0I2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2VcbiAgMTQ6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICAxNTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gIDE2Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvYnBmX3ZlcmlmaWVyLmhcdTAwM2VcbiAgMTc6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuICAxODpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2Jsay1pb2Nvc3QuaFx1MDAzZVxuICAxOTpcdFxuICAyMDpcdC8qIDFzIG9mIGRldmljZSB0aW1lOyB1cHBlciBib3VuZCBvbiBhIHNpbmdsZSBJTyYjMzk7cyBjaGFyZ2VhYmxlIGNvc3QgKi9cbiAgMjE6XHQjZGVmaW5lIElPQ09TVF9CUEZfTUFYX0NPU1RcdCgxVUxMIFx1MDAzY1x1MDAzYyAzNylcbiAgMjI6XHRcbiAgMjM6XHRzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzO1xuICAyNDpcdFxuICAyNTpcdHN0YXRpYyBERUZJTkVfTVVURVgoaW9jb3N0X2JwZl9yZWdfbG9jayk7XG4gIDI2Olx0c3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fcmN1ICppb2Nvc3RfYnBmX21vZGVsO1xuICAyNzpcdHN0YXRpYyBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShpb2Nvc3RfYnBmX2tleSk7XG4gIDI4Olx0XG4gIDI5Olx0Ym9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZClcbiAgMzA6XHR7XG4gIDMxOlx0XHRyZXR1cm4gc3RhdGljX2JyYW5jaF91bmxpa2VseShcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4gIDMyOlx0fVxuICAzMzpcdFxuICAzNDpcdGJvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuICAzNTpcdFx0XHRcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cClcbiAgMzY6XHR7XG4gIDM3Olx0XHRjb25zdCBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqb3BzO1xuICAzODpcdFx0dTY0IGNvc3Q7XG4gIDM5Olx0XG4gIDQwOlx0XHRpZiAoIXN0YXRpY19icmFuY2hfdW5saWtlbHkoXHUwMDI2aW9jb3N0X2JwZl9rZXkpKVxuICA0MTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gIDQyOlx0XG4gIDQzOlx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gIDQ0Olx0XHRvcHMgPSByY3VfZGVyZWZlcmVuY2UoaW9jb3N0X2JwZl9tb2RlbCk7XG4gIDQ1Olx0XHRpZiAoIW9wcykge1xuICA0NjpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiAgNDc6XHRcdFx0cmV0dXJuIGZhbHNlO1xuICA0ODpcdFx0fVxuICA0OTpcdFx0Y29zdCA9IG9wcy1cdTAwM2VjYWxjX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGlvY2dfaWQsIGZsYWdzKTtcbiAgNTA6XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuICA1MTpcdFxuICA1MjpcdFx0aWYgKCFjb3N0KVxuICA1MzpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gIDU0Olx0XG4gIDU1Olx0XHQqY29zdHAgPSBtaW4oY29zdCwgSU9DT1NUX0JQRl9NQVhfQ09TVCk7XG4gIDU2Olx0XHRyZXR1cm4gdHJ1ZTtcbiAgNTc6XHR9XG4gIDU4Olx0XG4gIDU5Olx0c3RhdGljIGludCBicGZfaW9jb3N0X21vZGVsX2luaXQoc3RydWN0IGJ0ZiAqYnRmKVxuICA2MDpcdHtcbiAgNjE6XHRcdHMzMiB0eXBlX2lkO1xuICA2MjpcdFxuICA2MzpcdFx0dHlwZV9pZCA9IGJ0Zl9maW5kX2J5X25hbWVfa2luZChidGYsIFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDssIEJURl9LSU5EX1NUUlVDVCk7XG4gIDY0Olx0XHRpZiAodHlwZV9pZCBcdTAwM2MgMClcbiAgNjU6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gIDY2Olx0XHRyZXR1cm4gMDtcbiAgNjc6XHR9XG4gIDY4Olx0XG4gIDY5Olx0c3RhdGljIGludCBicGZfaW9jb3N0X2luaXRfbWVtYmVyKGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbiAgNzA6XHRcdFx0XHRcdCAgY29uc3Qgc3RydWN0IGJ0Zl9tZW1iZXIgKm1lbWJlcixcbiAgNzE6XHRcdFx0XHRcdCAgdm9pZCAqa2RhdGEsIGNvbnN0IHZvaWQgKnVkYXRhKVxuICA3MjpcdHtcbiAgNzM6XHRcdHJldHVybiAwO1xuICA3NDpcdH1cbiAgNzU6XHRcbiAgNzY6XHRzdGF0aWMgYm9vbCBicGZfaW9jb3N0X2lzX3ZhbGlkX2FjY2VzcyhpbnQgb2ZmLCBpbnQgc2l6ZSxcbiAgNzc6XHRcdFx0XHRcdCAgICAgICBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLFxuICA3ODpcdFx0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyxcbiAgNzk6XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgYnBmX2luc25fYWNjZXNzX2F1eCAqaW5mbylcbiAgODA6XHR7XG4gIDgxOlx0XHRyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTtcbiAgODI6XHR9XG4gIDgzOlx0XG4gIDg0Olx0c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqXG4gIDg1Olx0YnBmX2lvY29zdF9nZXRfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQsXG4gIDg2Olx0XHRcdFx0ICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXG4gIDg3Olx0e1xuICA4ODpcdFx0cmV0dXJuIGJwZl9iYXNlX2Z1bmNfcHJvdG8oZnVuY19pZCwgcHJvZyk7XG4gIDg5Olx0fVxuICA5MDpcdFxuICA5MTpcdHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX29wcyBicGZfaW9jb3N0X3ZlcmlmaWVyX29wcyA9IHtcbiAgOTI6XHRcdC5nZXRfZnVuY19wcm90byA9IGJwZl9pb2Nvc3RfZ2V0X2Z1bmNfcHJvdG8sXG4gIDkzOlx0XHQuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsXG4gIDk0Olx0fTtcbiAgOTU6XHRcbiAgOTY6XHRzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4gIDk3Olx0e1xuICA5ODpcdFx0c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm5ld19vcHMgPSBrZGF0YTtcbiAgOTk6XHRcbiAxMDA6XHRcdGlmICghbmV3X29wcy1cdTAwM2VjYWxjX2Nvc3QpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTcxMDAKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDoKCioqRGl2aW5nIERlZXBlciBpbnRvIGBibGstaW9jb3N0LWJwZi5jYCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBhbHJlYWR5IGV4YW1pbmVkIHNvbWUga2V5IGFyZWFzIG9mIHRoaXMgQlBGIHByb2dyYW0sIGFuZCBub3cgSSBuZWVkIHRvIHN5c3RlbWF0aWNhbGx5IGV4cGxvcmUgdGhlIHJlbWFpbmRlciBvZiBgYmxvY2svYmxrLWlvY29zdC1icGYuY2AuIEkgaGF2ZSBhIGdvb2QgZ3Jhc3Agb2YgdGhlIGZvdW5kYXRpb25hbCBjb25jZXB0cywgYnV0IEkgbmVlZCB0byBtYWtlIHN1cmUgSSYjMzk7bSBub3QgbWlzc2luZyBhbnkgc3VidGxlIGludGVyYWN0aW9ucyBvciBsZXNzIG9idmlvdXMgb3B0aW1pemF0aW9ucy4gV2hhdCBhcmUgdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGRvaW5nIGluIHRlcm1zIG9mIHRyYWNpbmcgaS9vIGNvc3RzLCBzZXR0aW5nIHVwIG1hcHMsIG9yIGhhbmRsaW5nIHNwZWNpZmljIGVkZ2UgY2FzZXM/IEkmIzM5O20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IHRoZXkmIzM5O3ZlIGhhbmRsZWQgcG90ZW50aWFsIGNvbnRlbnRpb24sIHJlc291cmNlIGxpbWl0cywgYW5kIGVycm9yIGhhbmRsaW5nIHdpdGhpbiB0aGlzIEJQRiBjb250ZXh0LiBMZXQmIzM5O3Mgc2VlIGhvdyB0aGUgcmVzdCBvZiB0aGUgZmlsZSBidWlsZHMgdXBvbiB3aGF0IEkmIzM5O3ZlIGFscmVhZHkgc2NydXRpbml6ZWQuIEkgbmVlZCB0byBlbnN1cmUgYSBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nIHRvIG1ha2UgYW55IGFzc2Vzc21lbnRzIGFib3V0IHBlcmZvcm1hbmNlLCBlZmZpY2llbmN5LCBvciBwb3RlbnRpYWwgaW1wcm92ZW1lbnRzLiBUaW1lIHRvIGRpZyBpbiEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtibG9jay9ibGstaW9jb3N0LWJwZi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDU1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMDA6XHRcdGlmICghbmV3X29wcy1cdTAwM2VjYWxjX2Nvc3QpXG4gMTAxOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDEwMjpcdFxuIDEwMzpcdFx0aW50IHJldCA9IDA7XG4gMTA0Olx0XG4gMTA1Olx0XHQvKiB0aGUgY2FsbGVyIG9ubHkgaG9sZHMgdGhlIHBlci1tYXAgbG9jaywgc28gc2VyaWFsaXplIGhlcmUgKi9cbiAxMDY6XHRcdG11dGV4X2xvY2soXHUwMDI2aW9jb3N0X2JwZl9yZWdfbG9jayk7XG4gMTA3Olx0XHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpKVxuIDEwODpcdFx0XHRyZXQgPSAtRUJVU1k7XG4gMTA5Olx0XHRlbHNlIHtcbiAxMTA6XHRcdFx0c3RhdGljX2JyYW5jaF9pbmMoXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xuIDExMTpcdFx0XHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgbmV3X29wcyk7XG4gMTEyOlx0XHR9XG4gMTEzOlx0XHRtdXRleF91bmxvY2soXHUwMDI2aW9jb3N0X2JwZl9yZWdfbG9jayk7XG4gMTE0Olx0XHRyZXR1cm4gcmV0O1xuIDExNTpcdH1cbiAxMTY6XHRcbiAxMTc6XHRzdGF0aWMgdm9pZCBicGZfaW9jb3N0X3VucmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4gMTE4Olx0e1xuIDExOTpcdFx0bXV0ZXhfbG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbiAxMjA6XHRcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkgPT0ga2RhdGEpIHtcbiAxMjE6XHRcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKGlvY29zdF9icGZfbW9kZWwsIE5VTEwpO1xuIDEyMjpcdFx0XHRzdGF0aWNfYnJhbmNoX2RlYyhcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4gMTIzOlx0XHR9XG4gMTI0Olx0XHRtdXRleF91bmxvY2soXHUwMDI2aW9jb3N0X2JwZl9yZWdfbG9jayk7XG4gMTI1Olx0fVxuIDEyNjpcdFxuIDEyNzpcdHN0YXRpYyB1NjQgYnBmX2lvY29zdF9jYWxjX2Nvc3Rfc3R1Yih1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4gMTI4Olx0XHRcdFx0XHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXG4gMTI5Olx0e1xuIDEzMDpcdFx0cmV0dXJuIDA7XG4gMTMxOlx0fVxuIDEzMjpcdFxuIDEzMzpcdHN0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyA9IHtcbiAxMzQ6XHRcdC5jYWxjX2Nvc3QgPSBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViLFxuIDEzNTpcdH07XG4gMTM2Olx0XG4gMTM3Olx0c3RhdGljIHN0cnVjdCBicGZfc3RydWN0X29wcyBicGZfaW9jb3N0X21vZGVsX29wcyA9IHtcbiAxMzg6XHRcdC52ZXJpZmllcl9vcHMgPSBcdTAwMjZicGZfaW9jb3N0X3ZlcmlmaWVyX29wcyxcbiAxMzk6XHRcdC5pbml0ID0gYnBmX2lvY29zdF9tb2RlbF9pbml0LFxuIDE0MDpcdFx0LmluaXRfbWVtYmVyID0gYnBmX2lvY29zdF9pbml0X21lbWJlcixcbiAxNDE6XHRcdC5yZWcgPSBicGZfaW9jb3N0X3JlZyxcbiAxNDI6XHRcdC51bnJlZyA9IGJwZl9pb2Nvc3RfdW5yZWcsXG4gMTQzOlx0XHQubmFtZSA9IFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDssXG4gMTQ0Olx0XHQuY2ZpX3N0dWJzID0gXHUwMDI2X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsXG4gMTQ1Olx0XHQub3duZXIgPSBUSElTX01PRFVMRSxcbiAxNDY6XHR9O1xuIDE0NzpcdFxuIDE0ODpcdHN0YXRpYyBpbnQgX19pbml0IGJwZl9pb2Nvc3RfaW5pdCh2b2lkKVxuIDE0OTpcdHtcbiAxNTA6XHRcdHJldHVybiByZWdpc3Rlcl9icGZfc3RydWN0X29wcyhcdTAwMjZicGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7XG4gMTUxOlx0fVxuIDE1MjpcdGxhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgyNjEKCQkJCQkJCW91dHB1dDogMjM0CgkJCQkJCQl0aG91Z2h0czogODczCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBCbG9jayBJTyBDb3N0IHdpdGggQlBGIFN1cHBvcnQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZm9jdXMgaGVyZSBpcyB0byBkZWZpbmUgYSBnb29kIGZ1enppbmcgdGFyZ2V0IHJlbGF0ZWQgdG8gdGhlIGJsb2NrIEkvTyBjb3N0IGNvbnRyb2xsZXIsIHNwZWNpZmljYWxseSB0aGUgQlBGLWJhc2VkIGltcGxlbWVudGF0aW9uLiBJJiMzOTt2ZSBwaW5wb2ludGVkIGEgZmV3IGFyZWFzIGluIGBibG9jay9ibGstaW9jb3N0LmNgIChsaW5lcyB+MjU4MCwgfjM0NjUsIGFuZCB+MzUxMikgYW5kIHRoZSBuZXcgYGJsay1pb2Nvc3QtYnBmLmNgIHRoYXQgbG9vayBwcm9taXNpbmcuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBpbnRlcmVzdGVkIGluIGBjYWxjX3Z0aW1lX2Nvc3RgLCBgaW9jX2Nvc3RfbW9kZWxfcHJmaWxsYCwgYGlvY19jb3N0X21vZGVsX3dyaXRlYCAoaW4gYGJsay1pb2Nvc3QuY2ApLCBhbmQgYGlvY29zdF9icGZfY2FsY19jb3N0YCwgYGJwZl9pb2Nvc3RfcmVnYCwgYGJwZl9pb2Nvc3RfdW5yZWdgIChpbiBgYmxrLWlvY29zdC1icGYuY2ApLiBBbHNvIHRoZSBgaW9jX3RpbWVyX2ZuYC4KClRoZSBrZXkgaGVyZSBpcyB3aGV0aGVyIHRoaXMgY29kZSBtb2RpZmljYXRpb24gbWVyaXRzIGZ1enppbmcuIEl0IGRvZXMhICBJJiMzOTt2ZSBhc3Nlc3NlZCB0aGF0IGl0IGltcGFjdHMgdGhlIGJsb2NrIGxheWVyLCBjZ3JvdXBzLCBhbmQgQlBGIGBzdHJ1Y3Rfb3BzYCwgaXMgcmVhY2hhYmxlIGluIGEgc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudCwgYW5kIGhhcyBjaGFuZ2VzIHRvIGBibGstaW9jb3N0LmNgIGFuZCBgYmxrLWlvY29zdC1icGYuY2AuIFNvLCBpdCYjMzk7cyB3b3J0aCB0aGUgZWZmb3J0LgoKTm93LCB0byBuYXJyb3cgZG93biB0aGUgZm9jdXMuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgbW9zdCBzcGVjaWZpYywgbm9uLXViaXF1aXRvdXMgZnVuY3Rpb25zIGFkZGVkIG9yIG1vZGlmaWVkLiBUaGUgY29yZSBCUEYgZnVuY3Rpb25zIGFkZGVkIGluIGBibGstaW9jb3N0LWJwZi5jYCBzdGFuZCBvdXQ6IGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAsIGBicGZfaW9jb3N0X3JlZ2AsIGBicGZfaW9jb3N0X3VucmVnYC4gQW5kIGZyb20gYGJsay1pb2Nvc3QuY2AsIGBjYWxjX3Z0aW1lX2Nvc3RgLCBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgLCBhbmQgYGlvY19jb3N0X21vZGVsX3ByZmlsbGAgYXMgdGhleSBhcHBlYXIgdG8gYmUgaW50ZWdyYWwgcGFydHMgb2YgdGhlIG5ldyBjb3N0IG1vZGVsLgoKTmV4dCwgdGhlIGNvbmZpZ3VyYXRpb25zLiBJIG5lZWQgdG8gZW5zdXJlIHRoZXNlIGZlYXR1cmVzIGFyZSBlbmFibGVkIGZvciBlZmZlY3RpdmUgZnV6emluZy4gV2UgaGF2ZSBgQkxLX0NHUk9VUF9JT0NPU1RfQlBGYCwgYEJMS19DR1JPVVBfSU9DT1NUYCwgYEJQRl9TWVNDQUxMYCwgYEJQRl9KSVRgLCBhbmQgYEJMS19DR1JPVVBgLiBDb25maXJtZWQsIEkmIzM5O3ZlIGNoZWNrZWQgYGJsb2NrL0tjb25maWdgLCBhbmQgYEJMS19DR1JPVVBfSU9DT1NUYCBkZXBlbmRzIG9uIGBCTEtfQ0dST1VQYC4KCkFscmlnaHQsIEkmIzM5O20gcmVhZHkgdG8gZm9ybWFsbHkgZGVmaW5lIHRoZSBmdXp6aW5nIHRhcmdldC4KCioqRW5hYmxlQ29uZmlnczoqKgoqICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVF9CUEYmIzM0OwoqICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVCYjMzQ7CiogICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKKiAgICYjMzQ7QlBGX0pJVCYjMzQ7CiogICAmIzM0O0JMS19DR1JPVVAmIzM0OwoKKipGb2N1c1N5bWJvbHM6KioKKiAgICYjMzQ7aW9jb3N0X2JwZl9jYWxjX2Nvc3QmIzM0OwoqICAgJiMzNDticGZfaW9jb3N0X3JlZyYjMzQ7CiogICAmIzM0O2JwZl9pb2Nvc3RfdW5yZWcmIzM0OwoqICAgJiMzNDtpb2NfY29zdF9tb2RlbF93cml0ZSYjMzQ7CiogICAmIzM0O2lvY19jb3N0X21vZGVsX3ByZmlsbCYjMzQ7CiogICAmIzM0O2NhbGNfdnRpbWVfY29zdCYjMzQ7CgpUaGUgcmF0aW9uYWxlIGlzIGNsZWFyLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIEJQRiBzdHJ1Y3Rfb3BzIG1lY2hhbmlzbSBmb3IgcGx1Z2dhYmxlIGNvc3QgbW9kZWxzIGluIHRoZSBibG9jayBJL08gY29zdCBjZ3JvdXAgY29udHJvbGxlciAoYWN0aXZhdGVkIGJ5IENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYpLiBJdCBhZGRzIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBjYWxsYmFja3MsIGhvb2tzIGludG8gY29zdCBjYWxjdWxhdGlvbiwgYW5kIGFsdGVycyB0aGUgc3lzZnMvY2dyb3VwIGludGVyZmFjZS4gVGhpcyBhbGwgaGFuZGxlcyB1c2VyIGlucHV0IHZpYSBCUEYgYW5kIGNncm91cHMgYW5kIGlzIHJlYWNoYWJsZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXphdGlvbiBlbnZpcm9ubWVudHMuCgpUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVBfSU9DT1NUX0JQRiYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVCYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpb2Nvc3RfYnBmX2NhbGNfY29zdCYjMzQ7LAogICAgJiMzNDticGZfaW9jb3N0X3JlZyYjMzQ7LAogICAgJiMzNDticGZfaW9jb3N0X3VucmVnJiMzNDssCiAgICAmIzM0O2lvY19jb3N0X21vZGVsX3dyaXRlJiMzNDssCiAgICAmIzM0O2lvY19jb3N0X21vZGVsX3ByZmlsbCYjMzQ7LAogICAgJiMzNDtjYWxjX3Z0aW1lX2Nvc3QmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMgaW4gdGhlIGJsb2NrIGlvY29zdCBjZ3JvdXAgY29udHJvbGxlciAoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRikuIEl0IGFkZHMgc3RydWN0X29wcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBpbnRlZ3JhdGVzIGR5bmFtaWMgQlBGIGNvc3QgY2FsY3VsYXRpb24gaW50byB0aGUgYmlvIHN1Ym1pc3Npb24gcGF0aCwgYW5kIGV4dGVuZHMgdGhlIGNncm91cCBpby5jb3N0Lm1vZGVsIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLiBUaGUgY29kZSBpcyBmdWxseSByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBjZ3JvdXBzIGFuZCB0aGUgQlBGIHN1YnN5c3RlbS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QkxLX0NHUk9VUF9JT0NPU1RfQlBGJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVBfSU9DT1NUJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7QlBGX0pJVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2lvY29zdF9icGZfY2FsY19jb3N0JiMzNDssCiAgICAmIzM0O2JwZl9pb2Nvc3RfcmVnJiMzNDssCiAgICAmIzM0O2JwZl9pb2Nvc3RfdW5yZWcmIzM0OywKICAgICYjMzQ7aW9jX2Nvc3RfbW9kZWxfd3JpdGUmIzM0OywKICAgICYjMzQ7aW9jX2Nvc3RfbW9kZWxfcHJmaWxsJiMzNDssCiAgICAmIzM0O2NhbGNfdnRpbWVfY29zdCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscyBpbiB0aGUgYmxvY2sgaW9jb3N0IGNncm91cCBjb250cm9sbGVyIChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKS4gSXQgYWRkcyBzdHJ1Y3Rfb3BzIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBjYWxsYmFja3MsIGludGVncmF0ZXMgZHluYW1pYyBCUEYgY29zdCBjYWxjdWxhdGlvbiBpbnRvIHRoZSBiaW8gc3VibWlzc2lvbiBwYXRoLCBhbmQgZXh0ZW5kcyB0aGUgY2dyb3VwIGlvLmNvc3QubW9kZWwgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuIFRoZSBjb2RlIGlzIGZ1bGx5IHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIGNncm91cHMgYW5kIHRoZSBCUEYgc3Vic3lzdGVtLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM2PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IChgaW9jb3N0X21vZGVsX29wc2ApIGZvciB0aGUgYmxrLWlvY29zdCBJL08gY2dyb3VwIGNvbnRyb2xsZXIsIGFsbG93aW5nIHBsdWdnYWJsZSBCUEYtYmFzZWQgY29zdCBjYWxjdWxhdGlvbiwgYWRkcyBhIG5ldyB0cmFjZXBvaW50IChgaW9jb3N0X2lvY190aWNrYCksIGFuZCB1cGRhdGVzIHRoZSBjZ3JvdXAgdjIgYGlvLmNvc3QubW9kZWxgIGludGVyZmFjZS5cblxuQW5hbHlzaXMgcmVnYXJkaW5nIHNhbml0aXplcnM6XG4xLiBLTVNBTiBhcHBsaWNhYmlsaXR5OlxuLSBLTVNBTiBkZXRlY3RzIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgYW5kIGtlcm5lbC10by11c2VyIGluZm9ybWF0aW9uIGxlYWtzLlxuLSBJbiB0aGlzIHBhdGNoLCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIHBhc3NlZCB0byBgaW9jb3N0X2JwZl9jYWxjX2Nvc3QoKWAgYW5kIHRoZSBCUEYgc3RydWN0X29wcyBjYWxsYmFjayBhcmUgc2NhbGFyIGludGVnZXIgdmFsdWVzIHBhc3NlZCBieSB2YWx1ZS5cbi0gT3V0cHV0IHBvaW50ZXJzIChzdWNoIGFzIGAqY29zdHBgIGluIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGApIGFyZSB3cml0dGVuIGJlZm9yZSByZXR1cm4sIGFuZCBhbGwgbG9jYWwgdmFyaWFibGVzIChlLmcuIGBicGZgLCBgdXNlcmAsIGBjb3N0YCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIHByaW9yIHRvIGJyYW5jaGluZyBvciB1c2UuXG4tIFRoZSBuZXcgdHJhY2Vwb2ludCBgaW9jb3N0X2lvY190aWNrYCBleHBsaWNpdGx5IGFzc2lnbnMgYWxsIGZpZWxkcyBpbiBgVFBfZmFzdF9hc3NpZ25gLlxuLSBObyBzdHJ1Y3RzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgaGVhcCBhbGxvY2F0aW9ucyBhcmUgY29waWVkIHRvIHVzZXJzcGFjZS5cblxuMi4gS0FTQU4gLyBMT0NLREVQIGFwcGxpY2FiaWxpdHk6XG4tIFBvdGVudGlhbCByaXNrcyBpbiB0aGlzIHBhdGNoIHJldm9sdmUgYXJvdW5kIGNvbmN1cnJlbmN5IChzeW5jaHJvbml6YXRpb24gb2YgYGlvY29zdF9icGZfbW9kZWxgIHZpYSBSQ1UsIG11dGV4ZXMsIGFuZCBzdGF0aWMga2V5cykgb3IgbG9naWMvYm91bmRzIGVycm9ycywgd2hpY2ggYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQga2VybmVsIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi5cblxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBTZXAgOCAxMTozNTo0MyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdAppbmRleCA4ZDI2MDM3NTFjNTFhLi41NGIwNTc0Y2U1ODZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12Mi5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0CkBAIC0yMTE1LDEwICYjNDM7MjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXMKIAlhcmUgZGVmaW5lZC4KIAogCSAgPT09PT0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JICBjdHJsCQkmIzM0O2F1dG8mIzM0OyBvciAmIzM0O3VzZXImIzM0OwomIzQzOwkgIGN0cmwJCSYjMzQ7YXV0byYjMzQ7LCAmIzM0O3VzZXImIzM0OyBvciAmIzM0O2JwZiYjMzQ7CiAJICBtb2RlbAkJVGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gJiMzNDtsaW5lYXImIzM0OwogCSAgPT09PT0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKJiM0MzsJV2hlbiAmIzM0O2N0cmwmIzM0OyBpcyAmIzM0O2JwZiYjMzQ7IChvbmx5IGF2YWlsYWJsZSB3aGVuCiYjNDM7CUNPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYgaXMgZW5hYmxlZCksIGNvc3QgY2FsY3VsYXRpb24gZm9yCiYjNDM7CXRoZSBkZXZpY2UgaXMgZGlzcGF0Y2hlZCB0byB0aGUgQlBGIHByb2dyYW0gcmVnaXN0ZXJlZCBhZ2FpbnN0CiYjNDM7CXRoZSBpb2Nvc3RfbW9kZWxfb3BzIHN0cnVjdF9vcHMuICBXcml0aW5nICYjMzQ7YnBmJiMzNDsgZmFpbHMgd2l0aCAtRUlOVkFMCiYjNDM7CXVudGlsIHN1Y2ggYSBwcm9ncmFtIGlzIHJlZ2lzdGVyZWQsIGFuZCBhdCBtb3N0IG9uZSBwcm9ncmFtIGNhbgomIzQzOwliZSByZWdpc3RlcmVkIHN5c3RlbS13aWRlLiAgVGhlIG1vZGVsIGlzIGNhbGxlZCB3aXRoIHNjYWxhcgomIzQzOwlhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlCiYjNDM7CWlzc3VpbmcgY2dyb3VwLCBmbGFnczsgc2VlIGluY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGZvciB0aGVpcgomIzQzOwltZWFuaW5nKSBhbmQgcmV0dXJucyBhIGNvc3QgaW4gdnRpbWUgdW5pdHMsIGNsYW1wZWQgYnkgdGhlIGtlcm5lbAomIzQzOwl0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlcwomIzQzOwl0aGUgSU8gYmFjayB0byB0aGUgYnVpbHRpbiBsaW5lYXIgZm9ybXVsYSwgc28gYSBtb2RlbCB3aGljaCBvbmx5CiYjNDM7CWhhbmRsZXMgc29tZSBJTyB0eXBlcyBjYW5ub3QgbWFrZSB0aGUgcmVzdCBmcmVlLiAgRGV2aWNlcyB3aGljaAomIzQzOwlkb24mIzM5O3Qgb3B0IGluIGtlZXAgdGhlIGJ1aWx0aW4gbGluZWFyIG1vZGVsIHVuY2hhbmdlZC4KJiM0MzsKIAlXaGVuICYjMzQ7Y3RybCYjMzQ7IGlzICYjMzQ7YXV0byYjMzQ7LCB0aGUga2VybmVsIG1heSBjaGFuZ2UgYWxsIHBhcmFtZXRlcnMKIAlkeW5hbWljYWxseS4gIFdoZW4gJiMzNDtjdHJsJiMzNDsgaXMgc2V0IHRvICYjMzQ7dXNlciYjMzQ7IG9yIGFueSBvdGhlcgogCXBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gdG8sICYjMzQ7Y3RybCYjMzQ7IGJlY29tZSAmIzM0O3VzZXImIzM0OyBhbmQgdGhlCmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCA3MGU0YTY2ZDk0MWZmLi5iZjQzYmUyMWUwMGJiIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL0tjb25maWcKQEAgLTIzMSw0ICYjNDM7MjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OCiAKIHNvdXJjZSAmIzM0O2Jsb2NrL0tjb25maWcuaW9zY2hlZCYjMzQ7CiAKJiM0Mztjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGCiYjNDM7CWJvb2wgJiMzNDtFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXImIzM0OwomIzQzOwlkZXBlbmRzIG9uIEJMS19DR1JPVVBfSU9DT1NUICZhbXA7JmFtcDsgQlBGX1NZU0NBTEwgJmFtcDsmYW1wOyBCUEZfSklUCiYjNDM7CWhlbHAKJiM0MzsJIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHJlZ2lzdGVycyB0aGUgJiMzNDtpb2Nvc3RfbW9kZWxfb3BzJiMzNDsgQlBGCiYjNDM7CSBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlCiYjNDM7CSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoCiYjNDM7CSAmIzM0O2N0cmw9YnBmJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLgomIzQzOwogZW5kaWYgIyBCTE9DSwpkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCBlN2JkMzIwZTNkNjk3Li5lZTVjZWJlZWEwMDZmIDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZQpAQCAtMzksMyAmIzQzOzM5LDQgQEAgb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTikJJiM0Mzs9IGJsay1jcnlwdG8ubyBibGstY3J5cHRvLXByb2ZpbGUubyBcCiAJCQkJCSAgIGJsay1jcnlwdG8tc3lzZnMubwogb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSykJJiM0Mzs9IGJsay1jcnlwdG8tZmFsbGJhY2subwogb2JqLSQoQ09ORklHX0JMT0NLX0hPTERFUl9ERVBSRUNBVEVEKQkmIzQzOz0gaG9sZGVyLm8KJiM0MztvYmotJChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKQkmIzQzOz0gYmxrLWlvY29zdC1icGYubwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWlvY29zdC1icGYuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMGMzNGY1NmRlZDcxZAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMKQEAgLTAsMCAmIzQzOzEsMTUyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy4KJiM0MzsgKgomIzQzOyAqIFJlZ2lzdGVycyB0aGUgJiMzNDtpb2Nvc3RfbW9kZWxfb3BzJiMzNDsgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWwKJiM0MzsgKiBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBhIHRpbWU7IGRldmljZXMgb3B0IGluIHBlci1xdWV1ZSB3aXRoCiYjNDM7ICogJiMzNDtlY2hvICRERVYgY3RybD1icGYgJmd0OyBpby5jb3N0Lm1vZGVsJiMzNDsuICBEZXZpY2VzIHdpdGhvdXQgYSByZWdpc3RlcmVkCiYjNDM7ICogbW9kZWwga2VlcCB1c2luZyB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwuCiYjNDM7ICovCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmX3ZlcmlmaWVyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ibGstaW9jb3N0LmgmZ3Q7CiYjNDM7CiYjNDM7LyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJiMzOTtzIGNoYXJnZWFibGUgY29zdCAqLwomIzQzOyNkZWZpbmUgSU9DT1NUX0JQRl9NQVhfQ09TVAkoMVVMTCAmbHQ7Jmx0OyAzNykKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzOwomIzQzOwomIzQzO3N0YXRpYyBERUZJTkVfTVVURVgoaW9jb3N0X2JwZl9yZWdfbG9jayk7CiYjNDM7c3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fcmN1ICppb2Nvc3RfYnBmX21vZGVsOwomIzQzO3N0YXRpYyBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShpb2Nvc3RfYnBmX2tleSk7CiYjNDM7CiYjNDM7Ym9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhbXA7aW9jb3N0X2JwZl9rZXkpOwomIzQzO30KJiM0MzsKJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqb3BzOwomIzQzOwl1NjQgY29zdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhbXA7aW9jb3N0X2JwZl9rZXkpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW9wcyA9IHJjdV9kZXJlZmVyZW5jZShpb2Nvc3RfYnBmX21vZGVsKTsKJiM0MzsJaWYgKCFvcHMpIHsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWNvc3QgPSBvcHMtJmd0O2NhbGNfY29zdChvcCwgbmJ5dGVzLCBzZWN0b3IsIGN1cnNvciwgaW9jZ19pZCwgZmxhZ3MpOwomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJaWYgKCFjb3N0KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkqY29zdHAgPSBtaW4oY29zdCwgSU9DT1NUX0JQRl9NQVhfQ09TVCk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdChzdHJ1Y3QgYnRmICpidGYpCiYjNDM7ewomIzQzOwlzMzIgdHlwZV9pZDsKJiM0MzsKJiM0MzsJdHlwZV9pZCA9IGJ0Zl9maW5kX2J5X25hbWVfa2luZChidGYsICYjMzQ7aW9jb3N0X21vZGVsX29wcyYjMzQ7LCBCVEZfS0lORF9TVFJVQ1QpOwomIzQzOwlpZiAodHlwZV9pZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnBmX2lvY29zdF9pbml0X21lbWJlcihjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsCiYjNDM7CQkJCSAgY29uc3Qgc3RydWN0IGJ0Zl9tZW1iZXIgKm1lbWJlciwKJiM0MzsJCQkJICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsCiYjNDM7CQkJCSAgICAgICBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLAomIzQzOwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLAomIzQzOwkJCQkgICAgICAgc3RydWN0IGJwZl9pbnNuX2FjY2Vzc19hdXggKmluZm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqCiYjNDM7YnBmX2lvY29zdF9nZXRfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQsCiYjNDM7CQkJICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0gewomIzQzOwkuZ2V0X2Z1bmNfcHJvdG8gPSBicGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvLAomIzQzOwkuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhOwomIzQzOwomIzQzOwlpZiAoIW5ld19vcHMtJmd0O2NhbGNfY29zdCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJLyogdGhlIGNhbGxlciBvbmx5IGhvbGRzIHRoZSBwZXItbWFwIGxvY2ssIHNvIHNlcmlhbGl6ZSBoZXJlICovCiYjNDM7CW11dGV4X2xvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0MzsJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsKSkKJiM0MzsJCXJldCA9IC1FQlVTWTsKJiM0MzsJZWxzZSB7CiYjNDM7CQlzdGF0aWNfYnJhbmNoX2luYygmYW1wO2lvY29zdF9icGZfa2V5KTsKJiM0MzsJCXJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBuZXdfb3BzKTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX2lvY29zdF91bnJlZyh2b2lkICprZGF0YSwgc3RydWN0IGJwZl9saW5rICpsaW5rKQomIzQzO3sKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO2lvY29zdF9icGZfcmVnX2xvY2spOwomIzQzOwlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpID09IGtkYXRhKSB7CiYjNDM7CQlyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7CiYjNDM7CQlzdGF0aWNfYnJhbmNoX2RlYygmYW1wO2lvY29zdF9icGZfa2V5KTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwKJiM0MzsJCQkJICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKQomIzQzO3sKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyA9IHsKJiM0MzsJLmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0gewomIzQzOwkudmVyaWZpZXJfb3BzID0gJmFtcDticGZfaW9jb3N0X3ZlcmlmaWVyX29wcywKJiM0MzsJLmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsCiYjNDM7CS5pbml0X21lbWJlciA9IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIsCiYjNDM7CS5yZWcgPSBicGZfaW9jb3N0X3JlZywKJiM0MzsJLnVucmVnID0gYnBmX2lvY29zdF91bnJlZywKJiM0MzsJLm5hbWUgPSAmIzM0O2lvY29zdF9tb2RlbF9vcHMmIzM0OywKJiM0MzsJLmNmaV9zdHVicyA9ICZhbXA7X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsCiYjNDM7CS5vd25lciA9IFRISVNfTU9EVUxFLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2lvY29zdF9pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoJmFtcDticGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QuYwppbmRleCAyNzQ1YmZmY2Q1ZWVmLi5hNThjMTZmY2IyOWZhIDEwMDY0NAotLS0gYS9ibG9jay9ibGstaW9jb3N0LmMKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWlvY29zdC5jCkBAIC0xNzcsNiAmIzQzOzE3Nyw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvdGltZXIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC90aW1lNjQuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wYXJzZXIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYmxrLWlvY29zdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL3NpZ25hbC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9sb2NhbC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9sb2NhbDY0LmgmZ3Q7CkBAIC00NDUsNiAmIzQzOzQ0Niw3IEBAIHN0cnVjdCBpb2MgewogCWludAkJCQlhdXRvcF9pZHg7CiAJYm9vbAkJCQl1c2VyX3Fvc19wYXJhbXM6MTsKIAlib29sCQkJCXVzZXJfY29zdF9tb2RlbDoxOwomIzQzOwlib29sCQkJCWJwZl9jb3N0X21vZGVsOwogfTsKIAogc3RydWN0IGlvY2dfcGNwdV9zdGF0IHsKQEAgLTIyMzgsNiAmIzQzOzIyNDAsNyBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogCXN0cnVjdCBpb2Nfbm93IG5vdzsKIAlMSVNUX0hFQUQoc3VycGx1c2VzKTsKIAlpbnQgbnJfZGVidG9ycywgbnJfc2hvcnRhZ2VzID0gMCwgbnJfbGFnZ2luZyA9IDA7CiYjNDM7CWludCBucl9hY3RpdmUgPSAwOwogCXU2NCB1c2FnZV91c19zdW0gPSAwOwogCXUzMiBwcG1fcnRocjsKIAl1MzIgcHBtX3d0aHI7CkBAIC0yMjc0LDYgJiM0MzsyMjc3LDggQEAgc3RhdGljIHZvaWQgaW9jX3RpbWVyX2ZuKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIAkJdTY0IHZkb25lLCB2dGltZSwgdXNhZ2VfdXM7CiAJCXUzMiBod19hY3RpdmUsIGh3X2ludXNlOwogCiYjNDM7CQlucl9hY3RpdmUmIzQzOyYjNDM7OwomIzQzOwogCQkvKgogCQkgKiBDb2xsZWN0IHVudXNlZCBhbmQgd2luZCB2dGltZSBjbG9zZXIgdG8gdm5vdyB0byBwcmV2ZW50CiAJCSAqIGlvY2dzIGZyb20gYWNjdW11bGF0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGJ1ZGdldC4KQEAgLTI0NjAsNiAmIzQzOzI0NjUsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogCQlpb2NfcmVmcmVzaF92cmF0ZShpb2MsICZhbXA7bm93KTsKIAl9CiAKJiM0MzsJdHJhY2VfaW9jb3N0X2lvY190aWNrKGlvYywgbnJfYWN0aXZlLCB1c2FnZV91c19zdW0pOwomIzQzOwogCXNwaW5fdW5sb2NrX2lycSgmYW1wO2lvYy0mZ3Q7bG9jayk7CiB9CiAKQEAgLTI1NzMsNiAmIzQzOzI1ODAsMjMgQEAgc3RhdGljIHU2NCBjYWxjX3Z0aW1lX2Nvc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLCBib29sIGlzX21lcmdlKQogewogCXU2NCBjb3N0OwogCiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYKJiM0MzsJc3RydWN0IGlvYyAqaW9jID0gaW9jZy0mZ3Q7aW9jOwomIzQzOwomIzQzOwlpZiAoUkVBRF9PTkNFKGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWwpKSB7CiYjNDM7CQl1NjQgYnBmX2Nvc3Q7CiYjNDM7CiYjNDM7CQlpZiAoaW9jb3N0X2JwZl9jYWxjX2Nvc3QoYmlvX29wKGJpbyksCiYjNDM7CQkJCQkgYmlvLSZndDtiaV9pdGVyLmJpX3NpemUsCiYjNDM7CQkJCQkgYmlvLSZndDtiaV9pdGVyLmJpX3NlY3RvciwKJiM0MzsJCQkJCSBpb2NnLSZndDtjdXJzb3IsCiYjNDM7CQkJCQkgaW9jZ190b19ibGtnKGlvY2cpLSZndDtibGtjZy0mZ3Q7Y3NzLmlkLAomIzQzOwkJCQkJIGlzX21lcmdlID8gSU9DT1NUX0NPU1RfRl9NRVJHRSA6IDAsCiYjNDM7CQkJCQkgJmFtcDticGZfY29zdCkpCiYjNDM7CQkJcmV0dXJuIGJwZl9jb3N0OwomIzQzOwl9CiYjNDM7I2VuZGlmCiYjNDM7CiAJY2FsY192dGltZV9jb3N0X2J1aWx0aW4oYmlvLCBpb2NnLCBpc19tZXJnZSwgJmFtcDtjb3N0KTsKIAlyZXR1cm4gY29zdDsKIH0KQEAgLTM0NDEsNyAmIzQzOzM0NjUsOCBAQCBzdGF0aWMgdTY0IGlvY19jb3N0X21vZGVsX3ByZmlsbChzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLAogCXNlcV9wcmludGYoc2YsICYjMzQ7JXMgY3RybD0lcyBtb2RlbD1saW5lYXIgJiMzNDsKIAkJICAgJiMzNDtyYnBzPSVsbHUgcnNlcWlvcHM9JWxsdSBycmFuZGlvcHM9JWxsdSAmIzM0OwogCQkgICAmIzM0O3dicHM9JWxsdSB3c2VxaW9wcz0lbGx1IHdyYW5kaW9wcz0lbGx1XG4mIzM0OywKLQkJICAgZG5hbWUsIGlvYy0mZ3Q7dXNlcl9jb3N0X21vZGVsID8gJiMzNDt1c2VyJiMzNDsgOiAmIzM0O2F1dG8mIzM0OywKJiM0MzsJCSAgIGRuYW1lLCBpb2MtJmd0O2JwZl9jb3N0X21vZGVsID8gJiMzNDticGYmIzM0OyA6CiYjNDM7CQkJICAgaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWwgPyAmIzM0O3VzZXImIzM0OyA6ICYjMzQ7YXV0byYjMzQ7LAogCQkgICB1W0lfTENPRUZfUkJQU10sIHVbSV9MQ09FRl9SU0VRSU9QU10sIHVbSV9MQ09FRl9SUkFORElPUFNdLAogCQkgICB1W0lfTENPRUZfV0JQU10sIHVbSV9MQ09FRl9XU0VRSU9QU10sIHVbSV9MQ09FRl9XUkFORElPUFNdKTsKIAlzcGluX3VubG9ja19pcnEoJmFtcDtpb2MtJmd0O2xvY2spOwpAQCAtMzQ4MSw3ICYjNDM7MzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsCiAJdW5zaWduZWQgaW50IG1lbWZsYWdzOwogCXN0cnVjdCBpb2MgKmlvYzsKIAl1NjQgdVtOUl9JX0xDT0VGU107Ci0JYm9vbCB1c2VyOwomIzQzOwlib29sIHVzZXIsIGJwZjsKIAljaGFyICpib2R5LCAqcDsKIAlpbnQgcmV0OwogCkBAIC0zNTEyLDYgJiM0MzszNTM3LDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCwKIAlzcGluX2xvY2tfaXJxKCZhbXA7aW9jLSZndDtsb2NrKTsKIAltZW1jcHkodSwgaW9jLSZndDtwYXJhbXMuaV9sY29lZnMsIHNpemVvZih1KSk7CiAJdXNlciA9IGlvYy0mZ3Q7dXNlcl9jb3N0X21vZGVsOwomIzQzOwlicGYgPSBpb2MtJmd0O2JwZl9jb3N0X21vZGVsOwogCiAJcmV0ID0gLUVJTlZBTDsKIApAQCAtMzUyNywxMSAmIzQzOzM1NTMsMjAgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCwKIAkJc3dpdGNoIChtYXRjaF90b2tlbihwLCBjb3N0X2N0cmxfdG9rZW5zLCBhcmdzKSkgewogCQljYXNlIENPU1RfQ1RSTDoKIAkJCW1hdGNoX3N0cmxjcHkoYnVmLCAmYW1wO2FyZ3NbMF0sIHNpemVvZihidWYpKTsKLQkJCWlmICghc3RyY21wKGJ1ZiwgJiMzNDthdXRvJiMzNDspKQomIzQzOwkJCWlmICghc3RyY21wKGJ1ZiwgJiMzNDthdXRvJiMzNDspKSB7CiAJCQkJdXNlciA9IGZhbHNlOwotCQkJZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7dXNlciYjMzQ7KSkKJiM0MzsJCQkJYnBmID0gZmFsc2U7CiYjNDM7CQkJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDt1c2VyJiMzNDspKSB7CiAJCQkJdXNlciA9IHRydWU7Ci0JCQllbHNlCiYjNDM7CQkJCWJwZiA9IGZhbHNlOwomIzQzOyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGCiYjNDM7CQkJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDticGYmIzM0OykpIHsKJiM0MzsJCQkJaWYgKCFpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQoKSkKJiM0MzsJCQkJCWdvdG8gdW5sb2NrOwomIzQzOwkJCQl1c2VyID0gZmFsc2U7CiYjNDM7CQkJCWJwZiA9IHRydWU7CiYjNDM7I2VuZGlmCiYjNDM7CQkJfSBlbHNlCiAJCQkJZ290byB1bmxvY2s7CiAJCQljb250aW51ZTsKIAkJY2FzZSBDT1NUX01PREVMOgpAQCAtMzU1Niw2ICYjNDM7MzU5MSw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsCiAJfSBlbHNlIHsKIAkJaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTsKIAl9CiYjNDM7CVdSSVRFX09OQ0UoaW9jLSZndDticGZfY29zdF9tb2RlbCwgYnBmKTsKIAlpb2NfcmVmcmVzaF9wYXJhbXMoaW9jLCB0cnVlKTsKIAogCXJldCA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBiL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjcxMTFiNWMwM2RjMzYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaApAQCAtMCwwICYjNDM7MSw1NiBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7I2lmbmRlZiBfTElOVVhfQkxLX0lPQ09TVF9ICiYjNDM7I2RlZmluZSBfTElOVVhfQkxLX0lPQ09TVF9ICiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFBsdWdnYWJsZSBjb3N0IG1vZGVsIGludGVyZmFjZSBmb3IgYmxrLWlvY29zdC4KJiM0MzsgKgomIzQzOyAqIEEgQlBGIHN0cnVjdF9vcHMgaW1wbGVtZW50YXRpb24gcmVnaXN0ZXJlZCBhZ2FpbnN0ICYjMzQ7aW9jb3N0X21vZGVsX29wcyYjMzQ7CiYjNDM7ICogcmVwbGFjZXMgdGhlIGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGgKJiM0MzsgKiAmIzM0O2N0cmw9YnBmJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLiAgVGhlIG1vZGVsIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiB0aGUKJiM0MzsgKiBhcmd1bWVudHMgYmVsb3cgYW5kIHJldHVybnMgdGhlIGNvc3Qgb2YgdGhlIElPIGluIGRldmljZSB0aW1lIHVuaXRzLAomIzQzOyAqIHdoZXJlIDEgc2Vjb25kIG9mIGRldmljZSB0aW1lIGVxdWFscyAyXjM3IChWVElNRV9QRVJfU0VDKS4gIFRoZQomIzQzOyAqIHJldHVybmVkIHZhbHVlIGlzIGNsYW1wZWQgYnkgdGhlIGtlcm5lbC4gIEEgY29zdCBvZiAwIGRlbGVnYXRlcyB0aGUKJiM0MzsgKiBJTyBiYWNrIHRvIHRoZSBidWlsdGluIGZvcm11bGEsIHNvIGEgbW9kZWwgd2hpY2ggZG9lcyBub3QgaGFuZGxlIGEKJiM0MzsgKiBnaXZlbiBJTyB0eXBlIGNhbm5vdCBtYWtlIGl0IGZyZWUuCiYjNDM7ICoKJiM0MzsgKiBUaGUgaW9jZ19pZCBhcmd1bWVudCBpZGVudGlmaWVzIHRoZSBpc3N1aW5nIGNncm91cCAoY3NzIGlkKSBzbyB0aGUKJiM0MzsgKiBtb2RlbCBjYW4ga2VlcCBwZXItY2dyb3VwIHN0YXRlLCBlLmcuIGZvciBtdWx0aS1zdHJlYW0gc2VxdWVudGlhbGl0eQomIzQzOyAqIGRldGVjdGlvbi4gIFRoZSBpZCBpcyBvbmx5IHZhbGlkIHdoaWxlIHRoZSBjZ3JvdXAgZXhpc3RzOiBjc3MgaWRzIGFyZQomIzQzOyAqIHJlY3ljbGVkIG9uY2UgdGhlIGNncm91cCBpcyByZW1vdmVkLCBzbyBtb2RlbHMgbXVzdCB0cmVhdCBpdCBhcyBhCiYjNDM7ICogdHJhbnNpZW50IGtleSBhbmQgcmVzZXQgc3RhdGUgd2hlbiB0aGV5IG9ic2VydmUgaXQgcmV1c2VkLiAgV2hldGhlcgomIzQzOyAqIHRoZSBpbnRlcmZhY2UgbmVlZHMgYSByZWxlYXNlKGlvY2dfaWQpIGNhbGxiYWNrIGZvciBzdGF0ZSBjbGVhbnVwIGlzCiYjNDM7ICogYW4gb3BlbiBxdWVzdGlvbi4KJiM0MzsgKgomIzQzOyAqIFRoZSBtb2RlbCBpcyBjYWxsZWQgZnJvbSB0aGUgSU8gc3VibWlzc2lvbiBwYXRoIHVuZGVyIFJDVSBhbmQgbXVzdAomIzQzOyAqIG5vdCBzbGVlcC4gIE9ubHkgdGhlIGJpby1sZXZlbCBjaGFyZ2luZyBwYXRoIGNvbnN1bHRzIHRoZSBtb2RlbDsKJiM0MzsgKiB0aGUgcmVxdWVzdC1sZXZlbCBzaXppbmcgcGF0aCAoY2FsY19zaXplX3Z0aW1lX2Nvc3QoKSkga2VlcHMgdXNpbmcKJiM0MzsgKiB0aGUgYnVpbHRpbiBmb3JtdWxhLgomIzQzOyAqLwomIzQzOwomIzQzOy8qIGZsYWdzIGZvciBjYWxjX2Nvc3QoKSAqLwomIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRQkoMVVMTCAmbHQ7Jmx0OyAwKQkvKiBjYWxsZWQgZnJvbSBtZXJnZSBwYXRoICovCiYjNDM7CiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgewomIzQzOwkvKgomIzQzOwkgKiBAb3A6CQlSRVFfT1BfKiB2YWx1ZSAodWFwaSBibGtfb3BmLmgpCiYjNDM7CSAqIEBuYnl0ZXM6CUlPIHNpemUgaW4gYnl0ZXMKJiM0MzsJICogQHNlY3RvcjoJc3RhcnRpbmcgc2VjdG9yCiYjNDM7CSAqIEBjdXJzb3I6CWlvY2cgY3Vyc29yIHNlY3RvciwgMCBpZiBub25lIChzZXF1ZW50aWFsaXR5IGhpbnQpCiYjNDM7CSAqIEBpb2NnX2lkOgljc3MgaWQgb2YgdGhlIGlzc3VpbmcgY2dyb3VwCiYjNDM7CSAqIEBmbGFnczoJSU9DT1NUX0NPU1RfRl8qCiYjNDM7CSAqLwomIzQzOwl1NjQgKCpjYWxjX2Nvc3QpKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgdTY0IGlvY2dfaWQsIHU2NCBmbGFncyk7CiYjNDM7fTsKJiM0MzsKJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApOwomIzQzO2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpOwomIzQzOwomIzQzOyNlbmRpZgkvKiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGICovCiYjNDM7I2VuZGlmCS8qIF9MSU5VWF9CTEtfSU9DT1NUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKaW5kZXggZTc3MmIxYmM2MGQ2MC4uMmI5ZmYzNDhhNGY1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKQEAgLTE3OCw2ICYjNDM7MTc4LDQ2IEBAIFRSQUNFX0VWRU5UKGlvY29zdF9pb2NfdnJhdGVfYWRqLAogCSkKICk7CiAKJiM0MzsvKgomIzQzOyAqIFBlcmlvZGljIHBlci1kZXZpY2Ugc3VtbWFyeSwgZW1pdHRlZCBvbmNlIHBlciBwZXJpb2QgZnJvbSB0aGUgdGFpbCBvZgomIzQzOyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5CiYjNDM7ICogcGVyaW9kIHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGluY2x1ZGluZyBzdGVhZHkgc3RhdGVzLCBhbmQgY2FycmllcwomIzQzOyAqIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3RhdGUgc28gYmFzaWMgbW9uaXRvcmluZyBkb2VzbiYjMzk7dCByZXF1aXJlIGRyZ24uCiYjNDM7ICovCiYjNDM7VFJBQ0VfRVZFTlQoaW9jb3N0X2lvY190aWNrLAomIzQzOwomIzQzOwlUUF9QUk9UTyhzdHJ1Y3QgaW9jICppb2MsIGludCBucl9hY3RpdmUsIHU2NCB1c2FnZV91c19zdW0pLAomIzQzOwomIzQzOwlUUF9BUkdTKGlvYywgbnJfYWN0aXZlLCB1c2FnZV91c19zdW0pLAomIzQzOwomIzQzOwlUUF9TVFJVQ1RfX2VudHJ5ICgKJiM0MzsJCV9fc3RyaW5nKGRldm5hbWUsIGlvY19uYW1lKGlvYykpCiYjNDM7CQlfX2ZpZWxkKHUzMiwgcGVyaW9kX3VzKQomIzQzOwkJX19maWVsZCh1NjQsIHZyYXRlKQomIzQzOwkJX19maWVsZChpbnQsIGJ1c3lfbGV2ZWwpCiYjNDM7CQlfX2ZpZWxkKGludCwgbnJfYWN0aXZlKQomIzQzOwkJX19maWVsZCh1MzIsIHVzYWdlX3BjdCkKJiM0MzsJCV9fZmllbGQoaW50LCBydW5uaW5nKQomIzQzOwkpLAomIzQzOwomIzQzOwlUUF9mYXN0X2Fzc2lnbigKJiM0MzsJCV9fYXNzaWduX3N0cihkZXZuYW1lKTsKJiM0MzsJCV9fZW50cnktJmd0O3BlcmlvZF91cyA9IGlvYy0mZ3Q7cGVyaW9kX3VzOwomIzQzOwkJX19lbnRyeS0mZ3Q7dnJhdGUgPSBpb2MtJmd0O3Z0aW1lX2Jhc2VfcmF0ZTsKJiM0MzsJCV9fZW50cnktJmd0O2J1c3lfbGV2ZWwgPSBpb2MtJmd0O2J1c3lfbGV2ZWw7CiYjNDM7CQlfX2VudHJ5LSZndDtucl9hY3RpdmUgPSBucl9hY3RpdmU7CiYjNDM7CQlfX2VudHJ5LSZndDt1c2FnZV9wY3QgPSBpb2MtJmd0O3BlcmlvZF91cyA/CiYjNDM7CQkJZGl2X3U2NCh1c2FnZV91c19zdW0gKiAxMDAsIGlvYy0mZ3Q7cGVyaW9kX3VzKSA6IDA7CiYjNDM7CQlfX2VudHJ5LSZndDtydW5uaW5nID0gaW9jLSZndDtydW5uaW5nOwomIzQzOwkpLAomIzQzOwomIzQzOwlUUF9wcmludGsoJiMzNDtbJXNdIHBlcmlvZD0ldXVzIHZyYXRlPSVsbHUgYnVzeT0lZCBhY3RpdmU9JWQgdXNhZ2U9JXUlJSBydW5uaW5nPSVkJiMzNDssCiYjNDM7CQlfX2dldF9zdHIoZGV2bmFtZSksIF9fZW50cnktJmd0O3BlcmlvZF91cywgX19lbnRyeS0mZ3Q7dnJhdGUsCiYjNDM7CQlfX2VudHJ5LSZndDtidXN5X2xldmVsLCBfX2VudHJ5LSZndDtucl9hY3RpdmUsIF9fZW50cnktJmd0O3VzYWdlX3BjdCwKJiM0MzsJCV9fZW50cnktJmd0O3J1bm5pbmcKJiM0MzsJKQomIzQzOyk7CiYjNDM7CiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsCiAKIAlUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmMKQEAgLTAsMCAmIzQzOzEsMTU1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDtpb2Nvc3RfbW9kZWwuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2lvY29zdF9tcy5za2VsLmgmIzM0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZQomIzQzOyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KJiM0MzsgKiBTaGFyZWQgYnkgdGhlIGV4YW1wbGUtbW9kZWwgdGVzdHMgYmVsb3cuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldikKJiM0Mzt7CiYjNDM7CWNoYXIgcGF0aFtdID0gJiMzNDsvc3lzL2ZzL2Nncm91cC9pby5jb3N0Lm1vZGVsJiMzNDs7CiYjNDM7CWNoYXIgd29yZFsyNTZdLCBsaW5lWzI1Nl0sIGJ1ZlszMDBdOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJaW50IGVyciwgZm91bmQgPSAwOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHBhdGgsICYjMzQ7ciYjNDM7JiMzNDspOwomIzQzOwlpZiAoIWZwKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtvcGVuICVzOiAlcyYjMzQ7LCBwYXRoLCBzdHJlcnJvcihlcnJubykpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyUyNTVzJiMzNDssIHdvcmQpID09IDEgJmFtcDsmYW1wOyAhc3RyY21wKHdvcmQsIGRldikpIHsKJiM0MzsJCQlmb3VuZCA9IDE7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKCFmb3VuZCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7JXMgaGFzIG5vIGlvY29zdCBsaW5lJiMzNDssIGRldik7CiYjNDM7CQlmY2xvc2UoZnApOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXMgY3RybD1icGYmIzM0OywgZGV2KTsKJiM0MzsJZXJyID0gZnByaW50ZihmcCwgJiMzNDslc1xuJiMzNDssIGJ1Zik7CiYjNDM7CWlmIChlcnIgJmx0Oz0gMCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7d3JpdGUgY3RybD1icGYgZmFpbGVkJiMzNDspOwomIzQzOwkJZmNsb3NlKGZwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlmZmx1c2goZnApOwomIzQzOwomIzQzOwlyZXdpbmQoZnApOwomIzQzOwlmb3VuZCA9IDA7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyUyNTVzJiMzNDssIHdvcmQpID09IDEgJmFtcDsmYW1wOyAhc3RyY21wKHdvcmQsIGRldikpIHsKJiM0MzsJCQlmb3VuZCA9IHN0cnN0cihsaW5lLCAmIzM0O2N0cmw9YnBmJiMzNDspICE9IE5VTEw7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKCFmb3VuZCkKJiM0MzsJCVRIX0xPRygmIzM0O3JlYWRiYWNrIGRvZXMgbm90IHNob3cgY3RybD1icGYmIzM0Oyk7CiYjNDM7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JXMgY3RybD1hdXRvXG4mIzM0OywgZGV2KTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGZvdW5kID8gMCA6IC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpCiYjNDM7ewomIzQzOwlGSUxFICpmcCA9IGZvcGVuKCYjMzQ7L3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5xb3MmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzOwomIzQzOwlpZiAoZnApCiYjNDM7CQlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gZnAgIT0gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZWdpc3RlciB0aGUgZXhhbXBsZSBjb3N0IG1vZGVsIGFuZCBzd2l0Y2ggYSBkZXZpY2UgdG8gY3RybD1icGYuCiYjNDM7ICogSU8gYWNjb3VudGluZyBpdHNlbGYgaXMgbm90IGNoZWNrZWQgaGVyZTsgaXQgbmVlZHMgYSBkZXZpY2UgZG9pbmcKJiM0MzsgKiByZWFsIElPIHVuZGVyIGlvY29zdCBhbmQgaXMgY292ZXJlZCBieSB0aGUga2VybmVsLXNpZGUgdmFsaWRhdGlvbgomIzQzOyAqIGRlc2NyaWJlZCBpbiB0aGUgY292ZXIgbGV0dGVyLgomIzQzOyAqCiYjNDM7ICogUmVxdWlyZXMgcm9vdCwgY2dyb3VwIHYyIGFuZCBhIGRldmljZSB3aXRoIGlvY29zdCBzdXBwb3J0LiAgVGhlCiYjNDM7ICogZGV2aWNlIG11c3QgYmUgZ2l2ZW4gYXMgbWFqb3I6bWlub3IgaW4gJElPQ09TVF9URVNUX0RFViwgb3RoZXJ3aXNlCiYjNDM7ICogdGhlIHRlc3QgaXMgc2tpcHBlZC4KJiM0MzsgKi8KJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvY29zdF9tb2RlbCAqc2tlbDsKJiM0MzsJY2hhciB3b3JkWzI1Nl0sICpkZXY7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWRldiA9IGdldGVudigmIzM0O0lPQ09TVF9URVNUX0RFViYjMzQ7KTsKJiM0MzsJaWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKGRldl9oYXNfaW9jb3N0KCksICYjMzQ7aW9jb3N0X21vdW50ZWQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qIG5lZ2F0aXZlOiBjdHJsPWJwZiBtdXN0IGJlIHJlamVjdGVkIHdoaWxlIG5vIG1vZGVsIGlzCiYjNDM7CSAqIHJlZ2lzdGVyZWQsIHNvIGEgdHlwbyBjYW5ub3Qgc2lsZW50bHkgZGlzYWJsZSBjb3N0IG1vZGVsCiYjNDM7CSAqIHVwZGF0ZXMgKi8KJiM0MzsJaWYgKHNzY2FuZihkZXYsICYjMzQ7JTI1NXMmIzM0Oywgd29yZCkgIT0gMSkKJiM0MzsJCXJldHVybjsKJiM0MzsJewomIzQzOwkJY2hhciBwYXRoW10gPSAmIzM0Oy9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWwmIzM0OzsKJiM0MzsJCWNoYXIgYnVmWzMwMF07CiYjNDM7CQlGSUxFICpmcCA9IGZvcGVuKHBhdGgsICYjMzQ7dyYjMzQ7KTsKJiM0MzsKJiM0MzsJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXMgY3RybD1icGZcbiYjMzQ7LCB3b3JkKTsKJiM0MzsJCWVyciA9IDA7CiYjNDM7CQlpZiAoZnApIHsKJiM0MzsJCQllcnIgPSBmcHJpbnRmKGZwLCAmIzM0OyVzJiMzNDssIGJ1ZikgJmx0Oz0gMDsKJiM0MzsJCQlmY2xvc2UoZnApOwomIzQzOwkJfQomIzQzOwkJQVNTRVJUX1RSVUUoZXJyLCAmIzM0O2N0cmxfYnBmX3dpdGhvdXRfbW9kZWxfcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2tlbCA9IGlvY29zdF9tb2RlbF9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtza2VsX29wZW5fbG9hZCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJLyogYXR0YWNoaW5nIHRoZSBzdHJ1Y3Rfb3BzIHJlZ2lzdGVycyB0aGUgbW9kZWw7IGEgc2Vjb25kCiYjNDM7CSAqIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc2FtZSBvcHMgd291bGQgZmFpbCB3aXRoIEVCVVNZICovCiYjNDM7CWVyciA9IGlvY29zdF9tb2RlbF9fYXR0YWNoKHNrZWwpOwomIzQzOwlpZiAoQVNTRVJUX09LKGVyciwgJiMzNDthdHRhY2gmIzM0OykpCiYjNDM7CQlBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCAmIzM0O3N3aXRjaF9hbmRfcmVhZGJhY2smIzM0Oyk7CiYjNDM7CiYjNDM7CWlvY29zdF9tb2RlbF9fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTYW1lIGNoZWNrIGZvciB0aGUgbXVsdGktc3RyZWFtIGV4YW1wbGUgbW9kZWwuICBPbmx5IG9uZSBtb2RlbCBjYW4KJiM0MzsgKiBiZSByZWdpc3RlcmVkIGF0IGEgdGltZSwgc28gdGhpcyB0ZXN0IG11c3QgcnVuIHNlcGFyYXRlbHkgZnJvbQomIzQzOyAqIHRlc3RfaW9jb3N0X21vZGVsOyBib3RoIGFyZSBzZXJpYWwuCiYjNDM7ICovCiYjNDM7dm9pZCBzZXJpYWxfdGVzdF9pb2Nvc3RfbW9kZWxfc3RyZWFtcyh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvY29zdF9tcyAqc2tlbDsKJiM0MzsJY2hhciAqZGV2OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlkZXYgPSBnZXRlbnYoJiMzNDtJT0NPU1RfVEVTVF9ERVYmIzM0Oyk7CiYjNDM7CWlmICghZGV2IHx8IGdldGV1aWQoKSAhPSAwKSB7CiYjNDM7CQl0ZXN0X19za2lwKCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCAmIzM0O2lvY29zdF9tb3VudGVkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlza2VsID0gaW9jb3N0X21zX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3NrZWxfb3Blbl9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBpb2Nvc3RfbXNfX2F0dGFjaChza2VsKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhlcnIsICYjMzQ7YXR0YWNoJiMzNDspKQomIzQzOwkJQVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgJiMzNDtzd2l0Y2hfYW5kX3JlYWRiYWNrJiMzNDspOwomIzQzOwomIzQzOwlpb2Nvc3RfbXNfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tb2RlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21vZGVsLmMKQEAgLTAsMCAmIzQzOzEsOTEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovCiYjNDM7LyoKJiM0MzsgKiBFeGFtcGxlIGlvY29zdCBjb3N0IG1vZGVsOiB0aGUgYnVpbHRpbiBsaW5lYXIgSEREIGZvcm11bGEgd2l0aCBhbGwKJiM0MzsgKiBjb3N0cyBkb3VibGVkLgomIzQzOyAqCiYjNDM7ICogVGhlIGNvbnN0YW50cyBtaXJyb3Igd2hhdCBjYWxjX2xjb2VmcygpIGRlcml2ZXMgZnJvbSB0aGUgQVVUT1BfSERECiYjNDM7ICogZGVmYXVsdHMgKHJicHM9MTc0MDE5MTc2IHJzZXFpb3BzPTQxNzA4IHJyYW5kaW9wcz0zNzAsIHctc2lkZQomIzQzOyAqIGFuYWxvZykgaW4gdnRpbWUgdW5pdHMgd2hlcmUgMXMgPT0gMl4zNywgZXhwcmVzc2VkIHdpdGggdGhlIHNhbWUKJiM0MzsgKiByb3VuZC11cCBkaXZpc2lvbnMgc28gdGhleSBjYW5ub3QgZHJpZnQgZnJvbSB0aGUga2VybmVsLCBzbyBhCiYjNDM7ICogZGV2aWNlIHN3aXRjaGVkIHRvIGN0cmw9YnBmIHdpdGggdGhpcyBtb2RlbCByZWdpc3RlcmVkIGNoYXJnZXMKJiM0MzsgKiBleGFjdGx5IHR3aWNlIHRoZSBidWlsdGluIG1vZGVsIHVuZGVyIHRoZSBzYW1lIHdvcmtsb2FkLCB3aGljaAomIzQzOyAqIG1ha2VzIGl0IGEgY29udmVuaWVudCB3YXkgdG8gdmVyaWZ5IHRoYXQgYWNjb3VudGluZyBnb2VzIHRocm91Z2gKJiM0MzsgKiB0aGUgQlBGIHBhdGguCiYjNDM7ICovCiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7LyogVlRJTUVfUEVSX1NFQyBjb21lcyBmcm9tIHZtbGludXguaCAoYSBCVEYgZW51bSBjb25zdGFudCkgKi8KJiM0MzsjZGVmaW5lIElPQ19QQUdFX1NJWkUJCTQwOTYKJiM0MzsjZGVmaW5lIElPQ19TRUNUX1RPX1BBR0VfU0hJRlQJMwkvKiA1MTJCIHNlY3RvcnMgdG8gNGtCIHBhZ2VzICovCiYjNDM7I2RlZmluZSBMQ09FRl9SQU5ESU9fUEFHRVMJNDA5NgkvKiAxNk1CIHNlZWsgdGhyZXNob2xkICovCiYjNDM7I2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFCSgxVUxMICZsdDsmbHQ7IDApCS8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi8KJiM0MzsKJiM0MzsvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXQKJiM0MzsgKiBjb21waWxlIHRpbWUgKi8KJiM0MzsjZGVmaW5lIFJVKHgsIHkpCQkoKHgpIC8gKHkpICYjNDM7ICgoKHgpICUgKHkpKSA/IDEgOiAwKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFJCUFMJMTc0MDE5MTc2VUxMCiYjNDM7I2RlZmluZSBSU0VRSU9QUwk0MTcwOFVMTAomIzQzOyNkZWZpbmUgUlJBTkRJT1BTCTM3MFVMTAomIzQzOyNkZWZpbmUgV0JQUwkxNzgwNzU4NjZVTEwKJiM0MzsjZGVmaW5lIFdTRVFJT1BTCTQyNzA1VUxMCiYjNDM7I2RlZmluZSBXUkFORElPUFMJMzc4VUxMCiYjNDM7CiYjNDM7I2RlZmluZSBSUEFHRQkoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKQomIzQzOyNkZWZpbmUgUlNFUUlPCShSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSkKJiM0MzsjZGVmaW5lIFJSQU5ESU8JKFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSkKJiM0MzsjZGVmaW5lIFdQQUdFCShSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpCiYjNDM7I2RlZmluZSBXU0VRSU8JKFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKQomIzQzOyNkZWZpbmUgV1JBTkRJTwkoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTY0IGJ1aWx0aW5fY29zdCh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsCiYjNDM7CQkJCQl1NjQgY3Vyc29yLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwl1NjQgcGFnZXMsIHNlZWtfcGFnZXMgPSAwLCBiYXNlLCBjb2VmX3BhZ2U7CiYjNDM7CiYjNDM7CWlmICghbmJ5dGVzKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXN3aXRjaCAob3ApIHsKJiM0MzsJY2FzZSBSRVFfT1BfUkVBRDoKJiM0MzsJCWJhc2UgPSBSU0VRSU87CiYjNDM7CQljb2VmX3BhZ2UgPSBSUEFHRTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJFUV9PUF9XUklURToKJiM0MzsJCWJhc2UgPSBXU0VRSU87CiYjNDM7CQljb2VmX3BhZ2UgPSBXUEFHRTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGN1cnNvcikgewomIzQzOwkJc2Vla19wYWdlcyA9IHNlY3RvciAmZ3Q7IGN1cnNvciA/IHNlY3RvciAtIGN1cnNvcgomIzQzOwkJCQkJICAgICA6IGN1cnNvciAtIHNlY3RvcjsKJiM0MzsJCXNlZWtfcGFnZXMgJmd0OyZndDs9IElPQ19TRUNUX1RPX1BBR0VfU0hJRlQ7CiYjNDM7CQlpZiAoc2Vla19wYWdlcyAmZ3Q7IExDT0VGX1JBTkRJT19QQUdFUykKJiM0MzsJCQliYXNlID0gKG9wID09IFJFUV9PUF9SRUFEKSA/IFJSQU5ESU8gOiBXUkFORElPOwomIzQzOwl9CiYjNDM7CiYjNDM7CXBhZ2VzID0gUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKTsKJiM0MzsJaWYgKGZsYWdzICZhbXA7IElPQ09TVF9DT1NUX0ZfTUVSR0UpCiYjNDM7CQliYXNlID0gMDsKJiM0MzsJcmV0dXJuIGJhc2UgJiM0MzsgcGFnZXMgKiBjb2VmX3BhZ2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N0cnVjdF9vcHMmIzM0OykKJiM0Mzt1NjQgQlBGX1BST0coaW9jb3N0XzJ4X2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLAomIzQzOwkgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwlyZXR1cm4gMiAqIGJ1aWx0aW5fY29zdChvcCwgbmJ5dGVzLCBzZWN0b3IsIGN1cnNvciwgZmxhZ3MpOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDsuc3RydWN0X29wcyYjMzQ7KQomIzQzO3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIGlvY29zdF8yeCA9IHsKJiM0MzsJLmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0XzJ4X2NhbGNfY29zdCwKJiM0Mzt9OwomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjQ2NWZkNWQ1YzYyZTAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmMKQEAgLTAsMCAmIzQzOzEsMTIyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOy8qCiYjNDM7ICogRXhhbXBsZSBtdWx0aS1zdHJlYW0gc2VxdWVudGlhbGl0eSBkZXRlY3Rpb24gY29zdCBtb2RlbC4KJiM0MzsgKgomIzQzOyAqIFRoZSBidWlsdGluIG1vZGVsIGtlZXBzIGEgc2luZ2xlIGN1cnNvciBwZXIgY2dyb3VwLCBzbyB0d28KJiM0MzsgKiBpbnRlcmxlYXZlZCBzZXF1ZW50aWFsIHJlYWRlcnMgaW4gb25lIGNncm91cCBhcmUgYWxsIHByaWNlZCByYW5kb20KJiM0MzsgKiAobWVhc3VyZWQgODl4IG92ZXJjaGFyZ2UsIDEyLjl4IHRocm91Z2hwdXQgY29sbGFwc2UpLCB3aGlsZSByYW5kb20KJiM0MzsgKiBJTyBpbnNpZGUgYSBob3Qgd2luZG93IHNtYWxsZXIgdGhhbiB0aGUgMTZNQiBzZWVrIHRocmVzaG9sZCBpcwomIzQzOyAqIHByaWNlZCBzZXF1ZW50aWFsIChtZWFzdXJlZCAxMDd4IHVuZGVyY2hhcmdlKS4gIFRoaXMgbW9kZWwgcmVwbGFjZXMKJiM0MzsgKiB0aGUgc2luZ2xlIGN1cnNvciB3aXRoIGEgcGVyLWNncm91cCB0YWJsZSBvZiBzdHJlYW0gc2xvdHMsIGtleWVkIGJ5CiYjNDM7ICogdGhlIGlvY2dfaWQgYXJndW1lbnQ6IGFuIElPIGlzIHNlcXVlbnRpYWwgaWZmIGl0cyBzZWN0b3IgbWF0Y2hlcyB0aGUKJiM0MzsgKiBleHBlY3RlZCBuZXh0IHNlY3RvciBvZiBhbnkgdHJhY2tlZCBzdHJlYW0uICBJbnRlcmxlYXZlZCBzdHJlYW1zCiYjNDM7ICoga2VlcCB0aGVpciBvd24gc2xvdHMsIGFuZCB3aW5kb3dlZCByYW5kb20gSU8gcmFyZWx5IG1hdGNoZXMgYQomIzQzOyAqIG1vdmluZyBleHBlY3RhdGlvbi4KJiM0MzsgKi8KJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsKJiM0MzsvKiBWVElNRV9QRVJfU0VDIGNvbWVzIGZyb20gdm1saW51eC5oIChhIEJURiBlbnVtIGNvbnN0YW50KSAqLwomIzQzOyNkZWZpbmUgSU9DX1BBR0VfU0laRQkJNDA5NgomIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRQkoMVVMTCAmbHQ7Jmx0OyAwKQkvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovCiYjNDM7CiYjNDM7LyogRElWNjRfVTY0X1JPVU5EX1VQIC8gRElWX1JPVU5EX1VQX1VMTCBlcXVpdmFsZW50cywgZm9sZGVkIGF0CiYjNDM7ICogY29tcGlsZSB0aW1lICovCiYjNDM7I2RlZmluZSBSVSh4LCB5KQkJKCh4KSAvICh5KSAmIzQzOyAoKCh4KSAlICh5KSkgPyAxIDogMCkpCiYjNDM7CiYjNDM7I2RlZmluZSBSQlBTCTE3NDAxOTE3NlVMTAomIzQzOyNkZWZpbmUgUlNFUUlPUFMJNDE3MDhVTEwKJiM0MzsjZGVmaW5lIFJSQU5ESU9QUwkzNzBVTEwKJiM0MzsjZGVmaW5lIFdCUFMJMTc4MDc1ODY2VUxMCiYjNDM7I2RlZmluZSBXU0VRSU9QUwk0MjcwNVVMTAomIzQzOyNkZWZpbmUgV1JBTkRJT1BTCTM3OFVMTAomIzQzOwomIzQzOyNkZWZpbmUgUlBBR0UJKFJVKFZUSU1FX1BFUl9TRUMsIFJVKFJCUFMsIElPQ19QQUdFX1NJWkUpKSkKJiM0MzsjZGVmaW5lIFJTRVFJTwkoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpCiYjNDM7I2RlZmluZSBSUkFORElPCShSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpCiYjNDM7I2RlZmluZSBXUEFHRQkoUlUoVlRJTUVfUEVSX1NFQywgUlUoV0JQUywgSU9DX1BBR0VfU0laRSkpKQomIzQzOyNkZWZpbmUgV1NFUUlPCShSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSkKJiM0MzsjZGVmaW5lIFdSQU5ESU8JKFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSkKJiM0MzsKJiM0MzsjZGVmaW5lIE5TTE9UUwk0CiYjNDM7CiYjNDM7c3RydWN0IHN0cmVhbXMgewomIzQzOwlfX3U2NCBleHBlY3RlZFtOU0xPVFNdOwkvKiBuZXh0IGV4cGVjdGVkIHNlY3RvciwgcGVyIHN0cmVhbSAqLwomIzQzOwlfX3U2NCBzdGFtcFtOU0xPVFNdOwkvKiBMUlUgc3RhbXAsIDAgPSBlbXB0eSAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTsKJiM0MzsJX190eXBlKGtleSwgX191NjQpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCBzdHJlYW1zKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCA2NCk7CiYjNDM7fSBzdHJlYW1fdGFiIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO1NFQygmIzM0O3N0cnVjdF9vcHMmIzM0OykKJiM0Mzt1NjQgQlBGX1BST0coaW9jb3N0X21zX2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLAomIzQzOwkgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RyZWFtcyAqczsKJiM0MzsJdTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdzsKJiM0MzsJdTMyIGksIHZpY3RpbSA9IDAsIGZvdW5kID0gMHhGRkZGRkZGRjsKJiM0MzsKJiM0MzsJaWYgKG9wICE9IFJFUV9PUF9SRUFEICZhbXA7JmFtcDsgb3AgIT0gUkVRX09QX1dSSVRFKQomIzQzOwkJcmV0dXJuIDA7CS8qIGRlbGVnYXRlIHRoZSByZXN0IHRvIGJ1aWx0aW4gKi8KJiM0MzsJaWYgKCFuYnl0ZXMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJaWYgKG9wID09IFJFUV9PUF9SRUFEKSB7CiYjNDM7CQlwYWdlID0gUlBBR0U7IHNlcWlvID0gUlNFUUlPOyByYW5kaW8gPSBSUkFORElPOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcGFnZSA9IFdQQUdFOyBzZXFpbyA9IFdTRVFJTzsgcmFuZGlvID0gV1JBTkRJTzsKJiM0MzsJfQomIzQzOwlhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpOwkvKiBzZWN0b3JzICovCiYjNDM7CiYjNDM7CXMgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7c3RyZWFtX3RhYiwgJmFtcDtpb2NnX2lkKTsKJiM0MzsJaWYgKCFzKSB7CiYjNDM7CQlzdHJ1Y3Qgc3RyZWFtcyB6ZXJvID0ge307CiYjNDM7CiYjNDM7CQlicGZfbWFwX3VwZGF0ZV9lbGVtKCZhbXA7c3RyZWFtX3RhYiwgJmFtcDtpb2NnX2lkLCAmYW1wO3plcm8sCiYjNDM7CQkJCSAgICBCUEZfTk9FWElTVCk7CiYjNDM7CQlzID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3N0cmVhbV90YWIsICZhbXA7aW9jZ19pZCk7CiYjNDM7CQlpZiAoIXMpCiYjNDM7CQkJcmV0dXJuIHNlcWlvICYjNDM7IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmbGFncyAmYW1wOyBJT0NPU1RfQ09TVF9GX01FUkdFKSB7CiYjNDM7CQliYXNlID0gMDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5vdyA9IGJwZl9rdGltZV9nZXRfbnMoKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5TTE9UUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChzLSZndDtleHBlY3RlZFtpXSA9PSBzZWN0b3IgJmFtcDsmYW1wOyBzLSZndDtzdGFtcFtpXSkgewomIzQzOwkJCWZvdW5kID0gaTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlpZiAoZm91bmQgIT0gMHhGRkZGRkZGRikgewomIzQzOwkJYmFzZSA9IHNlcWlvOwomIzQzOwkJcy0mZ3Q7ZXhwZWN0ZWRbZm91bmRdID0gc2VjdG9yICYjNDM7IGFkdmFuY2U7CiYjNDM7CQlzLSZndDtzdGFtcFtmb3VuZF0gPSBub3c7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQliYXNlID0gcmFuZGlvOwomIzQzOwkJZm9yIChpID0gMTsgaSAmbHQ7IE5TTE9UUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAocy0mZ3Q7c3RhbXBbaV0gJmx0OyBzLSZndDtzdGFtcFt2aWN0aW1dKQomIzQzOwkJCQl2aWN0aW0gPSBpOwomIzQzOwkJfQomIzQzOwkJcy0mZ3Q7ZXhwZWN0ZWRbdmljdGltXSA9IHNlY3RvciAmIzQzOyBhZHZhbmNlOwomIzQzOwkJcy0mZ3Q7c3RhbXBbdmljdGltXSA9IG5vdzsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJcmV0dXJuIGJhc2UgJiM0MzsgUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKSAqIHBhZ2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0Oy5zdHJ1Y3Rfb3BzJiMzNDspCiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgaW9jb3N0X21zID0gewomIzQzOwkuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LAomIzQzO307CiYjNDM7CiYjNDM7Y2hhciBMSUNFTlNFW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjY0MwoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDgxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBLTVNBTiBGdXp6aW5nIE5lZWRzKioKCk9rYXksIHRoZSB0YXNrIGlzIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoLCBpbnRyb2R1Y2luZyBCUEYgc3RydWN0X29wcyBwbHVnZ2FibGUgY29zdCBtb2RlbCBzdXBwb3J0IGZvciBibGstaW9jb3N0IChzcGVjaWZpY2FsbHkgd2l0aCBgQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRmApLCByZXF1aXJlcyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIExldCYjMzk7cyBkaWcgaW4uCgpUaGUgcGF0Y2ggdG91Y2hlcyBhIGdvb2QgY2h1bmsgb2YgY29kZTogZG9jdW1lbnRhdGlvbiwgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlIGluIHRoZSBibG9jayBzdWJzeXN0ZW0sIHRoZSBjb3JlIGlvY29zdCBCUEYgaW1wbGVtZW50YXRpb24gKGBibGstaW9jb3N0LWJwZi5jYCksIHRoZSBleGlzdGluZyBpb2Nvc3QgbG9naWMgKGBibGstaW9jb3N0LmNgKSwgaGVhZGVyIGZpbGVzIGZvciBrZXJuZWwgaW50ZXJmYWNlcyAoYGJsay1pb2Nvc3QuaGAgYW5kIHRyYWNlIGV2ZW50cyBgaW9jb3N0LmhgKSwgYW5kIHNlbGYgdGVzdHMuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBjaGFuZ2UsIHNvIHdlIG5lZWQgdG8gYmUgdGhvcm91Z2guCgpGaXJzdCwgbGV0JiMzOTtzIGxvb2sgZm9yIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuIGBibGstaW9jb3N0LWJwZi5jYCBsb29rcyBsaWtlIHRoZSBwbGFjZSB0byBzdGFydC4gVGhlIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAgZnVuY3Rpb24gaXMgdGhlIG1haW4gY2FuZGlkYXRlLiBJdCB0YWtlcyBzY2FsYXIgYXJndW1lbnRzLCB3aGljaCBpcyBnZW5lcmFsbHkgYSBnb29kIHNpZ24uIEl0JiMzOTtzIHJldHVybmluZyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgc3VjY2VzcywgYW5kIHRoZW4gd3JpdGluZyB0aGUgcmVzdWx0IGludG8gYGNvc3RwYC4gSWYgYGlvY29zdF9icGZfY2FsY19jb3N0YCBmYWlscywgYSBkaWZmZXJlbnQgZnVuY3Rpb24gY2FsbGVkIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgaXMgY2FsbGVkLCBhbmQgYGJwZl9jb3N0YCB3aWxsIG5ldmVyIGJlIHVzZWQuIExvb2tzIGxpa2UgdGhlcmUgYXJlbiYjMzk7dCBvYnZpb3VzIGlzc3VlcyB0aGVyZSBhdCBmaXJzdCBnbGFuY2UuCgpOb3csIGxldCYjMzk7cyB0dXJuIG91ciBhdHRlbnRpb24gdG8gYGJsay1pb2Nvc3QuY2AgYW5kIGhvdyBpdCBpbnRlZ3JhdGVzIHdpdGggdGhpcyBuZXcgQlBGIGZ1bmN0aW9uYWxpdHkuIFNwZWNpZmljYWxseSwgdGhlIGBjYWxjX3Z0aW1lX2Nvc3RgIGZ1bmN0aW9uLiBIZXJlJiMzOTtzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zOiB0aGUgQlBGIGZ1bmN0aW9uLCBpZiBwcmVzZW50LCBpcyBjYWxsZWQuIEl0IHVzZXMgYFJFQURfT05DRWAsIHdoaWNoIHNlZW1zIGFwcHJvcHJpYXRlLiBJZiBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgIHJldHVybnMgdHJ1ZSwgaXQgdXBkYXRlcyBgYnBmX2Nvc3RgLCBvdGhlcndpc2UsIGl0IGNhbGxzIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAuIFNvLCB0aGUgY29kZXBhdGggbG9va3Mgc291bmQuCgpUbyBiZSBhYnNvbHV0ZWx5IHN1cmUsIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAuIEkmIzM5O2xsIHVzZSBgZ3JlcHBlcmAgb3IgYHJlYWQtZmlsZWAgdG8gY2FyZWZ1bGx5IGV4YW1pbmUgdGhhdCBmdW5jdGlvbiBhbmQgaXRzIHN1cnJvdW5kaW5nIGNvbnRleHQuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0aW4gY29zdCBjYWxjdWxhdGlvbiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBCUEYgY2FsY3VsYXRpb24gZG9lc24mIzM5O3QgaGFwcGVuIHdpdGhvdXQgYW55IGluaXRpYWxpemF0aW9uIHByb2JsZW1zLgoKQmFzZWQgb24gdGhpcyBxdWljayBhbmFseXNpcywgYW5kIGFzc3VtaW5nIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgaXMgYWxzbyBzYWZlLCBJICpzdXNwZWN0KiB0aGlzIHBhdGNoICptaWdodCBub3QqIGltbWVkaWF0ZWx5IHNjcmVhbSAmIzM0O05lZWRzS01TQU49dHJ1ZS4mIzM0OyBIb3dldmVyLCB0aGUgaW50cm9kdWN0aW9uIG9mIEJQRiBhbHdheXMgd2FycmFudHMgZXh0cmEgc2NydXRpbnksIGJlY2F1c2Ugb2YgdGhlIHBvdGVudGlhbCBmb3IgY29tcGxleCBpbnRlcmFjdGlvbnMgYW5kIHN1YnRsZSBtZW1vcnkgaGF6YXJkcy4gSSYjMzk7ZCBsZWFuIHRvd2FyZHMgcmVxdWlyaW5nIGZ1cnRoZXIgcmV2aWV3IGFuZCB0ZXN0aW5nLCBidXQgaXQmIzM5O3Mgbm90IGEgc2xhbSBkdW5rICYjMzQ7eWVzJiMzNDsgZm9yIEtNU0FOIGZ1enppbmcgKnlldCouIEkmIzM5O2xsIG5lZWQgdG8gY29uZmlybSBteSB1bmRlcnN0YW5kaW5nIG9mIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgdG8gbWFrZSBhIGZpbmFsIGNhbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NhbGNfdnRpbWVfY29zdF9idWlsdGluJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2Jsb2NrL2Jsay1pb2Nvc3QuYz0yNDczPXN0YXRpYyB1NjQgYWRqdXN0X2ludXNlX2FuZF9jYWxjX2Nvc3Qoc3RydWN0IGlvY19ncSAqaW9jZywgdTY0IHZ0aW1lLFxuLS1cbmJsb2NrL2Jsay1pb2Nvc3QuYy0yNTMzLVxuYmxvY2svYmxrLWlvY29zdC5jOjI1MzQ6c3RhdGljIHZvaWQgY2FsY192dGltZV9jb3N0X2J1aWx0aW4oc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLFxuYmxvY2svYmxrLWlvY29zdC5jLTI1MzUtXHRcdFx0XHQgICAgYm9vbCBpc19tZXJnZSwgdTY0ICpjb3N0cClcbi0tXG5ibG9jay9ibGstaW9jb3N0LmM9MjU3OT1zdGF0aWMgdTY0IGNhbGNfdnRpbWVfY29zdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBpb2NfZ3EgKmlvY2csIGJvb2wgaXNfbWVyZ2UpXG4tLVxuYmxvY2svYmxrLWlvY29zdC5jLTI1OTktXG5ibG9jay9ibGstaW9jb3N0LmM6MjYwMDpcdGNhbGNfdnRpbWVfY29zdF9idWlsdGluKGJpbywgaW9jZywgaXNfbWVyZ2UsIFx1MDAyNmNvc3QpO1xuYmxvY2svYmxrLWlvY29zdC5jLTI2MDEtXHRyZXR1cm4gY29zdDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQzODIKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiA2MjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBJT0Nvc3QgVHJhY2Vwb2ludCBhbmQgTW9kZWwqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgd2l0aCBgdHJhY2VfaW9jb3N0X2lvY190aWNrYCBhbmQgaXRzIGFzc29jaWF0ZWQgYWRkaXRpb25zLiBMb29raW5nIGF0IGBpbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaGAsIEkgc2VlIHRoZSB0cmFjZXBvaW50IGRlZmluaXRpb24uIEl0JiMzOTtzIGNhcHR1cmluZyBzZXZlcmFsIGtleSBwaWVjZXMgb2YgaW5mb3JtYXRpb246IHRoZSBkZXZpY2UgbmFtZSwgdGhlIHBlcmlvZCBpbiBtaWNyb3NlY29uZHMsIHRoZSB2aXJ0dWFsIHJhdGUsIHRoZSBidXN5IGxldmVsLCBudW1iZXIgb2YgYWN0aXZlIHJlcXVlc3RzLCB1c2FnZSBwZXJjZW50YWdlLCBhbmQgYSAmIzM5O3J1bm5pbmcmIzM5OyBmbGFnLiBJIG5vdGljZSB0aGF0IGFsbCBvZiB0aGVzZSBmaWVsZHMgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQsIHdoaWNoIGlzIGdvb2QgZm9yIGNsYXJpdHkgYW5kIGNvbnRyb2wuCgpOb3csIGxldCYjMzk7cyBzaGlmdCBnZWFycyBhbmQgbG9vayBhdCBob3cgdGhlIGNvc3QgbW9kZWwgaXMgYmVpbmcgcG9wdWxhdGVkLCBzcGVjaWZpY2FsbHkgd2l0aCBgaW9jX2Nvc3RfbW9kZWxfcHJmaWxsYC4gVGhpcyBjb2RlIHNuaXBwZXQgdXNlcyBgc2VxX3ByaW50ZmAgdG8gb3V0cHV0IGNvc3QgbW9kZWwgcGFyYW1ldGVycy4gSSBzZWUgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGRldGVybWluaW5nIHRoZSAmIzM0O2N0cmwmIzM0OyB2YWx1ZSDigJMgaXQmIzM5O3MgYmFzZWQgb24gYGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWxgIGFuZCBgaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWxgLiBBaCwgc28gYGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWxgIGlzIGEgYm9vbGVhbiB2YWx1ZSwgc2V0IHZpYSBgV1JJVEVfT05DRWAuIFRoaXMgdGVsbHMgbWUgd2hldGhlciB3ZSYjMzk7cmUgdXNpbmcgYSBCUEYtYmFzZWQgY29zdCBtb2RlbCBvciBub3QuCgpJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBgc3RydWN0IGlvY2AgaXRzZWxmLiBJIGtub3cgaXQmIzM5O3MgYWxsb2NhdGVkLiBJIG5lZWQgdG8gdmVyaWZ5IGV4YWN0bHkgaG93IHRoYXQgYWxsb2NhdGlvbiBoYXBwZW5zLiBJIHNob3VsZCBjaGVjayBgaW9jX2luaXRgIG9yIGBpb2Nvc3RfaW5pdGAgdG8gY29uZmlybSBteSBhc3N1bXB0aW9uIHRoYXQgaXQmIzM5O3MgYmVpbmcgemVyb2VkIG91dCB3aXRoIGBremFsbG9jYC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBgaW9jYCBzdHJ1Y3QgaXMgaGFuZGxlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a3phbGxvYy4qaW9jJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2Jsb2NrL2Jsay1pb2Nvc3QuYz0yOTM5PXN0YXRpYyBpbnQgYmxrX2lvY29zdF9pbml0KHN0cnVjdCBnZW5kaXNrICpkaXNrKVxuLS1cbmJsb2NrL2Jsay1pb2Nvc3QuYy0yOTQzLVxuYmxvY2svYmxrLWlvY29zdC5jOjI5NDQ6XHRpb2MgPSBremFsbG9jX29iaigqaW9jKTtcbmJsb2NrL2Jsay1pb2Nvc3QuYy0yOTQ1LVx0aWYgKCFpb2MpXG4tLVxuYmxvY2svYmxrLWlvY29zdC5jPTMwMDQ9c3RhdGljIHN0cnVjdCBibGtjZ19wb2xpY3lfZGF0YSAqaW9jX2NwZF9hbGxvYyhnZnBfdCBnZnApXG4tLVxuYmxvY2svYmxrLWlvY29zdC5jLTMwMDctXG5ibG9jay9ibGstaW9jb3N0LmM6MzAwODpcdGlvY2MgPSBremFsbG9jX29iaihzdHJ1Y3QgaW9jX2NncnAsIGdmcCk7XG5ibG9jay9ibGstaW9jb3N0LmMtMzAwOS1cdGlmICghaW9jYylcbi0tXG5ibG9jay9ibGstaW9jb3N0LmM9MzAyMT1zdGF0aWMgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKmlvY19wZF9hbGxvYyhzdHJ1Y3QgZ2VuZGlzayAqZGlzayxcbi0tXG5ibG9jay9ibGstaW9jb3N0LmMtMzAyNi1cbmJsb2NrL2Jsay1pb2Nvc3QuYzozMDI3Olx0aW9jZyA9IGt6YWxsb2Nfbm9kZShzdHJ1Y3Rfc2l6ZShpb2NnLCBhbmNlc3RvcnMsIGxldmVscyksIGdmcCxcbmJsb2NrL2Jsay1pb2Nvc3QuYy0zMDI4LVx0XHRcdCAgICBkaXNrLVx1MDAzZW5vZGVfaWQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTcwOQoJCQkJCQkJb3V0cHV0OiAzNjIKCQkJCQkJCXRob3VnaHRzOiAxMTY2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFzc2Vzc21lbnQ6IGJsay1pb2Nvc3QgQlBGIFN0cnVjdF9PcHMgU3VwcG9ydCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBzZWUgYGlvY2AgaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5IHVzaW5nIGBremFsbG9jX29iamAuIFRoZSBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgIGZ1bmN0aW9uIGxvb2tzIHNvdW5kLCB3aXRoIHByb3BlciBsb2NraW5nIGFuZCBpbml0aWFsaXphdGlvbiBvZiBgdXNlcmAgYW5kIGBicGZgIGZsYWdzIGJhc2VkIG9uIGlucHV0IHN0cmluZ3MgKCYjMzQ7YXV0byYjMzQ7LCAmIzM0O3VzZXImIzM0OywgJiMzNDticGYmIzM0OykuIFRoZSBCUEYgbG9naWMgaXMgY29uZGl0aW9uYWxseSBlbmFibGVkIHdpdGggYENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZgLCBhbmQgdGhlIGZpbmFsIGBXUklURV9PTkNFYCBlbnN1cmVzIGF0b21pYyB1cGRhdGUgb2YgYGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWxgLiBFdmVyeXRoaW5nIHNlZW1zIHdlbGwtc3RydWN0dXJlZCBhdCB0aGlzIGxldmVsLgoKTm93LCBvbiB0byB0aGUgQlBGIHN0cnVjdF9vcHMgcmVnaXN0cmF0aW9uIGluIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYC4gYGJwZl9pb2Nvc3RfbW9kZWxfb3BzYCBpcyBhIHN0YXRpYyBzdHJ1Y3QsIGFuZCB0aGUgcmVnaXN0cmF0aW9uIGxvZ2ljIHdpdGggYG11dGV4X2xvY2tgLCBgcmN1X2Fzc2lnbl9wb2ludGVyYCwgYW5kIGBzdGF0aWNfYnJhbmNoX2luY2AgbG9va3Mgc3RhbmRhcmQgYW5kIHNhZmUsIHV0aWxpemluZyBSQ1UgcHJvcGVybHkuIGBuZXdfb3BzYCBpcyBwYXNzZWQgaW4gYXMgYSBwb2ludGVyLgoKTXkgZm9jdXMgbm93IHNoaWZ0cyB0byBwb3RlbnRpYWwgS01TQU4gaXNzdWVzIOKAkyBpbmZvIGxlYWtzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBJJiMzOTttIGFjdGl2ZWx5IGxvb2tpbmcgZm9yIGFueSBzY2VuYXJpbyB3aGVyZSB1bmluaXRpYWxpemVkIGtlcm5lbCBkYXRhIGNvdWxkIGxlYWsgdG8gdXNlcnNwYWNlLiBJJiMzOTt2ZSBnb3QgdG8gYmUgZXh0cmEgdGhvcm91Z2ggaGVyZS4KCjEuICAqKktlcm5lbC10by1Vc2Vyc3BhY2UgTGVha3M6KiogSSBzZWUgbm8gZGlyZWN0IGV4cG9zdXJlIG9mIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSB2aWEgYGNvcHlfdG9fdXNlcmAsIGBwdXRfdXNlcmAsIHNvY2tldCBvcHRpb25zLCBldGMuLCB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzLiBUaGUgb3V0cHV0cyBhcmUgYWxsIHZpYSBzYWZlIG1ldGhvZHMgLSBzZXFcX2ZpbGUgZm9ybWF0dGluZywgdHJhY2Vwb2ludHMgd2l0aCBleHBsaWNpdCBmaWVsZHMsIGFuZCBzdGFuZGFyZCBzdHJ1Y3RcX29wcyByZWdpc3RyYXRpb24sIHdoaWNoIGFyZSBjaGVja2VkLgoyLiAgKipVbmluaXRpYWxpemVkIFZhcmlhYmxlIEJyYW5jaGluZzoqKiBUaGUgY29kZSBjaGVja3MgYXJlIGFsbCBleHBsaWNpdC4gQWxsIHZhcmlhYmxlcyBsaWtlIGBicGZgLCBgdXNlcmAsIGByZXRgLCBgY29zdGAgYXJlIGluaXRpYWxpemVkIGJlZm9yZSBhbnkgdXNlLgozLiAgKipDb21wbGV4IERhdGEgU3RydWN0dXJlczoqKiBBbGwgYWxsb2NhdGlvbnMgbG9vayBsaWtlIHRoZXkgYXJlIHplcm9lZC4KNC4gICoqQnVmZmVyIEJvdW5kIENoZWNrczoqKiBUaGUgYnVmZmVyIGJvdW5kcyBjaGVja3MgZG9uJiMzOTt0IHNlZW0gbGlrZSB0aGV5IGFyZSBtb2RpZmllZCBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYWQgdG8gZXhwb3NpbmcgdW5pbml0aWFsaXplZCBieXRlcy4KClNvLCB0aGlzIGxvb2tzIHByZXR0eSBjbGVhbi4KCldoYXQgYWJvdXQgb3RoZXIgYnVnIGNsYXNzZXM/IENvbmN1cnJlbmN5IGlzc3VlcyB3aXRoIFJDVS9tdXRleC9zdGF0aWMga2V5cyBhcmUgYSBwb3NzaWJpbGl0eSwgYnV0IExPQ0tERVAsIEtBU0FOLCBhbmQgVFNBTiBzaG91bGQgY2F0Y2ggdGhvc2UuIE5VTEwgZGVyZWZlcmVuY2VzIG9yIGxvZ2ljIGJ1Z3MgY291bGQgc3RpbGwgc25lYWsgdGhyb3VnaCwgYnV0IHRoZSBzdGFuZGFyZCBrZXJuZWwgY2hlY2tzIGFuZCBLQVNBTiB3aWxsIGJlIHZlcnkgZWZmZWN0aXZlIGhlcmUuIEFueSBCUEYgdmVyaWZpZXIgb3Igc3RydWN0XF9vcHMgaW50ZXJhY3Rpb24gYnVncyBhcmUgYWxzbyBjb3ZlcmVkIGJ5IGV4aXN0aW5nIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTi4KCkkmIzM5O20gc3RhcnRpbmcgdG8gZmVlbCBjb25maWRlbnQsIGJ1dCBsZXQmIzM5O3MgZG91YmxlLWNoZWNrIGV2ZXJ5dGhpbmcuIGBpbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaGAgaXMganVzdCBkZWNsYXJhdGlvbnMuIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYCBsb29rcyB2ZXJ5IGNsZWFuLCB3aXRoIHNjYWxhciBhcmd1bWVudHMgcGFzc2VkIGJ5IHZhbHVlIHRvIHRoZSBCUEYgcHJvZ3JhbSwgYW5kIHRoZSBgdTY0IGNvc3RgIGlzIHRob3JvdWdobHkgY2hlY2tlZC4gVGhlIGB0cmFjZV9pb2Nvc3RfaW9jX3RpY2tgIGZ1bmN0aW9uIGlzIGFzc2lnbmluZyBhbGwgZmllbGRzIGZyb20gc2NhbGFyIHZhcmlhYmxlcyBhbmQgYGlvY2AgZmllbGRzLCB3aGljaCBpcyBnb29kLiBUaGUgYnVpbGQgYW5kIGRvYyBjaGFuZ2VzIGluIGBEb2N1bWVudGF0aW9uL2AsIGBibG9jay9LY29uZmlnYCwgYW5kIGBibG9jay9NYWtlZmlsZWAgc2VlbSBzdGFuZGFyZC4gVGhlIHVzZXJzcGFjZSBzZWxmLXRlc3RzIGFyZSBwcmVzZW50IGFuZCB3ZWxsLWRlZmluZWQuCgpUaGVyZWZvcmUsIG15IGNvbmNsdXNpb24gaXMgYE5lZWRzS01TQU49ZmFsc2VgLgoKSGVyZSYjMzk7cyBteSBjbGVhciBLTVNBTiByZWFzb25pbmc6CgoqICAgVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdFxfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIGJsay1pb2Nvc3QsIGVuYWJsaW5nIGR5bmFtaWMgdnRpbWUgY29zdCBjYWxjdWxhdGlvbiB2aWEgYSBCUEYgcHJvZ3JhbS4gSXQgYWxzbyBhZGRzIGEgdHJhY2Vwb2ludCBhbmQgdXBkYXRlcyBjb3N0IG1vZGVsIGNvbnRyb2wgbG9naWMuCiogICBLTVNBTiBpcyBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UgYW5kIGtlcm5lbC10by11c2VyIGluZm8gbGVha3MuIEluIHRoaXMgcGF0Y2gsIGFsbCBuZXcgc3RydWN0dXJlcywgbG9jYWwgdmFyaWFibGVzLCBhbmQgdHJhY2Vwb2ludCBmaWVsZHMgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuIEJQRiBzdHJ1Y3RcX29wcyBmdW5jdGlvbnMgdGFrZSBzY2FsYXIgdmFsdWVzIHBhc3NlZCBieSB2YWx1ZSwgYW5kIHRoZSBvdXRwdXQgYGJwZl9jb3N0YCBpcyB3cml0dGVuIGRpcmVjdGx5IGFuZCBjaGVja2VkIGJlZm9yZSBiZWluZyByZXR1cm5lZC4gTm8ga2VybmVsIG1lbW9yeSBpcyBleHBvc2VkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbi4KKiAgIFRoZSBwcmltYXJ5IGNvbmNlcm5zIGhlcmUgYXJlIGNvbmN1cnJlbmN5L2xvY2tpbmcgc3luY2hyb25pemF0aW9uIChSQ1UsIG11dGV4LCBhbmQgc3RhdGljIGtleXMpIGFuZCBwb3RlbnRpYWwgbG9naWMgYnVncyBvciBpbnZhbGlkIGRlcmVmZXJlbmNlcy4gVGhlc2UgY29uY2VybnMgYXJlIGFscmVhZHkgYWRkcmVzc2VkIGJ5IHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi4KKiAgIFRodXMsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgZGF0YSBsZWFrcywgc28gdGhpcyBwYXRjaCBkb2VzICpub3QqIG5lZWQgS01TQU4uCgpMZXQmIzM5O3MgbG9nIHRoaXMgYXMgYE5lZWRzS01TQU49ZmFsc2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIHRoZSBibGstaW9jb3N0IEkvTyBjZ3JvdXAgY29udHJvbGxlciwgYWxsb3dpbmcgcGx1Z2dhYmxlIEJQRi1iYXNlZCBjb3N0IGNhbGN1bGF0aW9uLCBhZGRzIGEgbmV3IHRyYWNlcG9pbnQgKGBpb2Nvc3RfaW9jX3RpY2tgKSwgYW5kIHVwZGF0ZXMgdGhlIGNncm91cCB2MiBgaW8uY29zdC5tb2RlbGAgaW50ZXJmYWNlLlxuXG5BbmFseXNpcyByZWdhcmRpbmcgc2FuaXRpemVyczpcbjEuIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4tIEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSBhbmQga2VybmVsLXRvLXVzZXIgaW5mb3JtYXRpb24gbGVha3MuXG4tIEluIHRoaXMgcGF0Y2gsIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgcGFzc2VkIHRvIGBpb2Nvc3RfYnBmX2NhbGNfY29zdCgpYCBhbmQgdGhlIEJQRiBzdHJ1Y3Rfb3BzIGNhbGxiYWNrIGFyZSBzY2FsYXIgaW50ZWdlciB2YWx1ZXMgcGFzc2VkIGJ5IHZhbHVlLlxuLSBPdXRwdXQgcG9pbnRlcnMgKHN1Y2ggYXMgYCpjb3N0cGAgaW4gYGlvY29zdF9icGZfY2FsY19jb3N0YCkgYXJlIHdyaXR0ZW4gYmVmb3JlIHJldHVybiwgYW5kIGFsbCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4gYGJwZmAsIGB1c2VyYCwgYGNvc3RgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gYnJhbmNoaW5nIG9yIHVzZS5cbi0gVGhlIG5ldyB0cmFjZXBvaW50IGBpb2Nvc3RfaW9jX3RpY2tgIGV4cGxpY2l0bHkgYXNzaWducyBhbGwgZmllbGRzIGluIGBUUF9mYXN0X2Fzc2lnbmAuXG4tIE5vIHN0cnVjdHMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBoZWFwIGFsbG9jYXRpb25zIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLlxuXG4yLiBLQVNBTiAvIExPQ0tERVAgYXBwbGljYWJpbGl0eTpcbi0gUG90ZW50aWFsIHJpc2tzIGluIHRoaXMgcGF0Y2ggcmV2b2x2ZSBhcm91bmQgY29uY3VycmVuY3kgKHN5bmNocm9uaXphdGlvbiBvZiBgaW9jb3N0X2JwZl9tb2RlbGAgdmlhIFJDVSwgbXV0ZXhlcywgYW5kIHN0YXRpYyBrZXlzKSBvciBsb2dpYy9ib3VuZHMgZXJyb3JzLCB3aGljaCBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBrZXJuZWwgYnVnIGRldGVjdG9ycywgTE9DS0RFUCwgYW5kIEtBU0FOLlxuXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdF9vcHMgc3VwcG9ydCAoYGlvY29zdF9tb2RlbF9vcHNgKSBmb3IgdGhlIGJsay1pb2Nvc3QgSS9PIGNncm91cCBjb250cm9sbGVyLCBhbGxvd2luZyBwbHVnZ2FibGUgQlBGLWJhc2VkIGNvc3QgY2FsY3VsYXRpb24sIGFkZHMgYSBuZXcgdHJhY2Vwb2ludCAoYGlvY29zdF9pb2NfdGlja2ApLCBhbmQgdXBkYXRlcyB0aGUgY2dyb3VwIHYyIGBpby5jb3N0Lm1vZGVsYCBpbnRlcmZhY2UuXG5cbkFuYWx5c2lzIHJlZ2FyZGluZyBzYW5pdGl6ZXJzOlxuMS4gS01TQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IGFuZCBrZXJuZWwtdG8tdXNlciBpbmZvcm1hdGlvbiBsZWFrcy5cbi0gSW4gdGhpcyBwYXRjaCwgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gYGlvY29zdF9icGZfY2FsY19jb3N0KClgIGFuZCB0aGUgQlBGIHN0cnVjdF9vcHMgY2FsbGJhY2sgYXJlIHNjYWxhciBpbnRlZ2VyIHZhbHVlcyBwYXNzZWQgYnkgdmFsdWUuXG4tIE91dHB1dCBwb2ludGVycyAoc3VjaCBhcyBgKmNvc3RwYCBpbiBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgKSBhcmUgd3JpdHRlbiBiZWZvcmUgcmV0dXJuLCBhbmQgYWxsIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiBgYnBmYCwgYHVzZXJgLCBgY29zdGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBwcmlvciB0byBicmFuY2hpbmcgb3IgdXNlLlxuLSBUaGUgbmV3IHRyYWNlcG9pbnQgYGlvY29zdF9pb2NfdGlja2AgZXhwbGljaXRseSBhc3NpZ25zIGFsbCBmaWVsZHMgaW4gYFRQX2Zhc3RfYXNzaWduYC5cbi0gTm8gc3RydWN0cyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGhlYXAgYWxsb2NhdGlvbnMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UuXG5cbjIuIEtBU0FOIC8gTE9DS0RFUCBhcHBsaWNhYmlsaXR5OlxuLSBQb3RlbnRpYWwgcmlza3MgaW4gdGhpcyBwYXRjaCByZXZvbHZlIGFyb3VuZCBjb25jdXJyZW5jeSAoc3luY2hyb25pemF0aW9uIG9mIGBpb2Nvc3RfYnBmX21vZGVsYCB2aWEgUkNVLCBtdXRleGVzLCBhbmQgc3RhdGljIGtleXMpIG9yIGxvZ2ljL2JvdW5kcyBlcnJvcnMsIHdoaWNoIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLCBMT0NLREVQLCBhbmQgS0FTQU4uXG5cblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNTo0My44MjI3NTU1ODdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDg5NTMxNjQ2NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQX0lPQ09TVF9CUEZcIixcbiAgICBcIkJMS19DR1JPVVBfSU9DT1NUXCIsXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQlBGX0pJVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImlvY29zdF9icGZfY2FsY19jb3N0XCIsXG4gICAgXCJicGZfaW9jb3N0X3JlZ1wiLFxuICAgIFwiYnBmX2lvY29zdF91bnJlZ1wiLFxuICAgIFwiaW9jX2Nvc3RfbW9kZWxfd3JpdGVcIixcbiAgICBcImlvY19jb3N0X21vZGVsX3ByZmlsbFwiLFxuICAgIFwiY2FsY192dGltZV9jb3N0XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIHRoZSBibGstaW9jb3N0IEkvTyBjZ3JvdXAgY29udHJvbGxlciwgYWxsb3dpbmcgcGx1Z2dhYmxlIEJQRi1iYXNlZCBjb3N0IGNhbGN1bGF0aW9uLCBhZGRzIGEgbmV3IHRyYWNlcG9pbnQgKGBpb2Nvc3RfaW9jX3RpY2tgKSwgYW5kIHVwZGF0ZXMgdGhlIGNncm91cCB2MiBgaW8uY29zdC5tb2RlbGAgaW50ZXJmYWNlLlxcblxcbkFuYWx5c2lzIHJlZ2FyZGluZyBzYW5pdGl6ZXJzOlxcbjEuIEtNU0FOIGFwcGxpY2FiaWxpdHk6XFxuLSBLTVNBTiBkZXRlY3RzIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgYW5kIGtlcm5lbC10by11c2VyIGluZm9ybWF0aW9uIGxlYWtzLlxcbi0gSW4gdGhpcyBwYXRjaCwgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gYGlvY29zdF9icGZfY2FsY19jb3N0KClgIGFuZCB0aGUgQlBGIHN0cnVjdF9vcHMgY2FsbGJhY2sgYXJlIHNjYWxhciBpbnRlZ2VyIHZhbHVlcyBwYXNzZWQgYnkgdmFsdWUuXFxuLSBPdXRwdXQgcG9pbnRlcnMgKHN1Y2ggYXMgYCpjb3N0cGAgaW4gYGlvY29zdF9icGZfY2FsY19jb3N0YCkgYXJlIHdyaXR0ZW4gYmVmb3JlIHJldHVybiwgYW5kIGFsbCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4gYGJwZmAsIGB1c2VyYCwgYGNvc3RgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gYnJhbmNoaW5nIG9yIHVzZS5cXG4tIFRoZSBuZXcgdHJhY2Vwb2ludCBgaW9jb3N0X2lvY190aWNrYCBleHBsaWNpdGx5IGFzc2lnbnMgYWxsIGZpZWxkcyBpbiBgVFBfZmFzdF9hc3NpZ25gLlxcbi0gTm8gc3RydWN0cyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGhlYXAgYWxsb2NhdGlvbnMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UuXFxuXFxuMi4gS0FTQU4gLyBMT0NLREVQIGFwcGxpY2FiaWxpdHk6XFxuLSBQb3RlbnRpYWwgcmlza3MgaW4gdGhpcyBwYXRjaCByZXZvbHZlIGFyb3VuZCBjb25jdXJyZW5jeSAoc3luY2hyb25pemF0aW9uIG9mIGBpb2Nvc3RfYnBmX21vZGVsYCB2aWEgUkNVLCBtdXRleGVzLCBhbmQgc3RhdGljIGtleXMpIG9yIGxvZ2ljL2JvdW5kcyBlcnJvcnMsIHdoaWNoIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLCBMT0NLREVQLCBhbmQgS0FTQU4uXFxuXFxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMgaW4gdGhlIGJsb2NrIGlvY29zdCBjZ3JvdXAgY29udHJvbGxlciAoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRikuIEl0IGFkZHMgc3RydWN0X29wcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBpbnRlZ3JhdGVzIGR5bmFtaWMgQlBGIGNvc3QgY2FsY3VsYXRpb24gaW50byB0aGUgYmlvIHN1Ym1pc3Npb24gcGF0aCwgYW5kIGV4dGVuZHMgdGhlIGNncm91cCBpby5jb3N0Lm1vZGVsIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLiBUaGUgY29kZSBpcyBmdWxseSByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBjZ3JvdXBzIGFuZCB0aGUgQlBGIHN1YnN5c3RlbS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzU6NDMuODIyNzYxNDE2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDA5NDQ3NjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgU2VwIDggMTE6MzU6NDMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0XFxuaW5kZXggOGQyNjAzNzUxYzUxYS4uNTRiMDU3NGNlNTg2YyAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12Mi5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12Mi5yc3RcXG5AQCAtMjExNSwxMCArMjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXNcXG4gXFx0YXJlIGRlZmluZWQuXFxuIFxcbiBcXHQgID09PT09XFx0XFx0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4tXFx0ICBjdHJsXFx0XFx0XFxcImF1dG9cXFwiIG9yIFxcXCJ1c2VyXFxcIlxcbitcXHQgIGN0cmxcXHRcXHRcXFwiYXV0b1xcXCIsIFxcXCJ1c2VyXFxcIiBvciBcXFwiYnBmXFxcIlxcbiBcXHQgIG1vZGVsXFx0XFx0VGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gXFxcImxpbmVhclxcXCJcXG4gXFx0ICA9PT09PVxcdFxcdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuIFxcbitcXHRXaGVuIFxcXCJjdHJsXFxcIiBpcyBcXFwiYnBmXFxcIiAob25seSBhdmFpbGFibGUgd2hlblxcbitcXHRDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGIGlzIGVuYWJsZWQpLCBjb3N0IGNhbGN1bGF0aW9uIGZvclxcbitcXHR0aGUgZGV2aWNlIGlzIGRpc3BhdGNoZWQgdG8gdGhlIEJQRiBwcm9ncmFtIHJlZ2lzdGVyZWQgYWdhaW5zdFxcbitcXHR0aGUgaW9jb3N0X21vZGVsX29wcyBzdHJ1Y3Rfb3BzLiAgV3JpdGluZyBcXFwiYnBmXFxcIiBmYWlscyB3aXRoIC1FSU5WQUxcXG4rXFx0dW50aWwgc3VjaCBhIHByb2dyYW0gaXMgcmVnaXN0ZXJlZCwgYW5kIGF0IG1vc3Qgb25lIHByb2dyYW0gY2FuXFxuK1xcdGJlIHJlZ2lzdGVyZWQgc3lzdGVtLXdpZGUuICBUaGUgbW9kZWwgaXMgY2FsbGVkIHdpdGggc2NhbGFyXFxuK1xcdGFyZ3VtZW50cyAob3BlcmF0aW9uLCBzaXplLCBzZWN0b3IsIGNncm91cCBjdXJzb3IsIGNzcyBpZCBvZiB0aGVcXG4rXFx0aXNzdWluZyBjZ3JvdXAsIGZsYWdzOyBzZWUgaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmggZm9yIHRoZWlyXFxuK1xcdG1lYW5pbmcpIGFuZCByZXR1cm5zIGEgY29zdCBpbiB2dGltZSB1bml0cywgY2xhbXBlZCBieSB0aGUga2VybmVsXFxuK1xcdHRvIDEgc2Vjb25kIG9mIGRldmljZSB0aW1lIHBlciBJTy4gIEEgcmV0dXJuIHZhbHVlIG9mIDAgZGVsZWdhdGVzXFxuK1xcdHRoZSBJTyBiYWNrIHRvIHRoZSBidWlsdGluIGxpbmVhciBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIG9ubHlcXG4rXFx0aGFuZGxlcyBzb21lIElPIHR5cGVzIGNhbm5vdCBtYWtlIHRoZSByZXN0IGZyZWUuICBEZXZpY2VzIHdoaWNoXFxuK1xcdGRvbid0IG9wdCBpbiBrZWVwIHRoZSBidWlsdGluIGxpbmVhciBtb2RlbCB1bmNoYW5nZWQuXFxuK1xcbiBcXHRXaGVuIFxcXCJjdHJsXFxcIiBpcyBcXFwiYXV0b1xcXCIsIHRoZSBrZXJuZWwgbWF5IGNoYW5nZSBhbGwgcGFyYW1ldGVyc1xcbiBcXHRkeW5hbWljYWxseS4gIFdoZW4gXFxcImN0cmxcXFwiIGlzIHNldCB0byBcXFwidXNlclxcXCIgb3IgYW55IG90aGVyXFxuIFxcdHBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gdG8sIFxcXCJjdHJsXFxcIiBiZWNvbWUgXFxcInVzZXJcXFwiIGFuZCB0aGVcXG5kaWZmIC0tZ2l0IGEvYmxvY2svS2NvbmZpZyBiL2Jsb2NrL0tjb25maWdcXG5pbmRleCA3MGU0YTY2ZDk0MWZmLi5iZjQzYmUyMWUwMGJiIDEwMDY0NFxcbi0tLSBhL2Jsb2NrL0tjb25maWdcXG4rKysgYi9ibG9jay9LY29uZmlnXFxuQEAgLTIzMSw0ICsyMzEsMTMgQEAgY29uZmlnIEJMS19FUlJPUl9JTkpFQ1RJT05cXG4gXFxuIHNvdXJjZSBcXFwiYmxvY2svS2NvbmZpZy5pb3NjaGVkXFxcIlxcbiBcXG4rY29uZmlnIEJMS19DR1JPVVBfSU9DT1NUX0JQRlxcbitcXHRib29sIFxcXCJFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXJcXFwiXFxuK1xcdGRlcGVuZHMgb24gQkxLX0NHUk9VUF9JT0NPU1QgXFx1MDAyNlxcdTAwMjYgQlBGX1NZU0NBTEwgXFx1MDAyNlxcdTAwMjYgQlBGX0pJVFxcbitcXHRoZWxwXFxuK1xcdCBFbmFibGluZyB0aGlzIG9wdGlvbiByZWdpc3RlcnMgdGhlIFxcXCJpb2Nvc3RfbW9kZWxfb3BzXFxcIiBCUEZcXG4rXFx0IHN0cnVjdF9vcHMgdHlwZSwgd2hpY2ggYWxsb3dzIGEgQlBGIHByb2dyYW0gdG8gcmVwbGFjZSB0aGVcXG4rXFx0IGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGhcXG4rXFx0IFxcXCJjdHJsPWJwZlxcXCIgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLlxcbitcXG4gZW5kaWYgIyBCTE9DS1xcbmRpZmYgLS1naXQgYS9ibG9jay9NYWtlZmlsZSBiL2Jsb2NrL01ha2VmaWxlXFxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uZWU1Y2ViZWVhMDA2ZiAxMDA2NDRcXG4tLS0gYS9ibG9jay9NYWtlZmlsZVxcbisrKyBiL2Jsb2NrL01ha2VmaWxlXFxuQEAgLTM5LDMgKzM5LDQgQEAgb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTilcXHQrPSBibGstY3J5cHRvLm8gYmxrLWNyeXB0by1wcm9maWxlLm8gXFxcXFxcbiBcXHRcXHRcXHRcXHRcXHQgICBibGstY3J5cHRvLXN5c2ZzLm9cXG4gb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSylcXHQrPSBibGstY3J5cHRvLWZhbGxiYWNrLm9cXG4gb2JqLSQoQ09ORklHX0JMT0NLX0hPTERFUl9ERVBSRUNBVEVEKVxcdCs9IGhvbGRlci5vXFxuK29iai0kKENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYpXFx0Kz0gYmxrLWlvY29zdC1icGYub1xcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LWJwZi5jIGIvYmxvY2svYmxrLWlvY29zdC1icGYuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMGMzNGY1NmRlZDcxZFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9ibG9jay9ibGstaW9jb3N0LWJwZi5jXFxuQEAgLTAsMCArMSwxNTIgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cXG4rXFxuKy8qXFxuKyAqIGJsay1pb2Nvc3Q6IEJQRiBzdHJ1Y3Rfb3BzIHBsdW1iaW5nIGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMuXFxuKyAqXFxuKyAqIFJlZ2lzdGVycyB0aGUgXFxcImlvY29zdF9tb2RlbF9vcHNcXFwiIHN0cnVjdF9vcHMgdHlwZS4gIEF0IG1vc3Qgb25lIG1vZGVsXFxuKyAqIGNhbiBiZSByZWdpc3RlcmVkIGF0IGEgdGltZTsgZGV2aWNlcyBvcHQgaW4gcGVyLXF1ZXVlIHdpdGhcXG4rICogXFxcImVjaG8gJERFViBjdHJsPWJwZiBcXHUwMDNlIGlvLmNvc3QubW9kZWxcXFwiLiAgRGV2aWNlcyB3aXRob3V0IGEgcmVnaXN0ZXJlZFxcbisgKiBtb2RlbCBrZWVwIHVzaW5nIHRoZSBidWlsdGluIGxpbmVhciBtb2RlbC5cXG4rICovXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGZfdmVyaWZpZXIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXFx1MDAzZVxcbitcXG4rLyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJ3MgY2hhcmdlYWJsZSBjb3N0ICovXFxuKyNkZWZpbmUgSU9DT1NUX0JQRl9NQVhfQ09TVFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDM3KVxcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfc3RydWN0X29wcyBicGZfaW9jb3N0X21vZGVsX29wcztcXG4rXFxuK3N0YXRpYyBERUZJTkVfTVVURVgoaW9jb3N0X2JwZl9yZWdfbG9jayk7XFxuK3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX3JjdSAqaW9jb3N0X2JwZl9tb2RlbDtcXG4rc3RhdGljIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGlvY29zdF9icGZfa2V5KTtcXG4rXFxuK2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIHN0YXRpY19icmFuY2hfdW5saWtlbHkoXFx1MDAyNmlvY29zdF9icGZfa2V5KTtcXG4rfVxcbitcXG4rYm9vbCBpb2Nvc3RfYnBmX2NhbGNfY29zdCh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsIHU2NCBjdXJzb3IsXFxuK1xcdFxcdFxcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cClcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqb3BzO1xcbitcXHR1NjQgY29zdDtcXG4rXFxuK1xcdGlmICghc3RhdGljX2JyYW5jaF91bmxpa2VseShcXHUwMDI2aW9jb3N0X2JwZl9rZXkpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRyY3VfcmVhZF9sb2NrKCk7XFxuK1xcdG9wcyA9IHJjdV9kZXJlZmVyZW5jZShpb2Nvc3RfYnBmX21vZGVsKTtcXG4rXFx0aWYgKCFvcHMpIHtcXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRjb3N0ID0gb3BzLVxcdTAwM2VjYWxjX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGlvY2dfaWQsIGZsYWdzKTtcXG4rXFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcbitcXHRpZiAoIWNvc3QpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdCpjb3N0cCA9IG1pbihjb3N0LCBJT0NPU1RfQlBGX01BWF9DT1NUKTtcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9tb2RlbF9pbml0KHN0cnVjdCBidGYgKmJ0ZilcXG4re1xcbitcXHRzMzIgdHlwZV9pZDtcXG4rXFxuK1xcdHR5cGVfaWQgPSBidGZfZmluZF9ieV9uYW1lX2tpbmQoYnRmLCBcXFwiaW9jb3N0X21vZGVsX29wc1xcXCIsIEJURl9LSU5EX1NUUlVDVCk7XFxuK1xcdGlmICh0eXBlX2lkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIoY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbitcXHRcXHRcXHRcXHQgIGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXIsXFxuK1xcdFxcdFxcdFxcdCAgdm9pZCAqa2RhdGEsIGNvbnN0IHZvaWQgKnVkYXRhKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBicGZfaW9jb3N0X2lzX3ZhbGlkX2FjY2VzcyhpbnQgb2ZmLCBpbnQgc2l6ZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csXFxuK1xcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnBmX2luc25fYWNjZXNzX2F1eCAqaW5mbylcXG4re1xcbitcXHRyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqXFxuK2JwZl9pb2Nvc3RfZ2V0X2Z1bmNfcHJvdG8oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkLFxcbitcXHRcXHRcXHQgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZylcXG4re1xcbitcXHRyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0ge1xcbitcXHQuZ2V0X2Z1bmNfcHJvdG8gPSBicGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvLFxcbitcXHQuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsXFxuK307XFxuK1xcbitzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXFxuK3tcXG4rXFx0c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm5ld19vcHMgPSBrZGF0YTtcXG4rXFxuK1xcdGlmICghbmV3X29wcy1cXHUwMDNlY2FsY19jb3N0KVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGludCByZXQgPSAwO1xcbitcXG4rXFx0LyogdGhlIGNhbGxlciBvbmx5IGhvbGRzIHRoZSBwZXItbWFwIGxvY2ssIHNvIHNlcmlhbGl6ZSBoZXJlICovXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xcbitcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpKVxcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdGVsc2Uge1xcbitcXHRcXHRzdGF0aWNfYnJhbmNoX2luYyhcXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xcbitcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgbmV3X29wcyk7XFxuK1xcdH1cXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgYnBmX2lvY29zdF91bnJlZyh2b2lkICprZGF0YSwgc3RydWN0IGJwZl9saW5rICpsaW5rKVxcbit7XFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xcbitcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpID09IGtkYXRhKSB7XFxuK1xcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBOVUxMKTtcXG4rXFx0XFx0c3RhdGljX2JyYW5jaF9kZWMoXFx1MDAyNmlvY29zdF9icGZfa2V5KTtcXG4rXFx0fVxcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xcbit9XFxuK1xcbitzdGF0aWMgdTY0IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxcbitcXHRcXHRcXHRcXHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXFxuK3tcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyA9IHtcXG4rXFx0LmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsXFxuK307XFxuK1xcbitzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0ge1xcbitcXHQudmVyaWZpZXJfb3BzID0gXFx1MDAyNmJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzLFxcbitcXHQuaW5pdCA9IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdCxcXG4rXFx0LmluaXRfbWVtYmVyID0gYnBmX2lvY29zdF9pbml0X21lbWJlcixcXG4rXFx0LnJlZyA9IGJwZl9pb2Nvc3RfcmVnLFxcbitcXHQudW5yZWcgPSBicGZfaW9jb3N0X3VucmVnLFxcbitcXHQubmFtZSA9IFxcXCJpb2Nvc3RfbW9kZWxfb3BzXFxcIixcXG4rXFx0LmNmaV9zdHVicyA9IFxcdTAwMjZfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyxcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK307XFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBicGZfaW9jb3N0X2luaXQodm9pZClcXG4re1xcbitcXHRyZXR1cm4gcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoXFx1MDAyNmJwZl9pb2Nvc3RfbW9kZWxfb3BzLCBpb2Nvc3RfbW9kZWxfb3BzKTtcXG4rfVxcbitsYXRlX2luaXRjYWxsKGJwZl9pb2Nvc3RfaW5pdCk7XFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QuY1xcbmluZGV4IDI3NDViZmZjZDVlZWYuLmE1OGMxNmZjYjI5ZmEgMTAwNjQ0XFxuLS0tIGEvYmxvY2svYmxrLWlvY29zdC5jXFxuKysrIGIvYmxvY2svYmxrLWlvY29zdC5jXFxuQEAgLTE3Nyw2ICsxNzcsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdGltZXIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3RpbWU2NC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcGFyc2VyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ibGstaW9jb3N0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9sb2NhbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2xvY2FsNjQuaFxcdTAwM2VcXG5AQCAtNDQ1LDYgKzQ0Niw3IEBAIHN0cnVjdCBpb2Mge1xcbiBcXHRpbnRcXHRcXHRcXHRcXHRhdXRvcF9pZHg7XFxuIFxcdGJvb2xcXHRcXHRcXHRcXHR1c2VyX3Fvc19wYXJhbXM6MTtcXG4gXFx0Ym9vbFxcdFxcdFxcdFxcdHVzZXJfY29zdF9tb2RlbDoxO1xcbitcXHRib29sXFx0XFx0XFx0XFx0YnBmX2Nvc3RfbW9kZWw7XFxuIH07XFxuIFxcbiBzdHJ1Y3QgaW9jZ19wY3B1X3N0YXQge1xcbkBAIC0yMjM4LDYgKzIyNDAsNyBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxcbiBcXHRzdHJ1Y3QgaW9jX25vdyBub3c7XFxuIFxcdExJU1RfSEVBRChzdXJwbHVzZXMpO1xcbiBcXHRpbnQgbnJfZGVidG9ycywgbnJfc2hvcnRhZ2VzID0gMCwgbnJfbGFnZ2luZyA9IDA7XFxuK1xcdGludCBucl9hY3RpdmUgPSAwO1xcbiBcXHR1NjQgdXNhZ2VfdXNfc3VtID0gMDtcXG4gXFx0dTMyIHBwbV9ydGhyO1xcbiBcXHR1MzIgcHBtX3d0aHI7XFxuQEAgLTIyNzQsNiArMjI3Nyw4IEBAIHN0YXRpYyB2b2lkIGlvY190aW1lcl9mbihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpXFxuIFxcdFxcdHU2NCB2ZG9uZSwgdnRpbWUsIHVzYWdlX3VzO1xcbiBcXHRcXHR1MzIgaHdfYWN0aXZlLCBod19pbnVzZTtcXG4gXFxuK1xcdFxcdG5yX2FjdGl2ZSsrO1xcbitcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogQ29sbGVjdCB1bnVzZWQgYW5kIHdpbmQgdnRpbWUgY2xvc2VyIHRvIHZub3cgdG8gcHJldmVudFxcbiBcXHRcXHQgKiBpb2NncyBmcm9tIGFjY3VtdWxhdGluZyBhIGxhcmdlIGFtb3VudCBvZiBidWRnZXQuXFxuQEAgLTI0NjAsNiArMjQ2NSw4IEBAIHN0YXRpYyB2b2lkIGlvY190aW1lcl9mbihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpXFxuIFxcdFxcdGlvY19yZWZyZXNoX3ZyYXRlKGlvYywgXFx1MDAyNm5vdyk7XFxuIFxcdH1cXG4gXFxuK1xcdHRyYWNlX2lvY29zdF9pb2NfdGljayhpb2MsIG5yX2FjdGl2ZSwgdXNhZ2VfdXNfc3VtKTtcXG4rXFxuIFxcdHNwaW5fdW5sb2NrX2lycShcXHUwMDI2aW9jLVxcdTAwM2Vsb2NrKTtcXG4gfVxcbiBcXG5AQCAtMjU3Myw2ICsyNTgwLDIzIEBAIHN0YXRpYyB1NjQgY2FsY192dGltZV9jb3N0KHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGlvY19ncSAqaW9jZywgYm9vbCBpc19tZXJnZSlcXG4ge1xcbiBcXHR1NjQgY29zdDtcXG4gXFxuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXFxuK1xcdHN0cnVjdCBpb2MgKmlvYyA9IGlvY2ctXFx1MDAzZWlvYztcXG4rXFxuK1xcdGlmIChSRUFEX09OQ0UoaW9jLVxcdTAwM2VicGZfY29zdF9tb2RlbCkpIHtcXG4rXFx0XFx0dTY0IGJwZl9jb3N0O1xcbitcXG4rXFx0XFx0aWYgKGlvY29zdF9icGZfY2FsY19jb3N0KGJpb19vcChiaW8pLFxcbitcXHRcXHRcXHRcXHRcXHQgYmlvLVxcdTAwM2ViaV9pdGVyLmJpX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCBiaW8tXFx1MDAzZWJpX2l0ZXIuYmlfc2VjdG9yLFxcbitcXHRcXHRcXHRcXHRcXHQgaW9jZy1cXHUwMDNlY3Vyc29yLFxcbitcXHRcXHRcXHRcXHRcXHQgaW9jZ190b19ibGtnKGlvY2cpLVxcdTAwM2VibGtjZy1cXHUwMDNlY3NzLmlkLFxcbitcXHRcXHRcXHRcXHRcXHQgaXNfbWVyZ2UgPyBJT0NPU1RfQ09TVF9GX01FUkdFIDogMCxcXG4rXFx0XFx0XFx0XFx0XFx0IFxcdTAwMjZicGZfY29zdCkpXFxuK1xcdFxcdFxcdHJldHVybiBicGZfY29zdDtcXG4rXFx0fVxcbisjZW5kaWZcXG4rXFxuIFxcdGNhbGNfdnRpbWVfY29zdF9idWlsdGluKGJpbywgaW9jZywgaXNfbWVyZ2UsIFxcdTAwMjZjb3N0KTtcXG4gXFx0cmV0dXJuIGNvc3Q7XFxuIH1cXG5AQCAtMzQ0MSw3ICszNDY1LDggQEAgc3RhdGljIHU2NCBpb2NfY29zdF9tb2RlbF9wcmZpbGwoc3RydWN0IHNlcV9maWxlICpzZixcXG4gXFx0c2VxX3ByaW50ZihzZiwgXFxcIiVzIGN0cmw9JXMgbW9kZWw9bGluZWFyIFxcXCJcXG4gXFx0XFx0ICAgXFxcInJicHM9JWxsdSByc2VxaW9wcz0lbGx1IHJyYW5kaW9wcz0lbGx1IFxcXCJcXG4gXFx0XFx0ICAgXFxcIndicHM9JWxsdSB3c2VxaW9wcz0lbGx1IHdyYW5kaW9wcz0lbGx1XFxcXG5cXFwiLFxcbi1cXHRcXHQgICBkbmFtZSwgaW9jLVxcdTAwM2V1c2VyX2Nvc3RfbW9kZWwgPyBcXFwidXNlclxcXCIgOiBcXFwiYXV0b1xcXCIsXFxuK1xcdFxcdCAgIGRuYW1lLCBpb2MtXFx1MDAzZWJwZl9jb3N0X21vZGVsID8gXFxcImJwZlxcXCIgOlxcbitcXHRcXHRcXHQgICBpb2MtXFx1MDAzZXVzZXJfY29zdF9tb2RlbCA/IFxcXCJ1c2VyXFxcIiA6IFxcXCJhdXRvXFxcIixcXG4gXFx0XFx0ICAgdVtJX0xDT0VGX1JCUFNdLCB1W0lfTENPRUZfUlNFUUlPUFNdLCB1W0lfTENPRUZfUlJBTkRJT1BTXSxcXG4gXFx0XFx0ICAgdVtJX0xDT0VGX1dCUFNdLCB1W0lfTENPRUZfV1NFUUlPUFNdLCB1W0lfTENPRUZfV1JBTkRJT1BTXSk7XFxuIFxcdHNwaW5fdW5sb2NrX2lycShcXHUwMDI2aW9jLVxcdTAwM2Vsb2NrKTtcXG5AQCAtMzQ4MSw3ICszNTA2LDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCxcXG4gXFx0dW5zaWduZWQgaW50IG1lbWZsYWdzO1xcbiBcXHRzdHJ1Y3QgaW9jICppb2M7XFxuIFxcdHU2NCB1W05SX0lfTENPRUZTXTtcXG4tXFx0Ym9vbCB1c2VyO1xcbitcXHRib29sIHVzZXIsIGJwZjtcXG4gXFx0Y2hhciAqYm9keSwgKnA7XFxuIFxcdGludCByZXQ7XFxuIFxcbkBAIC0zNTEyLDYgKzM1MzcsNyBAQCBzdGF0aWMgc3NpemVfdCBpb2NfY29zdF9tb2RlbF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmlucHV0LFxcbiBcXHRzcGluX2xvY2tfaXJxKFxcdTAwMjZpb2MtXFx1MDAzZWxvY2spO1xcbiBcXHRtZW1jcHkodSwgaW9jLVxcdTAwM2VwYXJhbXMuaV9sY29lZnMsIHNpemVvZih1KSk7XFxuIFxcdHVzZXIgPSBpb2MtXFx1MDAzZXVzZXJfY29zdF9tb2RlbDtcXG4rXFx0YnBmID0gaW9jLVxcdTAwM2VicGZfY29zdF9tb2RlbDtcXG4gXFxuIFxcdHJldCA9IC1FSU5WQUw7XFxuIFxcbkBAIC0zNTI3LDExICszNTUzLDIwIEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXFxuIFxcdFxcdHN3aXRjaCAobWF0Y2hfdG9rZW4ocCwgY29zdF9jdHJsX3Rva2VucywgYXJncykpIHtcXG4gXFx0XFx0Y2FzZSBDT1NUX0NUUkw6XFxuIFxcdFxcdFxcdG1hdGNoX3N0cmxjcHkoYnVmLCBcXHUwMDI2YXJnc1swXSwgc2l6ZW9mKGJ1ZikpO1xcbi1cXHRcXHRcXHRpZiAoIXN0cmNtcChidWYsIFxcXCJhdXRvXFxcIikpXFxuK1xcdFxcdFxcdGlmICghc3RyY21wKGJ1ZiwgXFxcImF1dG9cXFwiKSkge1xcbiBcXHRcXHRcXHRcXHR1c2VyID0gZmFsc2U7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcXFwidXNlclxcXCIpKVxcbitcXHRcXHRcXHRcXHRicGYgPSBmYWxzZTtcXG4rXFx0XFx0XFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcInVzZXJcXFwiKSkge1xcbiBcXHRcXHRcXHRcXHR1c2VyID0gdHJ1ZTtcXG4tXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRicGYgPSBmYWxzZTtcXG4rI2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZcXG4rXFx0XFx0XFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcImJwZlxcXCIpKSB7XFxuK1xcdFxcdFxcdFxcdGlmICghaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKCkpXFxuK1xcdFxcdFxcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbitcXHRcXHRcXHRcXHR1c2VyID0gZmFsc2U7XFxuK1xcdFxcdFxcdFxcdGJwZiA9IHRydWU7XFxuKyNlbmRpZlxcbitcXHRcXHRcXHR9IGVsc2VcXG4gXFx0XFx0XFx0XFx0Z290byB1bmxvY2s7XFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHRjYXNlIENPU1RfTU9ERUw6XFxuQEAgLTM1NTYsNiArMzU5MSw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdGlvYy1cXHUwMDNldXNlcl9jb3N0X21vZGVsID0gZmFsc2U7XFxuIFxcdH1cXG4rXFx0V1JJVEVfT05DRShpb2MtXFx1MDAzZWJwZl9jb3N0X21vZGVsLCBicGYpO1xcbiBcXHRpb2NfcmVmcmVzaF9wYXJhbXMoaW9jLCB0cnVlKTtcXG4gXFxuIFxcdHJldCA9IDA7XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjcxMTFiNWMwM2RjMzZcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmhcXG5AQCAtMCwwICsxLDU2IEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXFxuKyNpZm5kZWYgX0xJTlVYX0JMS19JT0NPU1RfSFxcbisjZGVmaW5lIF9MSU5VWF9CTEtfSU9DT1NUX0hcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbitcXG4rI2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZcXG4rXFxuKy8qXFxuKyAqIFBsdWdnYWJsZSBjb3N0IG1vZGVsIGludGVyZmFjZSBmb3IgYmxrLWlvY29zdC5cXG4rICpcXG4rICogQSBCUEYgc3RydWN0X29wcyBpbXBsZW1lbnRhdGlvbiByZWdpc3RlcmVkIGFnYWluc3QgXFxcImlvY29zdF9tb2RlbF9vcHNcXFwiXFxuKyAqIHJlcGxhY2VzIHRoZSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoXFxuKyAqIFxcXCJjdHJsPWJwZlxcXCIgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLiAgVGhlIG1vZGVsIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiB0aGVcXG4rICogYXJndW1lbnRzIGJlbG93IGFuZCByZXR1cm5zIHRoZSBjb3N0IG9mIHRoZSBJTyBpbiBkZXZpY2UgdGltZSB1bml0cyxcXG4rICogd2hlcmUgMSBzZWNvbmQgb2YgZGV2aWNlIHRpbWUgZXF1YWxzIDJeMzcgKFZUSU1FX1BFUl9TRUMpLiAgVGhlXFxuKyAqIHJldHVybmVkIHZhbHVlIGlzIGNsYW1wZWQgYnkgdGhlIGtlcm5lbC4gIEEgY29zdCBvZiAwIGRlbGVnYXRlcyB0aGVcXG4rICogSU8gYmFjayB0byB0aGUgYnVpbHRpbiBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIGRvZXMgbm90IGhhbmRsZSBhXFxuKyAqIGdpdmVuIElPIHR5cGUgY2Fubm90IG1ha2UgaXQgZnJlZS5cXG4rICpcXG4rICogVGhlIGlvY2dfaWQgYXJndW1lbnQgaWRlbnRpZmllcyB0aGUgaXNzdWluZyBjZ3JvdXAgKGNzcyBpZCkgc28gdGhlXFxuKyAqIG1vZGVsIGNhbiBrZWVwIHBlci1jZ3JvdXAgc3RhdGUsIGUuZy4gZm9yIG11bHRpLXN0cmVhbSBzZXF1ZW50aWFsaXR5XFxuKyAqIGRldGVjdGlvbi4gIFRoZSBpZCBpcyBvbmx5IHZhbGlkIHdoaWxlIHRoZSBjZ3JvdXAgZXhpc3RzOiBjc3MgaWRzIGFyZVxcbisgKiByZWN5Y2xlZCBvbmNlIHRoZSBjZ3JvdXAgaXMgcmVtb3ZlZCwgc28gbW9kZWxzIG11c3QgdHJlYXQgaXQgYXMgYVxcbisgKiB0cmFuc2llbnQga2V5IGFuZCByZXNldCBzdGF0ZSB3aGVuIHRoZXkgb2JzZXJ2ZSBpdCByZXVzZWQuICBXaGV0aGVyXFxuKyAqIHRoZSBpbnRlcmZhY2UgbmVlZHMgYSByZWxlYXNlKGlvY2dfaWQpIGNhbGxiYWNrIGZvciBzdGF0ZSBjbGVhbnVwIGlzXFxuKyAqIGFuIG9wZW4gcXVlc3Rpb24uXFxuKyAqXFxuKyAqIFRoZSBtb2RlbCBpcyBjYWxsZWQgZnJvbSB0aGUgSU8gc3VibWlzc2lvbiBwYXRoIHVuZGVyIFJDVSBhbmQgbXVzdFxcbisgKiBub3Qgc2xlZXAuICBPbmx5IHRoZSBiaW8tbGV2ZWwgY2hhcmdpbmcgcGF0aCBjb25zdWx0cyB0aGUgbW9kZWw7XFxuKyAqIHRoZSByZXF1ZXN0LWxldmVsIHNpemluZyBwYXRoIChjYWxjX3NpemVfdnRpbWVfY29zdCgpKSBrZWVwcyB1c2luZ1xcbisgKiB0aGUgYnVpbHRpbiBmb3JtdWxhLlxcbisgKi9cXG4rXFxuKy8qIGZsYWdzIGZvciBjYWxjX2Nvc3QoKSAqL1xcbisjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKVxcdC8qIGNhbGxlZCBmcm9tIG1lcmdlIHBhdGggKi9cXG4rXFxuK3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIHtcXG4rXFx0LypcXG4rXFx0ICogQG9wOlxcdFxcdFJFUV9PUF8qIHZhbHVlICh1YXBpIGJsa19vcGYuaClcXG4rXFx0ICogQG5ieXRlczpcXHRJTyBzaXplIGluIGJ5dGVzXFxuK1xcdCAqIEBzZWN0b3I6XFx0c3RhcnRpbmcgc2VjdG9yXFxuK1xcdCAqIEBjdXJzb3I6XFx0aW9jZyBjdXJzb3Igc2VjdG9yLCAwIGlmIG5vbmUgKHNlcXVlbnRpYWxpdHkgaGludClcXG4rXFx0ICogQGlvY2dfaWQ6XFx0Y3NzIGlkIG9mIHRoZSBpc3N1aW5nIGNncm91cFxcbitcXHQgKiBAZmxhZ3M6XFx0SU9DT1NUX0NPU1RfRl8qXFxuK1xcdCAqL1xcbitcXHR1NjQgKCpjYWxjX2Nvc3QpKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvcixcXG4rXFx0XFx0XFx0IHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpO1xcbit9O1xcbitcXG4rYm9vbCBpb2Nvc3RfYnBmX2NhbGNfY29zdCh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsIHU2NCBjdXJzb3IsXFxuK1xcdFxcdFxcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cCk7XFxuK2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpO1xcbitcXG4rI2VuZGlmXFx0LyogQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRiAqL1xcbisjZW5kaWZcXHQvKiBfTElOVVhfQkxLX0lPQ09TVF9IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhcXG5pbmRleCBlNzcyYjFiYzYwZDYwLi4yYjlmZjM0OGE0ZjUxIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXFxuKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhcXG5AQCAtMTc4LDYgKzE3OCw0NiBAQCBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jX3ZyYXRlX2FkaixcXG4gXFx0KVxcbiApO1xcbiBcXG4rLypcXG4rICogUGVyaW9kaWMgcGVyLWRldmljZSBzdW1tYXJ5LCBlbWl0dGVkIG9uY2UgcGVyIHBlcmlvZCBmcm9tIHRoZSB0YWlsIG9mXFxuKyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5XFxuKyAqIHBlcmlvZCB0aGUgY29udHJvbGxlciBpcyBydW5uaW5nLCBpbmNsdWRpbmcgc3RlYWR5IHN0YXRlcywgYW5kIGNhcnJpZXNcXG4rICogdGhlIG92ZXJhbGwgY29udHJvbGxlciBzdGF0ZSBzbyBiYXNpYyBtb25pdG9yaW5nIGRvZXNuJ3QgcmVxdWlyZSBkcmduLlxcbisgKi9cXG4rVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY190aWNrLFxcbitcXG4rXFx0VFBfUFJPVE8oc3RydWN0IGlvYyAqaW9jLCBpbnQgbnJfYWN0aXZlLCB1NjQgdXNhZ2VfdXNfc3VtKSxcXG4rXFxuK1xcdFRQX0FSR1MoaW9jLCBucl9hY3RpdmUsIHVzYWdlX3VzX3N1bSksXFxuK1xcbitcXHRUUF9TVFJVQ1RfX2VudHJ5IChcXG4rXFx0XFx0X19zdHJpbmcoZGV2bmFtZSwgaW9jX25hbWUoaW9jKSlcXG4rXFx0XFx0X19maWVsZCh1MzIsIHBlcmlvZF91cylcXG4rXFx0XFx0X19maWVsZCh1NjQsIHZyYXRlKVxcbitcXHRcXHRfX2ZpZWxkKGludCwgYnVzeV9sZXZlbClcXG4rXFx0XFx0X19maWVsZChpbnQsIG5yX2FjdGl2ZSlcXG4rXFx0XFx0X19maWVsZCh1MzIsIHVzYWdlX3BjdClcXG4rXFx0XFx0X19maWVsZChpbnQsIHJ1bm5pbmcpXFxuK1xcdCksXFxuK1xcbitcXHRUUF9mYXN0X2Fzc2lnbihcXG4rXFx0XFx0X19hc3NpZ25fc3RyKGRldm5hbWUpO1xcbitcXHRcXHRfX2VudHJ5LVxcdTAwM2VwZXJpb2RfdXMgPSBpb2MtXFx1MDAzZXBlcmlvZF91cztcXG4rXFx0XFx0X19lbnRyeS1cXHUwMDNldnJhdGUgPSBpb2MtXFx1MDAzZXZ0aW1lX2Jhc2VfcmF0ZTtcXG4rXFx0XFx0X19lbnRyeS1cXHUwMDNlYnVzeV9sZXZlbCA9IGlvYy1cXHUwMDNlYnVzeV9sZXZlbDtcXG4rXFx0XFx0X19lbnRyeS1cXHUwMDNlbnJfYWN0aXZlID0gbnJfYWN0aXZlO1xcbitcXHRcXHRfX2VudHJ5LVxcdTAwM2V1c2FnZV9wY3QgPSBpb2MtXFx1MDAzZXBlcmlvZF91cyA/XFxuK1xcdFxcdFxcdGRpdl91NjQodXNhZ2VfdXNfc3VtICogMTAwLCBpb2MtXFx1MDAzZXBlcmlvZF91cykgOiAwO1xcbitcXHRcXHRfX2VudHJ5LVxcdTAwM2VydW5uaW5nID0gaW9jLVxcdTAwM2VydW5uaW5nO1xcbitcXHQpLFxcbitcXG4rXFx0VFBfcHJpbnRrKFxcXCJbJXNdIHBlcmlvZD0ldXVzIHZyYXRlPSVsbHUgYnVzeT0lZCBhY3RpdmU9JWQgdXNhZ2U9JXUlJSBydW5uaW5nPSVkXFxcIixcXG4rXFx0XFx0X19nZXRfc3RyKGRldm5hbWUpLCBfX2VudHJ5LVxcdTAwM2VwZXJpb2RfdXMsIF9fZW50cnktXFx1MDAzZXZyYXRlLFxcbitcXHRcXHRfX2VudHJ5LVxcdTAwM2VidXN5X2xldmVsLCBfX2VudHJ5LVxcdTAwM2Vucl9hY3RpdmUsIF9fZW50cnktXFx1MDAzZXVzYWdlX3BjdCxcXG4rXFx0XFx0X19lbnRyeS1cXHUwMDNlcnVubmluZ1xcbitcXHQpXFxuKyk7XFxuK1xcbiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsXFxuIFxcbiBcXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jXFxuQEAgLTAsMCArMSwxNTUgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFxcImlvY29zdF9tb2RlbC5za2VsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJpb2Nvc3RfbXMuc2tlbC5oXFxcIlxcbitcXG4rLypcXG4rICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZVxcbisgKiByZWFkYmFjaywgcmVzdG9yaW5nIGN0cmw9YXV0byBhZnRlcndhcmRzLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuXFxuKyAqIFNoYXJlZCBieSB0aGUgZXhhbXBsZS1tb2RlbCB0ZXN0cyBiZWxvdy5cXG4rICovXFxuK3N0YXRpYyBpbnQgc3dpdGNoX3RvX2JwZihjb25zdCBjaGFyICpkZXYpXFxuK3tcXG4rXFx0Y2hhciBwYXRoW10gPSBcXFwiL3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFxcXCI7XFxuK1xcdGNoYXIgd29yZFsyNTZdLCBsaW5lWzI1Nl0sIGJ1ZlszMDBdO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0aW50IGVyciwgZm91bmQgPSAwO1xcbitcXG4rXFx0ZnAgPSBmb3BlbihwYXRoLCBcXFwicitcXFwiKTtcXG4rXFx0aWYgKCFmcCkge1xcbitcXHRcXHRUSF9MT0coXFxcIm9wZW4gJXM6ICVzXFxcIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcbitcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcXG4rXFx0XFx0aWYgKHNzY2FuZihsaW5lLCBcXFwiJTI1NXNcXFwiLCB3b3JkKSA9PSAxIFxcdTAwMjZcXHUwMDI2ICFzdHJjbXAod29yZCwgZGV2KSkge1xcbitcXHRcXHRcXHRmb3VuZCA9IDE7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0aWYgKCFmb3VuZCkge1xcbitcXHRcXHRUSF9MT0coXFxcIiVzIGhhcyBubyBpb2Nvc3QgbGluZVxcXCIsIGRldik7XFxuK1xcdFxcdGZjbG9zZShmcCk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXG4rXFx0c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgXFxcIiVzIGN0cmw9YnBmXFxcIiwgZGV2KTtcXG4rXFx0ZXJyID0gZnByaW50ZihmcCwgXFxcIiVzXFxcXG5cXFwiLCBidWYpO1xcbitcXHRpZiAoZXJyIFxcdTAwM2M9IDApIHtcXG4rXFx0XFx0VEhfTE9HKFxcXCJ3cml0ZSBjdHJsPWJwZiBmYWlsZWRcXFwiKTtcXG4rXFx0XFx0ZmNsb3NlKGZwKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcdGZmbHVzaChmcCk7XFxuK1xcbitcXHRyZXdpbmQoZnApO1xcbitcXHRmb3VuZCA9IDA7XFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xcbitcXHRcXHRpZiAoc3NjYW5mKGxpbmUsIFxcXCIlMjU1c1xcXCIsIHdvcmQpID09IDEgXFx1MDAyNlxcdTAwMjYgIXN0cmNtcCh3b3JkLCBkZXYpKSB7XFxuK1xcdFxcdFxcdGZvdW5kID0gc3Ryc3RyKGxpbmUsIFxcXCJjdHJsPWJwZlxcXCIpICE9IE5VTEw7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0aWYgKCFmb3VuZClcXG4rXFx0XFx0VEhfTE9HKFxcXCJyZWFkYmFjayBkb2VzIG5vdCBzaG93IGN0cmw9YnBmXFxcIik7XFxuK1xcbitcXHRmcHJpbnRmKGZwLCBcXFwiJXMgY3RybD1hdXRvXFxcXG5cXFwiLCBkZXYpO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gZm91bmQgPyAwIDogLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZGV2X2hhc19pb2Nvc3Qodm9pZClcXG4re1xcbitcXHRGSUxFICpmcCA9IGZvcGVuKFxcXCIvc3lzL2ZzL2Nncm91cC9pby5jb3N0LnFvc1xcXCIsIFxcXCJyXFxcIik7XFxuK1xcbitcXHRpZiAoZnApXFxuK1xcdFxcdGZjbG9zZShmcCk7XFxuK1xcdHJldHVybiBmcCAhPSBOVUxMO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZWdpc3RlciB0aGUgZXhhbXBsZSBjb3N0IG1vZGVsIGFuZCBzd2l0Y2ggYSBkZXZpY2UgdG8gY3RybD1icGYuXFxuKyAqIElPIGFjY291bnRpbmcgaXRzZWxmIGlzIG5vdCBjaGVja2VkIGhlcmU7IGl0IG5lZWRzIGEgZGV2aWNlIGRvaW5nXFxuKyAqIHJlYWwgSU8gdW5kZXIgaW9jb3N0IGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZSBrZXJuZWwtc2lkZSB2YWxpZGF0aW9uXFxuKyAqIGRlc2NyaWJlZCBpbiB0aGUgY292ZXIgbGV0dGVyLlxcbisgKlxcbisgKiBSZXF1aXJlcyByb290LCBjZ3JvdXAgdjIgYW5kIGEgZGV2aWNlIHdpdGggaW9jb3N0IHN1cHBvcnQuICBUaGVcXG4rICogZGV2aWNlIG11c3QgYmUgZ2l2ZW4gYXMgbWFqb3I6bWlub3IgaW4gJElPQ09TVF9URVNUX0RFViwgb3RoZXJ3aXNlXFxuKyAqIHRoZSB0ZXN0IGlzIHNraXBwZWQuXFxuKyAqL1xcbit2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBpb2Nvc3RfbW9kZWwgKnNrZWw7XFxuK1xcdGNoYXIgd29yZFsyNTZdLCAqZGV2O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZGV2ID0gZ2V0ZW52KFxcXCJJT0NPU1RfVEVTVF9ERVZcXFwiKTtcXG4rXFx0aWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcXFwiaW9jb3N0X21vdW50ZWRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LyogbmVnYXRpdmU6IGN0cmw9YnBmIG11c3QgYmUgcmVqZWN0ZWQgd2hpbGUgbm8gbW9kZWwgaXNcXG4rXFx0ICogcmVnaXN0ZXJlZCwgc28gYSB0eXBvIGNhbm5vdCBzaWxlbnRseSBkaXNhYmxlIGNvc3QgbW9kZWxcXG4rXFx0ICogdXBkYXRlcyAqL1xcbitcXHRpZiAoc3NjYW5mKGRldiwgXFxcIiUyNTVzXFxcIiwgd29yZCkgIT0gMSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR7XFxuK1xcdFxcdGNoYXIgcGF0aFtdID0gXFxcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWxcXFwiO1xcbitcXHRcXHRjaGFyIGJ1ZlszMDBdO1xcbitcXHRcXHRGSUxFICpmcCA9IGZvcGVuKHBhdGgsIFxcXCJ3XFxcIik7XFxuK1xcbitcXHRcXHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcXFwiJXMgY3RybD1icGZcXFxcblxcXCIsIHdvcmQpO1xcbitcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRpZiAoZnApIHtcXG4rXFx0XFx0XFx0ZXJyID0gZnByaW50ZihmcCwgXFxcIiVzXFxcIiwgYnVmKSBcXHUwMDNjPSAwO1xcbitcXHRcXHRcXHRmY2xvc2UoZnApO1xcbitcXHRcXHR9XFxuK1xcdFxcdEFTU0VSVF9UUlVFKGVyciwgXFxcImN0cmxfYnBmX3dpdGhvdXRfbW9kZWxfcmVqZWN0ZWRcXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0c2tlbCA9IGlvY29zdF9tb2RlbF9fb3Blbl9hbmRfbG9hZCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWxfb3Blbl9sb2FkXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdC8qIGF0dGFjaGluZyB0aGUgc3RydWN0X29wcyByZWdpc3RlcnMgdGhlIG1vZGVsOyBhIHNlY29uZFxcbitcXHQgKiByZWdpc3RyYXRpb24gb2YgdGhlIHNhbWUgb3BzIHdvdWxkIGZhaWwgd2l0aCBFQlVTWSAqL1xcbitcXHRlcnIgPSBpb2Nvc3RfbW9kZWxfX2F0dGFjaChza2VsKTtcXG4rXFx0aWYgKEFTU0VSVF9PSyhlcnIsIFxcXCJhdHRhY2hcXFwiKSlcXG4rXFx0XFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXFxcInN3aXRjaF9hbmRfcmVhZGJhY2tcXFwiKTtcXG4rXFxuK1xcdGlvY29zdF9tb2RlbF9fZGVzdHJveShza2VsKTtcXG4rfVxcbitcXG4rLypcXG4rICogU2FtZSBjaGVjayBmb3IgdGhlIG11bHRpLXN0cmVhbSBleGFtcGxlIG1vZGVsLiAgT25seSBvbmUgbW9kZWwgY2FuXFxuKyAqIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lLCBzbyB0aGlzIHRlc3QgbXVzdCBydW4gc2VwYXJhdGVseSBmcm9tXFxuKyAqIHRlc3RfaW9jb3N0X21vZGVsOyBib3RoIGFyZSBzZXJpYWwuXFxuKyAqL1xcbit2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbF9zdHJlYW1zKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGlvY29zdF9tcyAqc2tlbDtcXG4rXFx0Y2hhciAqZGV2O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZGV2ID0gZ2V0ZW52KFxcXCJJT0NPU1RfVEVTVF9ERVZcXFwiKTtcXG4rXFx0aWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcXFwiaW9jb3N0X21vdW50ZWRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0c2tlbCA9IGlvY29zdF9tc19fb3Blbl9hbmRfbG9hZCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWxfb3Blbl9sb2FkXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGVyciA9IGlvY29zdF9tc19fYXR0YWNoKHNrZWwpO1xcbitcXHRpZiAoQVNTRVJUX09LKGVyciwgXFxcImF0dGFjaFxcXCIpKVxcbitcXHRcXHRBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCBcXFwic3dpdGNoX2FuZF9yZWFkYmFja1xcXCIpO1xcbitcXG4rXFx0aW9jb3N0X21zX19kZXN0cm95KHNrZWwpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzBmNzk4N2Y4ZWI2YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21vZGVsLmNcXG5AQCAtMCwwICsxLDkxIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovXFxuKy8qXFxuKyAqIEV4YW1wbGUgaW9jb3N0IGNvc3QgbW9kZWw6IHRoZSBidWlsdGluIGxpbmVhciBIREQgZm9ybXVsYSB3aXRoIGFsbFxcbisgKiBjb3N0cyBkb3VibGVkLlxcbisgKlxcbisgKiBUaGUgY29uc3RhbnRzIG1pcnJvciB3aGF0IGNhbGNfbGNvZWZzKCkgZGVyaXZlcyBmcm9tIHRoZSBBVVRPUF9IRERcXG4rICogZGVmYXVsdHMgKHJicHM9MTc0MDE5MTc2IHJzZXFpb3BzPTQxNzA4IHJyYW5kaW9wcz0zNzAsIHctc2lkZVxcbisgKiBhbmFsb2cpIGluIHZ0aW1lIHVuaXRzIHdoZXJlIDFzID09IDJeMzcsIGV4cHJlc3NlZCB3aXRoIHRoZSBzYW1lXFxuKyAqIHJvdW5kLXVwIGRpdmlzaW9ucyBzbyB0aGV5IGNhbm5vdCBkcmlmdCBmcm9tIHRoZSBrZXJuZWwsIHNvIGFcXG4rICogZGV2aWNlIHN3aXRjaGVkIHRvIGN0cmw9YnBmIHdpdGggdGhpcyBtb2RlbCByZWdpc3RlcmVkIGNoYXJnZXNcXG4rICogZXhhY3RseSB0d2ljZSB0aGUgYnVpbHRpbiBtb2RlbCB1bmRlciB0aGUgc2FtZSB3b3JrbG9hZCwgd2hpY2hcXG4rICogbWFrZXMgaXQgYSBjb252ZW5pZW50IHdheSB0byB2ZXJpZnkgdGhhdCBhY2NvdW50aW5nIGdvZXMgdGhyb3VnaFxcbisgKiB0aGUgQlBGIHBhdGguXFxuKyAqL1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rXFxuKy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXFxuKyNkZWZpbmUgSU9DX1BBR0VfU0laRVxcdFxcdDQwOTZcXG4rI2RlZmluZSBJT0NfU0VDVF9UT19QQUdFX1NISUZUXFx0M1xcdC8qIDUxMkIgc2VjdG9ycyB0byA0a0IgcGFnZXMgKi9cXG4rI2RlZmluZSBMQ09FRl9SQU5ESU9fUEFHRVNcXHQ0MDk2XFx0LyogMTZNQiBzZWVrIHRocmVzaG9sZCAqL1xcbisjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKVxcdC8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi9cXG4rXFxuKy8qIERJVjY0X1U2NF9ST1VORF9VUCAvIERJVl9ST1VORF9VUF9VTEwgZXF1aXZhbGVudHMsIGZvbGRlZCBhdFxcbisgKiBjb21waWxlIHRpbWUgKi9cXG4rI2RlZmluZSBSVSh4LCB5KVxcdFxcdCgoeCkgLyAoeSkgKyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXFxuK1xcbisjZGVmaW5lIFJCUFNcXHQxNzQwMTkxNzZVTExcXG4rI2RlZmluZSBSU0VRSU9QU1xcdDQxNzA4VUxMXFxuKyNkZWZpbmUgUlJBTkRJT1BTXFx0MzcwVUxMXFxuKyNkZWZpbmUgV0JQU1xcdDE3ODA3NTg2NlVMTFxcbisjZGVmaW5lIFdTRVFJT1BTXFx0NDI3MDVVTExcXG4rI2RlZmluZSBXUkFORElPUFNcXHQzNzhVTExcXG4rXFxuKyNkZWZpbmUgUlBBR0VcXHQoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKVxcbisjZGVmaW5lIFJTRVFJT1xcdChSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSlcXG4rI2RlZmluZSBSUkFORElPXFx0KFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSlcXG4rI2RlZmluZSBXUEFHRVxcdChSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpXFxuKyNkZWZpbmUgV1NFUUlPXFx0KFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKVxcbisjZGVmaW5lIFdSQU5ESU9cXHQoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKVxcbitcXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB1NjQgYnVpbHRpbl9jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcXG4rXFx0XFx0XFx0XFx0XFx0dTY0IGN1cnNvciwgdTY0IGZsYWdzKVxcbit7XFxuK1xcdHU2NCBwYWdlcywgc2Vla19wYWdlcyA9IDAsIGJhc2UsIGNvZWZfcGFnZTtcXG4rXFxuK1xcdGlmICghbmJ5dGVzKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHN3aXRjaCAob3ApIHtcXG4rXFx0Y2FzZSBSRVFfT1BfUkVBRDpcXG4rXFx0XFx0YmFzZSA9IFJTRVFJTztcXG4rXFx0XFx0Y29lZl9wYWdlID0gUlBBR0U7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIFJFUV9PUF9XUklURTpcXG4rXFx0XFx0YmFzZSA9IFdTRVFJTztcXG4rXFx0XFx0Y29lZl9wYWdlID0gV1BBR0U7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGN1cnNvcikge1xcbitcXHRcXHRzZWVrX3BhZ2VzID0gc2VjdG9yIFxcdTAwM2UgY3Vyc29yID8gc2VjdG9yIC0gY3Vyc29yXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgOiBjdXJzb3IgLSBzZWN0b3I7XFxuK1xcdFxcdHNlZWtfcGFnZXMgXFx1MDAzZVxcdTAwM2U9IElPQ19TRUNUX1RPX1BBR0VfU0hJRlQ7XFxuK1xcdFxcdGlmIChzZWVrX3BhZ2VzIFxcdTAwM2UgTENPRUZfUkFORElPX1BBR0VTKVxcbitcXHRcXHRcXHRiYXNlID0gKG9wID09IFJFUV9PUF9SRUFEKSA/IFJSQU5ESU8gOiBXUkFORElPO1xcbitcXHR9XFxuK1xcbitcXHRwYWdlcyA9IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSk7XFxuK1xcdGlmIChmbGFncyBcXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpXFxuK1xcdFxcdGJhc2UgPSAwO1xcbitcXHRyZXR1cm4gYmFzZSArIHBhZ2VzICogY29lZl9wYWdlO1xcbit9XFxuK1xcbitTRUMoXFxcInN0cnVjdF9vcHNcXFwiKVxcbit1NjQgQlBGX1BST0coaW9jb3N0XzJ4X2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxcbitcXHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXFxuK3tcXG4rXFx0cmV0dXJuIDIgKiBidWlsdGluX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGZsYWdzKTtcXG4rfVxcbitcXG4rU0VDKFxcXCIuc3RydWN0X29wc1xcXCIpXFxuK3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIGlvY29zdF8yeCA9IHtcXG4rXFx0LmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0XzJ4X2NhbGNfY29zdCxcXG4rfTtcXG4rXFxuK2NoYXIgTElDRU5TRVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbXMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbXMuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDY1ZmQ1ZDVjNjJlMFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmNcXG5AQCAtMCwwICsxLDEyMiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xcbisvKlxcbisgKiBFeGFtcGxlIG11bHRpLXN0cmVhbSBzZXF1ZW50aWFsaXR5IGRldGVjdGlvbiBjb3N0IG1vZGVsLlxcbisgKlxcbisgKiBUaGUgYnVpbHRpbiBtb2RlbCBrZWVwcyBhIHNpbmdsZSBjdXJzb3IgcGVyIGNncm91cCwgc28gdHdvXFxuKyAqIGludGVybGVhdmVkIHNlcXVlbnRpYWwgcmVhZGVycyBpbiBvbmUgY2dyb3VwIGFyZSBhbGwgcHJpY2VkIHJhbmRvbVxcbisgKiAobWVhc3VyZWQgODl4IG92ZXJjaGFyZ2UsIDEyLjl4IHRocm91Z2hwdXQgY29sbGFwc2UpLCB3aGlsZSByYW5kb21cXG4rICogSU8gaW5zaWRlIGEgaG90IHdpbmRvdyBzbWFsbGVyIHRoYW4gdGhlIDE2TUIgc2VlayB0aHJlc2hvbGQgaXNcXG4rICogcHJpY2VkIHNlcXVlbnRpYWwgKG1lYXN1cmVkIDEwN3ggdW5kZXJjaGFyZ2UpLiAgVGhpcyBtb2RlbCByZXBsYWNlc1xcbisgKiB0aGUgc2luZ2xlIGN1cnNvciB3aXRoIGEgcGVyLWNncm91cCB0YWJsZSBvZiBzdHJlYW0gc2xvdHMsIGtleWVkIGJ5XFxuKyAqIHRoZSBpb2NnX2lkIGFyZ3VtZW50OiBhbiBJTyBpcyBzZXF1ZW50aWFsIGlmZiBpdHMgc2VjdG9yIG1hdGNoZXMgdGhlXFxuKyAqIGV4cGVjdGVkIG5leHQgc2VjdG9yIG9mIGFueSB0cmFja2VkIHN0cmVhbS4gIEludGVybGVhdmVkIHN0cmVhbXNcXG4rICoga2VlcCB0aGVpciBvd24gc2xvdHMsIGFuZCB3aW5kb3dlZCByYW5kb20gSU8gcmFyZWx5IG1hdGNoZXMgYVxcbisgKiBtb3ZpbmcgZXhwZWN0YXRpb24uXFxuKyAqL1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rXFxuKy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXFxuKyNkZWZpbmUgSU9DX1BBR0VfU0laRVxcdFxcdDQwOTZcXG4rI2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFXFx0KDFVTEwgXFx1MDAzY1xcdTAwM2MgMClcXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXFxuK1xcbisvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcXG4rICogY29tcGlsZSB0aW1lICovXFxuKyNkZWZpbmUgUlUoeCwgeSlcXHRcXHQoKHgpIC8gKHkpICsgKCgoeCkgJSAoeSkpID8gMSA6IDApKVxcbitcXG4rI2RlZmluZSBSQlBTXFx0MTc0MDE5MTc2VUxMXFxuKyNkZWZpbmUgUlNFUUlPUFNcXHQ0MTcwOFVMTFxcbisjZGVmaW5lIFJSQU5ESU9QU1xcdDM3MFVMTFxcbisjZGVmaW5lIFdCUFNcXHQxNzgwNzU4NjZVTExcXG4rI2RlZmluZSBXU0VRSU9QU1xcdDQyNzA1VUxMXFxuKyNkZWZpbmUgV1JBTkRJT1BTXFx0Mzc4VUxMXFxuK1xcbisjZGVmaW5lIFJQQUdFXFx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFJCUFMsIElPQ19QQUdFX1NJWkUpKSlcXG4rI2RlZmluZSBSU0VRSU9cXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXFxuKyNkZWZpbmUgUlJBTkRJT1xcdChSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpXFxuKyNkZWZpbmUgV1BBR0VcXHQoUlUoVlRJTUVfUEVSX1NFQywgUlUoV0JQUywgSU9DX1BBR0VfU0laRSkpKVxcbisjZGVmaW5lIFdTRVFJT1xcdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcXG4rI2RlZmluZSBXUkFORElPXFx0KFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSlcXG4rXFxuKyNkZWZpbmUgTlNMT1RTXFx0NFxcbitcXG4rc3RydWN0IHN0cmVhbXMge1xcbitcXHRfX3U2NCBleHBlY3RlZFtOU0xPVFNdO1xcdC8qIG5leHQgZXhwZWN0ZWQgc2VjdG9yLCBwZXIgc3RyZWFtICovXFxuK1xcdF9fdTY0IHN0YW1wW05TTE9UU107XFx0LyogTFJVIHN0YW1wLCAwID0gZW1wdHkgKi9cXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTY0KTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgc3RyZWFtcyk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgNjQpO1xcbit9IHN0cmVhbV90YWIgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rU0VDKFxcXCJzdHJ1Y3Rfb3BzXFxcIilcXG4rdTY0IEJQRl9QUk9HKGlvY29zdF9tc19jYWxjX2Nvc3QsIHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcXG4rXFx0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxcbit7XFxuK1xcdHN0cnVjdCBzdHJlYW1zICpzO1xcbitcXHR1NjQgcGFnZSwgc2VxaW8sIHJhbmRpbywgYmFzZSwgYWR2YW5jZSwgbm93O1xcbitcXHR1MzIgaSwgdmljdGltID0gMCwgZm91bmQgPSAweEZGRkZGRkZGO1xcbitcXG4rXFx0aWYgKG9wICE9IFJFUV9PUF9SRUFEIFxcdTAwMjZcXHUwMDI2IG9wICE9IFJFUV9PUF9XUklURSlcXG4rXFx0XFx0cmV0dXJuIDA7XFx0LyogZGVsZWdhdGUgdGhlIHJlc3QgdG8gYnVpbHRpbiAqL1xcbitcXHRpZiAoIW5ieXRlcylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpZiAob3AgPT0gUkVRX09QX1JFQUQpIHtcXG4rXFx0XFx0cGFnZSA9IFJQQUdFOyBzZXFpbyA9IFJTRVFJTzsgcmFuZGlvID0gUlJBTkRJTztcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0cGFnZSA9IFdQQUdFOyBzZXFpbyA9IFdTRVFJTzsgcmFuZGlvID0gV1JBTkRJTztcXG4rXFx0fVxcbitcXHRhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpO1xcdC8qIHNlY3RvcnMgKi9cXG4rXFxuK1xcdHMgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZzdHJlYW1fdGFiLCBcXHUwMDI2aW9jZ19pZCk7XFxuK1xcdGlmICghcykge1xcbitcXHRcXHRzdHJ1Y3Qgc3RyZWFtcyB6ZXJvID0ge307XFxuK1xcbitcXHRcXHRicGZfbWFwX3VwZGF0ZV9lbGVtKFxcdTAwMjZzdHJlYW1fdGFiLCBcXHUwMDI2aW9jZ19pZCwgXFx1MDAyNnplcm8sXFxuK1xcdFxcdFxcdFxcdCAgICBCUEZfTk9FWElTVCk7XFxuK1xcdFxcdHMgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZzdHJlYW1fdGFiLCBcXHUwMDI2aW9jZ19pZCk7XFxuK1xcdFxcdGlmICghcylcXG4rXFx0XFx0XFx0cmV0dXJuIHNlcWlvICsgUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKSAqIHBhZ2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChmbGFncyBcXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpIHtcXG4rXFx0XFx0YmFzZSA9IDA7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRub3cgPSBicGZfa3RpbWVfZ2V0X25zKCk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOU0xPVFM7IGkrKykge1xcbitcXHRcXHRpZiAocy1cXHUwMDNlZXhwZWN0ZWRbaV0gPT0gc2VjdG9yIFxcdTAwMjZcXHUwMDI2IHMtXFx1MDAzZXN0YW1wW2ldKSB7XFxuK1xcdFxcdFxcdGZvdW5kID0gaTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRpZiAoZm91bmQgIT0gMHhGRkZGRkZGRikge1xcbitcXHRcXHRiYXNlID0gc2VxaW87XFxuK1xcdFxcdHMtXFx1MDAzZWV4cGVjdGVkW2ZvdW5kXSA9IHNlY3RvciArIGFkdmFuY2U7XFxuK1xcdFxcdHMtXFx1MDAzZXN0YW1wW2ZvdW5kXSA9IG5vdztcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0YmFzZSA9IHJhbmRpbztcXG4rXFx0XFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIE5TTE9UUzsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmIChzLVxcdTAwM2VzdGFtcFtpXSBcXHUwMDNjIHMtXFx1MDAzZXN0YW1wW3ZpY3RpbV0pXFxuK1xcdFxcdFxcdFxcdHZpY3RpbSA9IGk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0cy1cXHUwMDNlZXhwZWN0ZWRbdmljdGltXSA9IHNlY3RvciArIGFkdmFuY2U7XFxuK1xcdFxcdHMtXFx1MDAzZXN0YW1wW3ZpY3RpbV0gPSBub3c7XFxuK1xcdH1cXG4rb3V0OlxcbitcXHRyZXR1cm4gYmFzZSArIFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlO1xcbit9XFxuK1xcbitTRUMoXFxcIi5zdHJ1Y3Rfb3BzXFxcIilcXG4rc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgaW9jb3N0X21zID0ge1xcbitcXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LFxcbit9O1xcbitcXG4rY2hhciBMSUNFTlNFW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzU6NDQuMzY0NDc2MTE4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyNDM5MjM3MTMyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQX0lPQ09TVF9CUEZcIixcbiAgICBcIkJMS19DR1JPVVBfSU9DT1NUXCIsXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQlBGX0pJVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImlvY29zdF9icGZfY2FsY19jb3N0XCIsXG4gICAgXCJicGZfaW9jb3N0X3JlZ1wiLFxuICAgIFwiYnBmX2lvY29zdF91bnJlZ1wiLFxuICAgIFwiaW9jX2Nvc3RfbW9kZWxfd3JpdGVcIixcbiAgICBcImlvY19jb3N0X21vZGVsX3ByZmlsbFwiLFxuICAgIFwiY2FsY192dGltZV9jb3N0XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMgaW4gdGhlIGJsb2NrIGlvY29zdCBjZ3JvdXAgY29udHJvbGxlciAoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRikuIEl0IGFkZHMgc3RydWN0X29wcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBpbnRlZ3JhdGVzIGR5bmFtaWMgQlBGIGNvc3QgY2FsY3VsYXRpb24gaW50byB0aGUgYmlvIHN1Ym1pc3Npb24gcGF0aCwgYW5kIGV4dGVuZHMgdGhlIGNncm91cCBpby5jb3N0Lm1vZGVsIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLiBUaGUgY29kZSBpcyBmdWxseSByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBjZ3JvdXBzIGFuZCB0aGUgQlBGIHN1YnN5c3RlbS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBTZXAgOCAxMTozNTo0MyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuaW5kZXggOGQyNjAzNzUxYzUxYS4uNTRiMDU3NGNlNTg2YyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0XG5AQCAtMjExNSwxMCArMjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXNcbiBcdGFyZSBkZWZpbmVkLlxuIFxuIFx0ICA9PT09PVx0XHQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLVx0ICBjdHJsXHRcdFwiYXV0b1wiIG9yIFwidXNlclwiXG4rXHQgIGN0cmxcdFx0XCJhdXRvXCIsIFwidXNlclwiIG9yIFwiYnBmXCJcbiBcdCAgbW9kZWxcdFx0VGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gXCJsaW5lYXJcIlxuIFx0ICA9PT09PVx0XHQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFxuK1x0V2hlbiBcImN0cmxcIiBpcyBcImJwZlwiIChvbmx5IGF2YWlsYWJsZSB3aGVuXG4rXHRDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGIGlzIGVuYWJsZWQpLCBjb3N0IGNhbGN1bGF0aW9uIGZvclxuK1x0dGhlIGRldmljZSBpcyBkaXNwYXRjaGVkIHRvIHRoZSBCUEYgcHJvZ3JhbSByZWdpc3RlcmVkIGFnYWluc3RcbitcdHRoZSBpb2Nvc3RfbW9kZWxfb3BzIHN0cnVjdF9vcHMuICBXcml0aW5nIFwiYnBmXCIgZmFpbHMgd2l0aCAtRUlOVkFMXG4rXHR1bnRpbCBzdWNoIGEgcHJvZ3JhbSBpcyByZWdpc3RlcmVkLCBhbmQgYXQgbW9zdCBvbmUgcHJvZ3JhbSBjYW5cbitcdGJlIHJlZ2lzdGVyZWQgc3lzdGVtLXdpZGUuICBUaGUgbW9kZWwgaXMgY2FsbGVkIHdpdGggc2NhbGFyXG4rXHRhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlXG4rXHRpc3N1aW5nIGNncm91cCwgZmxhZ3M7IHNlZSBpbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBmb3IgdGhlaXJcbitcdG1lYW5pbmcpIGFuZCByZXR1cm5zIGEgY29zdCBpbiB2dGltZSB1bml0cywgY2xhbXBlZCBieSB0aGUga2VybmVsXG4rXHR0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlc1xuK1x0dGhlIElPIGJhY2sgdG8gdGhlIGJ1aWx0aW4gbGluZWFyIGZvcm11bGEsIHNvIGEgbW9kZWwgd2hpY2ggb25seVxuK1x0aGFuZGxlcyBzb21lIElPIHR5cGVzIGNhbm5vdCBtYWtlIHRoZSByZXN0IGZyZWUuICBEZXZpY2VzIHdoaWNoXG4rXHRkb24ndCBvcHQgaW4ga2VlcCB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwgdW5jaGFuZ2VkLlxuK1xuIFx0V2hlbiBcImN0cmxcIiBpcyBcImF1dG9cIiwgdGhlIGtlcm5lbCBtYXkgY2hhbmdlIGFsbCBwYXJhbWV0ZXJzXG4gXHRkeW5hbWljYWxseS4gIFdoZW4gXCJjdHJsXCIgaXMgc2V0IHRvIFwidXNlclwiIG9yIGFueSBvdGhlclxuIFx0cGFyYW1ldGVycyBhcmUgd3JpdHRlbiB0bywgXCJjdHJsXCIgYmVjb21lIFwidXNlclwiIGFuZCB0aGVcbmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZ1xuaW5kZXggNzBlNGE2NmQ5NDFmZi4uYmY0M2JlMjFlMDBiYiAxMDA2NDRcbi0tLSBhL2Jsb2NrL0tjb25maWdcbisrKyBiL2Jsb2NrL0tjb25maWdcbkBAIC0yMzEsNCArMjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OXG4gXG4gc291cmNlIFwiYmxvY2svS2NvbmZpZy5pb3NjaGVkXCJcbiBcbitjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRib29sIFwiRW5hYmxlIEJQRiBwbHVnZ2FibGUgY29zdCBtb2RlbCBzdXBwb3J0IGZvciB0aGUgY29zdCBJTyBjb250cm9sbGVyXCJcbitcdGRlcGVuZHMgb24gQkxLX0NHUk9VUF9JT0NPU1QgXHUwMDI2XHUwMDI2IEJQRl9TWVNDQUxMIFx1MDAyNlx1MDAyNiBCUEZfSklUXG4rXHRoZWxwXG4rXHQgRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVnaXN0ZXJzIHRoZSBcImlvY29zdF9tb2RlbF9vcHNcIiBCUEZcbitcdCBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlXG4rXHQgYnVpbHRpbiBsaW5lYXIgY29zdCBtb2RlbCBvbiBkZXZpY2VzIGNvbmZpZ3VyZWQgd2l0aFxuK1x0IFwiY3RybD1icGZcIiB0aHJvdWdoIGlvLmNvc3QubW9kZWwuXG4rXG4gZW5kaWYgIyBCTE9DS1xuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLmVlNWNlYmVlYTAwNmYgMTAwNjQ0XG4tLS0gYS9ibG9jay9NYWtlZmlsZVxuKysrIGIvYmxvY2svTWFrZWZpbGVcbkBAIC0zOSwzICszOSw0IEBAIG9iai0kKENPTkZJR19CTEtfSU5MSU5FX0VOQ1JZUFRJT04pXHQrPSBibGstY3J5cHRvLm8gYmxrLWNyeXB0by1wcm9maWxlLm8gXFxcbiBcdFx0XHRcdFx0ICAgYmxrLWNyeXB0by1zeXNmcy5vXG4gb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSylcdCs9IGJsay1jcnlwdG8tZmFsbGJhY2sub1xuIG9iai0kKENPTkZJR19CTE9DS19IT0xERVJfREVQUkVDQVRFRClcdCs9IGhvbGRlci5vXG4rb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRilcdCs9IGJsay1pb2Nvc3QtYnBmLm9cbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LWJwZi5jIGIvYmxvY2svYmxrLWlvY29zdC1icGYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjBjMzRmNTZkZWQ3MWRcbi0tLSAvZGV2L251bGxcbisrKyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmNcbkBAIC0wLDAgKzEsMTUyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuK1xuKy8qXG4rICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy5cbisgKlxuKyAqIFJlZ2lzdGVycyB0aGUgXCJpb2Nvc3RfbW9kZWxfb3BzXCIgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWxcbisgKiBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBhIHRpbWU7IGRldmljZXMgb3B0IGluIHBlci1xdWV1ZSB3aXRoXG4rICogXCJlY2hvICRERVYgY3RybD1icGYgXHUwMDNlIGlvLmNvc3QubW9kZWxcIi4gIERldmljZXMgd2l0aG91dCBhIHJlZ2lzdGVyZWRcbisgKiBtb2RlbCBrZWVwIHVzaW5nIHRoZSBidWlsdGluIGxpbmVhciBtb2RlbC5cbisgKi9cbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGZfdmVyaWZpZXIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXHUwMDNlXG4rXG4rLyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJ3MgY2hhcmdlYWJsZSBjb3N0ICovXG4rI2RlZmluZSBJT0NPU1RfQlBGX01BWF9DT1NUXHQoMVVMTCBcdTAwM2NcdTAwM2MgMzcpXG4rXG4rc3RhdGljIHN0cnVjdCBicGZfc3RydWN0X29wcyBicGZfaW9jb3N0X21vZGVsX29wcztcbitcbitzdGF0aWMgREVGSU5FX01VVEVYKGlvY29zdF9icGZfcmVnX2xvY2spO1xuK3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX3JjdSAqaW9jb3N0X2JwZl9tb2RlbDtcbitzdGF0aWMgREVGSU5FX1NUQVRJQ19LRVlfRkFMU0UoaW9jb3N0X2JwZl9rZXkpO1xuK1xuK2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpXG4re1xuK1x0cmV0dXJuIHN0YXRpY19icmFuY2hfdW5saWtlbHkoXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xuK31cbitcbitib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvcixcbitcdFx0XHQgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApXG4re1xuK1x0Y29uc3Qgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm9wcztcbitcdHU2NCBjb3N0O1xuK1xuK1x0aWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFx1MDAyNmlvY29zdF9icGZfa2V5KSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0b3BzID0gcmN1X2RlcmVmZXJlbmNlKGlvY29zdF9icGZfbW9kZWwpO1xuK1x0aWYgKCFvcHMpIHtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdGNvc3QgPSBvcHMtXHUwMDNlY2FsY19jb3N0KG9wLCBuYnl0ZXMsIHNlY3RvciwgY3Vyc29yLCBpb2NnX2lkLCBmbGFncyk7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdGlmICghY29zdClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0KmNvc3RwID0gbWluKGNvc3QsIElPQ09TVF9CUEZfTUFYX0NPU1QpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9tb2RlbF9pbml0KHN0cnVjdCBidGYgKmJ0Zilcbit7XG4rXHRzMzIgdHlwZV9pZDtcbitcbitcdHR5cGVfaWQgPSBidGZfZmluZF9ieV9uYW1lX2tpbmQoYnRmLCBcImlvY29zdF9tb2RlbF9vcHNcIiwgQlRGX0tJTkRfU1RSVUNUKTtcbitcdGlmICh0eXBlX2lkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIoY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxuK1x0XHRcdFx0ICBjb25zdCBzdHJ1Y3QgYnRmX21lbWJlciAqbWVtYmVyLFxuK1x0XHRcdFx0ICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sIGJwZl9pb2Nvc3RfaXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLFxuK1x0XHRcdFx0ICAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsXG4rXHRcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLFxuK1x0XHRcdFx0ICAgICAgIHN0cnVjdCBicGZfaW5zbl9hY2Nlc3NfYXV4ICppbmZvKVxuK3tcbitcdHJldHVybiBicGZfdHJhY2luZ19idGZfY3R4X2FjY2VzcyhvZmYsIHNpemUsIHR5cGUsIHByb2csIGluZm8pO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvICpcbiticGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCxcbitcdFx0XHQgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZylcbit7XG4rXHRyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0ge1xuK1x0LmdldF9mdW5jX3Byb3RvID0gYnBmX2lvY29zdF9nZXRfZnVuY19wcm90byxcbitcdC5pc192YWxpZF9hY2Nlc3MgPSBicGZfaW9jb3N0X2lzX3ZhbGlkX2FjY2Vzcyxcbit9O1xuK1xuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9yZWcodm9pZCAqa2RhdGEsIHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhO1xuK1xuK1x0aWYgKCFuZXdfb3BzLVx1MDAzZWNhbGNfY29zdClcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRpbnQgcmV0ID0gMDtcbitcbitcdC8qIHRoZSBjYWxsZXIgb25seSBob2xkcyB0aGUgcGVyLW1hcCBsb2NrLCBzbyBzZXJpYWxpemUgaGVyZSAqL1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbitcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkpXG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdGVsc2Uge1xuK1x0XHRzdGF0aWNfYnJhbmNoX2luYyhcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4rXHRcdHJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBuZXdfb3BzKTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGJwZl9pb2Nvc3RfdW5yZWcodm9pZCAqa2RhdGEsIHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRtdXRleF9sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuK1x0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsKSA9PSBrZGF0YSkge1xuK1x0XHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7XG4rXHRcdHN0YXRpY19icmFuY2hfZGVjKFx1MDAyNmlvY29zdF9icGZfa2V5KTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbit9XG4rXG4rc3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbitcdFx0XHRcdCAgICAgdTY0IGN1cnNvciwgdTY0IGlvY2dfaWQsIHU2NCBmbGFncylcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fYnBmX29wc19pb2Nvc3RfbW9kZWxfb3BzID0ge1xuK1x0LmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0ge1xuK1x0LnZlcmlmaWVyX29wcyA9IFx1MDAyNmJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzLFxuK1x0LmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsXG4rXHQuaW5pdF9tZW1iZXIgPSBicGZfaW9jb3N0X2luaXRfbWVtYmVyLFxuK1x0LnJlZyA9IGJwZl9pb2Nvc3RfcmVnLFxuK1x0LnVucmVnID0gYnBmX2lvY29zdF91bnJlZyxcbitcdC5uYW1lID0gXCJpb2Nvc3RfbW9kZWxfb3BzXCIsXG4rXHQuY2ZpX3N0dWJzID0gXHUwMDI2X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsXG4rXHQub3duZXIgPSBUSElTX01PRFVMRSxcbit9O1xuK1xuK3N0YXRpYyBpbnQgX19pbml0IGJwZl9pb2Nvc3RfaW5pdCh2b2lkKVxuK3tcbitcdHJldHVybiByZWdpc3Rlcl9icGZfc3RydWN0X29wcyhcdTAwMjZicGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7XG4rfVxuK2xhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTtcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LmMgYi9ibG9jay9ibGstaW9jb3N0LmNcbmluZGV4IDI3NDViZmZjZDVlZWYuLmE1OGMxNmZjYjI5ZmEgMTAwNjQ0XG4tLS0gYS9ibG9jay9ibGstaW9jb3N0LmNcbisrKyBiL2Jsb2NrL2Jsay1pb2Nvc3QuY1xuQEAgLTE3Nyw2ICsxNzcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3RpbWVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90aW1lNjQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhcnNlci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vbG9jYWwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9sb2NhbDY0LmhcdTAwM2VcbkBAIC00NDUsNiArNDQ2LDcgQEAgc3RydWN0IGlvYyB7XG4gXHRpbnRcdFx0XHRcdGF1dG9wX2lkeDtcbiBcdGJvb2xcdFx0XHRcdHVzZXJfcW9zX3BhcmFtczoxO1xuIFx0Ym9vbFx0XHRcdFx0dXNlcl9jb3N0X21vZGVsOjE7XG4rXHRib29sXHRcdFx0XHRicGZfY29zdF9tb2RlbDtcbiB9O1xuIFxuIHN0cnVjdCBpb2NnX3BjcHVfc3RhdCB7XG5AQCAtMjIzOCw2ICsyMjQwLDcgQEAgc3RhdGljIHZvaWQgaW9jX3RpbWVyX2ZuKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcilcbiBcdHN0cnVjdCBpb2Nfbm93IG5vdztcbiBcdExJU1RfSEVBRChzdXJwbHVzZXMpO1xuIFx0aW50IG5yX2RlYnRvcnMsIG5yX3Nob3J0YWdlcyA9IDAsIG5yX2xhZ2dpbmcgPSAwO1xuK1x0aW50IG5yX2FjdGl2ZSA9IDA7XG4gXHR1NjQgdXNhZ2VfdXNfc3VtID0gMDtcbiBcdHUzMiBwcG1fcnRocjtcbiBcdHUzMiBwcG1fd3RocjtcbkBAIC0yMjc0LDYgKzIyNzcsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHR1NjQgdmRvbmUsIHZ0aW1lLCB1c2FnZV91cztcbiBcdFx0dTMyIGh3X2FjdGl2ZSwgaHdfaW51c2U7XG4gXG4rXHRcdG5yX2FjdGl2ZSsrO1xuK1xuIFx0XHQvKlxuIFx0XHQgKiBDb2xsZWN0IHVudXNlZCBhbmQgd2luZCB2dGltZSBjbG9zZXIgdG8gdm5vdyB0byBwcmV2ZW50XG4gXHRcdCAqIGlvY2dzIGZyb20gYWNjdW11bGF0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGJ1ZGdldC5cbkBAIC0yNDYwLDYgKzI0NjUsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHRpb2NfcmVmcmVzaF92cmF0ZShpb2MsIFx1MDAyNm5vdyk7XG4gXHR9XG4gXG4rXHR0cmFjZV9pb2Nvc3RfaW9jX3RpY2soaW9jLCBucl9hY3RpdmUsIHVzYWdlX3VzX3N1bSk7XG4rXG4gXHRzcGluX3VubG9ja19pcnEoXHUwMDI2aW9jLVx1MDAzZWxvY2spO1xuIH1cbiBcbkBAIC0yNTczLDYgKzI1ODAsMjMgQEAgc3RhdGljIHU2NCBjYWxjX3Z0aW1lX2Nvc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLCBib29sIGlzX21lcmdlKVxuIHtcbiBcdHU2NCBjb3N0O1xuIFxuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRzdHJ1Y3QgaW9jICppb2MgPSBpb2NnLVx1MDAzZWlvYztcbitcbitcdGlmIChSRUFEX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsKSkge1xuK1x0XHR1NjQgYnBmX2Nvc3Q7XG4rXG4rXHRcdGlmIChpb2Nvc3RfYnBmX2NhbGNfY29zdChiaW9fb3AoYmlvKSxcbitcdFx0XHRcdFx0IGJpby1cdTAwM2ViaV9pdGVyLmJpX3NpemUsXG4rXHRcdFx0XHRcdCBiaW8tXHUwMDNlYmlfaXRlci5iaV9zZWN0b3IsXG4rXHRcdFx0XHRcdCBpb2NnLVx1MDAzZWN1cnNvcixcbitcdFx0XHRcdFx0IGlvY2dfdG9fYmxrZyhpb2NnKS1cdTAwM2VibGtjZy1cdTAwM2Vjc3MuaWQsXG4rXHRcdFx0XHRcdCBpc19tZXJnZSA/IElPQ09TVF9DT1NUX0ZfTUVSR0UgOiAwLFxuK1x0XHRcdFx0XHQgXHUwMDI2YnBmX2Nvc3QpKVxuK1x0XHRcdHJldHVybiBicGZfY29zdDtcbitcdH1cbisjZW5kaWZcbitcbiBcdGNhbGNfdnRpbWVfY29zdF9idWlsdGluKGJpbywgaW9jZywgaXNfbWVyZ2UsIFx1MDAyNmNvc3QpO1xuIFx0cmV0dXJuIGNvc3Q7XG4gfVxuQEAgLTM0NDEsNyArMzQ2NSw4IEBAIHN0YXRpYyB1NjQgaW9jX2Nvc3RfbW9kZWxfcHJmaWxsKHN0cnVjdCBzZXFfZmlsZSAqc2YsXG4gXHRzZXFfcHJpbnRmKHNmLCBcIiVzIGN0cmw9JXMgbW9kZWw9bGluZWFyIFwiXG4gXHRcdCAgIFwicmJwcz0lbGx1IHJzZXFpb3BzPSVsbHUgcnJhbmRpb3BzPSVsbHUgXCJcbiBcdFx0ICAgXCJ3YnBzPSVsbHUgd3NlcWlvcHM9JWxsdSB3cmFuZGlvcHM9JWxsdVxcblwiLFxuLVx0XHQgICBkbmFtZSwgaW9jLVx1MDAzZXVzZXJfY29zdF9tb2RlbCA/IFwidXNlclwiIDogXCJhdXRvXCIsXG4rXHRcdCAgIGRuYW1lLCBpb2MtXHUwMDNlYnBmX2Nvc3RfbW9kZWwgPyBcImJwZlwiIDpcbitcdFx0XHQgICBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsID8gXCJ1c2VyXCIgOiBcImF1dG9cIixcbiBcdFx0ICAgdVtJX0xDT0VGX1JCUFNdLCB1W0lfTENPRUZfUlNFUUlPUFNdLCB1W0lfTENPRUZfUlJBTkRJT1BTXSxcbiBcdFx0ICAgdVtJX0xDT0VGX1dCUFNdLCB1W0lfTENPRUZfV1NFUUlPUFNdLCB1W0lfTENPRUZfV1JBTkRJT1BTXSk7XG4gXHRzcGluX3VubG9ja19pcnEoXHUwMDI2aW9jLVx1MDAzZWxvY2spO1xuQEAgLTM0ODEsNyArMzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHR1bnNpZ25lZCBpbnQgbWVtZmxhZ3M7XG4gXHRzdHJ1Y3QgaW9jICppb2M7XG4gXHR1NjQgdVtOUl9JX0xDT0VGU107XG4tXHRib29sIHVzZXI7XG4rXHRib29sIHVzZXIsIGJwZjtcbiBcdGNoYXIgKmJvZHksICpwO1xuIFx0aW50IHJldDtcbiBcbkBAIC0zNTEyLDYgKzM1MzcsNyBAQCBzdGF0aWMgc3NpemVfdCBpb2NfY29zdF9tb2RlbF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmlucHV0LFxuIFx0c3Bpbl9sb2NrX2lycShcdTAwMjZpb2MtXHUwMDNlbG9jayk7XG4gXHRtZW1jcHkodSwgaW9jLVx1MDAzZXBhcmFtcy5pX2xjb2Vmcywgc2l6ZW9mKHUpKTtcbiBcdHVzZXIgPSBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsO1xuK1x0YnBmID0gaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsO1xuIFxuIFx0cmV0ID0gLUVJTlZBTDtcbiBcbkBAIC0zNTI3LDExICszNTUzLDIwIEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHRcdHN3aXRjaCAobWF0Y2hfdG9rZW4ocCwgY29zdF9jdHJsX3Rva2VucywgYXJncykpIHtcbiBcdFx0Y2FzZSBDT1NUX0NUUkw6XG4gXHRcdFx0bWF0Y2hfc3RybGNweShidWYsIFx1MDAyNmFyZ3NbMF0sIHNpemVvZihidWYpKTtcbi1cdFx0XHRpZiAoIXN0cmNtcChidWYsIFwiYXV0b1wiKSlcbitcdFx0XHRpZiAoIXN0cmNtcChidWYsIFwiYXV0b1wiKSkge1xuIFx0XHRcdFx0dXNlciA9IGZhbHNlO1xuLVx0XHRcdGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInVzZXJcIikpXG4rXHRcdFx0XHRicGYgPSBmYWxzZTtcbitcdFx0XHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInVzZXJcIikpIHtcbiBcdFx0XHRcdHVzZXIgPSB0cnVlO1xuLVx0XHRcdGVsc2VcbitcdFx0XHRcdGJwZiA9IGZhbHNlO1xuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRcdFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCJicGZcIikpIHtcbitcdFx0XHRcdGlmICghaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKCkpXG4rXHRcdFx0XHRcdGdvdG8gdW5sb2NrO1xuK1x0XHRcdFx0dXNlciA9IGZhbHNlO1xuK1x0XHRcdFx0YnBmID0gdHJ1ZTtcbisjZW5kaWZcbitcdFx0XHR9IGVsc2VcbiBcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRjYXNlIENPU1RfTU9ERUw6XG5AQCAtMzU1Niw2ICszNTkxLDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCxcbiBcdH0gZWxzZSB7XG4gXHRcdGlvYy1cdTAwM2V1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTtcbiBcdH1cbitcdFdSSVRFX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsLCBicGYpO1xuIFx0aW9jX3JlZnJlc2hfcGFyYW1zKGlvYywgdHJ1ZSk7XG4gXG4gXHRyZXQgPSAwO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0Lmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43MTExYjVjMDNkYzM2XG4tLS0gL2Rldi9udWxsXG4rKysgYi9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaFxuQEAgLTAsMCArMSw1NiBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rI2lmbmRlZiBfTElOVVhfQkxLX0lPQ09TVF9IXG4rI2RlZmluZSBfTElOVVhfQkxLX0lPQ09TVF9IXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuK1xuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXG4rLypcbisgKiBQbHVnZ2FibGUgY29zdCBtb2RlbCBpbnRlcmZhY2UgZm9yIGJsay1pb2Nvc3QuXG4rICpcbisgKiBBIEJQRiBzdHJ1Y3Rfb3BzIGltcGxlbWVudGF0aW9uIHJlZ2lzdGVyZWQgYWdhaW5zdCBcImlvY29zdF9tb2RlbF9vcHNcIlxuKyAqIHJlcGxhY2VzIHRoZSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoXG4rICogXCJjdHJsPWJwZlwiIHRocm91Z2ggaW8uY29zdC5tb2RlbC4gIFRoZSBtb2RlbCBpcyBhIHB1cmUgZnVuY3Rpb24gb2YgdGhlXG4rICogYXJndW1lbnRzIGJlbG93IGFuZCByZXR1cm5zIHRoZSBjb3N0IG9mIHRoZSBJTyBpbiBkZXZpY2UgdGltZSB1bml0cyxcbisgKiB3aGVyZSAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBlcXVhbHMgMl4zNyAoVlRJTUVfUEVSX1NFQykuICBUaGVcbisgKiByZXR1cm5lZCB2YWx1ZSBpcyBjbGFtcGVkIGJ5IHRoZSBrZXJuZWwuICBBIGNvc3Qgb2YgMCBkZWxlZ2F0ZXMgdGhlXG4rICogSU8gYmFjayB0byB0aGUgYnVpbHRpbiBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIGRvZXMgbm90IGhhbmRsZSBhXG4rICogZ2l2ZW4gSU8gdHlwZSBjYW5ub3QgbWFrZSBpdCBmcmVlLlxuKyAqXG4rICogVGhlIGlvY2dfaWQgYXJndW1lbnQgaWRlbnRpZmllcyB0aGUgaXNzdWluZyBjZ3JvdXAgKGNzcyBpZCkgc28gdGhlXG4rICogbW9kZWwgY2FuIGtlZXAgcGVyLWNncm91cCBzdGF0ZSwgZS5nLiBmb3IgbXVsdGktc3RyZWFtIHNlcXVlbnRpYWxpdHlcbisgKiBkZXRlY3Rpb24uICBUaGUgaWQgaXMgb25seSB2YWxpZCB3aGlsZSB0aGUgY2dyb3VwIGV4aXN0czogY3NzIGlkcyBhcmVcbisgKiByZWN5Y2xlZCBvbmNlIHRoZSBjZ3JvdXAgaXMgcmVtb3ZlZCwgc28gbW9kZWxzIG11c3QgdHJlYXQgaXQgYXMgYVxuKyAqIHRyYW5zaWVudCBrZXkgYW5kIHJlc2V0IHN0YXRlIHdoZW4gdGhleSBvYnNlcnZlIGl0IHJldXNlZC4gIFdoZXRoZXJcbisgKiB0aGUgaW50ZXJmYWNlIG5lZWRzIGEgcmVsZWFzZShpb2NnX2lkKSBjYWxsYmFjayBmb3Igc3RhdGUgY2xlYW51cCBpc1xuKyAqIGFuIG9wZW4gcXVlc3Rpb24uXG4rICpcbisgKiBUaGUgbW9kZWwgaXMgY2FsbGVkIGZyb20gdGhlIElPIHN1Ym1pc3Npb24gcGF0aCB1bmRlciBSQ1UgYW5kIG11c3RcbisgKiBub3Qgc2xlZXAuICBPbmx5IHRoZSBiaW8tbGV2ZWwgY2hhcmdpbmcgcGF0aCBjb25zdWx0cyB0aGUgbW9kZWw7XG4rICogdGhlIHJlcXVlc3QtbGV2ZWwgc2l6aW5nIHBhdGggKGNhbGNfc2l6ZV92dGltZV9jb3N0KCkpIGtlZXBzIHVzaW5nXG4rICogdGhlIGJ1aWx0aW4gZm9ybXVsYS5cbisgKi9cbitcbisvKiBmbGFncyBmb3IgY2FsY19jb3N0KCkgKi9cbisjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVx0LyogY2FsbGVkIGZyb20gbWVyZ2UgcGF0aCAqL1xuK1xuK3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIHtcbitcdC8qXG4rXHQgKiBAb3A6XHRcdFJFUV9PUF8qIHZhbHVlICh1YXBpIGJsa19vcGYuaClcbitcdCAqIEBuYnl0ZXM6XHRJTyBzaXplIGluIGJ5dGVzXG4rXHQgKiBAc2VjdG9yOlx0c3RhcnRpbmcgc2VjdG9yXG4rXHQgKiBAY3Vyc29yOlx0aW9jZyBjdXJzb3Igc2VjdG9yLCAwIGlmIG5vbmUgKHNlcXVlbnRpYWxpdHkgaGludClcbitcdCAqIEBpb2NnX2lkOlx0Y3NzIGlkIG9mIHRoZSBpc3N1aW5nIGNncm91cFxuK1x0ICogQGZsYWdzOlx0SU9DT1NUX0NPU1RfRl8qXG4rXHQgKi9cbitcdHU2NCAoKmNhbGNfY29zdCkodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuK1x0XHRcdCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKTtcbit9O1xuK1xuK2Jvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuK1x0XHRcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cCk7XG4rYm9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZCk7XG4rXG4rI2VuZGlmXHQvKiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGICovXG4rI2VuZGlmXHQvKiBfTElOVVhfQkxLX0lPQ09TVF9IICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaFxuaW5kZXggZTc3MmIxYmM2MGQ2MC4uMmI5ZmYzNDhhNGY1MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXG4rKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaFxuQEAgLTE3OCw2ICsxNzgsNDYgQEAgVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY192cmF0ZV9hZGosXG4gXHQpXG4gKTtcbiBcbisvKlxuKyAqIFBlcmlvZGljIHBlci1kZXZpY2Ugc3VtbWFyeSwgZW1pdHRlZCBvbmNlIHBlciBwZXJpb2QgZnJvbSB0aGUgdGFpbCBvZlxuKyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5XG4rICogcGVyaW9kIHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGluY2x1ZGluZyBzdGVhZHkgc3RhdGVzLCBhbmQgY2Fycmllc1xuKyAqIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3RhdGUgc28gYmFzaWMgbW9uaXRvcmluZyBkb2Vzbid0IHJlcXVpcmUgZHJnbi5cbisgKi9cbitUUkFDRV9FVkVOVChpb2Nvc3RfaW9jX3RpY2ssXG4rXG4rXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jICppb2MsIGludCBucl9hY3RpdmUsIHU2NCB1c2FnZV91c19zdW0pLFxuK1xuK1x0VFBfQVJHUyhpb2MsIG5yX2FjdGl2ZSwgdXNhZ2VfdXNfc3VtKSxcbitcbitcdFRQX1NUUlVDVF9fZW50cnkgKFxuK1x0XHRfX3N0cmluZyhkZXZuYW1lLCBpb2NfbmFtZShpb2MpKVxuK1x0XHRfX2ZpZWxkKHUzMiwgcGVyaW9kX3VzKVxuK1x0XHRfX2ZpZWxkKHU2NCwgdnJhdGUpXG4rXHRcdF9fZmllbGQoaW50LCBidXN5X2xldmVsKVxuK1x0XHRfX2ZpZWxkKGludCwgbnJfYWN0aXZlKVxuK1x0XHRfX2ZpZWxkKHUzMiwgdXNhZ2VfcGN0KVxuK1x0XHRfX2ZpZWxkKGludCwgcnVubmluZylcbitcdCksXG4rXG4rXHRUUF9mYXN0X2Fzc2lnbihcbitcdFx0X19hc3NpZ25fc3RyKGRldm5hbWUpO1xuK1x0XHRfX2VudHJ5LVx1MDAzZXBlcmlvZF91cyA9IGlvYy1cdTAwM2VwZXJpb2RfdXM7XG4rXHRcdF9fZW50cnktXHUwMDNldnJhdGUgPSBpb2MtXHUwMDNldnRpbWVfYmFzZV9yYXRlO1xuK1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwgPSBpb2MtXHUwMDNlYnVzeV9sZXZlbDtcbitcdFx0X19lbnRyeS1cdTAwM2Vucl9hY3RpdmUgPSBucl9hY3RpdmU7XG4rXHRcdF9fZW50cnktXHUwMDNldXNhZ2VfcGN0ID0gaW9jLVx1MDAzZXBlcmlvZF91cyA/XG4rXHRcdFx0ZGl2X3U2NCh1c2FnZV91c19zdW0gKiAxMDAsIGlvYy1cdTAwM2VwZXJpb2RfdXMpIDogMDtcbitcdFx0X19lbnRyeS1cdTAwM2VydW5uaW5nID0gaW9jLVx1MDAzZXJ1bm5pbmc7XG4rXHQpLFxuK1xuK1x0VFBfcHJpbnRrKFwiWyVzXSBwZXJpb2Q9JXV1cyB2cmF0ZT0lbGx1IGJ1c3k9JWQgYWN0aXZlPSVkIHVzYWdlPSV1JSUgcnVubmluZz0lZFwiLFxuK1x0XHRfX2dldF9zdHIoZGV2bmFtZSksIF9fZW50cnktXHUwMDNlcGVyaW9kX3VzLCBfX2VudHJ5LVx1MDAzZXZyYXRlLFxuK1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwsIF9fZW50cnktXHUwMDNlbnJfYWN0aXZlLCBfX2VudHJ5LVx1MDAzZXVzYWdlX3BjdCxcbitcdFx0X19lbnRyeS1cdTAwM2VydW5uaW5nXG4rXHQpXG4rKTtcbitcbiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsXG4gXG4gXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCArMSwxNTUgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJpb2Nvc3RfbW9kZWwuc2tlbC5oXCJcbisjaW5jbHVkZSBcImlvY29zdF9tcy5za2VsLmhcIlxuK1xuKy8qXG4rICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZVxuKyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy5cbisgKiBTaGFyZWQgYnkgdGhlIGV4YW1wbGUtbW9kZWwgdGVzdHMgYmVsb3cuXG4rICovXG4rc3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldilcbit7XG4rXHRjaGFyIHBhdGhbXSA9IFwiL3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFwiO1xuK1x0Y2hhciB3b3JkWzI1Nl0sIGxpbmVbMjU2XSwgYnVmWzMwMF07XG4rXHRGSUxFICpmcDtcbitcdGludCBlcnIsIGZvdW5kID0gMDtcbitcbitcdGZwID0gZm9wZW4ocGF0aCwgXCJyK1wiKTtcbitcdGlmICghZnApIHtcbitcdFx0VEhfTE9HKFwib3BlbiAlczogJXNcIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4rXHRcdGlmIChzc2NhbmYobGluZSwgXCIlMjU1c1wiLCB3b3JkKSA9PSAxIFx1MDAyNlx1MDAyNiAhc3RyY21wKHdvcmQsIGRldikpIHtcbitcdFx0XHRmb3VuZCA9IDE7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdH1cbitcdGlmICghZm91bmQpIHtcbitcdFx0VEhfTE9HKFwiJXMgaGFzIG5vIGlvY29zdCBsaW5lXCIsIGRldik7XG4rXHRcdGZjbG9zZShmcCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXMgY3RybD1icGZcIiwgZGV2KTtcbitcdGVyciA9IGZwcmludGYoZnAsIFwiJXNcXG5cIiwgYnVmKTtcbitcdGlmIChlcnIgXHUwMDNjPSAwKSB7XG4rXHRcdFRIX0xPRyhcIndyaXRlIGN0cmw9YnBmIGZhaWxlZFwiKTtcbitcdFx0ZmNsb3NlKGZwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0ZmZsdXNoKGZwKTtcbitcbitcdHJld2luZChmcCk7XG4rXHRmb3VuZCA9IDA7XG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbitcdFx0aWYgKHNzY2FuZihsaW5lLCBcIiUyNTVzXCIsIHdvcmQpID09IDEgXHUwMDI2XHUwMDI2ICFzdHJjbXAod29yZCwgZGV2KSkge1xuK1x0XHRcdGZvdW5kID0gc3Ryc3RyKGxpbmUsIFwiY3RybD1icGZcIikgIT0gTlVMTDtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0fVxuK1x0aWYgKCFmb3VuZClcbitcdFx0VEhfTE9HKFwicmVhZGJhY2sgZG9lcyBub3Qgc2hvdyBjdHJsPWJwZlwiKTtcbitcbitcdGZwcmludGYoZnAsIFwiJXMgY3RybD1hdXRvXFxuXCIsIGRldik7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGZvdW5kID8gMCA6IC0xO1xuK31cbitcbitzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpXG4re1xuK1x0RklMRSAqZnAgPSBmb3BlbihcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QucW9zXCIsIFwiclwiKTtcbitcbitcdGlmIChmcClcbitcdFx0ZmNsb3NlKGZwKTtcbitcdHJldHVybiBmcCAhPSBOVUxMO1xuK31cbitcbisvKlxuKyAqIFJlZ2lzdGVyIHRoZSBleGFtcGxlIGNvc3QgbW9kZWwgYW5kIHN3aXRjaCBhIGRldmljZSB0byBjdHJsPWJwZi5cbisgKiBJTyBhY2NvdW50aW5nIGl0c2VsZiBpcyBub3QgY2hlY2tlZCBoZXJlOyBpdCBuZWVkcyBhIGRldmljZSBkb2luZ1xuKyAqIHJlYWwgSU8gdW5kZXIgaW9jb3N0IGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZSBrZXJuZWwtc2lkZSB2YWxpZGF0aW9uXG4rICogZGVzY3JpYmVkIGluIHRoZSBjb3ZlciBsZXR0ZXIuXG4rICpcbisgKiBSZXF1aXJlcyByb290LCBjZ3JvdXAgdjIgYW5kIGEgZGV2aWNlIHdpdGggaW9jb3N0IHN1cHBvcnQuICBUaGVcbisgKiBkZXZpY2UgbXVzdCBiZSBnaXZlbiBhcyBtYWpvcjptaW5vciBpbiAkSU9DT1NUX1RFU1RfREVWLCBvdGhlcndpc2VcbisgKiB0aGUgdGVzdCBpcyBza2lwcGVkLlxuKyAqL1xuK3ZvaWQgc2VyaWFsX3Rlc3RfaW9jb3N0X21vZGVsKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvY29zdF9tb2RlbCAqc2tlbDtcbitcdGNoYXIgd29yZFsyNTZdLCAqZGV2O1xuK1x0aW50IGVycjtcbitcbitcdGRldiA9IGdldGVudihcIklPQ09TVF9URVNUX0RFVlwiKTtcbitcdGlmICghZGV2IHx8IGdldGV1aWQoKSAhPSAwKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcImlvY29zdF9tb3VudGVkXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBuZWdhdGl2ZTogY3RybD1icGYgbXVzdCBiZSByZWplY3RlZCB3aGlsZSBubyBtb2RlbCBpc1xuK1x0ICogcmVnaXN0ZXJlZCwgc28gYSB0eXBvIGNhbm5vdCBzaWxlbnRseSBkaXNhYmxlIGNvc3QgbW9kZWxcbitcdCAqIHVwZGF0ZXMgKi9cbitcdGlmIChzc2NhbmYoZGV2LCBcIiUyNTVzXCIsIHdvcmQpICE9IDEpXG4rXHRcdHJldHVybjtcbitcdHtcbitcdFx0Y2hhciBwYXRoW10gPSBcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWxcIjtcbitcdFx0Y2hhciBidWZbMzAwXTtcbitcdFx0RklMRSAqZnAgPSBmb3BlbihwYXRoLCBcIndcIik7XG4rXG4rXHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXMgY3RybD1icGZcXG5cIiwgd29yZCk7XG4rXHRcdGVyciA9IDA7XG4rXHRcdGlmIChmcCkge1xuK1x0XHRcdGVyciA9IGZwcmludGYoZnAsIFwiJXNcIiwgYnVmKSBcdTAwM2M9IDA7XG4rXHRcdFx0ZmNsb3NlKGZwKTtcbitcdFx0fVxuK1x0XHRBU1NFUlRfVFJVRShlcnIsIFwiY3RybF9icGZfd2l0aG91dF9tb2RlbF9yZWplY3RlZFwiKTtcbitcdH1cbitcbitcdHNrZWwgPSBpb2Nvc3RfbW9kZWxfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcInNrZWxfb3Blbl9sb2FkXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBhdHRhY2hpbmcgdGhlIHN0cnVjdF9vcHMgcmVnaXN0ZXJzIHRoZSBtb2RlbDsgYSBzZWNvbmRcbitcdCAqIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc2FtZSBvcHMgd291bGQgZmFpbCB3aXRoIEVCVVNZICovXG4rXHRlcnIgPSBpb2Nvc3RfbW9kZWxfX2F0dGFjaChza2VsKTtcbitcdGlmIChBU1NFUlRfT0soZXJyLCBcImF0dGFjaFwiKSlcbitcdFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXCJzd2l0Y2hfYW5kX3JlYWRiYWNrXCIpO1xuK1xuK1x0aW9jb3N0X21vZGVsX19kZXN0cm95KHNrZWwpO1xuK31cbitcbisvKlxuKyAqIFNhbWUgY2hlY2sgZm9yIHRoZSBtdWx0aS1zdHJlYW0gZXhhbXBsZSBtb2RlbC4gIE9ubHkgb25lIG1vZGVsIGNhblxuKyAqIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lLCBzbyB0aGlzIHRlc3QgbXVzdCBydW4gc2VwYXJhdGVseSBmcm9tXG4rICogdGVzdF9pb2Nvc3RfbW9kZWw7IGJvdGggYXJlIHNlcmlhbC5cbisgKi9cbit2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbF9zdHJlYW1zKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvY29zdF9tcyAqc2tlbDtcbitcdGNoYXIgKmRldjtcbitcdGludCBlcnI7XG4rXG4rXHRkZXYgPSBnZXRlbnYoXCJJT0NPU1RfVEVTVF9ERVZcIik7XG4rXHRpZiAoIWRldiB8fCBnZXRldWlkKCkgIT0gMCkge1xuK1x0XHR0ZXN0X19za2lwKCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghQVNTRVJUX1RSVUUoZGV2X2hhc19pb2Nvc3QoKSwgXCJpb2Nvc3RfbW91bnRlZFwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbCA9IGlvY29zdF9tc19fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwic2tlbF9vcGVuX2xvYWRcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IGlvY29zdF9tc19fYXR0YWNoKHNrZWwpO1xuK1x0aWYgKEFTU0VSVF9PSyhlcnIsIFwiYXR0YWNoXCIpKVxuK1x0XHRBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCBcInN3aXRjaF9hbmRfcmVhZGJhY2tcIik7XG4rXG4rXHRpb2Nvc3RfbXNfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCArMSw5MSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbisvKlxuKyAqIEV4YW1wbGUgaW9jb3N0IGNvc3QgbW9kZWw6IHRoZSBidWlsdGluIGxpbmVhciBIREQgZm9ybXVsYSB3aXRoIGFsbFxuKyAqIGNvc3RzIGRvdWJsZWQuXG4rICpcbisgKiBUaGUgY29uc3RhbnRzIG1pcnJvciB3aGF0IGNhbGNfbGNvZWZzKCkgZGVyaXZlcyBmcm9tIHRoZSBBVVRPUF9IRERcbisgKiBkZWZhdWx0cyAocmJwcz0xNzQwMTkxNzYgcnNlcWlvcHM9NDE3MDggcnJhbmRpb3BzPTM3MCwgdy1zaWRlXG4rICogYW5hbG9nKSBpbiB2dGltZSB1bml0cyB3aGVyZSAxcyA9PSAyXjM3LCBleHByZXNzZWQgd2l0aCB0aGUgc2FtZVxuKyAqIHJvdW5kLXVwIGRpdmlzaW9ucyBzbyB0aGV5IGNhbm5vdCBkcmlmdCBmcm9tIHRoZSBrZXJuZWwsIHNvIGFcbisgKiBkZXZpY2Ugc3dpdGNoZWQgdG8gY3RybD1icGYgd2l0aCB0aGlzIG1vZGVsIHJlZ2lzdGVyZWQgY2hhcmdlc1xuKyAqIGV4YWN0bHkgdHdpY2UgdGhlIGJ1aWx0aW4gbW9kZWwgdW5kZXIgdGhlIHNhbWUgd29ya2xvYWQsIHdoaWNoXG4rICogbWFrZXMgaXQgYSBjb252ZW5pZW50IHdheSB0byB2ZXJpZnkgdGhhdCBhY2NvdW50aW5nIGdvZXMgdGhyb3VnaFxuKyAqIHRoZSBCUEYgcGF0aC5cbisgKi9cbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuK1xuKy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXG4rI2RlZmluZSBJT0NfUEFHRV9TSVpFXHRcdDQwOTZcbisjZGVmaW5lIElPQ19TRUNUX1RPX1BBR0VfU0hJRlRcdDNcdC8qIDUxMkIgc2VjdG9ycyB0byA0a0IgcGFnZXMgKi9cbisjZGVmaW5lIExDT0VGX1JBTkRJT19QQUdFU1x0NDA5Nlx0LyogMTZNQiBzZWVrIHRocmVzaG9sZCAqL1xuKyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRVx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXG4rXG4rLyogRElWNjRfVTY0X1JPVU5EX1VQIC8gRElWX1JPVU5EX1VQX1VMTCBlcXVpdmFsZW50cywgZm9sZGVkIGF0XG4rICogY29tcGlsZSB0aW1lICovXG4rI2RlZmluZSBSVSh4LCB5KVx0XHQoKHgpIC8gKHkpICsgKCgoeCkgJSAoeSkpID8gMSA6IDApKVxuK1xuKyNkZWZpbmUgUkJQU1x0MTc0MDE5MTc2VUxMXG4rI2RlZmluZSBSU0VRSU9QU1x0NDE3MDhVTExcbisjZGVmaW5lIFJSQU5ESU9QU1x0MzcwVUxMXG4rI2RlZmluZSBXQlBTXHQxNzgwNzU4NjZVTExcbisjZGVmaW5lIFdTRVFJT1BTXHQ0MjcwNVVMTFxuKyNkZWZpbmUgV1JBTkRJT1BTXHQzNzhVTExcbitcbisjZGVmaW5lIFJQQUdFXHQoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKVxuKyNkZWZpbmUgUlNFUUlPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXG4rI2RlZmluZSBSUkFORElPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlJBTkRJT1BTKSAtIFJQQUdFKVxuKyNkZWZpbmUgV1BBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4rI2RlZmluZSBXU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcbisjZGVmaW5lIFdSQU5ESU9cdChSVShWVElNRV9QRVJfU0VDLCBXUkFORElPUFMpIC0gV1BBR0UpXG4rXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB1NjQgYnVpbHRpbl9jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbitcdFx0XHRcdFx0dTY0IGN1cnNvciwgdTY0IGZsYWdzKVxuK3tcbitcdHU2NCBwYWdlcywgc2Vla19wYWdlcyA9IDAsIGJhc2UsIGNvZWZfcGFnZTtcbitcbitcdGlmICghbmJ5dGVzKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHN3aXRjaCAob3ApIHtcbitcdGNhc2UgUkVRX09QX1JFQUQ6XG4rXHRcdGJhc2UgPSBSU0VRSU87XG4rXHRcdGNvZWZfcGFnZSA9IFJQQUdFO1xuK1x0XHRicmVhaztcbitcdGNhc2UgUkVRX09QX1dSSVRFOlxuK1x0XHRiYXNlID0gV1NFUUlPO1xuK1x0XHRjb2VmX3BhZ2UgPSBXUEFHRTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjdXJzb3IpIHtcbitcdFx0c2Vla19wYWdlcyA9IHNlY3RvciBcdTAwM2UgY3Vyc29yID8gc2VjdG9yIC0gY3Vyc29yXG4rXHRcdFx0XHRcdCAgICAgOiBjdXJzb3IgLSBzZWN0b3I7XG4rXHRcdHNlZWtfcGFnZXMgXHUwMDNlXHUwMDNlPSBJT0NfU0VDVF9UT19QQUdFX1NISUZUO1xuK1x0XHRpZiAoc2Vla19wYWdlcyBcdTAwM2UgTENPRUZfUkFORElPX1BBR0VTKVxuK1x0XHRcdGJhc2UgPSAob3AgPT0gUkVRX09QX1JFQUQpID8gUlJBTkRJTyA6IFdSQU5ESU87XG4rXHR9XG4rXG4rXHRwYWdlcyA9IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSk7XG4rXHRpZiAoZmxhZ3MgXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpXG4rXHRcdGJhc2UgPSAwO1xuK1x0cmV0dXJuIGJhc2UgKyBwYWdlcyAqIGNvZWZfcGFnZTtcbit9XG4rXG4rU0VDKFwic3RydWN0X29wc1wiKVxuK3U2NCBCUEZfUFJPRyhpb2Nvc3RfMnhfY2FsY19jb3N0LCB1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4rXHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXG4re1xuK1x0cmV0dXJuIDIgKiBidWlsdGluX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGZsYWdzKTtcbit9XG4rXG4rU0VDKFwiLnN0cnVjdF9vcHNcIilcbitzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfMnggPSB7XG4rXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfMnhfY2FsY19jb3N0LFxuK307XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDY1ZmQ1ZDVjNjJlMFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jXG5AQCAtMCwwICsxLDEyMiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbisvKlxuKyAqIEV4YW1wbGUgbXVsdGktc3RyZWFtIHNlcXVlbnRpYWxpdHkgZGV0ZWN0aW9uIGNvc3QgbW9kZWwuXG4rICpcbisgKiBUaGUgYnVpbHRpbiBtb2RlbCBrZWVwcyBhIHNpbmdsZSBjdXJzb3IgcGVyIGNncm91cCwgc28gdHdvXG4rICogaW50ZXJsZWF2ZWQgc2VxdWVudGlhbCByZWFkZXJzIGluIG9uZSBjZ3JvdXAgYXJlIGFsbCBwcmljZWQgcmFuZG9tXG4rICogKG1lYXN1cmVkIDg5eCBvdmVyY2hhcmdlLCAxMi45eCB0aHJvdWdocHV0IGNvbGxhcHNlKSwgd2hpbGUgcmFuZG9tXG4rICogSU8gaW5zaWRlIGEgaG90IHdpbmRvdyBzbWFsbGVyIHRoYW4gdGhlIDE2TUIgc2VlayB0aHJlc2hvbGQgaXNcbisgKiBwcmljZWQgc2VxdWVudGlhbCAobWVhc3VyZWQgMTA3eCB1bmRlcmNoYXJnZSkuICBUaGlzIG1vZGVsIHJlcGxhY2VzXG4rICogdGhlIHNpbmdsZSBjdXJzb3Igd2l0aCBhIHBlci1jZ3JvdXAgdGFibGUgb2Ygc3RyZWFtIHNsb3RzLCBrZXllZCBieVxuKyAqIHRoZSBpb2NnX2lkIGFyZ3VtZW50OiBhbiBJTyBpcyBzZXF1ZW50aWFsIGlmZiBpdHMgc2VjdG9yIG1hdGNoZXMgdGhlXG4rICogZXhwZWN0ZWQgbmV4dCBzZWN0b3Igb2YgYW55IHRyYWNrZWQgc3RyZWFtLiAgSW50ZXJsZWF2ZWQgc3RyZWFtc1xuKyAqIGtlZXAgdGhlaXIgb3duIHNsb3RzLCBhbmQgd2luZG93ZWQgcmFuZG9tIElPIHJhcmVseSBtYXRjaGVzIGFcbisgKiBtb3ZpbmcgZXhwZWN0YXRpb24uXG4rICovXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbitcbisvKiBWVElNRV9QRVJfU0VDIGNvbWVzIGZyb20gdm1saW51eC5oIChhIEJURiBlbnVtIGNvbnN0YW50KSAqL1xuKyNkZWZpbmUgSU9DX1BBR0VfU0laRVx0XHQ0MDk2XG4rI2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFXHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcdC8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi9cbitcbisvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcbisgKiBjb21waWxlIHRpbWUgKi9cbisjZGVmaW5lIFJVKHgsIHkpXHRcdCgoeCkgLyAoeSkgKyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXG4rXG4rI2RlZmluZSBSQlBTXHQxNzQwMTkxNzZVTExcbisjZGVmaW5lIFJTRVFJT1BTXHQ0MTcwOFVMTFxuKyNkZWZpbmUgUlJBTkRJT1BTXHQzNzBVTExcbisjZGVmaW5lIFdCUFNcdDE3ODA3NTg2NlVMTFxuKyNkZWZpbmUgV1NFUUlPUFNcdDQyNzA1VUxMXG4rI2RlZmluZSBXUkFORElPUFNcdDM3OFVMTFxuK1xuKyNkZWZpbmUgUlBBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShSQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4rI2RlZmluZSBSU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSlcbisjZGVmaW5lIFJSQU5ESU9cdChSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpXG4rI2RlZmluZSBXUEFHRVx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFdCUFMsIElPQ19QQUdFX1NJWkUpKSlcbisjZGVmaW5lIFdTRVFJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKVxuKyNkZWZpbmUgV1JBTkRJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSlcbitcbisjZGVmaW5lIE5TTE9UU1x0NFxuK1xuK3N0cnVjdCBzdHJlYW1zIHtcbitcdF9fdTY0IGV4cGVjdGVkW05TTE9UU107XHQvKiBuZXh0IGV4cGVjdGVkIHNlY3RvciwgcGVyIHN0cmVhbSAqL1xuK1x0X191NjQgc3RhbXBbTlNMT1RTXTtcdC8qIExSVSBzdGFtcCwgMCA9IGVtcHR5ICovXG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbitcdF9fdHlwZShrZXksIF9fdTY0KTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHN0cmVhbXMpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4rfSBzdHJlYW1fdGFiIFNFQyhcIi5tYXBzXCIpO1xuK1xuK1NFQyhcInN0cnVjdF9vcHNcIilcbit1NjQgQlBGX1BST0coaW9jb3N0X21zX2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxuK1x0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxuK3tcbitcdHN0cnVjdCBzdHJlYW1zICpzO1xuK1x0dTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdztcbitcdHUzMiBpLCB2aWN0aW0gPSAwLCBmb3VuZCA9IDB4RkZGRkZGRkY7XG4rXG4rXHRpZiAob3AgIT0gUkVRX09QX1JFQUQgXHUwMDI2XHUwMDI2IG9wICE9IFJFUV9PUF9XUklURSlcbitcdFx0cmV0dXJuIDA7XHQvKiBkZWxlZ2F0ZSB0aGUgcmVzdCB0byBidWlsdGluICovXG4rXHRpZiAoIW5ieXRlcylcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRpZiAob3AgPT0gUkVRX09QX1JFQUQpIHtcbitcdFx0cGFnZSA9IFJQQUdFOyBzZXFpbyA9IFJTRVFJTzsgcmFuZGlvID0gUlJBTkRJTztcbitcdH0gZWxzZSB7XG4rXHRcdHBhZ2UgPSBXUEFHRTsgc2VxaW8gPSBXU0VRSU87IHJhbmRpbyA9IFdSQU5ESU87XG4rXHR9XG4rXHRhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpO1x0Lyogc2VjdG9ycyAqL1xuK1xuK1x0cyA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2c3RyZWFtX3RhYiwgXHUwMDI2aW9jZ19pZCk7XG4rXHRpZiAoIXMpIHtcbitcdFx0c3RydWN0IHN0cmVhbXMgemVybyA9IHt9O1xuK1xuK1x0XHRicGZfbWFwX3VwZGF0ZV9lbGVtKFx1MDAyNnN0cmVhbV90YWIsIFx1MDAyNmlvY2dfaWQsIFx1MDAyNnplcm8sXG4rXHRcdFx0XHQgICAgQlBGX05PRVhJU1QpO1xuK1x0XHRzID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZzdHJlYW1fdGFiLCBcdTAwMjZpb2NnX2lkKTtcbitcdFx0aWYgKCFzKVxuK1x0XHRcdHJldHVybiBzZXFpbyArIFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlO1xuK1x0fVxuK1xuK1x0aWYgKGZsYWdzIFx1MDAyNiBJT0NPU1RfQ09TVF9GX01FUkdFKSB7XG4rXHRcdGJhc2UgPSAwO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5vdyA9IGJwZl9rdGltZV9nZXRfbnMoKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5TTE9UUzsgaSsrKSB7XG4rXHRcdGlmIChzLVx1MDAzZWV4cGVjdGVkW2ldID09IHNlY3RvciBcdTAwMjZcdTAwMjYgcy1cdTAwM2VzdGFtcFtpXSkge1xuK1x0XHRcdGZvdW5kID0gaTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0fVxuK1x0aWYgKGZvdW5kICE9IDB4RkZGRkZGRkYpIHtcbitcdFx0YmFzZSA9IHNlcWlvO1xuK1x0XHRzLVx1MDAzZWV4cGVjdGVkW2ZvdW5kXSA9IHNlY3RvciArIGFkdmFuY2U7XG4rXHRcdHMtXHUwMDNlc3RhbXBbZm91bmRdID0gbm93O1xuK1x0fSBlbHNlIHtcbitcdFx0YmFzZSA9IHJhbmRpbztcbitcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgTlNMT1RTOyBpKyspIHtcbitcdFx0XHRpZiAocy1cdTAwM2VzdGFtcFtpXSBcdTAwM2Mgcy1cdTAwM2VzdGFtcFt2aWN0aW1dKVxuK1x0XHRcdFx0dmljdGltID0gaTtcbitcdFx0fVxuK1x0XHRzLVx1MDAzZWV4cGVjdGVkW3ZpY3RpbV0gPSBzZWN0b3IgKyBhZHZhbmNlO1xuK1x0XHRzLVx1MDAzZXN0YW1wW3ZpY3RpbV0gPSBub3c7XG4rXHR9XG4rb3V0OlxuK1x0cmV0dXJuIGJhc2UgKyBSVShuYnl0ZXMsIElPQ19QQUdFX1NJWkUpICogcGFnZTtcbit9XG4rXG4rU0VDKFwiLnN0cnVjdF9vcHNcIilcbitzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfbXMgPSB7XG4rXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LFxuK307XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNTo0NC4zNjQ0Nzc2MjhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3NjA5NjUxOTc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIEJQRi1CYXNlZCBJL08gQ29zdCBNb2RlbCBQYXRjaCBTZXJpZXMqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBzZXJpZXMuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBicmVhayBkb3duIHRoZSBjaGFuZ2VzIG1ldGhvZGljYWxseS4gRmlyc3QsIEkgbmVlZCBhIGNsZWFyIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdCdzIGJlaW5nIGludHJvZHVjZWQgYW5kIG1vZGlmaWVkLiBCYXNlZCBvbiB0aGUgcGF0Y2ggc3VtbWFyeSwgaXQgbG9va3MgbGlrZSB0aGlzIGlzIGEgZm9jdXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIEJQRi1iYXNlZCBJL08gY29zdCBtb2RlbCB3aXRoaW4gdGhlIGJsb2NrIGxheWVyLCB3aGljaCBpcyBzb21ldGhpbmcgSSdtIHZlcnkgaW50ZXJlc3RlZCBpbi5cblxuU3BlY2lmaWNhbGx5LCBpdCBsb29rcyBsaWtlOlxuXG4xLiAgQSBuZXcgS2NvbmZpZyBvcHRpb24sIGBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGYCwgaXMgYmVpbmcgYWRkZWQgdG8gZW5hYmxlIHRoZSBmZWF0dXJlLiBHb29kLCBmaW5lLWdyYWluZWQgY29udHJvbCBpcyBhbHdheXMgYXBwcmVjaWF0ZWQuXG4yLiAgV2UgaGF2ZSBgYmxvY2svYmxrLWlvY29zdC1icGYuY2AsIHdoaWNoIGltcGxpZXMgdGhlIGNvcmUgQlBGIGludGVncmF0aW9uLiBUaGF0IGZpbGUgcmVnaXN0ZXJzIGBpb2Nvc3RfbW9kZWxfb3BzYCBhcyBhIEJQRiBgc3RydWN0X29wc2AuIE1ha2VzIHNlbnNlLiBUaGlzIGlzIGhvdyB0aGUgQlBGIGNvZGUgd2lsbCBob29rIGludG8gdGhlIEkvTyBjb3N0IGNhbGN1bGF0aW9uLlxuMy4gIFRoZSBjaGFuZ2VzIGluIGBibG9jay9ibGstaW9jb3N0LmNgIGFyZSB3aGVyZSB0aGUgcnViYmVyIG1lZXRzIHRoZSByb2FkLiBgY2FsY192dGltZV9jb3N0YCBpcyBub3cgdXNpbmcgYGlvY29zdF9icGZfY2FsY19jb3N0YC4gSSdsbCBuZWVkIHRvIHNlZSBob3cgdGhhdCBmdW5jdGlvbiB3b3JrcyBhbmQgaW50ZXJhY3RzIHdpdGggdGhlIEJQRiBwcm9ncmFtLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBpb2NfY29zdF9tb2RlbF9wcmZpbGxgIGFuZCBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgIHRvIGhhbmRsZSBgY3RybD1icGZgIGlzIGNydWNpYWwgZm9yIGNvbmZpZ3VyaW5nIHRoZSBCUEYtYmFzZWQgbW9kZWwgdmlhIGNncm91cHMuIFBsdXMsIGEgbmV3IHRyYWNlcG9pbnQsIGB0cmFjZV9pb2Nvc3RfaW9jX3RpY2tgLCBpcyBhZGRlZCB0byBgaW9jX3RpbWVyX2ZuYC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGRlYnVnZ2luZyBhbmQgdHJhY2luZy5cbjQuICBBZGRpbmcgYSBoZWFkZXIgZmlsZSBgaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmhgIG1ha2VzIHNlbnNlLCBhcyBhIHJlcG9zaXRvcnkgZm9yIGFueSBuZXcgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMuXG41LiAgQSBuZXcgdHJhY2UgZXZlbnQgZGVmaW5pdGlvbiBpbiBgaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhgLCBpcyBhIHZlcnkgcG9zaXRpdmUgYWRkaXRpb24uIFRyYWNlcG9pbnRzIGFyZSBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMgYW5kIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBCUEYgbG9naWMgaXMgYmVoYXZpbmcuXG42LiAgVGhlIGluY2x1c2lvbiBvZiBzZWxmdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8uLi5gIGlzIGV4Y2VsbGVudCEgQ29tcHJlaGVuc2l2ZSB0ZXN0aW5nIGlzIG5vbi1uZWdvdGlhYmxlIGZvciBzb21ldGhpbmcgbGlrZSB0aGlzLlxuXG5OZXh0LCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgaXMgYWN0dWFsbHkgKnVzYWJsZSogaW4gdHlwaWNhbCBlbnZpcm9ubWVudHMuIFJlYWNoaW5nIFFFTVUvS1ZNIFZNcywgYXMgd2VsbCBhcyBhIHZhcmlldHkgb2YgY29udGFpbmVyIHN5c3RlbXMsIGlzIGtleS4gVGhhbmtmdWxseSwgdGhlIHRleHQgY29uZmlybXMgdGhhdCB0aGlzIGludGVncmF0ZXMgd2l0aCB0aGUgc3RhbmRhcmQgY2dyb3VwL2Jsb2NrIGxheWVyLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBjZ3JvdXBzIHYyIChgaW8uY29zdC5tb2RlbGApLiBUaGUgdXNlIG9mIEJQRiBzdHJ1Y3Rfb3BzIChgQlBGX01BUF9DUkVBVEVgLCBgQlBGX0xJTktfQ1JFQVRFYCkgaXMgYWxzbyBwcm9taXNpbmcsIHdoaWNoIG1lYW5zIHRoaXMgY291bGQgYmUgYWNjZXNzaWJsZSBpbiBhIHdpZGUgdmFyaWV0eSBvZiBjaXJjdW1zdGFuY2VzLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ2xsIG5lZWQgdG8gdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBjYXJlZnVsbHkgZXhhbWluZSB0aGUgY29kZSwgdW5kZXJzdGFuZCB0aGUgbmV3IHN5bWJvbHMsIGFuZCBmaWd1cmUgb3V0IHRoZSBleGFjdCBLY29uZmlnIGRlcGVuZGVuY2llcy4gSSdtIGtlZW4gdG8gc2VlIHRoZSBkZXRhaWxzIG9mIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBCUEYgcHJvZ3JhbXMuIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiB0aGUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIGFuZCB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcG90ZW50aWFsIGdvdGNoYXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBkYXRhIHN0cnVjdHVyZXMgYW5kIGhvdyB0aGlzIGFmZmVjdHMgdGhlIG92ZXJhbGwgSS9PIHBhdGguXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDMxLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzU6NTEuOTc0MTMyMTcyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MDM5OTk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJMS19DR1JPVVBfSU9DT1NUXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImJsb2NrL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYmxvY2svS2NvbmZpZz0xNDU9Y29uZmlnIEJMS19DR1JPVVBfRkNfQVBQSURcXG4tLVxcbmJsb2NrL0tjb25maWctMTUzLVxcbmJsb2NrL0tjb25maWc6MTU0OmNvbmZpZyBCTEtfQ0dST1VQX0lPQ09TVFxcbmJsb2NrL0tjb25maWctMTU1LVxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXFxcIlxcbi0tXFxuYmxvY2svS2NvbmZpZz0yMzI9c291cmNlIFxcXCJibG9jay9LY29uZmlnLmlvc2NoZWRcXFwiXFxuYmxvY2svS2NvbmZpZy0yMzMtXFxuYmxvY2svS2NvbmZpZzoyMzQ6Y29uZmlnIEJMS19DR1JPVVBfSU9DT1NUX0JQRlxcbmJsb2NrL0tjb25maWctMjM1LVxcdGJvb2wgXFxcIkVuYWJsZSBCUEYgcGx1Z2dhYmxlIGNvc3QgbW9kZWwgc3VwcG9ydCBmb3IgdGhlIGNvc3QgSU8gY29udHJvbGxlclxcXCJcXG5ibG9jay9LY29uZmlnOjIzNjpcXHRkZXBlbmRzIG9uIEJMS19DR1JPVVBfSU9DT1NUIFxcdTAwMjZcXHUwMDI2IEJQRl9TWVNDQUxMIFxcdTAwMjZcXHUwMDI2IEJQRl9KSVRcXG5ibG9jay9LY29uZmlnLTIzNy1cXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDExOjM1OjUyLjAxOTE3NjY4MVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMwNzMxMTY3MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIEkvTyBDb3N0IGFuZCBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBzbyB3ZSdyZSBsb29raW5nIGF0IGBCTEtfQ0dST1VQX0lPQ09TVGAsIGFuZCBteSBpbW1lZGlhdGUgdGhvdWdodCBpcywgbGV0J3Mgbm90IGp1c3QgaXNvbGF0ZSB0aGUgZmVhdHVyZSBpdHNlbGYuIFdlIG5lZWQgdG8gZG8gYSBmdWxsIGRlcGVuZGVuY3kgYXVkaXQgb24gdGhpcy4gSSdtIGFscmVhZHkgbWVudGFsbHkgcnVubmluZyB0aHJvdWdoIHRoZSBrZXJuZWwgaW5mcmFzdHJ1Y3R1cmUg4oCTIHdoYXQgb3RoZXIgY29tcG9uZW50cywgbW9kdWxlcywgb3Igc3Vic3lzdGVtcyBtaWdodCBiZSBpbmRpcmVjdGx5IGFmZmVjdGVkLCBvciBkZXBlbmQgb24gdGhlIGNvcnJlY3Qgb3BlcmF0aW9uIG9mIGBCTEtfQ0dST1VQX0lPQ09TVGA/IFRoaW5raW5nIGFib3V0IHRoaXMsIEkgbmVlZCB0byBjb25zaWRlciB0aGluZ3MgbGlrZSBibG9jayBsYXllciBhY2NvdW50aW5nLCBjZ3JvdXAgaW50ZWdyYXRpb25zLCBhbmQgYW55IHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aCBzY2hlZHVsZXIgaW1wbGVtZW50YXRpb25zLiBJJ20gZ29pbmcgdG8gc3RhcnQgYnkgcnVubmluZyB0aHJvdWdoIHRoZSBpbmNsdWRlIGZpbGVzIGFuZCByZWZlcmVuY2VzIHRvIG1ha2Ugc3VyZSBJIGdldCB0aGUgd2hvbGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ4MTUsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNTo1NS4wOTIyOTUxNTRaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MzE5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJibG9jay9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE1MDpcXHRcXHQgIGNncm91cCBhcHBsaWNhdGlvbnMuIEl0IGVuYWJsZXMgdGhlIEZhYnJpYyBhbmQgdGhlIHN0b3JhZ2UgdGFyZ2V0cyB0b1xcbiAxNTE6XFx0XFx0ICBpZGVudGlmeSwgbW9uaXRvciwgYW5kIGhhbmRsZSBGQyB0cmFmZmljIGJhc2VkIG9uIFZNIHRhZ3MgYnkgaW5zZXJ0aW5nXFxuIDE1MjpcXHRcXHQgIGFwcGxpY2F0aW9uIHNwZWNpZmljIGlkZW50aWZpY2F0aW9uIGludG8gdGhlIEZDIGZyYW1lLlxcbiAxNTM6XFx0XFxuIDE1NDpcXHRjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RcXG4gMTU1OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXFxcIlxcbiAxNTY6XFx0XFx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQXFxuIDE1NzpcXHRcXHRzZWxlY3QgQkxLX1JRX0FMTE9DX1RJTUVcXG4gMTU4OlxcdFxcdGhlbHBcXG4gMTU5OlxcdFxcdEVuYWJsaW5nIHRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIC53ZWlnaHQgaW50ZXJmYWNlIGZvciBjb3N0XFxuIDE2MDpcXHRcXHRtb2RlbCBiYXNlZCBwcm9wb3J0aW9uYWwgSU8gY29udHJvbC4gIFRoZSBJTyBjb250cm9sbGVyXFxuIDE2MTpcXHRcXHRkaXN0cmlidXRlcyBJTyBjYXBhY2l0eSBiZXR3ZWVuIGRpZmZlcmVudCBncm91cHMgYmFzZWQgb25cXG4gMTYyOlxcdFxcdHRoZWlyIHNoYXJlIG9mIHRoZSBvdmVyYWxsIHdlaWdodCBkaXN0cmlidXRpb24uXFxuIDE2MzpcXHRcXG4gMTY0OlxcdGNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xcbiAxNjU6XFx0XFx0Ym9vbCBcXFwiQ2dyb3VwIEkvTyBjb250cm9sbGVyIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzXFxcIlxcbiAxNjY6XFx0XFx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQXFxuIDE2NzpcXHRcXHRoZWxwXFxuIDE2ODpcXHRcXHRFbmFibGUgdGhlIC5wcmlvIGludGVyZmFjZSBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzcyB0b1xcbiAxNjk6XFx0XFx0cmVxdWVzdHMuIFRoZSBJL08gcHJpb3JpdHkgY2xhc3MgYWZmZWN0cyB0aGUgb3JkZXIgaW4gd2hpY2ggYW4gSS9PXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDExOjM1OjU1LjA5MjM2MDQxNFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwNTYwNTcwODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBCUEYgSS9PIENvc3QgQW5hbHlzaXMgQ29kZSoqXG5cbk9rYXksIHRpbWUgdG8gZGlnIGludG8gdGhlIGRldGFpbHMuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgYGJsay1pb2Nvc3QtYnBmLmNgIGNvZGUuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBnb2luZyB0byBiZSBmdW5jdGlvbnMgYW5kIHN5bWJvbHMgZGVmaW5lZCB3aXRoaW4gdGhhdCBmaWxlLiBJJ20gdGhpbmtpbmcgSSdsbCBzdGFydCBieSBsaXN0aW5nIG91dCB0aGUgZnVuY3Rpb25zIHRvIGdldCBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgb2YgaG93IHRoZSBjb2RlIGlzIHN0cnVjdHVyZWQsIGFuZCB0aGVuIGRyaWxsIGRvd24gaW50byBhbnkgaW50ZXJlc3Rpbmcgc3ltYm9scywgcGFydGljdWxhcmx5IHRob3NlIHJlbGF0ZWQgdG8gdGhlIGNvc3QgYWNjb3VudGluZyBvciBhbnkgQlBGIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBhcmUgYmVpbmcgbGV2ZXJhZ2VkLiBVbmRlcnN0YW5kaW5nIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgQlBGIHByb2dyYW0gYW5kIHRoZSBicm9hZGVyIGtlcm5lbCBmcmFtZXdvcmsgaXMga2V5IHRvIHRoaXMgYW5hbHlzaXMuIEkgd2FudCB0byBzZWUgaG93IHRoZXkndmUgaW5zdHJ1bWVudGVkIHRoZSBibG9jayBsYXllciBhbmQgd2hpY2ggZXZlbnRzIHRoZXkncmUgdHJhY2tpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MzY5LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNTo1Ny4xNDg0MjA1MDNaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MDY1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJibG9jay9ibGstaW9jb3N0LWJwZi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuICAgMjpcXHQvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xcbiAgIDM6XFx0XFxuICAgNDpcXHQvKlxcbiAgIDU6XFx0ICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy5cXG4gICA2OlxcdCAqXFxuICAgNzpcXHQgKiBSZWdpc3RlcnMgdGhlIFxcXCJpb2Nvc3RfbW9kZWxfb3BzXFxcIiBzdHJ1Y3Rfb3BzIHR5cGUuICBBdCBtb3N0IG9uZSBtb2RlbFxcbiAgIDg6XFx0ICogY2FuIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lOyBkZXZpY2VzIG9wdCBpbiBwZXItcXVldWUgd2l0aFxcbiAgIDk6XFx0ICogXFxcImVjaG8gJERFViBjdHJsPWJwZiBcXHUwMDNlIGlvLmNvc3QubW9kZWxcXFwiLiAgRGV2aWNlcyB3aXRob3V0IGEgcmVnaXN0ZXJlZFxcbiAgMTA6XFx0ICogbW9kZWwga2VlcCB1c2luZyB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwuXFxuICAxMTpcXHQgKi9cXG4gIDEyOlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuICAxMzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuICAxNDpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuICAxNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuICAxNjpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmX3ZlcmlmaWVyLmhcXHUwMDNlXFxuICAxNzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmLmhcXHUwMDNlXFxuICAxODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXFx1MDAzZVxcbiAgMTk6XFx0XFxuICAyMDpcXHQvKiAxcyBvZiBkZXZpY2UgdGltZTsgdXBwZXIgYm91bmQgb24gYSBzaW5nbGUgSU8ncyBjaGFyZ2VhYmxlIGNvc3QgKi9cXG4gIDIxOlxcdCNkZWZpbmUgSU9DT1NUX0JQRl9NQVhfQ09TVFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDM3KVxcbiAgMjI6XFx0XFxuICAyMzpcXHRzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzO1xcbiAgMjQ6XFx0XFxuICAyNTpcXHRzdGF0aWMgREVGSU5FX01VVEVYKGlvY29zdF9icGZfcmVnX2xvY2spO1xcbiAgMjY6XFx0c3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fcmN1ICppb2Nvc3RfYnBmX21vZGVsO1xcbiAgMjc6XFx0c3RhdGljIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGlvY29zdF9icGZfa2V5KTtcXG4gIDI4OlxcdFxcbiAgMjk6XFx0Ym9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZClcXG4gIDMwOlxcdHtcXG4gIDMxOlxcdFxcdHJldHVybiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFxcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XFxuICAzMjpcXHR9XFxuICAzMzpcXHRcXG4gIDM0OlxcdGJvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxcbiAgMzU6XFx0XFx0XFx0XFx0ICB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzLCB1NjQgKmNvc3RwKVxcbiAgMzY6XFx0e1xcbiAgMzc6XFx0XFx0Y29uc3Qgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm9wcztcXG4gIDM4OlxcdFxcdHU2NCBjb3N0O1xcbiAgMzk6XFx0XFxuICA0MDpcXHRcXHRpZiAoIXN0YXRpY19icmFuY2hfdW5saWtlbHkoXFx1MDAyNmlvY29zdF9icGZfa2V5KSlcXG4gIDQxOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gIDQyOlxcdFxcbiAgNDM6XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiAgNDQ6XFx0XFx0b3BzID0gcmN1X2RlcmVmZXJlbmNlKGlvY29zdF9icGZfbW9kZWwpO1xcbiAgNDU6XFx0XFx0aWYgKCFvcHMpIHtcXG4gIDQ2OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiAgNDc6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAgNDg6XFx0XFx0fVxcbiAgNDk6XFx0XFx0Y29zdCA9IG9wcy1cXHUwMDNlY2FsY19jb3N0KG9wLCBuYnl0ZXMsIHNlY3RvciwgY3Vyc29yLCBpb2NnX2lkLCBmbGFncyk7XFxuICA1MDpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gIDUxOlxcdFxcbiAgNTI6XFx0XFx0aWYgKCFjb3N0KVxcbiAgNTM6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAgNTQ6XFx0XFxuICA1NTpcXHRcXHQqY29zdHAgPSBtaW4oY29zdCwgSU9DT1NUX0JQRl9NQVhfQ09TVCk7XFxuICA1NjpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gIDU3OlxcdH1cXG4gIDU4OlxcdFxcbiAgNTk6XFx0c3RhdGljIGludCBicGZfaW9jb3N0X21vZGVsX2luaXQoc3RydWN0IGJ0ZiAqYnRmKVxcbiAgNjA6XFx0e1xcbiAgNjE6XFx0XFx0czMyIHR5cGVfaWQ7XFxuICA2MjpcXHRcXG4gIDYzOlxcdFxcdHR5cGVfaWQgPSBidGZfZmluZF9ieV9uYW1lX2tpbmQoYnRmLCBcXFwiaW9jb3N0X21vZGVsX29wc1xcXCIsIEJURl9LSU5EX1NUUlVDVCk7XFxuICA2NDpcXHRcXHRpZiAodHlwZV9pZCBcXHUwMDNjIDApXFxuICA2NTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gIDY2OlxcdFxcdHJldHVybiAwO1xcbiAgNjc6XFx0fVxcbiAgNjg6XFx0XFxuICA2OTpcXHRzdGF0aWMgaW50IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIoY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbiAgNzA6XFx0XFx0XFx0XFx0XFx0ICBjb25zdCBzdHJ1Y3QgYnRmX21lbWJlciAqbWVtYmVyLFxcbiAgNzE6XFx0XFx0XFx0XFx0XFx0ICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpXFxuICA3MjpcXHR7XFxuICA3MzpcXHRcXHRyZXR1cm4gMDtcXG4gIDc0OlxcdH1cXG4gIDc1OlxcdFxcbiAgNzY6XFx0c3RhdGljIGJvb2wgYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsXFxuICA3NzpcXHRcXHRcXHRcXHRcXHQgICAgICAgZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSxcXG4gIDc4OlxcdFxcdFxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csXFxuICA3OTpcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IGJwZl9pbnNuX2FjY2Vzc19hdXggKmluZm8pXFxuICA4MDpcXHR7XFxuICA4MTpcXHRcXHRyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTtcXG4gIDgyOlxcdH1cXG4gIDgzOlxcdFxcbiAgODQ6XFx0c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqXFxuICA4NTpcXHRicGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCxcXG4gIDg2OlxcdFxcdFxcdFxcdCAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nKVxcbiAgODc6XFx0e1xcbiAgODg6XFx0XFx0cmV0dXJuIGJwZl9iYXNlX2Z1bmNfcHJvdG8oZnVuY19pZCwgcHJvZyk7XFxuICA4OTpcXHR9XFxuICA5MDpcXHRcXG4gIDkxOlxcdHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX29wcyBicGZfaW9jb3N0X3ZlcmlmaWVyX29wcyA9IHtcXG4gIDkyOlxcdFxcdC5nZXRfZnVuY19wcm90byA9IGJwZl9pb2Nvc3RfZ2V0X2Z1bmNfcHJvdG8sXFxuICA5MzpcXHRcXHQuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsXFxuICA5NDpcXHR9O1xcbiAgOTU6XFx0XFxuICA5NjpcXHRzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXFxuICA5NzpcXHR7XFxuICA5ODpcXHRcXHRzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhO1xcbiAgOTk6XFx0XFxuIDEwMDpcXHRcXHRpZiAoIW5ld19vcHMtXFx1MDAzZWNhbGNfY29zdClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzU6NTcuMTQ4NTEzMzAzWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDIzMjM1ODcwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byBgYmxrLWlvY29zdC1icGYuY2AqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGFscmVhZHkgZXhhbWluZWQgc29tZSBrZXkgYXJlYXMgb2YgdGhpcyBCUEYgcHJvZ3JhbSwgYW5kIG5vdyBJIG5lZWQgdG8gc3lzdGVtYXRpY2FsbHkgZXhwbG9yZSB0aGUgcmVtYWluZGVyIG9mIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYC4gSSBoYXZlIGEgZ29vZCBncmFzcCBvZiB0aGUgZm91bmRhdGlvbmFsIGNvbmNlcHRzLCBidXQgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJ20gbm90IG1pc3NpbmcgYW55IHN1YnRsZSBpbnRlcmFjdGlvbnMgb3IgbGVzcyBvYnZpb3VzIG9wdGltaXphdGlvbnMuIFdoYXQgYXJlIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBkb2luZyBpbiB0ZXJtcyBvZiB0cmFjaW5nIGkvbyBjb3N0cywgc2V0dGluZyB1cCBtYXBzLCBvciBoYW5kbGluZyBzcGVjaWZpYyBlZGdlIGNhc2VzPyBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IHRoZXkndmUgaGFuZGxlZCBwb3RlbnRpYWwgY29udGVudGlvbiwgcmVzb3VyY2UgbGltaXRzLCBhbmQgZXJyb3IgaGFuZGxpbmcgd2l0aGluIHRoaXMgQlBGIGNvbnRleHQuIExldCdzIHNlZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgYnVpbGRzIHVwb24gd2hhdCBJJ3ZlIGFscmVhZHkgc2NydXRpbml6ZWQuIEkgbmVlZCB0byBlbnN1cmUgYSBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nIHRvIG1ha2UgYW55IGFzc2Vzc21lbnRzIGFib3V0IHBlcmZvcm1hbmNlLCBlZmZpY2llbmN5LCBvciBwb3RlbnRpYWwgaW1wcm92ZW1lbnRzLiBUaW1lIHRvIGRpZyBpbiFcblxuXG4iLCJJbnB1dFRva2VucyI6MTcxMDAsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDExOjM2OjAxLjM4MDg3NDk1OFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MDIwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJibG9jay9ibGstaW9jb3N0LWJwZi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwMCxcbiAgXCJMaW5lQ291bnRcIjogNTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDEwMDpcXHRcXHRpZiAoIW5ld19vcHMtXFx1MDAzZWNhbGNfY29zdClcXG4gMTAxOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMDI6XFx0XFxuIDEwMzpcXHRcXHRpbnQgcmV0ID0gMDtcXG4gMTA0OlxcdFxcbiAxMDU6XFx0XFx0LyogdGhlIGNhbGxlciBvbmx5IGhvbGRzIHRoZSBwZXItbWFwIGxvY2ssIHNvIHNlcmlhbGl6ZSBoZXJlICovXFxuIDEwNjpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcXG4gMTA3OlxcdFxcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkpXFxuIDEwODpcXHRcXHRcXHRyZXQgPSAtRUJVU1k7XFxuIDEwOTpcXHRcXHRlbHNlIHtcXG4gMTEwOlxcdFxcdFxcdHN0YXRpY19icmFuY2hfaW5jKFxcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XFxuIDExMTpcXHRcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgbmV3X29wcyk7XFxuIDExMjpcXHRcXHR9XFxuIDExMzpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xcbiAxMTQ6XFx0XFx0cmV0dXJuIHJldDtcXG4gMTE1OlxcdH1cXG4gMTE2OlxcdFxcbiAxMTc6XFx0c3RhdGljIHZvaWQgYnBmX2lvY29zdF91bnJlZyh2b2lkICprZGF0YSwgc3RydWN0IGJwZl9saW5rICpsaW5rKVxcbiAxMTg6XFx0e1xcbiAxMTk6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2aW9jb3N0X2JwZl9yZWdfbG9jayk7XFxuIDEyMDpcXHRcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpID09IGtkYXRhKSB7XFxuIDEyMTpcXHRcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7XFxuIDEyMjpcXHRcXHRcXHRzdGF0aWNfYnJhbmNoX2RlYyhcXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xcbiAxMjM6XFx0XFx0fVxcbiAxMjQ6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcXG4gMTI1OlxcdH1cXG4gMTI2OlxcdFxcbiAxMjc6XFx0c3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcXG4gMTI4OlxcdFxcdFxcdFxcdFxcdCAgICAgdTY0IGN1cnNvciwgdTY0IGlvY2dfaWQsIHU2NCBmbGFncylcXG4gMTI5OlxcdHtcXG4gMTMwOlxcdFxcdHJldHVybiAwO1xcbiAxMzE6XFx0fVxcbiAxMzI6XFx0XFxuIDEzMzpcXHRzdGF0aWMgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgX19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMgPSB7XFxuIDEzNDpcXHRcXHQuY2FsY19jb3N0ID0gYnBmX2lvY29zdF9jYWxjX2Nvc3Rfc3R1YixcXG4gMTM1OlxcdH07XFxuIDEzNjpcXHRcXG4gMTM3OlxcdHN0YXRpYyBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHMgYnBmX2lvY29zdF9tb2RlbF9vcHMgPSB7XFxuIDEzODpcXHRcXHQudmVyaWZpZXJfb3BzID0gXFx1MDAyNmJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzLFxcbiAxMzk6XFx0XFx0LmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsXFxuIDE0MDpcXHRcXHQuaW5pdF9tZW1iZXIgPSBicGZfaW9jb3N0X2luaXRfbWVtYmVyLFxcbiAxNDE6XFx0XFx0LnJlZyA9IGJwZl9pb2Nvc3RfcmVnLFxcbiAxNDI6XFx0XFx0LnVucmVnID0gYnBmX2lvY29zdF91bnJlZyxcXG4gMTQzOlxcdFxcdC5uYW1lID0gXFxcImlvY29zdF9tb2RlbF9vcHNcXFwiLFxcbiAxNDQ6XFx0XFx0LmNmaV9zdHVicyA9IFxcdTAwMjZfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyxcXG4gMTQ1OlxcdFxcdC5vd25lciA9IFRISVNfTU9EVUxFLFxcbiAxNDY6XFx0fTtcXG4gMTQ3OlxcdFxcbiAxNDg6XFx0c3RhdGljIGludCBfX2luaXQgYnBmX2lvY29zdF9pbml0KHZvaWQpXFxuIDE0OTpcXHR7XFxuIDE1MDpcXHRcXHRyZXR1cm4gcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoXFx1MDAyNmJwZl9pb2Nvc3RfbW9kZWxfb3BzLCBpb2Nvc3RfbW9kZWxfb3BzKTtcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdGxhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MDEuMzgwOTU4NDY4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjcyOTM0NDAyOTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb246IEJsb2NrIElPIENvc3Qgd2l0aCBCUEYgU3VwcG9ydCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZm9jdXMgaGVyZSBpcyB0byBkZWZpbmUgYSBnb29kIGZ1enppbmcgdGFyZ2V0IHJlbGF0ZWQgdG8gdGhlIGJsb2NrIEkvTyBjb3N0IGNvbnRyb2xsZXIsIHNwZWNpZmljYWxseSB0aGUgQlBGLWJhc2VkIGltcGxlbWVudGF0aW9uLiBJJ3ZlIHBpbnBvaW50ZWQgYSBmZXcgYXJlYXMgaW4gYGJsb2NrL2Jsay1pb2Nvc3QuY2AgKGxpbmVzIH4yNTgwLCB+MzQ2NSwgYW5kIH4zNTEyKSBhbmQgdGhlIG5ldyBgYmxrLWlvY29zdC1icGYuY2AgdGhhdCBsb29rIHByb21pc2luZy4gU3BlY2lmaWNhbGx5LCBJJ20gaW50ZXJlc3RlZCBpbiBgY2FsY192dGltZV9jb3N0YCwgYGlvY19jb3N0X21vZGVsX3ByZmlsbGAsIGBpb2NfY29zdF9tb2RlbF93cml0ZWAgKGluIGBibGstaW9jb3N0LmNgKSwgYW5kIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAsIGBicGZfaW9jb3N0X3JlZ2AsIGBicGZfaW9jb3N0X3VucmVnYCAoaW4gYGJsay1pb2Nvc3QtYnBmLmNgKS4gQWxzbyB0aGUgYGlvY190aW1lcl9mbmAuXG5cblRoZSBrZXkgaGVyZSBpcyB3aGV0aGVyIHRoaXMgY29kZSBtb2RpZmljYXRpb24gbWVyaXRzIGZ1enppbmcuIEl0IGRvZXMhICBJJ3ZlIGFzc2Vzc2VkIHRoYXQgaXQgaW1wYWN0cyB0aGUgYmxvY2sgbGF5ZXIsIGNncm91cHMsIGFuZCBCUEYgYHN0cnVjdF9vcHNgLCBpcyByZWFjaGFibGUgaW4gYSBzdGFuZGFyZCBRRU1VIGVudmlyb25tZW50LCBhbmQgaGFzIGNoYW5nZXMgdG8gYGJsay1pb2Nvc3QuY2AgYW5kIGBibGstaW9jb3N0LWJwZi5jYC4gU28sIGl0J3Mgd29ydGggdGhlIGVmZm9ydC5cblxuTm93LCB0byBuYXJyb3cgZG93biB0aGUgZm9jdXMuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgbW9zdCBzcGVjaWZpYywgbm9uLXViaXF1aXRvdXMgZnVuY3Rpb25zIGFkZGVkIG9yIG1vZGlmaWVkLiBUaGUgY29yZSBCUEYgZnVuY3Rpb25zIGFkZGVkIGluIGBibGstaW9jb3N0LWJwZi5jYCBzdGFuZCBvdXQ6IGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAsIGBicGZfaW9jb3N0X3JlZ2AsIGBicGZfaW9jb3N0X3VucmVnYC4gQW5kIGZyb20gYGJsay1pb2Nvc3QuY2AsIGBjYWxjX3Z0aW1lX2Nvc3RgLCBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgLCBhbmQgYGlvY19jb3N0X21vZGVsX3ByZmlsbGAgYXMgdGhleSBhcHBlYXIgdG8gYmUgaW50ZWdyYWwgcGFydHMgb2YgdGhlIG5ldyBjb3N0IG1vZGVsLlxuXG5OZXh0LCB0aGUgY29uZmlndXJhdGlvbnMuIEkgbmVlZCB0byBlbnN1cmUgdGhlc2UgZmVhdHVyZXMgYXJlIGVuYWJsZWQgZm9yIGVmZmVjdGl2ZSBmdXp6aW5nLiBXZSBoYXZlIGBCTEtfQ0dST1VQX0lPQ09TVF9CUEZgLCBgQkxLX0NHUk9VUF9JT0NPU1RgLCBgQlBGX1NZU0NBTExgLCBgQlBGX0pJVGAsIGFuZCBgQkxLX0NHUk9VUGAuIENvbmZpcm1lZCwgSSd2ZSBjaGVja2VkIGBibG9jay9LY29uZmlnYCwgYW5kIGBCTEtfQ0dST1VQX0lPQ09TVGAgZGVwZW5kcyBvbiBgQkxLX0NHUk9VUGAuXG5cbkFscmlnaHQsIEknbSByZWFkeSB0byBmb3JtYWxseSBkZWZpbmUgdGhlIGZ1enppbmcgdGFyZ2V0LlxuXG4qKkVuYWJsZUNvbmZpZ3M6KipcbiogICBcIkJMS19DR1JPVVBfSU9DT1NUX0JQRlwiXG4qICAgXCJCTEtfQ0dST1VQX0lPQ09TVFwiXG4qICAgXCJCUEZfU1lTQ0FMTFwiXG4qICAgXCJCUEZfSklUXCJcbiogICBcIkJMS19DR1JPVVBcIlxuXG4qKkZvY3VzU3ltYm9sczoqKlxuKiAgIFwiaW9jb3N0X2JwZl9jYWxjX2Nvc3RcIlxuKiAgIFwiYnBmX2lvY29zdF9yZWdcIlxuKiAgIFwiYnBmX2lvY29zdF91bnJlZ1wiXG4qICAgXCJpb2NfY29zdF9tb2RlbF93cml0ZVwiXG4qICAgXCJpb2NfY29zdF9tb2RlbF9wcmZpbGxcIlxuKiAgIFwiY2FsY192dGltZV9jb3N0XCJcblxuVGhlIHJhdGlvbmFsZSBpcyBjbGVhci4gVGhlIHBhdGNoIGludHJvZHVjZXMgYSBCUEYgc3RydWN0X29wcyBtZWNoYW5pc20gZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscyBpbiB0aGUgYmxvY2sgSS9PIGNvc3QgY2dyb3VwIGNvbnRyb2xsZXIgKGFjdGl2YXRlZCBieSBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKS4gSXQgYWRkcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBob29rcyBpbnRvIGNvc3QgY2FsY3VsYXRpb24sIGFuZCBhbHRlcnMgdGhlIHN5c2ZzL2Nncm91cCBpbnRlcmZhY2UuIFRoaXMgYWxsIGhhbmRsZXMgdXNlciBpbnB1dCB2aWEgQlBGIGFuZCBjZ3JvdXBzIGFuZCBpcyByZWFjaGFibGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6YXRpb24gZW52aXJvbm1lbnRzLlxuXG5UaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTgyNjEsIk91dHB1dFRva2VucyI6MjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODczLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MDguNjc0NDAxMjY3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODI0NDI2MzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJMS19DR1JPVVBfSU9DT1NUX0JQRlwiLFxuICAgIFwiQkxLX0NHUk9VUF9JT0NPU1RcIixcbiAgICBcIkJMS19DR1JPVVBcIixcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJCUEZfSklUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaW9jb3N0X2JwZl9jYWxjX2Nvc3RcIixcbiAgICBcImJwZl9pb2Nvc3RfcmVnXCIsXG4gICAgXCJicGZfaW9jb3N0X3VucmVnXCIsXG4gICAgXCJpb2NfY29zdF9tb2RlbF93cml0ZVwiLFxuICAgIFwiaW9jX2Nvc3RfbW9kZWxfcHJmaWxsXCIsXG4gICAgXCJjYWxjX3Z0aW1lX2Nvc3RcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscyBpbiB0aGUgYmxvY2sgaW9jb3N0IGNncm91cCBjb250cm9sbGVyIChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKS4gSXQgYWRkcyBzdHJ1Y3Rfb3BzIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBjYWxsYmFja3MsIGludGVncmF0ZXMgZHluYW1pYyBCUEYgY29zdCBjYWxjdWxhdGlvbiBpbnRvIHRoZSBiaW8gc3VibWlzc2lvbiBwYXRoLCBhbmQgZXh0ZW5kcyB0aGUgY2dyb3VwIGlvLmNvc3QubW9kZWwgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuIFRoZSBjb2RlIGlzIGZ1bGx5IHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIGNncm91cHMgYW5kIHRoZSBCUEYgc3Vic3lzdGVtLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJMS19DR1JPVVBfSU9DT1NUX0JQRlwiLFxuICAgIFwiQkxLX0NHUk9VUF9JT0NPU1RcIixcbiAgICBcIkJMS19DR1JPVVBcIixcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJCUEZfSklUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaW9jb3N0X2JwZl9jYWxjX2Nvc3RcIixcbiAgICBcImJwZl9pb2Nvc3RfcmVnXCIsXG4gICAgXCJicGZfaW9jb3N0X3VucmVnXCIsXG4gICAgXCJpb2NfY29zdF9tb2RlbF93cml0ZVwiLFxuICAgIFwiaW9jX2Nvc3RfbW9kZWxfcHJmaWxsXCIsXG4gICAgXCJjYWxjX3Z0aW1lX2Nvc3RcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscyBpbiB0aGUgYmxvY2sgaW9jb3N0IGNncm91cCBjb250cm9sbGVyIChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKS4gSXQgYWRkcyBzdHJ1Y3Rfb3BzIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBjYWxsYmFja3MsIGludGVncmF0ZXMgZHluYW1pYyBCUEYgY29zdCBjYWxjdWxhdGlvbiBpbnRvIHRoZSBiaW8gc3VibWlzc2lvbiBwYXRoLCBhbmQgZXh0ZW5kcyB0aGUgY2dyb3VwIGlvLmNvc3QubW9kZWwgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuIFRoZSBjb2RlIGlzIGZ1bGx5IHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIGNncm91cHMgYW5kIHRoZSBCUEYgc3Vic3lzdGVtLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNjowOC43NTY4NTE3ODVaIiwiU2VxIjoxMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5OTYxMjExMTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MDguNzU3NDg2MzM1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTk5NjA1NzE4OTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdF9vcHMgc3VwcG9ydCAoYGlvY29zdF9tb2RlbF9vcHNgKSBmb3IgdGhlIGJsay1pb2Nvc3QgSS9PIGNncm91cCBjb250cm9sbGVyLCBhbGxvd2luZyBwbHVnZ2FibGUgQlBGLWJhc2VkIGNvc3QgY2FsY3VsYXRpb24sIGFkZHMgYSBuZXcgdHJhY2Vwb2ludCAoYGlvY29zdF9pb2NfdGlja2ApLCBhbmQgdXBkYXRlcyB0aGUgY2dyb3VwIHYyIGBpby5jb3N0Lm1vZGVsYCBpbnRlcmZhY2UuXFxuXFxuQW5hbHlzaXMgcmVnYXJkaW5nIHNhbml0aXplcnM6XFxuMS4gS01TQU4gYXBwbGljYWJpbGl0eTpcXG4tIEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSBhbmQga2VybmVsLXRvLXVzZXIgaW5mb3JtYXRpb24gbGVha3MuXFxuLSBJbiB0aGlzIHBhdGNoLCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIHBhc3NlZCB0byBgaW9jb3N0X2JwZl9jYWxjX2Nvc3QoKWAgYW5kIHRoZSBCUEYgc3RydWN0X29wcyBjYWxsYmFjayBhcmUgc2NhbGFyIGludGVnZXIgdmFsdWVzIHBhc3NlZCBieSB2YWx1ZS5cXG4tIE91dHB1dCBwb2ludGVycyAoc3VjaCBhcyBgKmNvc3RwYCBpbiBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgKSBhcmUgd3JpdHRlbiBiZWZvcmUgcmV0dXJuLCBhbmQgYWxsIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiBgYnBmYCwgYHVzZXJgLCBgY29zdGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBwcmlvciB0byBicmFuY2hpbmcgb3IgdXNlLlxcbi0gVGhlIG5ldyB0cmFjZXBvaW50IGBpb2Nvc3RfaW9jX3RpY2tgIGV4cGxpY2l0bHkgYXNzaWducyBhbGwgZmllbGRzIGluIGBUUF9mYXN0X2Fzc2lnbmAuXFxuLSBObyBzdHJ1Y3RzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgaGVhcCBhbGxvY2F0aW9ucyBhcmUgY29waWVkIHRvIHVzZXJzcGFjZS5cXG5cXG4yLiBLQVNBTiAvIExPQ0tERVAgYXBwbGljYWJpbGl0eTpcXG4tIFBvdGVudGlhbCByaXNrcyBpbiB0aGlzIHBhdGNoIHJldm9sdmUgYXJvdW5kIGNvbmN1cnJlbmN5IChzeW5jaHJvbml6YXRpb24gb2YgYGlvY29zdF9icGZfbW9kZWxgIHZpYSBSQ1UsIG11dGV4ZXMsIGFuZCBzdGF0aWMga2V5cykgb3IgbG9naWMvYm91bmRzIGVycm9ycywgd2hpY2ggYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQga2VybmVsIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi5cXG5cXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBTZXAgOCAxMTozNTo0MyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuaW5kZXggOGQyNjAzNzUxYzUxYS4uNTRiMDU3NGNlNTg2YyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0XG5AQCAtMjExNSwxMCArMjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXNcbiBcdGFyZSBkZWZpbmVkLlxuIFxuIFx0ICA9PT09PVx0XHQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLVx0ICBjdHJsXHRcdFwiYXV0b1wiIG9yIFwidXNlclwiXG4rXHQgIGN0cmxcdFx0XCJhdXRvXCIsIFwidXNlclwiIG9yIFwiYnBmXCJcbiBcdCAgbW9kZWxcdFx0VGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gXCJsaW5lYXJcIlxuIFx0ICA9PT09PVx0XHQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFxuK1x0V2hlbiBcImN0cmxcIiBpcyBcImJwZlwiIChvbmx5IGF2YWlsYWJsZSB3aGVuXG4rXHRDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGIGlzIGVuYWJsZWQpLCBjb3N0IGNhbGN1bGF0aW9uIGZvclxuK1x0dGhlIGRldmljZSBpcyBkaXNwYXRjaGVkIHRvIHRoZSBCUEYgcHJvZ3JhbSByZWdpc3RlcmVkIGFnYWluc3RcbitcdHRoZSBpb2Nvc3RfbW9kZWxfb3BzIHN0cnVjdF9vcHMuICBXcml0aW5nIFwiYnBmXCIgZmFpbHMgd2l0aCAtRUlOVkFMXG4rXHR1bnRpbCBzdWNoIGEgcHJvZ3JhbSBpcyByZWdpc3RlcmVkLCBhbmQgYXQgbW9zdCBvbmUgcHJvZ3JhbSBjYW5cbitcdGJlIHJlZ2lzdGVyZWQgc3lzdGVtLXdpZGUuICBUaGUgbW9kZWwgaXMgY2FsbGVkIHdpdGggc2NhbGFyXG4rXHRhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlXG4rXHRpc3N1aW5nIGNncm91cCwgZmxhZ3M7IHNlZSBpbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBmb3IgdGhlaXJcbitcdG1lYW5pbmcpIGFuZCByZXR1cm5zIGEgY29zdCBpbiB2dGltZSB1bml0cywgY2xhbXBlZCBieSB0aGUga2VybmVsXG4rXHR0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlc1xuK1x0dGhlIElPIGJhY2sgdG8gdGhlIGJ1aWx0aW4gbGluZWFyIGZvcm11bGEsIHNvIGEgbW9kZWwgd2hpY2ggb25seVxuK1x0aGFuZGxlcyBzb21lIElPIHR5cGVzIGNhbm5vdCBtYWtlIHRoZSByZXN0IGZyZWUuICBEZXZpY2VzIHdoaWNoXG4rXHRkb24ndCBvcHQgaW4ga2VlcCB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwgdW5jaGFuZ2VkLlxuK1xuIFx0V2hlbiBcImN0cmxcIiBpcyBcImF1dG9cIiwgdGhlIGtlcm5lbCBtYXkgY2hhbmdlIGFsbCBwYXJhbWV0ZXJzXG4gXHRkeW5hbWljYWxseS4gIFdoZW4gXCJjdHJsXCIgaXMgc2V0IHRvIFwidXNlclwiIG9yIGFueSBvdGhlclxuIFx0cGFyYW1ldGVycyBhcmUgd3JpdHRlbiB0bywgXCJjdHJsXCIgYmVjb21lIFwidXNlclwiIGFuZCB0aGVcbmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZ1xuaW5kZXggNzBlNGE2NmQ5NDFmZi4uYmY0M2JlMjFlMDBiYiAxMDA2NDRcbi0tLSBhL2Jsb2NrL0tjb25maWdcbisrKyBiL2Jsb2NrL0tjb25maWdcbkBAIC0yMzEsNCArMjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OXG4gXG4gc291cmNlIFwiYmxvY2svS2NvbmZpZy5pb3NjaGVkXCJcbiBcbitjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRib29sIFwiRW5hYmxlIEJQRiBwbHVnZ2FibGUgY29zdCBtb2RlbCBzdXBwb3J0IGZvciB0aGUgY29zdCBJTyBjb250cm9sbGVyXCJcbitcdGRlcGVuZHMgb24gQkxLX0NHUk9VUF9JT0NPU1QgXHUwMDI2XHUwMDI2IEJQRl9TWVNDQUxMIFx1MDAyNlx1MDAyNiBCUEZfSklUXG4rXHRoZWxwXG4rXHQgRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVnaXN0ZXJzIHRoZSBcImlvY29zdF9tb2RlbF9vcHNcIiBCUEZcbitcdCBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlXG4rXHQgYnVpbHRpbiBsaW5lYXIgY29zdCBtb2RlbCBvbiBkZXZpY2VzIGNvbmZpZ3VyZWQgd2l0aFxuK1x0IFwiY3RybD1icGZcIiB0aHJvdWdoIGlvLmNvc3QubW9kZWwuXG4rXG4gZW5kaWYgIyBCTE9DS1xuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLmVlNWNlYmVlYTAwNmYgMTAwNjQ0XG4tLS0gYS9ibG9jay9NYWtlZmlsZVxuKysrIGIvYmxvY2svTWFrZWZpbGVcbkBAIC0zOSwzICszOSw0IEBAIG9iai0kKENPTkZJR19CTEtfSU5MSU5FX0VOQ1JZUFRJT04pXHQrPSBibGstY3J5cHRvLm8gYmxrLWNyeXB0by1wcm9maWxlLm8gXFxcbiBcdFx0XHRcdFx0ICAgYmxrLWNyeXB0by1zeXNmcy5vXG4gb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSylcdCs9IGJsay1jcnlwdG8tZmFsbGJhY2sub1xuIG9iai0kKENPTkZJR19CTE9DS19IT0xERVJfREVQUkVDQVRFRClcdCs9IGhvbGRlci5vXG4rb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRilcdCs9IGJsay1pb2Nvc3QtYnBmLm9cbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LWJwZi5jIGIvYmxvY2svYmxrLWlvY29zdC1icGYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjBjMzRmNTZkZWQ3MWRcbi0tLSAvZGV2L251bGxcbisrKyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmNcbkBAIC0wLDAgKzEsMTUyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuK1xuKy8qXG4rICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy5cbisgKlxuKyAqIFJlZ2lzdGVycyB0aGUgXCJpb2Nvc3RfbW9kZWxfb3BzXCIgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWxcbisgKiBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBhIHRpbWU7IGRldmljZXMgb3B0IGluIHBlci1xdWV1ZSB3aXRoXG4rICogXCJlY2hvICRERVYgY3RybD1icGYgXHUwMDNlIGlvLmNvc3QubW9kZWxcIi4gIERldmljZXMgd2l0aG91dCBhIHJlZ2lzdGVyZWRcbisgKiBtb2RlbCBrZWVwIHVzaW5nIHRoZSBidWlsdGluIGxpbmVhciBtb2RlbC5cbisgKi9cbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGZfdmVyaWZpZXIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXHUwMDNlXG4rXG4rLyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJ3MgY2hhcmdlYWJsZSBjb3N0ICovXG4rI2RlZmluZSBJT0NPU1RfQlBGX01BWF9DT1NUXHQoMVVMTCBcdTAwM2NcdTAwM2MgMzcpXG4rXG4rc3RhdGljIHN0cnVjdCBicGZfc3RydWN0X29wcyBicGZfaW9jb3N0X21vZGVsX29wcztcbitcbitzdGF0aWMgREVGSU5FX01VVEVYKGlvY29zdF9icGZfcmVnX2xvY2spO1xuK3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX3JjdSAqaW9jb3N0X2JwZl9tb2RlbDtcbitzdGF0aWMgREVGSU5FX1NUQVRJQ19LRVlfRkFMU0UoaW9jb3N0X2JwZl9rZXkpO1xuK1xuK2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpXG4re1xuK1x0cmV0dXJuIHN0YXRpY19icmFuY2hfdW5saWtlbHkoXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xuK31cbitcbitib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvcixcbitcdFx0XHQgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApXG4re1xuK1x0Y29uc3Qgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm9wcztcbitcdHU2NCBjb3N0O1xuK1xuK1x0aWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFx1MDAyNmlvY29zdF9icGZfa2V5KSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0b3BzID0gcmN1X2RlcmVmZXJlbmNlKGlvY29zdF9icGZfbW9kZWwpO1xuK1x0aWYgKCFvcHMpIHtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdGNvc3QgPSBvcHMtXHUwMDNlY2FsY19jb3N0KG9wLCBuYnl0ZXMsIHNlY3RvciwgY3Vyc29yLCBpb2NnX2lkLCBmbGFncyk7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdGlmICghY29zdClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0KmNvc3RwID0gbWluKGNvc3QsIElPQ09TVF9CUEZfTUFYX0NPU1QpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9tb2RlbF9pbml0KHN0cnVjdCBidGYgKmJ0Zilcbit7XG4rXHRzMzIgdHlwZV9pZDtcbitcbitcdHR5cGVfaWQgPSBidGZfZmluZF9ieV9uYW1lX2tpbmQoYnRmLCBcImlvY29zdF9tb2RlbF9vcHNcIiwgQlRGX0tJTkRfU1RSVUNUKTtcbitcdGlmICh0eXBlX2lkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIoY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxuK1x0XHRcdFx0ICBjb25zdCBzdHJ1Y3QgYnRmX21lbWJlciAqbWVtYmVyLFxuK1x0XHRcdFx0ICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sIGJwZl9pb2Nvc3RfaXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLFxuK1x0XHRcdFx0ICAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsXG4rXHRcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLFxuK1x0XHRcdFx0ICAgICAgIHN0cnVjdCBicGZfaW5zbl9hY2Nlc3NfYXV4ICppbmZvKVxuK3tcbitcdHJldHVybiBicGZfdHJhY2luZ19idGZfY3R4X2FjY2VzcyhvZmYsIHNpemUsIHR5cGUsIHByb2csIGluZm8pO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvICpcbiticGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCxcbitcdFx0XHQgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZylcbit7XG4rXHRyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0ge1xuK1x0LmdldF9mdW5jX3Byb3RvID0gYnBmX2lvY29zdF9nZXRfZnVuY19wcm90byxcbitcdC5pc192YWxpZF9hY2Nlc3MgPSBicGZfaW9jb3N0X2lzX3ZhbGlkX2FjY2Vzcyxcbit9O1xuK1xuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9yZWcodm9pZCAqa2RhdGEsIHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhO1xuK1xuK1x0aWYgKCFuZXdfb3BzLVx1MDAzZWNhbGNfY29zdClcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRpbnQgcmV0ID0gMDtcbitcbitcdC8qIHRoZSBjYWxsZXIgb25seSBob2xkcyB0aGUgcGVyLW1hcCBsb2NrLCBzbyBzZXJpYWxpemUgaGVyZSAqL1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbitcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkpXG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdGVsc2Uge1xuK1x0XHRzdGF0aWNfYnJhbmNoX2luYyhcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4rXHRcdHJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBuZXdfb3BzKTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGJwZl9pb2Nvc3RfdW5yZWcodm9pZCAqa2RhdGEsIHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRtdXRleF9sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuK1x0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsKSA9PSBrZGF0YSkge1xuK1x0XHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7XG4rXHRcdHN0YXRpY19icmFuY2hfZGVjKFx1MDAyNmlvY29zdF9icGZfa2V5KTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbit9XG4rXG4rc3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbitcdFx0XHRcdCAgICAgdTY0IGN1cnNvciwgdTY0IGlvY2dfaWQsIHU2NCBmbGFncylcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fYnBmX29wc19pb2Nvc3RfbW9kZWxfb3BzID0ge1xuK1x0LmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0ge1xuK1x0LnZlcmlmaWVyX29wcyA9IFx1MDAyNmJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzLFxuK1x0LmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsXG4rXHQuaW5pdF9tZW1iZXIgPSBicGZfaW9jb3N0X2luaXRfbWVtYmVyLFxuK1x0LnJlZyA9IGJwZl9pb2Nvc3RfcmVnLFxuK1x0LnVucmVnID0gYnBmX2lvY29zdF91bnJlZyxcbitcdC5uYW1lID0gXCJpb2Nvc3RfbW9kZWxfb3BzXCIsXG4rXHQuY2ZpX3N0dWJzID0gXHUwMDI2X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsXG4rXHQub3duZXIgPSBUSElTX01PRFVMRSxcbit9O1xuK1xuK3N0YXRpYyBpbnQgX19pbml0IGJwZl9pb2Nvc3RfaW5pdCh2b2lkKVxuK3tcbitcdHJldHVybiByZWdpc3Rlcl9icGZfc3RydWN0X29wcyhcdTAwMjZicGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7XG4rfVxuK2xhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTtcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LmMgYi9ibG9jay9ibGstaW9jb3N0LmNcbmluZGV4IDI3NDViZmZjZDVlZWYuLmE1OGMxNmZjYjI5ZmEgMTAwNjQ0XG4tLS0gYS9ibG9jay9ibGstaW9jb3N0LmNcbisrKyBiL2Jsb2NrL2Jsay1pb2Nvc3QuY1xuQEAgLTE3Nyw2ICsxNzcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3RpbWVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90aW1lNjQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhcnNlci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vbG9jYWwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9sb2NhbDY0LmhcdTAwM2VcbkBAIC00NDUsNiArNDQ2LDcgQEAgc3RydWN0IGlvYyB7XG4gXHRpbnRcdFx0XHRcdGF1dG9wX2lkeDtcbiBcdGJvb2xcdFx0XHRcdHVzZXJfcW9zX3BhcmFtczoxO1xuIFx0Ym9vbFx0XHRcdFx0dXNlcl9jb3N0X21vZGVsOjE7XG4rXHRib29sXHRcdFx0XHRicGZfY29zdF9tb2RlbDtcbiB9O1xuIFxuIHN0cnVjdCBpb2NnX3BjcHVfc3RhdCB7XG5AQCAtMjIzOCw2ICsyMjQwLDcgQEAgc3RhdGljIHZvaWQgaW9jX3RpbWVyX2ZuKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcilcbiBcdHN0cnVjdCBpb2Nfbm93IG5vdztcbiBcdExJU1RfSEVBRChzdXJwbHVzZXMpO1xuIFx0aW50IG5yX2RlYnRvcnMsIG5yX3Nob3J0YWdlcyA9IDAsIG5yX2xhZ2dpbmcgPSAwO1xuK1x0aW50IG5yX2FjdGl2ZSA9IDA7XG4gXHR1NjQgdXNhZ2VfdXNfc3VtID0gMDtcbiBcdHUzMiBwcG1fcnRocjtcbiBcdHUzMiBwcG1fd3RocjtcbkBAIC0yMjc0LDYgKzIyNzcsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHR1NjQgdmRvbmUsIHZ0aW1lLCB1c2FnZV91cztcbiBcdFx0dTMyIGh3X2FjdGl2ZSwgaHdfaW51c2U7XG4gXG4rXHRcdG5yX2FjdGl2ZSsrO1xuK1xuIFx0XHQvKlxuIFx0XHQgKiBDb2xsZWN0IHVudXNlZCBhbmQgd2luZCB2dGltZSBjbG9zZXIgdG8gdm5vdyB0byBwcmV2ZW50XG4gXHRcdCAqIGlvY2dzIGZyb20gYWNjdW11bGF0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGJ1ZGdldC5cbkBAIC0yNDYwLDYgKzI0NjUsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHRpb2NfcmVmcmVzaF92cmF0ZShpb2MsIFx1MDAyNm5vdyk7XG4gXHR9XG4gXG4rXHR0cmFjZV9pb2Nvc3RfaW9jX3RpY2soaW9jLCBucl9hY3RpdmUsIHVzYWdlX3VzX3N1bSk7XG4rXG4gXHRzcGluX3VubG9ja19pcnEoXHUwMDI2aW9jLVx1MDAzZWxvY2spO1xuIH1cbiBcbkBAIC0yNTczLDYgKzI1ODAsMjMgQEAgc3RhdGljIHU2NCBjYWxjX3Z0aW1lX2Nvc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLCBib29sIGlzX21lcmdlKVxuIHtcbiBcdHU2NCBjb3N0O1xuIFxuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRzdHJ1Y3QgaW9jICppb2MgPSBpb2NnLVx1MDAzZWlvYztcbitcbitcdGlmIChSRUFEX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsKSkge1xuK1x0XHR1NjQgYnBmX2Nvc3Q7XG4rXG4rXHRcdGlmIChpb2Nvc3RfYnBmX2NhbGNfY29zdChiaW9fb3AoYmlvKSxcbitcdFx0XHRcdFx0IGJpby1cdTAwM2ViaV9pdGVyLmJpX3NpemUsXG4rXHRcdFx0XHRcdCBiaW8tXHUwMDNlYmlfaXRlci5iaV9zZWN0b3IsXG4rXHRcdFx0XHRcdCBpb2NnLVx1MDAzZWN1cnNvcixcbitcdFx0XHRcdFx0IGlvY2dfdG9fYmxrZyhpb2NnKS1cdTAwM2VibGtjZy1cdTAwM2Vjc3MuaWQsXG4rXHRcdFx0XHRcdCBpc19tZXJnZSA/IElPQ09TVF9DT1NUX0ZfTUVSR0UgOiAwLFxuK1x0XHRcdFx0XHQgXHUwMDI2YnBmX2Nvc3QpKVxuK1x0XHRcdHJldHVybiBicGZfY29zdDtcbitcdH1cbisjZW5kaWZcbitcbiBcdGNhbGNfdnRpbWVfY29zdF9idWlsdGluKGJpbywgaW9jZywgaXNfbWVyZ2UsIFx1MDAyNmNvc3QpO1xuIFx0cmV0dXJuIGNvc3Q7XG4gfVxuQEAgLTM0NDEsNyArMzQ2NSw4IEBAIHN0YXRpYyB1NjQgaW9jX2Nvc3RfbW9kZWxfcHJmaWxsKHN0cnVjdCBzZXFfZmlsZSAqc2YsXG4gXHRzZXFfcHJpbnRmKHNmLCBcIiVzIGN0cmw9JXMgbW9kZWw9bGluZWFyIFwiXG4gXHRcdCAgIFwicmJwcz0lbGx1IHJzZXFpb3BzPSVsbHUgcnJhbmRpb3BzPSVsbHUgXCJcbiBcdFx0ICAgXCJ3YnBzPSVsbHUgd3NlcWlvcHM9JWxsdSB3cmFuZGlvcHM9JWxsdVxcblwiLFxuLVx0XHQgICBkbmFtZSwgaW9jLVx1MDAzZXVzZXJfY29zdF9tb2RlbCA/IFwidXNlclwiIDogXCJhdXRvXCIsXG4rXHRcdCAgIGRuYW1lLCBpb2MtXHUwMDNlYnBmX2Nvc3RfbW9kZWwgPyBcImJwZlwiIDpcbitcdFx0XHQgICBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsID8gXCJ1c2VyXCIgOiBcImF1dG9cIixcbiBcdFx0ICAgdVtJX0xDT0VGX1JCUFNdLCB1W0lfTENPRUZfUlNFUUlPUFNdLCB1W0lfTENPRUZfUlJBTkRJT1BTXSxcbiBcdFx0ICAgdVtJX0xDT0VGX1dCUFNdLCB1W0lfTENPRUZfV1NFUUlPUFNdLCB1W0lfTENPRUZfV1JBTkRJT1BTXSk7XG4gXHRzcGluX3VubG9ja19pcnEoXHUwMDI2aW9jLVx1MDAzZWxvY2spO1xuQEAgLTM0ODEsNyArMzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHR1bnNpZ25lZCBpbnQgbWVtZmxhZ3M7XG4gXHRzdHJ1Y3QgaW9jICppb2M7XG4gXHR1NjQgdVtOUl9JX0xDT0VGU107XG4tXHRib29sIHVzZXI7XG4rXHRib29sIHVzZXIsIGJwZjtcbiBcdGNoYXIgKmJvZHksICpwO1xuIFx0aW50IHJldDtcbiBcbkBAIC0zNTEyLDYgKzM1MzcsNyBAQCBzdGF0aWMgc3NpemVfdCBpb2NfY29zdF9tb2RlbF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmlucHV0LFxuIFx0c3Bpbl9sb2NrX2lycShcdTAwMjZpb2MtXHUwMDNlbG9jayk7XG4gXHRtZW1jcHkodSwgaW9jLVx1MDAzZXBhcmFtcy5pX2xjb2Vmcywgc2l6ZW9mKHUpKTtcbiBcdHVzZXIgPSBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsO1xuK1x0YnBmID0gaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsO1xuIFxuIFx0cmV0ID0gLUVJTlZBTDtcbiBcbkBAIC0zNTI3LDExICszNTUzLDIwIEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHRcdHN3aXRjaCAobWF0Y2hfdG9rZW4ocCwgY29zdF9jdHJsX3Rva2VucywgYXJncykpIHtcbiBcdFx0Y2FzZSBDT1NUX0NUUkw6XG4gXHRcdFx0bWF0Y2hfc3RybGNweShidWYsIFx1MDAyNmFyZ3NbMF0sIHNpemVvZihidWYpKTtcbi1cdFx0XHRpZiAoIXN0cmNtcChidWYsIFwiYXV0b1wiKSlcbitcdFx0XHRpZiAoIXN0cmNtcChidWYsIFwiYXV0b1wiKSkge1xuIFx0XHRcdFx0dXNlciA9IGZhbHNlO1xuLVx0XHRcdGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInVzZXJcIikpXG4rXHRcdFx0XHRicGYgPSBmYWxzZTtcbitcdFx0XHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInVzZXJcIikpIHtcbiBcdFx0XHRcdHVzZXIgPSB0cnVlO1xuLVx0XHRcdGVsc2VcbitcdFx0XHRcdGJwZiA9IGZhbHNlO1xuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRcdFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCJicGZcIikpIHtcbitcdFx0XHRcdGlmICghaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKCkpXG4rXHRcdFx0XHRcdGdvdG8gdW5sb2NrO1xuK1x0XHRcdFx0dXNlciA9IGZhbHNlO1xuK1x0XHRcdFx0YnBmID0gdHJ1ZTtcbisjZW5kaWZcbitcdFx0XHR9IGVsc2VcbiBcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRjYXNlIENPU1RfTU9ERUw6XG5AQCAtMzU1Niw2ICszNTkxLDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCxcbiBcdH0gZWxzZSB7XG4gXHRcdGlvYy1cdTAwM2V1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTtcbiBcdH1cbitcdFdSSVRFX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsLCBicGYpO1xuIFx0aW9jX3JlZnJlc2hfcGFyYW1zKGlvYywgdHJ1ZSk7XG4gXG4gXHRyZXQgPSAwO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0Lmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43MTExYjVjMDNkYzM2XG4tLS0gL2Rldi9udWxsXG4rKysgYi9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaFxuQEAgLTAsMCArMSw1NiBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rI2lmbmRlZiBfTElOVVhfQkxLX0lPQ09TVF9IXG4rI2RlZmluZSBfTElOVVhfQkxLX0lPQ09TVF9IXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuK1xuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXG4rLypcbisgKiBQbHVnZ2FibGUgY29zdCBtb2RlbCBpbnRlcmZhY2UgZm9yIGJsay1pb2Nvc3QuXG4rICpcbisgKiBBIEJQRiBzdHJ1Y3Rfb3BzIGltcGxlbWVudGF0aW9uIHJlZ2lzdGVyZWQgYWdhaW5zdCBcImlvY29zdF9tb2RlbF9vcHNcIlxuKyAqIHJlcGxhY2VzIHRoZSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoXG4rICogXCJjdHJsPWJwZlwiIHRocm91Z2ggaW8uY29zdC5tb2RlbC4gIFRoZSBtb2RlbCBpcyBhIHB1cmUgZnVuY3Rpb24gb2YgdGhlXG4rICogYXJndW1lbnRzIGJlbG93IGFuZCByZXR1cm5zIHRoZSBjb3N0IG9mIHRoZSBJTyBpbiBkZXZpY2UgdGltZSB1bml0cyxcbisgKiB3aGVyZSAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBlcXVhbHMgMl4zNyAoVlRJTUVfUEVSX1NFQykuICBUaGVcbisgKiByZXR1cm5lZCB2YWx1ZSBpcyBjbGFtcGVkIGJ5IHRoZSBrZXJuZWwuICBBIGNvc3Qgb2YgMCBkZWxlZ2F0ZXMgdGhlXG4rICogSU8gYmFjayB0byB0aGUgYnVpbHRpbiBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIGRvZXMgbm90IGhhbmRsZSBhXG4rICogZ2l2ZW4gSU8gdHlwZSBjYW5ub3QgbWFrZSBpdCBmcmVlLlxuKyAqXG4rICogVGhlIGlvY2dfaWQgYXJndW1lbnQgaWRlbnRpZmllcyB0aGUgaXNzdWluZyBjZ3JvdXAgKGNzcyBpZCkgc28gdGhlXG4rICogbW9kZWwgY2FuIGtlZXAgcGVyLWNncm91cCBzdGF0ZSwgZS5nLiBmb3IgbXVsdGktc3RyZWFtIHNlcXVlbnRpYWxpdHlcbisgKiBkZXRlY3Rpb24uICBUaGUgaWQgaXMgb25seSB2YWxpZCB3aGlsZSB0aGUgY2dyb3VwIGV4aXN0czogY3NzIGlkcyBhcmVcbisgKiByZWN5Y2xlZCBvbmNlIHRoZSBjZ3JvdXAgaXMgcmVtb3ZlZCwgc28gbW9kZWxzIG11c3QgdHJlYXQgaXQgYXMgYVxuKyAqIHRyYW5zaWVudCBrZXkgYW5kIHJlc2V0IHN0YXRlIHdoZW4gdGhleSBvYnNlcnZlIGl0IHJldXNlZC4gIFdoZXRoZXJcbisgKiB0aGUgaW50ZXJmYWNlIG5lZWRzIGEgcmVsZWFzZShpb2NnX2lkKSBjYWxsYmFjayBmb3Igc3RhdGUgY2xlYW51cCBpc1xuKyAqIGFuIG9wZW4gcXVlc3Rpb24uXG4rICpcbisgKiBUaGUgbW9kZWwgaXMgY2FsbGVkIGZyb20gdGhlIElPIHN1Ym1pc3Npb24gcGF0aCB1bmRlciBSQ1UgYW5kIG11c3RcbisgKiBub3Qgc2xlZXAuICBPbmx5IHRoZSBiaW8tbGV2ZWwgY2hhcmdpbmcgcGF0aCBjb25zdWx0cyB0aGUgbW9kZWw7XG4rICogdGhlIHJlcXVlc3QtbGV2ZWwgc2l6aW5nIHBhdGggKGNhbGNfc2l6ZV92dGltZV9jb3N0KCkpIGtlZXBzIHVzaW5nXG4rICogdGhlIGJ1aWx0aW4gZm9ybXVsYS5cbisgKi9cbitcbisvKiBmbGFncyBmb3IgY2FsY19jb3N0KCkgKi9cbisjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVx0LyogY2FsbGVkIGZyb20gbWVyZ2UgcGF0aCAqL1xuK1xuK3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIHtcbitcdC8qXG4rXHQgKiBAb3A6XHRcdFJFUV9PUF8qIHZhbHVlICh1YXBpIGJsa19vcGYuaClcbitcdCAqIEBuYnl0ZXM6XHRJTyBzaXplIGluIGJ5dGVzXG4rXHQgKiBAc2VjdG9yOlx0c3RhcnRpbmcgc2VjdG9yXG4rXHQgKiBAY3Vyc29yOlx0aW9jZyBjdXJzb3Igc2VjdG9yLCAwIGlmIG5vbmUgKHNlcXVlbnRpYWxpdHkgaGludClcbitcdCAqIEBpb2NnX2lkOlx0Y3NzIGlkIG9mIHRoZSBpc3N1aW5nIGNncm91cFxuK1x0ICogQGZsYWdzOlx0SU9DT1NUX0NPU1RfRl8qXG4rXHQgKi9cbitcdHU2NCAoKmNhbGNfY29zdCkodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuK1x0XHRcdCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKTtcbit9O1xuK1xuK2Jvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuK1x0XHRcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cCk7XG4rYm9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZCk7XG4rXG4rI2VuZGlmXHQvKiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGICovXG4rI2VuZGlmXHQvKiBfTElOVVhfQkxLX0lPQ09TVF9IICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaFxuaW5kZXggZTc3MmIxYmM2MGQ2MC4uMmI5ZmYzNDhhNGY1MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXG4rKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaFxuQEAgLTE3OCw2ICsxNzgsNDYgQEAgVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY192cmF0ZV9hZGosXG4gXHQpXG4gKTtcbiBcbisvKlxuKyAqIFBlcmlvZGljIHBlci1kZXZpY2Ugc3VtbWFyeSwgZW1pdHRlZCBvbmNlIHBlciBwZXJpb2QgZnJvbSB0aGUgdGFpbCBvZlxuKyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5XG4rICogcGVyaW9kIHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGluY2x1ZGluZyBzdGVhZHkgc3RhdGVzLCBhbmQgY2Fycmllc1xuKyAqIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3RhdGUgc28gYmFzaWMgbW9uaXRvcmluZyBkb2Vzbid0IHJlcXVpcmUgZHJnbi5cbisgKi9cbitUUkFDRV9FVkVOVChpb2Nvc3RfaW9jX3RpY2ssXG4rXG4rXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jICppb2MsIGludCBucl9hY3RpdmUsIHU2NCB1c2FnZV91c19zdW0pLFxuK1xuK1x0VFBfQVJHUyhpb2MsIG5yX2FjdGl2ZSwgdXNhZ2VfdXNfc3VtKSxcbitcbitcdFRQX1NUUlVDVF9fZW50cnkgKFxuK1x0XHRfX3N0cmluZyhkZXZuYW1lLCBpb2NfbmFtZShpb2MpKVxuK1x0XHRfX2ZpZWxkKHUzMiwgcGVyaW9kX3VzKVxuK1x0XHRfX2ZpZWxkKHU2NCwgdnJhdGUpXG4rXHRcdF9fZmllbGQoaW50LCBidXN5X2xldmVsKVxuK1x0XHRfX2ZpZWxkKGludCwgbnJfYWN0aXZlKVxuK1x0XHRfX2ZpZWxkKHUzMiwgdXNhZ2VfcGN0KVxuK1x0XHRfX2ZpZWxkKGludCwgcnVubmluZylcbitcdCksXG4rXG4rXHRUUF9mYXN0X2Fzc2lnbihcbitcdFx0X19hc3NpZ25fc3RyKGRldm5hbWUpO1xuK1x0XHRfX2VudHJ5LVx1MDAzZXBlcmlvZF91cyA9IGlvYy1cdTAwM2VwZXJpb2RfdXM7XG4rXHRcdF9fZW50cnktXHUwMDNldnJhdGUgPSBpb2MtXHUwMDNldnRpbWVfYmFzZV9yYXRlO1xuK1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwgPSBpb2MtXHUwMDNlYnVzeV9sZXZlbDtcbitcdFx0X19lbnRyeS1cdTAwM2Vucl9hY3RpdmUgPSBucl9hY3RpdmU7XG4rXHRcdF9fZW50cnktXHUwMDNldXNhZ2VfcGN0ID0gaW9jLVx1MDAzZXBlcmlvZF91cyA/XG4rXHRcdFx0ZGl2X3U2NCh1c2FnZV91c19zdW0gKiAxMDAsIGlvYy1cdTAwM2VwZXJpb2RfdXMpIDogMDtcbitcdFx0X19lbnRyeS1cdTAwM2VydW5uaW5nID0gaW9jLVx1MDAzZXJ1bm5pbmc7XG4rXHQpLFxuK1xuK1x0VFBfcHJpbnRrKFwiWyVzXSBwZXJpb2Q9JXV1cyB2cmF0ZT0lbGx1IGJ1c3k9JWQgYWN0aXZlPSVkIHVzYWdlPSV1JSUgcnVubmluZz0lZFwiLFxuK1x0XHRfX2dldF9zdHIoZGV2bmFtZSksIF9fZW50cnktXHUwMDNlcGVyaW9kX3VzLCBfX2VudHJ5LVx1MDAzZXZyYXRlLFxuK1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwsIF9fZW50cnktXHUwMDNlbnJfYWN0aXZlLCBfX2VudHJ5LVx1MDAzZXVzYWdlX3BjdCxcbitcdFx0X19lbnRyeS1cdTAwM2VydW5uaW5nXG4rXHQpXG4rKTtcbitcbiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsXG4gXG4gXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCArMSwxNTUgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJpb2Nvc3RfbW9kZWwuc2tlbC5oXCJcbisjaW5jbHVkZSBcImlvY29zdF9tcy5za2VsLmhcIlxuK1xuKy8qXG4rICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZVxuKyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy5cbisgKiBTaGFyZWQgYnkgdGhlIGV4YW1wbGUtbW9kZWwgdGVzdHMgYmVsb3cuXG4rICovXG4rc3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldilcbit7XG4rXHRjaGFyIHBhdGhbXSA9IFwiL3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFwiO1xuK1x0Y2hhciB3b3JkWzI1Nl0sIGxpbmVbMjU2XSwgYnVmWzMwMF07XG4rXHRGSUxFICpmcDtcbitcdGludCBlcnIsIGZvdW5kID0gMDtcbitcbitcdGZwID0gZm9wZW4ocGF0aCwgXCJyK1wiKTtcbitcdGlmICghZnApIHtcbitcdFx0VEhfTE9HKFwib3BlbiAlczogJXNcIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4rXHRcdGlmIChzc2NhbmYobGluZSwgXCIlMjU1c1wiLCB3b3JkKSA9PSAxIFx1MDAyNlx1MDAyNiAhc3RyY21wKHdvcmQsIGRldikpIHtcbitcdFx0XHRmb3VuZCA9IDE7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdH1cbitcdGlmICghZm91bmQpIHtcbitcdFx0VEhfTE9HKFwiJXMgaGFzIG5vIGlvY29zdCBsaW5lXCIsIGRldik7XG4rXHRcdGZjbG9zZShmcCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXMgY3RybD1icGZcIiwgZGV2KTtcbitcdGVyciA9IGZwcmludGYoZnAsIFwiJXNcXG5cIiwgYnVmKTtcbitcdGlmIChlcnIgXHUwMDNjPSAwKSB7XG4rXHRcdFRIX0xPRyhcIndyaXRlIGN0cmw9YnBmIGZhaWxlZFwiKTtcbitcdFx0ZmNsb3NlKGZwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0ZmZsdXNoKGZwKTtcbitcbitcdHJld2luZChmcCk7XG4rXHRmb3VuZCA9IDA7XG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbitcdFx0aWYgKHNzY2FuZihsaW5lLCBcIiUyNTVzXCIsIHdvcmQpID09IDEgXHUwMDI2XHUwMDI2ICFzdHJjbXAod29yZCwgZGV2KSkge1xuK1x0XHRcdGZvdW5kID0gc3Ryc3RyKGxpbmUsIFwiY3RybD1icGZcIikgIT0gTlVMTDtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0fVxuK1x0aWYgKCFmb3VuZClcbitcdFx0VEhfTE9HKFwicmVhZGJhY2sgZG9lcyBub3Qgc2hvdyBjdHJsPWJwZlwiKTtcbitcbitcdGZwcmludGYoZnAsIFwiJXMgY3RybD1hdXRvXFxuXCIsIGRldik7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGZvdW5kID8gMCA6IC0xO1xuK31cbitcbitzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpXG4re1xuK1x0RklMRSAqZnAgPSBmb3BlbihcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QucW9zXCIsIFwiclwiKTtcbitcbitcdGlmIChmcClcbitcdFx0ZmNsb3NlKGZwKTtcbitcdHJldHVybiBmcCAhPSBOVUxMO1xuK31cbitcbisvKlxuKyAqIFJlZ2lzdGVyIHRoZSBleGFtcGxlIGNvc3QgbW9kZWwgYW5kIHN3aXRjaCBhIGRldmljZSB0byBjdHJsPWJwZi5cbisgKiBJTyBhY2NvdW50aW5nIGl0c2VsZiBpcyBub3QgY2hlY2tlZCBoZXJlOyBpdCBuZWVkcyBhIGRldmljZSBkb2luZ1xuKyAqIHJlYWwgSU8gdW5kZXIgaW9jb3N0IGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZSBrZXJuZWwtc2lkZSB2YWxpZGF0aW9uXG4rICogZGVzY3JpYmVkIGluIHRoZSBjb3ZlciBsZXR0ZXIuXG4rICpcbisgKiBSZXF1aXJlcyByb290LCBjZ3JvdXAgdjIgYW5kIGEgZGV2aWNlIHdpdGggaW9jb3N0IHN1cHBvcnQuICBUaGVcbisgKiBkZXZpY2UgbXVzdCBiZSBnaXZlbiBhcyBtYWpvcjptaW5vciBpbiAkSU9DT1NUX1RFU1RfREVWLCBvdGhlcndpc2VcbisgKiB0aGUgdGVzdCBpcyBza2lwcGVkLlxuKyAqL1xuK3ZvaWQgc2VyaWFsX3Rlc3RfaW9jb3N0X21vZGVsKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvY29zdF9tb2RlbCAqc2tlbDtcbitcdGNoYXIgd29yZFsyNTZdLCAqZGV2O1xuK1x0aW50IGVycjtcbitcbitcdGRldiA9IGdldGVudihcIklPQ09TVF9URVNUX0RFVlwiKTtcbitcdGlmICghZGV2IHx8IGdldGV1aWQoKSAhPSAwKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcImlvY29zdF9tb3VudGVkXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBuZWdhdGl2ZTogY3RybD1icGYgbXVzdCBiZSByZWplY3RlZCB3aGlsZSBubyBtb2RlbCBpc1xuK1x0ICogcmVnaXN0ZXJlZCwgc28gYSB0eXBvIGNhbm5vdCBzaWxlbnRseSBkaXNhYmxlIGNvc3QgbW9kZWxcbitcdCAqIHVwZGF0ZXMgKi9cbitcdGlmIChzc2NhbmYoZGV2LCBcIiUyNTVzXCIsIHdvcmQpICE9IDEpXG4rXHRcdHJldHVybjtcbitcdHtcbitcdFx0Y2hhciBwYXRoW10gPSBcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWxcIjtcbitcdFx0Y2hhciBidWZbMzAwXTtcbitcdFx0RklMRSAqZnAgPSBmb3BlbihwYXRoLCBcIndcIik7XG4rXG4rXHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXMgY3RybD1icGZcXG5cIiwgd29yZCk7XG4rXHRcdGVyciA9IDA7XG4rXHRcdGlmIChmcCkge1xuK1x0XHRcdGVyciA9IGZwcmludGYoZnAsIFwiJXNcIiwgYnVmKSBcdTAwM2M9IDA7XG4rXHRcdFx0ZmNsb3NlKGZwKTtcbitcdFx0fVxuK1x0XHRBU1NFUlRfVFJVRShlcnIsIFwiY3RybF9icGZfd2l0aG91dF9tb2RlbF9yZWplY3RlZFwiKTtcbitcdH1cbitcbitcdHNrZWwgPSBpb2Nvc3RfbW9kZWxfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcInNrZWxfb3Blbl9sb2FkXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBhdHRhY2hpbmcgdGhlIHN0cnVjdF9vcHMgcmVnaXN0ZXJzIHRoZSBtb2RlbDsgYSBzZWNvbmRcbitcdCAqIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc2FtZSBvcHMgd291bGQgZmFpbCB3aXRoIEVCVVNZICovXG4rXHRlcnIgPSBpb2Nvc3RfbW9kZWxfX2F0dGFjaChza2VsKTtcbitcdGlmIChBU1NFUlRfT0soZXJyLCBcImF0dGFjaFwiKSlcbitcdFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXCJzd2l0Y2hfYW5kX3JlYWRiYWNrXCIpO1xuK1xuK1x0aW9jb3N0X21vZGVsX19kZXN0cm95KHNrZWwpO1xuK31cbitcbisvKlxuKyAqIFNhbWUgY2hlY2sgZm9yIHRoZSBtdWx0aS1zdHJlYW0gZXhhbXBsZSBtb2RlbC4gIE9ubHkgb25lIG1vZGVsIGNhblxuKyAqIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lLCBzbyB0aGlzIHRlc3QgbXVzdCBydW4gc2VwYXJhdGVseSBmcm9tXG4rICogdGVzdF9pb2Nvc3RfbW9kZWw7IGJvdGggYXJlIHNlcmlhbC5cbisgKi9cbit2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbF9zdHJlYW1zKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvY29zdF9tcyAqc2tlbDtcbitcdGNoYXIgKmRldjtcbitcdGludCBlcnI7XG4rXG4rXHRkZXYgPSBnZXRlbnYoXCJJT0NPU1RfVEVTVF9ERVZcIik7XG4rXHRpZiAoIWRldiB8fCBnZXRldWlkKCkgIT0gMCkge1xuK1x0XHR0ZXN0X19za2lwKCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghQVNTRVJUX1RSVUUoZGV2X2hhc19pb2Nvc3QoKSwgXCJpb2Nvc3RfbW91bnRlZFwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbCA9IGlvY29zdF9tc19fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwic2tlbF9vcGVuX2xvYWRcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IGlvY29zdF9tc19fYXR0YWNoKHNrZWwpO1xuK1x0aWYgKEFTU0VSVF9PSyhlcnIsIFwiYXR0YWNoXCIpKVxuK1x0XHRBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCBcInN3aXRjaF9hbmRfcmVhZGJhY2tcIik7XG4rXG4rXHRpb2Nvc3RfbXNfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCArMSw5MSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbisvKlxuKyAqIEV4YW1wbGUgaW9jb3N0IGNvc3QgbW9kZWw6IHRoZSBidWlsdGluIGxpbmVhciBIREQgZm9ybXVsYSB3aXRoIGFsbFxuKyAqIGNvc3RzIGRvdWJsZWQuXG4rICpcbisgKiBUaGUgY29uc3RhbnRzIG1pcnJvciB3aGF0IGNhbGNfbGNvZWZzKCkgZGVyaXZlcyBmcm9tIHRoZSBBVVRPUF9IRERcbisgKiBkZWZhdWx0cyAocmJwcz0xNzQwMTkxNzYgcnNlcWlvcHM9NDE3MDggcnJhbmRpb3BzPTM3MCwgdy1zaWRlXG4rICogYW5hbG9nKSBpbiB2dGltZSB1bml0cyB3aGVyZSAxcyA9PSAyXjM3LCBleHByZXNzZWQgd2l0aCB0aGUgc2FtZVxuKyAqIHJvdW5kLXVwIGRpdmlzaW9ucyBzbyB0aGV5IGNhbm5vdCBkcmlmdCBmcm9tIHRoZSBrZXJuZWwsIHNvIGFcbisgKiBkZXZpY2Ugc3dpdGNoZWQgdG8gY3RybD1icGYgd2l0aCB0aGlzIG1vZGVsIHJlZ2lzdGVyZWQgY2hhcmdlc1xuKyAqIGV4YWN0bHkgdHdpY2UgdGhlIGJ1aWx0aW4gbW9kZWwgdW5kZXIgdGhlIHNhbWUgd29ya2xvYWQsIHdoaWNoXG4rICogbWFrZXMgaXQgYSBjb252ZW5pZW50IHdheSB0byB2ZXJpZnkgdGhhdCBhY2NvdW50aW5nIGdvZXMgdGhyb3VnaFxuKyAqIHRoZSBCUEYgcGF0aC5cbisgKi9cbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuK1xuKy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXG4rI2RlZmluZSBJT0NfUEFHRV9TSVpFXHRcdDQwOTZcbisjZGVmaW5lIElPQ19TRUNUX1RPX1BBR0VfU0hJRlRcdDNcdC8qIDUxMkIgc2VjdG9ycyB0byA0a0IgcGFnZXMgKi9cbisjZGVmaW5lIExDT0VGX1JBTkRJT19QQUdFU1x0NDA5Nlx0LyogMTZNQiBzZWVrIHRocmVzaG9sZCAqL1xuKyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRVx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXG4rXG4rLyogRElWNjRfVTY0X1JPVU5EX1VQIC8gRElWX1JPVU5EX1VQX1VMTCBlcXVpdmFsZW50cywgZm9sZGVkIGF0XG4rICogY29tcGlsZSB0aW1lICovXG4rI2RlZmluZSBSVSh4LCB5KVx0XHQoKHgpIC8gKHkpICsgKCgoeCkgJSAoeSkpID8gMSA6IDApKVxuK1xuKyNkZWZpbmUgUkJQU1x0MTc0MDE5MTc2VUxMXG4rI2RlZmluZSBSU0VRSU9QU1x0NDE3MDhVTExcbisjZGVmaW5lIFJSQU5ESU9QU1x0MzcwVUxMXG4rI2RlZmluZSBXQlBTXHQxNzgwNzU4NjZVTExcbisjZGVmaW5lIFdTRVFJT1BTXHQ0MjcwNVVMTFxuKyNkZWZpbmUgV1JBTkRJT1BTXHQzNzhVTExcbitcbisjZGVmaW5lIFJQQUdFXHQoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKVxuKyNkZWZpbmUgUlNFUUlPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXG4rI2RlZmluZSBSUkFORElPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlJBTkRJT1BTKSAtIFJQQUdFKVxuKyNkZWZpbmUgV1BBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4rI2RlZmluZSBXU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcbisjZGVmaW5lIFdSQU5ESU9cdChSVShWVElNRV9QRVJfU0VDLCBXUkFORElPUFMpIC0gV1BBR0UpXG4rXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB1NjQgYnVpbHRpbl9jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbitcdFx0XHRcdFx0dTY0IGN1cnNvciwgdTY0IGZsYWdzKVxuK3tcbitcdHU2NCBwYWdlcywgc2Vla19wYWdlcyA9IDAsIGJhc2UsIGNvZWZfcGFnZTtcbitcbitcdGlmICghbmJ5dGVzKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHN3aXRjaCAob3ApIHtcbitcdGNhc2UgUkVRX09QX1JFQUQ6XG4rXHRcdGJhc2UgPSBSU0VRSU87XG4rXHRcdGNvZWZfcGFnZSA9IFJQQUdFO1xuK1x0XHRicmVhaztcbitcdGNhc2UgUkVRX09QX1dSSVRFOlxuK1x0XHRiYXNlID0gV1NFUUlPO1xuK1x0XHRjb2VmX3BhZ2UgPSBXUEFHRTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjdXJzb3IpIHtcbitcdFx0c2Vla19wYWdlcyA9IHNlY3RvciBcdTAwM2UgY3Vyc29yID8gc2VjdG9yIC0gY3Vyc29yXG4rXHRcdFx0XHRcdCAgICAgOiBjdXJzb3IgLSBzZWN0b3I7XG4rXHRcdHNlZWtfcGFnZXMgXHUwMDNlXHUwMDNlPSBJT0NfU0VDVF9UT19QQUdFX1NISUZUO1xuK1x0XHRpZiAoc2Vla19wYWdlcyBcdTAwM2UgTENPRUZfUkFORElPX1BBR0VTKVxuK1x0XHRcdGJhc2UgPSAob3AgPT0gUkVRX09QX1JFQUQpID8gUlJBTkRJTyA6IFdSQU5ESU87XG4rXHR9XG4rXG4rXHRwYWdlcyA9IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSk7XG4rXHRpZiAoZmxhZ3MgXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpXG4rXHRcdGJhc2UgPSAwO1xuK1x0cmV0dXJuIGJhc2UgKyBwYWdlcyAqIGNvZWZfcGFnZTtcbit9XG4rXG4rU0VDKFwic3RydWN0X29wc1wiKVxuK3U2NCBCUEZfUFJPRyhpb2Nvc3RfMnhfY2FsY19jb3N0LCB1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4rXHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXG4re1xuK1x0cmV0dXJuIDIgKiBidWlsdGluX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGZsYWdzKTtcbit9XG4rXG4rU0VDKFwiLnN0cnVjdF9vcHNcIilcbitzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfMnggPSB7XG4rXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfMnhfY2FsY19jb3N0LFxuK307XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDY1ZmQ1ZDVjNjJlMFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jXG5AQCAtMCwwICsxLDEyMiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbisvKlxuKyAqIEV4YW1wbGUgbXVsdGktc3RyZWFtIHNlcXVlbnRpYWxpdHkgZGV0ZWN0aW9uIGNvc3QgbW9kZWwuXG4rICpcbisgKiBUaGUgYnVpbHRpbiBtb2RlbCBrZWVwcyBhIHNpbmdsZSBjdXJzb3IgcGVyIGNncm91cCwgc28gdHdvXG4rICogaW50ZXJsZWF2ZWQgc2VxdWVudGlhbCByZWFkZXJzIGluIG9uZSBjZ3JvdXAgYXJlIGFsbCBwcmljZWQgcmFuZG9tXG4rICogKG1lYXN1cmVkIDg5eCBvdmVyY2hhcmdlLCAxMi45eCB0aHJvdWdocHV0IGNvbGxhcHNlKSwgd2hpbGUgcmFuZG9tXG4rICogSU8gaW5zaWRlIGEgaG90IHdpbmRvdyBzbWFsbGVyIHRoYW4gdGhlIDE2TUIgc2VlayB0aHJlc2hvbGQgaXNcbisgKiBwcmljZWQgc2VxdWVudGlhbCAobWVhc3VyZWQgMTA3eCB1bmRlcmNoYXJnZSkuICBUaGlzIG1vZGVsIHJlcGxhY2VzXG4rICogdGhlIHNpbmdsZSBjdXJzb3Igd2l0aCBhIHBlci1jZ3JvdXAgdGFibGUgb2Ygc3RyZWFtIHNsb3RzLCBrZXllZCBieVxuKyAqIHRoZSBpb2NnX2lkIGFyZ3VtZW50OiBhbiBJTyBpcyBzZXF1ZW50aWFsIGlmZiBpdHMgc2VjdG9yIG1hdGNoZXMgdGhlXG4rICogZXhwZWN0ZWQgbmV4dCBzZWN0b3Igb2YgYW55IHRyYWNrZWQgc3RyZWFtLiAgSW50ZXJsZWF2ZWQgc3RyZWFtc1xuKyAqIGtlZXAgdGhlaXIgb3duIHNsb3RzLCBhbmQgd2luZG93ZWQgcmFuZG9tIElPIHJhcmVseSBtYXRjaGVzIGFcbisgKiBtb3ZpbmcgZXhwZWN0YXRpb24uXG4rICovXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbitcbisvKiBWVElNRV9QRVJfU0VDIGNvbWVzIGZyb20gdm1saW51eC5oIChhIEJURiBlbnVtIGNvbnN0YW50KSAqL1xuKyNkZWZpbmUgSU9DX1BBR0VfU0laRVx0XHQ0MDk2XG4rI2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFXHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcdC8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi9cbitcbisvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcbisgKiBjb21waWxlIHRpbWUgKi9cbisjZGVmaW5lIFJVKHgsIHkpXHRcdCgoeCkgLyAoeSkgKyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXG4rXG4rI2RlZmluZSBSQlBTXHQxNzQwMTkxNzZVTExcbisjZGVmaW5lIFJTRVFJT1BTXHQ0MTcwOFVMTFxuKyNkZWZpbmUgUlJBTkRJT1BTXHQzNzBVTExcbisjZGVmaW5lIFdCUFNcdDE3ODA3NTg2NlVMTFxuKyNkZWZpbmUgV1NFUUlPUFNcdDQyNzA1VUxMXG4rI2RlZmluZSBXUkFORElPUFNcdDM3OFVMTFxuK1xuKyNkZWZpbmUgUlBBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShSQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4rI2RlZmluZSBSU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSlcbisjZGVmaW5lIFJSQU5ESU9cdChSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpXG4rI2RlZmluZSBXUEFHRVx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFdCUFMsIElPQ19QQUdFX1NJWkUpKSlcbisjZGVmaW5lIFdTRVFJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKVxuKyNkZWZpbmUgV1JBTkRJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSlcbitcbisjZGVmaW5lIE5TTE9UU1x0NFxuK1xuK3N0cnVjdCBzdHJlYW1zIHtcbitcdF9fdTY0IGV4cGVjdGVkW05TTE9UU107XHQvKiBuZXh0IGV4cGVjdGVkIHNlY3RvciwgcGVyIHN0cmVhbSAqL1xuK1x0X191NjQgc3RhbXBbTlNMT1RTXTtcdC8qIExSVSBzdGFtcCwgMCA9IGVtcHR5ICovXG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbitcdF9fdHlwZShrZXksIF9fdTY0KTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHN0cmVhbXMpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4rfSBzdHJlYW1fdGFiIFNFQyhcIi5tYXBzXCIpO1xuK1xuK1NFQyhcInN0cnVjdF9vcHNcIilcbit1NjQgQlBGX1BST0coaW9jb3N0X21zX2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxuK1x0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxuK3tcbitcdHN0cnVjdCBzdHJlYW1zICpzO1xuK1x0dTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdztcbitcdHUzMiBpLCB2aWN0aW0gPSAwLCBmb3VuZCA9IDB4RkZGRkZGRkY7XG4rXG4rXHRpZiAob3AgIT0gUkVRX09QX1JFQUQgXHUwMDI2XHUwMDI2IG9wICE9IFJFUV9PUF9XUklURSlcbitcdFx0cmV0dXJuIDA7XHQvKiBkZWxlZ2F0ZSB0aGUgcmVzdCB0byBidWlsdGluICovXG4rXHRpZiAoIW5ieXRlcylcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRpZiAob3AgPT0gUkVRX09QX1JFQUQpIHtcbitcdFx0cGFnZSA9IFJQQUdFOyBzZXFpbyA9IFJTRVFJTzsgcmFuZGlvID0gUlJBTkRJTztcbitcdH0gZWxzZSB7XG4rXHRcdHBhZ2UgPSBXUEFHRTsgc2VxaW8gPSBXU0VRSU87IHJhbmRpbyA9IFdSQU5ESU87XG4rXHR9XG4rXHRhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpO1x0Lyogc2VjdG9ycyAqL1xuK1xuK1x0cyA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2c3RyZWFtX3RhYiwgXHUwMDI2aW9jZ19pZCk7XG4rXHRpZiAoIXMpIHtcbitcdFx0c3RydWN0IHN0cmVhbXMgemVybyA9IHt9O1xuK1xuK1x0XHRicGZfbWFwX3VwZGF0ZV9lbGVtKFx1MDAyNnN0cmVhbV90YWIsIFx1MDAyNmlvY2dfaWQsIFx1MDAyNnplcm8sXG4rXHRcdFx0XHQgICAgQlBGX05PRVhJU1QpO1xuK1x0XHRzID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZzdHJlYW1fdGFiLCBcdTAwMjZpb2NnX2lkKTtcbitcdFx0aWYgKCFzKVxuK1x0XHRcdHJldHVybiBzZXFpbyArIFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlO1xuK1x0fVxuK1xuK1x0aWYgKGZsYWdzIFx1MDAyNiBJT0NPU1RfQ09TVF9GX01FUkdFKSB7XG4rXHRcdGJhc2UgPSAwO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5vdyA9IGJwZl9rdGltZV9nZXRfbnMoKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5TTE9UUzsgaSsrKSB7XG4rXHRcdGlmIChzLVx1MDAzZWV4cGVjdGVkW2ldID09IHNlY3RvciBcdTAwMjZcdTAwMjYgcy1cdTAwM2VzdGFtcFtpXSkge1xuK1x0XHRcdGZvdW5kID0gaTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0fVxuK1x0aWYgKGZvdW5kICE9IDB4RkZGRkZGRkYpIHtcbitcdFx0YmFzZSA9IHNlcWlvO1xuK1x0XHRzLVx1MDAzZWV4cGVjdGVkW2ZvdW5kXSA9IHNlY3RvciArIGFkdmFuY2U7XG4rXHRcdHMtXHUwMDNlc3RhbXBbZm91bmRdID0gbm93O1xuK1x0fSBlbHNlIHtcbitcdFx0YmFzZSA9IHJhbmRpbztcbitcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgTlNMT1RTOyBpKyspIHtcbitcdFx0XHRpZiAocy1cdTAwM2VzdGFtcFtpXSBcdTAwM2Mgcy1cdTAwM2VzdGFtcFt2aWN0aW1dKVxuK1x0XHRcdFx0dmljdGltID0gaTtcbitcdFx0fVxuK1x0XHRzLVx1MDAzZWV4cGVjdGVkW3ZpY3RpbV0gPSBzZWN0b3IgKyBhZHZhbmNlO1xuK1x0XHRzLVx1MDAzZXN0YW1wW3ZpY3RpbV0gPSBub3c7XG4rXHR9XG4rb3V0OlxuK1x0cmV0dXJuIGJhc2UgKyBSVShuYnl0ZXMsIElPQ19QQUdFX1NJWkUpICogcGFnZTtcbit9XG4rXG4rU0VDKFwiLnN0cnVjdF9vcHNcIilcbitzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfbXMgPSB7XG4rXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LFxuK307XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNjowOC43NTc0ODkxNDVaIiwiU2VxIjoxNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTY2MzMzMTA0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBLTVNBTiBGdXp6aW5nIE5lZWRzKipcblxuT2theSwgdGhlIHRhc2sgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2gsIGludHJvZHVjaW5nIEJQRiBzdHJ1Y3Rfb3BzIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIGJsay1pb2Nvc3QgKHNwZWNpZmljYWxseSB3aXRoIGBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGYCksIHJlcXVpcmVzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gTGV0J3MgZGlnIGluLlxuXG5UaGUgcGF0Y2ggdG91Y2hlcyBhIGdvb2QgY2h1bmsgb2YgY29kZTogZG9jdW1lbnRhdGlvbiwgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlIGluIHRoZSBibG9jayBzdWJzeXN0ZW0sIHRoZSBjb3JlIGlvY29zdCBCUEYgaW1wbGVtZW50YXRpb24gKGBibGstaW9jb3N0LWJwZi5jYCksIHRoZSBleGlzdGluZyBpb2Nvc3QgbG9naWMgKGBibGstaW9jb3N0LmNgKSwgaGVhZGVyIGZpbGVzIGZvciBrZXJuZWwgaW50ZXJmYWNlcyAoYGJsay1pb2Nvc3QuaGAgYW5kIHRyYWNlIGV2ZW50cyBgaW9jb3N0LmhgKSwgYW5kIHNlbGYgdGVzdHMuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBjaGFuZ2UsIHNvIHdlIG5lZWQgdG8gYmUgdGhvcm91Z2guXG5cbkZpcnN0LCBsZXQncyBsb29rIGZvciBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBgYmxrLWlvY29zdC1icGYuY2AgbG9va3MgbGlrZSB0aGUgcGxhY2UgdG8gc3RhcnQuIFRoZSBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgIGZ1bmN0aW9uIGlzIHRoZSBtYWluIGNhbmRpZGF0ZS4gSXQgdGFrZXMgc2NhbGFyIGFyZ3VtZW50cywgd2hpY2ggaXMgZ2VuZXJhbGx5IGEgZ29vZCBzaWduLiBJdCdzIHJldHVybmluZyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgc3VjY2VzcywgYW5kIHRoZW4gd3JpdGluZyB0aGUgcmVzdWx0IGludG8gYGNvc3RwYC4gSWYgYGlvY29zdF9icGZfY2FsY19jb3N0YCBmYWlscywgYSBkaWZmZXJlbnQgZnVuY3Rpb24gY2FsbGVkIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgaXMgY2FsbGVkLCBhbmQgYGJwZl9jb3N0YCB3aWxsIG5ldmVyIGJlIHVzZWQuIExvb2tzIGxpa2UgdGhlcmUgYXJlbid0IG9idmlvdXMgaXNzdWVzIHRoZXJlIGF0IGZpcnN0IGdsYW5jZS5cblxuTm93LCBsZXQncyB0dXJuIG91ciBhdHRlbnRpb24gdG8gYGJsay1pb2Nvc3QuY2AgYW5kIGhvdyBpdCBpbnRlZ3JhdGVzIHdpdGggdGhpcyBuZXcgQlBGIGZ1bmN0aW9uYWxpdHkuIFNwZWNpZmljYWxseSwgdGhlIGBjYWxjX3Z0aW1lX2Nvc3RgIGZ1bmN0aW9uLiBIZXJlJ3Mgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnM6IHRoZSBCUEYgZnVuY3Rpb24sIGlmIHByZXNlbnQsIGlzIGNhbGxlZC4gSXQgdXNlcyBgUkVBRF9PTkNFYCwgd2hpY2ggc2VlbXMgYXBwcm9wcmlhdGUuIElmIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAgcmV0dXJucyB0cnVlLCBpdCB1cGRhdGVzIGBicGZfY29zdGAsIG90aGVyd2lzZSwgaXQgY2FsbHMgYGNhbGNfdnRpbWVfY29zdF9idWlsdGluYC4gU28sIHRoZSBjb2RlcGF0aCBsb29rcyBzb3VuZC5cblxuVG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJ2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAuIEknbGwgdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBjYXJlZnVsbHkgZXhhbWluZSB0aGF0IGZ1bmN0aW9uIGFuZCBpdHMgc3Vycm91bmRpbmcgY29udGV4dC4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbHRpbiBjb3N0IGNhbGN1bGF0aW9uIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIEJQRiBjYWxjdWxhdGlvbiBkb2Vzbid0IGhhcHBlbiB3aXRob3V0IGFueSBpbml0aWFsaXphdGlvbiBwcm9ibGVtcy5cblxuQmFzZWQgb24gdGhpcyBxdWljayBhbmFseXNpcywgYW5kIGFzc3VtaW5nIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgaXMgYWxzbyBzYWZlLCBJICpzdXNwZWN0KiB0aGlzIHBhdGNoICptaWdodCBub3QqIGltbWVkaWF0ZWx5IHNjcmVhbSBcIk5lZWRzS01TQU49dHJ1ZS5cIiBIb3dldmVyLCB0aGUgaW50cm9kdWN0aW9uIG9mIEJQRiBhbHdheXMgd2FycmFudHMgZXh0cmEgc2NydXRpbnksIGJlY2F1c2Ugb2YgdGhlIHBvdGVudGlhbCBmb3IgY29tcGxleCBpbnRlcmFjdGlvbnMgYW5kIHN1YnRsZSBtZW1vcnkgaGF6YXJkcy4gSSdkIGxlYW4gdG93YXJkcyByZXF1aXJpbmcgZnVydGhlciByZXZpZXcgYW5kIHRlc3RpbmcsIGJ1dCBpdCdzIG5vdCBhIHNsYW0gZHVuayBcInllc1wiIGZvciBLTVNBTiBmdXp6aW5nICp5ZXQqLiBJJ2xsIG5lZWQgdG8gY29uZmlybSBteSB1bmRlcnN0YW5kaW5nIG9mIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgdG8gbWFrZSBhIGZpbmFsIGNhbGwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNjQzLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODE4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MTQuNDIwODIyNDE5WiIsIlNlcSI6MTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTkxNzc1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJibG9jay9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYmxvY2svYmxrLWlvY29zdC5jPTI0NzM9c3RhdGljIHU2NCBhZGp1c3RfaW51c2VfYW5kX2NhbGNfY29zdChzdHJ1Y3QgaW9jX2dxICppb2NnLCB1NjQgdnRpbWUsXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmMtMjUzMy1cXG5ibG9jay9ibGstaW9jb3N0LmM6MjUzNDpzdGF0aWMgdm9pZCBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbihzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBpb2NfZ3EgKmlvY2csXFxuYmxvY2svYmxrLWlvY29zdC5jLTI1MzUtXFx0XFx0XFx0XFx0ICAgIGJvb2wgaXNfbWVyZ2UsIHU2NCAqY29zdHApXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmM9MjU3OT1zdGF0aWMgdTY0IGNhbGNfdnRpbWVfY29zdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBpb2NfZ3EgKmlvY2csIGJvb2wgaXNfbWVyZ2UpXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmMtMjU5OS1cXG5ibG9jay9ibGstaW9jb3N0LmM6MjYwMDpcXHRjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbihiaW8sIGlvY2csIGlzX21lcmdlLCBcXHUwMDI2Y29zdCk7XFxuYmxvY2svYmxrLWlvY29zdC5jLTI2MDEtXFx0cmV0dXJuIGNvc3Q7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDExOjM2OjE0LjQ2Njc0NzIyOFoiLCJTZXEiOjE3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MjE0NjIzNjI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSU9Db3N0IFRyYWNlcG9pbnQgYW5kIE1vZGVsKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nIHdpdGggYHRyYWNlX2lvY29zdF9pb2NfdGlja2AgYW5kIGl0cyBhc3NvY2lhdGVkIGFkZGl0aW9ucy4gTG9va2luZyBhdCBgaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhgLCBJIHNlZSB0aGUgdHJhY2Vwb2ludCBkZWZpbml0aW9uLiBJdCdzIGNhcHR1cmluZyBzZXZlcmFsIGtleSBwaWVjZXMgb2YgaW5mb3JtYXRpb246IHRoZSBkZXZpY2UgbmFtZSwgdGhlIHBlcmlvZCBpbiBtaWNyb3NlY29uZHMsIHRoZSB2aXJ0dWFsIHJhdGUsIHRoZSBidXN5IGxldmVsLCBudW1iZXIgb2YgYWN0aXZlIHJlcXVlc3RzLCB1c2FnZSBwZXJjZW50YWdlLCBhbmQgYSAncnVubmluZycgZmxhZy4gSSBub3RpY2UgdGhhdCBhbGwgb2YgdGhlc2UgZmllbGRzIGFyZSBleHBsaWNpdGx5IGFzc2lnbmVkLCB3aGljaCBpcyBnb29kIGZvciBjbGFyaXR5IGFuZCBjb250cm9sLlxuXG5Ob3csIGxldCdzIHNoaWZ0IGdlYXJzIGFuZCBsb29rIGF0IGhvdyB0aGUgY29zdCBtb2RlbCBpcyBiZWluZyBwb3B1bGF0ZWQsIHNwZWNpZmljYWxseSB3aXRoIGBpb2NfY29zdF9tb2RlbF9wcmZpbGxgLiBUaGlzIGNvZGUgc25pcHBldCB1c2VzIGBzZXFfcHJpbnRmYCB0byBvdXRwdXQgY29zdCBtb2RlbCBwYXJhbWV0ZXJzLiBJIHNlZSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZGV0ZXJtaW5pbmcgdGhlIFwiY3RybFwiIHZhbHVlIOKAkyBpdCdzIGJhc2VkIG9uIGBpb2MtXHUwMDNlYnBmX2Nvc3RfbW9kZWxgIGFuZCBgaW9jLVx1MDAzZXVzZXJfY29zdF9tb2RlbGAuIEFoLCBzbyBgaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsYCBpcyBhIGJvb2xlYW4gdmFsdWUsIHNldCB2aWEgYFdSSVRFX09OQ0VgLiBUaGlzIHRlbGxzIG1lIHdoZXRoZXIgd2UncmUgdXNpbmcgYSBCUEYtYmFzZWQgY29zdCBtb2RlbCBvciBub3QuXG5cbkkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBsaWZlY3ljbGUgb2YgdGhlIGBzdHJ1Y3QgaW9jYCBpdHNlbGYuIEkga25vdyBpdCdzIGFsbG9jYXRlZC4gSSBuZWVkIHRvIHZlcmlmeSBleGFjdGx5IGhvdyB0aGF0IGFsbG9jYXRpb24gaGFwcGVucy4gSSBzaG91bGQgY2hlY2sgYGlvY19pbml0YCBvciBgaW9jb3N0X2luaXRgIHRvIGNvbmZpcm0gbXkgYXNzdW1wdGlvbiB0aGF0IGl0J3MgYmVpbmcgemVyb2VkIG91dCB3aXRoIGBremFsbG9jYC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBgaW9jYCBzdHJ1Y3QgaXMgaGFuZGxlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQzODIsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MTguNjgxMzczNzQzWiIsIlNlcSI6MTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTA3MjE3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJremFsbG9jLippb2NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYmxvY2svXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImJsb2NrL2Jsay1pb2Nvc3QuYz0yOTM5PXN0YXRpYyBpbnQgYmxrX2lvY29zdF9pbml0KHN0cnVjdCBnZW5kaXNrICpkaXNrKVxcbi0tXFxuYmxvY2svYmxrLWlvY29zdC5jLTI5NDMtXFxuYmxvY2svYmxrLWlvY29zdC5jOjI5NDQ6XFx0aW9jID0ga3phbGxvY19vYmooKmlvYyk7XFxuYmxvY2svYmxrLWlvY29zdC5jLTI5NDUtXFx0aWYgKCFpb2MpXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmM9MzAwND1zdGF0aWMgc3RydWN0IGJsa2NnX3BvbGljeV9kYXRhICppb2NfY3BkX2FsbG9jKGdmcF90IGdmcClcXG4tLVxcbmJsb2NrL2Jsay1pb2Nvc3QuYy0zMDA3LVxcbmJsb2NrL2Jsay1pb2Nvc3QuYzozMDA4OlxcdGlvY2MgPSBremFsbG9jX29iaihzdHJ1Y3QgaW9jX2NncnAsIGdmcCk7XFxuYmxvY2svYmxrLWlvY29zdC5jLTMwMDktXFx0aWYgKCFpb2NjKVxcbi0tXFxuYmxvY2svYmxrLWlvY29zdC5jPTMwMjE9c3RhdGljIHN0cnVjdCBibGtnX3BvbGljeV9kYXRhICppb2NfcGRfYWxsb2Moc3RydWN0IGdlbmRpc2sgKmRpc2ssXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmMtMzAyNi1cXG5ibG9jay9ibGstaW9jb3N0LmM6MzAyNzpcXHRpb2NnID0ga3phbGxvY19ub2RlKHN0cnVjdF9zaXplKGlvY2csIGFuY2VzdG9ycywgbGV2ZWxzKSwgZ2ZwLFxcbmJsb2NrL2Jsay1pb2Nvc3QuYy0zMDI4LVxcdFxcdFxcdCAgICBkaXNrLVxcdTAwM2Vub2RlX2lkKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MTguNzMwNDU3NTgzWiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjk5ODc1Nzg0NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQXNzZXNzbWVudDogYmxrLWlvY29zdCBCUEYgU3RydWN0X09wcyBTdXBwb3J0KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBzZWUgYGlvY2AgaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5IHVzaW5nIGBremFsbG9jX29iamAuIFRoZSBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgIGZ1bmN0aW9uIGxvb2tzIHNvdW5kLCB3aXRoIHByb3BlciBsb2NraW5nIGFuZCBpbml0aWFsaXphdGlvbiBvZiBgdXNlcmAgYW5kIGBicGZgIGZsYWdzIGJhc2VkIG9uIGlucHV0IHN0cmluZ3MgKFwiYXV0b1wiLCBcInVzZXJcIiwgXCJicGZcIikuIFRoZSBCUEYgbG9naWMgaXMgY29uZGl0aW9uYWxseSBlbmFibGVkIHdpdGggYENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZgLCBhbmQgdGhlIGZpbmFsIGBXUklURV9PTkNFYCBlbnN1cmVzIGF0b21pYyB1cGRhdGUgb2YgYGlvYy1cdTAwM2VicGZfY29zdF9tb2RlbGAuIEV2ZXJ5dGhpbmcgc2VlbXMgd2VsbC1zdHJ1Y3R1cmVkIGF0IHRoaXMgbGV2ZWwuXG5cbk5vdywgb24gdG8gdGhlIEJQRiBzdHJ1Y3Rfb3BzIHJlZ2lzdHJhdGlvbiBpbiBgYmxvY2svYmxrLWlvY29zdC1icGYuY2AuIGBicGZfaW9jb3N0X21vZGVsX29wc2AgaXMgYSBzdGF0aWMgc3RydWN0LCBhbmQgdGhlIHJlZ2lzdHJhdGlvbiBsb2dpYyB3aXRoIGBtdXRleF9sb2NrYCwgYHJjdV9hc3NpZ25fcG9pbnRlcmAsIGFuZCBgc3RhdGljX2JyYW5jaF9pbmNgIGxvb2tzIHN0YW5kYXJkIGFuZCBzYWZlLCB1dGlsaXppbmcgUkNVIHByb3Blcmx5LiBgbmV3X29wc2AgaXMgcGFzc2VkIGluIGFzIGEgcG9pbnRlci5cblxuTXkgZm9jdXMgbm93IHNoaWZ0cyB0byBwb3RlbnRpYWwgS01TQU4gaXNzdWVzIOKAkyBpbmZvIGxlYWtzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBJJ20gYWN0aXZlbHkgbG9va2luZyBmb3IgYW55IHNjZW5hcmlvIHdoZXJlIHVuaW5pdGlhbGl6ZWQga2VybmVsIGRhdGEgY291bGQgbGVhayB0byB1c2Vyc3BhY2UuIEkndmUgZ290IHRvIGJlIGV4dHJhIHRob3JvdWdoIGhlcmUuXG5cbjEuICAqKktlcm5lbC10by1Vc2Vyc3BhY2UgTGVha3M6KiogSSBzZWUgbm8gZGlyZWN0IGV4cG9zdXJlIG9mIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSB2aWEgYGNvcHlfdG9fdXNlcmAsIGBwdXRfdXNlcmAsIHNvY2tldCBvcHRpb25zLCBldGMuLCB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzLiBUaGUgb3V0cHV0cyBhcmUgYWxsIHZpYSBzYWZlIG1ldGhvZHMgLSBzZXFcXF9maWxlIGZvcm1hdHRpbmcsIHRyYWNlcG9pbnRzIHdpdGggZXhwbGljaXQgZmllbGRzLCBhbmQgc3RhbmRhcmQgc3RydWN0XFxfb3BzIHJlZ2lzdHJhdGlvbiwgd2hpY2ggYXJlIGNoZWNrZWQuXG4yLiAgKipVbmluaXRpYWxpemVkIFZhcmlhYmxlIEJyYW5jaGluZzoqKiBUaGUgY29kZSBjaGVja3MgYXJlIGFsbCBleHBsaWNpdC4gQWxsIHZhcmlhYmxlcyBsaWtlIGBicGZgLCBgdXNlcmAsIGByZXRgLCBgY29zdGAgYXJlIGluaXRpYWxpemVkIGJlZm9yZSBhbnkgdXNlLlxuMy4gICoqQ29tcGxleCBEYXRhIFN0cnVjdHVyZXM6KiogQWxsIGFsbG9jYXRpb25zIGxvb2sgbGlrZSB0aGV5IGFyZSB6ZXJvZWQuXG40LiAgKipCdWZmZXIgQm91bmQgQ2hlY2tzOioqIFRoZSBidWZmZXIgYm91bmRzIGNoZWNrcyBkb24ndCBzZWVtIGxpa2UgdGhleSBhcmUgbW9kaWZpZWQgaW4gYSB3YXkgdGhhdCB3b3VsZCBsZWFkIHRvIGV4cG9zaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuXG5cblNvLCB0aGlzIGxvb2tzIHByZXR0eSBjbGVhbi5cblxuV2hhdCBhYm91dCBvdGhlciBidWcgY2xhc3Nlcz8gQ29uY3VycmVuY3kgaXNzdWVzIHdpdGggUkNVL211dGV4L3N0YXRpYyBrZXlzIGFyZSBhIHBvc3NpYmlsaXR5LCBidXQgTE9DS0RFUCwgS0FTQU4sIGFuZCBUU0FOIHNob3VsZCBjYXRjaCB0aG9zZS4gTlVMTCBkZXJlZmVyZW5jZXMgb3IgbG9naWMgYnVncyBjb3VsZCBzdGlsbCBzbmVhayB0aHJvdWdoLCBidXQgdGhlIHN0YW5kYXJkIGtlcm5lbCBjaGVja3MgYW5kIEtBU0FOIHdpbGwgYmUgdmVyeSBlZmZlY3RpdmUgaGVyZS4gQW55IEJQRiB2ZXJpZmllciBvciBzdHJ1Y3RcXF9vcHMgaW50ZXJhY3Rpb24gYnVncyBhcmUgYWxzbyBjb3ZlcmVkIGJ5IGV4aXN0aW5nIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTi5cblxuSSdtIHN0YXJ0aW5nIHRvIGZlZWwgY29uZmlkZW50LCBidXQgbGV0J3MgZG91YmxlLWNoZWNrIGV2ZXJ5dGhpbmcuIGBpbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaGAgaXMganVzdCBkZWNsYXJhdGlvbnMuIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYCBsb29rcyB2ZXJ5IGNsZWFuLCB3aXRoIHNjYWxhciBhcmd1bWVudHMgcGFzc2VkIGJ5IHZhbHVlIHRvIHRoZSBCUEYgcHJvZ3JhbSwgYW5kIHRoZSBgdTY0IGNvc3RgIGlzIHRob3JvdWdobHkgY2hlY2tlZC4gVGhlIGB0cmFjZV9pb2Nvc3RfaW9jX3RpY2tgIGZ1bmN0aW9uIGlzIGFzc2lnbmluZyBhbGwgZmllbGRzIGZyb20gc2NhbGFyIHZhcmlhYmxlcyBhbmQgYGlvY2AgZmllbGRzLCB3aGljaCBpcyBnb29kLiBUaGUgYnVpbGQgYW5kIGRvYyBjaGFuZ2VzIGluIGBEb2N1bWVudGF0aW9uL2AsIGBibG9jay9LY29uZmlnYCwgYW5kIGBibG9jay9NYWtlZmlsZWAgc2VlbSBzdGFuZGFyZC4gVGhlIHVzZXJzcGFjZSBzZWxmLXRlc3RzIGFyZSBwcmVzZW50IGFuZCB3ZWxsLWRlZmluZWQuXG5cblRoZXJlZm9yZSwgbXkgY29uY2x1c2lvbiBpcyBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cbkhlcmUncyBteSBjbGVhciBLTVNBTiByZWFzb25pbmc6XG5cbiogICBUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0XFxfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIGJsay1pb2Nvc3QsIGVuYWJsaW5nIGR5bmFtaWMgdnRpbWUgY29zdCBjYWxjdWxhdGlvbiB2aWEgYSBCUEYgcHJvZ3JhbS4gSXQgYWxzbyBhZGRzIGEgdHJhY2Vwb2ludCBhbmQgdXBkYXRlcyBjb3N0IG1vZGVsIGNvbnRyb2wgbG9naWMuXG4qICAgS01TQU4gaXMgZGVzaWduZWQgdG8gZGV0ZWN0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIGFuZCBrZXJuZWwtdG8tdXNlciBpbmZvIGxlYWtzLiBJbiB0aGlzIHBhdGNoLCBhbGwgbmV3IHN0cnVjdHVyZXMsIGxvY2FsIHZhcmlhYmxlcywgYW5kIHRyYWNlcG9pbnQgZmllbGRzIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLiBCUEYgc3RydWN0XFxfb3BzIGZ1bmN0aW9ucyB0YWtlIHNjYWxhciB2YWx1ZXMgcGFzc2VkIGJ5IHZhbHVlLCBhbmQgdGhlIG91dHB1dCBgYnBmX2Nvc3RgIGlzIHdyaXR0ZW4gZGlyZWN0bHkgYW5kIGNoZWNrZWQgYmVmb3JlIGJlaW5nIHJldHVybmVkLiBObyBrZXJuZWwgbWVtb3J5IGlzIGV4cG9zZWQgdG8gdXNlciBzcGFjZSB3aXRob3V0IGluaXRpYWxpemF0aW9uLlxuKiAgIFRoZSBwcmltYXJ5IGNvbmNlcm5zIGhlcmUgYXJlIGNvbmN1cnJlbmN5L2xvY2tpbmcgc3luY2hyb25pemF0aW9uIChSQ1UsIG11dGV4LCBhbmQgc3RhdGljIGtleXMpIGFuZCBwb3RlbnRpYWwgbG9naWMgYnVncyBvciBpbnZhbGlkIGRlcmVmZXJlbmNlcy4gVGhlc2UgY29uY2VybnMgYXJlIGFscmVhZHkgYWRkcmVzc2VkIGJ5IHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi5cbiogICBUaHVzLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGRhdGEgbGVha3MsIHNvIHRoaXMgcGF0Y2ggZG9lcyAqbm90KiBuZWVkIEtNU0FOLlxuXG5MZXQncyBsb2cgdGhpcyBhcyBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1NzA5LCJPdXRwdXRUb2tlbnMiOjM2MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExNjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MjguNzE4MDM5OTJaIiwiU2VxIjoyMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjcyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdF9vcHMgc3VwcG9ydCAoYGlvY29zdF9tb2RlbF9vcHNgKSBmb3IgdGhlIGJsay1pb2Nvc3QgSS9PIGNncm91cCBjb250cm9sbGVyLCBhbGxvd2luZyBwbHVnZ2FibGUgQlBGLWJhc2VkIGNvc3QgY2FsY3VsYXRpb24sIGFkZHMgYSBuZXcgdHJhY2Vwb2ludCAoYGlvY29zdF9pb2NfdGlja2ApLCBhbmQgdXBkYXRlcyB0aGUgY2dyb3VwIHYyIGBpby5jb3N0Lm1vZGVsYCBpbnRlcmZhY2UuXFxuXFxuQW5hbHlzaXMgcmVnYXJkaW5nIHNhbml0aXplcnM6XFxuMS4gS01TQU4gYXBwbGljYWJpbGl0eTpcXG4tIEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSBhbmQga2VybmVsLXRvLXVzZXIgaW5mb3JtYXRpb24gbGVha3MuXFxuLSBJbiB0aGlzIHBhdGNoLCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIHBhc3NlZCB0byBgaW9jb3N0X2JwZl9jYWxjX2Nvc3QoKWAgYW5kIHRoZSBCUEYgc3RydWN0X29wcyBjYWxsYmFjayBhcmUgc2NhbGFyIGludGVnZXIgdmFsdWVzIHBhc3NlZCBieSB2YWx1ZS5cXG4tIE91dHB1dCBwb2ludGVycyAoc3VjaCBhcyBgKmNvc3RwYCBpbiBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgKSBhcmUgd3JpdHRlbiBiZWZvcmUgcmV0dXJuLCBhbmQgYWxsIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiBgYnBmYCwgYHVzZXJgLCBgY29zdGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBwcmlvciB0byBicmFuY2hpbmcgb3IgdXNlLlxcbi0gVGhlIG5ldyB0cmFjZXBvaW50IGBpb2Nvc3RfaW9jX3RpY2tgIGV4cGxpY2l0bHkgYXNzaWducyBhbGwgZmllbGRzIGluIGBUUF9mYXN0X2Fzc2lnbmAuXFxuLSBObyBzdHJ1Y3RzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgaGVhcCBhbGxvY2F0aW9ucyBhcmUgY29waWVkIHRvIHVzZXJzcGFjZS5cXG5cXG4yLiBLQVNBTiAvIExPQ0tERVAgYXBwbGljYWJpbGl0eTpcXG4tIFBvdGVudGlhbCByaXNrcyBpbiB0aGlzIHBhdGNoIHJldm9sdmUgYXJvdW5kIGNvbmN1cnJlbmN5IChzeW5jaHJvbml6YXRpb24gb2YgYGlvY29zdF9icGZfbW9kZWxgIHZpYSBSQ1UsIG11dGV4ZXMsIGFuZCBzdGF0aWMga2V5cykgb3IgbG9naWMvYm91bmRzIGVycm9ycywgd2hpY2ggYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQga2VybmVsIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi5cXG5cXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIHRoZSBibGstaW9jb3N0IEkvTyBjZ3JvdXAgY29udHJvbGxlciwgYWxsb3dpbmcgcGx1Z2dhYmxlIEJQRi1iYXNlZCBjb3N0IGNhbGN1bGF0aW9uLCBhZGRzIGEgbmV3IHRyYWNlcG9pbnQgKGBpb2Nvc3RfaW9jX3RpY2tgKSwgYW5kIHVwZGF0ZXMgdGhlIGNncm91cCB2MiBgaW8uY29zdC5tb2RlbGAgaW50ZXJmYWNlLlxcblxcbkFuYWx5c2lzIHJlZ2FyZGluZyBzYW5pdGl6ZXJzOlxcbjEuIEtNU0FOIGFwcGxpY2FiaWxpdHk6XFxuLSBLTVNBTiBkZXRlY3RzIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgYW5kIGtlcm5lbC10by11c2VyIGluZm9ybWF0aW9uIGxlYWtzLlxcbi0gSW4gdGhpcyBwYXRjaCwgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gYGlvY29zdF9icGZfY2FsY19jb3N0KClgIGFuZCB0aGUgQlBGIHN0cnVjdF9vcHMgY2FsbGJhY2sgYXJlIHNjYWxhciBpbnRlZ2VyIHZhbHVlcyBwYXNzZWQgYnkgdmFsdWUuXFxuLSBPdXRwdXQgcG9pbnRlcnMgKHN1Y2ggYXMgYCpjb3N0cGAgaW4gYGlvY29zdF9icGZfY2FsY19jb3N0YCkgYXJlIHdyaXR0ZW4gYmVmb3JlIHJldHVybiwgYW5kIGFsbCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4gYGJwZmAsIGB1c2VyYCwgYGNvc3RgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gYnJhbmNoaW5nIG9yIHVzZS5cXG4tIFRoZSBuZXcgdHJhY2Vwb2ludCBgaW9jb3N0X2lvY190aWNrYCBleHBsaWNpdGx5IGFzc2lnbnMgYWxsIGZpZWxkcyBpbiBgVFBfZmFzdF9hc3NpZ25gLlxcbi0gTm8gc3RydWN0cyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGhlYXAgYWxsb2NhdGlvbnMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UuXFxuXFxuMi4gS0FTQU4gLyBMT0NLREVQIGFwcGxpY2FiaWxpdHk6XFxuLSBQb3RlbnRpYWwgcmlza3MgaW4gdGhpcyBwYXRjaCByZXZvbHZlIGFyb3VuZCBjb25jdXJyZW5jeSAoc3luY2hyb25pemF0aW9uIG9mIGBpb2Nvc3RfYnBmX21vZGVsYCB2aWEgUkNVLCBtdXRleGVzLCBhbmQgc3RhdGljIGtleXMpIG9yIGxvZ2ljL2JvdW5kcyBlcnJvcnMsIHdoaWNoIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLCBMT0NLREVQLCBhbmQgS0FTQU4uXFxuXFxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflow6wrsh[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-08 11:15:40 +0000 UTC FinishedAt: 2026-09-08 11:36:30 +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": "944a035ecca915ae947905dcfb03f2b9dc6d032c", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BLK_CGROUP_IOCOST_BPF", "BLK_CGROUP_IOCOST", "BLK_CGROUP", "BPF_SYSCALL", "BPF_JIT" ], "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": "944a035ecca915ae947905dcfb03f2b9dc6d032c", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BLK_CGROUP_IOCOST_BPF", "BLK_CGROUP_IOCOST", "BLK_CGROUP", "BPF_SYSCALL", "BPF_JIT" ], "series_id": "da43f7cc-b8ea-45e2-898a-52699aaec518" }, "track": "KASAN", "fuzz": { "focus": [ "bpf", "fs" ], "focus_symbols": [ "iocost_bpf_calc_cost", "bpf_iocost_reg", "bpf_iocost_unreg", "ioc_cost_model_write", "ioc_cost_model_prfill", "calc_vtime_cost" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVBfSU9DT1NUX0JQRiYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVCYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpb2Nvc3RfYnBmX2NhbGNfY29zdCYjMzQ7LAogICAgJiMzNDticGZfaW9jb3N0X3JlZyYjMzQ7LAogICAgJiMzNDticGZfaW9jb3N0X3VucmVnJiMzNDssCiAgICAmIzM0O2lvY19jb3N0X21vZGVsX3dyaXRlJiMzNDssCiAgICAmIzM0O2lvY19jb3N0X21vZGVsX3ByZmlsbCYjMzQ7LAogICAgJiMzNDtjYWxjX3Z0aW1lX2Nvc3QmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIHRoZSBibGstaW9jb3N0IEkvTyBjZ3JvdXAgY29udHJvbGxlciwgYWxsb3dpbmcgcGx1Z2dhYmxlIEJQRi1iYXNlZCBjb3N0IGNhbGN1bGF0aW9uLCBhZGRzIGEgbmV3IHRyYWNlcG9pbnQgKGBpb2Nvc3RfaW9jX3RpY2tgKSwgYW5kIHVwZGF0ZXMgdGhlIGNncm91cCB2MiBgaW8uY29zdC5tb2RlbGAgaW50ZXJmYWNlLlxuXG5BbmFseXNpcyByZWdhcmRpbmcgc2FuaXRpemVyczpcbjEuIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4tIEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSBhbmQga2VybmVsLXRvLXVzZXIgaW5mb3JtYXRpb24gbGVha3MuXG4tIEluIHRoaXMgcGF0Y2gsIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgcGFzc2VkIHRvIGBpb2Nvc3RfYnBmX2NhbGNfY29zdCgpYCBhbmQgdGhlIEJQRiBzdHJ1Y3Rfb3BzIGNhbGxiYWNrIGFyZSBzY2FsYXIgaW50ZWdlciB2YWx1ZXMgcGFzc2VkIGJ5IHZhbHVlLlxuLSBPdXRwdXQgcG9pbnRlcnMgKHN1Y2ggYXMgYCpjb3N0cGAgaW4gYGlvY29zdF9icGZfY2FsY19jb3N0YCkgYXJlIHdyaXR0ZW4gYmVmb3JlIHJldHVybiwgYW5kIGFsbCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4gYGJwZmAsIGB1c2VyYCwgYGNvc3RgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gYnJhbmNoaW5nIG9yIHVzZS5cbi0gVGhlIG5ldyB0cmFjZXBvaW50IGBpb2Nvc3RfaW9jX3RpY2tgIGV4cGxpY2l0bHkgYXNzaWducyBhbGwgZmllbGRzIGluIGBUUF9mYXN0X2Fzc2lnbmAuXG4tIE5vIHN0cnVjdHMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBoZWFwIGFsbG9jYXRpb25zIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLlxuXG4yLiBLQVNBTiAvIExPQ0tERVAgYXBwbGljYWJpbGl0eTpcbi0gUG90ZW50aWFsIHJpc2tzIGluIHRoaXMgcGF0Y2ggcmV2b2x2ZSBhcm91bmQgY29uY3VycmVuY3kgKHN5bmNocm9uaXphdGlvbiBvZiBgaW9jb3N0X2JwZl9tb2RlbGAgdmlhIFJDVSwgbXV0ZXhlcywgYW5kIHN0YXRpYyBrZXlzKSBvciBsb2dpYy9ib3VuZHMgZXJyb3JzLCB3aGljaCBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBrZXJuZWwgYnVnIGRldGVjdG9ycywgTE9DS0RFUCwgYW5kIEtBU0FOLlxuXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMgaW4gdGhlIGJsb2NrIGlvY29zdCBjZ3JvdXAgY29udHJvbGxlciAoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRikuIEl0IGFkZHMgc3RydWN0X29wcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBpbnRlZ3JhdGVzIGR5bmFtaWMgQlBGIGNvc3QgY2FsY3VsYXRpb24gaW50byB0aGUgYmlvIHN1Ym1pc3Npb24gcGF0aCwgYW5kIGV4dGVuZHMgdGhlIGNncm91cCBpby5jb3N0Lm1vZGVsIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLiBUaGUgY29kZSBpcyBmdWxseSByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBjZ3JvdXBzIGFuZCB0aGUgQlBGIHN1YnN5c3RlbS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDM0ZWM1MDE2OTJhN2JkZWQzZGNiMTU2Yjg0Y2FiNGQ1ODg4MzU2ZjRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIFNlcCA4IDExOjM1OjQzIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuaW5kZXggOGQyNjAzNzUxYzUxYS4uNTRiMDU3NGNlNTg2YyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0XG5AQCAtMjExNSwxMCAmIzQzOzIxMTUsMjQgQEAgSU8gSW50ZXJmYWNlIEZpbGVzXG4gXHRhcmUgZGVmaW5lZC5cbiBcbiBcdCAgPT09PT1cdFx0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi1cdCAgY3RybFx0XHRcJiMzNDthdXRvXCYjMzQ7IG9yIFwmIzM0O3VzZXJcJiMzNDtcbiYjNDM7XHQgIGN0cmxcdFx0XCYjMzQ7YXV0b1wmIzM0OywgXCYjMzQ7dXNlclwmIzM0OyBvciBcJiMzNDticGZcJiMzNDtcbiBcdCAgbW9kZWxcdFx0VGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gXCYjMzQ7bGluZWFyXCYjMzQ7XG4gXHQgID09PT09XHRcdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gXG4mIzQzO1x0V2hlbiBcJiMzNDtjdHJsXCYjMzQ7IGlzIFwmIzM0O2JwZlwmIzM0OyAob25seSBhdmFpbGFibGUgd2hlblxuJiM0MztcdENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYgaXMgZW5hYmxlZCksIGNvc3QgY2FsY3VsYXRpb24gZm9yXG4mIzQzO1x0dGhlIGRldmljZSBpcyBkaXNwYXRjaGVkIHRvIHRoZSBCUEYgcHJvZ3JhbSByZWdpc3RlcmVkIGFnYWluc3RcbiYjNDM7XHR0aGUgaW9jb3N0X21vZGVsX29wcyBzdHJ1Y3Rfb3BzLiAgV3JpdGluZyBcJiMzNDticGZcJiMzNDsgZmFpbHMgd2l0aCAtRUlOVkFMXG4mIzQzO1x0dW50aWwgc3VjaCBhIHByb2dyYW0gaXMgcmVnaXN0ZXJlZCwgYW5kIGF0IG1vc3Qgb25lIHByb2dyYW0gY2FuXG4mIzQzO1x0YmUgcmVnaXN0ZXJlZCBzeXN0ZW0td2lkZS4gIFRoZSBtb2RlbCBpcyBjYWxsZWQgd2l0aCBzY2FsYXJcbiYjNDM7XHRhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlXG4mIzQzO1x0aXNzdWluZyBjZ3JvdXAsIGZsYWdzOyBzZWUgaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmggZm9yIHRoZWlyXG4mIzQzO1x0bWVhbmluZykgYW5kIHJldHVybnMgYSBjb3N0IGluIHZ0aW1lIHVuaXRzLCBjbGFtcGVkIGJ5IHRoZSBrZXJuZWxcbiYjNDM7XHR0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlc1xuJiM0MztcdHRoZSBJTyBiYWNrIHRvIHRoZSBidWlsdGluIGxpbmVhciBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIG9ubHlcbiYjNDM7XHRoYW5kbGVzIHNvbWUgSU8gdHlwZXMgY2Fubm90IG1ha2UgdGhlIHJlc3QgZnJlZS4gIERldmljZXMgd2hpY2hcbiYjNDM7XHRkb24mIzM5O3Qgb3B0IGluIGtlZXAgdGhlIGJ1aWx0aW4gbGluZWFyIG1vZGVsIHVuY2hhbmdlZC5cbiYjNDM7XG4gXHRXaGVuIFwmIzM0O2N0cmxcJiMzNDsgaXMgXCYjMzQ7YXV0b1wmIzM0OywgdGhlIGtlcm5lbCBtYXkgY2hhbmdlIGFsbCBwYXJhbWV0ZXJzXG4gXHRkeW5hbWljYWxseS4gIFdoZW4gXCYjMzQ7Y3RybFwmIzM0OyBpcyBzZXQgdG8gXCYjMzQ7dXNlclwmIzM0OyBvciBhbnkgb3RoZXJcbiBcdHBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gdG8sIFwmIzM0O2N0cmxcJiMzNDsgYmVjb21lIFwmIzM0O3VzZXJcJiMzNDsgYW5kIHRoZVxuZGlmZiAtLWdpdCBhL2Jsb2NrL0tjb25maWcgYi9ibG9jay9LY29uZmlnXG5pbmRleCA3MGU0YTY2ZDk0MWZmLi5iZjQzYmUyMWUwMGJiIDEwMDY0NFxuLS0tIGEvYmxvY2svS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svS2NvbmZpZ1xuQEAgLTIzMSw0ICYjNDM7MjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OXG4gXG4gc291cmNlIFwmIzM0O2Jsb2NrL0tjb25maWcuaW9zY2hlZFwmIzM0O1xuIFxuJiM0Mztjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4mIzQzO1x0Ym9vbCBcJiMzNDtFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXJcJiMzNDtcbiYjNDM7XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBfSU9DT1NUIFx1MDAyNlx1MDAyNiBCUEZfU1lTQ0FMTCBcdTAwMjZcdTAwMjYgQlBGX0pJVFxuJiM0MztcdGhlbHBcbiYjNDM7XHQgRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVnaXN0ZXJzIHRoZSBcJiMzNDtpb2Nvc3RfbW9kZWxfb3BzXCYjMzQ7IEJQRlxuJiM0MztcdCBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlXG4mIzQzO1x0IGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGhcbiYjNDM7XHQgXCYjMzQ7Y3RybD1icGZcJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLlxuJiM0MztcbiBlbmRpZiAjIEJMT0NLXG5kaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZVxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uZWU1Y2ViZWVhMDA2ZiAxMDA2NDRcbi0tLSBhL2Jsb2NrL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZVxuQEAgLTM5LDMgJiM0MzszOSw0IEBAIG9iai0kKENPTkZJR19CTEtfSU5MSU5FX0VOQ1JZUFRJT04pXHQmIzQzOz0gYmxrLWNyeXB0by5vIGJsay1jcnlwdG8tcHJvZmlsZS5vIFxcXG4gXHRcdFx0XHRcdCAgIGJsay1jcnlwdG8tc3lzZnMub1xuIG9iai0kKENPTkZJR19CTEtfSU5MSU5FX0VOQ1JZUFRJT05fRkFMTEJBQ0spXHQmIzQzOz0gYmxrLWNyeXB0by1mYWxsYmFjay5vXG4gb2JqLSQoQ09ORklHX0JMT0NLX0hPTERFUl9ERVBSRUNBVEVEKVx0JiM0Mzs9IGhvbGRlci5vXG4mIzQzO29iai0kKENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYpXHQmIzQzOz0gYmxrLWlvY29zdC1icGYub1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMgYi9ibG9jay9ibGstaW9jb3N0LWJwZi5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMGMzNGY1NmRlZDcxZFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWlvY29zdC1icGYuY1xuQEAgLTAsMCAmIzQzOzEsMTUyIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBibGstaW9jb3N0OiBCUEYgc3RydWN0X29wcyBwbHVtYmluZyBmb3IgcGx1Z2dhYmxlIGNvc3QgbW9kZWxzLlxuJiM0MzsgKlxuJiM0MzsgKiBSZWdpc3RlcnMgdGhlIFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDsgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWxcbiYjNDM7ICogY2FuIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lOyBkZXZpY2VzIG9wdCBpbiBwZXItcXVldWUgd2l0aFxuJiM0MzsgKiBcJiMzNDtlY2hvICRERVYgY3RybD1icGYgXHUwMDNlIGlvLmNvc3QubW9kZWxcJiMzNDsuICBEZXZpY2VzIHdpdGhvdXQgYSByZWdpc3RlcmVkXG4mIzQzOyAqIG1vZGVsIGtlZXAgdXNpbmcgdGhlIGJ1aWx0aW4gbGluZWFyIG1vZGVsLlxuJiM0MzsgKi9cbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZl92ZXJpZmllci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2Jsay1pb2Nvc3QuaFx1MDAzZVxuJiM0MztcbiYjNDM7LyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJiMzOTtzIGNoYXJnZWFibGUgY29zdCAqL1xuJiM0MzsjZGVmaW5lIElPQ09TVF9CUEZfTUFYX0NPU1RcdCgxVUxMIFx1MDAzY1x1MDAzYyAzNylcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHMgYnBmX2lvY29zdF9tb2RlbF9vcHM7XG4mIzQzO1xuJiM0MztzdGF0aWMgREVGSU5FX01VVEVYKGlvY29zdF9icGZfcmVnX2xvY2spO1xuJiM0MztzdGF0aWMgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgX19yY3UgKmlvY29zdF9icGZfbW9kZWw7XG4mIzQzO3N0YXRpYyBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShpb2Nvc3RfYnBmX2tleSk7XG4mIzQzO1xuJiM0Mztib29sIGlvY29zdF9icGZfbW9kZWxfcmVnaXN0ZXJlZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHN0YXRpY19icmFuY2hfdW5saWtlbHkoXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvcixcbiYjNDM7XHRcdFx0ICB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzLCB1NjQgKmNvc3RwKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm9wcztcbiYjNDM7XHR1NjQgY29zdDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFx1MDAyNmlvY29zdF9icGZfa2V5KSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdG9wcyA9IHJjdV9kZXJlZmVyZW5jZShpb2Nvc3RfYnBmX21vZGVsKTtcbiYjNDM7XHRpZiAoIW9wcykge1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdGNvc3QgPSBvcHMtXHUwMDNlY2FsY19jb3N0KG9wLCBuYnl0ZXMsIHNlY3RvciwgY3Vyc29yLCBpb2NnX2lkLCBmbGFncyk7XG4mIzQzO1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1xuJiM0MztcdGlmICghY29zdClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0KmNvc3RwID0gbWluKGNvc3QsIElPQ09TVF9CUEZfTUFYX0NPU1QpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdChzdHJ1Y3QgYnRmICpidGYpXG4mIzQzO3tcbiYjNDM7XHRzMzIgdHlwZV9pZDtcbiYjNDM7XG4mIzQzO1x0dHlwZV9pZCA9IGJ0Zl9maW5kX2J5X25hbWVfa2luZChidGYsIFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDssIEJURl9LSU5EX1NUUlVDVCk7XG4mIzQzO1x0aWYgKHR5cGVfaWQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBicGZfaW9jb3N0X2luaXRfbWVtYmVyKGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbiYjNDM7XHRcdFx0XHQgIGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXIsXG4mIzQzO1x0XHRcdFx0ICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IGJwZl9pbnNuX2FjY2Vzc19hdXggKmluZm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqXG4mIzQzO2JwZl9pb2Nvc3RfZ2V0X2Z1bmNfcHJvdG8oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkLFxuJiM0MztcdFx0XHQgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBicGZfYmFzZV9mdW5jX3Byb3RvKGZ1bmNfaWQsIHByb2cpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgYnBmX2lvY29zdF92ZXJpZmllcl9vcHMgPSB7XG4mIzQzO1x0LmdldF9mdW5jX3Byb3RvID0gYnBmX2lvY29zdF9nZXRfZnVuY19wcm90byxcbiYjNDM7XHQuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoIW5ld19vcHMtXHUwMDNlY2FsY19jb3N0KVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdGludCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHQvKiB0aGUgY2FsbGVyIG9ubHkgaG9sZHMgdGhlIHBlci1tYXAgbG9jaywgc28gc2VyaWFsaXplIGhlcmUgKi9cbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuJiM0MztcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkpXG4mIzQzO1x0XHRyZXQgPSAtRUJVU1k7XG4mIzQzO1x0ZWxzZSB7XG4mIzQzO1x0XHRzdGF0aWNfYnJhbmNoX2luYyhcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4mIzQzO1x0XHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgbmV3X29wcyk7XG4mIzQzO1x0fVxuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBicGZfaW9jb3N0X3VucmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4mIzQzO3tcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuJiM0MztcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkgPT0ga2RhdGEpIHtcbiYjNDM7XHRcdHJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBOVUxMKTtcbiYjNDM7XHRcdHN0YXRpY19icmFuY2hfZGVjKFx1MDAyNmlvY29zdF9icGZfa2V5KTtcbiYjNDM7XHR9XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdTY0IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxuJiM0MztcdFx0XHRcdCAgICAgdTY0IGN1cnNvciwgdTY0IGlvY2dfaWQsIHU2NCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgX19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMgPSB7XG4mIzQzO1x0LmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0ge1xuJiM0MztcdC52ZXJpZmllcl9vcHMgPSBcdTAwMjZicGZfaW9jb3N0X3ZlcmlmaWVyX29wcyxcbiYjNDM7XHQuaW5pdCA9IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdCxcbiYjNDM7XHQuaW5pdF9tZW1iZXIgPSBicGZfaW9jb3N0X2luaXRfbWVtYmVyLFxuJiM0MztcdC5yZWcgPSBicGZfaW9jb3N0X3JlZyxcbiYjNDM7XHQudW5yZWcgPSBicGZfaW9jb3N0X3VucmVnLFxuJiM0MztcdC5uYW1lID0gXCYjMzQ7aW9jb3N0X21vZGVsX29wc1wmIzM0OyxcbiYjNDM7XHQuY2ZpX3N0dWJzID0gXHUwMDI2X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsXG4mIzQzO1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBicGZfaW9jb3N0X2luaXQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiByZWdpc3Rlcl9icGZfc3RydWN0X29wcyhcdTAwMjZicGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7XG4mIzQzO31cbiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfaW9jb3N0X2luaXQpO1xuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QuY1xuaW5kZXggMjc0NWJmZmNkNWVlZi4uYTU4YzE2ZmNiMjlmYSAxMDA2NDRcbi0tLSBhL2Jsb2NrL2Jsay1pb2Nvc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWlvY29zdC5jXG5AQCAtMTc3LDYgJiM0MzsxNzcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3RpbWVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90aW1lNjQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhcnNlci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2Jsay1pb2Nvc3QuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2xvY2FsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vbG9jYWw2NC5oXHUwMDNlXG5AQCAtNDQ1LDYgJiM0Mzs0NDYsNyBAQCBzdHJ1Y3QgaW9jIHtcbiBcdGludFx0XHRcdFx0YXV0b3BfaWR4O1xuIFx0Ym9vbFx0XHRcdFx0dXNlcl9xb3NfcGFyYW1zOjE7XG4gXHRib29sXHRcdFx0XHR1c2VyX2Nvc3RfbW9kZWw6MTtcbiYjNDM7XHRib29sXHRcdFx0XHRicGZfY29zdF9tb2RlbDtcbiB9O1xuIFxuIHN0cnVjdCBpb2NnX3BjcHVfc3RhdCB7XG5AQCAtMjIzOCw2ICYjNDM7MjI0MCw3IEBAIHN0YXRpYyB2b2lkIGlvY190aW1lcl9mbihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpXG4gXHRzdHJ1Y3QgaW9jX25vdyBub3c7XG4gXHRMSVNUX0hFQUQoc3VycGx1c2VzKTtcbiBcdGludCBucl9kZWJ0b3JzLCBucl9zaG9ydGFnZXMgPSAwLCBucl9sYWdnaW5nID0gMDtcbiYjNDM7XHRpbnQgbnJfYWN0aXZlID0gMDtcbiBcdHU2NCB1c2FnZV91c19zdW0gPSAwO1xuIFx0dTMyIHBwbV9ydGhyO1xuIFx0dTMyIHBwbV93dGhyO1xuQEAgLTIyNzQsNiAmIzQzOzIyNzcsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHR1NjQgdmRvbmUsIHZ0aW1lLCB1c2FnZV91cztcbiBcdFx0dTMyIGh3X2FjdGl2ZSwgaHdfaW51c2U7XG4gXG4mIzQzO1x0XHRucl9hY3RpdmUmIzQzOyYjNDM7O1xuJiM0MztcbiBcdFx0LypcbiBcdFx0ICogQ29sbGVjdCB1bnVzZWQgYW5kIHdpbmQgdnRpbWUgY2xvc2VyIHRvIHZub3cgdG8gcHJldmVudFxuIFx0XHQgKiBpb2NncyBmcm9tIGFjY3VtdWxhdGluZyBhIGxhcmdlIGFtb3VudCBvZiBidWRnZXQuXG5AQCAtMjQ2MCw2ICYjNDM7MjQ2NSw4IEBAIHN0YXRpYyB2b2lkIGlvY190aW1lcl9mbihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpXG4gXHRcdGlvY19yZWZyZXNoX3ZyYXRlKGlvYywgXHUwMDI2bm93KTtcbiBcdH1cbiBcbiYjNDM7XHR0cmFjZV9pb2Nvc3RfaW9jX3RpY2soaW9jLCBucl9hY3RpdmUsIHVzYWdlX3VzX3N1bSk7XG4mIzQzO1xuIFx0c3Bpbl91bmxvY2tfaXJxKFx1MDAyNmlvYy1cdTAwM2Vsb2NrKTtcbiB9XG4gXG5AQCAtMjU3Myw2ICYjNDM7MjU4MCwyMyBAQCBzdGF0aWMgdTY0IGNhbGNfdnRpbWVfY29zdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBpb2NfZ3EgKmlvY2csIGJvb2wgaXNfbWVyZ2UpXG4ge1xuIFx0dTY0IGNvc3Q7XG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4mIzQzO1x0c3RydWN0IGlvYyAqaW9jID0gaW9jZy1cdTAwM2Vpb2M7XG4mIzQzO1xuJiM0MztcdGlmIChSRUFEX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsKSkge1xuJiM0MztcdFx0dTY0IGJwZl9jb3N0O1xuJiM0MztcbiYjNDM7XHRcdGlmIChpb2Nvc3RfYnBmX2NhbGNfY29zdChiaW9fb3AoYmlvKSxcbiYjNDM7XHRcdFx0XHRcdCBiaW8tXHUwMDNlYmlfaXRlci5iaV9zaXplLFxuJiM0MztcdFx0XHRcdFx0IGJpby1cdTAwM2ViaV9pdGVyLmJpX3NlY3RvcixcbiYjNDM7XHRcdFx0XHRcdCBpb2NnLVx1MDAzZWN1cnNvcixcbiYjNDM7XHRcdFx0XHRcdCBpb2NnX3RvX2Jsa2coaW9jZyktXHUwMDNlYmxrY2ctXHUwMDNlY3NzLmlkLFxuJiM0MztcdFx0XHRcdFx0IGlzX21lcmdlID8gSU9DT1NUX0NPU1RfRl9NRVJHRSA6IDAsXG4mIzQzO1x0XHRcdFx0XHQgXHUwMDI2YnBmX2Nvc3QpKVxuJiM0MztcdFx0XHRyZXR1cm4gYnBmX2Nvc3Q7XG4mIzQzO1x0fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4gXHRjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbihiaW8sIGlvY2csIGlzX21lcmdlLCBcdTAwMjZjb3N0KTtcbiBcdHJldHVybiBjb3N0O1xuIH1cbkBAIC0zNDQxLDcgJiM0MzszNDY1LDggQEAgc3RhdGljIHU2NCBpb2NfY29zdF9tb2RlbF9wcmZpbGwoc3RydWN0IHNlcV9maWxlICpzZixcbiBcdHNlcV9wcmludGYoc2YsIFwmIzM0OyVzIGN0cmw9JXMgbW9kZWw9bGluZWFyIFwmIzM0O1xuIFx0XHQgICBcJiMzNDtyYnBzPSVsbHUgcnNlcWlvcHM9JWxsdSBycmFuZGlvcHM9JWxsdSBcJiMzNDtcbiBcdFx0ICAgXCYjMzQ7d2Jwcz0lbGx1IHdzZXFpb3BzPSVsbHUgd3JhbmRpb3BzPSVsbHVcXG5cJiMzNDssXG4tXHRcdCAgIGRuYW1lLCBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsID8gXCYjMzQ7dXNlclwmIzM0OyA6IFwmIzM0O2F1dG9cJiMzNDssXG4mIzQzO1x0XHQgICBkbmFtZSwgaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsID8gXCYjMzQ7YnBmXCYjMzQ7IDpcbiYjNDM7XHRcdFx0ICAgaW9jLVx1MDAzZXVzZXJfY29zdF9tb2RlbCA/IFwmIzM0O3VzZXJcJiMzNDsgOiBcJiMzNDthdXRvXCYjMzQ7LFxuIFx0XHQgICB1W0lfTENPRUZfUkJQU10sIHVbSV9MQ09FRl9SU0VRSU9QU10sIHVbSV9MQ09FRl9SUkFORElPUFNdLFxuIFx0XHQgICB1W0lfTENPRUZfV0JQU10sIHVbSV9MQ09FRl9XU0VRSU9QU10sIHVbSV9MQ09FRl9XUkFORElPUFNdKTtcbiBcdHNwaW5fdW5sb2NrX2lycShcdTAwMjZpb2MtXHUwMDNlbG9jayk7XG5AQCAtMzQ4MSw3ICYjNDM7MzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHR1bnNpZ25lZCBpbnQgbWVtZmxhZ3M7XG4gXHRzdHJ1Y3QgaW9jICppb2M7XG4gXHR1NjQgdVtOUl9JX0xDT0VGU107XG4tXHRib29sIHVzZXI7XG4mIzQzO1x0Ym9vbCB1c2VyLCBicGY7XG4gXHRjaGFyICpib2R5LCAqcDtcbiBcdGludCByZXQ7XG4gXG5AQCAtMzUxMiw2ICYjNDM7MzUzNyw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHRzcGluX2xvY2tfaXJxKFx1MDAyNmlvYy1cdTAwM2Vsb2NrKTtcbiBcdG1lbWNweSh1LCBpb2MtXHUwMDNlcGFyYW1zLmlfbGNvZWZzLCBzaXplb2YodSkpO1xuIFx0dXNlciA9IGlvYy1cdTAwM2V1c2VyX2Nvc3RfbW9kZWw7XG4mIzQzO1x0YnBmID0gaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsO1xuIFxuIFx0cmV0ID0gLUVJTlZBTDtcbiBcbkBAIC0zNTI3LDExICYjNDM7MzU1MywyMCBAQCBzdGF0aWMgc3NpemVfdCBpb2NfY29zdF9tb2RlbF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmlucHV0LFxuIFx0XHRzd2l0Y2ggKG1hdGNoX3Rva2VuKHAsIGNvc3RfY3RybF90b2tlbnMsIGFyZ3MpKSB7XG4gXHRcdGNhc2UgQ09TVF9DVFJMOlxuIFx0XHRcdG1hdGNoX3N0cmxjcHkoYnVmLCBcdTAwMjZhcmdzWzBdLCBzaXplb2YoYnVmKSk7XG4tXHRcdFx0aWYgKCFzdHJjbXAoYnVmLCBcJiMzNDthdXRvXCYjMzQ7KSlcbiYjNDM7XHRcdFx0aWYgKCFzdHJjbXAoYnVmLCBcJiMzNDthdXRvXCYjMzQ7KSkge1xuIFx0XHRcdFx0dXNlciA9IGZhbHNlO1xuLVx0XHRcdGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcJiMzNDt1c2VyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0XHRicGYgPSBmYWxzZTtcbiYjNDM7XHRcdFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7dXNlclwmIzM0OykpIHtcbiBcdFx0XHRcdHVzZXIgPSB0cnVlO1xuLVx0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRicGYgPSBmYWxzZTtcbiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZcbiYjNDM7XHRcdFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7YnBmXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRcdGlmICghaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKCkpXG4mIzQzO1x0XHRcdFx0XHRnb3RvIHVubG9jaztcbiYjNDM7XHRcdFx0XHR1c2VyID0gZmFsc2U7XG4mIzQzO1x0XHRcdFx0YnBmID0gdHJ1ZTtcbiYjNDM7I2VuZGlmXG4mIzQzO1x0XHRcdH0gZWxzZVxuIFx0XHRcdFx0Z290byB1bmxvY2s7XG4gXHRcdFx0Y29udGludWU7XG4gXHRcdGNhc2UgQ09TVF9NT0RFTDpcbkBAIC0zNTU2LDYgJiM0MzszNTkxLDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCxcbiBcdH0gZWxzZSB7XG4gXHRcdGlvYy1cdTAwM2V1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTtcbiBcdH1cbiYjNDM7XHRXUklURV9PTkNFKGlvYy1cdTAwM2VicGZfY29zdF9tb2RlbCwgYnBmKTtcbiBcdGlvY19yZWZyZXNoX3BhcmFtcyhpb2MsIHRydWUpO1xuIFxuIFx0cmV0ID0gMDtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBiL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzExMWI1YzAzZGMzNlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmhcbkBAIC0wLDAgJiM0MzsxLDU2IEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOyNpZm5kZWYgX0xJTlVYX0JMS19JT0NPU1RfSFxuJiM0MzsjZGVmaW5lIF9MSU5VWF9CTEtfSU9DT1NUX0hcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBQbHVnZ2FibGUgY29zdCBtb2RlbCBpbnRlcmZhY2UgZm9yIGJsay1pb2Nvc3QuXG4mIzQzOyAqXG4mIzQzOyAqIEEgQlBGIHN0cnVjdF9vcHMgaW1wbGVtZW50YXRpb24gcmVnaXN0ZXJlZCBhZ2FpbnN0IFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDtcbiYjNDM7ICogcmVwbGFjZXMgdGhlIGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGhcbiYjNDM7ICogXCYjMzQ7Y3RybD1icGZcJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLiAgVGhlIG1vZGVsIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiB0aGVcbiYjNDM7ICogYXJndW1lbnRzIGJlbG93IGFuZCByZXR1cm5zIHRoZSBjb3N0IG9mIHRoZSBJTyBpbiBkZXZpY2UgdGltZSB1bml0cyxcbiYjNDM7ICogd2hlcmUgMSBzZWNvbmQgb2YgZGV2aWNlIHRpbWUgZXF1YWxzIDJeMzcgKFZUSU1FX1BFUl9TRUMpLiAgVGhlXG4mIzQzOyAqIHJldHVybmVkIHZhbHVlIGlzIGNsYW1wZWQgYnkgdGhlIGtlcm5lbC4gIEEgY29zdCBvZiAwIGRlbGVnYXRlcyB0aGVcbiYjNDM7ICogSU8gYmFjayB0byB0aGUgYnVpbHRpbiBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIGRvZXMgbm90IGhhbmRsZSBhXG4mIzQzOyAqIGdpdmVuIElPIHR5cGUgY2Fubm90IG1ha2UgaXQgZnJlZS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGlvY2dfaWQgYXJndW1lbnQgaWRlbnRpZmllcyB0aGUgaXNzdWluZyBjZ3JvdXAgKGNzcyBpZCkgc28gdGhlXG4mIzQzOyAqIG1vZGVsIGNhbiBrZWVwIHBlci1jZ3JvdXAgc3RhdGUsIGUuZy4gZm9yIG11bHRpLXN0cmVhbSBzZXF1ZW50aWFsaXR5XG4mIzQzOyAqIGRldGVjdGlvbi4gIFRoZSBpZCBpcyBvbmx5IHZhbGlkIHdoaWxlIHRoZSBjZ3JvdXAgZXhpc3RzOiBjc3MgaWRzIGFyZVxuJiM0MzsgKiByZWN5Y2xlZCBvbmNlIHRoZSBjZ3JvdXAgaXMgcmVtb3ZlZCwgc28gbW9kZWxzIG11c3QgdHJlYXQgaXQgYXMgYVxuJiM0MzsgKiB0cmFuc2llbnQga2V5IGFuZCByZXNldCBzdGF0ZSB3aGVuIHRoZXkgb2JzZXJ2ZSBpdCByZXVzZWQuICBXaGV0aGVyXG4mIzQzOyAqIHRoZSBpbnRlcmZhY2UgbmVlZHMgYSByZWxlYXNlKGlvY2dfaWQpIGNhbGxiYWNrIGZvciBzdGF0ZSBjbGVhbnVwIGlzXG4mIzQzOyAqIGFuIG9wZW4gcXVlc3Rpb24uXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBtb2RlbCBpcyBjYWxsZWQgZnJvbSB0aGUgSU8gc3VibWlzc2lvbiBwYXRoIHVuZGVyIFJDVSBhbmQgbXVzdFxuJiM0MzsgKiBub3Qgc2xlZXAuICBPbmx5IHRoZSBiaW8tbGV2ZWwgY2hhcmdpbmcgcGF0aCBjb25zdWx0cyB0aGUgbW9kZWw7XG4mIzQzOyAqIHRoZSByZXF1ZXN0LWxldmVsIHNpemluZyBwYXRoIChjYWxjX3NpemVfdnRpbWVfY29zdCgpKSBrZWVwcyB1c2luZ1xuJiM0MzsgKiB0aGUgYnVpbHRpbiBmb3JtdWxhLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOy8qIGZsYWdzIGZvciBjYWxjX2Nvc3QoKSAqL1xuJiM0MzsjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVx0LyogY2FsbGVkIGZyb20gbWVyZ2UgcGF0aCAqL1xuJiM0MztcbiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMge1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQG9wOlx0XHRSRVFfT1BfKiB2YWx1ZSAodWFwaSBibGtfb3BmLmgpXG4mIzQzO1x0ICogQG5ieXRlczpcdElPIHNpemUgaW4gYnl0ZXNcbiYjNDM7XHQgKiBAc2VjdG9yOlx0c3RhcnRpbmcgc2VjdG9yXG4mIzQzO1x0ICogQGN1cnNvcjpcdGlvY2cgY3Vyc29yIHNlY3RvciwgMCBpZiBub25lIChzZXF1ZW50aWFsaXR5IGhpbnQpXG4mIzQzO1x0ICogQGlvY2dfaWQ6XHRjc3MgaWQgb2YgdGhlIGlzc3VpbmcgY2dyb3VwXG4mIzQzO1x0ICogQGZsYWdzOlx0SU9DT1NUX0NPU1RfRl8qXG4mIzQzO1x0ICovXG4mIzQzO1x0dTY0ICgqY2FsY19jb3N0KSh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsIHU2NCBjdXJzb3IsXG4mIzQzO1x0XHRcdCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2Jvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuJiM0MztcdFx0XHQgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApO1xuJiM0Mztib29sIGlvY29zdF9icGZfbW9kZWxfcmVnaXN0ZXJlZCh2b2lkKTtcbiYjNDM7XG4mIzQzOyNlbmRpZlx0LyogQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRiAqL1xuJiM0MzsjZW5kaWZcdC8qIF9MSU5VWF9CTEtfSU9DT1NUX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXG5pbmRleCBlNzcyYjFiYzYwZDYwLi4yYjlmZjM0OGE0ZjUxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXG5AQCAtMTc4LDYgJiM0MzsxNzgsNDYgQEAgVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY192cmF0ZV9hZGosXG4gXHQpXG4gKTtcbiBcbiYjNDM7LypcbiYjNDM7ICogUGVyaW9kaWMgcGVyLWRldmljZSBzdW1tYXJ5LCBlbWl0dGVkIG9uY2UgcGVyIHBlcmlvZCBmcm9tIHRoZSB0YWlsIG9mXG4mIzQzOyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5XG4mIzQzOyAqIHBlcmlvZCB0aGUgY29udHJvbGxlciBpcyBydW5uaW5nLCBpbmNsdWRpbmcgc3RlYWR5IHN0YXRlcywgYW5kIGNhcnJpZXNcbiYjNDM7ICogdGhlIG92ZXJhbGwgY29udHJvbGxlciBzdGF0ZSBzbyBiYXNpYyBtb25pdG9yaW5nIGRvZXNuJiMzOTt0IHJlcXVpcmUgZHJnbi5cbiYjNDM7ICovXG4mIzQzO1RSQUNFX0VWRU5UKGlvY29zdF9pb2NfdGljayxcbiYjNDM7XG4mIzQzO1x0VFBfUFJPVE8oc3RydWN0IGlvYyAqaW9jLCBpbnQgbnJfYWN0aXZlLCB1NjQgdXNhZ2VfdXNfc3VtKSxcbiYjNDM7XG4mIzQzO1x0VFBfQVJHUyhpb2MsIG5yX2FjdGl2ZSwgdXNhZ2VfdXNfc3VtKSxcbiYjNDM7XG4mIzQzO1x0VFBfU1RSVUNUX19lbnRyeSAoXG4mIzQzO1x0XHRfX3N0cmluZyhkZXZuYW1lLCBpb2NfbmFtZShpb2MpKVxuJiM0MztcdFx0X19maWVsZCh1MzIsIHBlcmlvZF91cylcbiYjNDM7XHRcdF9fZmllbGQodTY0LCB2cmF0ZSlcbiYjNDM7XHRcdF9fZmllbGQoaW50LCBidXN5X2xldmVsKVxuJiM0MztcdFx0X19maWVsZChpbnQsIG5yX2FjdGl2ZSlcbiYjNDM7XHRcdF9fZmllbGQodTMyLCB1c2FnZV9wY3QpXG4mIzQzO1x0XHRfX2ZpZWxkKGludCwgcnVubmluZylcbiYjNDM7XHQpLFxuJiM0MztcbiYjNDM7XHRUUF9mYXN0X2Fzc2lnbihcbiYjNDM7XHRcdF9fYXNzaWduX3N0cihkZXZuYW1lKTtcbiYjNDM7XHRcdF9fZW50cnktXHUwMDNlcGVyaW9kX3VzID0gaW9jLVx1MDAzZXBlcmlvZF91cztcbiYjNDM7XHRcdF9fZW50cnktXHUwMDNldnJhdGUgPSBpb2MtXHUwMDNldnRpbWVfYmFzZV9yYXRlO1xuJiM0MztcdFx0X19lbnRyeS1cdTAwM2VidXN5X2xldmVsID0gaW9jLVx1MDAzZWJ1c3lfbGV2ZWw7XG4mIzQzO1x0XHRfX2VudHJ5LVx1MDAzZW5yX2FjdGl2ZSA9IG5yX2FjdGl2ZTtcbiYjNDM7XHRcdF9fZW50cnktXHUwMDNldXNhZ2VfcGN0ID0gaW9jLVx1MDAzZXBlcmlvZF91cyA/XG4mIzQzO1x0XHRcdGRpdl91NjQodXNhZ2VfdXNfc3VtICogMTAwLCBpb2MtXHUwMDNlcGVyaW9kX3VzKSA6IDA7XG4mIzQzO1x0XHRfX2VudHJ5LVx1MDAzZXJ1bm5pbmcgPSBpb2MtXHUwMDNlcnVubmluZztcbiYjNDM7XHQpLFxuJiM0MztcbiYjNDM7XHRUUF9wcmludGsoXCYjMzQ7WyVzXSBwZXJpb2Q9JXV1cyB2cmF0ZT0lbGx1IGJ1c3k9JWQgYWN0aXZlPSVkIHVzYWdlPSV1JSUgcnVubmluZz0lZFwmIzM0OyxcbiYjNDM7XHRcdF9fZ2V0X3N0cihkZXZuYW1lKSwgX19lbnRyeS1cdTAwM2VwZXJpb2RfdXMsIF9fZW50cnktXHUwMDNldnJhdGUsXG4mIzQzO1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwsIF9fZW50cnktXHUwMDNlbnJfYWN0aXZlLCBfX2VudHJ5LVx1MDAzZXVzYWdlX3BjdCxcbiYjNDM7XHRcdF9fZW50cnktXHUwMDNlcnVubmluZ1xuJiM0MztcdClcbiYjNDM7KTtcbiYjNDM7XG4gVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY2dfZm9yZ2l2ZV9kZWJ0LFxuIFxuIFx0VFBfUFJPVE8oc3RydWN0IGlvY19ncSAqaW9jZywgY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGlvY19ub3cgKm5vdyxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMmMxNDlmM2NkMjQzYVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmNcbkBAIC0wLDAgJiM0MzsxLDE1NSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aW9jb3N0X21vZGVsLnNrZWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtpb2Nvc3RfbXMuc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBTd2l0Y2ggYSBkZXZpY2UgdG8gY3RybD1icGYgdGhyb3VnaCBpby5jb3N0Lm1vZGVsIGFuZCB2ZXJpZnkgdGhlXG4mIzQzOyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy5cbiYjNDM7ICogU2hhcmVkIGJ5IHRoZSBleGFtcGxlLW1vZGVsIHRlc3RzIGJlbG93LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldilcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFtdID0gXCYjMzQ7L3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFwmIzM0OztcbiYjNDM7XHRjaGFyIHdvcmRbMjU2XSwgbGluZVsyNTZdLCBidWZbMzAwXTtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XHRpbnQgZXJyLCBmb3VuZCA9IDA7XG4mIzQzO1xuJiM0MztcdGZwID0gZm9wZW4ocGF0aCwgXCYjMzQ7ciYjNDM7XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWZwKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7b3BlbiAlczogJXNcJiMzNDssIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbiYjNDM7XHRcdGlmIChzc2NhbmYobGluZSwgXCYjMzQ7JTI1NXNcJiMzNDssIHdvcmQpID09IDEgXHUwMDI2XHUwMDI2ICFzdHJjbXAod29yZCwgZGV2KSkge1xuJiM0MztcdFx0XHRmb3VuZCA9IDE7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRpZiAoIWZvdW5kKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7JXMgaGFzIG5vIGlvY29zdCBsaW5lXCYjMzQ7LCBkZXYpO1xuJiM0MztcdFx0ZmNsb3NlKGZwKTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwmIzM0OyVzIGN0cmw9YnBmXCYjMzQ7LCBkZXYpO1xuJiM0MztcdGVyciA9IGZwcmludGYoZnAsIFwmIzM0OyVzXFxuXCYjMzQ7LCBidWYpO1xuJiM0MztcdGlmIChlcnIgXHUwMDNjPSAwKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7d3JpdGUgY3RybD1icGYgZmFpbGVkXCYjMzQ7KTtcbiYjNDM7XHRcdGZjbG9zZShmcCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGZmbHVzaChmcCk7XG4mIzQzO1xuJiM0MztcdHJld2luZChmcCk7XG4mIzQzO1x0Zm91bmQgPSAwO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xuJiM0MztcdFx0aWYgKHNzY2FuZihsaW5lLCBcJiMzNDslMjU1c1wmIzM0Oywgd29yZCkgPT0gMSBcdTAwMjZcdTAwMjYgIXN0cmNtcCh3b3JkLCBkZXYpKSB7XG4mIzQzO1x0XHRcdGZvdW5kID0gc3Ryc3RyKGxpbmUsIFwmIzM0O2N0cmw9YnBmXCYjMzQ7KSAhPSBOVUxMO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFmb3VuZClcbiYjNDM7XHRcdFRIX0xPRyhcJiMzNDtyZWFkYmFjayBkb2VzIG5vdCBzaG93IGN0cmw9YnBmXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZnByaW50ZihmcCwgXCYjMzQ7JXMgY3RybD1hdXRvXFxuXCYjMzQ7LCBkZXYpO1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGZvdW5kID8gMCA6IC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRGSUxFICpmcCA9IGZvcGVuKFwmIzM0Oy9zeXMvZnMvY2dyb3VwL2lvLmNvc3QucW9zXCYjMzQ7LCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZwKVxuJiM0MztcdFx0ZmNsb3NlKGZwKTtcbiYjNDM7XHRyZXR1cm4gZnAgIT0gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUmVnaXN0ZXIgdGhlIGV4YW1wbGUgY29zdCBtb2RlbCBhbmQgc3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmLlxuJiM0MzsgKiBJTyBhY2NvdW50aW5nIGl0c2VsZiBpcyBub3QgY2hlY2tlZCBoZXJlOyBpdCBuZWVkcyBhIGRldmljZSBkb2luZ1xuJiM0MzsgKiByZWFsIElPIHVuZGVyIGlvY29zdCBhbmQgaXMgY292ZXJlZCBieSB0aGUga2VybmVsLXNpZGUgdmFsaWRhdGlvblxuJiM0MzsgKiBkZXNjcmliZWQgaW4gdGhlIGNvdmVyIGxldHRlci5cbiYjNDM7ICpcbiYjNDM7ICogUmVxdWlyZXMgcm9vdCwgY2dyb3VwIHYyIGFuZCBhIGRldmljZSB3aXRoIGlvY29zdCBzdXBwb3J0LiAgVGhlXG4mIzQzOyAqIGRldmljZSBtdXN0IGJlIGdpdmVuIGFzIG1ham9yOm1pbm9yIGluICRJT0NPU1RfVEVTVF9ERVYsIG90aGVyd2lzZVxuJiM0MzsgKiB0aGUgdGVzdCBpcyBza2lwcGVkLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCBzZXJpYWxfdGVzdF9pb2Nvc3RfbW9kZWwodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpb2Nvc3RfbW9kZWwgKnNrZWw7XG4mIzQzO1x0Y2hhciB3b3JkWzI1Nl0sICpkZXY7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0ZGV2ID0gZ2V0ZW52KFwmIzM0O0lPQ09TVF9URVNUX0RFVlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHtcbiYjNDM7XHRcdHRlc3RfX3NraXAoKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcJiMzNDtpb2Nvc3RfbW91bnRlZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdC8qIG5lZ2F0aXZlOiBjdHJsPWJwZiBtdXN0IGJlIHJlamVjdGVkIHdoaWxlIG5vIG1vZGVsIGlzXG4mIzQzO1x0ICogcmVnaXN0ZXJlZCwgc28gYSB0eXBvIGNhbm5vdCBzaWxlbnRseSBkaXNhYmxlIGNvc3QgbW9kZWxcbiYjNDM7XHQgKiB1cGRhdGVzICovXG4mIzQzO1x0aWYgKHNzY2FuZihkZXYsIFwmIzM0OyUyNTVzXCYjMzQ7LCB3b3JkKSAhPSAxKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHtcbiYjNDM7XHRcdGNoYXIgcGF0aFtdID0gXCYjMzQ7L3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFwmIzM0OztcbiYjNDM7XHRcdGNoYXIgYnVmWzMwMF07XG4mIzQzO1x0XHRGSUxFICpmcCA9IGZvcGVuKHBhdGgsIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwmIzM0OyVzIGN0cmw9YnBmXFxuXCYjMzQ7LCB3b3JkKTtcbiYjNDM7XHRcdGVyciA9IDA7XG4mIzQzO1x0XHRpZiAoZnApIHtcbiYjNDM7XHRcdFx0ZXJyID0gZnByaW50ZihmcCwgXCYjMzQ7JXNcJiMzNDssIGJ1ZikgXHUwMDNjPSAwO1xuJiM0MztcdFx0XHRmY2xvc2UoZnApO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0QVNTRVJUX1RSVUUoZXJyLCBcJiMzNDtjdHJsX2JwZl93aXRob3V0X21vZGVsX3JlamVjdGVkXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBpb2Nvc3RfbW9kZWxfX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7c2tlbF9vcGVuX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHQvKiBhdHRhY2hpbmcgdGhlIHN0cnVjdF9vcHMgcmVnaXN0ZXJzIHRoZSBtb2RlbDsgYSBzZWNvbmRcbiYjNDM7XHQgKiByZWdpc3RyYXRpb24gb2YgdGhlIHNhbWUgb3BzIHdvdWxkIGZhaWwgd2l0aCBFQlVTWSAqL1xuJiM0MztcdGVyciA9IGlvY29zdF9tb2RlbF9fYXR0YWNoKHNrZWwpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZXJyLCBcJiMzNDthdHRhY2hcJiMzNDspKVxuJiM0MztcdFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXCYjMzQ7c3dpdGNoX2FuZF9yZWFkYmFja1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlvY29zdF9tb2RlbF9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2FtZSBjaGVjayBmb3IgdGhlIG11bHRpLXN0cmVhbSBleGFtcGxlIG1vZGVsLiAgT25seSBvbmUgbW9kZWwgY2FuXG4mIzQzOyAqIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lLCBzbyB0aGlzIHRlc3QgbXVzdCBydW4gc2VwYXJhdGVseSBmcm9tXG4mIzQzOyAqIHRlc3RfaW9jb3N0X21vZGVsOyBib3RoIGFyZSBzZXJpYWwuXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbF9zdHJlYW1zKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgaW9jb3N0X21zICpza2VsO1xuJiM0MztcdGNoYXIgKmRldjtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRkZXYgPSBnZXRlbnYoXCYjMzQ7SU9DT1NUX1RFU1RfREVWXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWRldiB8fCBnZXRldWlkKCkgIT0gMCkge1xuJiM0MztcdFx0dGVzdF9fc2tpcCgpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIUFTU0VSVF9UUlVFKGRldl9oYXNfaW9jb3N0KCksIFwmIzM0O2lvY29zdF9tb3VudGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IGlvY29zdF9tc19fb3Blbl9hbmRfbG9hZCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtza2VsX29wZW5fbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IGlvY29zdF9tc19fYXR0YWNoKHNrZWwpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZXJyLCBcJiMzNDthdHRhY2hcJiMzNDspKVxuJiM0MztcdFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXCYjMzQ7c3dpdGNoX2FuZF9yZWFkYmFja1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlvY29zdF9tc19fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmFcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCAmIzQzOzEsOTEgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbiYjNDM7LypcbiYjNDM7ICogRXhhbXBsZSBpb2Nvc3QgY29zdCBtb2RlbDogdGhlIGJ1aWx0aW4gbGluZWFyIEhERCBmb3JtdWxhIHdpdGggYWxsXG4mIzQzOyAqIGNvc3RzIGRvdWJsZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBjb25zdGFudHMgbWlycm9yIHdoYXQgY2FsY19sY29lZnMoKSBkZXJpdmVzIGZyb20gdGhlIEFVVE9QX0hERFxuJiM0MzsgKiBkZWZhdWx0cyAocmJwcz0xNzQwMTkxNzYgcnNlcWlvcHM9NDE3MDggcnJhbmRpb3BzPTM3MCwgdy1zaWRlXG4mIzQzOyAqIGFuYWxvZykgaW4gdnRpbWUgdW5pdHMgd2hlcmUgMXMgPT0gMl4zNywgZXhwcmVzc2VkIHdpdGggdGhlIHNhbWVcbiYjNDM7ICogcm91bmQtdXAgZGl2aXNpb25zIHNvIHRoZXkgY2Fubm90IGRyaWZ0IGZyb20gdGhlIGtlcm5lbCwgc28gYVxuJiM0MzsgKiBkZXZpY2Ugc3dpdGNoZWQgdG8gY3RybD1icGYgd2l0aCB0aGlzIG1vZGVsIHJlZ2lzdGVyZWQgY2hhcmdlc1xuJiM0MzsgKiBleGFjdGx5IHR3aWNlIHRoZSBidWlsdGluIG1vZGVsIHVuZGVyIHRoZSBzYW1lIHdvcmtsb2FkLCB3aGljaFxuJiM0MzsgKiBtYWtlcyBpdCBhIGNvbnZlbmllbnQgd2F5IHRvIHZlcmlmeSB0aGF0IGFjY291bnRpbmcgZ29lcyB0aHJvdWdoXG4mIzQzOyAqIHRoZSBCUEYgcGF0aC5cbiYjNDM7ICovXG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuJiM0MztcbiYjNDM7LyogVlRJTUVfUEVSX1NFQyBjb21lcyBmcm9tIHZtbGludXguaCAoYSBCVEYgZW51bSBjb25zdGFudCkgKi9cbiYjNDM7I2RlZmluZSBJT0NfUEFHRV9TSVpFXHRcdDQwOTZcbiYjNDM7I2RlZmluZSBJT0NfU0VDVF9UT19QQUdFX1NISUZUXHQzXHQvKiA1MTJCIHNlY3RvcnMgdG8gNGtCIHBhZ2VzICovXG4mIzQzOyNkZWZpbmUgTENPRUZfUkFORElPX1BBR0VTXHQ0MDk2XHQvKiAxNk1CIHNlZWsgdGhyZXNob2xkICovXG4mIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRVx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXG4mIzQzO1xuJiM0MzsvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcbiYjNDM7ICogY29tcGlsZSB0aW1lICovXG4mIzQzOyNkZWZpbmUgUlUoeCwgeSlcdFx0KCh4KSAvICh5KSAmIzQzOyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJCUFNcdDE3NDAxOTE3NlVMTFxuJiM0MzsjZGVmaW5lIFJTRVFJT1BTXHQ0MTcwOFVMTFxuJiM0MzsjZGVmaW5lIFJSQU5ESU9QU1x0MzcwVUxMXG4mIzQzOyNkZWZpbmUgV0JQU1x0MTc4MDc1ODY2VUxMXG4mIzQzOyNkZWZpbmUgV1NFUUlPUFNcdDQyNzA1VUxMXG4mIzQzOyNkZWZpbmUgV1JBTkRJT1BTXHQzNzhVTExcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUlBBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShSQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4mIzQzOyNkZWZpbmUgUlNFUUlPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXG4mIzQzOyNkZWZpbmUgUlJBTkRJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSlcbiYjNDM7I2RlZmluZSBXUEFHRVx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFdCUFMsIElPQ19QQUdFX1NJWkUpKSlcbiYjNDM7I2RlZmluZSBXU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcbiYjNDM7I2RlZmluZSBXUkFORElPXHQoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKVxuJiM0MztcbiYjNDM7c3RhdGljIF9fYWx3YXlzX2lubGluZSB1NjQgYnVpbHRpbl9jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbiYjNDM7XHRcdFx0XHRcdHU2NCBjdXJzb3IsIHU2NCBmbGFncylcbiYjNDM7e1xuJiM0MztcdHU2NCBwYWdlcywgc2Vla19wYWdlcyA9IDAsIGJhc2UsIGNvZWZfcGFnZTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFuYnl0ZXMpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChvcCkge1xuJiM0MztcdGNhc2UgUkVRX09QX1JFQUQ6XG4mIzQzO1x0XHRiYXNlID0gUlNFUUlPO1xuJiM0MztcdFx0Y29lZl9wYWdlID0gUlBBR0U7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFJFUV9PUF9XUklURTpcbiYjNDM7XHRcdGJhc2UgPSBXU0VRSU87XG4mIzQzO1x0XHRjb2VmX3BhZ2UgPSBXUEFHRTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjdXJzb3IpIHtcbiYjNDM7XHRcdHNlZWtfcGFnZXMgPSBzZWN0b3IgXHUwMDNlIGN1cnNvciA/IHNlY3RvciAtIGN1cnNvclxuJiM0MztcdFx0XHRcdFx0ICAgICA6IGN1cnNvciAtIHNlY3RvcjtcbiYjNDM7XHRcdHNlZWtfcGFnZXMgXHUwMDNlXHUwMDNlPSBJT0NfU0VDVF9UT19QQUdFX1NISUZUO1xuJiM0MztcdFx0aWYgKHNlZWtfcGFnZXMgXHUwMDNlIExDT0VGX1JBTkRJT19QQUdFUylcbiYjNDM7XHRcdFx0YmFzZSA9IChvcCA9PSBSRVFfT1BfUkVBRCkgPyBSUkFORElPIDogV1JBTkRJTztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHBhZ2VzID0gUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKTtcbiYjNDM7XHRpZiAoZmxhZ3MgXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpXG4mIzQzO1x0XHRiYXNlID0gMDtcbiYjNDM7XHRyZXR1cm4gYmFzZSAmIzQzOyBwYWdlcyAqIGNvZWZfcGFnZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N0cnVjdF9vcHNcJiMzNDspXG4mIzQzO3U2NCBCUEZfUFJPRyhpb2Nvc3RfMnhfY2FsY19jb3N0LCB1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4mIzQzO1x0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDIgKiBidWlsdGluX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGZsYWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0Oy5zdHJ1Y3Rfb3BzXCYjMzQ7KVxuJiM0MztzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfMnggPSB7XG4mIzQzO1x0LmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0XzJ4X2NhbGNfY29zdCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40NjVmZDVkNWM2MmUwXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmNcbkBAIC0wLDAgJiM0MzsxLDEyMiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuJiM0MzsvKlxuJiM0MzsgKiBFeGFtcGxlIG11bHRpLXN0cmVhbSBzZXF1ZW50aWFsaXR5IGRldGVjdGlvbiBjb3N0IG1vZGVsLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgYnVpbHRpbiBtb2RlbCBrZWVwcyBhIHNpbmdsZSBjdXJzb3IgcGVyIGNncm91cCwgc28gdHdvXG4mIzQzOyAqIGludGVybGVhdmVkIHNlcXVlbnRpYWwgcmVhZGVycyBpbiBvbmUgY2dyb3VwIGFyZSBhbGwgcHJpY2VkIHJhbmRvbVxuJiM0MzsgKiAobWVhc3VyZWQgODl4IG92ZXJjaGFyZ2UsIDEyLjl4IHRocm91Z2hwdXQgY29sbGFwc2UpLCB3aGlsZSByYW5kb21cbiYjNDM7ICogSU8gaW5zaWRlIGEgaG90IHdpbmRvdyBzbWFsbGVyIHRoYW4gdGhlIDE2TUIgc2VlayB0aHJlc2hvbGQgaXNcbiYjNDM7ICogcHJpY2VkIHNlcXVlbnRpYWwgKG1lYXN1cmVkIDEwN3ggdW5kZXJjaGFyZ2UpLiAgVGhpcyBtb2RlbCByZXBsYWNlc1xuJiM0MzsgKiB0aGUgc2luZ2xlIGN1cnNvciB3aXRoIGEgcGVyLWNncm91cCB0YWJsZSBvZiBzdHJlYW0gc2xvdHMsIGtleWVkIGJ5XG4mIzQzOyAqIHRoZSBpb2NnX2lkIGFyZ3VtZW50OiBhbiBJTyBpcyBzZXF1ZW50aWFsIGlmZiBpdHMgc2VjdG9yIG1hdGNoZXMgdGhlXG4mIzQzOyAqIGV4cGVjdGVkIG5leHQgc2VjdG9yIG9mIGFueSB0cmFja2VkIHN0cmVhbS4gIEludGVybGVhdmVkIHN0cmVhbXNcbiYjNDM7ICoga2VlcCB0aGVpciBvd24gc2xvdHMsIGFuZCB3aW5kb3dlZCByYW5kb20gSU8gcmFyZWx5IG1hdGNoZXMgYVxuJiM0MzsgKiBtb3ZpbmcgZXhwZWN0YXRpb24uXG4mIzQzOyAqL1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bWxpbnV4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7XG4mIzQzOy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXG4mIzQzOyNkZWZpbmUgSU9DX1BBR0VfU0laRVx0XHQ0MDk2XG4mIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRVx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXG4mIzQzO1xuJiM0MzsvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcbiYjNDM7ICogY29tcGlsZSB0aW1lICovXG4mIzQzOyNkZWZpbmUgUlUoeCwgeSlcdFx0KCh4KSAvICh5KSAmIzQzOyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJCUFNcdDE3NDAxOTE3NlVMTFxuJiM0MzsjZGVmaW5lIFJTRVFJT1BTXHQ0MTcwOFVMTFxuJiM0MzsjZGVmaW5lIFJSQU5ESU9QU1x0MzcwVUxMXG4mIzQzOyNkZWZpbmUgV0JQU1x0MTc4MDc1ODY2VUxMXG4mIzQzOyNkZWZpbmUgV1NFUUlPUFNcdDQyNzA1VUxMXG4mIzQzOyNkZWZpbmUgV1JBTkRJT1BTXHQzNzhVTExcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUlBBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShSQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4mIzQzOyNkZWZpbmUgUlNFUUlPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXG4mIzQzOyNkZWZpbmUgUlJBTkRJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSlcbiYjNDM7I2RlZmluZSBXUEFHRVx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFdCUFMsIElPQ19QQUdFX1NJWkUpKSlcbiYjNDM7I2RlZmluZSBXU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcbiYjNDM7I2RlZmluZSBXUkFORElPXHQoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKVxuJiM0MztcbiYjNDM7I2RlZmluZSBOU0xPVFNcdDRcbiYjNDM7XG4mIzQzO3N0cnVjdCBzdHJlYW1zIHtcbiYjNDM7XHRfX3U2NCBleHBlY3RlZFtOU0xPVFNdO1x0LyogbmV4dCBleHBlY3RlZCBzZWN0b3IsIHBlciBzdHJlYW0gKi9cbiYjNDM7XHRfX3U2NCBzdGFtcFtOU0xPVFNdO1x0LyogTFJVIHN0YW1wLCAwID0gZW1wdHkgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCBfX3U2NCk7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgc3RyZWFtcyk7XG4mIzQzO1x0X191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4mIzQzO30gc3RyZWFtX3RhYiBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N0cnVjdF9vcHNcJiMzNDspXG4mIzQzO3U2NCBCUEZfUFJPRyhpb2Nvc3RfbXNfY2FsY19jb3N0LCB1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4mIzQzO1x0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN0cmVhbXMgKnM7XG4mIzQzO1x0dTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdztcbiYjNDM7XHR1MzIgaSwgdmljdGltID0gMCwgZm91bmQgPSAweEZGRkZGRkZGO1xuJiM0MztcbiYjNDM7XHRpZiAob3AgIT0gUkVRX09QX1JFQUQgXHUwMDI2XHUwMDI2IG9wICE9IFJFUV9PUF9XUklURSlcbiYjNDM7XHRcdHJldHVybiAwO1x0LyogZGVsZWdhdGUgdGhlIHJlc3QgdG8gYnVpbHRpbiAqL1xuJiM0MztcdGlmICghbmJ5dGVzKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGlmIChvcCA9PSBSRVFfT1BfUkVBRCkge1xuJiM0MztcdFx0cGFnZSA9IFJQQUdFOyBzZXFpbyA9IFJTRVFJTzsgcmFuZGlvID0gUlJBTkRJTztcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0cGFnZSA9IFdQQUdFOyBzZXFpbyA9IFdTRVFJTzsgcmFuZGlvID0gV1JBTkRJTztcbiYjNDM7XHR9XG4mIzQzO1x0YWR2YW5jZSA9IFJVKG5ieXRlcywgNTEyKTtcdC8qIHNlY3RvcnMgKi9cbiYjNDM7XG4mIzQzO1x0cyA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2c3RyZWFtX3RhYiwgXHUwMDI2aW9jZ19pZCk7XG4mIzQzO1x0aWYgKCFzKSB7XG4mIzQzO1x0XHRzdHJ1Y3Qgc3RyZWFtcyB6ZXJvID0ge307XG4mIzQzO1xuJiM0MztcdFx0YnBmX21hcF91cGRhdGVfZWxlbShcdTAwMjZzdHJlYW1fdGFiLCBcdTAwMjZpb2NnX2lkLCBcdTAwMjZ6ZXJvLFxuJiM0MztcdFx0XHRcdCAgICBCUEZfTk9FWElTVCk7XG4mIzQzO1x0XHRzID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZzdHJlYW1fdGFiLCBcdTAwMjZpb2NnX2lkKTtcbiYjNDM7XHRcdGlmICghcylcbiYjNDM7XHRcdFx0cmV0dXJuIHNlcWlvICYjNDM7IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZsYWdzIFx1MDAyNiBJT0NPU1RfQ09TVF9GX01FUkdFKSB7XG4mIzQzO1x0XHRiYXNlID0gMDtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bm93ID0gYnBmX2t0aW1lX2dldF9ucygpO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5TTE9UUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChzLVx1MDAzZWV4cGVjdGVkW2ldID09IHNlY3RvciBcdTAwMjZcdTAwMjYgcy1cdTAwM2VzdGFtcFtpXSkge1xuJiM0MztcdFx0XHRmb3VuZCA9IGk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRpZiAoZm91bmQgIT0gMHhGRkZGRkZGRikge1xuJiM0MztcdFx0YmFzZSA9IHNlcWlvO1xuJiM0MztcdFx0cy1cdTAwM2VleHBlY3RlZFtmb3VuZF0gPSBzZWN0b3IgJiM0MzsgYWR2YW5jZTtcbiYjNDM7XHRcdHMtXHUwMDNlc3RhbXBbZm91bmRdID0gbm93O1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRiYXNlID0gcmFuZGlvO1xuJiM0MztcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgTlNMT1RTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAocy1cdTAwM2VzdGFtcFtpXSBcdTAwM2Mgcy1cdTAwM2VzdGFtcFt2aWN0aW1dKVxuJiM0MztcdFx0XHRcdHZpY3RpbSA9IGk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzLVx1MDAzZWV4cGVjdGVkW3ZpY3RpbV0gPSBzZWN0b3IgJiM0MzsgYWR2YW5jZTtcbiYjNDM7XHRcdHMtXHUwMDNlc3RhbXBbdmljdGltXSA9IG5vdztcbiYjNDM7XHR9XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gYmFzZSAmIzQzOyBSVShuYnl0ZXMsIElPQ19QQUdFX1NJWkUpICogcGFnZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0Oy5zdHJ1Y3Rfb3BzXCYjMzQ7KVxuJiM0MztzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfbXMgPSB7XG4mIzQzO1x0LmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0X21zX2NhbGNfY29zdCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2NoYXIgTElDRU5TRVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVF9CUEYmIzM0OywKICAgICYjMzQ7QkxLX0NHUk9VUF9JT0NPU1QmIzM0OywKICAgICYjMzQ7QkxLX0NHUk9VUCYjMzQ7LAogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtCUEZfSklUJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aW9jb3N0X2JwZl9jYWxjX2Nvc3QmIzM0OywKICAgICYjMzQ7YnBmX2lvY29zdF9yZWcmIzM0OywKICAgICYjMzQ7YnBmX2lvY29zdF91bnJlZyYjMzQ7LAogICAgJiMzNDtpb2NfY29zdF9tb2RlbF93cml0ZSYjMzQ7LAogICAgJiMzNDtpb2NfY29zdF9tb2RlbF9wcmZpbGwmIzM0OywKICAgICYjMzQ7Y2FsY192dGltZV9jb3N0JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdF9vcHMgc3VwcG9ydCBmb3IgcGx1Z2dhYmxlIGNvc3QgbW9kZWxzIGluIHRoZSBibG9jayBpb2Nvc3QgY2dyb3VwIGNvbnRyb2xsZXIgKENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYpLiBJdCBhZGRzIHN0cnVjdF9vcHMgcmVnaXN0cmF0aW9uL3VucmVnaXN0cmF0aW9uIGNhbGxiYWNrcywgaW50ZWdyYXRlcyBkeW5hbWljIEJQRiBjb3N0IGNhbGN1bGF0aW9uIGludG8gdGhlIGJpbyBzdWJtaXNzaW9uIHBhdGgsIGFuZCBleHRlbmRzIHRoZSBjZ3JvdXAgaW8uY29zdC5tb2RlbCBjb25maWd1cmF0aW9uIGludGVyZmFjZS4gVGhlIGNvZGUgaXMgZnVsbHkgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgY2dyb3VwcyBhbmQgdGhlIEJQRiBzdWJzeXN0ZW0uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBTZXAgOCAxMTozNTo0MyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdAppbmRleCA4ZDI2MDM3NTFjNTFhLi41NGIwNTc0Y2U1ODZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12Mi5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0CkBAIC0yMTE1LDEwICYjNDM7MjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXMKIAlhcmUgZGVmaW5lZC4KIAogCSAgPT09PT0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JICBjdHJsCQkmIzM0O2F1dG8mIzM0OyBvciAmIzM0O3VzZXImIzM0OwomIzQzOwkgIGN0cmwJCSYjMzQ7YXV0byYjMzQ7LCAmIzM0O3VzZXImIzM0OyBvciAmIzM0O2JwZiYjMzQ7CiAJICBtb2RlbAkJVGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gJiMzNDtsaW5lYXImIzM0OwogCSAgPT09PT0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKJiM0MzsJV2hlbiAmIzM0O2N0cmwmIzM0OyBpcyAmIzM0O2JwZiYjMzQ7IChvbmx5IGF2YWlsYWJsZSB3aGVuCiYjNDM7CUNPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYgaXMgZW5hYmxlZCksIGNvc3QgY2FsY3VsYXRpb24gZm9yCiYjNDM7CXRoZSBkZXZpY2UgaXMgZGlzcGF0Y2hlZCB0byB0aGUgQlBGIHByb2dyYW0gcmVnaXN0ZXJlZCBhZ2FpbnN0CiYjNDM7CXRoZSBpb2Nvc3RfbW9kZWxfb3BzIHN0cnVjdF9vcHMuICBXcml0aW5nICYjMzQ7YnBmJiMzNDsgZmFpbHMgd2l0aCAtRUlOVkFMCiYjNDM7CXVudGlsIHN1Y2ggYSBwcm9ncmFtIGlzIHJlZ2lzdGVyZWQsIGFuZCBhdCBtb3N0IG9uZSBwcm9ncmFtIGNhbgomIzQzOwliZSByZWdpc3RlcmVkIHN5c3RlbS13aWRlLiAgVGhlIG1vZGVsIGlzIGNhbGxlZCB3aXRoIHNjYWxhcgomIzQzOwlhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlCiYjNDM7CWlzc3VpbmcgY2dyb3VwLCBmbGFnczsgc2VlIGluY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGZvciB0aGVpcgomIzQzOwltZWFuaW5nKSBhbmQgcmV0dXJucyBhIGNvc3QgaW4gdnRpbWUgdW5pdHMsIGNsYW1wZWQgYnkgdGhlIGtlcm5lbAomIzQzOwl0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlcwomIzQzOwl0aGUgSU8gYmFjayB0byB0aGUgYnVpbHRpbiBsaW5lYXIgZm9ybXVsYSwgc28gYSBtb2RlbCB3aGljaCBvbmx5CiYjNDM7CWhhbmRsZXMgc29tZSBJTyB0eXBlcyBjYW5ub3QgbWFrZSB0aGUgcmVzdCBmcmVlLiAgRGV2aWNlcyB3aGljaAomIzQzOwlkb24mIzM5O3Qgb3B0IGluIGtlZXAgdGhlIGJ1aWx0aW4gbGluZWFyIG1vZGVsIHVuY2hhbmdlZC4KJiM0MzsKIAlXaGVuICYjMzQ7Y3RybCYjMzQ7IGlzICYjMzQ7YXV0byYjMzQ7LCB0aGUga2VybmVsIG1heSBjaGFuZ2UgYWxsIHBhcmFtZXRlcnMKIAlkeW5hbWljYWxseS4gIFdoZW4gJiMzNDtjdHJsJiMzNDsgaXMgc2V0IHRvICYjMzQ7dXNlciYjMzQ7IG9yIGFueSBvdGhlcgogCXBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gdG8sICYjMzQ7Y3RybCYjMzQ7IGJlY29tZSAmIzM0O3VzZXImIzM0OyBhbmQgdGhlCmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCA3MGU0YTY2ZDk0MWZmLi5iZjQzYmUyMWUwMGJiIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL0tjb25maWcKQEAgLTIzMSw0ICYjNDM7MjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OCiAKIHNvdXJjZSAmIzM0O2Jsb2NrL0tjb25maWcuaW9zY2hlZCYjMzQ7CiAKJiM0Mztjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGCiYjNDM7CWJvb2wgJiMzNDtFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXImIzM0OwomIzQzOwlkZXBlbmRzIG9uIEJMS19DR1JPVVBfSU9DT1NUICZhbXA7JmFtcDsgQlBGX1NZU0NBTEwgJmFtcDsmYW1wOyBCUEZfSklUCiYjNDM7CWhlbHAKJiM0MzsJIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHJlZ2lzdGVycyB0aGUgJiMzNDtpb2Nvc3RfbW9kZWxfb3BzJiMzNDsgQlBGCiYjNDM7CSBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlCiYjNDM7CSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoCiYjNDM7CSAmIzM0O2N0cmw9YnBmJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLgomIzQzOwogZW5kaWYgIyBCTE9DSwpkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCBlN2JkMzIwZTNkNjk3Li5lZTVjZWJlZWEwMDZmIDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZQpAQCAtMzksMyAmIzQzOzM5LDQgQEAgb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTikJJiM0Mzs9IGJsay1jcnlwdG8ubyBibGstY3J5cHRvLXByb2ZpbGUubyBcCiAJCQkJCSAgIGJsay1jcnlwdG8tc3lzZnMubwogb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSykJJiM0Mzs9IGJsay1jcnlwdG8tZmFsbGJhY2subwogb2JqLSQoQ09ORklHX0JMT0NLX0hPTERFUl9ERVBSRUNBVEVEKQkmIzQzOz0gaG9sZGVyLm8KJiM0MztvYmotJChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKQkmIzQzOz0gYmxrLWlvY29zdC1icGYubwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWlvY29zdC1icGYuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMGMzNGY1NmRlZDcxZAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMKQEAgLTAsMCAmIzQzOzEsMTUyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy4KJiM0MzsgKgomIzQzOyAqIFJlZ2lzdGVycyB0aGUgJiMzNDtpb2Nvc3RfbW9kZWxfb3BzJiMzNDsgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWwKJiM0MzsgKiBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBhIHRpbWU7IGRldmljZXMgb3B0IGluIHBlci1xdWV1ZSB3aXRoCiYjNDM7ICogJiMzNDtlY2hvICRERVYgY3RybD1icGYgJmd0OyBpby5jb3N0Lm1vZGVsJiMzNDsuICBEZXZpY2VzIHdpdGhvdXQgYSByZWdpc3RlcmVkCiYjNDM7ICogbW9kZWwga2VlcCB1c2luZyB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwuCiYjNDM7ICovCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmX3ZlcmlmaWVyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ibGstaW9jb3N0LmgmZ3Q7CiYjNDM7CiYjNDM7LyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJiMzOTtzIGNoYXJnZWFibGUgY29zdCAqLwomIzQzOyNkZWZpbmUgSU9DT1NUX0JQRl9NQVhfQ09TVAkoMVVMTCAmbHQ7Jmx0OyAzNykKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzOwomIzQzOwomIzQzO3N0YXRpYyBERUZJTkVfTVVURVgoaW9jb3N0X2JwZl9yZWdfbG9jayk7CiYjNDM7c3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fcmN1ICppb2Nvc3RfYnBmX21vZGVsOwomIzQzO3N0YXRpYyBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShpb2Nvc3RfYnBmX2tleSk7CiYjNDM7CiYjNDM7Ym9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhbXA7aW9jb3N0X2JwZl9rZXkpOwomIzQzO30KJiM0MzsKJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqb3BzOwomIzQzOwl1NjQgY29zdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhbXA7aW9jb3N0X2JwZl9rZXkpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW9wcyA9IHJjdV9kZXJlZmVyZW5jZShpb2Nvc3RfYnBmX21vZGVsKTsKJiM0MzsJaWYgKCFvcHMpIHsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWNvc3QgPSBvcHMtJmd0O2NhbGNfY29zdChvcCwgbmJ5dGVzLCBzZWN0b3IsIGN1cnNvciwgaW9jZ19pZCwgZmxhZ3MpOwomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJaWYgKCFjb3N0KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkqY29zdHAgPSBtaW4oY29zdCwgSU9DT1NUX0JQRl9NQVhfQ09TVCk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdChzdHJ1Y3QgYnRmICpidGYpCiYjNDM7ewomIzQzOwlzMzIgdHlwZV9pZDsKJiM0MzsKJiM0MzsJdHlwZV9pZCA9IGJ0Zl9maW5kX2J5X25hbWVfa2luZChidGYsICYjMzQ7aW9jb3N0X21vZGVsX29wcyYjMzQ7LCBCVEZfS0lORF9TVFJVQ1QpOwomIzQzOwlpZiAodHlwZV9pZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnBmX2lvY29zdF9pbml0X21lbWJlcihjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsCiYjNDM7CQkJCSAgY29uc3Qgc3RydWN0IGJ0Zl9tZW1iZXIgKm1lbWJlciwKJiM0MzsJCQkJICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsCiYjNDM7CQkJCSAgICAgICBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLAomIzQzOwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLAomIzQzOwkJCQkgICAgICAgc3RydWN0IGJwZl9pbnNuX2FjY2Vzc19hdXggKmluZm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqCiYjNDM7YnBmX2lvY29zdF9nZXRfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQsCiYjNDM7CQkJICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0gewomIzQzOwkuZ2V0X2Z1bmNfcHJvdG8gPSBicGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvLAomIzQzOwkuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhOwomIzQzOwomIzQzOwlpZiAoIW5ld19vcHMtJmd0O2NhbGNfY29zdCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJLyogdGhlIGNhbGxlciBvbmx5IGhvbGRzIHRoZSBwZXItbWFwIGxvY2ssIHNvIHNlcmlhbGl6ZSBoZXJlICovCiYjNDM7CW11dGV4X2xvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0MzsJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsKSkKJiM0MzsJCXJldCA9IC1FQlVTWTsKJiM0MzsJZWxzZSB7CiYjNDM7CQlzdGF0aWNfYnJhbmNoX2luYygmYW1wO2lvY29zdF9icGZfa2V5KTsKJiM0MzsJCXJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBuZXdfb3BzKTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX2lvY29zdF91bnJlZyh2b2lkICprZGF0YSwgc3RydWN0IGJwZl9saW5rICpsaW5rKQomIzQzO3sKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO2lvY29zdF9icGZfcmVnX2xvY2spOwomIzQzOwlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpID09IGtkYXRhKSB7CiYjNDM7CQlyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7CiYjNDM7CQlzdGF0aWNfYnJhbmNoX2RlYygmYW1wO2lvY29zdF9icGZfa2V5KTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwKJiM0MzsJCQkJICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKQomIzQzO3sKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyA9IHsKJiM0MzsJLmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0gewomIzQzOwkudmVyaWZpZXJfb3BzID0gJmFtcDticGZfaW9jb3N0X3ZlcmlmaWVyX29wcywKJiM0MzsJLmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsCiYjNDM7CS5pbml0X21lbWJlciA9IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIsCiYjNDM7CS5yZWcgPSBicGZfaW9jb3N0X3JlZywKJiM0MzsJLnVucmVnID0gYnBmX2lvY29zdF91bnJlZywKJiM0MzsJLm5hbWUgPSAmIzM0O2lvY29zdF9tb2RlbF9vcHMmIzM0OywKJiM0MzsJLmNmaV9zdHVicyA9ICZhbXA7X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsCiYjNDM7CS5vd25lciA9IFRISVNfTU9EVUxFLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2lvY29zdF9pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoJmFtcDticGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QuYwppbmRleCAyNzQ1YmZmY2Q1ZWVmLi5hNThjMTZmY2IyOWZhIDEwMDY0NAotLS0gYS9ibG9jay9ibGstaW9jb3N0LmMKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWlvY29zdC5jCkBAIC0xNzcsNiAmIzQzOzE3Nyw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvdGltZXIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC90aW1lNjQuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wYXJzZXIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYmxrLWlvY29zdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL3NpZ25hbC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9sb2NhbC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9sb2NhbDY0LmgmZ3Q7CkBAIC00NDUsNiAmIzQzOzQ0Niw3IEBAIHN0cnVjdCBpb2MgewogCWludAkJCQlhdXRvcF9pZHg7CiAJYm9vbAkJCQl1c2VyX3Fvc19wYXJhbXM6MTsKIAlib29sCQkJCXVzZXJfY29zdF9tb2RlbDoxOwomIzQzOwlib29sCQkJCWJwZl9jb3N0X21vZGVsOwogfTsKIAogc3RydWN0IGlvY2dfcGNwdV9zdGF0IHsKQEAgLTIyMzgsNiAmIzQzOzIyNDAsNyBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogCXN0cnVjdCBpb2Nfbm93IG5vdzsKIAlMSVNUX0hFQUQoc3VycGx1c2VzKTsKIAlpbnQgbnJfZGVidG9ycywgbnJfc2hvcnRhZ2VzID0gMCwgbnJfbGFnZ2luZyA9IDA7CiYjNDM7CWludCBucl9hY3RpdmUgPSAwOwogCXU2NCB1c2FnZV91c19zdW0gPSAwOwogCXUzMiBwcG1fcnRocjsKIAl1MzIgcHBtX3d0aHI7CkBAIC0yMjc0LDYgJiM0MzsyMjc3LDggQEAgc3RhdGljIHZvaWQgaW9jX3RpbWVyX2ZuKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIAkJdTY0IHZkb25lLCB2dGltZSwgdXNhZ2VfdXM7CiAJCXUzMiBod19hY3RpdmUsIGh3X2ludXNlOwogCiYjNDM7CQlucl9hY3RpdmUmIzQzOyYjNDM7OwomIzQzOwogCQkvKgogCQkgKiBDb2xsZWN0IHVudXNlZCBhbmQgd2luZCB2dGltZSBjbG9zZXIgdG8gdm5vdyB0byBwcmV2ZW50CiAJCSAqIGlvY2dzIGZyb20gYWNjdW11bGF0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGJ1ZGdldC4KQEAgLTI0NjAsNiAmIzQzOzI0NjUsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogCQlpb2NfcmVmcmVzaF92cmF0ZShpb2MsICZhbXA7bm93KTsKIAl9CiAKJiM0MzsJdHJhY2VfaW9jb3N0X2lvY190aWNrKGlvYywgbnJfYWN0aXZlLCB1c2FnZV91c19zdW0pOwomIzQzOwogCXNwaW5fdW5sb2NrX2lycSgmYW1wO2lvYy0mZ3Q7bG9jayk7CiB9CiAKQEAgLTI1NzMsNiAmIzQzOzI1ODAsMjMgQEAgc3RhdGljIHU2NCBjYWxjX3Z0aW1lX2Nvc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLCBib29sIGlzX21lcmdlKQogewogCXU2NCBjb3N0OwogCiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYKJiM0MzsJc3RydWN0IGlvYyAqaW9jID0gaW9jZy0mZ3Q7aW9jOwomIzQzOwomIzQzOwlpZiAoUkVBRF9PTkNFKGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWwpKSB7CiYjNDM7CQl1NjQgYnBmX2Nvc3Q7CiYjNDM7CiYjNDM7CQlpZiAoaW9jb3N0X2JwZl9jYWxjX2Nvc3QoYmlvX29wKGJpbyksCiYjNDM7CQkJCQkgYmlvLSZndDtiaV9pdGVyLmJpX3NpemUsCiYjNDM7CQkJCQkgYmlvLSZndDtiaV9pdGVyLmJpX3NlY3RvciwKJiM0MzsJCQkJCSBpb2NnLSZndDtjdXJzb3IsCiYjNDM7CQkJCQkgaW9jZ190b19ibGtnKGlvY2cpLSZndDtibGtjZy0mZ3Q7Y3NzLmlkLAomIzQzOwkJCQkJIGlzX21lcmdlID8gSU9DT1NUX0NPU1RfRl9NRVJHRSA6IDAsCiYjNDM7CQkJCQkgJmFtcDticGZfY29zdCkpCiYjNDM7CQkJcmV0dXJuIGJwZl9jb3N0OwomIzQzOwl9CiYjNDM7I2VuZGlmCiYjNDM7CiAJY2FsY192dGltZV9jb3N0X2J1aWx0aW4oYmlvLCBpb2NnLCBpc19tZXJnZSwgJmFtcDtjb3N0KTsKIAlyZXR1cm4gY29zdDsKIH0KQEAgLTM0NDEsNyAmIzQzOzM0NjUsOCBAQCBzdGF0aWMgdTY0IGlvY19jb3N0X21vZGVsX3ByZmlsbChzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLAogCXNlcV9wcmludGYoc2YsICYjMzQ7JXMgY3RybD0lcyBtb2RlbD1saW5lYXIgJiMzNDsKIAkJICAgJiMzNDtyYnBzPSVsbHUgcnNlcWlvcHM9JWxsdSBycmFuZGlvcHM9JWxsdSAmIzM0OwogCQkgICAmIzM0O3dicHM9JWxsdSB3c2VxaW9wcz0lbGx1IHdyYW5kaW9wcz0lbGx1XG4mIzM0OywKLQkJICAgZG5hbWUsIGlvYy0mZ3Q7dXNlcl9jb3N0X21vZGVsID8gJiMzNDt1c2VyJiMzNDsgOiAmIzM0O2F1dG8mIzM0OywKJiM0MzsJCSAgIGRuYW1lLCBpb2MtJmd0O2JwZl9jb3N0X21vZGVsID8gJiMzNDticGYmIzM0OyA6CiYjNDM7CQkJICAgaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWwgPyAmIzM0O3VzZXImIzM0OyA6ICYjMzQ7YXV0byYjMzQ7LAogCQkgICB1W0lfTENPRUZfUkJQU10sIHVbSV9MQ09FRl9SU0VRSU9QU10sIHVbSV9MQ09FRl9SUkFORElPUFNdLAogCQkgICB1W0lfTENPRUZfV0JQU10sIHVbSV9MQ09FRl9XU0VRSU9QU10sIHVbSV9MQ09FRl9XUkFORElPUFNdKTsKIAlzcGluX3VubG9ja19pcnEoJmFtcDtpb2MtJmd0O2xvY2spOwpAQCAtMzQ4MSw3ICYjNDM7MzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsCiAJdW5zaWduZWQgaW50IG1lbWZsYWdzOwogCXN0cnVjdCBpb2MgKmlvYzsKIAl1NjQgdVtOUl9JX0xDT0VGU107Ci0JYm9vbCB1c2VyOwomIzQzOwlib29sIHVzZXIsIGJwZjsKIAljaGFyICpib2R5LCAqcDsKIAlpbnQgcmV0OwogCkBAIC0zNTEyLDYgJiM0MzszNTM3LDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCwKIAlzcGluX2xvY2tfaXJxKCZhbXA7aW9jLSZndDtsb2NrKTsKIAltZW1jcHkodSwgaW9jLSZndDtwYXJhbXMuaV9sY29lZnMsIHNpemVvZih1KSk7CiAJdXNlciA9IGlvYy0mZ3Q7dXNlcl9jb3N0X21vZGVsOwomIzQzOwlicGYgPSBpb2MtJmd0O2JwZl9jb3N0X21vZGVsOwogCiAJcmV0ID0gLUVJTlZBTDsKIApAQCAtMzUyNywxMSAmIzQzOzM1NTMsMjAgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCwKIAkJc3dpdGNoIChtYXRjaF90b2tlbihwLCBjb3N0X2N0cmxfdG9rZW5zLCBhcmdzKSkgewogCQljYXNlIENPU1RfQ1RSTDoKIAkJCW1hdGNoX3N0cmxjcHkoYnVmLCAmYW1wO2FyZ3NbMF0sIHNpemVvZihidWYpKTsKLQkJCWlmICghc3RyY21wKGJ1ZiwgJiMzNDthdXRvJiMzNDspKQomIzQzOwkJCWlmICghc3RyY21wKGJ1ZiwgJiMzNDthdXRvJiMzNDspKSB7CiAJCQkJdXNlciA9IGZhbHNlOwotCQkJZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7dXNlciYjMzQ7KSkKJiM0MzsJCQkJYnBmID0gZmFsc2U7CiYjNDM7CQkJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDt1c2VyJiMzNDspKSB7CiAJCQkJdXNlciA9IHRydWU7Ci0JCQllbHNlCiYjNDM7CQkJCWJwZiA9IGZhbHNlOwomIzQzOyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGCiYjNDM7CQkJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDticGYmIzM0OykpIHsKJiM0MzsJCQkJaWYgKCFpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQoKSkKJiM0MzsJCQkJCWdvdG8gdW5sb2NrOwomIzQzOwkJCQl1c2VyID0gZmFsc2U7CiYjNDM7CQkJCWJwZiA9IHRydWU7CiYjNDM7I2VuZGlmCiYjNDM7CQkJfSBlbHNlCiAJCQkJZ290byB1bmxvY2s7CiAJCQljb250aW51ZTsKIAkJY2FzZSBDT1NUX01PREVMOgpAQCAtMzU1Niw2ICYjNDM7MzU5MSw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsCiAJfSBlbHNlIHsKIAkJaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTsKIAl9CiYjNDM7CVdSSVRFX09OQ0UoaW9jLSZndDticGZfY29zdF9tb2RlbCwgYnBmKTsKIAlpb2NfcmVmcmVzaF9wYXJhbXMoaW9jLCB0cnVlKTsKIAogCXJldCA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBiL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjcxMTFiNWMwM2RjMzYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaApAQCAtMCwwICYjNDM7MSw1NiBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7I2lmbmRlZiBfTElOVVhfQkxLX0lPQ09TVF9ICiYjNDM7I2RlZmluZSBfTElOVVhfQkxLX0lPQ09TVF9ICiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFBsdWdnYWJsZSBjb3N0IG1vZGVsIGludGVyZmFjZSBmb3IgYmxrLWlvY29zdC4KJiM0MzsgKgomIzQzOyAqIEEgQlBGIHN0cnVjdF9vcHMgaW1wbGVtZW50YXRpb24gcmVnaXN0ZXJlZCBhZ2FpbnN0ICYjMzQ7aW9jb3N0X21vZGVsX29wcyYjMzQ7CiYjNDM7ICogcmVwbGFjZXMgdGhlIGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGgKJiM0MzsgKiAmIzM0O2N0cmw9YnBmJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLiAgVGhlIG1vZGVsIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiB0aGUKJiM0MzsgKiBhcmd1bWVudHMgYmVsb3cgYW5kIHJldHVybnMgdGhlIGNvc3Qgb2YgdGhlIElPIGluIGRldmljZSB0aW1lIHVuaXRzLAomIzQzOyAqIHdoZXJlIDEgc2Vjb25kIG9mIGRldmljZSB0aW1lIGVxdWFscyAyXjM3IChWVElNRV9QRVJfU0VDKS4gIFRoZQomIzQzOyAqIHJldHVybmVkIHZhbHVlIGlzIGNsYW1wZWQgYnkgdGhlIGtlcm5lbC4gIEEgY29zdCBvZiAwIGRlbGVnYXRlcyB0aGUKJiM0MzsgKiBJTyBiYWNrIHRvIHRoZSBidWlsdGluIGZvcm11bGEsIHNvIGEgbW9kZWwgd2hpY2ggZG9lcyBub3QgaGFuZGxlIGEKJiM0MzsgKiBnaXZlbiBJTyB0eXBlIGNhbm5vdCBtYWtlIGl0IGZyZWUuCiYjNDM7ICoKJiM0MzsgKiBUaGUgaW9jZ19pZCBhcmd1bWVudCBpZGVudGlmaWVzIHRoZSBpc3N1aW5nIGNncm91cCAoY3NzIGlkKSBzbyB0aGUKJiM0MzsgKiBtb2RlbCBjYW4ga2VlcCBwZXItY2dyb3VwIHN0YXRlLCBlLmcuIGZvciBtdWx0aS1zdHJlYW0gc2VxdWVudGlhbGl0eQomIzQzOyAqIGRldGVjdGlvbi4gIFRoZSBpZCBpcyBvbmx5IHZhbGlkIHdoaWxlIHRoZSBjZ3JvdXAgZXhpc3RzOiBjc3MgaWRzIGFyZQomIzQzOyAqIHJlY3ljbGVkIG9uY2UgdGhlIGNncm91cCBpcyByZW1vdmVkLCBzbyBtb2RlbHMgbXVzdCB0cmVhdCBpdCBhcyBhCiYjNDM7ICogdHJhbnNpZW50IGtleSBhbmQgcmVzZXQgc3RhdGUgd2hlbiB0aGV5IG9ic2VydmUgaXQgcmV1c2VkLiAgV2hldGhlcgomIzQzOyAqIHRoZSBpbnRlcmZhY2UgbmVlZHMgYSByZWxlYXNlKGlvY2dfaWQpIGNhbGxiYWNrIGZvciBzdGF0ZSBjbGVhbnVwIGlzCiYjNDM7ICogYW4gb3BlbiBxdWVzdGlvbi4KJiM0MzsgKgomIzQzOyAqIFRoZSBtb2RlbCBpcyBjYWxsZWQgZnJvbSB0aGUgSU8gc3VibWlzc2lvbiBwYXRoIHVuZGVyIFJDVSBhbmQgbXVzdAomIzQzOyAqIG5vdCBzbGVlcC4gIE9ubHkgdGhlIGJpby1sZXZlbCBjaGFyZ2luZyBwYXRoIGNvbnN1bHRzIHRoZSBtb2RlbDsKJiM0MzsgKiB0aGUgcmVxdWVzdC1sZXZlbCBzaXppbmcgcGF0aCAoY2FsY19zaXplX3Z0aW1lX2Nvc3QoKSkga2VlcHMgdXNpbmcKJiM0MzsgKiB0aGUgYnVpbHRpbiBmb3JtdWxhLgomIzQzOyAqLwomIzQzOwomIzQzOy8qIGZsYWdzIGZvciBjYWxjX2Nvc3QoKSAqLwomIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRQkoMVVMTCAmbHQ7Jmx0OyAwKQkvKiBjYWxsZWQgZnJvbSBtZXJnZSBwYXRoICovCiYjNDM7CiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgewomIzQzOwkvKgomIzQzOwkgKiBAb3A6CQlSRVFfT1BfKiB2YWx1ZSAodWFwaSBibGtfb3BmLmgpCiYjNDM7CSAqIEBuYnl0ZXM6CUlPIHNpemUgaW4gYnl0ZXMKJiM0MzsJICogQHNlY3RvcjoJc3RhcnRpbmcgc2VjdG9yCiYjNDM7CSAqIEBjdXJzb3I6CWlvY2cgY3Vyc29yIHNlY3RvciwgMCBpZiBub25lIChzZXF1ZW50aWFsaXR5IGhpbnQpCiYjNDM7CSAqIEBpb2NnX2lkOgljc3MgaWQgb2YgdGhlIGlzc3VpbmcgY2dyb3VwCiYjNDM7CSAqIEBmbGFnczoJSU9DT1NUX0NPU1RfRl8qCiYjNDM7CSAqLwomIzQzOwl1NjQgKCpjYWxjX2Nvc3QpKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgdTY0IGlvY2dfaWQsIHU2NCBmbGFncyk7CiYjNDM7fTsKJiM0MzsKJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApOwomIzQzO2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpOwomIzQzOwomIzQzOyNlbmRpZgkvKiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGICovCiYjNDM7I2VuZGlmCS8qIF9MSU5VWF9CTEtfSU9DT1NUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKaW5kZXggZTc3MmIxYmM2MGQ2MC4uMmI5ZmYzNDhhNGY1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKQEAgLTE3OCw2ICYjNDM7MTc4LDQ2IEBAIFRSQUNFX0VWRU5UKGlvY29zdF9pb2NfdnJhdGVfYWRqLAogCSkKICk7CiAKJiM0MzsvKgomIzQzOyAqIFBlcmlvZGljIHBlci1kZXZpY2Ugc3VtbWFyeSwgZW1pdHRlZCBvbmNlIHBlciBwZXJpb2QgZnJvbSB0aGUgdGFpbCBvZgomIzQzOyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5CiYjNDM7ICogcGVyaW9kIHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGluY2x1ZGluZyBzdGVhZHkgc3RhdGVzLCBhbmQgY2FycmllcwomIzQzOyAqIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3RhdGUgc28gYmFzaWMgbW9uaXRvcmluZyBkb2VzbiYjMzk7dCByZXF1aXJlIGRyZ24uCiYjNDM7ICovCiYjNDM7VFJBQ0VfRVZFTlQoaW9jb3N0X2lvY190aWNrLAomIzQzOwomIzQzOwlUUF9QUk9UTyhzdHJ1Y3QgaW9jICppb2MsIGludCBucl9hY3RpdmUsIHU2NCB1c2FnZV91c19zdW0pLAomIzQzOwomIzQzOwlUUF9BUkdTKGlvYywgbnJfYWN0aXZlLCB1c2FnZV91c19zdW0pLAomIzQzOwomIzQzOwlUUF9TVFJVQ1RfX2VudHJ5ICgKJiM0MzsJCV9fc3RyaW5nKGRldm5hbWUsIGlvY19uYW1lKGlvYykpCiYjNDM7CQlfX2ZpZWxkKHUzMiwgcGVyaW9kX3VzKQomIzQzOwkJX19maWVsZCh1NjQsIHZyYXRlKQomIzQzOwkJX19maWVsZChpbnQsIGJ1c3lfbGV2ZWwpCiYjNDM7CQlfX2ZpZWxkKGludCwgbnJfYWN0aXZlKQomIzQzOwkJX19maWVsZCh1MzIsIHVzYWdlX3BjdCkKJiM0MzsJCV9fZmllbGQoaW50LCBydW5uaW5nKQomIzQzOwkpLAomIzQzOwomIzQzOwlUUF9mYXN0X2Fzc2lnbigKJiM0MzsJCV9fYXNzaWduX3N0cihkZXZuYW1lKTsKJiM0MzsJCV9fZW50cnktJmd0O3BlcmlvZF91cyA9IGlvYy0mZ3Q7cGVyaW9kX3VzOwomIzQzOwkJX19lbnRyeS0mZ3Q7dnJhdGUgPSBpb2MtJmd0O3Z0aW1lX2Jhc2VfcmF0ZTsKJiM0MzsJCV9fZW50cnktJmd0O2J1c3lfbGV2ZWwgPSBpb2MtJmd0O2J1c3lfbGV2ZWw7CiYjNDM7CQlfX2VudHJ5LSZndDtucl9hY3RpdmUgPSBucl9hY3RpdmU7CiYjNDM7CQlfX2VudHJ5LSZndDt1c2FnZV9wY3QgPSBpb2MtJmd0O3BlcmlvZF91cyA/CiYjNDM7CQkJZGl2X3U2NCh1c2FnZV91c19zdW0gKiAxMDAsIGlvYy0mZ3Q7cGVyaW9kX3VzKSA6IDA7CiYjNDM7CQlfX2VudHJ5LSZndDtydW5uaW5nID0gaW9jLSZndDtydW5uaW5nOwomIzQzOwkpLAomIzQzOwomIzQzOwlUUF9wcmludGsoJiMzNDtbJXNdIHBlcmlvZD0ldXVzIHZyYXRlPSVsbHUgYnVzeT0lZCBhY3RpdmU9JWQgdXNhZ2U9JXUlJSBydW5uaW5nPSVkJiMzNDssCiYjNDM7CQlfX2dldF9zdHIoZGV2bmFtZSksIF9fZW50cnktJmd0O3BlcmlvZF91cywgX19lbnRyeS0mZ3Q7dnJhdGUsCiYjNDM7CQlfX2VudHJ5LSZndDtidXN5X2xldmVsLCBfX2VudHJ5LSZndDtucl9hY3RpdmUsIF9fZW50cnktJmd0O3VzYWdlX3BjdCwKJiM0MzsJCV9fZW50cnktJmd0O3J1bm5pbmcKJiM0MzsJKQomIzQzOyk7CiYjNDM7CiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsCiAKIAlUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmMKQEAgLTAsMCAmIzQzOzEsMTU1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDtpb2Nvc3RfbW9kZWwuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2lvY29zdF9tcy5za2VsLmgmIzM0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZQomIzQzOyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KJiM0MzsgKiBTaGFyZWQgYnkgdGhlIGV4YW1wbGUtbW9kZWwgdGVzdHMgYmVsb3cuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldikKJiM0Mzt7CiYjNDM7CWNoYXIgcGF0aFtdID0gJiMzNDsvc3lzL2ZzL2Nncm91cC9pby5jb3N0Lm1vZGVsJiMzNDs7CiYjNDM7CWNoYXIgd29yZFsyNTZdLCBsaW5lWzI1Nl0sIGJ1ZlszMDBdOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJaW50IGVyciwgZm91bmQgPSAwOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHBhdGgsICYjMzQ7ciYjNDM7JiMzNDspOwomIzQzOwlpZiAoIWZwKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtvcGVuICVzOiAlcyYjMzQ7LCBwYXRoLCBzdHJlcnJvcihlcnJubykpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyUyNTVzJiMzNDssIHdvcmQpID09IDEgJmFtcDsmYW1wOyAhc3RyY21wKHdvcmQsIGRldikpIHsKJiM0MzsJCQlmb3VuZCA9IDE7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKCFmb3VuZCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7JXMgaGFzIG5vIGlvY29zdCBsaW5lJiMzNDssIGRldik7CiYjNDM7CQlmY2xvc2UoZnApOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXMgY3RybD1icGYmIzM0OywgZGV2KTsKJiM0MzsJZXJyID0gZnByaW50ZihmcCwgJiMzNDslc1xuJiMzNDssIGJ1Zik7CiYjNDM7CWlmIChlcnIgJmx0Oz0gMCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7d3JpdGUgY3RybD1icGYgZmFpbGVkJiMzNDspOwomIzQzOwkJZmNsb3NlKGZwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlmZmx1c2goZnApOwomIzQzOwomIzQzOwlyZXdpbmQoZnApOwomIzQzOwlmb3VuZCA9IDA7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyUyNTVzJiMzNDssIHdvcmQpID09IDEgJmFtcDsmYW1wOyAhc3RyY21wKHdvcmQsIGRldikpIHsKJiM0MzsJCQlmb3VuZCA9IHN0cnN0cihsaW5lLCAmIzM0O2N0cmw9YnBmJiMzNDspICE9IE5VTEw7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKCFmb3VuZCkKJiM0MzsJCVRIX0xPRygmIzM0O3JlYWRiYWNrIGRvZXMgbm90IHNob3cgY3RybD1icGYmIzM0Oyk7CiYjNDM7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JXMgY3RybD1hdXRvXG4mIzM0OywgZGV2KTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGZvdW5kID8gMCA6IC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpCiYjNDM7ewomIzQzOwlGSUxFICpmcCA9IGZvcGVuKCYjMzQ7L3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5xb3MmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzOwomIzQzOwlpZiAoZnApCiYjNDM7CQlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gZnAgIT0gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZWdpc3RlciB0aGUgZXhhbXBsZSBjb3N0IG1vZGVsIGFuZCBzd2l0Y2ggYSBkZXZpY2UgdG8gY3RybD1icGYuCiYjNDM7ICogSU8gYWNjb3VudGluZyBpdHNlbGYgaXMgbm90IGNoZWNrZWQgaGVyZTsgaXQgbmVlZHMgYSBkZXZpY2UgZG9pbmcKJiM0MzsgKiByZWFsIElPIHVuZGVyIGlvY29zdCBhbmQgaXMgY292ZXJlZCBieSB0aGUga2VybmVsLXNpZGUgdmFsaWRhdGlvbgomIzQzOyAqIGRlc2NyaWJlZCBpbiB0aGUgY292ZXIgbGV0dGVyLgomIzQzOyAqCiYjNDM7ICogUmVxdWlyZXMgcm9vdCwgY2dyb3VwIHYyIGFuZCBhIGRldmljZSB3aXRoIGlvY29zdCBzdXBwb3J0LiAgVGhlCiYjNDM7ICogZGV2aWNlIG11c3QgYmUgZ2l2ZW4gYXMgbWFqb3I6bWlub3IgaW4gJElPQ09TVF9URVNUX0RFViwgb3RoZXJ3aXNlCiYjNDM7ICogdGhlIHRlc3QgaXMgc2tpcHBlZC4KJiM0MzsgKi8KJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvY29zdF9tb2RlbCAqc2tlbDsKJiM0MzsJY2hhciB3b3JkWzI1Nl0sICpkZXY7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWRldiA9IGdldGVudigmIzM0O0lPQ09TVF9URVNUX0RFViYjMzQ7KTsKJiM0MzsJaWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKGRldl9oYXNfaW9jb3N0KCksICYjMzQ7aW9jb3N0X21vdW50ZWQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qIG5lZ2F0aXZlOiBjdHJsPWJwZiBtdXN0IGJlIHJlamVjdGVkIHdoaWxlIG5vIG1vZGVsIGlzCiYjNDM7CSAqIHJlZ2lzdGVyZWQsIHNvIGEgdHlwbyBjYW5ub3Qgc2lsZW50bHkgZGlzYWJsZSBjb3N0IG1vZGVsCiYjNDM7CSAqIHVwZGF0ZXMgKi8KJiM0MzsJaWYgKHNzY2FuZihkZXYsICYjMzQ7JTI1NXMmIzM0Oywgd29yZCkgIT0gMSkKJiM0MzsJCXJldHVybjsKJiM0MzsJewomIzQzOwkJY2hhciBwYXRoW10gPSAmIzM0Oy9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWwmIzM0OzsKJiM0MzsJCWNoYXIgYnVmWzMwMF07CiYjNDM7CQlGSUxFICpmcCA9IGZvcGVuKHBhdGgsICYjMzQ7dyYjMzQ7KTsKJiM0MzsKJiM0MzsJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXMgY3RybD1icGZcbiYjMzQ7LCB3b3JkKTsKJiM0MzsJCWVyciA9IDA7CiYjNDM7CQlpZiAoZnApIHsKJiM0MzsJCQllcnIgPSBmcHJpbnRmKGZwLCAmIzM0OyVzJiMzNDssIGJ1ZikgJmx0Oz0gMDsKJiM0MzsJCQlmY2xvc2UoZnApOwomIzQzOwkJfQomIzQzOwkJQVNTRVJUX1RSVUUoZXJyLCAmIzM0O2N0cmxfYnBmX3dpdGhvdXRfbW9kZWxfcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2tlbCA9IGlvY29zdF9tb2RlbF9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtza2VsX29wZW5fbG9hZCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJLyogYXR0YWNoaW5nIHRoZSBzdHJ1Y3Rfb3BzIHJlZ2lzdGVycyB0aGUgbW9kZWw7IGEgc2Vjb25kCiYjNDM7CSAqIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc2FtZSBvcHMgd291bGQgZmFpbCB3aXRoIEVCVVNZICovCiYjNDM7CWVyciA9IGlvY29zdF9tb2RlbF9fYXR0YWNoKHNrZWwpOwomIzQzOwlpZiAoQVNTRVJUX09LKGVyciwgJiMzNDthdHRhY2gmIzM0OykpCiYjNDM7CQlBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCAmIzM0O3N3aXRjaF9hbmRfcmVhZGJhY2smIzM0Oyk7CiYjNDM7CiYjNDM7CWlvY29zdF9tb2RlbF9fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTYW1lIGNoZWNrIGZvciB0aGUgbXVsdGktc3RyZWFtIGV4YW1wbGUgbW9kZWwuICBPbmx5IG9uZSBtb2RlbCBjYW4KJiM0MzsgKiBiZSByZWdpc3RlcmVkIGF0IGEgdGltZSwgc28gdGhpcyB0ZXN0IG11c3QgcnVuIHNlcGFyYXRlbHkgZnJvbQomIzQzOyAqIHRlc3RfaW9jb3N0X21vZGVsOyBib3RoIGFyZSBzZXJpYWwuCiYjNDM7ICovCiYjNDM7dm9pZCBzZXJpYWxfdGVzdF9pb2Nvc3RfbW9kZWxfc3RyZWFtcyh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvY29zdF9tcyAqc2tlbDsKJiM0MzsJY2hhciAqZGV2OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlkZXYgPSBnZXRlbnYoJiMzNDtJT0NPU1RfVEVTVF9ERVYmIzM0Oyk7CiYjNDM7CWlmICghZGV2IHx8IGdldGV1aWQoKSAhPSAwKSB7CiYjNDM7CQl0ZXN0X19za2lwKCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCAmIzM0O2lvY29zdF9tb3VudGVkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlza2VsID0gaW9jb3N0X21zX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3NrZWxfb3Blbl9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBpb2Nvc3RfbXNfX2F0dGFjaChza2VsKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhlcnIsICYjMzQ7YXR0YWNoJiMzNDspKQomIzQzOwkJQVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgJiMzNDtzd2l0Y2hfYW5kX3JlYWRiYWNrJiMzNDspOwomIzQzOwomIzQzOwlpb2Nvc3RfbXNfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tb2RlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21vZGVsLmMKQEAgLTAsMCAmIzQzOzEsOTEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovCiYjNDM7LyoKJiM0MzsgKiBFeGFtcGxlIGlvY29zdCBjb3N0IG1vZGVsOiB0aGUgYnVpbHRpbiBsaW5lYXIgSEREIGZvcm11bGEgd2l0aCBhbGwKJiM0MzsgKiBjb3N0cyBkb3VibGVkLgomIzQzOyAqCiYjNDM7ICogVGhlIGNvbnN0YW50cyBtaXJyb3Igd2hhdCBjYWxjX2xjb2VmcygpIGRlcml2ZXMgZnJvbSB0aGUgQVVUT1BfSERECiYjNDM7ICogZGVmYXVsdHMgKHJicHM9MTc0MDE5MTc2IHJzZXFpb3BzPTQxNzA4IHJyYW5kaW9wcz0zNzAsIHctc2lkZQomIzQzOyAqIGFuYWxvZykgaW4gdnRpbWUgdW5pdHMgd2hlcmUgMXMgPT0gMl4zNywgZXhwcmVzc2VkIHdpdGggdGhlIHNhbWUKJiM0MzsgKiByb3VuZC11cCBkaXZpc2lvbnMgc28gdGhleSBjYW5ub3QgZHJpZnQgZnJvbSB0aGUga2VybmVsLCBzbyBhCiYjNDM7ICogZGV2aWNlIHN3aXRjaGVkIHRvIGN0cmw9YnBmIHdpdGggdGhpcyBtb2RlbCByZWdpc3RlcmVkIGNoYXJnZXMKJiM0MzsgKiBleGFjdGx5IHR3aWNlIHRoZSBidWlsdGluIG1vZGVsIHVuZGVyIHRoZSBzYW1lIHdvcmtsb2FkLCB3aGljaAomIzQzOyAqIG1ha2VzIGl0IGEgY29udmVuaWVudCB3YXkgdG8gdmVyaWZ5IHRoYXQgYWNjb3VudGluZyBnb2VzIHRocm91Z2gKJiM0MzsgKiB0aGUgQlBGIHBhdGguCiYjNDM7ICovCiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7LyogVlRJTUVfUEVSX1NFQyBjb21lcyBmcm9tIHZtbGludXguaCAoYSBCVEYgZW51bSBjb25zdGFudCkgKi8KJiM0MzsjZGVmaW5lIElPQ19QQUdFX1NJWkUJCTQwOTYKJiM0MzsjZGVmaW5lIElPQ19TRUNUX1RPX1BBR0VfU0hJRlQJMwkvKiA1MTJCIHNlY3RvcnMgdG8gNGtCIHBhZ2VzICovCiYjNDM7I2RlZmluZSBMQ09FRl9SQU5ESU9fUEFHRVMJNDA5NgkvKiAxNk1CIHNlZWsgdGhyZXNob2xkICovCiYjNDM7I2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFCSgxVUxMICZsdDsmbHQ7IDApCS8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi8KJiM0MzsKJiM0MzsvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXQKJiM0MzsgKiBjb21waWxlIHRpbWUgKi8KJiM0MzsjZGVmaW5lIFJVKHgsIHkpCQkoKHgpIC8gKHkpICYjNDM7ICgoKHgpICUgKHkpKSA/IDEgOiAwKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFJCUFMJMTc0MDE5MTc2VUxMCiYjNDM7I2RlZmluZSBSU0VRSU9QUwk0MTcwOFVMTAomIzQzOyNkZWZpbmUgUlJBTkRJT1BTCTM3MFVMTAomIzQzOyNkZWZpbmUgV0JQUwkxNzgwNzU4NjZVTEwKJiM0MzsjZGVmaW5lIFdTRVFJT1BTCTQyNzA1VUxMCiYjNDM7I2RlZmluZSBXUkFORElPUFMJMzc4VUxMCiYjNDM7CiYjNDM7I2RlZmluZSBSUEFHRQkoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKQomIzQzOyNkZWZpbmUgUlNFUUlPCShSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSkKJiM0MzsjZGVmaW5lIFJSQU5ESU8JKFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSkKJiM0MzsjZGVmaW5lIFdQQUdFCShSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpCiYjNDM7I2RlZmluZSBXU0VRSU8JKFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKQomIzQzOyNkZWZpbmUgV1JBTkRJTwkoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTY0IGJ1aWx0aW5fY29zdCh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsCiYjNDM7CQkJCQl1NjQgY3Vyc29yLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwl1NjQgcGFnZXMsIHNlZWtfcGFnZXMgPSAwLCBiYXNlLCBjb2VmX3BhZ2U7CiYjNDM7CiYjNDM7CWlmICghbmJ5dGVzKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXN3aXRjaCAob3ApIHsKJiM0MzsJY2FzZSBSRVFfT1BfUkVBRDoKJiM0MzsJCWJhc2UgPSBSU0VRSU87CiYjNDM7CQljb2VmX3BhZ2UgPSBSUEFHRTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJFUV9PUF9XUklURToKJiM0MzsJCWJhc2UgPSBXU0VRSU87CiYjNDM7CQljb2VmX3BhZ2UgPSBXUEFHRTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGN1cnNvcikgewomIzQzOwkJc2Vla19wYWdlcyA9IHNlY3RvciAmZ3Q7IGN1cnNvciA/IHNlY3RvciAtIGN1cnNvcgomIzQzOwkJCQkJICAgICA6IGN1cnNvciAtIHNlY3RvcjsKJiM0MzsJCXNlZWtfcGFnZXMgJmd0OyZndDs9IElPQ19TRUNUX1RPX1BBR0VfU0hJRlQ7CiYjNDM7CQlpZiAoc2Vla19wYWdlcyAmZ3Q7IExDT0VGX1JBTkRJT19QQUdFUykKJiM0MzsJCQliYXNlID0gKG9wID09IFJFUV9PUF9SRUFEKSA/IFJSQU5ESU8gOiBXUkFORElPOwomIzQzOwl9CiYjNDM7CiYjNDM7CXBhZ2VzID0gUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKTsKJiM0MzsJaWYgKGZsYWdzICZhbXA7IElPQ09TVF9DT1NUX0ZfTUVSR0UpCiYjNDM7CQliYXNlID0gMDsKJiM0MzsJcmV0dXJuIGJhc2UgJiM0MzsgcGFnZXMgKiBjb2VmX3BhZ2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N0cnVjdF9vcHMmIzM0OykKJiM0Mzt1NjQgQlBGX1BST0coaW9jb3N0XzJ4X2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLAomIzQzOwkgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwlyZXR1cm4gMiAqIGJ1aWx0aW5fY29zdChvcCwgbmJ5dGVzLCBzZWN0b3IsIGN1cnNvciwgZmxhZ3MpOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDsuc3RydWN0X29wcyYjMzQ7KQomIzQzO3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIGlvY29zdF8yeCA9IHsKJiM0MzsJLmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0XzJ4X2NhbGNfY29zdCwKJiM0Mzt9OwomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjQ2NWZkNWQ1YzYyZTAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmMKQEAgLTAsMCAmIzQzOzEsMTIyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOy8qCiYjNDM7ICogRXhhbXBsZSBtdWx0aS1zdHJlYW0gc2VxdWVudGlhbGl0eSBkZXRlY3Rpb24gY29zdCBtb2RlbC4KJiM0MzsgKgomIzQzOyAqIFRoZSBidWlsdGluIG1vZGVsIGtlZXBzIGEgc2luZ2xlIGN1cnNvciBwZXIgY2dyb3VwLCBzbyB0d28KJiM0MzsgKiBpbnRlcmxlYXZlZCBzZXF1ZW50aWFsIHJlYWRlcnMgaW4gb25lIGNncm91cCBhcmUgYWxsIHByaWNlZCByYW5kb20KJiM0MzsgKiAobWVhc3VyZWQgODl4IG92ZXJjaGFyZ2UsIDEyLjl4IHRocm91Z2hwdXQgY29sbGFwc2UpLCB3aGlsZSByYW5kb20KJiM0MzsgKiBJTyBpbnNpZGUgYSBob3Qgd2luZG93IHNtYWxsZXIgdGhhbiB0aGUgMTZNQiBzZWVrIHRocmVzaG9sZCBpcwomIzQzOyAqIHByaWNlZCBzZXF1ZW50aWFsIChtZWFzdXJlZCAxMDd4IHVuZGVyY2hhcmdlKS4gIFRoaXMgbW9kZWwgcmVwbGFjZXMKJiM0MzsgKiB0aGUgc2luZ2xlIGN1cnNvciB3aXRoIGEgcGVyLWNncm91cCB0YWJsZSBvZiBzdHJlYW0gc2xvdHMsIGtleWVkIGJ5CiYjNDM7ICogdGhlIGlvY2dfaWQgYXJndW1lbnQ6IGFuIElPIGlzIHNlcXVlbnRpYWwgaWZmIGl0cyBzZWN0b3IgbWF0Y2hlcyB0aGUKJiM0MzsgKiBleHBlY3RlZCBuZXh0IHNlY3RvciBvZiBhbnkgdHJhY2tlZCBzdHJlYW0uICBJbnRlcmxlYXZlZCBzdHJlYW1zCiYjNDM7ICoga2VlcCB0aGVpciBvd24gc2xvdHMsIGFuZCB3aW5kb3dlZCByYW5kb20gSU8gcmFyZWx5IG1hdGNoZXMgYQomIzQzOyAqIG1vdmluZyBleHBlY3RhdGlvbi4KJiM0MzsgKi8KJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsKJiM0MzsvKiBWVElNRV9QRVJfU0VDIGNvbWVzIGZyb20gdm1saW51eC5oIChhIEJURiBlbnVtIGNvbnN0YW50KSAqLwomIzQzOyNkZWZpbmUgSU9DX1BBR0VfU0laRQkJNDA5NgomIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRQkoMVVMTCAmbHQ7Jmx0OyAwKQkvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovCiYjNDM7CiYjNDM7LyogRElWNjRfVTY0X1JPVU5EX1VQIC8gRElWX1JPVU5EX1VQX1VMTCBlcXVpdmFsZW50cywgZm9sZGVkIGF0CiYjNDM7ICogY29tcGlsZSB0aW1lICovCiYjNDM7I2RlZmluZSBSVSh4LCB5KQkJKCh4KSAvICh5KSAmIzQzOyAoKCh4KSAlICh5KSkgPyAxIDogMCkpCiYjNDM7CiYjNDM7I2RlZmluZSBSQlBTCTE3NDAxOTE3NlVMTAomIzQzOyNkZWZpbmUgUlNFUUlPUFMJNDE3MDhVTEwKJiM0MzsjZGVmaW5lIFJSQU5ESU9QUwkzNzBVTEwKJiM0MzsjZGVmaW5lIFdCUFMJMTc4MDc1ODY2VUxMCiYjNDM7I2RlZmluZSBXU0VRSU9QUwk0MjcwNVVMTAomIzQzOyNkZWZpbmUgV1JBTkRJT1BTCTM3OFVMTAomIzQzOwomIzQzOyNkZWZpbmUgUlBBR0UJKFJVKFZUSU1FX1BFUl9TRUMsIFJVKFJCUFMsIElPQ19QQUdFX1NJWkUpKSkKJiM0MzsjZGVmaW5lIFJTRVFJTwkoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpCiYjNDM7I2RlZmluZSBSUkFORElPCShSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpCiYjNDM7I2RlZmluZSBXUEFHRQkoUlUoVlRJTUVfUEVSX1NFQywgUlUoV0JQUywgSU9DX1BBR0VfU0laRSkpKQomIzQzOyNkZWZpbmUgV1NFUUlPCShSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSkKJiM0MzsjZGVmaW5lIFdSQU5ESU8JKFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSkKJiM0MzsKJiM0MzsjZGVmaW5lIE5TTE9UUwk0CiYjNDM7CiYjNDM7c3RydWN0IHN0cmVhbXMgewomIzQzOwlfX3U2NCBleHBlY3RlZFtOU0xPVFNdOwkvKiBuZXh0IGV4cGVjdGVkIHNlY3RvciwgcGVyIHN0cmVhbSAqLwomIzQzOwlfX3U2NCBzdGFtcFtOU0xPVFNdOwkvKiBMUlUgc3RhbXAsIDAgPSBlbXB0eSAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTsKJiM0MzsJX190eXBlKGtleSwgX191NjQpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCBzdHJlYW1zKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCA2NCk7CiYjNDM7fSBzdHJlYW1fdGFiIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO1NFQygmIzM0O3N0cnVjdF9vcHMmIzM0OykKJiM0Mzt1NjQgQlBGX1BST0coaW9jb3N0X21zX2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLAomIzQzOwkgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RyZWFtcyAqczsKJiM0MzsJdTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdzsKJiM0MzsJdTMyIGksIHZpY3RpbSA9IDAsIGZvdW5kID0gMHhGRkZGRkZGRjsKJiM0MzsKJiM0MzsJaWYgKG9wICE9IFJFUV9PUF9SRUFEICZhbXA7JmFtcDsgb3AgIT0gUkVRX09QX1dSSVRFKQomIzQzOwkJcmV0dXJuIDA7CS8qIGRlbGVnYXRlIHRoZSByZXN0IHRvIGJ1aWx0aW4gKi8KJiM0MzsJaWYgKCFuYnl0ZXMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJaWYgKG9wID09IFJFUV9PUF9SRUFEKSB7CiYjNDM7CQlwYWdlID0gUlBBR0U7IHNlcWlvID0gUlNFUUlPOyByYW5kaW8gPSBSUkFORElPOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcGFnZSA9IFdQQUdFOyBzZXFpbyA9IFdTRVFJTzsgcmFuZGlvID0gV1JBTkRJTzsKJiM0MzsJfQomIzQzOwlhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpOwkvKiBzZWN0b3JzICovCiYjNDM7CiYjNDM7CXMgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7c3RyZWFtX3RhYiwgJmFtcDtpb2NnX2lkKTsKJiM0MzsJaWYgKCFzKSB7CiYjNDM7CQlzdHJ1Y3Qgc3RyZWFtcyB6ZXJvID0ge307CiYjNDM7CiYjNDM7CQlicGZfbWFwX3VwZGF0ZV9lbGVtKCZhbXA7c3RyZWFtX3RhYiwgJmFtcDtpb2NnX2lkLCAmYW1wO3plcm8sCiYjNDM7CQkJCSAgICBCUEZfTk9FWElTVCk7CiYjNDM7CQlzID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3N0cmVhbV90YWIsICZhbXA7aW9jZ19pZCk7CiYjNDM7CQlpZiAoIXMpCiYjNDM7CQkJcmV0dXJuIHNlcWlvICYjNDM7IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmbGFncyAmYW1wOyBJT0NPU1RfQ09TVF9GX01FUkdFKSB7CiYjNDM7CQliYXNlID0gMDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5vdyA9IGJwZl9rdGltZV9nZXRfbnMoKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5TTE9UUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChzLSZndDtleHBlY3RlZFtpXSA9PSBzZWN0b3IgJmFtcDsmYW1wOyBzLSZndDtzdGFtcFtpXSkgewomIzQzOwkJCWZvdW5kID0gaTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlpZiAoZm91bmQgIT0gMHhGRkZGRkZGRikgewomIzQzOwkJYmFzZSA9IHNlcWlvOwomIzQzOwkJcy0mZ3Q7ZXhwZWN0ZWRbZm91bmRdID0gc2VjdG9yICYjNDM7IGFkdmFuY2U7CiYjNDM7CQlzLSZndDtzdGFtcFtmb3VuZF0gPSBub3c7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQliYXNlID0gcmFuZGlvOwomIzQzOwkJZm9yIChpID0gMTsgaSAmbHQ7IE5TTE9UUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAocy0mZ3Q7c3RhbXBbaV0gJmx0OyBzLSZndDtzdGFtcFt2aWN0aW1dKQomIzQzOwkJCQl2aWN0aW0gPSBpOwomIzQzOwkJfQomIzQzOwkJcy0mZ3Q7ZXhwZWN0ZWRbdmljdGltXSA9IHNlY3RvciAmIzQzOyBhZHZhbmNlOwomIzQzOwkJcy0mZ3Q7c3RhbXBbdmljdGltXSA9IG5vdzsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJcmV0dXJuIGJhc2UgJiM0MzsgUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKSAqIHBhZ2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0Oy5zdHJ1Y3Rfb3BzJiMzNDspCiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgaW9jb3N0X21zID0gewomIzQzOwkuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LAomIzQzO307CiYjNDM7CiYjNDM7Y2hhciBMSUNFTlNFW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNDMxCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIEJQRi1CYXNlZCBJL08gQ29zdCBNb2RlbCBQYXRjaCBTZXJpZXMqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoIHNlcmllcy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGJyZWFrIGRvd24gdGhlIGNoYW5nZXMgbWV0aG9kaWNhbGx5LiBGaXJzdCwgSSBuZWVkIGEgY2xlYXIgdW5kZXJzdGFuZGluZyBvZiB3aGF0JiMzOTtzIGJlaW5nIGludHJvZHVjZWQgYW5kIG1vZGlmaWVkLiBCYXNlZCBvbiB0aGUgcGF0Y2ggc3VtbWFyeSwgaXQgbG9va3MgbGlrZSB0aGlzIGlzIGEgZm9jdXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIEJQRi1iYXNlZCBJL08gY29zdCBtb2RlbCB3aXRoaW4gdGhlIGJsb2NrIGxheWVyLCB3aGljaCBpcyBzb21ldGhpbmcgSSYjMzk7bSB2ZXJ5IGludGVyZXN0ZWQgaW4uCgpTcGVjaWZpY2FsbHksIGl0IGxvb2tzIGxpa2U6CgoxLiAgQSBuZXcgS2NvbmZpZyBvcHRpb24sIGBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGYCwgaXMgYmVpbmcgYWRkZWQgdG8gZW5hYmxlIHRoZSBmZWF0dXJlLiBHb29kLCBmaW5lLWdyYWluZWQgY29udHJvbCBpcyBhbHdheXMgYXBwcmVjaWF0ZWQuCjIuICBXZSBoYXZlIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYCwgd2hpY2ggaW1wbGllcyB0aGUgY29yZSBCUEYgaW50ZWdyYXRpb24uIFRoYXQgZmlsZSByZWdpc3RlcnMgYGlvY29zdF9tb2RlbF9vcHNgIGFzIGEgQlBGIGBzdHJ1Y3Rfb3BzYC4gTWFrZXMgc2Vuc2UuIFRoaXMgaXMgaG93IHRoZSBCUEYgY29kZSB3aWxsIGhvb2sgaW50byB0aGUgSS9PIGNvc3QgY2FsY3VsYXRpb24uCjMuICBUaGUgY2hhbmdlcyBpbiBgYmxvY2svYmxrLWlvY29zdC5jYCBhcmUgd2hlcmUgdGhlIHJ1YmJlciBtZWV0cyB0aGUgcm9hZC4gYGNhbGNfdnRpbWVfY29zdGAgaXMgbm93IHVzaW5nIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAuIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyB0aGF0IGZ1bmN0aW9uIHdvcmtzIGFuZCBpbnRlcmFjdHMgd2l0aCB0aGUgQlBGIHByb2dyYW0uIFRoZSBtb2RpZmljYXRpb24gdG8gYGlvY19jb3N0X21vZGVsX3ByZmlsbGAgYW5kIGBpb2NfY29zdF9tb2RlbF93cml0ZWAgdG8gaGFuZGxlIGBjdHJsPWJwZmAgaXMgY3J1Y2lhbCBmb3IgY29uZmlndXJpbmcgdGhlIEJQRi1iYXNlZCBtb2RlbCB2aWEgY2dyb3Vwcy4gUGx1cywgYSBuZXcgdHJhY2Vwb2ludCwgYHRyYWNlX2lvY29zdF9pb2NfdGlja2AsIGlzIGFkZGVkIHRvIGBpb2NfdGltZXJfZm5gLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgZGVidWdnaW5nIGFuZCB0cmFjaW5nLgo0LiAgQWRkaW5nIGEgaGVhZGVyIGZpbGUgYGluY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oYCBtYWtlcyBzZW5zZSwgYXMgYSByZXBvc2l0b3J5IGZvciBhbnkgbmV3IGRlZmluaXRpb25zIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzLgo1LiAgQSBuZXcgdHJhY2UgZXZlbnQgZGVmaW5pdGlvbiBpbiBgaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhgLCBpcyBhIHZlcnkgcG9zaXRpdmUgYWRkaXRpb24uIFRyYWNlcG9pbnRzIGFyZSBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMgYW5kIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBCUEYgbG9naWMgaXMgYmVoYXZpbmcuCjYuICBUaGUgaW5jbHVzaW9uIG9mIHNlbGZ0ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLy4uLmAgaXMgZXhjZWxsZW50ISBDb21wcmVoZW5zaXZlIHRlc3RpbmcgaXMgbm9uLW5lZ290aWFibGUgZm9yIHNvbWV0aGluZyBsaWtlIHRoaXMuCgpOZXh0LCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgaXMgYWN0dWFsbHkgKnVzYWJsZSogaW4gdHlwaWNhbCBlbnZpcm9ubWVudHMuIFJlYWNoaW5nIFFFTVUvS1ZNIFZNcywgYXMgd2VsbCBhcyBhIHZhcmlldHkgb2YgY29udGFpbmVyIHN5c3RlbXMsIGlzIGtleS4gVGhhbmtmdWxseSwgdGhlIHRleHQgY29uZmlybXMgdGhhdCB0aGlzIGludGVncmF0ZXMgd2l0aCB0aGUgc3RhbmRhcmQgY2dyb3VwL2Jsb2NrIGxheWVyLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBjZ3JvdXBzIHYyIChgaW8uY29zdC5tb2RlbGApLiBUaGUgdXNlIG9mIEJQRiBzdHJ1Y3Rfb3BzIChgQlBGX01BUF9DUkVBVEVgLCBgQlBGX0xJTktfQ1JFQVRFYCkgaXMgYWxzbyBwcm9taXNpbmcsIHdoaWNoIG1lYW5zIHRoaXMgY291bGQgYmUgYWNjZXNzaWJsZSBpbiBhIHdpZGUgdmFyaWV0eSBvZiBjaXJjdW1zdGFuY2VzLgoKTXkgbmV4dCBzdGVwIGlzIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bGwgbmVlZCB0byB1c2UgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBjb2RlLCB1bmRlcnN0YW5kIHRoZSBuZXcgc3ltYm9scywgYW5kIGZpZ3VyZSBvdXQgdGhlIGV4YWN0IEtjb25maWcgZGVwZW5kZW5jaWVzLiBJJiMzOTttIGtlZW4gdG8gc2VlIHRoZSBkZXRhaWxzIG9mIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBCUEYgcHJvZ3JhbXMuIEkmIzM5O20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gdGhlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBhbmQgd2hldGhlciB0aGVyZSBhcmUgYW55IHBvdGVudGlhbCBnb3RjaGFzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBob3cgdGhpcyBhZmZlY3RzIHRoZSBvdmVyYWxsIEkvTyBwYXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0JMS19DR1JPVVBfSU9DT1NUJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtibG9jay9LY29uZmlnPTE0NT1jb25maWcgQkxLX0NHUk9VUF9GQ19BUFBJRFxuLS1cbmJsb2NrL0tjb25maWctMTUzLVxuYmxvY2svS2NvbmZpZzoxNTQ6Y29uZmlnIEJMS19DR1JPVVBfSU9DT1NUXG5ibG9jay9LY29uZmlnLTE1NS1cdGJvb2wgXCYjMzQ7RW5hYmxlIHN1cHBvcnQgZm9yIGNvc3QgbW9kZWwgYmFzZWQgY2dyb3VwIElPIGNvbnRyb2xsZXJcJiMzNDtcbi0tXG5ibG9jay9LY29uZmlnPTIzMj1zb3VyY2UgXCYjMzQ7YmxvY2svS2NvbmZpZy5pb3NjaGVkXCYjMzQ7XG5ibG9jay9LY29uZmlnLTIzMy1cbmJsb2NrL0tjb25maWc6MjM0OmNvbmZpZyBCTEtfQ0dST1VQX0lPQ09TVF9CUEZcbmJsb2NrL0tjb25maWctMjM1LVx0Ym9vbCBcJiMzNDtFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXJcJiMzNDtcbmJsb2NrL0tjb25maWc6MjM2Olx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQX0lPQ09TVCBcdTAwMjZcdTAwMjYgQlBGX1NZU0NBTEwgXHUwMDI2XHUwMDI2IEJQRl9KSVRcbmJsb2NrL0tjb25maWctMjM3LVx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0ODE1CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gSS9PIENvc3QgYW5kIERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgbG9va2luZyBhdCBgQkxLX0NHUk9VUF9JT0NPU1RgLCBhbmQgbXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGxldCYjMzk7cyBub3QganVzdCBpc29sYXRlIHRoZSBmZWF0dXJlIGl0c2VsZi4gV2UgbmVlZCB0byBkbyBhIGZ1bGwgZGVwZW5kZW5jeSBhdWRpdCBvbiB0aGlzLiBJJiMzOTttIGFscmVhZHkgbWVudGFsbHkgcnVubmluZyB0aHJvdWdoIHRoZSBrZXJuZWwgaW5mcmFzdHJ1Y3R1cmUg4oCTIHdoYXQgb3RoZXIgY29tcG9uZW50cywgbW9kdWxlcywgb3Igc3Vic3lzdGVtcyBtaWdodCBiZSBpbmRpcmVjdGx5IGFmZmVjdGVkLCBvciBkZXBlbmQgb24gdGhlIGNvcnJlY3Qgb3BlcmF0aW9uIG9mIGBCTEtfQ0dST1VQX0lPQ09TVGA/IFRoaW5raW5nIGFib3V0IHRoaXMsIEkgbmVlZCB0byBjb25zaWRlciB0aGluZ3MgbGlrZSBibG9jayBsYXllciBhY2NvdW50aW5nLCBjZ3JvdXAgaW50ZWdyYXRpb25zLCBhbmQgYW55IHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aCBzY2hlZHVsZXIgaW1wbGVtZW50YXRpb25zLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IGJ5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgcmVmZXJlbmNlcyB0byBtYWtlIHN1cmUgSSBnZXQgdGhlIHdob2xlIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtibG9jay9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNTA6XHRcdCAgY2dyb3VwIGFwcGxpY2F0aW9ucy4gSXQgZW5hYmxlcyB0aGUgRmFicmljIGFuZCB0aGUgc3RvcmFnZSB0YXJnZXRzIHRvXG4gMTUxOlx0XHQgIGlkZW50aWZ5LCBtb25pdG9yLCBhbmQgaGFuZGxlIEZDIHRyYWZmaWMgYmFzZWQgb24gVk0gdGFncyBieSBpbnNlcnRpbmdcbiAxNTI6XHRcdCAgYXBwbGljYXRpb24gc3BlY2lmaWMgaWRlbnRpZmljYXRpb24gaW50byB0aGUgRkMgZnJhbWUuXG4gMTUzOlx0XG4gMTU0Olx0Y29uZmlnIEJMS19DR1JPVVBfSU9DT1NUXG4gMTU1Olx0XHRib29sIFwmIzM0O0VuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXCYjMzQ7XG4gMTU2Olx0XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcbiAxNTc6XHRcdHNlbGVjdCBCTEtfUlFfQUxMT0NfVElNRVxuIDE1ODpcdFx0aGVscFxuIDE1OTpcdFx0RW5hYmxpbmcgdGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgLndlaWdodCBpbnRlcmZhY2UgZm9yIGNvc3RcbiAxNjA6XHRcdG1vZGVsIGJhc2VkIHByb3BvcnRpb25hbCBJTyBjb250cm9sLiAgVGhlIElPIGNvbnRyb2xsZXJcbiAxNjE6XHRcdGRpc3RyaWJ1dGVzIElPIGNhcGFjaXR5IGJldHdlZW4gZGlmZmVyZW50IGdyb3VwcyBiYXNlZCBvblxuIDE2MjpcdFx0dGhlaXIgc2hhcmUgb2YgdGhlIG92ZXJhbGwgd2VpZ2h0IGRpc3RyaWJ1dGlvbi5cbiAxNjM6XHRcbiAxNjQ6XHRjb25maWcgQkxLX0NHUk9VUF9JT1BSSU9cbiAxNjU6XHRcdGJvb2wgXCYjMzQ7Q2dyb3VwIEkvTyBjb250cm9sbGVyIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzXCYjMzQ7XG4gMTY2Olx0XHRkZXBlbmRzIG9uIEJMS19DR1JPVVBcbiAxNjc6XHRcdGhlbHBcbiAxNjg6XHRcdEVuYWJsZSB0aGUgLnByaW8gaW50ZXJmYWNlIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzIHRvXG4gMTY5Olx0XHRyZXF1ZXN0cy4gVGhlIEkvTyBwcmlvcml0eSBjbGFzcyBhZmZlY3RzIHRoZSBvcmRlciBpbiB3aGljaCBhbiBJL09cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTM2OQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBCUEYgSS9PIENvc3QgQW5hbHlzaXMgQ29kZSoqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBkZXRhaWxzLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGBibGstaW9jb3N0LWJwZi5jYCBjb2RlLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgZ29pbmcgdG8gYmUgZnVuY3Rpb25zIGFuZCBzeW1ib2xzIGRlZmluZWQgd2l0aGluIHRoYXQgZmlsZS4gSSYjMzk7bSB0aGlua2luZyBJJiMzOTtsbCBzdGFydCBieSBsaXN0aW5nIG91dCB0aGUgZnVuY3Rpb25zIHRvIGdldCBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgb2YgaG93IHRoZSBjb2RlIGlzIHN0cnVjdHVyZWQsIGFuZCB0aGVuIGRyaWxsIGRvd24gaW50byBhbnkgaW50ZXJlc3Rpbmcgc3ltYm9scywgcGFydGljdWxhcmx5IHRob3NlIHJlbGF0ZWQgdG8gdGhlIGNvc3QgYWNjb3VudGluZyBvciBhbnkgQlBGIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBhcmUgYmVpbmcgbGV2ZXJhZ2VkLiBVbmRlcnN0YW5kaW5nIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgQlBGIHByb2dyYW0gYW5kIHRoZSBicm9hZGVyIGtlcm5lbCBmcmFtZXdvcmsgaXMga2V5IHRvIHRoaXMgYW5hbHlzaXMuIEkgd2FudCB0byBzZWUgaG93IHRoZXkmIzM5O3ZlIGluc3RydW1lbnRlZCB0aGUgYmxvY2sgbGF5ZXIgYW5kIHdoaWNoIGV2ZW50cyB0aGV5JiMzOTtyZSB0cmFja2luZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiAgIDI6XHQvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuICAgMzpcdFxuICAgNDpcdC8qXG4gICA1Olx0ICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy5cbiAgIDY6XHQgKlxuICAgNzpcdCAqIFJlZ2lzdGVycyB0aGUgXCYjMzQ7aW9jb3N0X21vZGVsX29wc1wmIzM0OyBzdHJ1Y3Rfb3BzIHR5cGUuICBBdCBtb3N0IG9uZSBtb2RlbFxuICAgODpcdCAqIGNhbiBiZSByZWdpc3RlcmVkIGF0IGEgdGltZTsgZGV2aWNlcyBvcHQgaW4gcGVyLXF1ZXVlIHdpdGhcbiAgIDk6XHQgKiBcJiMzNDtlY2hvICRERVYgY3RybD1icGYgXHUwMDNlIGlvLmNvc3QubW9kZWxcJiMzNDsuICBEZXZpY2VzIHdpdGhvdXQgYSByZWdpc3RlcmVkXG4gIDEwOlx0ICogbW9kZWwga2VlcCB1c2luZyB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwuXG4gIDExOlx0ICovXG4gIDEyOlx0I2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4gIDEzOlx0I2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2VcbiAgMTQ6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICAxNTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gIDE2Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvYnBmX3ZlcmlmaWVyLmhcdTAwM2VcbiAgMTc6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuICAxODpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2Jsay1pb2Nvc3QuaFx1MDAzZVxuICAxOTpcdFxuICAyMDpcdC8qIDFzIG9mIGRldmljZSB0aW1lOyB1cHBlciBib3VuZCBvbiBhIHNpbmdsZSBJTyYjMzk7cyBjaGFyZ2VhYmxlIGNvc3QgKi9cbiAgMjE6XHQjZGVmaW5lIElPQ09TVF9CUEZfTUFYX0NPU1RcdCgxVUxMIFx1MDAzY1x1MDAzYyAzNylcbiAgMjI6XHRcbiAgMjM6XHRzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzO1xuICAyNDpcdFxuICAyNTpcdHN0YXRpYyBERUZJTkVfTVVURVgoaW9jb3N0X2JwZl9yZWdfbG9jayk7XG4gIDI2Olx0c3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fcmN1ICppb2Nvc3RfYnBmX21vZGVsO1xuICAyNzpcdHN0YXRpYyBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShpb2Nvc3RfYnBmX2tleSk7XG4gIDI4Olx0XG4gIDI5Olx0Ym9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZClcbiAgMzA6XHR7XG4gIDMxOlx0XHRyZXR1cm4gc3RhdGljX2JyYW5jaF91bmxpa2VseShcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4gIDMyOlx0fVxuICAzMzpcdFxuICAzNDpcdGJvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuICAzNTpcdFx0XHRcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cClcbiAgMzY6XHR7XG4gIDM3Olx0XHRjb25zdCBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqb3BzO1xuICAzODpcdFx0dTY0IGNvc3Q7XG4gIDM5Olx0XG4gIDQwOlx0XHRpZiAoIXN0YXRpY19icmFuY2hfdW5saWtlbHkoXHUwMDI2aW9jb3N0X2JwZl9rZXkpKVxuICA0MTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gIDQyOlx0XG4gIDQzOlx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gIDQ0Olx0XHRvcHMgPSByY3VfZGVyZWZlcmVuY2UoaW9jb3N0X2JwZl9tb2RlbCk7XG4gIDQ1Olx0XHRpZiAoIW9wcykge1xuICA0NjpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiAgNDc6XHRcdFx0cmV0dXJuIGZhbHNlO1xuICA0ODpcdFx0fVxuICA0OTpcdFx0Y29zdCA9IG9wcy1cdTAwM2VjYWxjX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGlvY2dfaWQsIGZsYWdzKTtcbiAgNTA6XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuICA1MTpcdFxuICA1MjpcdFx0aWYgKCFjb3N0KVxuICA1MzpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gIDU0Olx0XG4gIDU1Olx0XHQqY29zdHAgPSBtaW4oY29zdCwgSU9DT1NUX0JQRl9NQVhfQ09TVCk7XG4gIDU2Olx0XHRyZXR1cm4gdHJ1ZTtcbiAgNTc6XHR9XG4gIDU4Olx0XG4gIDU5Olx0c3RhdGljIGludCBicGZfaW9jb3N0X21vZGVsX2luaXQoc3RydWN0IGJ0ZiAqYnRmKVxuICA2MDpcdHtcbiAgNjE6XHRcdHMzMiB0eXBlX2lkO1xuICA2MjpcdFxuICA2MzpcdFx0dHlwZV9pZCA9IGJ0Zl9maW5kX2J5X25hbWVfa2luZChidGYsIFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDssIEJURl9LSU5EX1NUUlVDVCk7XG4gIDY0Olx0XHRpZiAodHlwZV9pZCBcdTAwM2MgMClcbiAgNjU6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gIDY2Olx0XHRyZXR1cm4gMDtcbiAgNjc6XHR9XG4gIDY4Olx0XG4gIDY5Olx0c3RhdGljIGludCBicGZfaW9jb3N0X2luaXRfbWVtYmVyKGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbiAgNzA6XHRcdFx0XHRcdCAgY29uc3Qgc3RydWN0IGJ0Zl9tZW1iZXIgKm1lbWJlcixcbiAgNzE6XHRcdFx0XHRcdCAgdm9pZCAqa2RhdGEsIGNvbnN0IHZvaWQgKnVkYXRhKVxuICA3MjpcdHtcbiAgNzM6XHRcdHJldHVybiAwO1xuICA3NDpcdH1cbiAgNzU6XHRcbiAgNzY6XHRzdGF0aWMgYm9vbCBicGZfaW9jb3N0X2lzX3ZhbGlkX2FjY2VzcyhpbnQgb2ZmLCBpbnQgc2l6ZSxcbiAgNzc6XHRcdFx0XHRcdCAgICAgICBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLFxuICA3ODpcdFx0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyxcbiAgNzk6XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgYnBmX2luc25fYWNjZXNzX2F1eCAqaW5mbylcbiAgODA6XHR7XG4gIDgxOlx0XHRyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTtcbiAgODI6XHR9XG4gIDgzOlx0XG4gIDg0Olx0c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqXG4gIDg1Olx0YnBmX2lvY29zdF9nZXRfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQsXG4gIDg2Olx0XHRcdFx0ICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXG4gIDg3Olx0e1xuICA4ODpcdFx0cmV0dXJuIGJwZl9iYXNlX2Z1bmNfcHJvdG8oZnVuY19pZCwgcHJvZyk7XG4gIDg5Olx0fVxuICA5MDpcdFxuICA5MTpcdHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX29wcyBicGZfaW9jb3N0X3ZlcmlmaWVyX29wcyA9IHtcbiAgOTI6XHRcdC5nZXRfZnVuY19wcm90byA9IGJwZl9pb2Nvc3RfZ2V0X2Z1bmNfcHJvdG8sXG4gIDkzOlx0XHQuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsXG4gIDk0Olx0fTtcbiAgOTU6XHRcbiAgOTY6XHRzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4gIDk3Olx0e1xuICA5ODpcdFx0c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm5ld19vcHMgPSBrZGF0YTtcbiAgOTk6XHRcbiAxMDA6XHRcdGlmICghbmV3X29wcy1cdTAwM2VjYWxjX2Nvc3QpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTcxMDAKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDoKCioqRGl2aW5nIERlZXBlciBpbnRvIGBibGstaW9jb3N0LWJwZi5jYCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBhbHJlYWR5IGV4YW1pbmVkIHNvbWUga2V5IGFyZWFzIG9mIHRoaXMgQlBGIHByb2dyYW0sIGFuZCBub3cgSSBuZWVkIHRvIHN5c3RlbWF0aWNhbGx5IGV4cGxvcmUgdGhlIHJlbWFpbmRlciBvZiBgYmxvY2svYmxrLWlvY29zdC1icGYuY2AuIEkgaGF2ZSBhIGdvb2QgZ3Jhc3Agb2YgdGhlIGZvdW5kYXRpb25hbCBjb25jZXB0cywgYnV0IEkgbmVlZCB0byBtYWtlIHN1cmUgSSYjMzk7bSBub3QgbWlzc2luZyBhbnkgc3VidGxlIGludGVyYWN0aW9ucyBvciBsZXNzIG9idmlvdXMgb3B0aW1pemF0aW9ucy4gV2hhdCBhcmUgdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGRvaW5nIGluIHRlcm1zIG9mIHRyYWNpbmcgaS9vIGNvc3RzLCBzZXR0aW5nIHVwIG1hcHMsIG9yIGhhbmRsaW5nIHNwZWNpZmljIGVkZ2UgY2FzZXM/IEkmIzM5O20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IHRoZXkmIzM5O3ZlIGhhbmRsZWQgcG90ZW50aWFsIGNvbnRlbnRpb24sIHJlc291cmNlIGxpbWl0cywgYW5kIGVycm9yIGhhbmRsaW5nIHdpdGhpbiB0aGlzIEJQRiBjb250ZXh0LiBMZXQmIzM5O3Mgc2VlIGhvdyB0aGUgcmVzdCBvZiB0aGUgZmlsZSBidWlsZHMgdXBvbiB3aGF0IEkmIzM5O3ZlIGFscmVhZHkgc2NydXRpbml6ZWQuIEkgbmVlZCB0byBlbnN1cmUgYSBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nIHRvIG1ha2UgYW55IGFzc2Vzc21lbnRzIGFib3V0IHBlcmZvcm1hbmNlLCBlZmZpY2llbmN5LCBvciBwb3RlbnRpYWwgaW1wcm92ZW1lbnRzLiBUaW1lIHRvIGRpZyBpbiEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtibG9jay9ibGstaW9jb3N0LWJwZi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDU1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMDA6XHRcdGlmICghbmV3X29wcy1cdTAwM2VjYWxjX2Nvc3QpXG4gMTAxOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDEwMjpcdFxuIDEwMzpcdFx0aW50IHJldCA9IDA7XG4gMTA0Olx0XG4gMTA1Olx0XHQvKiB0aGUgY2FsbGVyIG9ubHkgaG9sZHMgdGhlIHBlci1tYXAgbG9jaywgc28gc2VyaWFsaXplIGhlcmUgKi9cbiAxMDY6XHRcdG11dGV4X2xvY2soXHUwMDI2aW9jb3N0X2JwZl9yZWdfbG9jayk7XG4gMTA3Olx0XHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpKVxuIDEwODpcdFx0XHRyZXQgPSAtRUJVU1k7XG4gMTA5Olx0XHRlbHNlIHtcbiAxMTA6XHRcdFx0c3RhdGljX2JyYW5jaF9pbmMoXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xuIDExMTpcdFx0XHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgbmV3X29wcyk7XG4gMTEyOlx0XHR9XG4gMTEzOlx0XHRtdXRleF91bmxvY2soXHUwMDI2aW9jb3N0X2JwZl9yZWdfbG9jayk7XG4gMTE0Olx0XHRyZXR1cm4gcmV0O1xuIDExNTpcdH1cbiAxMTY6XHRcbiAxMTc6XHRzdGF0aWMgdm9pZCBicGZfaW9jb3N0X3VucmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXG4gMTE4Olx0e1xuIDExOTpcdFx0bXV0ZXhfbG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbiAxMjA6XHRcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkgPT0ga2RhdGEpIHtcbiAxMjE6XHRcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKGlvY29zdF9icGZfbW9kZWwsIE5VTEwpO1xuIDEyMjpcdFx0XHRzdGF0aWNfYnJhbmNoX2RlYyhcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4gMTIzOlx0XHR9XG4gMTI0Olx0XHRtdXRleF91bmxvY2soXHUwMDI2aW9jb3N0X2JwZl9yZWdfbG9jayk7XG4gMTI1Olx0fVxuIDEyNjpcdFxuIDEyNzpcdHN0YXRpYyB1NjQgYnBmX2lvY29zdF9jYWxjX2Nvc3Rfc3R1Yih1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4gMTI4Olx0XHRcdFx0XHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXG4gMTI5Olx0e1xuIDEzMDpcdFx0cmV0dXJuIDA7XG4gMTMxOlx0fVxuIDEzMjpcdFxuIDEzMzpcdHN0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyA9IHtcbiAxMzQ6XHRcdC5jYWxjX2Nvc3QgPSBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViLFxuIDEzNTpcdH07XG4gMTM2Olx0XG4gMTM3Olx0c3RhdGljIHN0cnVjdCBicGZfc3RydWN0X29wcyBicGZfaW9jb3N0X21vZGVsX29wcyA9IHtcbiAxMzg6XHRcdC52ZXJpZmllcl9vcHMgPSBcdTAwMjZicGZfaW9jb3N0X3ZlcmlmaWVyX29wcyxcbiAxMzk6XHRcdC5pbml0ID0gYnBmX2lvY29zdF9tb2RlbF9pbml0LFxuIDE0MDpcdFx0LmluaXRfbWVtYmVyID0gYnBmX2lvY29zdF9pbml0X21lbWJlcixcbiAxNDE6XHRcdC5yZWcgPSBicGZfaW9jb3N0X3JlZyxcbiAxNDI6XHRcdC51bnJlZyA9IGJwZl9pb2Nvc3RfdW5yZWcsXG4gMTQzOlx0XHQubmFtZSA9IFwmIzM0O2lvY29zdF9tb2RlbF9vcHNcJiMzNDssXG4gMTQ0Olx0XHQuY2ZpX3N0dWJzID0gXHUwMDI2X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsXG4gMTQ1Olx0XHQub3duZXIgPSBUSElTX01PRFVMRSxcbiAxNDY6XHR9O1xuIDE0NzpcdFxuIDE0ODpcdHN0YXRpYyBpbnQgX19pbml0IGJwZl9pb2Nvc3RfaW5pdCh2b2lkKVxuIDE0OTpcdHtcbiAxNTA6XHRcdHJldHVybiByZWdpc3Rlcl9icGZfc3RydWN0X29wcyhcdTAwMjZicGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7XG4gMTUxOlx0fVxuIDE1MjpcdGxhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgyNjEKCQkJCQkJCW91dHB1dDogMjM0CgkJCQkJCQl0aG91Z2h0czogODczCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBCbG9jayBJTyBDb3N0IHdpdGggQlBGIFN1cHBvcnQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZm9jdXMgaGVyZSBpcyB0byBkZWZpbmUgYSBnb29kIGZ1enppbmcgdGFyZ2V0IHJlbGF0ZWQgdG8gdGhlIGJsb2NrIEkvTyBjb3N0IGNvbnRyb2xsZXIsIHNwZWNpZmljYWxseSB0aGUgQlBGLWJhc2VkIGltcGxlbWVudGF0aW9uLiBJJiMzOTt2ZSBwaW5wb2ludGVkIGEgZmV3IGFyZWFzIGluIGBibG9jay9ibGstaW9jb3N0LmNgIChsaW5lcyB+MjU4MCwgfjM0NjUsIGFuZCB+MzUxMikgYW5kIHRoZSBuZXcgYGJsay1pb2Nvc3QtYnBmLmNgIHRoYXQgbG9vayBwcm9taXNpbmcuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBpbnRlcmVzdGVkIGluIGBjYWxjX3Z0aW1lX2Nvc3RgLCBgaW9jX2Nvc3RfbW9kZWxfcHJmaWxsYCwgYGlvY19jb3N0X21vZGVsX3dyaXRlYCAoaW4gYGJsay1pb2Nvc3QuY2ApLCBhbmQgYGlvY29zdF9icGZfY2FsY19jb3N0YCwgYGJwZl9pb2Nvc3RfcmVnYCwgYGJwZl9pb2Nvc3RfdW5yZWdgIChpbiBgYmxrLWlvY29zdC1icGYuY2ApLiBBbHNvIHRoZSBgaW9jX3RpbWVyX2ZuYC4KClRoZSBrZXkgaGVyZSBpcyB3aGV0aGVyIHRoaXMgY29kZSBtb2RpZmljYXRpb24gbWVyaXRzIGZ1enppbmcuIEl0IGRvZXMhICBJJiMzOTt2ZSBhc3Nlc3NlZCB0aGF0IGl0IGltcGFjdHMgdGhlIGJsb2NrIGxheWVyLCBjZ3JvdXBzLCBhbmQgQlBGIGBzdHJ1Y3Rfb3BzYCwgaXMgcmVhY2hhYmxlIGluIGEgc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudCwgYW5kIGhhcyBjaGFuZ2VzIHRvIGBibGstaW9jb3N0LmNgIGFuZCBgYmxrLWlvY29zdC1icGYuY2AuIFNvLCBpdCYjMzk7cyB3b3J0aCB0aGUgZWZmb3J0LgoKTm93LCB0byBuYXJyb3cgZG93biB0aGUgZm9jdXMuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgbW9zdCBzcGVjaWZpYywgbm9uLXViaXF1aXRvdXMgZnVuY3Rpb25zIGFkZGVkIG9yIG1vZGlmaWVkLiBUaGUgY29yZSBCUEYgZnVuY3Rpb25zIGFkZGVkIGluIGBibGstaW9jb3N0LWJwZi5jYCBzdGFuZCBvdXQ6IGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAsIGBicGZfaW9jb3N0X3JlZ2AsIGBicGZfaW9jb3N0X3VucmVnYC4gQW5kIGZyb20gYGJsay1pb2Nvc3QuY2AsIGBjYWxjX3Z0aW1lX2Nvc3RgLCBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgLCBhbmQgYGlvY19jb3N0X21vZGVsX3ByZmlsbGAgYXMgdGhleSBhcHBlYXIgdG8gYmUgaW50ZWdyYWwgcGFydHMgb2YgdGhlIG5ldyBjb3N0IG1vZGVsLgoKTmV4dCwgdGhlIGNvbmZpZ3VyYXRpb25zLiBJIG5lZWQgdG8gZW5zdXJlIHRoZXNlIGZlYXR1cmVzIGFyZSBlbmFibGVkIGZvciBlZmZlY3RpdmUgZnV6emluZy4gV2UgaGF2ZSBgQkxLX0NHUk9VUF9JT0NPU1RfQlBGYCwgYEJMS19DR1JPVVBfSU9DT1NUYCwgYEJQRl9TWVNDQUxMYCwgYEJQRl9KSVRgLCBhbmQgYEJMS19DR1JPVVBgLiBDb25maXJtZWQsIEkmIzM5O3ZlIGNoZWNrZWQgYGJsb2NrL0tjb25maWdgLCBhbmQgYEJMS19DR1JPVVBfSU9DT1NUYCBkZXBlbmRzIG9uIGBCTEtfQ0dST1VQYC4KCkFscmlnaHQsIEkmIzM5O20gcmVhZHkgdG8gZm9ybWFsbHkgZGVmaW5lIHRoZSBmdXp6aW5nIHRhcmdldC4KCioqRW5hYmxlQ29uZmlnczoqKgoqICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVF9CUEYmIzM0OwoqICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVCYjMzQ7CiogICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKKiAgICYjMzQ7QlBGX0pJVCYjMzQ7CiogICAmIzM0O0JMS19DR1JPVVAmIzM0OwoKKipGb2N1c1N5bWJvbHM6KioKKiAgICYjMzQ7aW9jb3N0X2JwZl9jYWxjX2Nvc3QmIzM0OwoqICAgJiMzNDticGZfaW9jb3N0X3JlZyYjMzQ7CiogICAmIzM0O2JwZl9pb2Nvc3RfdW5yZWcmIzM0OwoqICAgJiMzNDtpb2NfY29zdF9tb2RlbF93cml0ZSYjMzQ7CiogICAmIzM0O2lvY19jb3N0X21vZGVsX3ByZmlsbCYjMzQ7CiogICAmIzM0O2NhbGNfdnRpbWVfY29zdCYjMzQ7CgpUaGUgcmF0aW9uYWxlIGlzIGNsZWFyLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIEJQRiBzdHJ1Y3Rfb3BzIG1lY2hhbmlzbSBmb3IgcGx1Z2dhYmxlIGNvc3QgbW9kZWxzIGluIHRoZSBibG9jayBJL08gY29zdCBjZ3JvdXAgY29udHJvbGxlciAoYWN0aXZhdGVkIGJ5IENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYpLiBJdCBhZGRzIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBjYWxsYmFja3MsIGhvb2tzIGludG8gY29zdCBjYWxjdWxhdGlvbiwgYW5kIGFsdGVycyB0aGUgc3lzZnMvY2dyb3VwIGludGVyZmFjZS4gVGhpcyBhbGwgaGFuZGxlcyB1c2VyIGlucHV0IHZpYSBCUEYgYW5kIGNncm91cHMgYW5kIGlzIHJlYWNoYWJsZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXphdGlvbiBlbnZpcm9ubWVudHMuCgpUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JMS19DR1JPVVBfSU9DT1NUX0JQRiYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQX0lPQ09TVCYjMzQ7LAogICAgJiMzNDtCTEtfQ0dST1VQJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O0JQRl9KSVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpb2Nvc3RfYnBmX2NhbGNfY29zdCYjMzQ7LAogICAgJiMzNDticGZfaW9jb3N0X3JlZyYjMzQ7LAogICAgJiMzNDticGZfaW9jb3N0X3VucmVnJiMzNDssCiAgICAmIzM0O2lvY19jb3N0X21vZGVsX3dyaXRlJiMzNDssCiAgICAmIzM0O2lvY19jb3N0X21vZGVsX3ByZmlsbCYjMzQ7LAogICAgJiMzNDtjYWxjX3Z0aW1lX2Nvc3QmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMgaW4gdGhlIGJsb2NrIGlvY29zdCBjZ3JvdXAgY29udHJvbGxlciAoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRikuIEl0IGFkZHMgc3RydWN0X29wcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBpbnRlZ3JhdGVzIGR5bmFtaWMgQlBGIGNvc3QgY2FsY3VsYXRpb24gaW50byB0aGUgYmlvIHN1Ym1pc3Npb24gcGF0aCwgYW5kIGV4dGVuZHMgdGhlIGNncm91cCBpby5jb3N0Lm1vZGVsIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLiBUaGUgY29kZSBpcyBmdWxseSByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBjZ3JvdXBzIGFuZCB0aGUgQlBGIHN1YnN5c3RlbS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QkxLX0NHUk9VUF9JT0NPU1RfQlBGJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVBfSU9DT1NUJiMzNDssCiAgICAmIzM0O0JMS19DR1JPVVAmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7QlBGX0pJVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2lvY29zdF9icGZfY2FsY19jb3N0JiMzNDssCiAgICAmIzM0O2JwZl9pb2Nvc3RfcmVnJiMzNDssCiAgICAmIzM0O2JwZl9pb2Nvc3RfdW5yZWcmIzM0OywKICAgICYjMzQ7aW9jX2Nvc3RfbW9kZWxfd3JpdGUmIzM0OywKICAgICYjMzQ7aW9jX2Nvc3RfbW9kZWxfcHJmaWxsJiMzNDssCiAgICAmIzM0O2NhbGNfdnRpbWVfY29zdCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscyBpbiB0aGUgYmxvY2sgaW9jb3N0IGNncm91cCBjb250cm9sbGVyIChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKS4gSXQgYWRkcyBzdHJ1Y3Rfb3BzIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBjYWxsYmFja3MsIGludGVncmF0ZXMgZHluYW1pYyBCUEYgY29zdCBjYWxjdWxhdGlvbiBpbnRvIHRoZSBiaW8gc3VibWlzc2lvbiBwYXRoLCBhbmQgZXh0ZW5kcyB0aGUgY2dyb3VwIGlvLmNvc3QubW9kZWwgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuIFRoZSBjb2RlIGlzIGZ1bGx5IHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIGNncm91cHMgYW5kIHRoZSBCUEYgc3Vic3lzdGVtLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM2PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IChgaW9jb3N0X21vZGVsX29wc2ApIGZvciB0aGUgYmxrLWlvY29zdCBJL08gY2dyb3VwIGNvbnRyb2xsZXIsIGFsbG93aW5nIHBsdWdnYWJsZSBCUEYtYmFzZWQgY29zdCBjYWxjdWxhdGlvbiwgYWRkcyBhIG5ldyB0cmFjZXBvaW50IChgaW9jb3N0X2lvY190aWNrYCksIGFuZCB1cGRhdGVzIHRoZSBjZ3JvdXAgdjIgYGlvLmNvc3QubW9kZWxgIGludGVyZmFjZS5cblxuQW5hbHlzaXMgcmVnYXJkaW5nIHNhbml0aXplcnM6XG4xLiBLTVNBTiBhcHBsaWNhYmlsaXR5OlxuLSBLTVNBTiBkZXRlY3RzIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgYW5kIGtlcm5lbC10by11c2VyIGluZm9ybWF0aW9uIGxlYWtzLlxuLSBJbiB0aGlzIHBhdGNoLCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIHBhc3NlZCB0byBgaW9jb3N0X2JwZl9jYWxjX2Nvc3QoKWAgYW5kIHRoZSBCUEYgc3RydWN0X29wcyBjYWxsYmFjayBhcmUgc2NhbGFyIGludGVnZXIgdmFsdWVzIHBhc3NlZCBieSB2YWx1ZS5cbi0gT3V0cHV0IHBvaW50ZXJzIChzdWNoIGFzIGAqY29zdHBgIGluIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGApIGFyZSB3cml0dGVuIGJlZm9yZSByZXR1cm4sIGFuZCBhbGwgbG9jYWwgdmFyaWFibGVzIChlLmcuIGBicGZgLCBgdXNlcmAsIGBjb3N0YCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIHByaW9yIHRvIGJyYW5jaGluZyBvciB1c2UuXG4tIFRoZSBuZXcgdHJhY2Vwb2ludCBgaW9jb3N0X2lvY190aWNrYCBleHBsaWNpdGx5IGFzc2lnbnMgYWxsIGZpZWxkcyBpbiBgVFBfZmFzdF9hc3NpZ25gLlxuLSBObyBzdHJ1Y3RzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgaGVhcCBhbGxvY2F0aW9ucyBhcmUgY29waWVkIHRvIHVzZXJzcGFjZS5cblxuMi4gS0FTQU4gLyBMT0NLREVQIGFwcGxpY2FiaWxpdHk6XG4tIFBvdGVudGlhbCByaXNrcyBpbiB0aGlzIHBhdGNoIHJldm9sdmUgYXJvdW5kIGNvbmN1cnJlbmN5IChzeW5jaHJvbml6YXRpb24gb2YgYGlvY29zdF9icGZfbW9kZWxgIHZpYSBSQ1UsIG11dGV4ZXMsIGFuZCBzdGF0aWMga2V5cykgb3IgbG9naWMvYm91bmRzIGVycm9ycywgd2hpY2ggYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQga2VybmVsIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi5cblxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBTZXAgOCAxMTozNTo0MyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdAppbmRleCA4ZDI2MDM3NTFjNTFhLi41NGIwNTc0Y2U1ODZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12Mi5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0CkBAIC0yMTE1LDEwICYjNDM7MjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXMKIAlhcmUgZGVmaW5lZC4KIAogCSAgPT09PT0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JICBjdHJsCQkmIzM0O2F1dG8mIzM0OyBvciAmIzM0O3VzZXImIzM0OwomIzQzOwkgIGN0cmwJCSYjMzQ7YXV0byYjMzQ7LCAmIzM0O3VzZXImIzM0OyBvciAmIzM0O2JwZiYjMzQ7CiAJICBtb2RlbAkJVGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gJiMzNDtsaW5lYXImIzM0OwogCSAgPT09PT0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKJiM0MzsJV2hlbiAmIzM0O2N0cmwmIzM0OyBpcyAmIzM0O2JwZiYjMzQ7IChvbmx5IGF2YWlsYWJsZSB3aGVuCiYjNDM7CUNPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYgaXMgZW5hYmxlZCksIGNvc3QgY2FsY3VsYXRpb24gZm9yCiYjNDM7CXRoZSBkZXZpY2UgaXMgZGlzcGF0Y2hlZCB0byB0aGUgQlBGIHByb2dyYW0gcmVnaXN0ZXJlZCBhZ2FpbnN0CiYjNDM7CXRoZSBpb2Nvc3RfbW9kZWxfb3BzIHN0cnVjdF9vcHMuICBXcml0aW5nICYjMzQ7YnBmJiMzNDsgZmFpbHMgd2l0aCAtRUlOVkFMCiYjNDM7CXVudGlsIHN1Y2ggYSBwcm9ncmFtIGlzIHJlZ2lzdGVyZWQsIGFuZCBhdCBtb3N0IG9uZSBwcm9ncmFtIGNhbgomIzQzOwliZSByZWdpc3RlcmVkIHN5c3RlbS13aWRlLiAgVGhlIG1vZGVsIGlzIGNhbGxlZCB3aXRoIHNjYWxhcgomIzQzOwlhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlCiYjNDM7CWlzc3VpbmcgY2dyb3VwLCBmbGFnczsgc2VlIGluY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGZvciB0aGVpcgomIzQzOwltZWFuaW5nKSBhbmQgcmV0dXJucyBhIGNvc3QgaW4gdnRpbWUgdW5pdHMsIGNsYW1wZWQgYnkgdGhlIGtlcm5lbAomIzQzOwl0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlcwomIzQzOwl0aGUgSU8gYmFjayB0byB0aGUgYnVpbHRpbiBsaW5lYXIgZm9ybXVsYSwgc28gYSBtb2RlbCB3aGljaCBvbmx5CiYjNDM7CWhhbmRsZXMgc29tZSBJTyB0eXBlcyBjYW5ub3QgbWFrZSB0aGUgcmVzdCBmcmVlLiAgRGV2aWNlcyB3aGljaAomIzQzOwlkb24mIzM5O3Qgb3B0IGluIGtlZXAgdGhlIGJ1aWx0aW4gbGluZWFyIG1vZGVsIHVuY2hhbmdlZC4KJiM0MzsKIAlXaGVuICYjMzQ7Y3RybCYjMzQ7IGlzICYjMzQ7YXV0byYjMzQ7LCB0aGUga2VybmVsIG1heSBjaGFuZ2UgYWxsIHBhcmFtZXRlcnMKIAlkeW5hbWljYWxseS4gIFdoZW4gJiMzNDtjdHJsJiMzNDsgaXMgc2V0IHRvICYjMzQ7dXNlciYjMzQ7IG9yIGFueSBvdGhlcgogCXBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gdG8sICYjMzQ7Y3RybCYjMzQ7IGJlY29tZSAmIzM0O3VzZXImIzM0OyBhbmQgdGhlCmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCA3MGU0YTY2ZDk0MWZmLi5iZjQzYmUyMWUwMGJiIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL0tjb25maWcKQEAgLTIzMSw0ICYjNDM7MjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OCiAKIHNvdXJjZSAmIzM0O2Jsb2NrL0tjb25maWcuaW9zY2hlZCYjMzQ7CiAKJiM0Mztjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGCiYjNDM7CWJvb2wgJiMzNDtFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXImIzM0OwomIzQzOwlkZXBlbmRzIG9uIEJMS19DR1JPVVBfSU9DT1NUICZhbXA7JmFtcDsgQlBGX1NZU0NBTEwgJmFtcDsmYW1wOyBCUEZfSklUCiYjNDM7CWhlbHAKJiM0MzsJIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHJlZ2lzdGVycyB0aGUgJiMzNDtpb2Nvc3RfbW9kZWxfb3BzJiMzNDsgQlBGCiYjNDM7CSBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlCiYjNDM7CSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoCiYjNDM7CSAmIzM0O2N0cmw9YnBmJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLgomIzQzOwogZW5kaWYgIyBCTE9DSwpkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCBlN2JkMzIwZTNkNjk3Li5lZTVjZWJlZWEwMDZmIDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9ibG9jay9NYWtlZmlsZQpAQCAtMzksMyAmIzQzOzM5LDQgQEAgb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTikJJiM0Mzs9IGJsay1jcnlwdG8ubyBibGstY3J5cHRvLXByb2ZpbGUubyBcCiAJCQkJCSAgIGJsay1jcnlwdG8tc3lzZnMubwogb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSykJJiM0Mzs9IGJsay1jcnlwdG8tZmFsbGJhY2subwogb2JqLSQoQ09ORklHX0JMT0NLX0hPTERFUl9ERVBSRUNBVEVEKQkmIzQzOz0gaG9sZGVyLm8KJiM0MztvYmotJChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKQkmIzQzOz0gYmxrLWlvY29zdC1icGYubwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWlvY29zdC1icGYuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMGMzNGY1NmRlZDcxZAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmMKQEAgLTAsMCAmIzQzOzEsMTUyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy4KJiM0MzsgKgomIzQzOyAqIFJlZ2lzdGVycyB0aGUgJiMzNDtpb2Nvc3RfbW9kZWxfb3BzJiMzNDsgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWwKJiM0MzsgKiBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBhIHRpbWU7IGRldmljZXMgb3B0IGluIHBlci1xdWV1ZSB3aXRoCiYjNDM7ICogJiMzNDtlY2hvICRERVYgY3RybD1icGYgJmd0OyBpby5jb3N0Lm1vZGVsJiMzNDsuICBEZXZpY2VzIHdpdGhvdXQgYSByZWdpc3RlcmVkCiYjNDM7ICogbW9kZWwga2VlcCB1c2luZyB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwuCiYjNDM7ICovCiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmX3ZlcmlmaWVyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ibGstaW9jb3N0LmgmZ3Q7CiYjNDM7CiYjNDM7LyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJiMzOTtzIGNoYXJnZWFibGUgY29zdCAqLwomIzQzOyNkZWZpbmUgSU9DT1NUX0JQRl9NQVhfQ09TVAkoMVVMTCAmbHQ7Jmx0OyAzNykKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzOwomIzQzOwomIzQzO3N0YXRpYyBERUZJTkVfTVVURVgoaW9jb3N0X2JwZl9yZWdfbG9jayk7CiYjNDM7c3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fcmN1ICppb2Nvc3RfYnBmX21vZGVsOwomIzQzO3N0YXRpYyBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShpb2Nvc3RfYnBmX2tleSk7CiYjNDM7CiYjNDM7Ym9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhbXA7aW9jb3N0X2JwZl9rZXkpOwomIzQzO30KJiM0MzsKJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqb3BzOwomIzQzOwl1NjQgY29zdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhbXA7aW9jb3N0X2JwZl9rZXkpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW9wcyA9IHJjdV9kZXJlZmVyZW5jZShpb2Nvc3RfYnBmX21vZGVsKTsKJiM0MzsJaWYgKCFvcHMpIHsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWNvc3QgPSBvcHMtJmd0O2NhbGNfY29zdChvcCwgbmJ5dGVzLCBzZWN0b3IsIGN1cnNvciwgaW9jZ19pZCwgZmxhZ3MpOwomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJaWYgKCFjb3N0KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkqY29zdHAgPSBtaW4oY29zdCwgSU9DT1NUX0JQRl9NQVhfQ09TVCk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdChzdHJ1Y3QgYnRmICpidGYpCiYjNDM7ewomIzQzOwlzMzIgdHlwZV9pZDsKJiM0MzsKJiM0MzsJdHlwZV9pZCA9IGJ0Zl9maW5kX2J5X25hbWVfa2luZChidGYsICYjMzQ7aW9jb3N0X21vZGVsX29wcyYjMzQ7LCBCVEZfS0lORF9TVFJVQ1QpOwomIzQzOwlpZiAodHlwZV9pZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnBmX2lvY29zdF9pbml0X21lbWJlcihjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsCiYjNDM7CQkJCSAgY29uc3Qgc3RydWN0IGJ0Zl9tZW1iZXIgKm1lbWJlciwKJiM0MzsJCQkJICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsCiYjNDM7CQkJCSAgICAgICBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLAomIzQzOwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLAomIzQzOwkJCQkgICAgICAgc3RydWN0IGJwZl9pbnNuX2FjY2Vzc19hdXggKmluZm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqCiYjNDM7YnBmX2lvY29zdF9nZXRfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQsCiYjNDM7CQkJICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCiYjNDM7ewomIzQzOwlyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0gewomIzQzOwkuZ2V0X2Z1bmNfcHJvdG8gPSBicGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvLAomIzQzOwkuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhOwomIzQzOwomIzQzOwlpZiAoIW5ld19vcHMtJmd0O2NhbGNfY29zdCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJLyogdGhlIGNhbGxlciBvbmx5IGhvbGRzIHRoZSBwZXItbWFwIGxvY2ssIHNvIHNlcmlhbGl6ZSBoZXJlICovCiYjNDM7CW11dGV4X2xvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0MzsJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsKSkKJiM0MzsJCXJldCA9IC1FQlVTWTsKJiM0MzsJZWxzZSB7CiYjNDM7CQlzdGF0aWNfYnJhbmNoX2luYygmYW1wO2lvY29zdF9icGZfa2V5KTsKJiM0MzsJCXJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBuZXdfb3BzKTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnBmX2lvY29zdF91bnJlZyh2b2lkICprZGF0YSwgc3RydWN0IGJwZl9saW5rICpsaW5rKQomIzQzO3sKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO2lvY29zdF9icGZfcmVnX2xvY2spOwomIzQzOwlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpID09IGtkYXRhKSB7CiYjNDM7CQlyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7CiYjNDM7CQlzdGF0aWNfYnJhbmNoX2RlYygmYW1wO2lvY29zdF9icGZfa2V5KTsKJiM0MzsJfQomIzQzOwltdXRleF91bmxvY2soJmFtcDtpb2Nvc3RfYnBmX3JlZ19sb2NrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwKJiM0MzsJCQkJICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKQomIzQzO3sKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyA9IHsKJiM0MzsJLmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0gewomIzQzOwkudmVyaWZpZXJfb3BzID0gJmFtcDticGZfaW9jb3N0X3ZlcmlmaWVyX29wcywKJiM0MzsJLmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsCiYjNDM7CS5pbml0X21lbWJlciA9IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIsCiYjNDM7CS5yZWcgPSBicGZfaW9jb3N0X3JlZywKJiM0MzsJLnVucmVnID0gYnBmX2lvY29zdF91bnJlZywKJiM0MzsJLm5hbWUgPSAmIzM0O2lvY29zdF9tb2RlbF9vcHMmIzM0OywKJiM0MzsJLmNmaV9zdHVicyA9ICZhbXA7X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsCiYjNDM7CS5vd25lciA9IFRISVNfTU9EVUxFLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBfX2luaXQgYnBmX2lvY29zdF9pbml0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoJmFtcDticGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QuYwppbmRleCAyNzQ1YmZmY2Q1ZWVmLi5hNThjMTZmY2IyOWZhIDEwMDY0NAotLS0gYS9ibG9jay9ibGstaW9jb3N0LmMKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmxrLWlvY29zdC5jCkBAIC0xNzcsNiAmIzQzOzE3Nyw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvdGltZXIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC90aW1lNjQuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wYXJzZXIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYmxrLWlvY29zdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL3NpZ25hbC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9sb2NhbC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9sb2NhbDY0LmgmZ3Q7CkBAIC00NDUsNiAmIzQzOzQ0Niw3IEBAIHN0cnVjdCBpb2MgewogCWludAkJCQlhdXRvcF9pZHg7CiAJYm9vbAkJCQl1c2VyX3Fvc19wYXJhbXM6MTsKIAlib29sCQkJCXVzZXJfY29zdF9tb2RlbDoxOwomIzQzOwlib29sCQkJCWJwZl9jb3N0X21vZGVsOwogfTsKIAogc3RydWN0IGlvY2dfcGNwdV9zdGF0IHsKQEAgLTIyMzgsNiAmIzQzOzIyNDAsNyBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogCXN0cnVjdCBpb2Nfbm93IG5vdzsKIAlMSVNUX0hFQUQoc3VycGx1c2VzKTsKIAlpbnQgbnJfZGVidG9ycywgbnJfc2hvcnRhZ2VzID0gMCwgbnJfbGFnZ2luZyA9IDA7CiYjNDM7CWludCBucl9hY3RpdmUgPSAwOwogCXU2NCB1c2FnZV91c19zdW0gPSAwOwogCXUzMiBwcG1fcnRocjsKIAl1MzIgcHBtX3d0aHI7CkBAIC0yMjc0LDYgJiM0MzsyMjc3LDggQEAgc3RhdGljIHZvaWQgaW9jX3RpbWVyX2ZuKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIAkJdTY0IHZkb25lLCB2dGltZSwgdXNhZ2VfdXM7CiAJCXUzMiBod19hY3RpdmUsIGh3X2ludXNlOwogCiYjNDM7CQlucl9hY3RpdmUmIzQzOyYjNDM7OwomIzQzOwogCQkvKgogCQkgKiBDb2xsZWN0IHVudXNlZCBhbmQgd2luZCB2dGltZSBjbG9zZXIgdG8gdm5vdyB0byBwcmV2ZW50CiAJCSAqIGlvY2dzIGZyb20gYWNjdW11bGF0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGJ1ZGdldC4KQEAgLTI0NjAsNiAmIzQzOzI0NjUsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogCQlpb2NfcmVmcmVzaF92cmF0ZShpb2MsICZhbXA7bm93KTsKIAl9CiAKJiM0MzsJdHJhY2VfaW9jb3N0X2lvY190aWNrKGlvYywgbnJfYWN0aXZlLCB1c2FnZV91c19zdW0pOwomIzQzOwogCXNwaW5fdW5sb2NrX2lycSgmYW1wO2lvYy0mZ3Q7bG9jayk7CiB9CiAKQEAgLTI1NzMsNiAmIzQzOzI1ODAsMjMgQEAgc3RhdGljIHU2NCBjYWxjX3Z0aW1lX2Nvc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLCBib29sIGlzX21lcmdlKQogewogCXU2NCBjb3N0OwogCiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYKJiM0MzsJc3RydWN0IGlvYyAqaW9jID0gaW9jZy0mZ3Q7aW9jOwomIzQzOwomIzQzOwlpZiAoUkVBRF9PTkNFKGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWwpKSB7CiYjNDM7CQl1NjQgYnBmX2Nvc3Q7CiYjNDM7CiYjNDM7CQlpZiAoaW9jb3N0X2JwZl9jYWxjX2Nvc3QoYmlvX29wKGJpbyksCiYjNDM7CQkJCQkgYmlvLSZndDtiaV9pdGVyLmJpX3NpemUsCiYjNDM7CQkJCQkgYmlvLSZndDtiaV9pdGVyLmJpX3NlY3RvciwKJiM0MzsJCQkJCSBpb2NnLSZndDtjdXJzb3IsCiYjNDM7CQkJCQkgaW9jZ190b19ibGtnKGlvY2cpLSZndDtibGtjZy0mZ3Q7Y3NzLmlkLAomIzQzOwkJCQkJIGlzX21lcmdlID8gSU9DT1NUX0NPU1RfRl9NRVJHRSA6IDAsCiYjNDM7CQkJCQkgJmFtcDticGZfY29zdCkpCiYjNDM7CQkJcmV0dXJuIGJwZl9jb3N0OwomIzQzOwl9CiYjNDM7I2VuZGlmCiYjNDM7CiAJY2FsY192dGltZV9jb3N0X2J1aWx0aW4oYmlvLCBpb2NnLCBpc19tZXJnZSwgJmFtcDtjb3N0KTsKIAlyZXR1cm4gY29zdDsKIH0KQEAgLTM0NDEsNyAmIzQzOzM0NjUsOCBAQCBzdGF0aWMgdTY0IGlvY19jb3N0X21vZGVsX3ByZmlsbChzdHJ1Y3Qgc2VxX2ZpbGUgKnNmLAogCXNlcV9wcmludGYoc2YsICYjMzQ7JXMgY3RybD0lcyBtb2RlbD1saW5lYXIgJiMzNDsKIAkJICAgJiMzNDtyYnBzPSVsbHUgcnNlcWlvcHM9JWxsdSBycmFuZGlvcHM9JWxsdSAmIzM0OwogCQkgICAmIzM0O3dicHM9JWxsdSB3c2VxaW9wcz0lbGx1IHdyYW5kaW9wcz0lbGx1XG4mIzM0OywKLQkJICAgZG5hbWUsIGlvYy0mZ3Q7dXNlcl9jb3N0X21vZGVsID8gJiMzNDt1c2VyJiMzNDsgOiAmIzM0O2F1dG8mIzM0OywKJiM0MzsJCSAgIGRuYW1lLCBpb2MtJmd0O2JwZl9jb3N0X21vZGVsID8gJiMzNDticGYmIzM0OyA6CiYjNDM7CQkJICAgaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWwgPyAmIzM0O3VzZXImIzM0OyA6ICYjMzQ7YXV0byYjMzQ7LAogCQkgICB1W0lfTENPRUZfUkJQU10sIHVbSV9MQ09FRl9SU0VRSU9QU10sIHVbSV9MQ09FRl9SUkFORElPUFNdLAogCQkgICB1W0lfTENPRUZfV0JQU10sIHVbSV9MQ09FRl9XU0VRSU9QU10sIHVbSV9MQ09FRl9XUkFORElPUFNdKTsKIAlzcGluX3VubG9ja19pcnEoJmFtcDtpb2MtJmd0O2xvY2spOwpAQCAtMzQ4MSw3ICYjNDM7MzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsCiAJdW5zaWduZWQgaW50IG1lbWZsYWdzOwogCXN0cnVjdCBpb2MgKmlvYzsKIAl1NjQgdVtOUl9JX0xDT0VGU107Ci0JYm9vbCB1c2VyOwomIzQzOwlib29sIHVzZXIsIGJwZjsKIAljaGFyICpib2R5LCAqcDsKIAlpbnQgcmV0OwogCkBAIC0zNTEyLDYgJiM0MzszNTM3LDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCwKIAlzcGluX2xvY2tfaXJxKCZhbXA7aW9jLSZndDtsb2NrKTsKIAltZW1jcHkodSwgaW9jLSZndDtwYXJhbXMuaV9sY29lZnMsIHNpemVvZih1KSk7CiAJdXNlciA9IGlvYy0mZ3Q7dXNlcl9jb3N0X21vZGVsOwomIzQzOwlicGYgPSBpb2MtJmd0O2JwZl9jb3N0X21vZGVsOwogCiAJcmV0ID0gLUVJTlZBTDsKIApAQCAtMzUyNywxMSAmIzQzOzM1NTMsMjAgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCwKIAkJc3dpdGNoIChtYXRjaF90b2tlbihwLCBjb3N0X2N0cmxfdG9rZW5zLCBhcmdzKSkgewogCQljYXNlIENPU1RfQ1RSTDoKIAkJCW1hdGNoX3N0cmxjcHkoYnVmLCAmYW1wO2FyZ3NbMF0sIHNpemVvZihidWYpKTsKLQkJCWlmICghc3RyY21wKGJ1ZiwgJiMzNDthdXRvJiMzNDspKQomIzQzOwkJCWlmICghc3RyY21wKGJ1ZiwgJiMzNDthdXRvJiMzNDspKSB7CiAJCQkJdXNlciA9IGZhbHNlOwotCQkJZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7dXNlciYjMzQ7KSkKJiM0MzsJCQkJYnBmID0gZmFsc2U7CiYjNDM7CQkJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDt1c2VyJiMzNDspKSB7CiAJCQkJdXNlciA9IHRydWU7Ci0JCQllbHNlCiYjNDM7CQkJCWJwZiA9IGZhbHNlOwomIzQzOyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGCiYjNDM7CQkJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDticGYmIzM0OykpIHsKJiM0MzsJCQkJaWYgKCFpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQoKSkKJiM0MzsJCQkJCWdvdG8gdW5sb2NrOwomIzQzOwkJCQl1c2VyID0gZmFsc2U7CiYjNDM7CQkJCWJwZiA9IHRydWU7CiYjNDM7I2VuZGlmCiYjNDM7CQkJfSBlbHNlCiAJCQkJZ290byB1bmxvY2s7CiAJCQljb250aW51ZTsKIAkJY2FzZSBDT1NUX01PREVMOgpAQCAtMzU1Niw2ICYjNDM7MzU5MSw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsCiAJfSBlbHNlIHsKIAkJaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTsKIAl9CiYjNDM7CVdSSVRFX09OQ0UoaW9jLSZndDticGZfY29zdF9tb2RlbCwgYnBmKTsKIAlpb2NfcmVmcmVzaF9wYXJhbXMoaW9jLCB0cnVlKTsKIAogCXJldCA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBiL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjcxMTFiNWMwM2RjMzYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaApAQCAtMCwwICYjNDM7MSw1NiBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7I2lmbmRlZiBfTElOVVhfQkxLX0lPQ09TVF9ICiYjNDM7I2RlZmluZSBfTElOVVhfQkxLX0lPQ09TVF9ICiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFBsdWdnYWJsZSBjb3N0IG1vZGVsIGludGVyZmFjZSBmb3IgYmxrLWlvY29zdC4KJiM0MzsgKgomIzQzOyAqIEEgQlBGIHN0cnVjdF9vcHMgaW1wbGVtZW50YXRpb24gcmVnaXN0ZXJlZCBhZ2FpbnN0ICYjMzQ7aW9jb3N0X21vZGVsX29wcyYjMzQ7CiYjNDM7ICogcmVwbGFjZXMgdGhlIGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGgKJiM0MzsgKiAmIzM0O2N0cmw9YnBmJiMzNDsgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLiAgVGhlIG1vZGVsIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiB0aGUKJiM0MzsgKiBhcmd1bWVudHMgYmVsb3cgYW5kIHJldHVybnMgdGhlIGNvc3Qgb2YgdGhlIElPIGluIGRldmljZSB0aW1lIHVuaXRzLAomIzQzOyAqIHdoZXJlIDEgc2Vjb25kIG9mIGRldmljZSB0aW1lIGVxdWFscyAyXjM3IChWVElNRV9QRVJfU0VDKS4gIFRoZQomIzQzOyAqIHJldHVybmVkIHZhbHVlIGlzIGNsYW1wZWQgYnkgdGhlIGtlcm5lbC4gIEEgY29zdCBvZiAwIGRlbGVnYXRlcyB0aGUKJiM0MzsgKiBJTyBiYWNrIHRvIHRoZSBidWlsdGluIGZvcm11bGEsIHNvIGEgbW9kZWwgd2hpY2ggZG9lcyBub3QgaGFuZGxlIGEKJiM0MzsgKiBnaXZlbiBJTyB0eXBlIGNhbm5vdCBtYWtlIGl0IGZyZWUuCiYjNDM7ICoKJiM0MzsgKiBUaGUgaW9jZ19pZCBhcmd1bWVudCBpZGVudGlmaWVzIHRoZSBpc3N1aW5nIGNncm91cCAoY3NzIGlkKSBzbyB0aGUKJiM0MzsgKiBtb2RlbCBjYW4ga2VlcCBwZXItY2dyb3VwIHN0YXRlLCBlLmcuIGZvciBtdWx0aS1zdHJlYW0gc2VxdWVudGlhbGl0eQomIzQzOyAqIGRldGVjdGlvbi4gIFRoZSBpZCBpcyBvbmx5IHZhbGlkIHdoaWxlIHRoZSBjZ3JvdXAgZXhpc3RzOiBjc3MgaWRzIGFyZQomIzQzOyAqIHJlY3ljbGVkIG9uY2UgdGhlIGNncm91cCBpcyByZW1vdmVkLCBzbyBtb2RlbHMgbXVzdCB0cmVhdCBpdCBhcyBhCiYjNDM7ICogdHJhbnNpZW50IGtleSBhbmQgcmVzZXQgc3RhdGUgd2hlbiB0aGV5IG9ic2VydmUgaXQgcmV1c2VkLiAgV2hldGhlcgomIzQzOyAqIHRoZSBpbnRlcmZhY2UgbmVlZHMgYSByZWxlYXNlKGlvY2dfaWQpIGNhbGxiYWNrIGZvciBzdGF0ZSBjbGVhbnVwIGlzCiYjNDM7ICogYW4gb3BlbiBxdWVzdGlvbi4KJiM0MzsgKgomIzQzOyAqIFRoZSBtb2RlbCBpcyBjYWxsZWQgZnJvbSB0aGUgSU8gc3VibWlzc2lvbiBwYXRoIHVuZGVyIFJDVSBhbmQgbXVzdAomIzQzOyAqIG5vdCBzbGVlcC4gIE9ubHkgdGhlIGJpby1sZXZlbCBjaGFyZ2luZyBwYXRoIGNvbnN1bHRzIHRoZSBtb2RlbDsKJiM0MzsgKiB0aGUgcmVxdWVzdC1sZXZlbCBzaXppbmcgcGF0aCAoY2FsY19zaXplX3Z0aW1lX2Nvc3QoKSkga2VlcHMgdXNpbmcKJiM0MzsgKiB0aGUgYnVpbHRpbiBmb3JtdWxhLgomIzQzOyAqLwomIzQzOwomIzQzOy8qIGZsYWdzIGZvciBjYWxjX2Nvc3QoKSAqLwomIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRQkoMVVMTCAmbHQ7Jmx0OyAwKQkvKiBjYWxsZWQgZnJvbSBtZXJnZSBwYXRoICovCiYjNDM7CiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgewomIzQzOwkvKgomIzQzOwkgKiBAb3A6CQlSRVFfT1BfKiB2YWx1ZSAodWFwaSBibGtfb3BmLmgpCiYjNDM7CSAqIEBuYnl0ZXM6CUlPIHNpemUgaW4gYnl0ZXMKJiM0MzsJICogQHNlY3RvcjoJc3RhcnRpbmcgc2VjdG9yCiYjNDM7CSAqIEBjdXJzb3I6CWlvY2cgY3Vyc29yIHNlY3RvciwgMCBpZiBub25lIChzZXF1ZW50aWFsaXR5IGhpbnQpCiYjNDM7CSAqIEBpb2NnX2lkOgljc3MgaWQgb2YgdGhlIGlzc3VpbmcgY2dyb3VwCiYjNDM7CSAqIEBmbGFnczoJSU9DT1NUX0NPU1RfRl8qCiYjNDM7CSAqLwomIzQzOwl1NjQgKCpjYWxjX2Nvc3QpKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgdTY0IGlvY2dfaWQsIHU2NCBmbGFncyk7CiYjNDM7fTsKJiM0MzsKJiM0Mztib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvciwKJiM0MzsJCQkgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApOwomIzQzO2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpOwomIzQzOwomIzQzOyNlbmRpZgkvKiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGICovCiYjNDM7I2VuZGlmCS8qIF9MSU5VWF9CTEtfSU9DT1NUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKaW5kZXggZTc3MmIxYmM2MGQ2MC4uMmI5ZmYzNDhhNGY1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmgKQEAgLTE3OCw2ICYjNDM7MTc4LDQ2IEBAIFRSQUNFX0VWRU5UKGlvY29zdF9pb2NfdnJhdGVfYWRqLAogCSkKICk7CiAKJiM0MzsvKgomIzQzOyAqIFBlcmlvZGljIHBlci1kZXZpY2Ugc3VtbWFyeSwgZW1pdHRlZCBvbmNlIHBlciBwZXJpb2QgZnJvbSB0aGUgdGFpbCBvZgomIzQzOyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5CiYjNDM7ICogcGVyaW9kIHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGluY2x1ZGluZyBzdGVhZHkgc3RhdGVzLCBhbmQgY2FycmllcwomIzQzOyAqIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3RhdGUgc28gYmFzaWMgbW9uaXRvcmluZyBkb2VzbiYjMzk7dCByZXF1aXJlIGRyZ24uCiYjNDM7ICovCiYjNDM7VFJBQ0VfRVZFTlQoaW9jb3N0X2lvY190aWNrLAomIzQzOwomIzQzOwlUUF9QUk9UTyhzdHJ1Y3QgaW9jICppb2MsIGludCBucl9hY3RpdmUsIHU2NCB1c2FnZV91c19zdW0pLAomIzQzOwomIzQzOwlUUF9BUkdTKGlvYywgbnJfYWN0aXZlLCB1c2FnZV91c19zdW0pLAomIzQzOwomIzQzOwlUUF9TVFJVQ1RfX2VudHJ5ICgKJiM0MzsJCV9fc3RyaW5nKGRldm5hbWUsIGlvY19uYW1lKGlvYykpCiYjNDM7CQlfX2ZpZWxkKHUzMiwgcGVyaW9kX3VzKQomIzQzOwkJX19maWVsZCh1NjQsIHZyYXRlKQomIzQzOwkJX19maWVsZChpbnQsIGJ1c3lfbGV2ZWwpCiYjNDM7CQlfX2ZpZWxkKGludCwgbnJfYWN0aXZlKQomIzQzOwkJX19maWVsZCh1MzIsIHVzYWdlX3BjdCkKJiM0MzsJCV9fZmllbGQoaW50LCBydW5uaW5nKQomIzQzOwkpLAomIzQzOwomIzQzOwlUUF9mYXN0X2Fzc2lnbigKJiM0MzsJCV9fYXNzaWduX3N0cihkZXZuYW1lKTsKJiM0MzsJCV9fZW50cnktJmd0O3BlcmlvZF91cyA9IGlvYy0mZ3Q7cGVyaW9kX3VzOwomIzQzOwkJX19lbnRyeS0mZ3Q7dnJhdGUgPSBpb2MtJmd0O3Z0aW1lX2Jhc2VfcmF0ZTsKJiM0MzsJCV9fZW50cnktJmd0O2J1c3lfbGV2ZWwgPSBpb2MtJmd0O2J1c3lfbGV2ZWw7CiYjNDM7CQlfX2VudHJ5LSZndDtucl9hY3RpdmUgPSBucl9hY3RpdmU7CiYjNDM7CQlfX2VudHJ5LSZndDt1c2FnZV9wY3QgPSBpb2MtJmd0O3BlcmlvZF91cyA/CiYjNDM7CQkJZGl2X3U2NCh1c2FnZV91c19zdW0gKiAxMDAsIGlvYy0mZ3Q7cGVyaW9kX3VzKSA6IDA7CiYjNDM7CQlfX2VudHJ5LSZndDtydW5uaW5nID0gaW9jLSZndDtydW5uaW5nOwomIzQzOwkpLAomIzQzOwomIzQzOwlUUF9wcmludGsoJiMzNDtbJXNdIHBlcmlvZD0ldXVzIHZyYXRlPSVsbHUgYnVzeT0lZCBhY3RpdmU9JWQgdXNhZ2U9JXUlJSBydW5uaW5nPSVkJiMzNDssCiYjNDM7CQlfX2dldF9zdHIoZGV2bmFtZSksIF9fZW50cnktJmd0O3BlcmlvZF91cywgX19lbnRyeS0mZ3Q7dnJhdGUsCiYjNDM7CQlfX2VudHJ5LSZndDtidXN5X2xldmVsLCBfX2VudHJ5LSZndDtucl9hY3RpdmUsIF9fZW50cnktJmd0O3VzYWdlX3BjdCwKJiM0MzsJCV9fZW50cnktJmd0O3J1bm5pbmcKJiM0MzsJKQomIzQzOyk7CiYjNDM7CiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsCiAKIAlUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmMKQEAgLTAsMCAmIzQzOzEsMTU1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDtpb2Nvc3RfbW9kZWwuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2lvY29zdF9tcy5za2VsLmgmIzM0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZQomIzQzOyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KJiM0MzsgKiBTaGFyZWQgYnkgdGhlIGV4YW1wbGUtbW9kZWwgdGVzdHMgYmVsb3cuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldikKJiM0Mzt7CiYjNDM7CWNoYXIgcGF0aFtdID0gJiMzNDsvc3lzL2ZzL2Nncm91cC9pby5jb3N0Lm1vZGVsJiMzNDs7CiYjNDM7CWNoYXIgd29yZFsyNTZdLCBsaW5lWzI1Nl0sIGJ1ZlszMDBdOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJaW50IGVyciwgZm91bmQgPSAwOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHBhdGgsICYjMzQ7ciYjNDM7JiMzNDspOwomIzQzOwlpZiAoIWZwKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtvcGVuICVzOiAlcyYjMzQ7LCBwYXRoLCBzdHJlcnJvcihlcnJubykpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyUyNTVzJiMzNDssIHdvcmQpID09IDEgJmFtcDsmYW1wOyAhc3RyY21wKHdvcmQsIGRldikpIHsKJiM0MzsJCQlmb3VuZCA9IDE7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKCFmb3VuZCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7JXMgaGFzIG5vIGlvY29zdCBsaW5lJiMzNDssIGRldik7CiYjNDM7CQlmY2xvc2UoZnApOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXMgY3RybD1icGYmIzM0OywgZGV2KTsKJiM0MzsJZXJyID0gZnByaW50ZihmcCwgJiMzNDslc1xuJiMzNDssIGJ1Zik7CiYjNDM7CWlmIChlcnIgJmx0Oz0gMCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7d3JpdGUgY3RybD1icGYgZmFpbGVkJiMzNDspOwomIzQzOwkJZmNsb3NlKGZwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlmZmx1c2goZnApOwomIzQzOwomIzQzOwlyZXdpbmQoZnApOwomIzQzOwlmb3VuZCA9IDA7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyUyNTVzJiMzNDssIHdvcmQpID09IDEgJmFtcDsmYW1wOyAhc3RyY21wKHdvcmQsIGRldikpIHsKJiM0MzsJCQlmb3VuZCA9IHN0cnN0cihsaW5lLCAmIzM0O2N0cmw9YnBmJiMzNDspICE9IE5VTEw7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKCFmb3VuZCkKJiM0MzsJCVRIX0xPRygmIzM0O3JlYWRiYWNrIGRvZXMgbm90IHNob3cgY3RybD1icGYmIzM0Oyk7CiYjNDM7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JXMgY3RybD1hdXRvXG4mIzM0OywgZGV2KTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGZvdW5kID8gMCA6IC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpCiYjNDM7ewomIzQzOwlGSUxFICpmcCA9IGZvcGVuKCYjMzQ7L3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5xb3MmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzOwomIzQzOwlpZiAoZnApCiYjNDM7CQlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gZnAgIT0gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZWdpc3RlciB0aGUgZXhhbXBsZSBjb3N0IG1vZGVsIGFuZCBzd2l0Y2ggYSBkZXZpY2UgdG8gY3RybD1icGYuCiYjNDM7ICogSU8gYWNjb3VudGluZyBpdHNlbGYgaXMgbm90IGNoZWNrZWQgaGVyZTsgaXQgbmVlZHMgYSBkZXZpY2UgZG9pbmcKJiM0MzsgKiByZWFsIElPIHVuZGVyIGlvY29zdCBhbmQgaXMgY292ZXJlZCBieSB0aGUga2VybmVsLXNpZGUgdmFsaWRhdGlvbgomIzQzOyAqIGRlc2NyaWJlZCBpbiB0aGUgY292ZXIgbGV0dGVyLgomIzQzOyAqCiYjNDM7ICogUmVxdWlyZXMgcm9vdCwgY2dyb3VwIHYyIGFuZCBhIGRldmljZSB3aXRoIGlvY29zdCBzdXBwb3J0LiAgVGhlCiYjNDM7ICogZGV2aWNlIG11c3QgYmUgZ2l2ZW4gYXMgbWFqb3I6bWlub3IgaW4gJElPQ09TVF9URVNUX0RFViwgb3RoZXJ3aXNlCiYjNDM7ICogdGhlIHRlc3QgaXMgc2tpcHBlZC4KJiM0MzsgKi8KJiM0Mzt2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvY29zdF9tb2RlbCAqc2tlbDsKJiM0MzsJY2hhciB3b3JkWzI1Nl0sICpkZXY7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CWRldiA9IGdldGVudigmIzM0O0lPQ09TVF9URVNUX0RFViYjMzQ7KTsKJiM0MzsJaWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHsKJiM0MzsJCXRlc3RfX3NraXAoKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKGRldl9oYXNfaW9jb3N0KCksICYjMzQ7aW9jb3N0X21vdW50ZWQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qIG5lZ2F0aXZlOiBjdHJsPWJwZiBtdXN0IGJlIHJlamVjdGVkIHdoaWxlIG5vIG1vZGVsIGlzCiYjNDM7CSAqIHJlZ2lzdGVyZWQsIHNvIGEgdHlwbyBjYW5ub3Qgc2lsZW50bHkgZGlzYWJsZSBjb3N0IG1vZGVsCiYjNDM7CSAqIHVwZGF0ZXMgKi8KJiM0MzsJaWYgKHNzY2FuZihkZXYsICYjMzQ7JTI1NXMmIzM0Oywgd29yZCkgIT0gMSkKJiM0MzsJCXJldHVybjsKJiM0MzsJewomIzQzOwkJY2hhciBwYXRoW10gPSAmIzM0Oy9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWwmIzM0OzsKJiM0MzsJCWNoYXIgYnVmWzMwMF07CiYjNDM7CQlGSUxFICpmcCA9IGZvcGVuKHBhdGgsICYjMzQ7dyYjMzQ7KTsKJiM0MzsKJiM0MzsJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXMgY3RybD1icGZcbiYjMzQ7LCB3b3JkKTsKJiM0MzsJCWVyciA9IDA7CiYjNDM7CQlpZiAoZnApIHsKJiM0MzsJCQllcnIgPSBmcHJpbnRmKGZwLCAmIzM0OyVzJiMzNDssIGJ1ZikgJmx0Oz0gMDsKJiM0MzsJCQlmY2xvc2UoZnApOwomIzQzOwkJfQomIzQzOwkJQVNTRVJUX1RSVUUoZXJyLCAmIzM0O2N0cmxfYnBmX3dpdGhvdXRfbW9kZWxfcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2tlbCA9IGlvY29zdF9tb2RlbF9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtza2VsX29wZW5fbG9hZCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJLyogYXR0YWNoaW5nIHRoZSBzdHJ1Y3Rfb3BzIHJlZ2lzdGVycyB0aGUgbW9kZWw7IGEgc2Vjb25kCiYjNDM7CSAqIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc2FtZSBvcHMgd291bGQgZmFpbCB3aXRoIEVCVVNZICovCiYjNDM7CWVyciA9IGlvY29zdF9tb2RlbF9fYXR0YWNoKHNrZWwpOwomIzQzOwlpZiAoQVNTRVJUX09LKGVyciwgJiMzNDthdHRhY2gmIzM0OykpCiYjNDM7CQlBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCAmIzM0O3N3aXRjaF9hbmRfcmVhZGJhY2smIzM0Oyk7CiYjNDM7CiYjNDM7CWlvY29zdF9tb2RlbF9fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTYW1lIGNoZWNrIGZvciB0aGUgbXVsdGktc3RyZWFtIGV4YW1wbGUgbW9kZWwuICBPbmx5IG9uZSBtb2RlbCBjYW4KJiM0MzsgKiBiZSByZWdpc3RlcmVkIGF0IGEgdGltZSwgc28gdGhpcyB0ZXN0IG11c3QgcnVuIHNlcGFyYXRlbHkgZnJvbQomIzQzOyAqIHRlc3RfaW9jb3N0X21vZGVsOyBib3RoIGFyZSBzZXJpYWwuCiYjNDM7ICovCiYjNDM7dm9pZCBzZXJpYWxfdGVzdF9pb2Nvc3RfbW9kZWxfc3RyZWFtcyh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGlvY29zdF9tcyAqc2tlbDsKJiM0MzsJY2hhciAqZGV2OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlkZXYgPSBnZXRlbnYoJiMzNDtJT0NPU1RfVEVTVF9ERVYmIzM0Oyk7CiYjNDM7CWlmICghZGV2IHx8IGdldGV1aWQoKSAhPSAwKSB7CiYjNDM7CQl0ZXN0X19za2lwKCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCAmIzM0O2lvY29zdF9tb3VudGVkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlza2VsID0gaW9jb3N0X21zX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3NrZWxfb3Blbl9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBpb2Nvc3RfbXNfX2F0dGFjaChza2VsKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhlcnIsICYjMzQ7YXR0YWNoJiMzNDspKQomIzQzOwkJQVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgJiMzNDtzd2l0Y2hfYW5kX3JlYWRiYWNrJiMzNDspOwomIzQzOwomIzQzOwlpb2Nvc3RfbXNfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tb2RlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21vZGVsLmMKQEAgLTAsMCAmIzQzOzEsOTEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovCiYjNDM7LyoKJiM0MzsgKiBFeGFtcGxlIGlvY29zdCBjb3N0IG1vZGVsOiB0aGUgYnVpbHRpbiBsaW5lYXIgSEREIGZvcm11bGEgd2l0aCBhbGwKJiM0MzsgKiBjb3N0cyBkb3VibGVkLgomIzQzOyAqCiYjNDM7ICogVGhlIGNvbnN0YW50cyBtaXJyb3Igd2hhdCBjYWxjX2xjb2VmcygpIGRlcml2ZXMgZnJvbSB0aGUgQVVUT1BfSERECiYjNDM7ICogZGVmYXVsdHMgKHJicHM9MTc0MDE5MTc2IHJzZXFpb3BzPTQxNzA4IHJyYW5kaW9wcz0zNzAsIHctc2lkZQomIzQzOyAqIGFuYWxvZykgaW4gdnRpbWUgdW5pdHMgd2hlcmUgMXMgPT0gMl4zNywgZXhwcmVzc2VkIHdpdGggdGhlIHNhbWUKJiM0MzsgKiByb3VuZC11cCBkaXZpc2lvbnMgc28gdGhleSBjYW5ub3QgZHJpZnQgZnJvbSB0aGUga2VybmVsLCBzbyBhCiYjNDM7ICogZGV2aWNlIHN3aXRjaGVkIHRvIGN0cmw9YnBmIHdpdGggdGhpcyBtb2RlbCByZWdpc3RlcmVkIGNoYXJnZXMKJiM0MzsgKiBleGFjdGx5IHR3aWNlIHRoZSBidWlsdGluIG1vZGVsIHVuZGVyIHRoZSBzYW1lIHdvcmtsb2FkLCB3aGljaAomIzQzOyAqIG1ha2VzIGl0IGEgY29udmVuaWVudCB3YXkgdG8gdmVyaWZ5IHRoYXQgYWNjb3VudGluZyBnb2VzIHRocm91Z2gKJiM0MzsgKiB0aGUgQlBGIHBhdGguCiYjNDM7ICovCiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7LyogVlRJTUVfUEVSX1NFQyBjb21lcyBmcm9tIHZtbGludXguaCAoYSBCVEYgZW51bSBjb25zdGFudCkgKi8KJiM0MzsjZGVmaW5lIElPQ19QQUdFX1NJWkUJCTQwOTYKJiM0MzsjZGVmaW5lIElPQ19TRUNUX1RPX1BBR0VfU0hJRlQJMwkvKiA1MTJCIHNlY3RvcnMgdG8gNGtCIHBhZ2VzICovCiYjNDM7I2RlZmluZSBMQ09FRl9SQU5ESU9fUEFHRVMJNDA5NgkvKiAxNk1CIHNlZWsgdGhyZXNob2xkICovCiYjNDM7I2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFCSgxVUxMICZsdDsmbHQ7IDApCS8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi8KJiM0MzsKJiM0MzsvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXQKJiM0MzsgKiBjb21waWxlIHRpbWUgKi8KJiM0MzsjZGVmaW5lIFJVKHgsIHkpCQkoKHgpIC8gKHkpICYjNDM7ICgoKHgpICUgKHkpKSA/IDEgOiAwKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFJCUFMJMTc0MDE5MTc2VUxMCiYjNDM7I2RlZmluZSBSU0VRSU9QUwk0MTcwOFVMTAomIzQzOyNkZWZpbmUgUlJBTkRJT1BTCTM3MFVMTAomIzQzOyNkZWZpbmUgV0JQUwkxNzgwNzU4NjZVTEwKJiM0MzsjZGVmaW5lIFdTRVFJT1BTCTQyNzA1VUxMCiYjNDM7I2RlZmluZSBXUkFORElPUFMJMzc4VUxMCiYjNDM7CiYjNDM7I2RlZmluZSBSUEFHRQkoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKQomIzQzOyNkZWZpbmUgUlNFUUlPCShSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSkKJiM0MzsjZGVmaW5lIFJSQU5ESU8JKFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSkKJiM0MzsjZGVmaW5lIFdQQUdFCShSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpCiYjNDM7I2RlZmluZSBXU0VRSU8JKFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKQomIzQzOyNkZWZpbmUgV1JBTkRJTwkoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKQomIzQzOwomIzQzO3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTY0IGJ1aWx0aW5fY29zdCh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsCiYjNDM7CQkJCQl1NjQgY3Vyc29yLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwl1NjQgcGFnZXMsIHNlZWtfcGFnZXMgPSAwLCBiYXNlLCBjb2VmX3BhZ2U7CiYjNDM7CiYjNDM7CWlmICghbmJ5dGVzKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXN3aXRjaCAob3ApIHsKJiM0MzsJY2FzZSBSRVFfT1BfUkVBRDoKJiM0MzsJCWJhc2UgPSBSU0VRSU87CiYjNDM7CQljb2VmX3BhZ2UgPSBSUEFHRTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJFUV9PUF9XUklURToKJiM0MzsJCWJhc2UgPSBXU0VRSU87CiYjNDM7CQljb2VmX3BhZ2UgPSBXUEFHRTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGN1cnNvcikgewomIzQzOwkJc2Vla19wYWdlcyA9IHNlY3RvciAmZ3Q7IGN1cnNvciA/IHNlY3RvciAtIGN1cnNvcgomIzQzOwkJCQkJICAgICA6IGN1cnNvciAtIHNlY3RvcjsKJiM0MzsJCXNlZWtfcGFnZXMgJmd0OyZndDs9IElPQ19TRUNUX1RPX1BBR0VfU0hJRlQ7CiYjNDM7CQlpZiAoc2Vla19wYWdlcyAmZ3Q7IExDT0VGX1JBTkRJT19QQUdFUykKJiM0MzsJCQliYXNlID0gKG9wID09IFJFUV9PUF9SRUFEKSA/IFJSQU5ESU8gOiBXUkFORElPOwomIzQzOwl9CiYjNDM7CiYjNDM7CXBhZ2VzID0gUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKTsKJiM0MzsJaWYgKGZsYWdzICZhbXA7IElPQ09TVF9DT1NUX0ZfTUVSR0UpCiYjNDM7CQliYXNlID0gMDsKJiM0MzsJcmV0dXJuIGJhc2UgJiM0MzsgcGFnZXMgKiBjb2VmX3BhZ2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N0cnVjdF9vcHMmIzM0OykKJiM0Mzt1NjQgQlBGX1BST0coaW9jb3N0XzJ4X2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLAomIzQzOwkgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwlyZXR1cm4gMiAqIGJ1aWx0aW5fY29zdChvcCwgbmJ5dGVzLCBzZWN0b3IsIGN1cnNvciwgZmxhZ3MpOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDsuc3RydWN0X29wcyYjMzQ7KQomIzQzO3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIGlvY29zdF8yeCA9IHsKJiM0MzsJLmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0XzJ4X2NhbGNfY29zdCwKJiM0Mzt9OwomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjQ2NWZkNWQ1YzYyZTAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmMKQEAgLTAsMCAmIzQzOzEsMTIyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqLwomIzQzOy8qCiYjNDM7ICogRXhhbXBsZSBtdWx0aS1zdHJlYW0gc2VxdWVudGlhbGl0eSBkZXRlY3Rpb24gY29zdCBtb2RlbC4KJiM0MzsgKgomIzQzOyAqIFRoZSBidWlsdGluIG1vZGVsIGtlZXBzIGEgc2luZ2xlIGN1cnNvciBwZXIgY2dyb3VwLCBzbyB0d28KJiM0MzsgKiBpbnRlcmxlYXZlZCBzZXF1ZW50aWFsIHJlYWRlcnMgaW4gb25lIGNncm91cCBhcmUgYWxsIHByaWNlZCByYW5kb20KJiM0MzsgKiAobWVhc3VyZWQgODl4IG92ZXJjaGFyZ2UsIDEyLjl4IHRocm91Z2hwdXQgY29sbGFwc2UpLCB3aGlsZSByYW5kb20KJiM0MzsgKiBJTyBpbnNpZGUgYSBob3Qgd2luZG93IHNtYWxsZXIgdGhhbiB0aGUgMTZNQiBzZWVrIHRocmVzaG9sZCBpcwomIzQzOyAqIHByaWNlZCBzZXF1ZW50aWFsIChtZWFzdXJlZCAxMDd4IHVuZGVyY2hhcmdlKS4gIFRoaXMgbW9kZWwgcmVwbGFjZXMKJiM0MzsgKiB0aGUgc2luZ2xlIGN1cnNvciB3aXRoIGEgcGVyLWNncm91cCB0YWJsZSBvZiBzdHJlYW0gc2xvdHMsIGtleWVkIGJ5CiYjNDM7ICogdGhlIGlvY2dfaWQgYXJndW1lbnQ6IGFuIElPIGlzIHNlcXVlbnRpYWwgaWZmIGl0cyBzZWN0b3IgbWF0Y2hlcyB0aGUKJiM0MzsgKiBleHBlY3RlZCBuZXh0IHNlY3RvciBvZiBhbnkgdHJhY2tlZCBzdHJlYW0uICBJbnRlcmxlYXZlZCBzdHJlYW1zCiYjNDM7ICoga2VlcCB0aGVpciBvd24gc2xvdHMsIGFuZCB3aW5kb3dlZCByYW5kb20gSU8gcmFyZWx5IG1hdGNoZXMgYQomIzQzOyAqIG1vdmluZyBleHBlY3RhdGlvbi4KJiM0MzsgKi8KJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsKJiM0MzsvKiBWVElNRV9QRVJfU0VDIGNvbWVzIGZyb20gdm1saW51eC5oIChhIEJURiBlbnVtIGNvbnN0YW50KSAqLwomIzQzOyNkZWZpbmUgSU9DX1BBR0VfU0laRQkJNDA5NgomIzQzOyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRQkoMVVMTCAmbHQ7Jmx0OyAwKQkvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovCiYjNDM7CiYjNDM7LyogRElWNjRfVTY0X1JPVU5EX1VQIC8gRElWX1JPVU5EX1VQX1VMTCBlcXVpdmFsZW50cywgZm9sZGVkIGF0CiYjNDM7ICogY29tcGlsZSB0aW1lICovCiYjNDM7I2RlZmluZSBSVSh4LCB5KQkJKCh4KSAvICh5KSAmIzQzOyAoKCh4KSAlICh5KSkgPyAxIDogMCkpCiYjNDM7CiYjNDM7I2RlZmluZSBSQlBTCTE3NDAxOTE3NlVMTAomIzQzOyNkZWZpbmUgUlNFUUlPUFMJNDE3MDhVTEwKJiM0MzsjZGVmaW5lIFJSQU5ESU9QUwkzNzBVTEwKJiM0MzsjZGVmaW5lIFdCUFMJMTc4MDc1ODY2VUxMCiYjNDM7I2RlZmluZSBXU0VRSU9QUwk0MjcwNVVMTAomIzQzOyNkZWZpbmUgV1JBTkRJT1BTCTM3OFVMTAomIzQzOwomIzQzOyNkZWZpbmUgUlBBR0UJKFJVKFZUSU1FX1BFUl9TRUMsIFJVKFJCUFMsIElPQ19QQUdFX1NJWkUpKSkKJiM0MzsjZGVmaW5lIFJTRVFJTwkoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpCiYjNDM7I2RlZmluZSBSUkFORElPCShSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpCiYjNDM7I2RlZmluZSBXUEFHRQkoUlUoVlRJTUVfUEVSX1NFQywgUlUoV0JQUywgSU9DX1BBR0VfU0laRSkpKQomIzQzOyNkZWZpbmUgV1NFUUlPCShSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSkKJiM0MzsjZGVmaW5lIFdSQU5ESU8JKFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSkKJiM0MzsKJiM0MzsjZGVmaW5lIE5TTE9UUwk0CiYjNDM7CiYjNDM7c3RydWN0IHN0cmVhbXMgewomIzQzOwlfX3U2NCBleHBlY3RlZFtOU0xPVFNdOwkvKiBuZXh0IGV4cGVjdGVkIHNlY3RvciwgcGVyIHN0cmVhbSAqLwomIzQzOwlfX3U2NCBzdGFtcFtOU0xPVFNdOwkvKiBMUlUgc3RhbXAsIDAgPSBlbXB0eSAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTsKJiM0MzsJX190eXBlKGtleSwgX191NjQpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCBzdHJlYW1zKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCA2NCk7CiYjNDM7fSBzdHJlYW1fdGFiIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzO1NFQygmIzM0O3N0cnVjdF9vcHMmIzM0OykKJiM0Mzt1NjQgQlBGX1BST0coaW9jb3N0X21zX2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLAomIzQzOwkgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RyZWFtcyAqczsKJiM0MzsJdTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdzsKJiM0MzsJdTMyIGksIHZpY3RpbSA9IDAsIGZvdW5kID0gMHhGRkZGRkZGRjsKJiM0MzsKJiM0MzsJaWYgKG9wICE9IFJFUV9PUF9SRUFEICZhbXA7JmFtcDsgb3AgIT0gUkVRX09QX1dSSVRFKQomIzQzOwkJcmV0dXJuIDA7CS8qIGRlbGVnYXRlIHRoZSByZXN0IHRvIGJ1aWx0aW4gKi8KJiM0MzsJaWYgKCFuYnl0ZXMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJaWYgKG9wID09IFJFUV9PUF9SRUFEKSB7CiYjNDM7CQlwYWdlID0gUlBBR0U7IHNlcWlvID0gUlNFUUlPOyByYW5kaW8gPSBSUkFORElPOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcGFnZSA9IFdQQUdFOyBzZXFpbyA9IFdTRVFJTzsgcmFuZGlvID0gV1JBTkRJTzsKJiM0MzsJfQomIzQzOwlhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpOwkvKiBzZWN0b3JzICovCiYjNDM7CiYjNDM7CXMgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7c3RyZWFtX3RhYiwgJmFtcDtpb2NnX2lkKTsKJiM0MzsJaWYgKCFzKSB7CiYjNDM7CQlzdHJ1Y3Qgc3RyZWFtcyB6ZXJvID0ge307CiYjNDM7CiYjNDM7CQlicGZfbWFwX3VwZGF0ZV9lbGVtKCZhbXA7c3RyZWFtX3RhYiwgJmFtcDtpb2NnX2lkLCAmYW1wO3plcm8sCiYjNDM7CQkJCSAgICBCUEZfTk9FWElTVCk7CiYjNDM7CQlzID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3N0cmVhbV90YWIsICZhbXA7aW9jZ19pZCk7CiYjNDM7CQlpZiAoIXMpCiYjNDM7CQkJcmV0dXJuIHNlcWlvICYjNDM7IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmbGFncyAmYW1wOyBJT0NPU1RfQ09TVF9GX01FUkdFKSB7CiYjNDM7CQliYXNlID0gMDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5vdyA9IGJwZl9rdGltZV9nZXRfbnMoKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5TTE9UUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChzLSZndDtleHBlY3RlZFtpXSA9PSBzZWN0b3IgJmFtcDsmYW1wOyBzLSZndDtzdGFtcFtpXSkgewomIzQzOwkJCWZvdW5kID0gaTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlpZiAoZm91bmQgIT0gMHhGRkZGRkZGRikgewomIzQzOwkJYmFzZSA9IHNlcWlvOwomIzQzOwkJcy0mZ3Q7ZXhwZWN0ZWRbZm91bmRdID0gc2VjdG9yICYjNDM7IGFkdmFuY2U7CiYjNDM7CQlzLSZndDtzdGFtcFtmb3VuZF0gPSBub3c7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQliYXNlID0gcmFuZGlvOwomIzQzOwkJZm9yIChpID0gMTsgaSAmbHQ7IE5TTE9UUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAocy0mZ3Q7c3RhbXBbaV0gJmx0OyBzLSZndDtzdGFtcFt2aWN0aW1dKQomIzQzOwkJCQl2aWN0aW0gPSBpOwomIzQzOwkJfQomIzQzOwkJcy0mZ3Q7ZXhwZWN0ZWRbdmljdGltXSA9IHNlY3RvciAmIzQzOyBhZHZhbmNlOwomIzQzOwkJcy0mZ3Q7c3RhbXBbdmljdGltXSA9IG5vdzsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJcmV0dXJuIGJhc2UgJiM0MzsgUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKSAqIHBhZ2U7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0Oy5zdHJ1Y3Rfb3BzJiMzNDspCiYjNDM7c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgaW9jb3N0X21zID0gewomIzQzOwkuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LAomIzQzO307CiYjNDM7CiYjNDM7Y2hhciBMSUNFTlNFW10gU0VDKCYjMzQ7bGljZW5zZSYjMzQ7KSA9ICYjMzQ7R1BMJiMzNDs7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjY0MwoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDgxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBLTVNBTiBGdXp6aW5nIE5lZWRzKioKCk9rYXksIHRoZSB0YXNrIGlzIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoLCBpbnRyb2R1Y2luZyBCUEYgc3RydWN0X29wcyBwbHVnZ2FibGUgY29zdCBtb2RlbCBzdXBwb3J0IGZvciBibGstaW9jb3N0IChzcGVjaWZpY2FsbHkgd2l0aCBgQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRmApLCByZXF1aXJlcyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIExldCYjMzk7cyBkaWcgaW4uCgpUaGUgcGF0Y2ggdG91Y2hlcyBhIGdvb2QgY2h1bmsgb2YgY29kZTogZG9jdW1lbnRhdGlvbiwgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlIGluIHRoZSBibG9jayBzdWJzeXN0ZW0sIHRoZSBjb3JlIGlvY29zdCBCUEYgaW1wbGVtZW50YXRpb24gKGBibGstaW9jb3N0LWJwZi5jYCksIHRoZSBleGlzdGluZyBpb2Nvc3QgbG9naWMgKGBibGstaW9jb3N0LmNgKSwgaGVhZGVyIGZpbGVzIGZvciBrZXJuZWwgaW50ZXJmYWNlcyAoYGJsay1pb2Nvc3QuaGAgYW5kIHRyYWNlIGV2ZW50cyBgaW9jb3N0LmhgKSwgYW5kIHNlbGYgdGVzdHMuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBjaGFuZ2UsIHNvIHdlIG5lZWQgdG8gYmUgdGhvcm91Z2guCgpGaXJzdCwgbGV0JiMzOTtzIGxvb2sgZm9yIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuIGBibGstaW9jb3N0LWJwZi5jYCBsb29rcyBsaWtlIHRoZSBwbGFjZSB0byBzdGFydC4gVGhlIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAgZnVuY3Rpb24gaXMgdGhlIG1haW4gY2FuZGlkYXRlLiBJdCB0YWtlcyBzY2FsYXIgYXJndW1lbnRzLCB3aGljaCBpcyBnZW5lcmFsbHkgYSBnb29kIHNpZ24uIEl0JiMzOTtzIHJldHVybmluZyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgc3VjY2VzcywgYW5kIHRoZW4gd3JpdGluZyB0aGUgcmVzdWx0IGludG8gYGNvc3RwYC4gSWYgYGlvY29zdF9icGZfY2FsY19jb3N0YCBmYWlscywgYSBkaWZmZXJlbnQgZnVuY3Rpb24gY2FsbGVkIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgaXMgY2FsbGVkLCBhbmQgYGJwZl9jb3N0YCB3aWxsIG5ldmVyIGJlIHVzZWQuIExvb2tzIGxpa2UgdGhlcmUgYXJlbiYjMzk7dCBvYnZpb3VzIGlzc3VlcyB0aGVyZSBhdCBmaXJzdCBnbGFuY2UuCgpOb3csIGxldCYjMzk7cyB0dXJuIG91ciBhdHRlbnRpb24gdG8gYGJsay1pb2Nvc3QuY2AgYW5kIGhvdyBpdCBpbnRlZ3JhdGVzIHdpdGggdGhpcyBuZXcgQlBGIGZ1bmN0aW9uYWxpdHkuIFNwZWNpZmljYWxseSwgdGhlIGBjYWxjX3Z0aW1lX2Nvc3RgIGZ1bmN0aW9uLiBIZXJlJiMzOTtzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zOiB0aGUgQlBGIGZ1bmN0aW9uLCBpZiBwcmVzZW50LCBpcyBjYWxsZWQuIEl0IHVzZXMgYFJFQURfT05DRWAsIHdoaWNoIHNlZW1zIGFwcHJvcHJpYXRlLiBJZiBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgIHJldHVybnMgdHJ1ZSwgaXQgdXBkYXRlcyBgYnBmX2Nvc3RgLCBvdGhlcndpc2UsIGl0IGNhbGxzIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAuIFNvLCB0aGUgY29kZXBhdGggbG9va3Mgc291bmQuCgpUbyBiZSBhYnNvbHV0ZWx5IHN1cmUsIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAuIEkmIzM5O2xsIHVzZSBgZ3JlcHBlcmAgb3IgYHJlYWQtZmlsZWAgdG8gY2FyZWZ1bGx5IGV4YW1pbmUgdGhhdCBmdW5jdGlvbiBhbmQgaXRzIHN1cnJvdW5kaW5nIGNvbnRleHQuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0aW4gY29zdCBjYWxjdWxhdGlvbiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBCUEYgY2FsY3VsYXRpb24gZG9lc24mIzM5O3QgaGFwcGVuIHdpdGhvdXQgYW55IGluaXRpYWxpemF0aW9uIHByb2JsZW1zLgoKQmFzZWQgb24gdGhpcyBxdWljayBhbmFseXNpcywgYW5kIGFzc3VtaW5nIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgaXMgYWxzbyBzYWZlLCBJICpzdXNwZWN0KiB0aGlzIHBhdGNoICptaWdodCBub3QqIGltbWVkaWF0ZWx5IHNjcmVhbSAmIzM0O05lZWRzS01TQU49dHJ1ZS4mIzM0OyBIb3dldmVyLCB0aGUgaW50cm9kdWN0aW9uIG9mIEJQRiBhbHdheXMgd2FycmFudHMgZXh0cmEgc2NydXRpbnksIGJlY2F1c2Ugb2YgdGhlIHBvdGVudGlhbCBmb3IgY29tcGxleCBpbnRlcmFjdGlvbnMgYW5kIHN1YnRsZSBtZW1vcnkgaGF6YXJkcy4gSSYjMzk7ZCBsZWFuIHRvd2FyZHMgcmVxdWlyaW5nIGZ1cnRoZXIgcmV2aWV3IGFuZCB0ZXN0aW5nLCBidXQgaXQmIzM5O3Mgbm90IGEgc2xhbSBkdW5rICYjMzQ7eWVzJiMzNDsgZm9yIEtNU0FOIGZ1enppbmcgKnlldCouIEkmIzM5O2xsIG5lZWQgdG8gY29uZmlybSBteSB1bmRlcnN0YW5kaW5nIG9mIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgdG8gbWFrZSBhIGZpbmFsIGNhbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDExOjM2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NhbGNfdnRpbWVfY29zdF9idWlsdGluJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2Jsb2NrL2Jsay1pb2Nvc3QuYz0yNDczPXN0YXRpYyB1NjQgYWRqdXN0X2ludXNlX2FuZF9jYWxjX2Nvc3Qoc3RydWN0IGlvY19ncSAqaW9jZywgdTY0IHZ0aW1lLFxuLS1cbmJsb2NrL2Jsay1pb2Nvc3QuYy0yNTMzLVxuYmxvY2svYmxrLWlvY29zdC5jOjI1MzQ6c3RhdGljIHZvaWQgY2FsY192dGltZV9jb3N0X2J1aWx0aW4oc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLFxuYmxvY2svYmxrLWlvY29zdC5jLTI1MzUtXHRcdFx0XHQgICAgYm9vbCBpc19tZXJnZSwgdTY0ICpjb3N0cClcbi0tXG5ibG9jay9ibGstaW9jb3N0LmM9MjU3OT1zdGF0aWMgdTY0IGNhbGNfdnRpbWVfY29zdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBpb2NfZ3EgKmlvY2csIGJvb2wgaXNfbWVyZ2UpXG4tLVxuYmxvY2svYmxrLWlvY29zdC5jLTI1OTktXG5ibG9jay9ibGstaW9jb3N0LmM6MjYwMDpcdGNhbGNfdnRpbWVfY29zdF9idWlsdGluKGJpbywgaW9jZywgaXNfbWVyZ2UsIFx1MDAyNmNvc3QpO1xuYmxvY2svYmxrLWlvY29zdC5jLTI2MDEtXHRyZXR1cm4gY29zdDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQzODIKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiA2MjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBJT0Nvc3QgVHJhY2Vwb2ludCBhbmQgTW9kZWwqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgd2l0aCBgdHJhY2VfaW9jb3N0X2lvY190aWNrYCBhbmQgaXRzIGFzc29jaWF0ZWQgYWRkaXRpb25zLiBMb29raW5nIGF0IGBpbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaGAsIEkgc2VlIHRoZSB0cmFjZXBvaW50IGRlZmluaXRpb24uIEl0JiMzOTtzIGNhcHR1cmluZyBzZXZlcmFsIGtleSBwaWVjZXMgb2YgaW5mb3JtYXRpb246IHRoZSBkZXZpY2UgbmFtZSwgdGhlIHBlcmlvZCBpbiBtaWNyb3NlY29uZHMsIHRoZSB2aXJ0dWFsIHJhdGUsIHRoZSBidXN5IGxldmVsLCBudW1iZXIgb2YgYWN0aXZlIHJlcXVlc3RzLCB1c2FnZSBwZXJjZW50YWdlLCBhbmQgYSAmIzM5O3J1bm5pbmcmIzM5OyBmbGFnLiBJIG5vdGljZSB0aGF0IGFsbCBvZiB0aGVzZSBmaWVsZHMgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQsIHdoaWNoIGlzIGdvb2QgZm9yIGNsYXJpdHkgYW5kIGNvbnRyb2wuCgpOb3csIGxldCYjMzk7cyBzaGlmdCBnZWFycyBhbmQgbG9vayBhdCBob3cgdGhlIGNvc3QgbW9kZWwgaXMgYmVpbmcgcG9wdWxhdGVkLCBzcGVjaWZpY2FsbHkgd2l0aCBgaW9jX2Nvc3RfbW9kZWxfcHJmaWxsYC4gVGhpcyBjb2RlIHNuaXBwZXQgdXNlcyBgc2VxX3ByaW50ZmAgdG8gb3V0cHV0IGNvc3QgbW9kZWwgcGFyYW1ldGVycy4gSSBzZWUgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGRldGVybWluaW5nIHRoZSAmIzM0O2N0cmwmIzM0OyB2YWx1ZSDigJMgaXQmIzM5O3MgYmFzZWQgb24gYGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWxgIGFuZCBgaW9jLSZndDt1c2VyX2Nvc3RfbW9kZWxgLiBBaCwgc28gYGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWxgIGlzIGEgYm9vbGVhbiB2YWx1ZSwgc2V0IHZpYSBgV1JJVEVfT05DRWAuIFRoaXMgdGVsbHMgbWUgd2hldGhlciB3ZSYjMzk7cmUgdXNpbmcgYSBCUEYtYmFzZWQgY29zdCBtb2RlbCBvciBub3QuCgpJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBgc3RydWN0IGlvY2AgaXRzZWxmLiBJIGtub3cgaXQmIzM5O3MgYWxsb2NhdGVkLiBJIG5lZWQgdG8gdmVyaWZ5IGV4YWN0bHkgaG93IHRoYXQgYWxsb2NhdGlvbiBoYXBwZW5zLiBJIHNob3VsZCBjaGVjayBgaW9jX2luaXRgIG9yIGBpb2Nvc3RfaW5pdGAgdG8gY29uZmlybSBteSBhc3N1bXB0aW9uIHRoYXQgaXQmIzM5O3MgYmVpbmcgemVyb2VkIG91dCB3aXRoIGBremFsbG9jYC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBgaW9jYCBzdHJ1Y3QgaXMgaGFuZGxlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDggMTE6MzY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a3phbGxvYy4qaW9jJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YmxvY2svJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2Jsb2NrL2Jsay1pb2Nvc3QuYz0yOTM5PXN0YXRpYyBpbnQgYmxrX2lvY29zdF9pbml0KHN0cnVjdCBnZW5kaXNrICpkaXNrKVxuLS1cbmJsb2NrL2Jsay1pb2Nvc3QuYy0yOTQzLVxuYmxvY2svYmxrLWlvY29zdC5jOjI5NDQ6XHRpb2MgPSBremFsbG9jX29iaigqaW9jKTtcbmJsb2NrL2Jsay1pb2Nvc3QuYy0yOTQ1LVx0aWYgKCFpb2MpXG4tLVxuYmxvY2svYmxrLWlvY29zdC5jPTMwMDQ9c3RhdGljIHN0cnVjdCBibGtjZ19wb2xpY3lfZGF0YSAqaW9jX2NwZF9hbGxvYyhnZnBfdCBnZnApXG4tLVxuYmxvY2svYmxrLWlvY29zdC5jLTMwMDctXG5ibG9jay9ibGstaW9jb3N0LmM6MzAwODpcdGlvY2MgPSBremFsbG9jX29iaihzdHJ1Y3QgaW9jX2NncnAsIGdmcCk7XG5ibG9jay9ibGstaW9jb3N0LmMtMzAwOS1cdGlmICghaW9jYylcbi0tXG5ibG9jay9ibGstaW9jb3N0LmM9MzAyMT1zdGF0aWMgc3RydWN0IGJsa2dfcG9saWN5X2RhdGEgKmlvY19wZF9hbGxvYyhzdHJ1Y3QgZ2VuZGlzayAqZGlzayxcbi0tXG5ibG9jay9ibGstaW9jb3N0LmMtMzAyNi1cbmJsb2NrL2Jsay1pb2Nvc3QuYzozMDI3Olx0aW9jZyA9IGt6YWxsb2Nfbm9kZShzdHJ1Y3Rfc2l6ZShpb2NnLCBhbmNlc3RvcnMsIGxldmVscyksIGdmcCxcbmJsb2NrL2Jsay1pb2Nvc3QuYy0zMDI4LVx0XHRcdCAgICBkaXNrLVx1MDAzZW5vZGVfaWQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTcwOQoJCQkJCQkJb3V0cHV0OiAzNjIKCQkJCQkJCXRob3VnaHRzOiAxMTY2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFzc2Vzc21lbnQ6IGJsay1pb2Nvc3QgQlBGIFN0cnVjdF9PcHMgU3VwcG9ydCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBzZWUgYGlvY2AgaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5IHVzaW5nIGBremFsbG9jX29iamAuIFRoZSBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgIGZ1bmN0aW9uIGxvb2tzIHNvdW5kLCB3aXRoIHByb3BlciBsb2NraW5nIGFuZCBpbml0aWFsaXphdGlvbiBvZiBgdXNlcmAgYW5kIGBicGZgIGZsYWdzIGJhc2VkIG9uIGlucHV0IHN0cmluZ3MgKCYjMzQ7YXV0byYjMzQ7LCAmIzM0O3VzZXImIzM0OywgJiMzNDticGYmIzM0OykuIFRoZSBCUEYgbG9naWMgaXMgY29uZGl0aW9uYWxseSBlbmFibGVkIHdpdGggYENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZgLCBhbmQgdGhlIGZpbmFsIGBXUklURV9PTkNFYCBlbnN1cmVzIGF0b21pYyB1cGRhdGUgb2YgYGlvYy0mZ3Q7YnBmX2Nvc3RfbW9kZWxgLiBFdmVyeXRoaW5nIHNlZW1zIHdlbGwtc3RydWN0dXJlZCBhdCB0aGlzIGxldmVsLgoKTm93LCBvbiB0byB0aGUgQlBGIHN0cnVjdF9vcHMgcmVnaXN0cmF0aW9uIGluIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYC4gYGJwZl9pb2Nvc3RfbW9kZWxfb3BzYCBpcyBhIHN0YXRpYyBzdHJ1Y3QsIGFuZCB0aGUgcmVnaXN0cmF0aW9uIGxvZ2ljIHdpdGggYG11dGV4X2xvY2tgLCBgcmN1X2Fzc2lnbl9wb2ludGVyYCwgYW5kIGBzdGF0aWNfYnJhbmNoX2luY2AgbG9va3Mgc3RhbmRhcmQgYW5kIHNhZmUsIHV0aWxpemluZyBSQ1UgcHJvcGVybHkuIGBuZXdfb3BzYCBpcyBwYXNzZWQgaW4gYXMgYSBwb2ludGVyLgoKTXkgZm9jdXMgbm93IHNoaWZ0cyB0byBwb3RlbnRpYWwgS01TQU4gaXNzdWVzIOKAkyBpbmZvIGxlYWtzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBJJiMzOTttIGFjdGl2ZWx5IGxvb2tpbmcgZm9yIGFueSBzY2VuYXJpbyB3aGVyZSB1bmluaXRpYWxpemVkIGtlcm5lbCBkYXRhIGNvdWxkIGxlYWsgdG8gdXNlcnNwYWNlLiBJJiMzOTt2ZSBnb3QgdG8gYmUgZXh0cmEgdGhvcm91Z2ggaGVyZS4KCjEuICAqKktlcm5lbC10by1Vc2Vyc3BhY2UgTGVha3M6KiogSSBzZWUgbm8gZGlyZWN0IGV4cG9zdXJlIG9mIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSB2aWEgYGNvcHlfdG9fdXNlcmAsIGBwdXRfdXNlcmAsIHNvY2tldCBvcHRpb25zLCBldGMuLCB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzLiBUaGUgb3V0cHV0cyBhcmUgYWxsIHZpYSBzYWZlIG1ldGhvZHMgLSBzZXFcX2ZpbGUgZm9ybWF0dGluZywgdHJhY2Vwb2ludHMgd2l0aCBleHBsaWNpdCBmaWVsZHMsIGFuZCBzdGFuZGFyZCBzdHJ1Y3RcX29wcyByZWdpc3RyYXRpb24sIHdoaWNoIGFyZSBjaGVja2VkLgoyLiAgKipVbmluaXRpYWxpemVkIFZhcmlhYmxlIEJyYW5jaGluZzoqKiBUaGUgY29kZSBjaGVja3MgYXJlIGFsbCBleHBsaWNpdC4gQWxsIHZhcmlhYmxlcyBsaWtlIGBicGZgLCBgdXNlcmAsIGByZXRgLCBgY29zdGAgYXJlIGluaXRpYWxpemVkIGJlZm9yZSBhbnkgdXNlLgozLiAgKipDb21wbGV4IERhdGEgU3RydWN0dXJlczoqKiBBbGwgYWxsb2NhdGlvbnMgbG9vayBsaWtlIHRoZXkgYXJlIHplcm9lZC4KNC4gICoqQnVmZmVyIEJvdW5kIENoZWNrczoqKiBUaGUgYnVmZmVyIGJvdW5kcyBjaGVja3MgZG9uJiMzOTt0IHNlZW0gbGlrZSB0aGV5IGFyZSBtb2RpZmllZCBpbiBhIHdheSB0aGF0IHdvdWxkIGxlYWQgdG8gZXhwb3NpbmcgdW5pbml0aWFsaXplZCBieXRlcy4KClNvLCB0aGlzIGxvb2tzIHByZXR0eSBjbGVhbi4KCldoYXQgYWJvdXQgb3RoZXIgYnVnIGNsYXNzZXM/IENvbmN1cnJlbmN5IGlzc3VlcyB3aXRoIFJDVS9tdXRleC9zdGF0aWMga2V5cyBhcmUgYSBwb3NzaWJpbGl0eSwgYnV0IExPQ0tERVAsIEtBU0FOLCBhbmQgVFNBTiBzaG91bGQgY2F0Y2ggdGhvc2UuIE5VTEwgZGVyZWZlcmVuY2VzIG9yIGxvZ2ljIGJ1Z3MgY291bGQgc3RpbGwgc25lYWsgdGhyb3VnaCwgYnV0IHRoZSBzdGFuZGFyZCBrZXJuZWwgY2hlY2tzIGFuZCBLQVNBTiB3aWxsIGJlIHZlcnkgZWZmZWN0aXZlIGhlcmUuIEFueSBCUEYgdmVyaWZpZXIgb3Igc3RydWN0XF9vcHMgaW50ZXJhY3Rpb24gYnVncyBhcmUgYWxzbyBjb3ZlcmVkIGJ5IGV4aXN0aW5nIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTi4KCkkmIzM5O20gc3RhcnRpbmcgdG8gZmVlbCBjb25maWRlbnQsIGJ1dCBsZXQmIzM5O3MgZG91YmxlLWNoZWNrIGV2ZXJ5dGhpbmcuIGBpbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaGAgaXMganVzdCBkZWNsYXJhdGlvbnMuIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYCBsb29rcyB2ZXJ5IGNsZWFuLCB3aXRoIHNjYWxhciBhcmd1bWVudHMgcGFzc2VkIGJ5IHZhbHVlIHRvIHRoZSBCUEYgcHJvZ3JhbSwgYW5kIHRoZSBgdTY0IGNvc3RgIGlzIHRob3JvdWdobHkgY2hlY2tlZC4gVGhlIGB0cmFjZV9pb2Nvc3RfaW9jX3RpY2tgIGZ1bmN0aW9uIGlzIGFzc2lnbmluZyBhbGwgZmllbGRzIGZyb20gc2NhbGFyIHZhcmlhYmxlcyBhbmQgYGlvY2AgZmllbGRzLCB3aGljaCBpcyBnb29kLiBUaGUgYnVpbGQgYW5kIGRvYyBjaGFuZ2VzIGluIGBEb2N1bWVudGF0aW9uL2AsIGBibG9jay9LY29uZmlnYCwgYW5kIGBibG9jay9NYWtlZmlsZWAgc2VlbSBzdGFuZGFyZC4gVGhlIHVzZXJzcGFjZSBzZWxmLXRlc3RzIGFyZSBwcmVzZW50IGFuZCB3ZWxsLWRlZmluZWQuCgpUaGVyZWZvcmUsIG15IGNvbmNsdXNpb24gaXMgYE5lZWRzS01TQU49ZmFsc2VgLgoKSGVyZSYjMzk7cyBteSBjbGVhciBLTVNBTiByZWFzb25pbmc6CgoqICAgVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdFxfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIGJsay1pb2Nvc3QsIGVuYWJsaW5nIGR5bmFtaWMgdnRpbWUgY29zdCBjYWxjdWxhdGlvbiB2aWEgYSBCUEYgcHJvZ3JhbS4gSXQgYWxzbyBhZGRzIGEgdHJhY2Vwb2ludCBhbmQgdXBkYXRlcyBjb3N0IG1vZGVsIGNvbnRyb2wgbG9naWMuCiogICBLTVNBTiBpcyBkZXNpZ25lZCB0byBkZXRlY3QgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UgYW5kIGtlcm5lbC10by11c2VyIGluZm8gbGVha3MuIEluIHRoaXMgcGF0Y2gsIGFsbCBuZXcgc3RydWN0dXJlcywgbG9jYWwgdmFyaWFibGVzLCBhbmQgdHJhY2Vwb2ludCBmaWVsZHMgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuIEJQRiBzdHJ1Y3RcX29wcyBmdW5jdGlvbnMgdGFrZSBzY2FsYXIgdmFsdWVzIHBhc3NlZCBieSB2YWx1ZSwgYW5kIHRoZSBvdXRwdXQgYGJwZl9jb3N0YCBpcyB3cml0dGVuIGRpcmVjdGx5IGFuZCBjaGVja2VkIGJlZm9yZSBiZWluZyByZXR1cm5lZC4gTm8ga2VybmVsIG1lbW9yeSBpcyBleHBvc2VkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbi4KKiAgIFRoZSBwcmltYXJ5IGNvbmNlcm5zIGhlcmUgYXJlIGNvbmN1cnJlbmN5L2xvY2tpbmcgc3luY2hyb25pemF0aW9uIChSQ1UsIG11dGV4LCBhbmQgc3RhdGljIGtleXMpIGFuZCBwb3RlbnRpYWwgbG9naWMgYnVncyBvciBpbnZhbGlkIGRlcmVmZXJlbmNlcy4gVGhlc2UgY29uY2VybnMgYXJlIGFscmVhZHkgYWRkcmVzc2VkIGJ5IHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi4KKiAgIFRodXMsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgZGF0YSBsZWFrcywgc28gdGhpcyBwYXRjaCBkb2VzICpub3QqIG5lZWQgS01TQU4uCgpMZXQmIzM5O3MgbG9nIHRoaXMgYXMgYE5lZWRzS01TQU49ZmFsc2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxMTozNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIHRoZSBibGstaW9jb3N0IEkvTyBjZ3JvdXAgY29udHJvbGxlciwgYWxsb3dpbmcgcGx1Z2dhYmxlIEJQRi1iYXNlZCBjb3N0IGNhbGN1bGF0aW9uLCBhZGRzIGEgbmV3IHRyYWNlcG9pbnQgKGBpb2Nvc3RfaW9jX3RpY2tgKSwgYW5kIHVwZGF0ZXMgdGhlIGNncm91cCB2MiBgaW8uY29zdC5tb2RlbGAgaW50ZXJmYWNlLlxuXG5BbmFseXNpcyByZWdhcmRpbmcgc2FuaXRpemVyczpcbjEuIEtNU0FOIGFwcGxpY2FiaWxpdHk6XG4tIEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSBhbmQga2VybmVsLXRvLXVzZXIgaW5mb3JtYXRpb24gbGVha3MuXG4tIEluIHRoaXMgcGF0Y2gsIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgcGFzc2VkIHRvIGBpb2Nvc3RfYnBmX2NhbGNfY29zdCgpYCBhbmQgdGhlIEJQRiBzdHJ1Y3Rfb3BzIGNhbGxiYWNrIGFyZSBzY2FsYXIgaW50ZWdlciB2YWx1ZXMgcGFzc2VkIGJ5IHZhbHVlLlxuLSBPdXRwdXQgcG9pbnRlcnMgKHN1Y2ggYXMgYCpjb3N0cGAgaW4gYGlvY29zdF9icGZfY2FsY19jb3N0YCkgYXJlIHdyaXR0ZW4gYmVmb3JlIHJldHVybiwgYW5kIGFsbCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4gYGJwZmAsIGB1c2VyYCwgYGNvc3RgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gYnJhbmNoaW5nIG9yIHVzZS5cbi0gVGhlIG5ldyB0cmFjZXBvaW50IGBpb2Nvc3RfaW9jX3RpY2tgIGV4cGxpY2l0bHkgYXNzaWducyBhbGwgZmllbGRzIGluIGBUUF9mYXN0X2Fzc2lnbmAuXG4tIE5vIHN0cnVjdHMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBoZWFwIGFsbG9jYXRpb25zIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLlxuXG4yLiBLQVNBTiAvIExPQ0tERVAgYXBwbGljYWJpbGl0eTpcbi0gUG90ZW50aWFsIHJpc2tzIGluIHRoaXMgcGF0Y2ggcmV2b2x2ZSBhcm91bmQgY29uY3VycmVuY3kgKHN5bmNocm9uaXphdGlvbiBvZiBgaW9jb3N0X2JwZl9tb2RlbGAgdmlhIFJDVSwgbXV0ZXhlcywgYW5kIHN0YXRpYyBrZXlzKSBvciBsb2dpYy9ib3VuZHMgZXJyb3JzLCB3aGljaCBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBrZXJuZWwgYnVnIGRldGVjdG9ycywgTE9DS0RFUCwgYW5kIEtBU0FOLlxuXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdF9vcHMgc3VwcG9ydCAoYGlvY29zdF9tb2RlbF9vcHNgKSBmb3IgdGhlIGJsay1pb2Nvc3QgSS9PIGNncm91cCBjb250cm9sbGVyLCBhbGxvd2luZyBwbHVnZ2FibGUgQlBGLWJhc2VkIGNvc3QgY2FsY3VsYXRpb24sIGFkZHMgYSBuZXcgdHJhY2Vwb2ludCAoYGlvY29zdF9pb2NfdGlja2ApLCBhbmQgdXBkYXRlcyB0aGUgY2dyb3VwIHYyIGBpby5jb3N0Lm1vZGVsYCBpbnRlcmZhY2UuXG5cbkFuYWx5c2lzIHJlZ2FyZGluZyBzYW5pdGl6ZXJzOlxuMS4gS01TQU4gYXBwbGljYWJpbGl0eTpcbi0gS01TQU4gZGV0ZWN0cyByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IGFuZCBrZXJuZWwtdG8tdXNlciBpbmZvcm1hdGlvbiBsZWFrcy5cbi0gSW4gdGhpcyBwYXRjaCwgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gYGlvY29zdF9icGZfY2FsY19jb3N0KClgIGFuZCB0aGUgQlBGIHN0cnVjdF9vcHMgY2FsbGJhY2sgYXJlIHNjYWxhciBpbnRlZ2VyIHZhbHVlcyBwYXNzZWQgYnkgdmFsdWUuXG4tIE91dHB1dCBwb2ludGVycyAoc3VjaCBhcyBgKmNvc3RwYCBpbiBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgKSBhcmUgd3JpdHRlbiBiZWZvcmUgcmV0dXJuLCBhbmQgYWxsIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiBgYnBmYCwgYHVzZXJgLCBgY29zdGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBwcmlvciB0byBicmFuY2hpbmcgb3IgdXNlLlxuLSBUaGUgbmV3IHRyYWNlcG9pbnQgYGlvY29zdF9pb2NfdGlja2AgZXhwbGljaXRseSBhc3NpZ25zIGFsbCBmaWVsZHMgaW4gYFRQX2Zhc3RfYXNzaWduYC5cbi0gTm8gc3RydWN0cyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGhlYXAgYWxsb2NhdGlvbnMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UuXG5cbjIuIEtBU0FOIC8gTE9DS0RFUCBhcHBsaWNhYmlsaXR5OlxuLSBQb3RlbnRpYWwgcmlza3MgaW4gdGhpcyBwYXRjaCByZXZvbHZlIGFyb3VuZCBjb25jdXJyZW5jeSAoc3luY2hyb25pemF0aW9uIG9mIGBpb2Nvc3RfYnBmX21vZGVsYCB2aWEgUkNVLCBtdXRleGVzLCBhbmQgc3RhdGljIGtleXMpIG9yIGxvZ2ljL2JvdW5kcyBlcnJvcnMsIHdoaWNoIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLCBMT0NLREVQLCBhbmQgS0FTQU4uXG5cblRoZXJlZm9yZSwgdGhlIGNoYW5nZXMgZG8gbm90IGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNTo0My44MjI3NTU1ODdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDg5NTMxNjQ2NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQX0lPQ09TVF9CUEZcIixcbiAgICBcIkJMS19DR1JPVVBfSU9DT1NUXCIsXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQlBGX0pJVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImlvY29zdF9icGZfY2FsY19jb3N0XCIsXG4gICAgXCJicGZfaW9jb3N0X3JlZ1wiLFxuICAgIFwiYnBmX2lvY29zdF91bnJlZ1wiLFxuICAgIFwiaW9jX2Nvc3RfbW9kZWxfd3JpdGVcIixcbiAgICBcImlvY19jb3N0X21vZGVsX3ByZmlsbFwiLFxuICAgIFwiY2FsY192dGltZV9jb3N0XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIHRoZSBibGstaW9jb3N0IEkvTyBjZ3JvdXAgY29udHJvbGxlciwgYWxsb3dpbmcgcGx1Z2dhYmxlIEJQRi1iYXNlZCBjb3N0IGNhbGN1bGF0aW9uLCBhZGRzIGEgbmV3IHRyYWNlcG9pbnQgKGBpb2Nvc3RfaW9jX3RpY2tgKSwgYW5kIHVwZGF0ZXMgdGhlIGNncm91cCB2MiBgaW8uY29zdC5tb2RlbGAgaW50ZXJmYWNlLlxcblxcbkFuYWx5c2lzIHJlZ2FyZGluZyBzYW5pdGl6ZXJzOlxcbjEuIEtNU0FOIGFwcGxpY2FiaWxpdHk6XFxuLSBLTVNBTiBkZXRlY3RzIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgYW5kIGtlcm5lbC10by11c2VyIGluZm9ybWF0aW9uIGxlYWtzLlxcbi0gSW4gdGhpcyBwYXRjaCwgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gYGlvY29zdF9icGZfY2FsY19jb3N0KClgIGFuZCB0aGUgQlBGIHN0cnVjdF9vcHMgY2FsbGJhY2sgYXJlIHNjYWxhciBpbnRlZ2VyIHZhbHVlcyBwYXNzZWQgYnkgdmFsdWUuXFxuLSBPdXRwdXQgcG9pbnRlcnMgKHN1Y2ggYXMgYCpjb3N0cGAgaW4gYGlvY29zdF9icGZfY2FsY19jb3N0YCkgYXJlIHdyaXR0ZW4gYmVmb3JlIHJldHVybiwgYW5kIGFsbCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4gYGJwZmAsIGB1c2VyYCwgYGNvc3RgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gYnJhbmNoaW5nIG9yIHVzZS5cXG4tIFRoZSBuZXcgdHJhY2Vwb2ludCBgaW9jb3N0X2lvY190aWNrYCBleHBsaWNpdGx5IGFzc2lnbnMgYWxsIGZpZWxkcyBpbiBgVFBfZmFzdF9hc3NpZ25gLlxcbi0gTm8gc3RydWN0cyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGhlYXAgYWxsb2NhdGlvbnMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UuXFxuXFxuMi4gS0FTQU4gLyBMT0NLREVQIGFwcGxpY2FiaWxpdHk6XFxuLSBQb3RlbnRpYWwgcmlza3MgaW4gdGhpcyBwYXRjaCByZXZvbHZlIGFyb3VuZCBjb25jdXJyZW5jeSAoc3luY2hyb25pemF0aW9uIG9mIGBpb2Nvc3RfYnBmX21vZGVsYCB2aWEgUkNVLCBtdXRleGVzLCBhbmQgc3RhdGljIGtleXMpIG9yIGxvZ2ljL2JvdW5kcyBlcnJvcnMsIHdoaWNoIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLCBMT0NLREVQLCBhbmQgS0FTQU4uXFxuXFxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMgaW4gdGhlIGJsb2NrIGlvY29zdCBjZ3JvdXAgY29udHJvbGxlciAoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRikuIEl0IGFkZHMgc3RydWN0X29wcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBpbnRlZ3JhdGVzIGR5bmFtaWMgQlBGIGNvc3QgY2FsY3VsYXRpb24gaW50byB0aGUgYmlvIHN1Ym1pc3Npb24gcGF0aCwgYW5kIGV4dGVuZHMgdGhlIGNncm91cCBpby5jb3N0Lm1vZGVsIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLiBUaGUgY29kZSBpcyBmdWxseSByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBjZ3JvdXBzIGFuZCB0aGUgQlBGIHN1YnN5c3RlbS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzU6NDMuODIyNzYxNDE2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDA5NDQ3NjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgU2VwIDggMTE6MzU6NDMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0XFxuaW5kZXggOGQyNjAzNzUxYzUxYS4uNTRiMDU3NGNlNTg2YyAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12Mi5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Nncm91cC12Mi5yc3RcXG5AQCAtMjExNSwxMCArMjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXNcXG4gXFx0YXJlIGRlZmluZWQuXFxuIFxcbiBcXHQgID09PT09XFx0XFx0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4tXFx0ICBjdHJsXFx0XFx0XFxcImF1dG9cXFwiIG9yIFxcXCJ1c2VyXFxcIlxcbitcXHQgIGN0cmxcXHRcXHRcXFwiYXV0b1xcXCIsIFxcXCJ1c2VyXFxcIiBvciBcXFwiYnBmXFxcIlxcbiBcXHQgIG1vZGVsXFx0XFx0VGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gXFxcImxpbmVhclxcXCJcXG4gXFx0ICA9PT09PVxcdFxcdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuIFxcbitcXHRXaGVuIFxcXCJjdHJsXFxcIiBpcyBcXFwiYnBmXFxcIiAob25seSBhdmFpbGFibGUgd2hlblxcbitcXHRDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGIGlzIGVuYWJsZWQpLCBjb3N0IGNhbGN1bGF0aW9uIGZvclxcbitcXHR0aGUgZGV2aWNlIGlzIGRpc3BhdGNoZWQgdG8gdGhlIEJQRiBwcm9ncmFtIHJlZ2lzdGVyZWQgYWdhaW5zdFxcbitcXHR0aGUgaW9jb3N0X21vZGVsX29wcyBzdHJ1Y3Rfb3BzLiAgV3JpdGluZyBcXFwiYnBmXFxcIiBmYWlscyB3aXRoIC1FSU5WQUxcXG4rXFx0dW50aWwgc3VjaCBhIHByb2dyYW0gaXMgcmVnaXN0ZXJlZCwgYW5kIGF0IG1vc3Qgb25lIHByb2dyYW0gY2FuXFxuK1xcdGJlIHJlZ2lzdGVyZWQgc3lzdGVtLXdpZGUuICBUaGUgbW9kZWwgaXMgY2FsbGVkIHdpdGggc2NhbGFyXFxuK1xcdGFyZ3VtZW50cyAob3BlcmF0aW9uLCBzaXplLCBzZWN0b3IsIGNncm91cCBjdXJzb3IsIGNzcyBpZCBvZiB0aGVcXG4rXFx0aXNzdWluZyBjZ3JvdXAsIGZsYWdzOyBzZWUgaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmggZm9yIHRoZWlyXFxuK1xcdG1lYW5pbmcpIGFuZCByZXR1cm5zIGEgY29zdCBpbiB2dGltZSB1bml0cywgY2xhbXBlZCBieSB0aGUga2VybmVsXFxuK1xcdHRvIDEgc2Vjb25kIG9mIGRldmljZSB0aW1lIHBlciBJTy4gIEEgcmV0dXJuIHZhbHVlIG9mIDAgZGVsZWdhdGVzXFxuK1xcdHRoZSBJTyBiYWNrIHRvIHRoZSBidWlsdGluIGxpbmVhciBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIG9ubHlcXG4rXFx0aGFuZGxlcyBzb21lIElPIHR5cGVzIGNhbm5vdCBtYWtlIHRoZSByZXN0IGZyZWUuICBEZXZpY2VzIHdoaWNoXFxuK1xcdGRvbid0IG9wdCBpbiBrZWVwIHRoZSBidWlsdGluIGxpbmVhciBtb2RlbCB1bmNoYW5nZWQuXFxuK1xcbiBcXHRXaGVuIFxcXCJjdHJsXFxcIiBpcyBcXFwiYXV0b1xcXCIsIHRoZSBrZXJuZWwgbWF5IGNoYW5nZSBhbGwgcGFyYW1ldGVyc1xcbiBcXHRkeW5hbWljYWxseS4gIFdoZW4gXFxcImN0cmxcXFwiIGlzIHNldCB0byBcXFwidXNlclxcXCIgb3IgYW55IG90aGVyXFxuIFxcdHBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gdG8sIFxcXCJjdHJsXFxcIiBiZWNvbWUgXFxcInVzZXJcXFwiIGFuZCB0aGVcXG5kaWZmIC0tZ2l0IGEvYmxvY2svS2NvbmZpZyBiL2Jsb2NrL0tjb25maWdcXG5pbmRleCA3MGU0YTY2ZDk0MWZmLi5iZjQzYmUyMWUwMGJiIDEwMDY0NFxcbi0tLSBhL2Jsb2NrL0tjb25maWdcXG4rKysgYi9ibG9jay9LY29uZmlnXFxuQEAgLTIzMSw0ICsyMzEsMTMgQEAgY29uZmlnIEJMS19FUlJPUl9JTkpFQ1RJT05cXG4gXFxuIHNvdXJjZSBcXFwiYmxvY2svS2NvbmZpZy5pb3NjaGVkXFxcIlxcbiBcXG4rY29uZmlnIEJMS19DR1JPVVBfSU9DT1NUX0JQRlxcbitcXHRib29sIFxcXCJFbmFibGUgQlBGIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIHRoZSBjb3N0IElPIGNvbnRyb2xsZXJcXFwiXFxuK1xcdGRlcGVuZHMgb24gQkxLX0NHUk9VUF9JT0NPU1QgXFx1MDAyNlxcdTAwMjYgQlBGX1NZU0NBTEwgXFx1MDAyNlxcdTAwMjYgQlBGX0pJVFxcbitcXHRoZWxwXFxuK1xcdCBFbmFibGluZyB0aGlzIG9wdGlvbiByZWdpc3RlcnMgdGhlIFxcXCJpb2Nvc3RfbW9kZWxfb3BzXFxcIiBCUEZcXG4rXFx0IHN0cnVjdF9vcHMgdHlwZSwgd2hpY2ggYWxsb3dzIGEgQlBGIHByb2dyYW0gdG8gcmVwbGFjZSB0aGVcXG4rXFx0IGJ1aWx0aW4gbGluZWFyIGNvc3QgbW9kZWwgb24gZGV2aWNlcyBjb25maWd1cmVkIHdpdGhcXG4rXFx0IFxcXCJjdHJsPWJwZlxcXCIgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLlxcbitcXG4gZW5kaWYgIyBCTE9DS1xcbmRpZmYgLS1naXQgYS9ibG9jay9NYWtlZmlsZSBiL2Jsb2NrL01ha2VmaWxlXFxuaW5kZXggZTdiZDMyMGUzZDY5Ny4uZWU1Y2ViZWVhMDA2ZiAxMDA2NDRcXG4tLS0gYS9ibG9jay9NYWtlZmlsZVxcbisrKyBiL2Jsb2NrL01ha2VmaWxlXFxuQEAgLTM5LDMgKzM5LDQgQEAgb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTilcXHQrPSBibGstY3J5cHRvLm8gYmxrLWNyeXB0by1wcm9maWxlLm8gXFxcXFxcbiBcXHRcXHRcXHRcXHRcXHQgICBibGstY3J5cHRvLXN5c2ZzLm9cXG4gb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSylcXHQrPSBibGstY3J5cHRvLWZhbGxiYWNrLm9cXG4gb2JqLSQoQ09ORklHX0JMT0NLX0hPTERFUl9ERVBSRUNBVEVEKVxcdCs9IGhvbGRlci5vXFxuK29iai0kKENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEYpXFx0Kz0gYmxrLWlvY29zdC1icGYub1xcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LWJwZi5jIGIvYmxvY2svYmxrLWlvY29zdC1icGYuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMGMzNGY1NmRlZDcxZFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9ibG9jay9ibGstaW9jb3N0LWJwZi5jXFxuQEAgLTAsMCArMSwxNTIgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cXG4rXFxuKy8qXFxuKyAqIGJsay1pb2Nvc3Q6IEJQRiBzdHJ1Y3Rfb3BzIHBsdW1iaW5nIGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMuXFxuKyAqXFxuKyAqIFJlZ2lzdGVycyB0aGUgXFxcImlvY29zdF9tb2RlbF9vcHNcXFwiIHN0cnVjdF9vcHMgdHlwZS4gIEF0IG1vc3Qgb25lIG1vZGVsXFxuKyAqIGNhbiBiZSByZWdpc3RlcmVkIGF0IGEgdGltZTsgZGV2aWNlcyBvcHQgaW4gcGVyLXF1ZXVlIHdpdGhcXG4rICogXFxcImVjaG8gJERFViBjdHJsPWJwZiBcXHUwMDNlIGlvLmNvc3QubW9kZWxcXFwiLiAgRGV2aWNlcyB3aXRob3V0IGEgcmVnaXN0ZXJlZFxcbisgKiBtb2RlbCBrZWVwIHVzaW5nIHRoZSBidWlsdGluIGxpbmVhciBtb2RlbC5cXG4rICovXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGZfdmVyaWZpZXIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXFx1MDAzZVxcbitcXG4rLyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJ3MgY2hhcmdlYWJsZSBjb3N0ICovXFxuKyNkZWZpbmUgSU9DT1NUX0JQRl9NQVhfQ09TVFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDM3KVxcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfc3RydWN0X29wcyBicGZfaW9jb3N0X21vZGVsX29wcztcXG4rXFxuK3N0YXRpYyBERUZJTkVfTVVURVgoaW9jb3N0X2JwZl9yZWdfbG9jayk7XFxuK3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX3JjdSAqaW9jb3N0X2JwZl9tb2RlbDtcXG4rc3RhdGljIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGlvY29zdF9icGZfa2V5KTtcXG4rXFxuK2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIHN0YXRpY19icmFuY2hfdW5saWtlbHkoXFx1MDAyNmlvY29zdF9icGZfa2V5KTtcXG4rfVxcbitcXG4rYm9vbCBpb2Nvc3RfYnBmX2NhbGNfY29zdCh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsIHU2NCBjdXJzb3IsXFxuK1xcdFxcdFxcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cClcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqb3BzO1xcbitcXHR1NjQgY29zdDtcXG4rXFxuK1xcdGlmICghc3RhdGljX2JyYW5jaF91bmxpa2VseShcXHUwMDI2aW9jb3N0X2JwZl9rZXkpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRyY3VfcmVhZF9sb2NrKCk7XFxuK1xcdG9wcyA9IHJjdV9kZXJlZmVyZW5jZShpb2Nvc3RfYnBmX21vZGVsKTtcXG4rXFx0aWYgKCFvcHMpIHtcXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRjb3N0ID0gb3BzLVxcdTAwM2VjYWxjX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGlvY2dfaWQsIGZsYWdzKTtcXG4rXFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcbitcXHRpZiAoIWNvc3QpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdCpjb3N0cCA9IG1pbihjb3N0LCBJT0NPU1RfQlBGX01BWF9DT1NUKTtcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9tb2RlbF9pbml0KHN0cnVjdCBidGYgKmJ0ZilcXG4re1xcbitcXHRzMzIgdHlwZV9pZDtcXG4rXFxuK1xcdHR5cGVfaWQgPSBidGZfZmluZF9ieV9uYW1lX2tpbmQoYnRmLCBcXFwiaW9jb3N0X21vZGVsX29wc1xcXCIsIEJURl9LSU5EX1NUUlVDVCk7XFxuK1xcdGlmICh0eXBlX2lkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIoY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbitcXHRcXHRcXHRcXHQgIGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXIsXFxuK1xcdFxcdFxcdFxcdCAgdm9pZCAqa2RhdGEsIGNvbnN0IHZvaWQgKnVkYXRhKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBicGZfaW9jb3N0X2lzX3ZhbGlkX2FjY2VzcyhpbnQgb2ZmLCBpbnQgc2l6ZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csXFxuK1xcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnBmX2luc25fYWNjZXNzX2F1eCAqaW5mbylcXG4re1xcbitcXHRyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqXFxuK2JwZl9pb2Nvc3RfZ2V0X2Z1bmNfcHJvdG8oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkLFxcbitcXHRcXHRcXHQgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZylcXG4re1xcbitcXHRyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0ge1xcbitcXHQuZ2V0X2Z1bmNfcHJvdG8gPSBicGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvLFxcbitcXHQuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsXFxuK307XFxuK1xcbitzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXFxuK3tcXG4rXFx0c3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm5ld19vcHMgPSBrZGF0YTtcXG4rXFxuK1xcdGlmICghbmV3X29wcy1cXHUwMDNlY2FsY19jb3N0KVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGludCByZXQgPSAwO1xcbitcXG4rXFx0LyogdGhlIGNhbGxlciBvbmx5IGhvbGRzIHRoZSBwZXItbWFwIGxvY2ssIHNvIHNlcmlhbGl6ZSBoZXJlICovXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xcbitcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpKVxcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdGVsc2Uge1xcbitcXHRcXHRzdGF0aWNfYnJhbmNoX2luYyhcXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xcbitcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgbmV3X29wcyk7XFxuK1xcdH1cXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgYnBmX2lvY29zdF91bnJlZyh2b2lkICprZGF0YSwgc3RydWN0IGJwZl9saW5rICpsaW5rKVxcbit7XFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xcbitcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpID09IGtkYXRhKSB7XFxuK1xcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBOVUxMKTtcXG4rXFx0XFx0c3RhdGljX2JyYW5jaF9kZWMoXFx1MDAyNmlvY29zdF9icGZfa2V5KTtcXG4rXFx0fVxcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xcbit9XFxuK1xcbitzdGF0aWMgdTY0IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxcbitcXHRcXHRcXHRcXHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXFxuK3tcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyA9IHtcXG4rXFx0LmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsXFxuK307XFxuK1xcbitzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0ge1xcbitcXHQudmVyaWZpZXJfb3BzID0gXFx1MDAyNmJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzLFxcbitcXHQuaW5pdCA9IGJwZl9pb2Nvc3RfbW9kZWxfaW5pdCxcXG4rXFx0LmluaXRfbWVtYmVyID0gYnBmX2lvY29zdF9pbml0X21lbWJlcixcXG4rXFx0LnJlZyA9IGJwZl9pb2Nvc3RfcmVnLFxcbitcXHQudW5yZWcgPSBicGZfaW9jb3N0X3VucmVnLFxcbitcXHQubmFtZSA9IFxcXCJpb2Nvc3RfbW9kZWxfb3BzXFxcIixcXG4rXFx0LmNmaV9zdHVicyA9IFxcdTAwMjZfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyxcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK307XFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBicGZfaW9jb3N0X2luaXQodm9pZClcXG4re1xcbitcXHRyZXR1cm4gcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoXFx1MDAyNmJwZl9pb2Nvc3RfbW9kZWxfb3BzLCBpb2Nvc3RfbW9kZWxfb3BzKTtcXG4rfVxcbitsYXRlX2luaXRjYWxsKGJwZl9pb2Nvc3RfaW5pdCk7XFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2Nvc3QuYyBiL2Jsb2NrL2Jsay1pb2Nvc3QuY1xcbmluZGV4IDI3NDViZmZjZDVlZWYuLmE1OGMxNmZjYjI5ZmEgMTAwNjQ0XFxuLS0tIGEvYmxvY2svYmxrLWlvY29zdC5jXFxuKysrIGIvYmxvY2svYmxrLWlvY29zdC5jXFxuQEAgLTE3Nyw2ICsxNzcsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdGltZXIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3RpbWU2NC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcGFyc2VyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ibGstaW9jb3N0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9sb2NhbC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL2xvY2FsNjQuaFxcdTAwM2VcXG5AQCAtNDQ1LDYgKzQ0Niw3IEBAIHN0cnVjdCBpb2Mge1xcbiBcXHRpbnRcXHRcXHRcXHRcXHRhdXRvcF9pZHg7XFxuIFxcdGJvb2xcXHRcXHRcXHRcXHR1c2VyX3Fvc19wYXJhbXM6MTtcXG4gXFx0Ym9vbFxcdFxcdFxcdFxcdHVzZXJfY29zdF9tb2RlbDoxO1xcbitcXHRib29sXFx0XFx0XFx0XFx0YnBmX2Nvc3RfbW9kZWw7XFxuIH07XFxuIFxcbiBzdHJ1Y3QgaW9jZ19wY3B1X3N0YXQge1xcbkBAIC0yMjM4LDYgKzIyNDAsNyBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxcbiBcXHRzdHJ1Y3QgaW9jX25vdyBub3c7XFxuIFxcdExJU1RfSEVBRChzdXJwbHVzZXMpO1xcbiBcXHRpbnQgbnJfZGVidG9ycywgbnJfc2hvcnRhZ2VzID0gMCwgbnJfbGFnZ2luZyA9IDA7XFxuK1xcdGludCBucl9hY3RpdmUgPSAwO1xcbiBcXHR1NjQgdXNhZ2VfdXNfc3VtID0gMDtcXG4gXFx0dTMyIHBwbV9ydGhyO1xcbiBcXHR1MzIgcHBtX3d0aHI7XFxuQEAgLTIyNzQsNiArMjI3Nyw4IEBAIHN0YXRpYyB2b2lkIGlvY190aW1lcl9mbihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpXFxuIFxcdFxcdHU2NCB2ZG9uZSwgdnRpbWUsIHVzYWdlX3VzO1xcbiBcXHRcXHR1MzIgaHdfYWN0aXZlLCBod19pbnVzZTtcXG4gXFxuK1xcdFxcdG5yX2FjdGl2ZSsrO1xcbitcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogQ29sbGVjdCB1bnVzZWQgYW5kIHdpbmQgdnRpbWUgY2xvc2VyIHRvIHZub3cgdG8gcHJldmVudFxcbiBcXHRcXHQgKiBpb2NncyBmcm9tIGFjY3VtdWxhdGluZyBhIGxhcmdlIGFtb3VudCBvZiBidWRnZXQuXFxuQEAgLTI0NjAsNiArMjQ2NSw4IEBAIHN0YXRpYyB2b2lkIGlvY190aW1lcl9mbihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpXFxuIFxcdFxcdGlvY19yZWZyZXNoX3ZyYXRlKGlvYywgXFx1MDAyNm5vdyk7XFxuIFxcdH1cXG4gXFxuK1xcdHRyYWNlX2lvY29zdF9pb2NfdGljayhpb2MsIG5yX2FjdGl2ZSwgdXNhZ2VfdXNfc3VtKTtcXG4rXFxuIFxcdHNwaW5fdW5sb2NrX2lycShcXHUwMDI2aW9jLVxcdTAwM2Vsb2NrKTtcXG4gfVxcbiBcXG5AQCAtMjU3Myw2ICsyNTgwLDIzIEBAIHN0YXRpYyB1NjQgY2FsY192dGltZV9jb3N0KHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGlvY19ncSAqaW9jZywgYm9vbCBpc19tZXJnZSlcXG4ge1xcbiBcXHR1NjQgY29zdDtcXG4gXFxuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXFxuK1xcdHN0cnVjdCBpb2MgKmlvYyA9IGlvY2ctXFx1MDAzZWlvYztcXG4rXFxuK1xcdGlmIChSRUFEX09OQ0UoaW9jLVxcdTAwM2VicGZfY29zdF9tb2RlbCkpIHtcXG4rXFx0XFx0dTY0IGJwZl9jb3N0O1xcbitcXG4rXFx0XFx0aWYgKGlvY29zdF9icGZfY2FsY19jb3N0KGJpb19vcChiaW8pLFxcbitcXHRcXHRcXHRcXHRcXHQgYmlvLVxcdTAwM2ViaV9pdGVyLmJpX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCBiaW8tXFx1MDAzZWJpX2l0ZXIuYmlfc2VjdG9yLFxcbitcXHRcXHRcXHRcXHRcXHQgaW9jZy1cXHUwMDNlY3Vyc29yLFxcbitcXHRcXHRcXHRcXHRcXHQgaW9jZ190b19ibGtnKGlvY2cpLVxcdTAwM2VibGtjZy1cXHUwMDNlY3NzLmlkLFxcbitcXHRcXHRcXHRcXHRcXHQgaXNfbWVyZ2UgPyBJT0NPU1RfQ09TVF9GX01FUkdFIDogMCxcXG4rXFx0XFx0XFx0XFx0XFx0IFxcdTAwMjZicGZfY29zdCkpXFxuK1xcdFxcdFxcdHJldHVybiBicGZfY29zdDtcXG4rXFx0fVxcbisjZW5kaWZcXG4rXFxuIFxcdGNhbGNfdnRpbWVfY29zdF9idWlsdGluKGJpbywgaW9jZywgaXNfbWVyZ2UsIFxcdTAwMjZjb3N0KTtcXG4gXFx0cmV0dXJuIGNvc3Q7XFxuIH1cXG5AQCAtMzQ0MSw3ICszNDY1LDggQEAgc3RhdGljIHU2NCBpb2NfY29zdF9tb2RlbF9wcmZpbGwoc3RydWN0IHNlcV9maWxlICpzZixcXG4gXFx0c2VxX3ByaW50ZihzZiwgXFxcIiVzIGN0cmw9JXMgbW9kZWw9bGluZWFyIFxcXCJcXG4gXFx0XFx0ICAgXFxcInJicHM9JWxsdSByc2VxaW9wcz0lbGx1IHJyYW5kaW9wcz0lbGx1IFxcXCJcXG4gXFx0XFx0ICAgXFxcIndicHM9JWxsdSB3c2VxaW9wcz0lbGx1IHdyYW5kaW9wcz0lbGx1XFxcXG5cXFwiLFxcbi1cXHRcXHQgICBkbmFtZSwgaW9jLVxcdTAwM2V1c2VyX2Nvc3RfbW9kZWwgPyBcXFwidXNlclxcXCIgOiBcXFwiYXV0b1xcXCIsXFxuK1xcdFxcdCAgIGRuYW1lLCBpb2MtXFx1MDAzZWJwZl9jb3N0X21vZGVsID8gXFxcImJwZlxcXCIgOlxcbitcXHRcXHRcXHQgICBpb2MtXFx1MDAzZXVzZXJfY29zdF9tb2RlbCA/IFxcXCJ1c2VyXFxcIiA6IFxcXCJhdXRvXFxcIixcXG4gXFx0XFx0ICAgdVtJX0xDT0VGX1JCUFNdLCB1W0lfTENPRUZfUlNFUUlPUFNdLCB1W0lfTENPRUZfUlJBTkRJT1BTXSxcXG4gXFx0XFx0ICAgdVtJX0xDT0VGX1dCUFNdLCB1W0lfTENPRUZfV1NFUUlPUFNdLCB1W0lfTENPRUZfV1JBTkRJT1BTXSk7XFxuIFxcdHNwaW5fdW5sb2NrX2lycShcXHUwMDI2aW9jLVxcdTAwM2Vsb2NrKTtcXG5AQCAtMzQ4MSw3ICszNTA2LDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCxcXG4gXFx0dW5zaWduZWQgaW50IG1lbWZsYWdzO1xcbiBcXHRzdHJ1Y3QgaW9jICppb2M7XFxuIFxcdHU2NCB1W05SX0lfTENPRUZTXTtcXG4tXFx0Ym9vbCB1c2VyO1xcbitcXHRib29sIHVzZXIsIGJwZjtcXG4gXFx0Y2hhciAqYm9keSwgKnA7XFxuIFxcdGludCByZXQ7XFxuIFxcbkBAIC0zNTEyLDYgKzM1MzcsNyBAQCBzdGF0aWMgc3NpemVfdCBpb2NfY29zdF9tb2RlbF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmlucHV0LFxcbiBcXHRzcGluX2xvY2tfaXJxKFxcdTAwMjZpb2MtXFx1MDAzZWxvY2spO1xcbiBcXHRtZW1jcHkodSwgaW9jLVxcdTAwM2VwYXJhbXMuaV9sY29lZnMsIHNpemVvZih1KSk7XFxuIFxcdHVzZXIgPSBpb2MtXFx1MDAzZXVzZXJfY29zdF9tb2RlbDtcXG4rXFx0YnBmID0gaW9jLVxcdTAwM2VicGZfY29zdF9tb2RlbDtcXG4gXFxuIFxcdHJldCA9IC1FSU5WQUw7XFxuIFxcbkBAIC0zNTI3LDExICszNTUzLDIwIEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXFxuIFxcdFxcdHN3aXRjaCAobWF0Y2hfdG9rZW4ocCwgY29zdF9jdHJsX3Rva2VucywgYXJncykpIHtcXG4gXFx0XFx0Y2FzZSBDT1NUX0NUUkw6XFxuIFxcdFxcdFxcdG1hdGNoX3N0cmxjcHkoYnVmLCBcXHUwMDI2YXJnc1swXSwgc2l6ZW9mKGJ1ZikpO1xcbi1cXHRcXHRcXHRpZiAoIXN0cmNtcChidWYsIFxcXCJhdXRvXFxcIikpXFxuK1xcdFxcdFxcdGlmICghc3RyY21wKGJ1ZiwgXFxcImF1dG9cXFwiKSkge1xcbiBcXHRcXHRcXHRcXHR1c2VyID0gZmFsc2U7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcXFwidXNlclxcXCIpKVxcbitcXHRcXHRcXHRcXHRicGYgPSBmYWxzZTtcXG4rXFx0XFx0XFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcInVzZXJcXFwiKSkge1xcbiBcXHRcXHRcXHRcXHR1c2VyID0gdHJ1ZTtcXG4tXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRicGYgPSBmYWxzZTtcXG4rI2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZcXG4rXFx0XFx0XFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcImJwZlxcXCIpKSB7XFxuK1xcdFxcdFxcdFxcdGlmICghaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKCkpXFxuK1xcdFxcdFxcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbitcXHRcXHRcXHRcXHR1c2VyID0gZmFsc2U7XFxuK1xcdFxcdFxcdFxcdGJwZiA9IHRydWU7XFxuKyNlbmRpZlxcbitcXHRcXHRcXHR9IGVsc2VcXG4gXFx0XFx0XFx0XFx0Z290byB1bmxvY2s7XFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHRjYXNlIENPU1RfTU9ERUw6XFxuQEAgLTM1NTYsNiArMzU5MSw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdGlvYy1cXHUwMDNldXNlcl9jb3N0X21vZGVsID0gZmFsc2U7XFxuIFxcdH1cXG4rXFx0V1JJVEVfT05DRShpb2MtXFx1MDAzZWJwZl9jb3N0X21vZGVsLCBicGYpO1xcbiBcXHRpb2NfcmVmcmVzaF9wYXJhbXMoaW9jLCB0cnVlKTtcXG4gXFxuIFxcdHJldCA9IDA7XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjcxMTFiNWMwM2RjMzZcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmhcXG5AQCAtMCwwICsxLDU2IEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXFxuKyNpZm5kZWYgX0xJTlVYX0JMS19JT0NPU1RfSFxcbisjZGVmaW5lIF9MSU5VWF9CTEtfSU9DT1NUX0hcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbitcXG4rI2lmZGVmIENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZcXG4rXFxuKy8qXFxuKyAqIFBsdWdnYWJsZSBjb3N0IG1vZGVsIGludGVyZmFjZSBmb3IgYmxrLWlvY29zdC5cXG4rICpcXG4rICogQSBCUEYgc3RydWN0X29wcyBpbXBsZW1lbnRhdGlvbiByZWdpc3RlcmVkIGFnYWluc3QgXFxcImlvY29zdF9tb2RlbF9vcHNcXFwiXFxuKyAqIHJlcGxhY2VzIHRoZSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoXFxuKyAqIFxcXCJjdHJsPWJwZlxcXCIgdGhyb3VnaCBpby5jb3N0Lm1vZGVsLiAgVGhlIG1vZGVsIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiB0aGVcXG4rICogYXJndW1lbnRzIGJlbG93IGFuZCByZXR1cm5zIHRoZSBjb3N0IG9mIHRoZSBJTyBpbiBkZXZpY2UgdGltZSB1bml0cyxcXG4rICogd2hlcmUgMSBzZWNvbmQgb2YgZGV2aWNlIHRpbWUgZXF1YWxzIDJeMzcgKFZUSU1FX1BFUl9TRUMpLiAgVGhlXFxuKyAqIHJldHVybmVkIHZhbHVlIGlzIGNsYW1wZWQgYnkgdGhlIGtlcm5lbC4gIEEgY29zdCBvZiAwIGRlbGVnYXRlcyB0aGVcXG4rICogSU8gYmFjayB0byB0aGUgYnVpbHRpbiBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIGRvZXMgbm90IGhhbmRsZSBhXFxuKyAqIGdpdmVuIElPIHR5cGUgY2Fubm90IG1ha2UgaXQgZnJlZS5cXG4rICpcXG4rICogVGhlIGlvY2dfaWQgYXJndW1lbnQgaWRlbnRpZmllcyB0aGUgaXNzdWluZyBjZ3JvdXAgKGNzcyBpZCkgc28gdGhlXFxuKyAqIG1vZGVsIGNhbiBrZWVwIHBlci1jZ3JvdXAgc3RhdGUsIGUuZy4gZm9yIG11bHRpLXN0cmVhbSBzZXF1ZW50aWFsaXR5XFxuKyAqIGRldGVjdGlvbi4gIFRoZSBpZCBpcyBvbmx5IHZhbGlkIHdoaWxlIHRoZSBjZ3JvdXAgZXhpc3RzOiBjc3MgaWRzIGFyZVxcbisgKiByZWN5Y2xlZCBvbmNlIHRoZSBjZ3JvdXAgaXMgcmVtb3ZlZCwgc28gbW9kZWxzIG11c3QgdHJlYXQgaXQgYXMgYVxcbisgKiB0cmFuc2llbnQga2V5IGFuZCByZXNldCBzdGF0ZSB3aGVuIHRoZXkgb2JzZXJ2ZSBpdCByZXVzZWQuICBXaGV0aGVyXFxuKyAqIHRoZSBpbnRlcmZhY2UgbmVlZHMgYSByZWxlYXNlKGlvY2dfaWQpIGNhbGxiYWNrIGZvciBzdGF0ZSBjbGVhbnVwIGlzXFxuKyAqIGFuIG9wZW4gcXVlc3Rpb24uXFxuKyAqXFxuKyAqIFRoZSBtb2RlbCBpcyBjYWxsZWQgZnJvbSB0aGUgSU8gc3VibWlzc2lvbiBwYXRoIHVuZGVyIFJDVSBhbmQgbXVzdFxcbisgKiBub3Qgc2xlZXAuICBPbmx5IHRoZSBiaW8tbGV2ZWwgY2hhcmdpbmcgcGF0aCBjb25zdWx0cyB0aGUgbW9kZWw7XFxuKyAqIHRoZSByZXF1ZXN0LWxldmVsIHNpemluZyBwYXRoIChjYWxjX3NpemVfdnRpbWVfY29zdCgpKSBrZWVwcyB1c2luZ1xcbisgKiB0aGUgYnVpbHRpbiBmb3JtdWxhLlxcbisgKi9cXG4rXFxuKy8qIGZsYWdzIGZvciBjYWxjX2Nvc3QoKSAqL1xcbisjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKVxcdC8qIGNhbGxlZCBmcm9tIG1lcmdlIHBhdGggKi9cXG4rXFxuK3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIHtcXG4rXFx0LypcXG4rXFx0ICogQG9wOlxcdFxcdFJFUV9PUF8qIHZhbHVlICh1YXBpIGJsa19vcGYuaClcXG4rXFx0ICogQG5ieXRlczpcXHRJTyBzaXplIGluIGJ5dGVzXFxuK1xcdCAqIEBzZWN0b3I6XFx0c3RhcnRpbmcgc2VjdG9yXFxuK1xcdCAqIEBjdXJzb3I6XFx0aW9jZyBjdXJzb3Igc2VjdG9yLCAwIGlmIG5vbmUgKHNlcXVlbnRpYWxpdHkgaGludClcXG4rXFx0ICogQGlvY2dfaWQ6XFx0Y3NzIGlkIG9mIHRoZSBpc3N1aW5nIGNncm91cFxcbitcXHQgKiBAZmxhZ3M6XFx0SU9DT1NUX0NPU1RfRl8qXFxuK1xcdCAqL1xcbitcXHR1NjQgKCpjYWxjX2Nvc3QpKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvcixcXG4rXFx0XFx0XFx0IHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpO1xcbit9O1xcbitcXG4rYm9vbCBpb2Nvc3RfYnBmX2NhbGNfY29zdCh1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsIHU2NCBjdXJzb3IsXFxuK1xcdFxcdFxcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cCk7XFxuK2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpO1xcbitcXG4rI2VuZGlmXFx0LyogQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRiAqL1xcbisjZW5kaWZcXHQvKiBfTElOVVhfQkxLX0lPQ09TVF9IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhcXG5pbmRleCBlNzcyYjFiYzYwZDYwLi4yYjlmZjM0OGE0ZjUxIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXFxuKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhcXG5AQCAtMTc4LDYgKzE3OCw0NiBAQCBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jX3ZyYXRlX2FkaixcXG4gXFx0KVxcbiApO1xcbiBcXG4rLypcXG4rICogUGVyaW9kaWMgcGVyLWRldmljZSBzdW1tYXJ5LCBlbWl0dGVkIG9uY2UgcGVyIHBlcmlvZCBmcm9tIHRoZSB0YWlsIG9mXFxuKyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5XFxuKyAqIHBlcmlvZCB0aGUgY29udHJvbGxlciBpcyBydW5uaW5nLCBpbmNsdWRpbmcgc3RlYWR5IHN0YXRlcywgYW5kIGNhcnJpZXNcXG4rICogdGhlIG92ZXJhbGwgY29udHJvbGxlciBzdGF0ZSBzbyBiYXNpYyBtb25pdG9yaW5nIGRvZXNuJ3QgcmVxdWlyZSBkcmduLlxcbisgKi9cXG4rVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY190aWNrLFxcbitcXG4rXFx0VFBfUFJPVE8oc3RydWN0IGlvYyAqaW9jLCBpbnQgbnJfYWN0aXZlLCB1NjQgdXNhZ2VfdXNfc3VtKSxcXG4rXFxuK1xcdFRQX0FSR1MoaW9jLCBucl9hY3RpdmUsIHVzYWdlX3VzX3N1bSksXFxuK1xcbitcXHRUUF9TVFJVQ1RfX2VudHJ5IChcXG4rXFx0XFx0X19zdHJpbmcoZGV2bmFtZSwgaW9jX25hbWUoaW9jKSlcXG4rXFx0XFx0X19maWVsZCh1MzIsIHBlcmlvZF91cylcXG4rXFx0XFx0X19maWVsZCh1NjQsIHZyYXRlKVxcbitcXHRcXHRfX2ZpZWxkKGludCwgYnVzeV9sZXZlbClcXG4rXFx0XFx0X19maWVsZChpbnQsIG5yX2FjdGl2ZSlcXG4rXFx0XFx0X19maWVsZCh1MzIsIHVzYWdlX3BjdClcXG4rXFx0XFx0X19maWVsZChpbnQsIHJ1bm5pbmcpXFxuK1xcdCksXFxuK1xcbitcXHRUUF9mYXN0X2Fzc2lnbihcXG4rXFx0XFx0X19hc3NpZ25fc3RyKGRldm5hbWUpO1xcbitcXHRcXHRfX2VudHJ5LVxcdTAwM2VwZXJpb2RfdXMgPSBpb2MtXFx1MDAzZXBlcmlvZF91cztcXG4rXFx0XFx0X19lbnRyeS1cXHUwMDNldnJhdGUgPSBpb2MtXFx1MDAzZXZ0aW1lX2Jhc2VfcmF0ZTtcXG4rXFx0XFx0X19lbnRyeS1cXHUwMDNlYnVzeV9sZXZlbCA9IGlvYy1cXHUwMDNlYnVzeV9sZXZlbDtcXG4rXFx0XFx0X19lbnRyeS1cXHUwMDNlbnJfYWN0aXZlID0gbnJfYWN0aXZlO1xcbitcXHRcXHRfX2VudHJ5LVxcdTAwM2V1c2FnZV9wY3QgPSBpb2MtXFx1MDAzZXBlcmlvZF91cyA/XFxuK1xcdFxcdFxcdGRpdl91NjQodXNhZ2VfdXNfc3VtICogMTAwLCBpb2MtXFx1MDAzZXBlcmlvZF91cykgOiAwO1xcbitcXHRcXHRfX2VudHJ5LVxcdTAwM2VydW5uaW5nID0gaW9jLVxcdTAwM2VydW5uaW5nO1xcbitcXHQpLFxcbitcXG4rXFx0VFBfcHJpbnRrKFxcXCJbJXNdIHBlcmlvZD0ldXVzIHZyYXRlPSVsbHUgYnVzeT0lZCBhY3RpdmU9JWQgdXNhZ2U9JXUlJSBydW5uaW5nPSVkXFxcIixcXG4rXFx0XFx0X19nZXRfc3RyKGRldm5hbWUpLCBfX2VudHJ5LVxcdTAwM2VwZXJpb2RfdXMsIF9fZW50cnktXFx1MDAzZXZyYXRlLFxcbitcXHRcXHRfX2VudHJ5LVxcdTAwM2VidXN5X2xldmVsLCBfX2VudHJ5LVxcdTAwM2Vucl9hY3RpdmUsIF9fZW50cnktXFx1MDAzZXVzYWdlX3BjdCxcXG4rXFx0XFx0X19lbnRyeS1cXHUwMDNlcnVubmluZ1xcbitcXHQpXFxuKyk7XFxuK1xcbiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsXFxuIFxcbiBcXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jXFxuQEAgLTAsMCArMSwxNTUgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFxcImlvY29zdF9tb2RlbC5za2VsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJpb2Nvc3RfbXMuc2tlbC5oXFxcIlxcbitcXG4rLypcXG4rICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZVxcbisgKiByZWFkYmFjaywgcmVzdG9yaW5nIGN0cmw9YXV0byBhZnRlcndhcmRzLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuXFxuKyAqIFNoYXJlZCBieSB0aGUgZXhhbXBsZS1tb2RlbCB0ZXN0cyBiZWxvdy5cXG4rICovXFxuK3N0YXRpYyBpbnQgc3dpdGNoX3RvX2JwZihjb25zdCBjaGFyICpkZXYpXFxuK3tcXG4rXFx0Y2hhciBwYXRoW10gPSBcXFwiL3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFxcXCI7XFxuK1xcdGNoYXIgd29yZFsyNTZdLCBsaW5lWzI1Nl0sIGJ1ZlszMDBdO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0aW50IGVyciwgZm91bmQgPSAwO1xcbitcXG4rXFx0ZnAgPSBmb3BlbihwYXRoLCBcXFwicitcXFwiKTtcXG4rXFx0aWYgKCFmcCkge1xcbitcXHRcXHRUSF9MT0coXFxcIm9wZW4gJXM6ICVzXFxcIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcbitcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcXG4rXFx0XFx0aWYgKHNzY2FuZihsaW5lLCBcXFwiJTI1NXNcXFwiLCB3b3JkKSA9PSAxIFxcdTAwMjZcXHUwMDI2ICFzdHJjbXAod29yZCwgZGV2KSkge1xcbitcXHRcXHRcXHRmb3VuZCA9IDE7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0aWYgKCFmb3VuZCkge1xcbitcXHRcXHRUSF9MT0coXFxcIiVzIGhhcyBubyBpb2Nvc3QgbGluZVxcXCIsIGRldik7XFxuK1xcdFxcdGZjbG9zZShmcCk7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXG4rXFx0c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgXFxcIiVzIGN0cmw9YnBmXFxcIiwgZGV2KTtcXG4rXFx0ZXJyID0gZnByaW50ZihmcCwgXFxcIiVzXFxcXG5cXFwiLCBidWYpO1xcbitcXHRpZiAoZXJyIFxcdTAwM2M9IDApIHtcXG4rXFx0XFx0VEhfTE9HKFxcXCJ3cml0ZSBjdHJsPWJwZiBmYWlsZWRcXFwiKTtcXG4rXFx0XFx0ZmNsb3NlKGZwKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcdGZmbHVzaChmcCk7XFxuK1xcbitcXHRyZXdpbmQoZnApO1xcbitcXHRmb3VuZCA9IDA7XFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xcbitcXHRcXHRpZiAoc3NjYW5mKGxpbmUsIFxcXCIlMjU1c1xcXCIsIHdvcmQpID09IDEgXFx1MDAyNlxcdTAwMjYgIXN0cmNtcCh3b3JkLCBkZXYpKSB7XFxuK1xcdFxcdFxcdGZvdW5kID0gc3Ryc3RyKGxpbmUsIFxcXCJjdHJsPWJwZlxcXCIpICE9IE5VTEw7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0aWYgKCFmb3VuZClcXG4rXFx0XFx0VEhfTE9HKFxcXCJyZWFkYmFjayBkb2VzIG5vdCBzaG93IGN0cmw9YnBmXFxcIik7XFxuK1xcbitcXHRmcHJpbnRmKGZwLCBcXFwiJXMgY3RybD1hdXRvXFxcXG5cXFwiLCBkZXYpO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gZm91bmQgPyAwIDogLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZGV2X2hhc19pb2Nvc3Qodm9pZClcXG4re1xcbitcXHRGSUxFICpmcCA9IGZvcGVuKFxcXCIvc3lzL2ZzL2Nncm91cC9pby5jb3N0LnFvc1xcXCIsIFxcXCJyXFxcIik7XFxuK1xcbitcXHRpZiAoZnApXFxuK1xcdFxcdGZjbG9zZShmcCk7XFxuK1xcdHJldHVybiBmcCAhPSBOVUxMO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZWdpc3RlciB0aGUgZXhhbXBsZSBjb3N0IG1vZGVsIGFuZCBzd2l0Y2ggYSBkZXZpY2UgdG8gY3RybD1icGYuXFxuKyAqIElPIGFjY291bnRpbmcgaXRzZWxmIGlzIG5vdCBjaGVja2VkIGhlcmU7IGl0IG5lZWRzIGEgZGV2aWNlIGRvaW5nXFxuKyAqIHJlYWwgSU8gdW5kZXIgaW9jb3N0IGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZSBrZXJuZWwtc2lkZSB2YWxpZGF0aW9uXFxuKyAqIGRlc2NyaWJlZCBpbiB0aGUgY292ZXIgbGV0dGVyLlxcbisgKlxcbisgKiBSZXF1aXJlcyByb290LCBjZ3JvdXAgdjIgYW5kIGEgZGV2aWNlIHdpdGggaW9jb3N0IHN1cHBvcnQuICBUaGVcXG4rICogZGV2aWNlIG11c3QgYmUgZ2l2ZW4gYXMgbWFqb3I6bWlub3IgaW4gJElPQ09TVF9URVNUX0RFViwgb3RoZXJ3aXNlXFxuKyAqIHRoZSB0ZXN0IGlzIHNraXBwZWQuXFxuKyAqL1xcbit2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBpb2Nvc3RfbW9kZWwgKnNrZWw7XFxuK1xcdGNoYXIgd29yZFsyNTZdLCAqZGV2O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZGV2ID0gZ2V0ZW52KFxcXCJJT0NPU1RfVEVTVF9ERVZcXFwiKTtcXG4rXFx0aWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcXFwiaW9jb3N0X21vdW50ZWRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LyogbmVnYXRpdmU6IGN0cmw9YnBmIG11c3QgYmUgcmVqZWN0ZWQgd2hpbGUgbm8gbW9kZWwgaXNcXG4rXFx0ICogcmVnaXN0ZXJlZCwgc28gYSB0eXBvIGNhbm5vdCBzaWxlbnRseSBkaXNhYmxlIGNvc3QgbW9kZWxcXG4rXFx0ICogdXBkYXRlcyAqL1xcbitcXHRpZiAoc3NjYW5mKGRldiwgXFxcIiUyNTVzXFxcIiwgd29yZCkgIT0gMSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR7XFxuK1xcdFxcdGNoYXIgcGF0aFtdID0gXFxcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWxcXFwiO1xcbitcXHRcXHRjaGFyIGJ1ZlszMDBdO1xcbitcXHRcXHRGSUxFICpmcCA9IGZvcGVuKHBhdGgsIFxcXCJ3XFxcIik7XFxuK1xcbitcXHRcXHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcXFwiJXMgY3RybD1icGZcXFxcblxcXCIsIHdvcmQpO1xcbitcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRpZiAoZnApIHtcXG4rXFx0XFx0XFx0ZXJyID0gZnByaW50ZihmcCwgXFxcIiVzXFxcIiwgYnVmKSBcXHUwMDNjPSAwO1xcbitcXHRcXHRcXHRmY2xvc2UoZnApO1xcbitcXHRcXHR9XFxuK1xcdFxcdEFTU0VSVF9UUlVFKGVyciwgXFxcImN0cmxfYnBmX3dpdGhvdXRfbW9kZWxfcmVqZWN0ZWRcXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0c2tlbCA9IGlvY29zdF9tb2RlbF9fb3Blbl9hbmRfbG9hZCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWxfb3Blbl9sb2FkXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdC8qIGF0dGFjaGluZyB0aGUgc3RydWN0X29wcyByZWdpc3RlcnMgdGhlIG1vZGVsOyBhIHNlY29uZFxcbitcXHQgKiByZWdpc3RyYXRpb24gb2YgdGhlIHNhbWUgb3BzIHdvdWxkIGZhaWwgd2l0aCBFQlVTWSAqL1xcbitcXHRlcnIgPSBpb2Nvc3RfbW9kZWxfX2F0dGFjaChza2VsKTtcXG4rXFx0aWYgKEFTU0VSVF9PSyhlcnIsIFxcXCJhdHRhY2hcXFwiKSlcXG4rXFx0XFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXFxcInN3aXRjaF9hbmRfcmVhZGJhY2tcXFwiKTtcXG4rXFxuK1xcdGlvY29zdF9tb2RlbF9fZGVzdHJveShza2VsKTtcXG4rfVxcbitcXG4rLypcXG4rICogU2FtZSBjaGVjayBmb3IgdGhlIG11bHRpLXN0cmVhbSBleGFtcGxlIG1vZGVsLiAgT25seSBvbmUgbW9kZWwgY2FuXFxuKyAqIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lLCBzbyB0aGlzIHRlc3QgbXVzdCBydW4gc2VwYXJhdGVseSBmcm9tXFxuKyAqIHRlc3RfaW9jb3N0X21vZGVsOyBib3RoIGFyZSBzZXJpYWwuXFxuKyAqL1xcbit2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbF9zdHJlYW1zKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGlvY29zdF9tcyAqc2tlbDtcXG4rXFx0Y2hhciAqZGV2O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZGV2ID0gZ2V0ZW52KFxcXCJJT0NPU1RfVEVTVF9ERVZcXFwiKTtcXG4rXFx0aWYgKCFkZXYgfHwgZ2V0ZXVpZCgpICE9IDApIHtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcXFwiaW9jb3N0X21vdW50ZWRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0c2tlbCA9IGlvY29zdF9tc19fb3Blbl9hbmRfbG9hZCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWxfb3Blbl9sb2FkXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGVyciA9IGlvY29zdF9tc19fYXR0YWNoKHNrZWwpO1xcbitcXHRpZiAoQVNTRVJUX09LKGVyciwgXFxcImF0dGFjaFxcXCIpKVxcbitcXHRcXHRBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCBcXFwic3dpdGNoX2FuZF9yZWFkYmFja1xcXCIpO1xcbitcXG4rXFx0aW9jb3N0X21zX19kZXN0cm95KHNrZWwpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzBmNzk4N2Y4ZWI2YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21vZGVsLmNcXG5AQCAtMCwwICsxLDkxIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovXFxuKy8qXFxuKyAqIEV4YW1wbGUgaW9jb3N0IGNvc3QgbW9kZWw6IHRoZSBidWlsdGluIGxpbmVhciBIREQgZm9ybXVsYSB3aXRoIGFsbFxcbisgKiBjb3N0cyBkb3VibGVkLlxcbisgKlxcbisgKiBUaGUgY29uc3RhbnRzIG1pcnJvciB3aGF0IGNhbGNfbGNvZWZzKCkgZGVyaXZlcyBmcm9tIHRoZSBBVVRPUF9IRERcXG4rICogZGVmYXVsdHMgKHJicHM9MTc0MDE5MTc2IHJzZXFpb3BzPTQxNzA4IHJyYW5kaW9wcz0zNzAsIHctc2lkZVxcbisgKiBhbmFsb2cpIGluIHZ0aW1lIHVuaXRzIHdoZXJlIDFzID09IDJeMzcsIGV4cHJlc3NlZCB3aXRoIHRoZSBzYW1lXFxuKyAqIHJvdW5kLXVwIGRpdmlzaW9ucyBzbyB0aGV5IGNhbm5vdCBkcmlmdCBmcm9tIHRoZSBrZXJuZWwsIHNvIGFcXG4rICogZGV2aWNlIHN3aXRjaGVkIHRvIGN0cmw9YnBmIHdpdGggdGhpcyBtb2RlbCByZWdpc3RlcmVkIGNoYXJnZXNcXG4rICogZXhhY3RseSB0d2ljZSB0aGUgYnVpbHRpbiBtb2RlbCB1bmRlciB0aGUgc2FtZSB3b3JrbG9hZCwgd2hpY2hcXG4rICogbWFrZXMgaXQgYSBjb252ZW5pZW50IHdheSB0byB2ZXJpZnkgdGhhdCBhY2NvdW50aW5nIGdvZXMgdGhyb3VnaFxcbisgKiB0aGUgQlBGIHBhdGguXFxuKyAqL1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rXFxuKy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXFxuKyNkZWZpbmUgSU9DX1BBR0VfU0laRVxcdFxcdDQwOTZcXG4rI2RlZmluZSBJT0NfU0VDVF9UT19QQUdFX1NISUZUXFx0M1xcdC8qIDUxMkIgc2VjdG9ycyB0byA0a0IgcGFnZXMgKi9cXG4rI2RlZmluZSBMQ09FRl9SQU5ESU9fUEFHRVNcXHQ0MDk2XFx0LyogMTZNQiBzZWVrIHRocmVzaG9sZCAqL1xcbisjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKVxcdC8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi9cXG4rXFxuKy8qIERJVjY0X1U2NF9ST1VORF9VUCAvIERJVl9ST1VORF9VUF9VTEwgZXF1aXZhbGVudHMsIGZvbGRlZCBhdFxcbisgKiBjb21waWxlIHRpbWUgKi9cXG4rI2RlZmluZSBSVSh4LCB5KVxcdFxcdCgoeCkgLyAoeSkgKyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXFxuK1xcbisjZGVmaW5lIFJCUFNcXHQxNzQwMTkxNzZVTExcXG4rI2RlZmluZSBSU0VRSU9QU1xcdDQxNzA4VUxMXFxuKyNkZWZpbmUgUlJBTkRJT1BTXFx0MzcwVUxMXFxuKyNkZWZpbmUgV0JQU1xcdDE3ODA3NTg2NlVMTFxcbisjZGVmaW5lIFdTRVFJT1BTXFx0NDI3MDVVTExcXG4rI2RlZmluZSBXUkFORElPUFNcXHQzNzhVTExcXG4rXFxuKyNkZWZpbmUgUlBBR0VcXHQoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKVxcbisjZGVmaW5lIFJTRVFJT1xcdChSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSlcXG4rI2RlZmluZSBSUkFORElPXFx0KFJVKFZUSU1FX1BFUl9TRUMsIFJSQU5ESU9QUykgLSBSUEFHRSlcXG4rI2RlZmluZSBXUEFHRVxcdChSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpXFxuKyNkZWZpbmUgV1NFUUlPXFx0KFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKVxcbisjZGVmaW5lIFdSQU5ESU9cXHQoUlUoVlRJTUVfUEVSX1NFQywgV1JBTkRJT1BTKSAtIFdQQUdFKVxcbitcXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB1NjQgYnVpbHRpbl9jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcXG4rXFx0XFx0XFx0XFx0XFx0dTY0IGN1cnNvciwgdTY0IGZsYWdzKVxcbit7XFxuK1xcdHU2NCBwYWdlcywgc2Vla19wYWdlcyA9IDAsIGJhc2UsIGNvZWZfcGFnZTtcXG4rXFxuK1xcdGlmICghbmJ5dGVzKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHN3aXRjaCAob3ApIHtcXG4rXFx0Y2FzZSBSRVFfT1BfUkVBRDpcXG4rXFx0XFx0YmFzZSA9IFJTRVFJTztcXG4rXFx0XFx0Y29lZl9wYWdlID0gUlBBR0U7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIFJFUV9PUF9XUklURTpcXG4rXFx0XFx0YmFzZSA9IFdTRVFJTztcXG4rXFx0XFx0Y29lZl9wYWdlID0gV1BBR0U7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGN1cnNvcikge1xcbitcXHRcXHRzZWVrX3BhZ2VzID0gc2VjdG9yIFxcdTAwM2UgY3Vyc29yID8gc2VjdG9yIC0gY3Vyc29yXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgOiBjdXJzb3IgLSBzZWN0b3I7XFxuK1xcdFxcdHNlZWtfcGFnZXMgXFx1MDAzZVxcdTAwM2U9IElPQ19TRUNUX1RPX1BBR0VfU0hJRlQ7XFxuK1xcdFxcdGlmIChzZWVrX3BhZ2VzIFxcdTAwM2UgTENPRUZfUkFORElPX1BBR0VTKVxcbitcXHRcXHRcXHRiYXNlID0gKG9wID09IFJFUV9PUF9SRUFEKSA/IFJSQU5ESU8gOiBXUkFORElPO1xcbitcXHR9XFxuK1xcbitcXHRwYWdlcyA9IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSk7XFxuK1xcdGlmIChmbGFncyBcXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpXFxuK1xcdFxcdGJhc2UgPSAwO1xcbitcXHRyZXR1cm4gYmFzZSArIHBhZ2VzICogY29lZl9wYWdlO1xcbit9XFxuK1xcbitTRUMoXFxcInN0cnVjdF9vcHNcXFwiKVxcbit1NjQgQlBGX1BST0coaW9jb3N0XzJ4X2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxcbitcXHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXFxuK3tcXG4rXFx0cmV0dXJuIDIgKiBidWlsdGluX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGZsYWdzKTtcXG4rfVxcbitcXG4rU0VDKFxcXCIuc3RydWN0X29wc1xcXCIpXFxuK3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIGlvY29zdF8yeCA9IHtcXG4rXFx0LmNhbGNfY29zdCA9ICh2b2lkICopaW9jb3N0XzJ4X2NhbGNfY29zdCxcXG4rfTtcXG4rXFxuK2NoYXIgTElDRU5TRVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbXMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbXMuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDY1ZmQ1ZDVjNjJlMFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvaW9jb3N0X21zLmNcXG5AQCAtMCwwICsxLDEyMiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xcbisvKlxcbisgKiBFeGFtcGxlIG11bHRpLXN0cmVhbSBzZXF1ZW50aWFsaXR5IGRldGVjdGlvbiBjb3N0IG1vZGVsLlxcbisgKlxcbisgKiBUaGUgYnVpbHRpbiBtb2RlbCBrZWVwcyBhIHNpbmdsZSBjdXJzb3IgcGVyIGNncm91cCwgc28gdHdvXFxuKyAqIGludGVybGVhdmVkIHNlcXVlbnRpYWwgcmVhZGVycyBpbiBvbmUgY2dyb3VwIGFyZSBhbGwgcHJpY2VkIHJhbmRvbVxcbisgKiAobWVhc3VyZWQgODl4IG92ZXJjaGFyZ2UsIDEyLjl4IHRocm91Z2hwdXQgY29sbGFwc2UpLCB3aGlsZSByYW5kb21cXG4rICogSU8gaW5zaWRlIGEgaG90IHdpbmRvdyBzbWFsbGVyIHRoYW4gdGhlIDE2TUIgc2VlayB0aHJlc2hvbGQgaXNcXG4rICogcHJpY2VkIHNlcXVlbnRpYWwgKG1lYXN1cmVkIDEwN3ggdW5kZXJjaGFyZ2UpLiAgVGhpcyBtb2RlbCByZXBsYWNlc1xcbisgKiB0aGUgc2luZ2xlIGN1cnNvciB3aXRoIGEgcGVyLWNncm91cCB0YWJsZSBvZiBzdHJlYW0gc2xvdHMsIGtleWVkIGJ5XFxuKyAqIHRoZSBpb2NnX2lkIGFyZ3VtZW50OiBhbiBJTyBpcyBzZXF1ZW50aWFsIGlmZiBpdHMgc2VjdG9yIG1hdGNoZXMgdGhlXFxuKyAqIGV4cGVjdGVkIG5leHQgc2VjdG9yIG9mIGFueSB0cmFja2VkIHN0cmVhbS4gIEludGVybGVhdmVkIHN0cmVhbXNcXG4rICoga2VlcCB0aGVpciBvd24gc2xvdHMsIGFuZCB3aW5kb3dlZCByYW5kb20gSU8gcmFyZWx5IG1hdGNoZXMgYVxcbisgKiBtb3ZpbmcgZXhwZWN0YXRpb24uXFxuKyAqL1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rXFxuKy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXFxuKyNkZWZpbmUgSU9DX1BBR0VfU0laRVxcdFxcdDQwOTZcXG4rI2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFXFx0KDFVTEwgXFx1MDAzY1xcdTAwM2MgMClcXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXFxuK1xcbisvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcXG4rICogY29tcGlsZSB0aW1lICovXFxuKyNkZWZpbmUgUlUoeCwgeSlcXHRcXHQoKHgpIC8gKHkpICsgKCgoeCkgJSAoeSkpID8gMSA6IDApKVxcbitcXG4rI2RlZmluZSBSQlBTXFx0MTc0MDE5MTc2VUxMXFxuKyNkZWZpbmUgUlNFUUlPUFNcXHQ0MTcwOFVMTFxcbisjZGVmaW5lIFJSQU5ESU9QU1xcdDM3MFVMTFxcbisjZGVmaW5lIFdCUFNcXHQxNzgwNzU4NjZVTExcXG4rI2RlZmluZSBXU0VRSU9QU1xcdDQyNzA1VUxMXFxuKyNkZWZpbmUgV1JBTkRJT1BTXFx0Mzc4VUxMXFxuK1xcbisjZGVmaW5lIFJQQUdFXFx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFJCUFMsIElPQ19QQUdFX1NJWkUpKSlcXG4rI2RlZmluZSBSU0VRSU9cXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXFxuKyNkZWZpbmUgUlJBTkRJT1xcdChSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpXFxuKyNkZWZpbmUgV1BBR0VcXHQoUlUoVlRJTUVfUEVSX1NFQywgUlUoV0JQUywgSU9DX1BBR0VfU0laRSkpKVxcbisjZGVmaW5lIFdTRVFJT1xcdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcXG4rI2RlZmluZSBXUkFORElPXFx0KFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSlcXG4rXFxuKyNkZWZpbmUgTlNMT1RTXFx0NFxcbitcXG4rc3RydWN0IHN0cmVhbXMge1xcbitcXHRfX3U2NCBleHBlY3RlZFtOU0xPVFNdO1xcdC8qIG5leHQgZXhwZWN0ZWQgc2VjdG9yLCBwZXIgc3RyZWFtICovXFxuK1xcdF9fdTY0IHN0YW1wW05TTE9UU107XFx0LyogTFJVIHN0YW1wLCAwID0gZW1wdHkgKi9cXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTY0KTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgc3RyZWFtcyk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgNjQpO1xcbit9IHN0cmVhbV90YWIgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rU0VDKFxcXCJzdHJ1Y3Rfb3BzXFxcIilcXG4rdTY0IEJQRl9QUk9HKGlvY29zdF9tc19jYWxjX2Nvc3QsIHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcXG4rXFx0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxcbit7XFxuK1xcdHN0cnVjdCBzdHJlYW1zICpzO1xcbitcXHR1NjQgcGFnZSwgc2VxaW8sIHJhbmRpbywgYmFzZSwgYWR2YW5jZSwgbm93O1xcbitcXHR1MzIgaSwgdmljdGltID0gMCwgZm91bmQgPSAweEZGRkZGRkZGO1xcbitcXG4rXFx0aWYgKG9wICE9IFJFUV9PUF9SRUFEIFxcdTAwMjZcXHUwMDI2IG9wICE9IFJFUV9PUF9XUklURSlcXG4rXFx0XFx0cmV0dXJuIDA7XFx0LyogZGVsZWdhdGUgdGhlIHJlc3QgdG8gYnVpbHRpbiAqL1xcbitcXHRpZiAoIW5ieXRlcylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpZiAob3AgPT0gUkVRX09QX1JFQUQpIHtcXG4rXFx0XFx0cGFnZSA9IFJQQUdFOyBzZXFpbyA9IFJTRVFJTzsgcmFuZGlvID0gUlJBTkRJTztcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0cGFnZSA9IFdQQUdFOyBzZXFpbyA9IFdTRVFJTzsgcmFuZGlvID0gV1JBTkRJTztcXG4rXFx0fVxcbitcXHRhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpO1xcdC8qIHNlY3RvcnMgKi9cXG4rXFxuK1xcdHMgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZzdHJlYW1fdGFiLCBcXHUwMDI2aW9jZ19pZCk7XFxuK1xcdGlmICghcykge1xcbitcXHRcXHRzdHJ1Y3Qgc3RyZWFtcyB6ZXJvID0ge307XFxuK1xcbitcXHRcXHRicGZfbWFwX3VwZGF0ZV9lbGVtKFxcdTAwMjZzdHJlYW1fdGFiLCBcXHUwMDI2aW9jZ19pZCwgXFx1MDAyNnplcm8sXFxuK1xcdFxcdFxcdFxcdCAgICBCUEZfTk9FWElTVCk7XFxuK1xcdFxcdHMgPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZzdHJlYW1fdGFiLCBcXHUwMDI2aW9jZ19pZCk7XFxuK1xcdFxcdGlmICghcylcXG4rXFx0XFx0XFx0cmV0dXJuIHNlcWlvICsgUlUobmJ5dGVzLCBJT0NfUEFHRV9TSVpFKSAqIHBhZ2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChmbGFncyBcXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpIHtcXG4rXFx0XFx0YmFzZSA9IDA7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRub3cgPSBicGZfa3RpbWVfZ2V0X25zKCk7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOU0xPVFM7IGkrKykge1xcbitcXHRcXHRpZiAocy1cXHUwMDNlZXhwZWN0ZWRbaV0gPT0gc2VjdG9yIFxcdTAwMjZcXHUwMDI2IHMtXFx1MDAzZXN0YW1wW2ldKSB7XFxuK1xcdFxcdFxcdGZvdW5kID0gaTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRpZiAoZm91bmQgIT0gMHhGRkZGRkZGRikge1xcbitcXHRcXHRiYXNlID0gc2VxaW87XFxuK1xcdFxcdHMtXFx1MDAzZWV4cGVjdGVkW2ZvdW5kXSA9IHNlY3RvciArIGFkdmFuY2U7XFxuK1xcdFxcdHMtXFx1MDAzZXN0YW1wW2ZvdW5kXSA9IG5vdztcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0YmFzZSA9IHJhbmRpbztcXG4rXFx0XFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIE5TTE9UUzsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmIChzLVxcdTAwM2VzdGFtcFtpXSBcXHUwMDNjIHMtXFx1MDAzZXN0YW1wW3ZpY3RpbV0pXFxuK1xcdFxcdFxcdFxcdHZpY3RpbSA9IGk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0cy1cXHUwMDNlZXhwZWN0ZWRbdmljdGltXSA9IHNlY3RvciArIGFkdmFuY2U7XFxuK1xcdFxcdHMtXFx1MDAzZXN0YW1wW3ZpY3RpbV0gPSBub3c7XFxuK1xcdH1cXG4rb3V0OlxcbitcXHRyZXR1cm4gYmFzZSArIFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlO1xcbit9XFxuK1xcbitTRUMoXFxcIi5zdHJ1Y3Rfb3BzXFxcIilcXG4rc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgaW9jb3N0X21zID0ge1xcbitcXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LFxcbit9O1xcbitcXG4rY2hhciBMSUNFTlNFW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzU6NDQuMzY0NDc2MTE4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyNDM5MjM3MTMyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCTEtfQ0dST1VQX0lPQ09TVF9CUEZcIixcbiAgICBcIkJMS19DR1JPVVBfSU9DT1NUXCIsXG4gICAgXCJCTEtfQ0dST1VQXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiQlBGX0pJVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImlvY29zdF9icGZfY2FsY19jb3N0XCIsXG4gICAgXCJicGZfaW9jb3N0X3JlZ1wiLFxuICAgIFwiYnBmX2lvY29zdF91bnJlZ1wiLFxuICAgIFwiaW9jX2Nvc3RfbW9kZWxfd3JpdGVcIixcbiAgICBcImlvY19jb3N0X21vZGVsX3ByZmlsbFwiLFxuICAgIFwiY2FsY192dGltZV9jb3N0XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0X29wcyBzdXBwb3J0IGZvciBwbHVnZ2FibGUgY29zdCBtb2RlbHMgaW4gdGhlIGJsb2NrIGlvY29zdCBjZ3JvdXAgY29udHJvbGxlciAoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRikuIEl0IGFkZHMgc3RydWN0X29wcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBpbnRlZ3JhdGVzIGR5bmFtaWMgQlBGIGNvc3QgY2FsY3VsYXRpb24gaW50byB0aGUgYmlvIHN1Ym1pc3Npb24gcGF0aCwgYW5kIGV4dGVuZHMgdGhlIGNncm91cCBpby5jb3N0Lm1vZGVsIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLiBUaGUgY29kZSBpcyBmdWxseSByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBjZ3JvdXBzIGFuZCB0aGUgQlBGIHN1YnN5c3RlbS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBTZXAgOCAxMTozNTo0MyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuaW5kZXggOGQyNjAzNzUxYzUxYS4uNTRiMDU3NGNlNTg2YyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0XG5AQCAtMjExNSwxMCArMjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXNcbiBcdGFyZSBkZWZpbmVkLlxuIFxuIFx0ICA9PT09PVx0XHQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLVx0ICBjdHJsXHRcdFwiYXV0b1wiIG9yIFwidXNlclwiXG4rXHQgIGN0cmxcdFx0XCJhdXRvXCIsIFwidXNlclwiIG9yIFwiYnBmXCJcbiBcdCAgbW9kZWxcdFx0VGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gXCJsaW5lYXJcIlxuIFx0ICA9PT09PVx0XHQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFxuK1x0V2hlbiBcImN0cmxcIiBpcyBcImJwZlwiIChvbmx5IGF2YWlsYWJsZSB3aGVuXG4rXHRDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGIGlzIGVuYWJsZWQpLCBjb3N0IGNhbGN1bGF0aW9uIGZvclxuK1x0dGhlIGRldmljZSBpcyBkaXNwYXRjaGVkIHRvIHRoZSBCUEYgcHJvZ3JhbSByZWdpc3RlcmVkIGFnYWluc3RcbitcdHRoZSBpb2Nvc3RfbW9kZWxfb3BzIHN0cnVjdF9vcHMuICBXcml0aW5nIFwiYnBmXCIgZmFpbHMgd2l0aCAtRUlOVkFMXG4rXHR1bnRpbCBzdWNoIGEgcHJvZ3JhbSBpcyByZWdpc3RlcmVkLCBhbmQgYXQgbW9zdCBvbmUgcHJvZ3JhbSBjYW5cbitcdGJlIHJlZ2lzdGVyZWQgc3lzdGVtLXdpZGUuICBUaGUgbW9kZWwgaXMgY2FsbGVkIHdpdGggc2NhbGFyXG4rXHRhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlXG4rXHRpc3N1aW5nIGNncm91cCwgZmxhZ3M7IHNlZSBpbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBmb3IgdGhlaXJcbitcdG1lYW5pbmcpIGFuZCByZXR1cm5zIGEgY29zdCBpbiB2dGltZSB1bml0cywgY2xhbXBlZCBieSB0aGUga2VybmVsXG4rXHR0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlc1xuK1x0dGhlIElPIGJhY2sgdG8gdGhlIGJ1aWx0aW4gbGluZWFyIGZvcm11bGEsIHNvIGEgbW9kZWwgd2hpY2ggb25seVxuK1x0aGFuZGxlcyBzb21lIElPIHR5cGVzIGNhbm5vdCBtYWtlIHRoZSByZXN0IGZyZWUuICBEZXZpY2VzIHdoaWNoXG4rXHRkb24ndCBvcHQgaW4ga2VlcCB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwgdW5jaGFuZ2VkLlxuK1xuIFx0V2hlbiBcImN0cmxcIiBpcyBcImF1dG9cIiwgdGhlIGtlcm5lbCBtYXkgY2hhbmdlIGFsbCBwYXJhbWV0ZXJzXG4gXHRkeW5hbWljYWxseS4gIFdoZW4gXCJjdHJsXCIgaXMgc2V0IHRvIFwidXNlclwiIG9yIGFueSBvdGhlclxuIFx0cGFyYW1ldGVycyBhcmUgd3JpdHRlbiB0bywgXCJjdHJsXCIgYmVjb21lIFwidXNlclwiIGFuZCB0aGVcbmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZ1xuaW5kZXggNzBlNGE2NmQ5NDFmZi4uYmY0M2JlMjFlMDBiYiAxMDA2NDRcbi0tLSBhL2Jsb2NrL0tjb25maWdcbisrKyBiL2Jsb2NrL0tjb25maWdcbkBAIC0yMzEsNCArMjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OXG4gXG4gc291cmNlIFwiYmxvY2svS2NvbmZpZy5pb3NjaGVkXCJcbiBcbitjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRib29sIFwiRW5hYmxlIEJQRiBwbHVnZ2FibGUgY29zdCBtb2RlbCBzdXBwb3J0IGZvciB0aGUgY29zdCBJTyBjb250cm9sbGVyXCJcbitcdGRlcGVuZHMgb24gQkxLX0NHUk9VUF9JT0NPU1QgXHUwMDI2XHUwMDI2IEJQRl9TWVNDQUxMIFx1MDAyNlx1MDAyNiBCUEZfSklUXG4rXHRoZWxwXG4rXHQgRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVnaXN0ZXJzIHRoZSBcImlvY29zdF9tb2RlbF9vcHNcIiBCUEZcbitcdCBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlXG4rXHQgYnVpbHRpbiBsaW5lYXIgY29zdCBtb2RlbCBvbiBkZXZpY2VzIGNvbmZpZ3VyZWQgd2l0aFxuK1x0IFwiY3RybD1icGZcIiB0aHJvdWdoIGlvLmNvc3QubW9kZWwuXG4rXG4gZW5kaWYgIyBCTE9DS1xuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLmVlNWNlYmVlYTAwNmYgMTAwNjQ0XG4tLS0gYS9ibG9jay9NYWtlZmlsZVxuKysrIGIvYmxvY2svTWFrZWZpbGVcbkBAIC0zOSwzICszOSw0IEBAIG9iai0kKENPTkZJR19CTEtfSU5MSU5FX0VOQ1JZUFRJT04pXHQrPSBibGstY3J5cHRvLm8gYmxrLWNyeXB0by1wcm9maWxlLm8gXFxcbiBcdFx0XHRcdFx0ICAgYmxrLWNyeXB0by1zeXNmcy5vXG4gb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSylcdCs9IGJsay1jcnlwdG8tZmFsbGJhY2sub1xuIG9iai0kKENPTkZJR19CTE9DS19IT0xERVJfREVQUkVDQVRFRClcdCs9IGhvbGRlci5vXG4rb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRilcdCs9IGJsay1pb2Nvc3QtYnBmLm9cbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LWJwZi5jIGIvYmxvY2svYmxrLWlvY29zdC1icGYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjBjMzRmNTZkZWQ3MWRcbi0tLSAvZGV2L251bGxcbisrKyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmNcbkBAIC0wLDAgKzEsMTUyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuK1xuKy8qXG4rICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy5cbisgKlxuKyAqIFJlZ2lzdGVycyB0aGUgXCJpb2Nvc3RfbW9kZWxfb3BzXCIgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWxcbisgKiBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBhIHRpbWU7IGRldmljZXMgb3B0IGluIHBlci1xdWV1ZSB3aXRoXG4rICogXCJlY2hvICRERVYgY3RybD1icGYgXHUwMDNlIGlvLmNvc3QubW9kZWxcIi4gIERldmljZXMgd2l0aG91dCBhIHJlZ2lzdGVyZWRcbisgKiBtb2RlbCBrZWVwIHVzaW5nIHRoZSBidWlsdGluIGxpbmVhciBtb2RlbC5cbisgKi9cbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGZfdmVyaWZpZXIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXHUwMDNlXG4rXG4rLyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJ3MgY2hhcmdlYWJsZSBjb3N0ICovXG4rI2RlZmluZSBJT0NPU1RfQlBGX01BWF9DT1NUXHQoMVVMTCBcdTAwM2NcdTAwM2MgMzcpXG4rXG4rc3RhdGljIHN0cnVjdCBicGZfc3RydWN0X29wcyBicGZfaW9jb3N0X21vZGVsX29wcztcbitcbitzdGF0aWMgREVGSU5FX01VVEVYKGlvY29zdF9icGZfcmVnX2xvY2spO1xuK3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX3JjdSAqaW9jb3N0X2JwZl9tb2RlbDtcbitzdGF0aWMgREVGSU5FX1NUQVRJQ19LRVlfRkFMU0UoaW9jb3N0X2JwZl9rZXkpO1xuK1xuK2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpXG4re1xuK1x0cmV0dXJuIHN0YXRpY19icmFuY2hfdW5saWtlbHkoXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xuK31cbitcbitib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvcixcbitcdFx0XHQgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApXG4re1xuK1x0Y29uc3Qgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm9wcztcbitcdHU2NCBjb3N0O1xuK1xuK1x0aWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFx1MDAyNmlvY29zdF9icGZfa2V5KSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0b3BzID0gcmN1X2RlcmVmZXJlbmNlKGlvY29zdF9icGZfbW9kZWwpO1xuK1x0aWYgKCFvcHMpIHtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdGNvc3QgPSBvcHMtXHUwMDNlY2FsY19jb3N0KG9wLCBuYnl0ZXMsIHNlY3RvciwgY3Vyc29yLCBpb2NnX2lkLCBmbGFncyk7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdGlmICghY29zdClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0KmNvc3RwID0gbWluKGNvc3QsIElPQ09TVF9CUEZfTUFYX0NPU1QpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9tb2RlbF9pbml0KHN0cnVjdCBidGYgKmJ0Zilcbit7XG4rXHRzMzIgdHlwZV9pZDtcbitcbitcdHR5cGVfaWQgPSBidGZfZmluZF9ieV9uYW1lX2tpbmQoYnRmLCBcImlvY29zdF9tb2RlbF9vcHNcIiwgQlRGX0tJTkRfU1RSVUNUKTtcbitcdGlmICh0eXBlX2lkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIoY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxuK1x0XHRcdFx0ICBjb25zdCBzdHJ1Y3QgYnRmX21lbWJlciAqbWVtYmVyLFxuK1x0XHRcdFx0ICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sIGJwZl9pb2Nvc3RfaXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLFxuK1x0XHRcdFx0ICAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsXG4rXHRcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLFxuK1x0XHRcdFx0ICAgICAgIHN0cnVjdCBicGZfaW5zbl9hY2Nlc3NfYXV4ICppbmZvKVxuK3tcbitcdHJldHVybiBicGZfdHJhY2luZ19idGZfY3R4X2FjY2VzcyhvZmYsIHNpemUsIHR5cGUsIHByb2csIGluZm8pO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvICpcbiticGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCxcbitcdFx0XHQgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZylcbit7XG4rXHRyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0ge1xuK1x0LmdldF9mdW5jX3Byb3RvID0gYnBmX2lvY29zdF9nZXRfZnVuY19wcm90byxcbitcdC5pc192YWxpZF9hY2Nlc3MgPSBicGZfaW9jb3N0X2lzX3ZhbGlkX2FjY2Vzcyxcbit9O1xuK1xuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9yZWcodm9pZCAqa2RhdGEsIHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhO1xuK1xuK1x0aWYgKCFuZXdfb3BzLVx1MDAzZWNhbGNfY29zdClcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRpbnQgcmV0ID0gMDtcbitcbitcdC8qIHRoZSBjYWxsZXIgb25seSBob2xkcyB0aGUgcGVyLW1hcCBsb2NrLCBzbyBzZXJpYWxpemUgaGVyZSAqL1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbitcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkpXG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdGVsc2Uge1xuK1x0XHRzdGF0aWNfYnJhbmNoX2luYyhcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4rXHRcdHJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBuZXdfb3BzKTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGJwZl9pb2Nvc3RfdW5yZWcodm9pZCAqa2RhdGEsIHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRtdXRleF9sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuK1x0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsKSA9PSBrZGF0YSkge1xuK1x0XHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7XG4rXHRcdHN0YXRpY19icmFuY2hfZGVjKFx1MDAyNmlvY29zdF9icGZfa2V5KTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbit9XG4rXG4rc3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbitcdFx0XHRcdCAgICAgdTY0IGN1cnNvciwgdTY0IGlvY2dfaWQsIHU2NCBmbGFncylcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fYnBmX29wc19pb2Nvc3RfbW9kZWxfb3BzID0ge1xuK1x0LmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0ge1xuK1x0LnZlcmlmaWVyX29wcyA9IFx1MDAyNmJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzLFxuK1x0LmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsXG4rXHQuaW5pdF9tZW1iZXIgPSBicGZfaW9jb3N0X2luaXRfbWVtYmVyLFxuK1x0LnJlZyA9IGJwZl9pb2Nvc3RfcmVnLFxuK1x0LnVucmVnID0gYnBmX2lvY29zdF91bnJlZyxcbitcdC5uYW1lID0gXCJpb2Nvc3RfbW9kZWxfb3BzXCIsXG4rXHQuY2ZpX3N0dWJzID0gXHUwMDI2X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsXG4rXHQub3duZXIgPSBUSElTX01PRFVMRSxcbit9O1xuK1xuK3N0YXRpYyBpbnQgX19pbml0IGJwZl9pb2Nvc3RfaW5pdCh2b2lkKVxuK3tcbitcdHJldHVybiByZWdpc3Rlcl9icGZfc3RydWN0X29wcyhcdTAwMjZicGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7XG4rfVxuK2xhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTtcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LmMgYi9ibG9jay9ibGstaW9jb3N0LmNcbmluZGV4IDI3NDViZmZjZDVlZWYuLmE1OGMxNmZjYjI5ZmEgMTAwNjQ0XG4tLS0gYS9ibG9jay9ibGstaW9jb3N0LmNcbisrKyBiL2Jsb2NrL2Jsay1pb2Nvc3QuY1xuQEAgLTE3Nyw2ICsxNzcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3RpbWVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90aW1lNjQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhcnNlci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vbG9jYWwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9sb2NhbDY0LmhcdTAwM2VcbkBAIC00NDUsNiArNDQ2LDcgQEAgc3RydWN0IGlvYyB7XG4gXHRpbnRcdFx0XHRcdGF1dG9wX2lkeDtcbiBcdGJvb2xcdFx0XHRcdHVzZXJfcW9zX3BhcmFtczoxO1xuIFx0Ym9vbFx0XHRcdFx0dXNlcl9jb3N0X21vZGVsOjE7XG4rXHRib29sXHRcdFx0XHRicGZfY29zdF9tb2RlbDtcbiB9O1xuIFxuIHN0cnVjdCBpb2NnX3BjcHVfc3RhdCB7XG5AQCAtMjIzOCw2ICsyMjQwLDcgQEAgc3RhdGljIHZvaWQgaW9jX3RpbWVyX2ZuKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcilcbiBcdHN0cnVjdCBpb2Nfbm93IG5vdztcbiBcdExJU1RfSEVBRChzdXJwbHVzZXMpO1xuIFx0aW50IG5yX2RlYnRvcnMsIG5yX3Nob3J0YWdlcyA9IDAsIG5yX2xhZ2dpbmcgPSAwO1xuK1x0aW50IG5yX2FjdGl2ZSA9IDA7XG4gXHR1NjQgdXNhZ2VfdXNfc3VtID0gMDtcbiBcdHUzMiBwcG1fcnRocjtcbiBcdHUzMiBwcG1fd3RocjtcbkBAIC0yMjc0LDYgKzIyNzcsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHR1NjQgdmRvbmUsIHZ0aW1lLCB1c2FnZV91cztcbiBcdFx0dTMyIGh3X2FjdGl2ZSwgaHdfaW51c2U7XG4gXG4rXHRcdG5yX2FjdGl2ZSsrO1xuK1xuIFx0XHQvKlxuIFx0XHQgKiBDb2xsZWN0IHVudXNlZCBhbmQgd2luZCB2dGltZSBjbG9zZXIgdG8gdm5vdyB0byBwcmV2ZW50XG4gXHRcdCAqIGlvY2dzIGZyb20gYWNjdW11bGF0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGJ1ZGdldC5cbkBAIC0yNDYwLDYgKzI0NjUsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHRpb2NfcmVmcmVzaF92cmF0ZShpb2MsIFx1MDAyNm5vdyk7XG4gXHR9XG4gXG4rXHR0cmFjZV9pb2Nvc3RfaW9jX3RpY2soaW9jLCBucl9hY3RpdmUsIHVzYWdlX3VzX3N1bSk7XG4rXG4gXHRzcGluX3VubG9ja19pcnEoXHUwMDI2aW9jLVx1MDAzZWxvY2spO1xuIH1cbiBcbkBAIC0yNTczLDYgKzI1ODAsMjMgQEAgc3RhdGljIHU2NCBjYWxjX3Z0aW1lX2Nvc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLCBib29sIGlzX21lcmdlKVxuIHtcbiBcdHU2NCBjb3N0O1xuIFxuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRzdHJ1Y3QgaW9jICppb2MgPSBpb2NnLVx1MDAzZWlvYztcbitcbitcdGlmIChSRUFEX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsKSkge1xuK1x0XHR1NjQgYnBmX2Nvc3Q7XG4rXG4rXHRcdGlmIChpb2Nvc3RfYnBmX2NhbGNfY29zdChiaW9fb3AoYmlvKSxcbitcdFx0XHRcdFx0IGJpby1cdTAwM2ViaV9pdGVyLmJpX3NpemUsXG4rXHRcdFx0XHRcdCBiaW8tXHUwMDNlYmlfaXRlci5iaV9zZWN0b3IsXG4rXHRcdFx0XHRcdCBpb2NnLVx1MDAzZWN1cnNvcixcbitcdFx0XHRcdFx0IGlvY2dfdG9fYmxrZyhpb2NnKS1cdTAwM2VibGtjZy1cdTAwM2Vjc3MuaWQsXG4rXHRcdFx0XHRcdCBpc19tZXJnZSA/IElPQ09TVF9DT1NUX0ZfTUVSR0UgOiAwLFxuK1x0XHRcdFx0XHQgXHUwMDI2YnBmX2Nvc3QpKVxuK1x0XHRcdHJldHVybiBicGZfY29zdDtcbitcdH1cbisjZW5kaWZcbitcbiBcdGNhbGNfdnRpbWVfY29zdF9idWlsdGluKGJpbywgaW9jZywgaXNfbWVyZ2UsIFx1MDAyNmNvc3QpO1xuIFx0cmV0dXJuIGNvc3Q7XG4gfVxuQEAgLTM0NDEsNyArMzQ2NSw4IEBAIHN0YXRpYyB1NjQgaW9jX2Nvc3RfbW9kZWxfcHJmaWxsKHN0cnVjdCBzZXFfZmlsZSAqc2YsXG4gXHRzZXFfcHJpbnRmKHNmLCBcIiVzIGN0cmw9JXMgbW9kZWw9bGluZWFyIFwiXG4gXHRcdCAgIFwicmJwcz0lbGx1IHJzZXFpb3BzPSVsbHUgcnJhbmRpb3BzPSVsbHUgXCJcbiBcdFx0ICAgXCJ3YnBzPSVsbHUgd3NlcWlvcHM9JWxsdSB3cmFuZGlvcHM9JWxsdVxcblwiLFxuLVx0XHQgICBkbmFtZSwgaW9jLVx1MDAzZXVzZXJfY29zdF9tb2RlbCA/IFwidXNlclwiIDogXCJhdXRvXCIsXG4rXHRcdCAgIGRuYW1lLCBpb2MtXHUwMDNlYnBmX2Nvc3RfbW9kZWwgPyBcImJwZlwiIDpcbitcdFx0XHQgICBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsID8gXCJ1c2VyXCIgOiBcImF1dG9cIixcbiBcdFx0ICAgdVtJX0xDT0VGX1JCUFNdLCB1W0lfTENPRUZfUlNFUUlPUFNdLCB1W0lfTENPRUZfUlJBTkRJT1BTXSxcbiBcdFx0ICAgdVtJX0xDT0VGX1dCUFNdLCB1W0lfTENPRUZfV1NFUUlPUFNdLCB1W0lfTENPRUZfV1JBTkRJT1BTXSk7XG4gXHRzcGluX3VubG9ja19pcnEoXHUwMDI2aW9jLVx1MDAzZWxvY2spO1xuQEAgLTM0ODEsNyArMzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHR1bnNpZ25lZCBpbnQgbWVtZmxhZ3M7XG4gXHRzdHJ1Y3QgaW9jICppb2M7XG4gXHR1NjQgdVtOUl9JX0xDT0VGU107XG4tXHRib29sIHVzZXI7XG4rXHRib29sIHVzZXIsIGJwZjtcbiBcdGNoYXIgKmJvZHksICpwO1xuIFx0aW50IHJldDtcbiBcbkBAIC0zNTEyLDYgKzM1MzcsNyBAQCBzdGF0aWMgc3NpemVfdCBpb2NfY29zdF9tb2RlbF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmlucHV0LFxuIFx0c3Bpbl9sb2NrX2lycShcdTAwMjZpb2MtXHUwMDNlbG9jayk7XG4gXHRtZW1jcHkodSwgaW9jLVx1MDAzZXBhcmFtcy5pX2xjb2Vmcywgc2l6ZW9mKHUpKTtcbiBcdHVzZXIgPSBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsO1xuK1x0YnBmID0gaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsO1xuIFxuIFx0cmV0ID0gLUVJTlZBTDtcbiBcbkBAIC0zNTI3LDExICszNTUzLDIwIEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHRcdHN3aXRjaCAobWF0Y2hfdG9rZW4ocCwgY29zdF9jdHJsX3Rva2VucywgYXJncykpIHtcbiBcdFx0Y2FzZSBDT1NUX0NUUkw6XG4gXHRcdFx0bWF0Y2hfc3RybGNweShidWYsIFx1MDAyNmFyZ3NbMF0sIHNpemVvZihidWYpKTtcbi1cdFx0XHRpZiAoIXN0cmNtcChidWYsIFwiYXV0b1wiKSlcbitcdFx0XHRpZiAoIXN0cmNtcChidWYsIFwiYXV0b1wiKSkge1xuIFx0XHRcdFx0dXNlciA9IGZhbHNlO1xuLVx0XHRcdGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInVzZXJcIikpXG4rXHRcdFx0XHRicGYgPSBmYWxzZTtcbitcdFx0XHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInVzZXJcIikpIHtcbiBcdFx0XHRcdHVzZXIgPSB0cnVlO1xuLVx0XHRcdGVsc2VcbitcdFx0XHRcdGJwZiA9IGZhbHNlO1xuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRcdFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCJicGZcIikpIHtcbitcdFx0XHRcdGlmICghaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKCkpXG4rXHRcdFx0XHRcdGdvdG8gdW5sb2NrO1xuK1x0XHRcdFx0dXNlciA9IGZhbHNlO1xuK1x0XHRcdFx0YnBmID0gdHJ1ZTtcbisjZW5kaWZcbitcdFx0XHR9IGVsc2VcbiBcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRjYXNlIENPU1RfTU9ERUw6XG5AQCAtMzU1Niw2ICszNTkxLDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCxcbiBcdH0gZWxzZSB7XG4gXHRcdGlvYy1cdTAwM2V1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTtcbiBcdH1cbitcdFdSSVRFX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsLCBicGYpO1xuIFx0aW9jX3JlZnJlc2hfcGFyYW1zKGlvYywgdHJ1ZSk7XG4gXG4gXHRyZXQgPSAwO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0Lmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43MTExYjVjMDNkYzM2XG4tLS0gL2Rldi9udWxsXG4rKysgYi9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaFxuQEAgLTAsMCArMSw1NiBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rI2lmbmRlZiBfTElOVVhfQkxLX0lPQ09TVF9IXG4rI2RlZmluZSBfTElOVVhfQkxLX0lPQ09TVF9IXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuK1xuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXG4rLypcbisgKiBQbHVnZ2FibGUgY29zdCBtb2RlbCBpbnRlcmZhY2UgZm9yIGJsay1pb2Nvc3QuXG4rICpcbisgKiBBIEJQRiBzdHJ1Y3Rfb3BzIGltcGxlbWVudGF0aW9uIHJlZ2lzdGVyZWQgYWdhaW5zdCBcImlvY29zdF9tb2RlbF9vcHNcIlxuKyAqIHJlcGxhY2VzIHRoZSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoXG4rICogXCJjdHJsPWJwZlwiIHRocm91Z2ggaW8uY29zdC5tb2RlbC4gIFRoZSBtb2RlbCBpcyBhIHB1cmUgZnVuY3Rpb24gb2YgdGhlXG4rICogYXJndW1lbnRzIGJlbG93IGFuZCByZXR1cm5zIHRoZSBjb3N0IG9mIHRoZSBJTyBpbiBkZXZpY2UgdGltZSB1bml0cyxcbisgKiB3aGVyZSAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBlcXVhbHMgMl4zNyAoVlRJTUVfUEVSX1NFQykuICBUaGVcbisgKiByZXR1cm5lZCB2YWx1ZSBpcyBjbGFtcGVkIGJ5IHRoZSBrZXJuZWwuICBBIGNvc3Qgb2YgMCBkZWxlZ2F0ZXMgdGhlXG4rICogSU8gYmFjayB0byB0aGUgYnVpbHRpbiBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIGRvZXMgbm90IGhhbmRsZSBhXG4rICogZ2l2ZW4gSU8gdHlwZSBjYW5ub3QgbWFrZSBpdCBmcmVlLlxuKyAqXG4rICogVGhlIGlvY2dfaWQgYXJndW1lbnQgaWRlbnRpZmllcyB0aGUgaXNzdWluZyBjZ3JvdXAgKGNzcyBpZCkgc28gdGhlXG4rICogbW9kZWwgY2FuIGtlZXAgcGVyLWNncm91cCBzdGF0ZSwgZS5nLiBmb3IgbXVsdGktc3RyZWFtIHNlcXVlbnRpYWxpdHlcbisgKiBkZXRlY3Rpb24uICBUaGUgaWQgaXMgb25seSB2YWxpZCB3aGlsZSB0aGUgY2dyb3VwIGV4aXN0czogY3NzIGlkcyBhcmVcbisgKiByZWN5Y2xlZCBvbmNlIHRoZSBjZ3JvdXAgaXMgcmVtb3ZlZCwgc28gbW9kZWxzIG11c3QgdHJlYXQgaXQgYXMgYVxuKyAqIHRyYW5zaWVudCBrZXkgYW5kIHJlc2V0IHN0YXRlIHdoZW4gdGhleSBvYnNlcnZlIGl0IHJldXNlZC4gIFdoZXRoZXJcbisgKiB0aGUgaW50ZXJmYWNlIG5lZWRzIGEgcmVsZWFzZShpb2NnX2lkKSBjYWxsYmFjayBmb3Igc3RhdGUgY2xlYW51cCBpc1xuKyAqIGFuIG9wZW4gcXVlc3Rpb24uXG4rICpcbisgKiBUaGUgbW9kZWwgaXMgY2FsbGVkIGZyb20gdGhlIElPIHN1Ym1pc3Npb24gcGF0aCB1bmRlciBSQ1UgYW5kIG11c3RcbisgKiBub3Qgc2xlZXAuICBPbmx5IHRoZSBiaW8tbGV2ZWwgY2hhcmdpbmcgcGF0aCBjb25zdWx0cyB0aGUgbW9kZWw7XG4rICogdGhlIHJlcXVlc3QtbGV2ZWwgc2l6aW5nIHBhdGggKGNhbGNfc2l6ZV92dGltZV9jb3N0KCkpIGtlZXBzIHVzaW5nXG4rICogdGhlIGJ1aWx0aW4gZm9ybXVsYS5cbisgKi9cbitcbisvKiBmbGFncyBmb3IgY2FsY19jb3N0KCkgKi9cbisjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVx0LyogY2FsbGVkIGZyb20gbWVyZ2UgcGF0aCAqL1xuK1xuK3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIHtcbitcdC8qXG4rXHQgKiBAb3A6XHRcdFJFUV9PUF8qIHZhbHVlICh1YXBpIGJsa19vcGYuaClcbitcdCAqIEBuYnl0ZXM6XHRJTyBzaXplIGluIGJ5dGVzXG4rXHQgKiBAc2VjdG9yOlx0c3RhcnRpbmcgc2VjdG9yXG4rXHQgKiBAY3Vyc29yOlx0aW9jZyBjdXJzb3Igc2VjdG9yLCAwIGlmIG5vbmUgKHNlcXVlbnRpYWxpdHkgaGludClcbitcdCAqIEBpb2NnX2lkOlx0Y3NzIGlkIG9mIHRoZSBpc3N1aW5nIGNncm91cFxuK1x0ICogQGZsYWdzOlx0SU9DT1NUX0NPU1RfRl8qXG4rXHQgKi9cbitcdHU2NCAoKmNhbGNfY29zdCkodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuK1x0XHRcdCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKTtcbit9O1xuK1xuK2Jvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuK1x0XHRcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cCk7XG4rYm9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZCk7XG4rXG4rI2VuZGlmXHQvKiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGICovXG4rI2VuZGlmXHQvKiBfTElOVVhfQkxLX0lPQ09TVF9IICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaFxuaW5kZXggZTc3MmIxYmM2MGQ2MC4uMmI5ZmYzNDhhNGY1MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXG4rKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaFxuQEAgLTE3OCw2ICsxNzgsNDYgQEAgVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY192cmF0ZV9hZGosXG4gXHQpXG4gKTtcbiBcbisvKlxuKyAqIFBlcmlvZGljIHBlci1kZXZpY2Ugc3VtbWFyeSwgZW1pdHRlZCBvbmNlIHBlciBwZXJpb2QgZnJvbSB0aGUgdGFpbCBvZlxuKyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5XG4rICogcGVyaW9kIHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGluY2x1ZGluZyBzdGVhZHkgc3RhdGVzLCBhbmQgY2Fycmllc1xuKyAqIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3RhdGUgc28gYmFzaWMgbW9uaXRvcmluZyBkb2Vzbid0IHJlcXVpcmUgZHJnbi5cbisgKi9cbitUUkFDRV9FVkVOVChpb2Nvc3RfaW9jX3RpY2ssXG4rXG4rXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jICppb2MsIGludCBucl9hY3RpdmUsIHU2NCB1c2FnZV91c19zdW0pLFxuK1xuK1x0VFBfQVJHUyhpb2MsIG5yX2FjdGl2ZSwgdXNhZ2VfdXNfc3VtKSxcbitcbitcdFRQX1NUUlVDVF9fZW50cnkgKFxuK1x0XHRfX3N0cmluZyhkZXZuYW1lLCBpb2NfbmFtZShpb2MpKVxuK1x0XHRfX2ZpZWxkKHUzMiwgcGVyaW9kX3VzKVxuK1x0XHRfX2ZpZWxkKHU2NCwgdnJhdGUpXG4rXHRcdF9fZmllbGQoaW50LCBidXN5X2xldmVsKVxuK1x0XHRfX2ZpZWxkKGludCwgbnJfYWN0aXZlKVxuK1x0XHRfX2ZpZWxkKHUzMiwgdXNhZ2VfcGN0KVxuK1x0XHRfX2ZpZWxkKGludCwgcnVubmluZylcbitcdCksXG4rXG4rXHRUUF9mYXN0X2Fzc2lnbihcbitcdFx0X19hc3NpZ25fc3RyKGRldm5hbWUpO1xuK1x0XHRfX2VudHJ5LVx1MDAzZXBlcmlvZF91cyA9IGlvYy1cdTAwM2VwZXJpb2RfdXM7XG4rXHRcdF9fZW50cnktXHUwMDNldnJhdGUgPSBpb2MtXHUwMDNldnRpbWVfYmFzZV9yYXRlO1xuK1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwgPSBpb2MtXHUwMDNlYnVzeV9sZXZlbDtcbitcdFx0X19lbnRyeS1cdTAwM2Vucl9hY3RpdmUgPSBucl9hY3RpdmU7XG4rXHRcdF9fZW50cnktXHUwMDNldXNhZ2VfcGN0ID0gaW9jLVx1MDAzZXBlcmlvZF91cyA/XG4rXHRcdFx0ZGl2X3U2NCh1c2FnZV91c19zdW0gKiAxMDAsIGlvYy1cdTAwM2VwZXJpb2RfdXMpIDogMDtcbitcdFx0X19lbnRyeS1cdTAwM2VydW5uaW5nID0gaW9jLVx1MDAzZXJ1bm5pbmc7XG4rXHQpLFxuK1xuK1x0VFBfcHJpbnRrKFwiWyVzXSBwZXJpb2Q9JXV1cyB2cmF0ZT0lbGx1IGJ1c3k9JWQgYWN0aXZlPSVkIHVzYWdlPSV1JSUgcnVubmluZz0lZFwiLFxuK1x0XHRfX2dldF9zdHIoZGV2bmFtZSksIF9fZW50cnktXHUwMDNlcGVyaW9kX3VzLCBfX2VudHJ5LVx1MDAzZXZyYXRlLFxuK1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwsIF9fZW50cnktXHUwMDNlbnJfYWN0aXZlLCBfX2VudHJ5LVx1MDAzZXVzYWdlX3BjdCxcbitcdFx0X19lbnRyeS1cdTAwM2VydW5uaW5nXG4rXHQpXG4rKTtcbitcbiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsXG4gXG4gXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCArMSwxNTUgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJpb2Nvc3RfbW9kZWwuc2tlbC5oXCJcbisjaW5jbHVkZSBcImlvY29zdF9tcy5za2VsLmhcIlxuK1xuKy8qXG4rICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZVxuKyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy5cbisgKiBTaGFyZWQgYnkgdGhlIGV4YW1wbGUtbW9kZWwgdGVzdHMgYmVsb3cuXG4rICovXG4rc3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldilcbit7XG4rXHRjaGFyIHBhdGhbXSA9IFwiL3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFwiO1xuK1x0Y2hhciB3b3JkWzI1Nl0sIGxpbmVbMjU2XSwgYnVmWzMwMF07XG4rXHRGSUxFICpmcDtcbitcdGludCBlcnIsIGZvdW5kID0gMDtcbitcbitcdGZwID0gZm9wZW4ocGF0aCwgXCJyK1wiKTtcbitcdGlmICghZnApIHtcbitcdFx0VEhfTE9HKFwib3BlbiAlczogJXNcIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4rXHRcdGlmIChzc2NhbmYobGluZSwgXCIlMjU1c1wiLCB3b3JkKSA9PSAxIFx1MDAyNlx1MDAyNiAhc3RyY21wKHdvcmQsIGRldikpIHtcbitcdFx0XHRmb3VuZCA9IDE7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdH1cbitcdGlmICghZm91bmQpIHtcbitcdFx0VEhfTE9HKFwiJXMgaGFzIG5vIGlvY29zdCBsaW5lXCIsIGRldik7XG4rXHRcdGZjbG9zZShmcCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXMgY3RybD1icGZcIiwgZGV2KTtcbitcdGVyciA9IGZwcmludGYoZnAsIFwiJXNcXG5cIiwgYnVmKTtcbitcdGlmIChlcnIgXHUwMDNjPSAwKSB7XG4rXHRcdFRIX0xPRyhcIndyaXRlIGN0cmw9YnBmIGZhaWxlZFwiKTtcbitcdFx0ZmNsb3NlKGZwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0ZmZsdXNoKGZwKTtcbitcbitcdHJld2luZChmcCk7XG4rXHRmb3VuZCA9IDA7XG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbitcdFx0aWYgKHNzY2FuZihsaW5lLCBcIiUyNTVzXCIsIHdvcmQpID09IDEgXHUwMDI2XHUwMDI2ICFzdHJjbXAod29yZCwgZGV2KSkge1xuK1x0XHRcdGZvdW5kID0gc3Ryc3RyKGxpbmUsIFwiY3RybD1icGZcIikgIT0gTlVMTDtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0fVxuK1x0aWYgKCFmb3VuZClcbitcdFx0VEhfTE9HKFwicmVhZGJhY2sgZG9lcyBub3Qgc2hvdyBjdHJsPWJwZlwiKTtcbitcbitcdGZwcmludGYoZnAsIFwiJXMgY3RybD1hdXRvXFxuXCIsIGRldik7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGZvdW5kID8gMCA6IC0xO1xuK31cbitcbitzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpXG4re1xuK1x0RklMRSAqZnAgPSBmb3BlbihcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QucW9zXCIsIFwiclwiKTtcbitcbitcdGlmIChmcClcbitcdFx0ZmNsb3NlKGZwKTtcbitcdHJldHVybiBmcCAhPSBOVUxMO1xuK31cbitcbisvKlxuKyAqIFJlZ2lzdGVyIHRoZSBleGFtcGxlIGNvc3QgbW9kZWwgYW5kIHN3aXRjaCBhIGRldmljZSB0byBjdHJsPWJwZi5cbisgKiBJTyBhY2NvdW50aW5nIGl0c2VsZiBpcyBub3QgY2hlY2tlZCBoZXJlOyBpdCBuZWVkcyBhIGRldmljZSBkb2luZ1xuKyAqIHJlYWwgSU8gdW5kZXIgaW9jb3N0IGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZSBrZXJuZWwtc2lkZSB2YWxpZGF0aW9uXG4rICogZGVzY3JpYmVkIGluIHRoZSBjb3ZlciBsZXR0ZXIuXG4rICpcbisgKiBSZXF1aXJlcyByb290LCBjZ3JvdXAgdjIgYW5kIGEgZGV2aWNlIHdpdGggaW9jb3N0IHN1cHBvcnQuICBUaGVcbisgKiBkZXZpY2UgbXVzdCBiZSBnaXZlbiBhcyBtYWpvcjptaW5vciBpbiAkSU9DT1NUX1RFU1RfREVWLCBvdGhlcndpc2VcbisgKiB0aGUgdGVzdCBpcyBza2lwcGVkLlxuKyAqL1xuK3ZvaWQgc2VyaWFsX3Rlc3RfaW9jb3N0X21vZGVsKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvY29zdF9tb2RlbCAqc2tlbDtcbitcdGNoYXIgd29yZFsyNTZdLCAqZGV2O1xuK1x0aW50IGVycjtcbitcbitcdGRldiA9IGdldGVudihcIklPQ09TVF9URVNUX0RFVlwiKTtcbitcdGlmICghZGV2IHx8IGdldGV1aWQoKSAhPSAwKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcImlvY29zdF9tb3VudGVkXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBuZWdhdGl2ZTogY3RybD1icGYgbXVzdCBiZSByZWplY3RlZCB3aGlsZSBubyBtb2RlbCBpc1xuK1x0ICogcmVnaXN0ZXJlZCwgc28gYSB0eXBvIGNhbm5vdCBzaWxlbnRseSBkaXNhYmxlIGNvc3QgbW9kZWxcbitcdCAqIHVwZGF0ZXMgKi9cbitcdGlmIChzc2NhbmYoZGV2LCBcIiUyNTVzXCIsIHdvcmQpICE9IDEpXG4rXHRcdHJldHVybjtcbitcdHtcbitcdFx0Y2hhciBwYXRoW10gPSBcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWxcIjtcbitcdFx0Y2hhciBidWZbMzAwXTtcbitcdFx0RklMRSAqZnAgPSBmb3BlbihwYXRoLCBcIndcIik7XG4rXG4rXHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXMgY3RybD1icGZcXG5cIiwgd29yZCk7XG4rXHRcdGVyciA9IDA7XG4rXHRcdGlmIChmcCkge1xuK1x0XHRcdGVyciA9IGZwcmludGYoZnAsIFwiJXNcIiwgYnVmKSBcdTAwM2M9IDA7XG4rXHRcdFx0ZmNsb3NlKGZwKTtcbitcdFx0fVxuK1x0XHRBU1NFUlRfVFJVRShlcnIsIFwiY3RybF9icGZfd2l0aG91dF9tb2RlbF9yZWplY3RlZFwiKTtcbitcdH1cbitcbitcdHNrZWwgPSBpb2Nvc3RfbW9kZWxfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcInNrZWxfb3Blbl9sb2FkXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBhdHRhY2hpbmcgdGhlIHN0cnVjdF9vcHMgcmVnaXN0ZXJzIHRoZSBtb2RlbDsgYSBzZWNvbmRcbitcdCAqIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc2FtZSBvcHMgd291bGQgZmFpbCB3aXRoIEVCVVNZICovXG4rXHRlcnIgPSBpb2Nvc3RfbW9kZWxfX2F0dGFjaChza2VsKTtcbitcdGlmIChBU1NFUlRfT0soZXJyLCBcImF0dGFjaFwiKSlcbitcdFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXCJzd2l0Y2hfYW5kX3JlYWRiYWNrXCIpO1xuK1xuK1x0aW9jb3N0X21vZGVsX19kZXN0cm95KHNrZWwpO1xuK31cbitcbisvKlxuKyAqIFNhbWUgY2hlY2sgZm9yIHRoZSBtdWx0aS1zdHJlYW0gZXhhbXBsZSBtb2RlbC4gIE9ubHkgb25lIG1vZGVsIGNhblxuKyAqIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lLCBzbyB0aGlzIHRlc3QgbXVzdCBydW4gc2VwYXJhdGVseSBmcm9tXG4rICogdGVzdF9pb2Nvc3RfbW9kZWw7IGJvdGggYXJlIHNlcmlhbC5cbisgKi9cbit2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbF9zdHJlYW1zKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvY29zdF9tcyAqc2tlbDtcbitcdGNoYXIgKmRldjtcbitcdGludCBlcnI7XG4rXG4rXHRkZXYgPSBnZXRlbnYoXCJJT0NPU1RfVEVTVF9ERVZcIik7XG4rXHRpZiAoIWRldiB8fCBnZXRldWlkKCkgIT0gMCkge1xuK1x0XHR0ZXN0X19za2lwKCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghQVNTRVJUX1RSVUUoZGV2X2hhc19pb2Nvc3QoKSwgXCJpb2Nvc3RfbW91bnRlZFwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbCA9IGlvY29zdF9tc19fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwic2tlbF9vcGVuX2xvYWRcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IGlvY29zdF9tc19fYXR0YWNoKHNrZWwpO1xuK1x0aWYgKEFTU0VSVF9PSyhlcnIsIFwiYXR0YWNoXCIpKVxuK1x0XHRBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCBcInN3aXRjaF9hbmRfcmVhZGJhY2tcIik7XG4rXG4rXHRpb2Nvc3RfbXNfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCArMSw5MSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbisvKlxuKyAqIEV4YW1wbGUgaW9jb3N0IGNvc3QgbW9kZWw6IHRoZSBidWlsdGluIGxpbmVhciBIREQgZm9ybXVsYSB3aXRoIGFsbFxuKyAqIGNvc3RzIGRvdWJsZWQuXG4rICpcbisgKiBUaGUgY29uc3RhbnRzIG1pcnJvciB3aGF0IGNhbGNfbGNvZWZzKCkgZGVyaXZlcyBmcm9tIHRoZSBBVVRPUF9IRERcbisgKiBkZWZhdWx0cyAocmJwcz0xNzQwMTkxNzYgcnNlcWlvcHM9NDE3MDggcnJhbmRpb3BzPTM3MCwgdy1zaWRlXG4rICogYW5hbG9nKSBpbiB2dGltZSB1bml0cyB3aGVyZSAxcyA9PSAyXjM3LCBleHByZXNzZWQgd2l0aCB0aGUgc2FtZVxuKyAqIHJvdW5kLXVwIGRpdmlzaW9ucyBzbyB0aGV5IGNhbm5vdCBkcmlmdCBmcm9tIHRoZSBrZXJuZWwsIHNvIGFcbisgKiBkZXZpY2Ugc3dpdGNoZWQgdG8gY3RybD1icGYgd2l0aCB0aGlzIG1vZGVsIHJlZ2lzdGVyZWQgY2hhcmdlc1xuKyAqIGV4YWN0bHkgdHdpY2UgdGhlIGJ1aWx0aW4gbW9kZWwgdW5kZXIgdGhlIHNhbWUgd29ya2xvYWQsIHdoaWNoXG4rICogbWFrZXMgaXQgYSBjb252ZW5pZW50IHdheSB0byB2ZXJpZnkgdGhhdCBhY2NvdW50aW5nIGdvZXMgdGhyb3VnaFxuKyAqIHRoZSBCUEYgcGF0aC5cbisgKi9cbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuK1xuKy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXG4rI2RlZmluZSBJT0NfUEFHRV9TSVpFXHRcdDQwOTZcbisjZGVmaW5lIElPQ19TRUNUX1RPX1BBR0VfU0hJRlRcdDNcdC8qIDUxMkIgc2VjdG9ycyB0byA0a0IgcGFnZXMgKi9cbisjZGVmaW5lIExDT0VGX1JBTkRJT19QQUdFU1x0NDA5Nlx0LyogMTZNQiBzZWVrIHRocmVzaG9sZCAqL1xuKyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRVx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXG4rXG4rLyogRElWNjRfVTY0X1JPVU5EX1VQIC8gRElWX1JPVU5EX1VQX1VMTCBlcXVpdmFsZW50cywgZm9sZGVkIGF0XG4rICogY29tcGlsZSB0aW1lICovXG4rI2RlZmluZSBSVSh4LCB5KVx0XHQoKHgpIC8gKHkpICsgKCgoeCkgJSAoeSkpID8gMSA6IDApKVxuK1xuKyNkZWZpbmUgUkJQU1x0MTc0MDE5MTc2VUxMXG4rI2RlZmluZSBSU0VRSU9QU1x0NDE3MDhVTExcbisjZGVmaW5lIFJSQU5ESU9QU1x0MzcwVUxMXG4rI2RlZmluZSBXQlBTXHQxNzgwNzU4NjZVTExcbisjZGVmaW5lIFdTRVFJT1BTXHQ0MjcwNVVMTFxuKyNkZWZpbmUgV1JBTkRJT1BTXHQzNzhVTExcbitcbisjZGVmaW5lIFJQQUdFXHQoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKVxuKyNkZWZpbmUgUlNFUUlPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXG4rI2RlZmluZSBSUkFORElPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlJBTkRJT1BTKSAtIFJQQUdFKVxuKyNkZWZpbmUgV1BBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4rI2RlZmluZSBXU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcbisjZGVmaW5lIFdSQU5ESU9cdChSVShWVElNRV9QRVJfU0VDLCBXUkFORElPUFMpIC0gV1BBR0UpXG4rXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB1NjQgYnVpbHRpbl9jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbitcdFx0XHRcdFx0dTY0IGN1cnNvciwgdTY0IGZsYWdzKVxuK3tcbitcdHU2NCBwYWdlcywgc2Vla19wYWdlcyA9IDAsIGJhc2UsIGNvZWZfcGFnZTtcbitcbitcdGlmICghbmJ5dGVzKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHN3aXRjaCAob3ApIHtcbitcdGNhc2UgUkVRX09QX1JFQUQ6XG4rXHRcdGJhc2UgPSBSU0VRSU87XG4rXHRcdGNvZWZfcGFnZSA9IFJQQUdFO1xuK1x0XHRicmVhaztcbitcdGNhc2UgUkVRX09QX1dSSVRFOlxuK1x0XHRiYXNlID0gV1NFUUlPO1xuK1x0XHRjb2VmX3BhZ2UgPSBXUEFHRTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjdXJzb3IpIHtcbitcdFx0c2Vla19wYWdlcyA9IHNlY3RvciBcdTAwM2UgY3Vyc29yID8gc2VjdG9yIC0gY3Vyc29yXG4rXHRcdFx0XHRcdCAgICAgOiBjdXJzb3IgLSBzZWN0b3I7XG4rXHRcdHNlZWtfcGFnZXMgXHUwMDNlXHUwMDNlPSBJT0NfU0VDVF9UT19QQUdFX1NISUZUO1xuK1x0XHRpZiAoc2Vla19wYWdlcyBcdTAwM2UgTENPRUZfUkFORElPX1BBR0VTKVxuK1x0XHRcdGJhc2UgPSAob3AgPT0gUkVRX09QX1JFQUQpID8gUlJBTkRJTyA6IFdSQU5ESU87XG4rXHR9XG4rXG4rXHRwYWdlcyA9IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSk7XG4rXHRpZiAoZmxhZ3MgXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpXG4rXHRcdGJhc2UgPSAwO1xuK1x0cmV0dXJuIGJhc2UgKyBwYWdlcyAqIGNvZWZfcGFnZTtcbit9XG4rXG4rU0VDKFwic3RydWN0X29wc1wiKVxuK3U2NCBCUEZfUFJPRyhpb2Nvc3RfMnhfY2FsY19jb3N0LCB1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4rXHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXG4re1xuK1x0cmV0dXJuIDIgKiBidWlsdGluX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGZsYWdzKTtcbit9XG4rXG4rU0VDKFwiLnN0cnVjdF9vcHNcIilcbitzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfMnggPSB7XG4rXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfMnhfY2FsY19jb3N0LFxuK307XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDY1ZmQ1ZDVjNjJlMFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jXG5AQCAtMCwwICsxLDEyMiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbisvKlxuKyAqIEV4YW1wbGUgbXVsdGktc3RyZWFtIHNlcXVlbnRpYWxpdHkgZGV0ZWN0aW9uIGNvc3QgbW9kZWwuXG4rICpcbisgKiBUaGUgYnVpbHRpbiBtb2RlbCBrZWVwcyBhIHNpbmdsZSBjdXJzb3IgcGVyIGNncm91cCwgc28gdHdvXG4rICogaW50ZXJsZWF2ZWQgc2VxdWVudGlhbCByZWFkZXJzIGluIG9uZSBjZ3JvdXAgYXJlIGFsbCBwcmljZWQgcmFuZG9tXG4rICogKG1lYXN1cmVkIDg5eCBvdmVyY2hhcmdlLCAxMi45eCB0aHJvdWdocHV0IGNvbGxhcHNlKSwgd2hpbGUgcmFuZG9tXG4rICogSU8gaW5zaWRlIGEgaG90IHdpbmRvdyBzbWFsbGVyIHRoYW4gdGhlIDE2TUIgc2VlayB0aHJlc2hvbGQgaXNcbisgKiBwcmljZWQgc2VxdWVudGlhbCAobWVhc3VyZWQgMTA3eCB1bmRlcmNoYXJnZSkuICBUaGlzIG1vZGVsIHJlcGxhY2VzXG4rICogdGhlIHNpbmdsZSBjdXJzb3Igd2l0aCBhIHBlci1jZ3JvdXAgdGFibGUgb2Ygc3RyZWFtIHNsb3RzLCBrZXllZCBieVxuKyAqIHRoZSBpb2NnX2lkIGFyZ3VtZW50OiBhbiBJTyBpcyBzZXF1ZW50aWFsIGlmZiBpdHMgc2VjdG9yIG1hdGNoZXMgdGhlXG4rICogZXhwZWN0ZWQgbmV4dCBzZWN0b3Igb2YgYW55IHRyYWNrZWQgc3RyZWFtLiAgSW50ZXJsZWF2ZWQgc3RyZWFtc1xuKyAqIGtlZXAgdGhlaXIgb3duIHNsb3RzLCBhbmQgd2luZG93ZWQgcmFuZG9tIElPIHJhcmVseSBtYXRjaGVzIGFcbisgKiBtb3ZpbmcgZXhwZWN0YXRpb24uXG4rICovXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbitcbisvKiBWVElNRV9QRVJfU0VDIGNvbWVzIGZyb20gdm1saW51eC5oIChhIEJURiBlbnVtIGNvbnN0YW50KSAqL1xuKyNkZWZpbmUgSU9DX1BBR0VfU0laRVx0XHQ0MDk2XG4rI2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFXHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcdC8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi9cbitcbisvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcbisgKiBjb21waWxlIHRpbWUgKi9cbisjZGVmaW5lIFJVKHgsIHkpXHRcdCgoeCkgLyAoeSkgKyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXG4rXG4rI2RlZmluZSBSQlBTXHQxNzQwMTkxNzZVTExcbisjZGVmaW5lIFJTRVFJT1BTXHQ0MTcwOFVMTFxuKyNkZWZpbmUgUlJBTkRJT1BTXHQzNzBVTExcbisjZGVmaW5lIFdCUFNcdDE3ODA3NTg2NlVMTFxuKyNkZWZpbmUgV1NFUUlPUFNcdDQyNzA1VUxMXG4rI2RlZmluZSBXUkFORElPUFNcdDM3OFVMTFxuK1xuKyNkZWZpbmUgUlBBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShSQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4rI2RlZmluZSBSU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSlcbisjZGVmaW5lIFJSQU5ESU9cdChSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpXG4rI2RlZmluZSBXUEFHRVx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFdCUFMsIElPQ19QQUdFX1NJWkUpKSlcbisjZGVmaW5lIFdTRVFJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKVxuKyNkZWZpbmUgV1JBTkRJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSlcbitcbisjZGVmaW5lIE5TTE9UU1x0NFxuK1xuK3N0cnVjdCBzdHJlYW1zIHtcbitcdF9fdTY0IGV4cGVjdGVkW05TTE9UU107XHQvKiBuZXh0IGV4cGVjdGVkIHNlY3RvciwgcGVyIHN0cmVhbSAqL1xuK1x0X191NjQgc3RhbXBbTlNMT1RTXTtcdC8qIExSVSBzdGFtcCwgMCA9IGVtcHR5ICovXG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbitcdF9fdHlwZShrZXksIF9fdTY0KTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHN0cmVhbXMpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4rfSBzdHJlYW1fdGFiIFNFQyhcIi5tYXBzXCIpO1xuK1xuK1NFQyhcInN0cnVjdF9vcHNcIilcbit1NjQgQlBGX1BST0coaW9jb3N0X21zX2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxuK1x0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxuK3tcbitcdHN0cnVjdCBzdHJlYW1zICpzO1xuK1x0dTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdztcbitcdHUzMiBpLCB2aWN0aW0gPSAwLCBmb3VuZCA9IDB4RkZGRkZGRkY7XG4rXG4rXHRpZiAob3AgIT0gUkVRX09QX1JFQUQgXHUwMDI2XHUwMDI2IG9wICE9IFJFUV9PUF9XUklURSlcbitcdFx0cmV0dXJuIDA7XHQvKiBkZWxlZ2F0ZSB0aGUgcmVzdCB0byBidWlsdGluICovXG4rXHRpZiAoIW5ieXRlcylcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRpZiAob3AgPT0gUkVRX09QX1JFQUQpIHtcbitcdFx0cGFnZSA9IFJQQUdFOyBzZXFpbyA9IFJTRVFJTzsgcmFuZGlvID0gUlJBTkRJTztcbitcdH0gZWxzZSB7XG4rXHRcdHBhZ2UgPSBXUEFHRTsgc2VxaW8gPSBXU0VRSU87IHJhbmRpbyA9IFdSQU5ESU87XG4rXHR9XG4rXHRhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpO1x0Lyogc2VjdG9ycyAqL1xuK1xuK1x0cyA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2c3RyZWFtX3RhYiwgXHUwMDI2aW9jZ19pZCk7XG4rXHRpZiAoIXMpIHtcbitcdFx0c3RydWN0IHN0cmVhbXMgemVybyA9IHt9O1xuK1xuK1x0XHRicGZfbWFwX3VwZGF0ZV9lbGVtKFx1MDAyNnN0cmVhbV90YWIsIFx1MDAyNmlvY2dfaWQsIFx1MDAyNnplcm8sXG4rXHRcdFx0XHQgICAgQlBGX05PRVhJU1QpO1xuK1x0XHRzID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZzdHJlYW1fdGFiLCBcdTAwMjZpb2NnX2lkKTtcbitcdFx0aWYgKCFzKVxuK1x0XHRcdHJldHVybiBzZXFpbyArIFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlO1xuK1x0fVxuK1xuK1x0aWYgKGZsYWdzIFx1MDAyNiBJT0NPU1RfQ09TVF9GX01FUkdFKSB7XG4rXHRcdGJhc2UgPSAwO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5vdyA9IGJwZl9rdGltZV9nZXRfbnMoKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5TTE9UUzsgaSsrKSB7XG4rXHRcdGlmIChzLVx1MDAzZWV4cGVjdGVkW2ldID09IHNlY3RvciBcdTAwMjZcdTAwMjYgcy1cdTAwM2VzdGFtcFtpXSkge1xuK1x0XHRcdGZvdW5kID0gaTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0fVxuK1x0aWYgKGZvdW5kICE9IDB4RkZGRkZGRkYpIHtcbitcdFx0YmFzZSA9IHNlcWlvO1xuK1x0XHRzLVx1MDAzZWV4cGVjdGVkW2ZvdW5kXSA9IHNlY3RvciArIGFkdmFuY2U7XG4rXHRcdHMtXHUwMDNlc3RhbXBbZm91bmRdID0gbm93O1xuK1x0fSBlbHNlIHtcbitcdFx0YmFzZSA9IHJhbmRpbztcbitcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgTlNMT1RTOyBpKyspIHtcbitcdFx0XHRpZiAocy1cdTAwM2VzdGFtcFtpXSBcdTAwM2Mgcy1cdTAwM2VzdGFtcFt2aWN0aW1dKVxuK1x0XHRcdFx0dmljdGltID0gaTtcbitcdFx0fVxuK1x0XHRzLVx1MDAzZWV4cGVjdGVkW3ZpY3RpbV0gPSBzZWN0b3IgKyBhZHZhbmNlO1xuK1x0XHRzLVx1MDAzZXN0YW1wW3ZpY3RpbV0gPSBub3c7XG4rXHR9XG4rb3V0OlxuK1x0cmV0dXJuIGJhc2UgKyBSVShuYnl0ZXMsIElPQ19QQUdFX1NJWkUpICogcGFnZTtcbit9XG4rXG4rU0VDKFwiLnN0cnVjdF9vcHNcIilcbitzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfbXMgPSB7XG4rXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LFxuK307XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNTo0NC4zNjQ0Nzc2MjhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3NjA5NjUxOTc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIEJQRi1CYXNlZCBJL08gQ29zdCBNb2RlbCBQYXRjaCBTZXJpZXMqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBzZXJpZXMuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBicmVhayBkb3duIHRoZSBjaGFuZ2VzIG1ldGhvZGljYWxseS4gRmlyc3QsIEkgbmVlZCBhIGNsZWFyIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdCdzIGJlaW5nIGludHJvZHVjZWQgYW5kIG1vZGlmaWVkLiBCYXNlZCBvbiB0aGUgcGF0Y2ggc3VtbWFyeSwgaXQgbG9va3MgbGlrZSB0aGlzIGlzIGEgZm9jdXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIEJQRi1iYXNlZCBJL08gY29zdCBtb2RlbCB3aXRoaW4gdGhlIGJsb2NrIGxheWVyLCB3aGljaCBpcyBzb21ldGhpbmcgSSdtIHZlcnkgaW50ZXJlc3RlZCBpbi5cblxuU3BlY2lmaWNhbGx5LCBpdCBsb29rcyBsaWtlOlxuXG4xLiAgQSBuZXcgS2NvbmZpZyBvcHRpb24sIGBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGYCwgaXMgYmVpbmcgYWRkZWQgdG8gZW5hYmxlIHRoZSBmZWF0dXJlLiBHb29kLCBmaW5lLWdyYWluZWQgY29udHJvbCBpcyBhbHdheXMgYXBwcmVjaWF0ZWQuXG4yLiAgV2UgaGF2ZSBgYmxvY2svYmxrLWlvY29zdC1icGYuY2AsIHdoaWNoIGltcGxpZXMgdGhlIGNvcmUgQlBGIGludGVncmF0aW9uLiBUaGF0IGZpbGUgcmVnaXN0ZXJzIGBpb2Nvc3RfbW9kZWxfb3BzYCBhcyBhIEJQRiBgc3RydWN0X29wc2AuIE1ha2VzIHNlbnNlLiBUaGlzIGlzIGhvdyB0aGUgQlBGIGNvZGUgd2lsbCBob29rIGludG8gdGhlIEkvTyBjb3N0IGNhbGN1bGF0aW9uLlxuMy4gIFRoZSBjaGFuZ2VzIGluIGBibG9jay9ibGstaW9jb3N0LmNgIGFyZSB3aGVyZSB0aGUgcnViYmVyIG1lZXRzIHRoZSByb2FkLiBgY2FsY192dGltZV9jb3N0YCBpcyBub3cgdXNpbmcgYGlvY29zdF9icGZfY2FsY19jb3N0YC4gSSdsbCBuZWVkIHRvIHNlZSBob3cgdGhhdCBmdW5jdGlvbiB3b3JrcyBhbmQgaW50ZXJhY3RzIHdpdGggdGhlIEJQRiBwcm9ncmFtLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBpb2NfY29zdF9tb2RlbF9wcmZpbGxgIGFuZCBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgIHRvIGhhbmRsZSBgY3RybD1icGZgIGlzIGNydWNpYWwgZm9yIGNvbmZpZ3VyaW5nIHRoZSBCUEYtYmFzZWQgbW9kZWwgdmlhIGNncm91cHMuIFBsdXMsIGEgbmV3IHRyYWNlcG9pbnQsIGB0cmFjZV9pb2Nvc3RfaW9jX3RpY2tgLCBpcyBhZGRlZCB0byBgaW9jX3RpbWVyX2ZuYC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGRlYnVnZ2luZyBhbmQgdHJhY2luZy5cbjQuICBBZGRpbmcgYSBoZWFkZXIgZmlsZSBgaW5jbHVkZS9saW51eC9ibGstaW9jb3N0LmhgIG1ha2VzIHNlbnNlLCBhcyBhIHJlcG9zaXRvcnkgZm9yIGFueSBuZXcgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMuXG41LiAgQSBuZXcgdHJhY2UgZXZlbnQgZGVmaW5pdGlvbiBpbiBgaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhgLCBpcyBhIHZlcnkgcG9zaXRpdmUgYWRkaXRpb24uIFRyYWNlcG9pbnRzIGFyZSBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMgYW5kIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBCUEYgbG9naWMgaXMgYmVoYXZpbmcuXG42LiAgVGhlIGluY2x1c2lvbiBvZiBzZWxmdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi8uLi5gIGlzIGV4Y2VsbGVudCEgQ29tcHJlaGVuc2l2ZSB0ZXN0aW5nIGlzIG5vbi1uZWdvdGlhYmxlIGZvciBzb21ldGhpbmcgbGlrZSB0aGlzLlxuXG5OZXh0LCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgaXMgYWN0dWFsbHkgKnVzYWJsZSogaW4gdHlwaWNhbCBlbnZpcm9ubWVudHMuIFJlYWNoaW5nIFFFTVUvS1ZNIFZNcywgYXMgd2VsbCBhcyBhIHZhcmlldHkgb2YgY29udGFpbmVyIHN5c3RlbXMsIGlzIGtleS4gVGhhbmtmdWxseSwgdGhlIHRleHQgY29uZmlybXMgdGhhdCB0aGlzIGludGVncmF0ZXMgd2l0aCB0aGUgc3RhbmRhcmQgY2dyb3VwL2Jsb2NrIGxheWVyLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBjZ3JvdXBzIHYyIChgaW8uY29zdC5tb2RlbGApLiBUaGUgdXNlIG9mIEJQRiBzdHJ1Y3Rfb3BzIChgQlBGX01BUF9DUkVBVEVgLCBgQlBGX0xJTktfQ1JFQVRFYCkgaXMgYWxzbyBwcm9taXNpbmcsIHdoaWNoIG1lYW5zIHRoaXMgY291bGQgYmUgYWNjZXNzaWJsZSBpbiBhIHdpZGUgdmFyaWV0eSBvZiBjaXJjdW1zdGFuY2VzLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ2xsIG5lZWQgdG8gdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBjYXJlZnVsbHkgZXhhbWluZSB0aGUgY29kZSwgdW5kZXJzdGFuZCB0aGUgbmV3IHN5bWJvbHMsIGFuZCBmaWd1cmUgb3V0IHRoZSBleGFjdCBLY29uZmlnIGRlcGVuZGVuY2llcy4gSSdtIGtlZW4gdG8gc2VlIHRoZSBkZXRhaWxzIG9mIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBCUEYgcHJvZ3JhbXMuIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiB0aGUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIGFuZCB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcG90ZW50aWFsIGdvdGNoYXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBkYXRhIHN0cnVjdHVyZXMgYW5kIGhvdyB0aGlzIGFmZmVjdHMgdGhlIG92ZXJhbGwgSS9PIHBhdGguXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDMxLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzU6NTEuOTc0MTMyMTcyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MDM5OTk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJMS19DR1JPVVBfSU9DT1NUXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImJsb2NrL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYmxvY2svS2NvbmZpZz0xNDU9Y29uZmlnIEJMS19DR1JPVVBfRkNfQVBQSURcXG4tLVxcbmJsb2NrL0tjb25maWctMTUzLVxcbmJsb2NrL0tjb25maWc6MTU0OmNvbmZpZyBCTEtfQ0dST1VQX0lPQ09TVFxcbmJsb2NrL0tjb25maWctMTU1LVxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXFxcIlxcbi0tXFxuYmxvY2svS2NvbmZpZz0yMzI9c291cmNlIFxcXCJibG9jay9LY29uZmlnLmlvc2NoZWRcXFwiXFxuYmxvY2svS2NvbmZpZy0yMzMtXFxuYmxvY2svS2NvbmZpZzoyMzQ6Y29uZmlnIEJMS19DR1JPVVBfSU9DT1NUX0JQRlxcbmJsb2NrL0tjb25maWctMjM1LVxcdGJvb2wgXFxcIkVuYWJsZSBCUEYgcGx1Z2dhYmxlIGNvc3QgbW9kZWwgc3VwcG9ydCBmb3IgdGhlIGNvc3QgSU8gY29udHJvbGxlclxcXCJcXG5ibG9jay9LY29uZmlnOjIzNjpcXHRkZXBlbmRzIG9uIEJMS19DR1JPVVBfSU9DT1NUIFxcdTAwMjZcXHUwMDI2IEJQRl9TWVNDQUxMIFxcdTAwMjZcXHUwMDI2IEJQRl9KSVRcXG5ibG9jay9LY29uZmlnLTIzNy1cXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDExOjM1OjUyLjAxOTE3NjY4MVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMwNzMxMTY3MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIEkvTyBDb3N0IGFuZCBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBzbyB3ZSdyZSBsb29raW5nIGF0IGBCTEtfQ0dST1VQX0lPQ09TVGAsIGFuZCBteSBpbW1lZGlhdGUgdGhvdWdodCBpcywgbGV0J3Mgbm90IGp1c3QgaXNvbGF0ZSB0aGUgZmVhdHVyZSBpdHNlbGYuIFdlIG5lZWQgdG8gZG8gYSBmdWxsIGRlcGVuZGVuY3kgYXVkaXQgb24gdGhpcy4gSSdtIGFscmVhZHkgbWVudGFsbHkgcnVubmluZyB0aHJvdWdoIHRoZSBrZXJuZWwgaW5mcmFzdHJ1Y3R1cmUg4oCTIHdoYXQgb3RoZXIgY29tcG9uZW50cywgbW9kdWxlcywgb3Igc3Vic3lzdGVtcyBtaWdodCBiZSBpbmRpcmVjdGx5IGFmZmVjdGVkLCBvciBkZXBlbmQgb24gdGhlIGNvcnJlY3Qgb3BlcmF0aW9uIG9mIGBCTEtfQ0dST1VQX0lPQ09TVGA/IFRoaW5raW5nIGFib3V0IHRoaXMsIEkgbmVlZCB0byBjb25zaWRlciB0aGluZ3MgbGlrZSBibG9jayBsYXllciBhY2NvdW50aW5nLCBjZ3JvdXAgaW50ZWdyYXRpb25zLCBhbmQgYW55IHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aCBzY2hlZHVsZXIgaW1wbGVtZW50YXRpb25zLiBJJ20gZ29pbmcgdG8gc3RhcnQgYnkgcnVubmluZyB0aHJvdWdoIHRoZSBpbmNsdWRlIGZpbGVzIGFuZCByZWZlcmVuY2VzIHRvIG1ha2Ugc3VyZSBJIGdldCB0aGUgd2hvbGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ4MTUsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNTo1NS4wOTIyOTUxNTRaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MzE5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJibG9jay9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE1MDpcXHRcXHQgIGNncm91cCBhcHBsaWNhdGlvbnMuIEl0IGVuYWJsZXMgdGhlIEZhYnJpYyBhbmQgdGhlIHN0b3JhZ2UgdGFyZ2V0cyB0b1xcbiAxNTE6XFx0XFx0ICBpZGVudGlmeSwgbW9uaXRvciwgYW5kIGhhbmRsZSBGQyB0cmFmZmljIGJhc2VkIG9uIFZNIHRhZ3MgYnkgaW5zZXJ0aW5nXFxuIDE1MjpcXHRcXHQgIGFwcGxpY2F0aW9uIHNwZWNpZmljIGlkZW50aWZpY2F0aW9uIGludG8gdGhlIEZDIGZyYW1lLlxcbiAxNTM6XFx0XFxuIDE1NDpcXHRjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RcXG4gMTU1OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBzdXBwb3J0IGZvciBjb3N0IG1vZGVsIGJhc2VkIGNncm91cCBJTyBjb250cm9sbGVyXFxcIlxcbiAxNTY6XFx0XFx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQXFxuIDE1NzpcXHRcXHRzZWxlY3QgQkxLX1JRX0FMTE9DX1RJTUVcXG4gMTU4OlxcdFxcdGhlbHBcXG4gMTU5OlxcdFxcdEVuYWJsaW5nIHRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIC53ZWlnaHQgaW50ZXJmYWNlIGZvciBjb3N0XFxuIDE2MDpcXHRcXHRtb2RlbCBiYXNlZCBwcm9wb3J0aW9uYWwgSU8gY29udHJvbC4gIFRoZSBJTyBjb250cm9sbGVyXFxuIDE2MTpcXHRcXHRkaXN0cmlidXRlcyBJTyBjYXBhY2l0eSBiZXR3ZWVuIGRpZmZlcmVudCBncm91cHMgYmFzZWQgb25cXG4gMTYyOlxcdFxcdHRoZWlyIHNoYXJlIG9mIHRoZSBvdmVyYWxsIHdlaWdodCBkaXN0cmlidXRpb24uXFxuIDE2MzpcXHRcXG4gMTY0OlxcdGNvbmZpZyBCTEtfQ0dST1VQX0lPUFJJT1xcbiAxNjU6XFx0XFx0Ym9vbCBcXFwiQ2dyb3VwIEkvTyBjb250cm9sbGVyIGZvciBhc3NpZ25pbmcgYW4gSS9PIHByaW9yaXR5IGNsYXNzXFxcIlxcbiAxNjY6XFx0XFx0ZGVwZW5kcyBvbiBCTEtfQ0dST1VQXFxuIDE2NzpcXHRcXHRoZWxwXFxuIDE2ODpcXHRcXHRFbmFibGUgdGhlIC5wcmlvIGludGVyZmFjZSBmb3IgYXNzaWduaW5nIGFuIEkvTyBwcmlvcml0eSBjbGFzcyB0b1xcbiAxNjk6XFx0XFx0cmVxdWVzdHMuIFRoZSBJL08gcHJpb3JpdHkgY2xhc3MgYWZmZWN0cyB0aGUgb3JkZXIgaW4gd2hpY2ggYW4gSS9PXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDExOjM1OjU1LjA5MjM2MDQxNFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwNTYwNTcwODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBCUEYgSS9PIENvc3QgQW5hbHlzaXMgQ29kZSoqXG5cbk9rYXksIHRpbWUgdG8gZGlnIGludG8gdGhlIGRldGFpbHMuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgYGJsay1pb2Nvc3QtYnBmLmNgIGNvZGUuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBnb2luZyB0byBiZSBmdW5jdGlvbnMgYW5kIHN5bWJvbHMgZGVmaW5lZCB3aXRoaW4gdGhhdCBmaWxlLiBJJ20gdGhpbmtpbmcgSSdsbCBzdGFydCBieSBsaXN0aW5nIG91dCB0aGUgZnVuY3Rpb25zIHRvIGdldCBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgb2YgaG93IHRoZSBjb2RlIGlzIHN0cnVjdHVyZWQsIGFuZCB0aGVuIGRyaWxsIGRvd24gaW50byBhbnkgaW50ZXJlc3Rpbmcgc3ltYm9scywgcGFydGljdWxhcmx5IHRob3NlIHJlbGF0ZWQgdG8gdGhlIGNvc3QgYWNjb3VudGluZyBvciBhbnkgQlBGIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBhcmUgYmVpbmcgbGV2ZXJhZ2VkLiBVbmRlcnN0YW5kaW5nIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgQlBGIHByb2dyYW0gYW5kIHRoZSBicm9hZGVyIGtlcm5lbCBmcmFtZXdvcmsgaXMga2V5IHRvIHRoaXMgYW5hbHlzaXMuIEkgd2FudCB0byBzZWUgaG93IHRoZXkndmUgaW5zdHJ1bWVudGVkIHRoZSBibG9jayBsYXllciBhbmQgd2hpY2ggZXZlbnRzIHRoZXkncmUgdHJhY2tpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MzY5LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNTo1Ny4xNDg0MjA1MDNaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MDY1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJibG9jay9ibGstaW9jb3N0LWJwZi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuICAgMjpcXHQvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xcbiAgIDM6XFx0XFxuICAgNDpcXHQvKlxcbiAgIDU6XFx0ICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy5cXG4gICA2OlxcdCAqXFxuICAgNzpcXHQgKiBSZWdpc3RlcnMgdGhlIFxcXCJpb2Nvc3RfbW9kZWxfb3BzXFxcIiBzdHJ1Y3Rfb3BzIHR5cGUuICBBdCBtb3N0IG9uZSBtb2RlbFxcbiAgIDg6XFx0ICogY2FuIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lOyBkZXZpY2VzIG9wdCBpbiBwZXItcXVldWUgd2l0aFxcbiAgIDk6XFx0ICogXFxcImVjaG8gJERFViBjdHJsPWJwZiBcXHUwMDNlIGlvLmNvc3QubW9kZWxcXFwiLiAgRGV2aWNlcyB3aXRob3V0IGEgcmVnaXN0ZXJlZFxcbiAgMTA6XFx0ICogbW9kZWwga2VlcCB1c2luZyB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwuXFxuICAxMTpcXHQgKi9cXG4gIDEyOlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuICAxMzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuICAxNDpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuICAxNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuICAxNjpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmX3ZlcmlmaWVyLmhcXHUwMDNlXFxuICAxNzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmLmhcXHUwMDNlXFxuICAxODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXFx1MDAzZVxcbiAgMTk6XFx0XFxuICAyMDpcXHQvKiAxcyBvZiBkZXZpY2UgdGltZTsgdXBwZXIgYm91bmQgb24gYSBzaW5nbGUgSU8ncyBjaGFyZ2VhYmxlIGNvc3QgKi9cXG4gIDIxOlxcdCNkZWZpbmUgSU9DT1NUX0JQRl9NQVhfQ09TVFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDM3KVxcbiAgMjI6XFx0XFxuICAyMzpcXHRzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzO1xcbiAgMjQ6XFx0XFxuICAyNTpcXHRzdGF0aWMgREVGSU5FX01VVEVYKGlvY29zdF9icGZfcmVnX2xvY2spO1xcbiAgMjY6XFx0c3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fcmN1ICppb2Nvc3RfYnBmX21vZGVsO1xcbiAgMjc6XFx0c3RhdGljIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGlvY29zdF9icGZfa2V5KTtcXG4gIDI4OlxcdFxcbiAgMjk6XFx0Ym9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZClcXG4gIDMwOlxcdHtcXG4gIDMxOlxcdFxcdHJldHVybiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFxcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XFxuICAzMjpcXHR9XFxuICAzMzpcXHRcXG4gIDM0OlxcdGJvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxcbiAgMzU6XFx0XFx0XFx0XFx0ICB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzLCB1NjQgKmNvc3RwKVxcbiAgMzY6XFx0e1xcbiAgMzc6XFx0XFx0Y29uc3Qgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm9wcztcXG4gIDM4OlxcdFxcdHU2NCBjb3N0O1xcbiAgMzk6XFx0XFxuICA0MDpcXHRcXHRpZiAoIXN0YXRpY19icmFuY2hfdW5saWtlbHkoXFx1MDAyNmlvY29zdF9icGZfa2V5KSlcXG4gIDQxOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gIDQyOlxcdFxcbiAgNDM6XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiAgNDQ6XFx0XFx0b3BzID0gcmN1X2RlcmVmZXJlbmNlKGlvY29zdF9icGZfbW9kZWwpO1xcbiAgNDU6XFx0XFx0aWYgKCFvcHMpIHtcXG4gIDQ2OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiAgNDc6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAgNDg6XFx0XFx0fVxcbiAgNDk6XFx0XFx0Y29zdCA9IG9wcy1cXHUwMDNlY2FsY19jb3N0KG9wLCBuYnl0ZXMsIHNlY3RvciwgY3Vyc29yLCBpb2NnX2lkLCBmbGFncyk7XFxuICA1MDpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gIDUxOlxcdFxcbiAgNTI6XFx0XFx0aWYgKCFjb3N0KVxcbiAgNTM6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAgNTQ6XFx0XFxuICA1NTpcXHRcXHQqY29zdHAgPSBtaW4oY29zdCwgSU9DT1NUX0JQRl9NQVhfQ09TVCk7XFxuICA1NjpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gIDU3OlxcdH1cXG4gIDU4OlxcdFxcbiAgNTk6XFx0c3RhdGljIGludCBicGZfaW9jb3N0X21vZGVsX2luaXQoc3RydWN0IGJ0ZiAqYnRmKVxcbiAgNjA6XFx0e1xcbiAgNjE6XFx0XFx0czMyIHR5cGVfaWQ7XFxuICA2MjpcXHRcXG4gIDYzOlxcdFxcdHR5cGVfaWQgPSBidGZfZmluZF9ieV9uYW1lX2tpbmQoYnRmLCBcXFwiaW9jb3N0X21vZGVsX29wc1xcXCIsIEJURl9LSU5EX1NUUlVDVCk7XFxuICA2NDpcXHRcXHRpZiAodHlwZV9pZCBcXHUwMDNjIDApXFxuICA2NTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gIDY2OlxcdFxcdHJldHVybiAwO1xcbiAgNjc6XFx0fVxcbiAgNjg6XFx0XFxuICA2OTpcXHRzdGF0aWMgaW50IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIoY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbiAgNzA6XFx0XFx0XFx0XFx0XFx0ICBjb25zdCBzdHJ1Y3QgYnRmX21lbWJlciAqbWVtYmVyLFxcbiAgNzE6XFx0XFx0XFx0XFx0XFx0ICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpXFxuICA3MjpcXHR7XFxuICA3MzpcXHRcXHRyZXR1cm4gMDtcXG4gIDc0OlxcdH1cXG4gIDc1OlxcdFxcbiAgNzY6XFx0c3RhdGljIGJvb2wgYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsXFxuICA3NzpcXHRcXHRcXHRcXHRcXHQgICAgICAgZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSxcXG4gIDc4OlxcdFxcdFxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csXFxuICA3OTpcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IGJwZl9pbnNuX2FjY2Vzc19hdXggKmluZm8pXFxuICA4MDpcXHR7XFxuICA4MTpcXHRcXHRyZXR1cm4gYnBmX3RyYWNpbmdfYnRmX2N0eF9hY2Nlc3Mob2ZmLCBzaXplLCB0eXBlLCBwcm9nLCBpbmZvKTtcXG4gIDgyOlxcdH1cXG4gIDgzOlxcdFxcbiAgODQ6XFx0c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqXFxuICA4NTpcXHRicGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCxcXG4gIDg2OlxcdFxcdFxcdFxcdCAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nKVxcbiAgODc6XFx0e1xcbiAgODg6XFx0XFx0cmV0dXJuIGJwZl9iYXNlX2Z1bmNfcHJvdG8oZnVuY19pZCwgcHJvZyk7XFxuICA4OTpcXHR9XFxuICA5MDpcXHRcXG4gIDkxOlxcdHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX29wcyBicGZfaW9jb3N0X3ZlcmlmaWVyX29wcyA9IHtcXG4gIDkyOlxcdFxcdC5nZXRfZnVuY19wcm90byA9IGJwZl9pb2Nvc3RfZ2V0X2Z1bmNfcHJvdG8sXFxuICA5MzpcXHRcXHQuaXNfdmFsaWRfYWNjZXNzID0gYnBmX2lvY29zdF9pc192YWxpZF9hY2Nlc3MsXFxuICA5NDpcXHR9O1xcbiAgOTU6XFx0XFxuICA5NjpcXHRzdGF0aWMgaW50IGJwZl9pb2Nvc3RfcmVnKHZvaWQgKmtkYXRhLCBzdHJ1Y3QgYnBmX2xpbmsgKmxpbmspXFxuICA5NzpcXHR7XFxuICA5ODpcXHRcXHRzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhO1xcbiAgOTk6XFx0XFxuIDEwMDpcXHRcXHRpZiAoIW5ld19vcHMtXFx1MDAzZWNhbGNfY29zdClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzU6NTcuMTQ4NTEzMzAzWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDIzMjM1ODcwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byBgYmxrLWlvY29zdC1icGYuY2AqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGFscmVhZHkgZXhhbWluZWQgc29tZSBrZXkgYXJlYXMgb2YgdGhpcyBCUEYgcHJvZ3JhbSwgYW5kIG5vdyBJIG5lZWQgdG8gc3lzdGVtYXRpY2FsbHkgZXhwbG9yZSB0aGUgcmVtYWluZGVyIG9mIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYC4gSSBoYXZlIGEgZ29vZCBncmFzcCBvZiB0aGUgZm91bmRhdGlvbmFsIGNvbmNlcHRzLCBidXQgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJ20gbm90IG1pc3NpbmcgYW55IHN1YnRsZSBpbnRlcmFjdGlvbnMgb3IgbGVzcyBvYnZpb3VzIG9wdGltaXphdGlvbnMuIFdoYXQgYXJlIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBkb2luZyBpbiB0ZXJtcyBvZiB0cmFjaW5nIGkvbyBjb3N0cywgc2V0dGluZyB1cCBtYXBzLCBvciBoYW5kbGluZyBzcGVjaWZpYyBlZGdlIGNhc2VzPyBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IHRoZXkndmUgaGFuZGxlZCBwb3RlbnRpYWwgY29udGVudGlvbiwgcmVzb3VyY2UgbGltaXRzLCBhbmQgZXJyb3IgaGFuZGxpbmcgd2l0aGluIHRoaXMgQlBGIGNvbnRleHQuIExldCdzIHNlZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgYnVpbGRzIHVwb24gd2hhdCBJJ3ZlIGFscmVhZHkgc2NydXRpbml6ZWQuIEkgbmVlZCB0byBlbnN1cmUgYSBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nIHRvIG1ha2UgYW55IGFzc2Vzc21lbnRzIGFib3V0IHBlcmZvcm1hbmNlLCBlZmZpY2llbmN5LCBvciBwb3RlbnRpYWwgaW1wcm92ZW1lbnRzLiBUaW1lIHRvIGRpZyBpbiFcblxuXG4iLCJJbnB1dFRva2VucyI6MTcxMDAsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDExOjM2OjAxLjM4MDg3NDk1OFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MDIwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJibG9jay9ibGstaW9jb3N0LWJwZi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwMCxcbiAgXCJMaW5lQ291bnRcIjogNTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDEwMDpcXHRcXHRpZiAoIW5ld19vcHMtXFx1MDAzZWNhbGNfY29zdClcXG4gMTAxOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMDI6XFx0XFxuIDEwMzpcXHRcXHRpbnQgcmV0ID0gMDtcXG4gMTA0OlxcdFxcbiAxMDU6XFx0XFx0LyogdGhlIGNhbGxlciBvbmx5IGhvbGRzIHRoZSBwZXItbWFwIGxvY2ssIHNvIHNlcmlhbGl6ZSBoZXJlICovXFxuIDEwNjpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcXG4gMTA3OlxcdFxcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkpXFxuIDEwODpcXHRcXHRcXHRyZXQgPSAtRUJVU1k7XFxuIDEwOTpcXHRcXHRlbHNlIHtcXG4gMTEwOlxcdFxcdFxcdHN0YXRpY19icmFuY2hfaW5jKFxcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XFxuIDExMTpcXHRcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgbmV3X29wcyk7XFxuIDExMjpcXHRcXHR9XFxuIDExMzpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xcbiAxMTQ6XFx0XFx0cmV0dXJuIHJldDtcXG4gMTE1OlxcdH1cXG4gMTE2OlxcdFxcbiAxMTc6XFx0c3RhdGljIHZvaWQgYnBmX2lvY29zdF91bnJlZyh2b2lkICprZGF0YSwgc3RydWN0IGJwZl9saW5rICpsaW5rKVxcbiAxMTg6XFx0e1xcbiAxMTk6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2aW9jb3N0X2JwZl9yZWdfbG9jayk7XFxuIDEyMDpcXHRcXHRpZiAocmN1X2FjY2Vzc19wb2ludGVyKGlvY29zdF9icGZfbW9kZWwpID09IGtkYXRhKSB7XFxuIDEyMTpcXHRcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7XFxuIDEyMjpcXHRcXHRcXHRzdGF0aWNfYnJhbmNoX2RlYyhcXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xcbiAxMjM6XFx0XFx0fVxcbiAxMjQ6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcXG4gMTI1OlxcdH1cXG4gMTI2OlxcdFxcbiAxMjc6XFx0c3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcXG4gMTI4OlxcdFxcdFxcdFxcdFxcdCAgICAgdTY0IGN1cnNvciwgdTY0IGlvY2dfaWQsIHU2NCBmbGFncylcXG4gMTI5OlxcdHtcXG4gMTMwOlxcdFxcdHJldHVybiAwO1xcbiAxMzE6XFx0fVxcbiAxMzI6XFx0XFxuIDEzMzpcXHRzdGF0aWMgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgX19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMgPSB7XFxuIDEzNDpcXHRcXHQuY2FsY19jb3N0ID0gYnBmX2lvY29zdF9jYWxjX2Nvc3Rfc3R1YixcXG4gMTM1OlxcdH07XFxuIDEzNjpcXHRcXG4gMTM3OlxcdHN0YXRpYyBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHMgYnBmX2lvY29zdF9tb2RlbF9vcHMgPSB7XFxuIDEzODpcXHRcXHQudmVyaWZpZXJfb3BzID0gXFx1MDAyNmJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzLFxcbiAxMzk6XFx0XFx0LmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsXFxuIDE0MDpcXHRcXHQuaW5pdF9tZW1iZXIgPSBicGZfaW9jb3N0X2luaXRfbWVtYmVyLFxcbiAxNDE6XFx0XFx0LnJlZyA9IGJwZl9pb2Nvc3RfcmVnLFxcbiAxNDI6XFx0XFx0LnVucmVnID0gYnBmX2lvY29zdF91bnJlZyxcXG4gMTQzOlxcdFxcdC5uYW1lID0gXFxcImlvY29zdF9tb2RlbF9vcHNcXFwiLFxcbiAxNDQ6XFx0XFx0LmNmaV9zdHVicyA9IFxcdTAwMjZfX2JwZl9vcHNfaW9jb3N0X21vZGVsX29wcyxcXG4gMTQ1OlxcdFxcdC5vd25lciA9IFRISVNfTU9EVUxFLFxcbiAxNDY6XFx0fTtcXG4gMTQ3OlxcdFxcbiAxNDg6XFx0c3RhdGljIGludCBfX2luaXQgYnBmX2lvY29zdF9pbml0KHZvaWQpXFxuIDE0OTpcXHR7XFxuIDE1MDpcXHRcXHRyZXR1cm4gcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoXFx1MDAyNmJwZl9pb2Nvc3RfbW9kZWxfb3BzLCBpb2Nvc3RfbW9kZWxfb3BzKTtcXG4gMTUxOlxcdH1cXG4gMTUyOlxcdGxhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MDEuMzgwOTU4NDY4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjcyOTM0NDAyOTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb246IEJsb2NrIElPIENvc3Qgd2l0aCBCUEYgU3VwcG9ydCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZm9jdXMgaGVyZSBpcyB0byBkZWZpbmUgYSBnb29kIGZ1enppbmcgdGFyZ2V0IHJlbGF0ZWQgdG8gdGhlIGJsb2NrIEkvTyBjb3N0IGNvbnRyb2xsZXIsIHNwZWNpZmljYWxseSB0aGUgQlBGLWJhc2VkIGltcGxlbWVudGF0aW9uLiBJJ3ZlIHBpbnBvaW50ZWQgYSBmZXcgYXJlYXMgaW4gYGJsb2NrL2Jsay1pb2Nvc3QuY2AgKGxpbmVzIH4yNTgwLCB+MzQ2NSwgYW5kIH4zNTEyKSBhbmQgdGhlIG5ldyBgYmxrLWlvY29zdC1icGYuY2AgdGhhdCBsb29rIHByb21pc2luZy4gU3BlY2lmaWNhbGx5LCBJJ20gaW50ZXJlc3RlZCBpbiBgY2FsY192dGltZV9jb3N0YCwgYGlvY19jb3N0X21vZGVsX3ByZmlsbGAsIGBpb2NfY29zdF9tb2RlbF93cml0ZWAgKGluIGBibGstaW9jb3N0LmNgKSwgYW5kIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAsIGBicGZfaW9jb3N0X3JlZ2AsIGBicGZfaW9jb3N0X3VucmVnYCAoaW4gYGJsay1pb2Nvc3QtYnBmLmNgKS4gQWxzbyB0aGUgYGlvY190aW1lcl9mbmAuXG5cblRoZSBrZXkgaGVyZSBpcyB3aGV0aGVyIHRoaXMgY29kZSBtb2RpZmljYXRpb24gbWVyaXRzIGZ1enppbmcuIEl0IGRvZXMhICBJJ3ZlIGFzc2Vzc2VkIHRoYXQgaXQgaW1wYWN0cyB0aGUgYmxvY2sgbGF5ZXIsIGNncm91cHMsIGFuZCBCUEYgYHN0cnVjdF9vcHNgLCBpcyByZWFjaGFibGUgaW4gYSBzdGFuZGFyZCBRRU1VIGVudmlyb25tZW50LCBhbmQgaGFzIGNoYW5nZXMgdG8gYGJsay1pb2Nvc3QuY2AgYW5kIGBibGstaW9jb3N0LWJwZi5jYC4gU28sIGl0J3Mgd29ydGggdGhlIGVmZm9ydC5cblxuTm93LCB0byBuYXJyb3cgZG93biB0aGUgZm9jdXMuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgbW9zdCBzcGVjaWZpYywgbm9uLXViaXF1aXRvdXMgZnVuY3Rpb25zIGFkZGVkIG9yIG1vZGlmaWVkLiBUaGUgY29yZSBCUEYgZnVuY3Rpb25zIGFkZGVkIGluIGBibGstaW9jb3N0LWJwZi5jYCBzdGFuZCBvdXQ6IGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAsIGBicGZfaW9jb3N0X3JlZ2AsIGBicGZfaW9jb3N0X3VucmVnYC4gQW5kIGZyb20gYGJsay1pb2Nvc3QuY2AsIGBjYWxjX3Z0aW1lX2Nvc3RgLCBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgLCBhbmQgYGlvY19jb3N0X21vZGVsX3ByZmlsbGAgYXMgdGhleSBhcHBlYXIgdG8gYmUgaW50ZWdyYWwgcGFydHMgb2YgdGhlIG5ldyBjb3N0IG1vZGVsLlxuXG5OZXh0LCB0aGUgY29uZmlndXJhdGlvbnMuIEkgbmVlZCB0byBlbnN1cmUgdGhlc2UgZmVhdHVyZXMgYXJlIGVuYWJsZWQgZm9yIGVmZmVjdGl2ZSBmdXp6aW5nLiBXZSBoYXZlIGBCTEtfQ0dST1VQX0lPQ09TVF9CUEZgLCBgQkxLX0NHUk9VUF9JT0NPU1RgLCBgQlBGX1NZU0NBTExgLCBgQlBGX0pJVGAsIGFuZCBgQkxLX0NHUk9VUGAuIENvbmZpcm1lZCwgSSd2ZSBjaGVja2VkIGBibG9jay9LY29uZmlnYCwgYW5kIGBCTEtfQ0dST1VQX0lPQ09TVGAgZGVwZW5kcyBvbiBgQkxLX0NHUk9VUGAuXG5cbkFscmlnaHQsIEknbSByZWFkeSB0byBmb3JtYWxseSBkZWZpbmUgdGhlIGZ1enppbmcgdGFyZ2V0LlxuXG4qKkVuYWJsZUNvbmZpZ3M6KipcbiogICBcIkJMS19DR1JPVVBfSU9DT1NUX0JQRlwiXG4qICAgXCJCTEtfQ0dST1VQX0lPQ09TVFwiXG4qICAgXCJCUEZfU1lTQ0FMTFwiXG4qICAgXCJCUEZfSklUXCJcbiogICBcIkJMS19DR1JPVVBcIlxuXG4qKkZvY3VzU3ltYm9sczoqKlxuKiAgIFwiaW9jb3N0X2JwZl9jYWxjX2Nvc3RcIlxuKiAgIFwiYnBmX2lvY29zdF9yZWdcIlxuKiAgIFwiYnBmX2lvY29zdF91bnJlZ1wiXG4qICAgXCJpb2NfY29zdF9tb2RlbF93cml0ZVwiXG4qICAgXCJpb2NfY29zdF9tb2RlbF9wcmZpbGxcIlxuKiAgIFwiY2FsY192dGltZV9jb3N0XCJcblxuVGhlIHJhdGlvbmFsZSBpcyBjbGVhci4gVGhlIHBhdGNoIGludHJvZHVjZXMgYSBCUEYgc3RydWN0X29wcyBtZWNoYW5pc20gZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscyBpbiB0aGUgYmxvY2sgSS9PIGNvc3QgY2dyb3VwIGNvbnRyb2xsZXIgKGFjdGl2YXRlZCBieSBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKS4gSXQgYWRkcyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gY2FsbGJhY2tzLCBob29rcyBpbnRvIGNvc3QgY2FsY3VsYXRpb24sIGFuZCBhbHRlcnMgdGhlIHN5c2ZzL2Nncm91cCBpbnRlcmZhY2UuIFRoaXMgYWxsIGhhbmRsZXMgdXNlciBpbnB1dCB2aWEgQlBGIGFuZCBjZ3JvdXBzIGFuZCBpcyByZWFjaGFibGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6YXRpb24gZW52aXJvbm1lbnRzLlxuXG5UaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTgyNjEsIk91dHB1dFRva2VucyI6MjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODczLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MDguNjc0NDAxMjY3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODI0NDI2MzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJMS19DR1JPVVBfSU9DT1NUX0JQRlwiLFxuICAgIFwiQkxLX0NHUk9VUF9JT0NPU1RcIixcbiAgICBcIkJMS19DR1JPVVBcIixcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJCUEZfSklUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaW9jb3N0X2JwZl9jYWxjX2Nvc3RcIixcbiAgICBcImJwZl9pb2Nvc3RfcmVnXCIsXG4gICAgXCJicGZfaW9jb3N0X3VucmVnXCIsXG4gICAgXCJpb2NfY29zdF9tb2RlbF93cml0ZVwiLFxuICAgIFwiaW9jX2Nvc3RfbW9kZWxfcHJmaWxsXCIsXG4gICAgXCJjYWxjX3Z0aW1lX2Nvc3RcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscyBpbiB0aGUgYmxvY2sgaW9jb3N0IGNncm91cCBjb250cm9sbGVyIChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKS4gSXQgYWRkcyBzdHJ1Y3Rfb3BzIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBjYWxsYmFja3MsIGludGVncmF0ZXMgZHluYW1pYyBCUEYgY29zdCBjYWxjdWxhdGlvbiBpbnRvIHRoZSBiaW8gc3VibWlzc2lvbiBwYXRoLCBhbmQgZXh0ZW5kcyB0aGUgY2dyb3VwIGlvLmNvc3QubW9kZWwgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuIFRoZSBjb2RlIGlzIGZ1bGx5IHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIGNncm91cHMgYW5kIHRoZSBCUEYgc3Vic3lzdGVtLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJMS19DR1JPVVBfSU9DT1NUX0JQRlwiLFxuICAgIFwiQkxLX0NHUk9VUF9JT0NPU1RcIixcbiAgICBcIkJMS19DR1JPVVBcIixcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJCUEZfSklUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaW9jb3N0X2JwZl9jYWxjX2Nvc3RcIixcbiAgICBcImJwZl9pb2Nvc3RfcmVnXCIsXG4gICAgXCJicGZfaW9jb3N0X3VucmVnXCIsXG4gICAgXCJpb2NfY29zdF9tb2RlbF93cml0ZVwiLFxuICAgIFwiaW9jX2Nvc3RfbW9kZWxfcHJmaWxsXCIsXG4gICAgXCJjYWxjX3Z0aW1lX2Nvc3RcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscyBpbiB0aGUgYmxvY2sgaW9jb3N0IGNncm91cCBjb250cm9sbGVyIChDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGKS4gSXQgYWRkcyBzdHJ1Y3Rfb3BzIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbiBjYWxsYmFja3MsIGludGVncmF0ZXMgZHluYW1pYyBCUEYgY29zdCBjYWxjdWxhdGlvbiBpbnRvIHRoZSBiaW8gc3VibWlzc2lvbiBwYXRoLCBhbmQgZXh0ZW5kcyB0aGUgY2dyb3VwIGlvLmNvc3QubW9kZWwgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuIFRoZSBjb2RlIGlzIGZ1bGx5IHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIGNncm91cHMgYW5kIHRoZSBCUEYgc3Vic3lzdGVtLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNjowOC43NTY4NTE3ODVaIiwiU2VxIjoxMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5OTYxMjExMTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MDguNzU3NDg2MzM1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTk5NjA1NzE4OTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdF9vcHMgc3VwcG9ydCAoYGlvY29zdF9tb2RlbF9vcHNgKSBmb3IgdGhlIGJsay1pb2Nvc3QgSS9PIGNncm91cCBjb250cm9sbGVyLCBhbGxvd2luZyBwbHVnZ2FibGUgQlBGLWJhc2VkIGNvc3QgY2FsY3VsYXRpb24sIGFkZHMgYSBuZXcgdHJhY2Vwb2ludCAoYGlvY29zdF9pb2NfdGlja2ApLCBhbmQgdXBkYXRlcyB0aGUgY2dyb3VwIHYyIGBpby5jb3N0Lm1vZGVsYCBpbnRlcmZhY2UuXFxuXFxuQW5hbHlzaXMgcmVnYXJkaW5nIHNhbml0aXplcnM6XFxuMS4gS01TQU4gYXBwbGljYWJpbGl0eTpcXG4tIEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSBhbmQga2VybmVsLXRvLXVzZXIgaW5mb3JtYXRpb24gbGVha3MuXFxuLSBJbiB0aGlzIHBhdGNoLCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIHBhc3NlZCB0byBgaW9jb3N0X2JwZl9jYWxjX2Nvc3QoKWAgYW5kIHRoZSBCUEYgc3RydWN0X29wcyBjYWxsYmFjayBhcmUgc2NhbGFyIGludGVnZXIgdmFsdWVzIHBhc3NlZCBieSB2YWx1ZS5cXG4tIE91dHB1dCBwb2ludGVycyAoc3VjaCBhcyBgKmNvc3RwYCBpbiBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgKSBhcmUgd3JpdHRlbiBiZWZvcmUgcmV0dXJuLCBhbmQgYWxsIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiBgYnBmYCwgYHVzZXJgLCBgY29zdGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBwcmlvciB0byBicmFuY2hpbmcgb3IgdXNlLlxcbi0gVGhlIG5ldyB0cmFjZXBvaW50IGBpb2Nvc3RfaW9jX3RpY2tgIGV4cGxpY2l0bHkgYXNzaWducyBhbGwgZmllbGRzIGluIGBUUF9mYXN0X2Fzc2lnbmAuXFxuLSBObyBzdHJ1Y3RzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgaGVhcCBhbGxvY2F0aW9ucyBhcmUgY29waWVkIHRvIHVzZXJzcGFjZS5cXG5cXG4yLiBLQVNBTiAvIExPQ0tERVAgYXBwbGljYWJpbGl0eTpcXG4tIFBvdGVudGlhbCByaXNrcyBpbiB0aGlzIHBhdGNoIHJldm9sdmUgYXJvdW5kIGNvbmN1cnJlbmN5IChzeW5jaHJvbml6YXRpb24gb2YgYGlvY29zdF9icGZfbW9kZWxgIHZpYSBSQ1UsIG11dGV4ZXMsIGFuZCBzdGF0aWMga2V5cykgb3IgbG9naWMvYm91bmRzIGVycm9ycywgd2hpY2ggYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQga2VybmVsIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi5cXG5cXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAzNGVjNTAxNjkyYTdiZGVkM2RjYjE1NmI4NGNhYjRkNTg4ODM1NmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBTZXAgOCAxMTozNTo0MyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuaW5kZXggOGQyNjAzNzUxYzUxYS4uNTRiMDU3NGNlNTg2YyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvY2dyb3VwLXYyLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9jZ3JvdXAtdjIucnN0XG5AQCAtMjExNSwxMCArMjExNSwyNCBAQCBJTyBJbnRlcmZhY2UgRmlsZXNcbiBcdGFyZSBkZWZpbmVkLlxuIFxuIFx0ICA9PT09PVx0XHQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLVx0ICBjdHJsXHRcdFwiYXV0b1wiIG9yIFwidXNlclwiXG4rXHQgIGN0cmxcdFx0XCJhdXRvXCIsIFwidXNlclwiIG9yIFwiYnBmXCJcbiBcdCAgbW9kZWxcdFx0VGhlIGNvc3QgbW9kZWwgaW4gdXNlIC0gXCJsaW5lYXJcIlxuIFx0ICA9PT09PVx0XHQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIFxuK1x0V2hlbiBcImN0cmxcIiBpcyBcImJwZlwiIChvbmx5IGF2YWlsYWJsZSB3aGVuXG4rXHRDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGIGlzIGVuYWJsZWQpLCBjb3N0IGNhbGN1bGF0aW9uIGZvclxuK1x0dGhlIGRldmljZSBpcyBkaXNwYXRjaGVkIHRvIHRoZSBCUEYgcHJvZ3JhbSByZWdpc3RlcmVkIGFnYWluc3RcbitcdHRoZSBpb2Nvc3RfbW9kZWxfb3BzIHN0cnVjdF9vcHMuICBXcml0aW5nIFwiYnBmXCIgZmFpbHMgd2l0aCAtRUlOVkFMXG4rXHR1bnRpbCBzdWNoIGEgcHJvZ3JhbSBpcyByZWdpc3RlcmVkLCBhbmQgYXQgbW9zdCBvbmUgcHJvZ3JhbSBjYW5cbitcdGJlIHJlZ2lzdGVyZWQgc3lzdGVtLXdpZGUuICBUaGUgbW9kZWwgaXMgY2FsbGVkIHdpdGggc2NhbGFyXG4rXHRhcmd1bWVudHMgKG9wZXJhdGlvbiwgc2l6ZSwgc2VjdG9yLCBjZ3JvdXAgY3Vyc29yLCBjc3MgaWQgb2YgdGhlXG4rXHRpc3N1aW5nIGNncm91cCwgZmxhZ3M7IHNlZSBpbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaCBmb3IgdGhlaXJcbitcdG1lYW5pbmcpIGFuZCByZXR1cm5zIGEgY29zdCBpbiB2dGltZSB1bml0cywgY2xhbXBlZCBieSB0aGUga2VybmVsXG4rXHR0byAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBwZXIgSU8uICBBIHJldHVybiB2YWx1ZSBvZiAwIGRlbGVnYXRlc1xuK1x0dGhlIElPIGJhY2sgdG8gdGhlIGJ1aWx0aW4gbGluZWFyIGZvcm11bGEsIHNvIGEgbW9kZWwgd2hpY2ggb25seVxuK1x0aGFuZGxlcyBzb21lIElPIHR5cGVzIGNhbm5vdCBtYWtlIHRoZSByZXN0IGZyZWUuICBEZXZpY2VzIHdoaWNoXG4rXHRkb24ndCBvcHQgaW4ga2VlcCB0aGUgYnVpbHRpbiBsaW5lYXIgbW9kZWwgdW5jaGFuZ2VkLlxuK1xuIFx0V2hlbiBcImN0cmxcIiBpcyBcImF1dG9cIiwgdGhlIGtlcm5lbCBtYXkgY2hhbmdlIGFsbCBwYXJhbWV0ZXJzXG4gXHRkeW5hbWljYWxseS4gIFdoZW4gXCJjdHJsXCIgaXMgc2V0IHRvIFwidXNlclwiIG9yIGFueSBvdGhlclxuIFx0cGFyYW1ldGVycyBhcmUgd3JpdHRlbiB0bywgXCJjdHJsXCIgYmVjb21lIFwidXNlclwiIGFuZCB0aGVcbmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZ1xuaW5kZXggNzBlNGE2NmQ5NDFmZi4uYmY0M2JlMjFlMDBiYiAxMDA2NDRcbi0tLSBhL2Jsb2NrL0tjb25maWdcbisrKyBiL2Jsb2NrL0tjb25maWdcbkBAIC0yMzEsNCArMjMxLDEzIEBAIGNvbmZpZyBCTEtfRVJST1JfSU5KRUNUSU9OXG4gXG4gc291cmNlIFwiYmxvY2svS2NvbmZpZy5pb3NjaGVkXCJcbiBcbitjb25maWcgQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRib29sIFwiRW5hYmxlIEJQRiBwbHVnZ2FibGUgY29zdCBtb2RlbCBzdXBwb3J0IGZvciB0aGUgY29zdCBJTyBjb250cm9sbGVyXCJcbitcdGRlcGVuZHMgb24gQkxLX0NHUk9VUF9JT0NPU1QgXHUwMDI2XHUwMDI2IEJQRl9TWVNDQUxMIFx1MDAyNlx1MDAyNiBCUEZfSklUXG4rXHRoZWxwXG4rXHQgRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVnaXN0ZXJzIHRoZSBcImlvY29zdF9tb2RlbF9vcHNcIiBCUEZcbitcdCBzdHJ1Y3Rfb3BzIHR5cGUsIHdoaWNoIGFsbG93cyBhIEJQRiBwcm9ncmFtIHRvIHJlcGxhY2UgdGhlXG4rXHQgYnVpbHRpbiBsaW5lYXIgY29zdCBtb2RlbCBvbiBkZXZpY2VzIGNvbmZpZ3VyZWQgd2l0aFxuK1x0IFwiY3RybD1icGZcIiB0aHJvdWdoIGlvLmNvc3QubW9kZWwuXG4rXG4gZW5kaWYgIyBCTE9DS1xuZGlmZiAtLWdpdCBhL2Jsb2NrL01ha2VmaWxlIGIvYmxvY2svTWFrZWZpbGVcbmluZGV4IGU3YmQzMjBlM2Q2OTcuLmVlNWNlYmVlYTAwNmYgMTAwNjQ0XG4tLS0gYS9ibG9jay9NYWtlZmlsZVxuKysrIGIvYmxvY2svTWFrZWZpbGVcbkBAIC0zOSwzICszOSw0IEBAIG9iai0kKENPTkZJR19CTEtfSU5MSU5FX0VOQ1JZUFRJT04pXHQrPSBibGstY3J5cHRvLm8gYmxrLWNyeXB0by1wcm9maWxlLm8gXFxcbiBcdFx0XHRcdFx0ICAgYmxrLWNyeXB0by1zeXNmcy5vXG4gb2JqLSQoQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTl9GQUxMQkFDSylcdCs9IGJsay1jcnlwdG8tZmFsbGJhY2sub1xuIG9iai0kKENPTkZJR19CTE9DS19IT0xERVJfREVQUkVDQVRFRClcdCs9IGhvbGRlci5vXG4rb2JqLSQoQ09ORklHX0JMS19DR1JPVVBfSU9DT1NUX0JQRilcdCs9IGJsay1pb2Nvc3QtYnBmLm9cbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LWJwZi5jIGIvYmxvY2svYmxrLWlvY29zdC1icGYuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjBjMzRmNTZkZWQ3MWRcbi0tLSAvZGV2L251bGxcbisrKyBiL2Jsb2NrL2Jsay1pb2Nvc3QtYnBmLmNcbkBAIC0wLDAgKzEsMTUyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgVGFvIEN1aSAqL1xuK1xuKy8qXG4rICogYmxrLWlvY29zdDogQlBGIHN0cnVjdF9vcHMgcGx1bWJpbmcgZm9yIHBsdWdnYWJsZSBjb3N0IG1vZGVscy5cbisgKlxuKyAqIFJlZ2lzdGVycyB0aGUgXCJpb2Nvc3RfbW9kZWxfb3BzXCIgc3RydWN0X29wcyB0eXBlLiAgQXQgbW9zdCBvbmUgbW9kZWxcbisgKiBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBhIHRpbWU7IGRldmljZXMgb3B0IGluIHBlci1xdWV1ZSB3aXRoXG4rICogXCJlY2hvICRERVYgY3RybD1icGYgXHUwMDNlIGlvLmNvc3QubW9kZWxcIi4gIERldmljZXMgd2l0aG91dCBhIHJlZ2lzdGVyZWRcbisgKiBtb2RlbCBrZWVwIHVzaW5nIHRoZSBidWlsdGluIGxpbmVhciBtb2RlbC5cbisgKi9cbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGZfdmVyaWZpZXIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXHUwMDNlXG4rXG4rLyogMXMgb2YgZGV2aWNlIHRpbWU7IHVwcGVyIGJvdW5kIG9uIGEgc2luZ2xlIElPJ3MgY2hhcmdlYWJsZSBjb3N0ICovXG4rI2RlZmluZSBJT0NPU1RfQlBGX01BWF9DT1NUXHQoMVVMTCBcdTAwM2NcdTAwM2MgMzcpXG4rXG4rc3RhdGljIHN0cnVjdCBicGZfc3RydWN0X29wcyBicGZfaW9jb3N0X21vZGVsX29wcztcbitcbitzdGF0aWMgREVGSU5FX01VVEVYKGlvY29zdF9icGZfcmVnX2xvY2spO1xuK3N0YXRpYyBzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBfX3JjdSAqaW9jb3N0X2JwZl9tb2RlbDtcbitzdGF0aWMgREVGSU5FX1NUQVRJQ19LRVlfRkFMU0UoaW9jb3N0X2JwZl9rZXkpO1xuK1xuK2Jvb2wgaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKHZvaWQpXG4re1xuK1x0cmV0dXJuIHN0YXRpY19icmFuY2hfdW5saWtlbHkoXHUwMDI2aW9jb3N0X2JwZl9rZXkpO1xuK31cbitcbitib29sIGlvY29zdF9icGZfY2FsY19jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvciwgdTY0IGN1cnNvcixcbitcdFx0XHQgIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MsIHU2NCAqY29zdHApXG4re1xuK1x0Y29uc3Qgc3RydWN0IGlvY29zdF9tb2RlbF9vcHMgKm9wcztcbitcdHU2NCBjb3N0O1xuK1xuK1x0aWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFx1MDAyNmlvY29zdF9icGZfa2V5KSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0b3BzID0gcmN1X2RlcmVmZXJlbmNlKGlvY29zdF9icGZfbW9kZWwpO1xuK1x0aWYgKCFvcHMpIHtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdGNvc3QgPSBvcHMtXHUwMDNlY2FsY19jb3N0KG9wLCBuYnl0ZXMsIHNlY3RvciwgY3Vyc29yLCBpb2NnX2lkLCBmbGFncyk7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcbitcdGlmICghY29zdClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0KmNvc3RwID0gbWluKGNvc3QsIElPQ09TVF9CUEZfTUFYX0NPU1QpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9tb2RlbF9pbml0KHN0cnVjdCBidGYgKmJ0Zilcbit7XG4rXHRzMzIgdHlwZV9pZDtcbitcbitcdHR5cGVfaWQgPSBidGZfZmluZF9ieV9uYW1lX2tpbmQoYnRmLCBcImlvY29zdF9tb2RlbF9vcHNcIiwgQlRGX0tJTkRfU1RSVUNUKTtcbitcdGlmICh0eXBlX2lkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IGJwZl9pb2Nvc3RfaW5pdF9tZW1iZXIoY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxuK1x0XHRcdFx0ICBjb25zdCBzdHJ1Y3QgYnRmX21lbWJlciAqbWVtYmVyLFxuK1x0XHRcdFx0ICB2b2lkICprZGF0YSwgY29uc3Qgdm9pZCAqdWRhdGEpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sIGJwZl9pb2Nvc3RfaXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLFxuK1x0XHRcdFx0ICAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsXG4rXHRcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLFxuK1x0XHRcdFx0ICAgICAgIHN0cnVjdCBicGZfaW5zbl9hY2Nlc3NfYXV4ICppbmZvKVxuK3tcbitcdHJldHVybiBicGZfdHJhY2luZ19idGZfY3R4X2FjY2VzcyhvZmYsIHNpemUsIHR5cGUsIHByb2csIGluZm8pO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvICpcbiticGZfaW9jb3N0X2dldF9mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCxcbitcdFx0XHQgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZylcbit7XG4rXHRyZXR1cm4gYnBmX2Jhc2VfZnVuY19wcm90byhmdW5jX2lkLCBwcm9nKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIGJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzID0ge1xuK1x0LmdldF9mdW5jX3Byb3RvID0gYnBmX2lvY29zdF9nZXRfZnVuY19wcm90byxcbitcdC5pc192YWxpZF9hY2Nlc3MgPSBicGZfaW9jb3N0X2lzX3ZhbGlkX2FjY2Vzcyxcbit9O1xuK1xuK3N0YXRpYyBpbnQgYnBmX2lvY29zdF9yZWcodm9pZCAqa2RhdGEsIHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyAqbmV3X29wcyA9IGtkYXRhO1xuK1xuK1x0aWYgKCFuZXdfb3BzLVx1MDAzZWNhbGNfY29zdClcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRpbnQgcmV0ID0gMDtcbitcbitcdC8qIHRoZSBjYWxsZXIgb25seSBob2xkcyB0aGUgcGVyLW1hcCBsb2NrLCBzbyBzZXJpYWxpemUgaGVyZSAqL1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbitcdGlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCkpXG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdGVsc2Uge1xuK1x0XHRzdGF0aWNfYnJhbmNoX2luYyhcdTAwMjZpb2Nvc3RfYnBmX2tleSk7XG4rXHRcdHJjdV9hc3NpZ25fcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsLCBuZXdfb3BzKTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGJwZl9pb2Nvc3RfdW5yZWcodm9pZCAqa2RhdGEsIHN0cnVjdCBicGZfbGluayAqbGluaylcbit7XG4rXHRtdXRleF9sb2NrKFx1MDAyNmlvY29zdF9icGZfcmVnX2xvY2spO1xuK1x0aWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2Nvc3RfYnBmX21vZGVsKSA9PSBrZGF0YSkge1xuK1x0XHRyY3VfYXNzaWduX3BvaW50ZXIoaW9jb3N0X2JwZl9tb2RlbCwgTlVMTCk7XG4rXHRcdHN0YXRpY19icmFuY2hfZGVjKFx1MDAyNmlvY29zdF9icGZfa2V5KTtcbitcdH1cbitcdG11dGV4X3VubG9jayhcdTAwMjZpb2Nvc3RfYnBmX3JlZ19sb2NrKTtcbit9XG4rXG4rc3RhdGljIHU2NCBicGZfaW9jb3N0X2NhbGNfY29zdF9zdHViKHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbitcdFx0XHRcdCAgICAgdTY0IGN1cnNvciwgdTY0IGlvY2dfaWQsIHU2NCBmbGFncylcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIF9fYnBmX29wc19pb2Nvc3RfbW9kZWxfb3BzID0ge1xuK1x0LmNhbGNfY29zdCA9IGJwZl9pb2Nvc3RfY2FsY19jb3N0X3N0dWIsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzIGJwZl9pb2Nvc3RfbW9kZWxfb3BzID0ge1xuK1x0LnZlcmlmaWVyX29wcyA9IFx1MDAyNmJwZl9pb2Nvc3RfdmVyaWZpZXJfb3BzLFxuK1x0LmluaXQgPSBicGZfaW9jb3N0X21vZGVsX2luaXQsXG4rXHQuaW5pdF9tZW1iZXIgPSBicGZfaW9jb3N0X2luaXRfbWVtYmVyLFxuK1x0LnJlZyA9IGJwZl9pb2Nvc3RfcmVnLFxuK1x0LnVucmVnID0gYnBmX2lvY29zdF91bnJlZyxcbitcdC5uYW1lID0gXCJpb2Nvc3RfbW9kZWxfb3BzXCIsXG4rXHQuY2ZpX3N0dWJzID0gXHUwMDI2X19icGZfb3BzX2lvY29zdF9tb2RlbF9vcHMsXG4rXHQub3duZXIgPSBUSElTX01PRFVMRSxcbit9O1xuK1xuK3N0YXRpYyBpbnQgX19pbml0IGJwZl9pb2Nvc3RfaW5pdCh2b2lkKVxuK3tcbitcdHJldHVybiByZWdpc3Rlcl9icGZfc3RydWN0X29wcyhcdTAwMjZicGZfaW9jb3N0X21vZGVsX29wcywgaW9jb3N0X21vZGVsX29wcyk7XG4rfVxuK2xhdGVfaW5pdGNhbGwoYnBmX2lvY29zdF9pbml0KTtcbmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jb3N0LmMgYi9ibG9jay9ibGstaW9jb3N0LmNcbmluZGV4IDI3NDViZmZjZDVlZWYuLmE1OGMxNmZjYjI5ZmEgMTAwNjQ0XG4tLS0gYS9ibG9jay9ibGstaW9jb3N0LmNcbisrKyBiL2Jsb2NrL2Jsay1pb2Nvc3QuY1xuQEAgLTE3Nyw2ICsxNzcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3RpbWVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90aW1lNjQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhcnNlci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrLWlvY29zdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vbG9jYWwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9sb2NhbDY0LmhcdTAwM2VcbkBAIC00NDUsNiArNDQ2LDcgQEAgc3RydWN0IGlvYyB7XG4gXHRpbnRcdFx0XHRcdGF1dG9wX2lkeDtcbiBcdGJvb2xcdFx0XHRcdHVzZXJfcW9zX3BhcmFtczoxO1xuIFx0Ym9vbFx0XHRcdFx0dXNlcl9jb3N0X21vZGVsOjE7XG4rXHRib29sXHRcdFx0XHRicGZfY29zdF9tb2RlbDtcbiB9O1xuIFxuIHN0cnVjdCBpb2NnX3BjcHVfc3RhdCB7XG5AQCAtMjIzOCw2ICsyMjQwLDcgQEAgc3RhdGljIHZvaWQgaW9jX3RpbWVyX2ZuKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcilcbiBcdHN0cnVjdCBpb2Nfbm93IG5vdztcbiBcdExJU1RfSEVBRChzdXJwbHVzZXMpO1xuIFx0aW50IG5yX2RlYnRvcnMsIG5yX3Nob3J0YWdlcyA9IDAsIG5yX2xhZ2dpbmcgPSAwO1xuK1x0aW50IG5yX2FjdGl2ZSA9IDA7XG4gXHR1NjQgdXNhZ2VfdXNfc3VtID0gMDtcbiBcdHUzMiBwcG1fcnRocjtcbiBcdHUzMiBwcG1fd3RocjtcbkBAIC0yMjc0LDYgKzIyNzcsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHR1NjQgdmRvbmUsIHZ0aW1lLCB1c2FnZV91cztcbiBcdFx0dTMyIGh3X2FjdGl2ZSwgaHdfaW51c2U7XG4gXG4rXHRcdG5yX2FjdGl2ZSsrO1xuK1xuIFx0XHQvKlxuIFx0XHQgKiBDb2xsZWN0IHVudXNlZCBhbmQgd2luZCB2dGltZSBjbG9zZXIgdG8gdm5vdyB0byBwcmV2ZW50XG4gXHRcdCAqIGlvY2dzIGZyb20gYWNjdW11bGF0aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGJ1ZGdldC5cbkBAIC0yNDYwLDYgKzI0NjUsOCBAQCBzdGF0aWMgdm9pZCBpb2NfdGltZXJfZm4oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKVxuIFx0XHRpb2NfcmVmcmVzaF92cmF0ZShpb2MsIFx1MDAyNm5vdyk7XG4gXHR9XG4gXG4rXHR0cmFjZV9pb2Nvc3RfaW9jX3RpY2soaW9jLCBucl9hY3RpdmUsIHVzYWdlX3VzX3N1bSk7XG4rXG4gXHRzcGluX3VubG9ja19pcnEoXHUwMDI2aW9jLVx1MDAzZWxvY2spO1xuIH1cbiBcbkBAIC0yNTczLDYgKzI1ODAsMjMgQEAgc3RhdGljIHU2NCBjYWxjX3Z0aW1lX2Nvc3Qoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgaW9jX2dxICppb2NnLCBib29sIGlzX21lcmdlKVxuIHtcbiBcdHU2NCBjb3N0O1xuIFxuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRzdHJ1Y3QgaW9jICppb2MgPSBpb2NnLVx1MDAzZWlvYztcbitcbitcdGlmIChSRUFEX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsKSkge1xuK1x0XHR1NjQgYnBmX2Nvc3Q7XG4rXG4rXHRcdGlmIChpb2Nvc3RfYnBmX2NhbGNfY29zdChiaW9fb3AoYmlvKSxcbitcdFx0XHRcdFx0IGJpby1cdTAwM2ViaV9pdGVyLmJpX3NpemUsXG4rXHRcdFx0XHRcdCBiaW8tXHUwMDNlYmlfaXRlci5iaV9zZWN0b3IsXG4rXHRcdFx0XHRcdCBpb2NnLVx1MDAzZWN1cnNvcixcbitcdFx0XHRcdFx0IGlvY2dfdG9fYmxrZyhpb2NnKS1cdTAwM2VibGtjZy1cdTAwM2Vjc3MuaWQsXG4rXHRcdFx0XHRcdCBpc19tZXJnZSA/IElPQ09TVF9DT1NUX0ZfTUVSR0UgOiAwLFxuK1x0XHRcdFx0XHQgXHUwMDI2YnBmX2Nvc3QpKVxuK1x0XHRcdHJldHVybiBicGZfY29zdDtcbitcdH1cbisjZW5kaWZcbitcbiBcdGNhbGNfdnRpbWVfY29zdF9idWlsdGluKGJpbywgaW9jZywgaXNfbWVyZ2UsIFx1MDAyNmNvc3QpO1xuIFx0cmV0dXJuIGNvc3Q7XG4gfVxuQEAgLTM0NDEsNyArMzQ2NSw4IEBAIHN0YXRpYyB1NjQgaW9jX2Nvc3RfbW9kZWxfcHJmaWxsKHN0cnVjdCBzZXFfZmlsZSAqc2YsXG4gXHRzZXFfcHJpbnRmKHNmLCBcIiVzIGN0cmw9JXMgbW9kZWw9bGluZWFyIFwiXG4gXHRcdCAgIFwicmJwcz0lbGx1IHJzZXFpb3BzPSVsbHUgcnJhbmRpb3BzPSVsbHUgXCJcbiBcdFx0ICAgXCJ3YnBzPSVsbHUgd3NlcWlvcHM9JWxsdSB3cmFuZGlvcHM9JWxsdVxcblwiLFxuLVx0XHQgICBkbmFtZSwgaW9jLVx1MDAzZXVzZXJfY29zdF9tb2RlbCA/IFwidXNlclwiIDogXCJhdXRvXCIsXG4rXHRcdCAgIGRuYW1lLCBpb2MtXHUwMDNlYnBmX2Nvc3RfbW9kZWwgPyBcImJwZlwiIDpcbitcdFx0XHQgICBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsID8gXCJ1c2VyXCIgOiBcImF1dG9cIixcbiBcdFx0ICAgdVtJX0xDT0VGX1JCUFNdLCB1W0lfTENPRUZfUlNFUUlPUFNdLCB1W0lfTENPRUZfUlJBTkRJT1BTXSxcbiBcdFx0ICAgdVtJX0xDT0VGX1dCUFNdLCB1W0lfTENPRUZfV1NFUUlPUFNdLCB1W0lfTENPRUZfV1JBTkRJT1BTXSk7XG4gXHRzcGluX3VubG9ja19pcnEoXHUwMDI2aW9jLVx1MDAzZWxvY2spO1xuQEAgLTM0ODEsNyArMzUwNiw3IEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHR1bnNpZ25lZCBpbnQgbWVtZmxhZ3M7XG4gXHRzdHJ1Y3QgaW9jICppb2M7XG4gXHR1NjQgdVtOUl9JX0xDT0VGU107XG4tXHRib29sIHVzZXI7XG4rXHRib29sIHVzZXIsIGJwZjtcbiBcdGNoYXIgKmJvZHksICpwO1xuIFx0aW50IHJldDtcbiBcbkBAIC0zNTEyLDYgKzM1MzcsNyBAQCBzdGF0aWMgc3NpemVfdCBpb2NfY29zdF9tb2RlbF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmlucHV0LFxuIFx0c3Bpbl9sb2NrX2lycShcdTAwMjZpb2MtXHUwMDNlbG9jayk7XG4gXHRtZW1jcHkodSwgaW9jLVx1MDAzZXBhcmFtcy5pX2xjb2Vmcywgc2l6ZW9mKHUpKTtcbiBcdHVzZXIgPSBpb2MtXHUwMDNldXNlcl9jb3N0X21vZGVsO1xuK1x0YnBmID0gaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsO1xuIFxuIFx0cmV0ID0gLUVJTlZBTDtcbiBcbkBAIC0zNTI3LDExICszNTUzLDIwIEBAIHN0YXRpYyBzc2l6ZV90IGlvY19jb3N0X21vZGVsX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZiwgY2hhciAqaW5wdXQsXG4gXHRcdHN3aXRjaCAobWF0Y2hfdG9rZW4ocCwgY29zdF9jdHJsX3Rva2VucywgYXJncykpIHtcbiBcdFx0Y2FzZSBDT1NUX0NUUkw6XG4gXHRcdFx0bWF0Y2hfc3RybGNweShidWYsIFx1MDAyNmFyZ3NbMF0sIHNpemVvZihidWYpKTtcbi1cdFx0XHRpZiAoIXN0cmNtcChidWYsIFwiYXV0b1wiKSlcbitcdFx0XHRpZiAoIXN0cmNtcChidWYsIFwiYXV0b1wiKSkge1xuIFx0XHRcdFx0dXNlciA9IGZhbHNlO1xuLVx0XHRcdGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInVzZXJcIikpXG4rXHRcdFx0XHRicGYgPSBmYWxzZTtcbitcdFx0XHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInVzZXJcIikpIHtcbiBcdFx0XHRcdHVzZXIgPSB0cnVlO1xuLVx0XHRcdGVsc2VcbitcdFx0XHRcdGJwZiA9IGZhbHNlO1xuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXHRcdFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCJicGZcIikpIHtcbitcdFx0XHRcdGlmICghaW9jb3N0X2JwZl9tb2RlbF9yZWdpc3RlcmVkKCkpXG4rXHRcdFx0XHRcdGdvdG8gdW5sb2NrO1xuK1x0XHRcdFx0dXNlciA9IGZhbHNlO1xuK1x0XHRcdFx0YnBmID0gdHJ1ZTtcbisjZW5kaWZcbitcdFx0XHR9IGVsc2VcbiBcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRjYXNlIENPU1RfTU9ERUw6XG5AQCAtMzU1Niw2ICszNTkxLDcgQEAgc3RhdGljIHNzaXplX3QgaW9jX2Nvc3RfbW9kZWxfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLCBjaGFyICppbnB1dCxcbiBcdH0gZWxzZSB7XG4gXHRcdGlvYy1cdTAwM2V1c2VyX2Nvc3RfbW9kZWwgPSBmYWxzZTtcbiBcdH1cbitcdFdSSVRFX09OQ0UoaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsLCBicGYpO1xuIFx0aW9jX3JlZnJlc2hfcGFyYW1zKGlvYywgdHJ1ZSk7XG4gXG4gXHRyZXQgPSAwO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrLWlvY29zdC5oIGIvaW5jbHVkZS9saW51eC9ibGstaW9jb3N0Lmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43MTExYjVjMDNkYzM2XG4tLS0gL2Rldi9udWxsXG4rKysgYi9pbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaFxuQEAgLTAsMCArMSw1NiBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rI2lmbmRlZiBfTElOVVhfQkxLX0lPQ09TVF9IXG4rI2RlZmluZSBfTElOVVhfQkxLX0lPQ09TVF9IXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuK1xuKyNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGXG4rXG4rLypcbisgKiBQbHVnZ2FibGUgY29zdCBtb2RlbCBpbnRlcmZhY2UgZm9yIGJsay1pb2Nvc3QuXG4rICpcbisgKiBBIEJQRiBzdHJ1Y3Rfb3BzIGltcGxlbWVudGF0aW9uIHJlZ2lzdGVyZWQgYWdhaW5zdCBcImlvY29zdF9tb2RlbF9vcHNcIlxuKyAqIHJlcGxhY2VzIHRoZSBidWlsdGluIGxpbmVhciBjb3N0IG1vZGVsIG9uIGRldmljZXMgY29uZmlndXJlZCB3aXRoXG4rICogXCJjdHJsPWJwZlwiIHRocm91Z2ggaW8uY29zdC5tb2RlbC4gIFRoZSBtb2RlbCBpcyBhIHB1cmUgZnVuY3Rpb24gb2YgdGhlXG4rICogYXJndW1lbnRzIGJlbG93IGFuZCByZXR1cm5zIHRoZSBjb3N0IG9mIHRoZSBJTyBpbiBkZXZpY2UgdGltZSB1bml0cyxcbisgKiB3aGVyZSAxIHNlY29uZCBvZiBkZXZpY2UgdGltZSBlcXVhbHMgMl4zNyAoVlRJTUVfUEVSX1NFQykuICBUaGVcbisgKiByZXR1cm5lZCB2YWx1ZSBpcyBjbGFtcGVkIGJ5IHRoZSBrZXJuZWwuICBBIGNvc3Qgb2YgMCBkZWxlZ2F0ZXMgdGhlXG4rICogSU8gYmFjayB0byB0aGUgYnVpbHRpbiBmb3JtdWxhLCBzbyBhIG1vZGVsIHdoaWNoIGRvZXMgbm90IGhhbmRsZSBhXG4rICogZ2l2ZW4gSU8gdHlwZSBjYW5ub3QgbWFrZSBpdCBmcmVlLlxuKyAqXG4rICogVGhlIGlvY2dfaWQgYXJndW1lbnQgaWRlbnRpZmllcyB0aGUgaXNzdWluZyBjZ3JvdXAgKGNzcyBpZCkgc28gdGhlXG4rICogbW9kZWwgY2FuIGtlZXAgcGVyLWNncm91cCBzdGF0ZSwgZS5nLiBmb3IgbXVsdGktc3RyZWFtIHNlcXVlbnRpYWxpdHlcbisgKiBkZXRlY3Rpb24uICBUaGUgaWQgaXMgb25seSB2YWxpZCB3aGlsZSB0aGUgY2dyb3VwIGV4aXN0czogY3NzIGlkcyBhcmVcbisgKiByZWN5Y2xlZCBvbmNlIHRoZSBjZ3JvdXAgaXMgcmVtb3ZlZCwgc28gbW9kZWxzIG11c3QgdHJlYXQgaXQgYXMgYVxuKyAqIHRyYW5zaWVudCBrZXkgYW5kIHJlc2V0IHN0YXRlIHdoZW4gdGhleSBvYnNlcnZlIGl0IHJldXNlZC4gIFdoZXRoZXJcbisgKiB0aGUgaW50ZXJmYWNlIG5lZWRzIGEgcmVsZWFzZShpb2NnX2lkKSBjYWxsYmFjayBmb3Igc3RhdGUgY2xlYW51cCBpc1xuKyAqIGFuIG9wZW4gcXVlc3Rpb24uXG4rICpcbisgKiBUaGUgbW9kZWwgaXMgY2FsbGVkIGZyb20gdGhlIElPIHN1Ym1pc3Npb24gcGF0aCB1bmRlciBSQ1UgYW5kIG11c3RcbisgKiBub3Qgc2xlZXAuICBPbmx5IHRoZSBiaW8tbGV2ZWwgY2hhcmdpbmcgcGF0aCBjb25zdWx0cyB0aGUgbW9kZWw7XG4rICogdGhlIHJlcXVlc3QtbGV2ZWwgc2l6aW5nIHBhdGggKGNhbGNfc2l6ZV92dGltZV9jb3N0KCkpIGtlZXBzIHVzaW5nXG4rICogdGhlIGJ1aWx0aW4gZm9ybXVsYS5cbisgKi9cbitcbisvKiBmbGFncyBmb3IgY2FsY19jb3N0KCkgKi9cbisjZGVmaW5lIElPQ09TVF9DT1NUX0ZfTUVSR0VcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVx0LyogY2FsbGVkIGZyb20gbWVyZ2UgcGF0aCAqL1xuK1xuK3N0cnVjdCBpb2Nvc3RfbW9kZWxfb3BzIHtcbitcdC8qXG4rXHQgKiBAb3A6XHRcdFJFUV9PUF8qIHZhbHVlICh1YXBpIGJsa19vcGYuaClcbitcdCAqIEBuYnl0ZXM6XHRJTyBzaXplIGluIGJ5dGVzXG4rXHQgKiBAc2VjdG9yOlx0c3RhcnRpbmcgc2VjdG9yXG4rXHQgKiBAY3Vyc29yOlx0aW9jZyBjdXJzb3Igc2VjdG9yLCAwIGlmIG5vbmUgKHNlcXVlbnRpYWxpdHkgaGludClcbitcdCAqIEBpb2NnX2lkOlx0Y3NzIGlkIG9mIHRoZSBpc3N1aW5nIGNncm91cFxuK1x0ICogQGZsYWdzOlx0SU9DT1NUX0NPU1RfRl8qXG4rXHQgKi9cbitcdHU2NCAoKmNhbGNfY29zdCkodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuK1x0XHRcdCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKTtcbit9O1xuK1xuK2Jvb2wgaW9jb3N0X2JwZl9jYWxjX2Nvc3QodTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLCB1NjQgY3Vyc29yLFxuK1x0XHRcdCAgdTY0IGlvY2dfaWQsIHU2NCBmbGFncywgdTY0ICpjb3N0cCk7XG4rYm9vbCBpb2Nvc3RfYnBmX21vZGVsX3JlZ2lzdGVyZWQodm9pZCk7XG4rXG4rI2VuZGlmXHQvKiBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGICovXG4rI2VuZGlmXHQvKiBfTElOVVhfQkxLX0lPQ09TVF9IICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaFxuaW5kZXggZTc3MmIxYmM2MGQ2MC4uMmI5ZmYzNDhhNGY1MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvY29zdC5oXG4rKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb2Nvc3QuaFxuQEAgLTE3OCw2ICsxNzgsNDYgQEAgVFJBQ0VfRVZFTlQoaW9jb3N0X2lvY192cmF0ZV9hZGosXG4gXHQpXG4gKTtcbiBcbisvKlxuKyAqIFBlcmlvZGljIHBlci1kZXZpY2Ugc3VtbWFyeSwgZW1pdHRlZCBvbmNlIHBlciBwZXJpb2QgZnJvbSB0aGUgdGFpbCBvZlxuKyAqIGlvY190aW1lcl9mbigpLiAgVW5saWtlIHRoZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIGFib3ZlLCB0aGlzIGZpcmVzIGV2ZXJ5XG4rICogcGVyaW9kIHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGluY2x1ZGluZyBzdGVhZHkgc3RhdGVzLCBhbmQgY2Fycmllc1xuKyAqIHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3RhdGUgc28gYmFzaWMgbW9uaXRvcmluZyBkb2Vzbid0IHJlcXVpcmUgZHJnbi5cbisgKi9cbitUUkFDRV9FVkVOVChpb2Nvc3RfaW9jX3RpY2ssXG4rXG4rXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jICppb2MsIGludCBucl9hY3RpdmUsIHU2NCB1c2FnZV91c19zdW0pLFxuK1xuK1x0VFBfQVJHUyhpb2MsIG5yX2FjdGl2ZSwgdXNhZ2VfdXNfc3VtKSxcbitcbitcdFRQX1NUUlVDVF9fZW50cnkgKFxuK1x0XHRfX3N0cmluZyhkZXZuYW1lLCBpb2NfbmFtZShpb2MpKVxuK1x0XHRfX2ZpZWxkKHUzMiwgcGVyaW9kX3VzKVxuK1x0XHRfX2ZpZWxkKHU2NCwgdnJhdGUpXG4rXHRcdF9fZmllbGQoaW50LCBidXN5X2xldmVsKVxuK1x0XHRfX2ZpZWxkKGludCwgbnJfYWN0aXZlKVxuK1x0XHRfX2ZpZWxkKHUzMiwgdXNhZ2VfcGN0KVxuK1x0XHRfX2ZpZWxkKGludCwgcnVubmluZylcbitcdCksXG4rXG4rXHRUUF9mYXN0X2Fzc2lnbihcbitcdFx0X19hc3NpZ25fc3RyKGRldm5hbWUpO1xuK1x0XHRfX2VudHJ5LVx1MDAzZXBlcmlvZF91cyA9IGlvYy1cdTAwM2VwZXJpb2RfdXM7XG4rXHRcdF9fZW50cnktXHUwMDNldnJhdGUgPSBpb2MtXHUwMDNldnRpbWVfYmFzZV9yYXRlO1xuK1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwgPSBpb2MtXHUwMDNlYnVzeV9sZXZlbDtcbitcdFx0X19lbnRyeS1cdTAwM2Vucl9hY3RpdmUgPSBucl9hY3RpdmU7XG4rXHRcdF9fZW50cnktXHUwMDNldXNhZ2VfcGN0ID0gaW9jLVx1MDAzZXBlcmlvZF91cyA/XG4rXHRcdFx0ZGl2X3U2NCh1c2FnZV91c19zdW0gKiAxMDAsIGlvYy1cdTAwM2VwZXJpb2RfdXMpIDogMDtcbitcdFx0X19lbnRyeS1cdTAwM2VydW5uaW5nID0gaW9jLVx1MDAzZXJ1bm5pbmc7XG4rXHQpLFxuK1xuK1x0VFBfcHJpbnRrKFwiWyVzXSBwZXJpb2Q9JXV1cyB2cmF0ZT0lbGx1IGJ1c3k9JWQgYWN0aXZlPSVkIHVzYWdlPSV1JSUgcnVubmluZz0lZFwiLFxuK1x0XHRfX2dldF9zdHIoZGV2bmFtZSksIF9fZW50cnktXHUwMDNlcGVyaW9kX3VzLCBfX2VudHJ5LVx1MDAzZXZyYXRlLFxuK1x0XHRfX2VudHJ5LVx1MDAzZWJ1c3lfbGV2ZWwsIF9fZW50cnktXHUwMDNlbnJfYWN0aXZlLCBfX2VudHJ5LVx1MDAzZXVzYWdlX3BjdCxcbitcdFx0X19lbnRyeS1cdTAwM2VydW5uaW5nXG4rXHQpXG4rKTtcbitcbiBUUkFDRV9FVkVOVChpb2Nvc3RfaW9jZ19mb3JnaXZlX2RlYnQsXG4gXG4gXHRUUF9QUk9UTyhzdHJ1Y3QgaW9jX2dxICppb2NnLCBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgaW9jX25vdyAqbm93LFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2lvY29zdF9tb2RlbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvaW9jb3N0X21vZGVsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yYzE0OWYzY2QyNDNhXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCArMSwxNTUgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBUYW8gQ3VpICovXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJpb2Nvc3RfbW9kZWwuc2tlbC5oXCJcbisjaW5jbHVkZSBcImlvY29zdF9tcy5za2VsLmhcIlxuK1xuKy8qXG4rICogU3dpdGNoIGEgZGV2aWNlIHRvIGN0cmw9YnBmIHRocm91Z2ggaW8uY29zdC5tb2RlbCBhbmQgdmVyaWZ5IHRoZVxuKyAqIHJlYWRiYWNrLCByZXN0b3JpbmcgY3RybD1hdXRvIGFmdGVyd2FyZHMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy5cbisgKiBTaGFyZWQgYnkgdGhlIGV4YW1wbGUtbW9kZWwgdGVzdHMgYmVsb3cuXG4rICovXG4rc3RhdGljIGludCBzd2l0Y2hfdG9fYnBmKGNvbnN0IGNoYXIgKmRldilcbit7XG4rXHRjaGFyIHBhdGhbXSA9IFwiL3N5cy9mcy9jZ3JvdXAvaW8uY29zdC5tb2RlbFwiO1xuK1x0Y2hhciB3b3JkWzI1Nl0sIGxpbmVbMjU2XSwgYnVmWzMwMF07XG4rXHRGSUxFICpmcDtcbitcdGludCBlcnIsIGZvdW5kID0gMDtcbitcbitcdGZwID0gZm9wZW4ocGF0aCwgXCJyK1wiKTtcbitcdGlmICghZnApIHtcbitcdFx0VEhfTE9HKFwib3BlbiAlczogJXNcIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4rXHRcdGlmIChzc2NhbmYobGluZSwgXCIlMjU1c1wiLCB3b3JkKSA9PSAxIFx1MDAyNlx1MDAyNiAhc3RyY21wKHdvcmQsIGRldikpIHtcbitcdFx0XHRmb3VuZCA9IDE7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdH1cbitcdGlmICghZm91bmQpIHtcbitcdFx0VEhfTE9HKFwiJXMgaGFzIG5vIGlvY29zdCBsaW5lXCIsIGRldik7XG4rXHRcdGZjbG9zZShmcCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXMgY3RybD1icGZcIiwgZGV2KTtcbitcdGVyciA9IGZwcmludGYoZnAsIFwiJXNcXG5cIiwgYnVmKTtcbitcdGlmIChlcnIgXHUwMDNjPSAwKSB7XG4rXHRcdFRIX0xPRyhcIndyaXRlIGN0cmw9YnBmIGZhaWxlZFwiKTtcbitcdFx0ZmNsb3NlKGZwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0ZmZsdXNoKGZwKTtcbitcbitcdHJld2luZChmcCk7XG4rXHRmb3VuZCA9IDA7XG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbitcdFx0aWYgKHNzY2FuZihsaW5lLCBcIiUyNTVzXCIsIHdvcmQpID09IDEgXHUwMDI2XHUwMDI2ICFzdHJjbXAod29yZCwgZGV2KSkge1xuK1x0XHRcdGZvdW5kID0gc3Ryc3RyKGxpbmUsIFwiY3RybD1icGZcIikgIT0gTlVMTDtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0fVxuK1x0aWYgKCFmb3VuZClcbitcdFx0VEhfTE9HKFwicmVhZGJhY2sgZG9lcyBub3Qgc2hvdyBjdHJsPWJwZlwiKTtcbitcbitcdGZwcmludGYoZnAsIFwiJXMgY3RybD1hdXRvXFxuXCIsIGRldik7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGZvdW5kID8gMCA6IC0xO1xuK31cbitcbitzdGF0aWMgaW50IGRldl9oYXNfaW9jb3N0KHZvaWQpXG4re1xuK1x0RklMRSAqZnAgPSBmb3BlbihcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QucW9zXCIsIFwiclwiKTtcbitcbitcdGlmIChmcClcbitcdFx0ZmNsb3NlKGZwKTtcbitcdHJldHVybiBmcCAhPSBOVUxMO1xuK31cbitcbisvKlxuKyAqIFJlZ2lzdGVyIHRoZSBleGFtcGxlIGNvc3QgbW9kZWwgYW5kIHN3aXRjaCBhIGRldmljZSB0byBjdHJsPWJwZi5cbisgKiBJTyBhY2NvdW50aW5nIGl0c2VsZiBpcyBub3QgY2hlY2tlZCBoZXJlOyBpdCBuZWVkcyBhIGRldmljZSBkb2luZ1xuKyAqIHJlYWwgSU8gdW5kZXIgaW9jb3N0IGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZSBrZXJuZWwtc2lkZSB2YWxpZGF0aW9uXG4rICogZGVzY3JpYmVkIGluIHRoZSBjb3ZlciBsZXR0ZXIuXG4rICpcbisgKiBSZXF1aXJlcyByb290LCBjZ3JvdXAgdjIgYW5kIGEgZGV2aWNlIHdpdGggaW9jb3N0IHN1cHBvcnQuICBUaGVcbisgKiBkZXZpY2UgbXVzdCBiZSBnaXZlbiBhcyBtYWpvcjptaW5vciBpbiAkSU9DT1NUX1RFU1RfREVWLCBvdGhlcndpc2VcbisgKiB0aGUgdGVzdCBpcyBza2lwcGVkLlxuKyAqL1xuK3ZvaWQgc2VyaWFsX3Rlc3RfaW9jb3N0X21vZGVsKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvY29zdF9tb2RlbCAqc2tlbDtcbitcdGNoYXIgd29yZFsyNTZdLCAqZGV2O1xuK1x0aW50IGVycjtcbitcbitcdGRldiA9IGdldGVudihcIklPQ09TVF9URVNUX0RFVlwiKTtcbitcdGlmICghZGV2IHx8IGdldGV1aWQoKSAhPSAwKSB7XG4rXHRcdHRlc3RfX3NraXAoKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfVFJVRShkZXZfaGFzX2lvY29zdCgpLCBcImlvY29zdF9tb3VudGVkXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBuZWdhdGl2ZTogY3RybD1icGYgbXVzdCBiZSByZWplY3RlZCB3aGlsZSBubyBtb2RlbCBpc1xuK1x0ICogcmVnaXN0ZXJlZCwgc28gYSB0eXBvIGNhbm5vdCBzaWxlbnRseSBkaXNhYmxlIGNvc3QgbW9kZWxcbitcdCAqIHVwZGF0ZXMgKi9cbitcdGlmIChzc2NhbmYoZGV2LCBcIiUyNTVzXCIsIHdvcmQpICE9IDEpXG4rXHRcdHJldHVybjtcbitcdHtcbitcdFx0Y2hhciBwYXRoW10gPSBcIi9zeXMvZnMvY2dyb3VwL2lvLmNvc3QubW9kZWxcIjtcbitcdFx0Y2hhciBidWZbMzAwXTtcbitcdFx0RklMRSAqZnAgPSBmb3BlbihwYXRoLCBcIndcIik7XG4rXG4rXHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXMgY3RybD1icGZcXG5cIiwgd29yZCk7XG4rXHRcdGVyciA9IDA7XG4rXHRcdGlmIChmcCkge1xuK1x0XHRcdGVyciA9IGZwcmludGYoZnAsIFwiJXNcIiwgYnVmKSBcdTAwM2M9IDA7XG4rXHRcdFx0ZmNsb3NlKGZwKTtcbitcdFx0fVxuK1x0XHRBU1NFUlRfVFJVRShlcnIsIFwiY3RybF9icGZfd2l0aG91dF9tb2RlbF9yZWplY3RlZFwiKTtcbitcdH1cbitcbitcdHNrZWwgPSBpb2Nvc3RfbW9kZWxfX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcInNrZWxfb3Blbl9sb2FkXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKiBhdHRhY2hpbmcgdGhlIHN0cnVjdF9vcHMgcmVnaXN0ZXJzIHRoZSBtb2RlbDsgYSBzZWNvbmRcbitcdCAqIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc2FtZSBvcHMgd291bGQgZmFpbCB3aXRoIEVCVVNZICovXG4rXHRlcnIgPSBpb2Nvc3RfbW9kZWxfX2F0dGFjaChza2VsKTtcbitcdGlmIChBU1NFUlRfT0soZXJyLCBcImF0dGFjaFwiKSlcbitcdFx0QVNTRVJUX09LKHN3aXRjaF90b19icGYoZGV2KSwgXCJzd2l0Y2hfYW5kX3JlYWRiYWNrXCIpO1xuK1xuK1x0aW9jb3N0X21vZGVsX19kZXN0cm95KHNrZWwpO1xuK31cbitcbisvKlxuKyAqIFNhbWUgY2hlY2sgZm9yIHRoZSBtdWx0aS1zdHJlYW0gZXhhbXBsZSBtb2RlbC4gIE9ubHkgb25lIG1vZGVsIGNhblxuKyAqIGJlIHJlZ2lzdGVyZWQgYXQgYSB0aW1lLCBzbyB0aGlzIHRlc3QgbXVzdCBydW4gc2VwYXJhdGVseSBmcm9tXG4rICogdGVzdF9pb2Nvc3RfbW9kZWw7IGJvdGggYXJlIHNlcmlhbC5cbisgKi9cbit2b2lkIHNlcmlhbF90ZXN0X2lvY29zdF9tb2RlbF9zdHJlYW1zKHZvaWQpXG4re1xuK1x0c3RydWN0IGlvY29zdF9tcyAqc2tlbDtcbitcdGNoYXIgKmRldjtcbitcdGludCBlcnI7XG4rXG4rXHRkZXYgPSBnZXRlbnYoXCJJT0NPU1RfVEVTVF9ERVZcIik7XG4rXHRpZiAoIWRldiB8fCBnZXRldWlkKCkgIT0gMCkge1xuK1x0XHR0ZXN0X19za2lwKCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghQVNTRVJUX1RSVUUoZGV2X2hhc19pb2Nvc3QoKSwgXCJpb2Nvc3RfbW91bnRlZFwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2tlbCA9IGlvY29zdF9tc19fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwic2tlbF9vcGVuX2xvYWRcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IGlvY29zdF9tc19fYXR0YWNoKHNrZWwpO1xuK1x0aWYgKEFTU0VSVF9PSyhlcnIsIFwiYXR0YWNoXCIpKVxuK1x0XHRBU1NFUlRfT0soc3dpdGNoX3RvX2JwZihkZXYpLCBcInN3aXRjaF9hbmRfcmVhZGJhY2tcIik7XG4rXG4rXHRpb2Nvc3RfbXNfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjcwZjc5ODdmOGViNmFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9pb2Nvc3RfbW9kZWwuY1xuQEAgLTAsMCArMSw5MSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbisvKlxuKyAqIEV4YW1wbGUgaW9jb3N0IGNvc3QgbW9kZWw6IHRoZSBidWlsdGluIGxpbmVhciBIREQgZm9ybXVsYSB3aXRoIGFsbFxuKyAqIGNvc3RzIGRvdWJsZWQuXG4rICpcbisgKiBUaGUgY29uc3RhbnRzIG1pcnJvciB3aGF0IGNhbGNfbGNvZWZzKCkgZGVyaXZlcyBmcm9tIHRoZSBBVVRPUF9IRERcbisgKiBkZWZhdWx0cyAocmJwcz0xNzQwMTkxNzYgcnNlcWlvcHM9NDE3MDggcnJhbmRpb3BzPTM3MCwgdy1zaWRlXG4rICogYW5hbG9nKSBpbiB2dGltZSB1bml0cyB3aGVyZSAxcyA9PSAyXjM3LCBleHByZXNzZWQgd2l0aCB0aGUgc2FtZVxuKyAqIHJvdW5kLXVwIGRpdmlzaW9ucyBzbyB0aGV5IGNhbm5vdCBkcmlmdCBmcm9tIHRoZSBrZXJuZWwsIHNvIGFcbisgKiBkZXZpY2Ugc3dpdGNoZWQgdG8gY3RybD1icGYgd2l0aCB0aGlzIG1vZGVsIHJlZ2lzdGVyZWQgY2hhcmdlc1xuKyAqIGV4YWN0bHkgdHdpY2UgdGhlIGJ1aWx0aW4gbW9kZWwgdW5kZXIgdGhlIHNhbWUgd29ya2xvYWQsIHdoaWNoXG4rICogbWFrZXMgaXQgYSBjb252ZW5pZW50IHdheSB0byB2ZXJpZnkgdGhhdCBhY2NvdW50aW5nIGdvZXMgdGhyb3VnaFxuKyAqIHRoZSBCUEYgcGF0aC5cbisgKi9cbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuK1xuKy8qIFZUSU1FX1BFUl9TRUMgY29tZXMgZnJvbSB2bWxpbnV4LmggKGEgQlRGIGVudW0gY29uc3RhbnQpICovXG4rI2RlZmluZSBJT0NfUEFHRV9TSVpFXHRcdDQwOTZcbisjZGVmaW5lIElPQ19TRUNUX1RPX1BBR0VfU0hJRlRcdDNcdC8qIDUxMkIgc2VjdG9ycyB0byA0a0IgcGFnZXMgKi9cbisjZGVmaW5lIExDT0VGX1JBTkRJT19QQUdFU1x0NDA5Nlx0LyogMTZNQiBzZWVrIHRocmVzaG9sZCAqL1xuKyNkZWZpbmUgSU9DT1NUX0NPU1RfRl9NRVJHRVx0KDFVTEwgXHUwMDNjXHUwMDNjIDApXHQvKiBub3QgaW4gQlRGOiBhIHBsYWluIG1hY3JvICovXG4rXG4rLyogRElWNjRfVTY0X1JPVU5EX1VQIC8gRElWX1JPVU5EX1VQX1VMTCBlcXVpdmFsZW50cywgZm9sZGVkIGF0XG4rICogY29tcGlsZSB0aW1lICovXG4rI2RlZmluZSBSVSh4LCB5KVx0XHQoKHgpIC8gKHkpICsgKCgoeCkgJSAoeSkpID8gMSA6IDApKVxuK1xuKyNkZWZpbmUgUkJQU1x0MTc0MDE5MTc2VUxMXG4rI2RlZmluZSBSU0VRSU9QU1x0NDE3MDhVTExcbisjZGVmaW5lIFJSQU5ESU9QU1x0MzcwVUxMXG4rI2RlZmluZSBXQlBTXHQxNzgwNzU4NjZVTExcbisjZGVmaW5lIFdTRVFJT1BTXHQ0MjcwNVVMTFxuKyNkZWZpbmUgV1JBTkRJT1BTXHQzNzhVTExcbitcbisjZGVmaW5lIFJQQUdFXHQoUlUoVlRJTUVfUEVSX1NFQywgUlUoUkJQUywgSU9DX1BBR0VfU0laRSkpKVxuKyNkZWZpbmUgUlNFUUlPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlNFUUlPUFMpIC0gUlBBR0UpXG4rI2RlZmluZSBSUkFORElPXHQoUlUoVlRJTUVfUEVSX1NFQywgUlJBTkRJT1BTKSAtIFJQQUdFKVxuKyNkZWZpbmUgV1BBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShXQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4rI2RlZmluZSBXU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBXU0VRSU9QUykgLSBXUEFHRSlcbisjZGVmaW5lIFdSQU5ESU9cdChSVShWVElNRV9QRVJfU0VDLCBXUkFORElPUFMpIC0gV1BBR0UpXG4rXG4rc3RhdGljIF9fYWx3YXlzX2lubGluZSB1NjQgYnVpbHRpbl9jb3N0KHU2NCBvcCwgdTY0IG5ieXRlcywgdTY0IHNlY3RvcixcbitcdFx0XHRcdFx0dTY0IGN1cnNvciwgdTY0IGZsYWdzKVxuK3tcbitcdHU2NCBwYWdlcywgc2Vla19wYWdlcyA9IDAsIGJhc2UsIGNvZWZfcGFnZTtcbitcbitcdGlmICghbmJ5dGVzKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHN3aXRjaCAob3ApIHtcbitcdGNhc2UgUkVRX09QX1JFQUQ6XG4rXHRcdGJhc2UgPSBSU0VRSU87XG4rXHRcdGNvZWZfcGFnZSA9IFJQQUdFO1xuK1x0XHRicmVhaztcbitcdGNhc2UgUkVRX09QX1dSSVRFOlxuK1x0XHRiYXNlID0gV1NFUUlPO1xuK1x0XHRjb2VmX3BhZ2UgPSBXUEFHRTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjdXJzb3IpIHtcbitcdFx0c2Vla19wYWdlcyA9IHNlY3RvciBcdTAwM2UgY3Vyc29yID8gc2VjdG9yIC0gY3Vyc29yXG4rXHRcdFx0XHRcdCAgICAgOiBjdXJzb3IgLSBzZWN0b3I7XG4rXHRcdHNlZWtfcGFnZXMgXHUwMDNlXHUwMDNlPSBJT0NfU0VDVF9UT19QQUdFX1NISUZUO1xuK1x0XHRpZiAoc2Vla19wYWdlcyBcdTAwM2UgTENPRUZfUkFORElPX1BBR0VTKVxuK1x0XHRcdGJhc2UgPSAob3AgPT0gUkVRX09QX1JFQUQpID8gUlJBTkRJTyA6IFdSQU5ESU87XG4rXHR9XG4rXG4rXHRwYWdlcyA9IFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSk7XG4rXHRpZiAoZmxhZ3MgXHUwMDI2IElPQ09TVF9DT1NUX0ZfTUVSR0UpXG4rXHRcdGJhc2UgPSAwO1xuK1x0cmV0dXJuIGJhc2UgKyBwYWdlcyAqIGNvZWZfcGFnZTtcbit9XG4rXG4rU0VDKFwic3RydWN0X29wc1wiKVxuK3U2NCBCUEZfUFJPRyhpb2Nvc3RfMnhfY2FsY19jb3N0LCB1NjQgb3AsIHU2NCBuYnl0ZXMsIHU2NCBzZWN0b3IsXG4rXHQgICAgIHU2NCBjdXJzb3IsIHU2NCBpb2NnX2lkLCB1NjQgZmxhZ3MpXG4re1xuK1x0cmV0dXJuIDIgKiBidWlsdGluX2Nvc3Qob3AsIG5ieXRlcywgc2VjdG9yLCBjdXJzb3IsIGZsYWdzKTtcbit9XG4rXG4rU0VDKFwiLnN0cnVjdF9vcHNcIilcbitzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfMnggPSB7XG4rXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfMnhfY2FsY19jb3N0LFxuK307XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDY1ZmQ1ZDVjNjJlMFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL2lvY29zdF9tcy5jXG5AQCAtMCwwICsxLDEyMiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IFRhbyBDdWkgKi9cbisvKlxuKyAqIEV4YW1wbGUgbXVsdGktc3RyZWFtIHNlcXVlbnRpYWxpdHkgZGV0ZWN0aW9uIGNvc3QgbW9kZWwuXG4rICpcbisgKiBUaGUgYnVpbHRpbiBtb2RlbCBrZWVwcyBhIHNpbmdsZSBjdXJzb3IgcGVyIGNncm91cCwgc28gdHdvXG4rICogaW50ZXJsZWF2ZWQgc2VxdWVudGlhbCByZWFkZXJzIGluIG9uZSBjZ3JvdXAgYXJlIGFsbCBwcmljZWQgcmFuZG9tXG4rICogKG1lYXN1cmVkIDg5eCBvdmVyY2hhcmdlLCAxMi45eCB0aHJvdWdocHV0IGNvbGxhcHNlKSwgd2hpbGUgcmFuZG9tXG4rICogSU8gaW5zaWRlIGEgaG90IHdpbmRvdyBzbWFsbGVyIHRoYW4gdGhlIDE2TUIgc2VlayB0aHJlc2hvbGQgaXNcbisgKiBwcmljZWQgc2VxdWVudGlhbCAobWVhc3VyZWQgMTA3eCB1bmRlcmNoYXJnZSkuICBUaGlzIG1vZGVsIHJlcGxhY2VzXG4rICogdGhlIHNpbmdsZSBjdXJzb3Igd2l0aCBhIHBlci1jZ3JvdXAgdGFibGUgb2Ygc3RyZWFtIHNsb3RzLCBrZXllZCBieVxuKyAqIHRoZSBpb2NnX2lkIGFyZ3VtZW50OiBhbiBJTyBpcyBzZXF1ZW50aWFsIGlmZiBpdHMgc2VjdG9yIG1hdGNoZXMgdGhlXG4rICogZXhwZWN0ZWQgbmV4dCBzZWN0b3Igb2YgYW55IHRyYWNrZWQgc3RyZWFtLiAgSW50ZXJsZWF2ZWQgc3RyZWFtc1xuKyAqIGtlZXAgdGhlaXIgb3duIHNsb3RzLCBhbmQgd2luZG93ZWQgcmFuZG9tIElPIHJhcmVseSBtYXRjaGVzIGFcbisgKiBtb3ZpbmcgZXhwZWN0YXRpb24uXG4rICovXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbitcbisvKiBWVElNRV9QRVJfU0VDIGNvbWVzIGZyb20gdm1saW51eC5oIChhIEJURiBlbnVtIGNvbnN0YW50KSAqL1xuKyNkZWZpbmUgSU9DX1BBR0VfU0laRVx0XHQ0MDk2XG4rI2RlZmluZSBJT0NPU1RfQ09TVF9GX01FUkdFXHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcdC8qIG5vdCBpbiBCVEY6IGEgcGxhaW4gbWFjcm8gKi9cbitcbisvKiBESVY2NF9VNjRfUk9VTkRfVVAgLyBESVZfUk9VTkRfVVBfVUxMIGVxdWl2YWxlbnRzLCBmb2xkZWQgYXRcbisgKiBjb21waWxlIHRpbWUgKi9cbisjZGVmaW5lIFJVKHgsIHkpXHRcdCgoeCkgLyAoeSkgKyAoKCh4KSAlICh5KSkgPyAxIDogMCkpXG4rXG4rI2RlZmluZSBSQlBTXHQxNzQwMTkxNzZVTExcbisjZGVmaW5lIFJTRVFJT1BTXHQ0MTcwOFVMTFxuKyNkZWZpbmUgUlJBTkRJT1BTXHQzNzBVTExcbisjZGVmaW5lIFdCUFNcdDE3ODA3NTg2NlVMTFxuKyNkZWZpbmUgV1NFUUlPUFNcdDQyNzA1VUxMXG4rI2RlZmluZSBXUkFORElPUFNcdDM3OFVMTFxuK1xuKyNkZWZpbmUgUlBBR0VcdChSVShWVElNRV9QRVJfU0VDLCBSVShSQlBTLCBJT0NfUEFHRV9TSVpFKSkpXG4rI2RlZmluZSBSU0VRSU9cdChSVShWVElNRV9QRVJfU0VDLCBSU0VRSU9QUykgLSBSUEFHRSlcbisjZGVmaW5lIFJSQU5ESU9cdChSVShWVElNRV9QRVJfU0VDLCBSUkFORElPUFMpIC0gUlBBR0UpXG4rI2RlZmluZSBXUEFHRVx0KFJVKFZUSU1FX1BFUl9TRUMsIFJVKFdCUFMsIElPQ19QQUdFX1NJWkUpKSlcbisjZGVmaW5lIFdTRVFJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFdTRVFJT1BTKSAtIFdQQUdFKVxuKyNkZWZpbmUgV1JBTkRJT1x0KFJVKFZUSU1FX1BFUl9TRUMsIFdSQU5ESU9QUykgLSBXUEFHRSlcbitcbisjZGVmaW5lIE5TTE9UU1x0NFxuK1xuK3N0cnVjdCBzdHJlYW1zIHtcbitcdF9fdTY0IGV4cGVjdGVkW05TTE9UU107XHQvKiBuZXh0IGV4cGVjdGVkIHNlY3RvciwgcGVyIHN0cmVhbSAqL1xuK1x0X191NjQgc3RhbXBbTlNMT1RTXTtcdC8qIExSVSBzdGFtcCwgMCA9IGVtcHR5ICovXG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbitcdF9fdHlwZShrZXksIF9fdTY0KTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHN0cmVhbXMpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4rfSBzdHJlYW1fdGFiIFNFQyhcIi5tYXBzXCIpO1xuK1xuK1NFQyhcInN0cnVjdF9vcHNcIilcbit1NjQgQlBGX1BST0coaW9jb3N0X21zX2NhbGNfY29zdCwgdTY0IG9wLCB1NjQgbmJ5dGVzLCB1NjQgc2VjdG9yLFxuK1x0ICAgICB1NjQgY3Vyc29yLCB1NjQgaW9jZ19pZCwgdTY0IGZsYWdzKVxuK3tcbitcdHN0cnVjdCBzdHJlYW1zICpzO1xuK1x0dTY0IHBhZ2UsIHNlcWlvLCByYW5kaW8sIGJhc2UsIGFkdmFuY2UsIG5vdztcbitcdHUzMiBpLCB2aWN0aW0gPSAwLCBmb3VuZCA9IDB4RkZGRkZGRkY7XG4rXG4rXHRpZiAob3AgIT0gUkVRX09QX1JFQUQgXHUwMDI2XHUwMDI2IG9wICE9IFJFUV9PUF9XUklURSlcbitcdFx0cmV0dXJuIDA7XHQvKiBkZWxlZ2F0ZSB0aGUgcmVzdCB0byBidWlsdGluICovXG4rXHRpZiAoIW5ieXRlcylcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRpZiAob3AgPT0gUkVRX09QX1JFQUQpIHtcbitcdFx0cGFnZSA9IFJQQUdFOyBzZXFpbyA9IFJTRVFJTzsgcmFuZGlvID0gUlJBTkRJTztcbitcdH0gZWxzZSB7XG4rXHRcdHBhZ2UgPSBXUEFHRTsgc2VxaW8gPSBXU0VRSU87IHJhbmRpbyA9IFdSQU5ESU87XG4rXHR9XG4rXHRhZHZhbmNlID0gUlUobmJ5dGVzLCA1MTIpO1x0Lyogc2VjdG9ycyAqL1xuK1xuK1x0cyA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2c3RyZWFtX3RhYiwgXHUwMDI2aW9jZ19pZCk7XG4rXHRpZiAoIXMpIHtcbitcdFx0c3RydWN0IHN0cmVhbXMgemVybyA9IHt9O1xuK1xuK1x0XHRicGZfbWFwX3VwZGF0ZV9lbGVtKFx1MDAyNnN0cmVhbV90YWIsIFx1MDAyNmlvY2dfaWQsIFx1MDAyNnplcm8sXG4rXHRcdFx0XHQgICAgQlBGX05PRVhJU1QpO1xuK1x0XHRzID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZzdHJlYW1fdGFiLCBcdTAwMjZpb2NnX2lkKTtcbitcdFx0aWYgKCFzKVxuK1x0XHRcdHJldHVybiBzZXFpbyArIFJVKG5ieXRlcywgSU9DX1BBR0VfU0laRSkgKiBwYWdlO1xuK1x0fVxuK1xuK1x0aWYgKGZsYWdzIFx1MDAyNiBJT0NPU1RfQ09TVF9GX01FUkdFKSB7XG4rXHRcdGJhc2UgPSAwO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5vdyA9IGJwZl9rdGltZV9nZXRfbnMoKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5TTE9UUzsgaSsrKSB7XG4rXHRcdGlmIChzLVx1MDAzZWV4cGVjdGVkW2ldID09IHNlY3RvciBcdTAwMjZcdTAwMjYgcy1cdTAwM2VzdGFtcFtpXSkge1xuK1x0XHRcdGZvdW5kID0gaTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0fVxuK1x0aWYgKGZvdW5kICE9IDB4RkZGRkZGRkYpIHtcbitcdFx0YmFzZSA9IHNlcWlvO1xuK1x0XHRzLVx1MDAzZWV4cGVjdGVkW2ZvdW5kXSA9IHNlY3RvciArIGFkdmFuY2U7XG4rXHRcdHMtXHUwMDNlc3RhbXBbZm91bmRdID0gbm93O1xuK1x0fSBlbHNlIHtcbitcdFx0YmFzZSA9IHJhbmRpbztcbitcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgTlNMT1RTOyBpKyspIHtcbitcdFx0XHRpZiAocy1cdTAwM2VzdGFtcFtpXSBcdTAwM2Mgcy1cdTAwM2VzdGFtcFt2aWN0aW1dKVxuK1x0XHRcdFx0dmljdGltID0gaTtcbitcdFx0fVxuK1x0XHRzLVx1MDAzZWV4cGVjdGVkW3ZpY3RpbV0gPSBzZWN0b3IgKyBhZHZhbmNlO1xuK1x0XHRzLVx1MDAzZXN0YW1wW3ZpY3RpbV0gPSBub3c7XG4rXHR9XG4rb3V0OlxuK1x0cmV0dXJuIGJhc2UgKyBSVShuYnl0ZXMsIElPQ19QQUdFX1NJWkUpICogcGFnZTtcbit9XG4rXG4rU0VDKFwiLnN0cnVjdF9vcHNcIilcbitzdHJ1Y3QgaW9jb3N0X21vZGVsX29wcyBpb2Nvc3RfbXMgPSB7XG4rXHQuY2FsY19jb3N0ID0gKHZvaWQgKilpb2Nvc3RfbXNfY2FsY19jb3N0LFxuK307XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxMTozNjowOC43NTc0ODkxNDVaIiwiU2VxIjoxNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTY2MzMzMTA0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBLTVNBTiBGdXp6aW5nIE5lZWRzKipcblxuT2theSwgdGhlIHRhc2sgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2gsIGludHJvZHVjaW5nIEJQRiBzdHJ1Y3Rfb3BzIHBsdWdnYWJsZSBjb3N0IG1vZGVsIHN1cHBvcnQgZm9yIGJsay1pb2Nvc3QgKHNwZWNpZmljYWxseSB3aXRoIGBDT05GSUdfQkxLX0NHUk9VUF9JT0NPU1RfQlBGYCksIHJlcXVpcmVzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gTGV0J3MgZGlnIGluLlxuXG5UaGUgcGF0Y2ggdG91Y2hlcyBhIGdvb2QgY2h1bmsgb2YgY29kZTogZG9jdW1lbnRhdGlvbiwgdGhlIEtjb25maWcgYW5kIE1ha2VmaWxlIGluIHRoZSBibG9jayBzdWJzeXN0ZW0sIHRoZSBjb3JlIGlvY29zdCBCUEYgaW1wbGVtZW50YXRpb24gKGBibGstaW9jb3N0LWJwZi5jYCksIHRoZSBleGlzdGluZyBpb2Nvc3QgbG9naWMgKGBibGstaW9jb3N0LmNgKSwgaGVhZGVyIGZpbGVzIGZvciBrZXJuZWwgaW50ZXJmYWNlcyAoYGJsay1pb2Nvc3QuaGAgYW5kIHRyYWNlIGV2ZW50cyBgaW9jb3N0LmhgKSwgYW5kIHNlbGYgdGVzdHMuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBjaGFuZ2UsIHNvIHdlIG5lZWQgdG8gYmUgdGhvcm91Z2guXG5cbkZpcnN0LCBsZXQncyBsb29rIGZvciBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBgYmxrLWlvY29zdC1icGYuY2AgbG9va3MgbGlrZSB0aGUgcGxhY2UgdG8gc3RhcnQuIFRoZSBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgIGZ1bmN0aW9uIGlzIHRoZSBtYWluIGNhbmRpZGF0ZS4gSXQgdGFrZXMgc2NhbGFyIGFyZ3VtZW50cywgd2hpY2ggaXMgZ2VuZXJhbGx5IGEgZ29vZCBzaWduLiBJdCdzIHJldHVybmluZyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgc3VjY2VzcywgYW5kIHRoZW4gd3JpdGluZyB0aGUgcmVzdWx0IGludG8gYGNvc3RwYC4gSWYgYGlvY29zdF9icGZfY2FsY19jb3N0YCBmYWlscywgYSBkaWZmZXJlbnQgZnVuY3Rpb24gY2FsbGVkIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgaXMgY2FsbGVkLCBhbmQgYGJwZl9jb3N0YCB3aWxsIG5ldmVyIGJlIHVzZWQuIExvb2tzIGxpa2UgdGhlcmUgYXJlbid0IG9idmlvdXMgaXNzdWVzIHRoZXJlIGF0IGZpcnN0IGdsYW5jZS5cblxuTm93LCBsZXQncyB0dXJuIG91ciBhdHRlbnRpb24gdG8gYGJsay1pb2Nvc3QuY2AgYW5kIGhvdyBpdCBpbnRlZ3JhdGVzIHdpdGggdGhpcyBuZXcgQlBGIGZ1bmN0aW9uYWxpdHkuIFNwZWNpZmljYWxseSwgdGhlIGBjYWxjX3Z0aW1lX2Nvc3RgIGZ1bmN0aW9uLiBIZXJlJ3Mgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnM6IHRoZSBCUEYgZnVuY3Rpb24sIGlmIHByZXNlbnQsIGlzIGNhbGxlZC4gSXQgdXNlcyBgUkVBRF9PTkNFYCwgd2hpY2ggc2VlbXMgYXBwcm9wcmlhdGUuIElmIGBpb2Nvc3RfYnBmX2NhbGNfY29zdGAgcmV0dXJucyB0cnVlLCBpdCB1cGRhdGVzIGBicGZfY29zdGAsIG90aGVyd2lzZSwgaXQgY2FsbHMgYGNhbGNfdnRpbWVfY29zdF9idWlsdGluYC4gU28sIHRoZSBjb2RlcGF0aCBsb29rcyBzb3VuZC5cblxuVG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJ2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAuIEknbGwgdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBjYXJlZnVsbHkgZXhhbWluZSB0aGF0IGZ1bmN0aW9uIGFuZCBpdHMgc3Vycm91bmRpbmcgY29udGV4dC4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbHRpbiBjb3N0IGNhbGN1bGF0aW9uIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIEJQRiBjYWxjdWxhdGlvbiBkb2Vzbid0IGhhcHBlbiB3aXRob3V0IGFueSBpbml0aWFsaXphdGlvbiBwcm9ibGVtcy5cblxuQmFzZWQgb24gdGhpcyBxdWljayBhbmFseXNpcywgYW5kIGFzc3VtaW5nIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgaXMgYWxzbyBzYWZlLCBJICpzdXNwZWN0KiB0aGlzIHBhdGNoICptaWdodCBub3QqIGltbWVkaWF0ZWx5IHNjcmVhbSBcIk5lZWRzS01TQU49dHJ1ZS5cIiBIb3dldmVyLCB0aGUgaW50cm9kdWN0aW9uIG9mIEJQRiBhbHdheXMgd2FycmFudHMgZXh0cmEgc2NydXRpbnksIGJlY2F1c2Ugb2YgdGhlIHBvdGVudGlhbCBmb3IgY29tcGxleCBpbnRlcmFjdGlvbnMgYW5kIHN1YnRsZSBtZW1vcnkgaGF6YXJkcy4gSSdkIGxlYW4gdG93YXJkcyByZXF1aXJpbmcgZnVydGhlciByZXZpZXcgYW5kIHRlc3RpbmcsIGJ1dCBpdCdzIG5vdCBhIHNsYW0gZHVuayBcInllc1wiIGZvciBLTVNBTiBmdXp6aW5nICp5ZXQqLiBJJ2xsIG5lZWQgdG8gY29uZmlybSBteSB1bmRlcnN0YW5kaW5nIG9mIGBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbmAgdG8gbWFrZSBhIGZpbmFsIGNhbGwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNjQzLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODE4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MTQuNDIwODIyNDE5WiIsIlNlcSI6MTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTkxNzc1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJibG9jay9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYmxvY2svYmxrLWlvY29zdC5jPTI0NzM9c3RhdGljIHU2NCBhZGp1c3RfaW51c2VfYW5kX2NhbGNfY29zdChzdHJ1Y3QgaW9jX2dxICppb2NnLCB1NjQgdnRpbWUsXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmMtMjUzMy1cXG5ibG9jay9ibGstaW9jb3N0LmM6MjUzNDpzdGF0aWMgdm9pZCBjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbihzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBpb2NfZ3EgKmlvY2csXFxuYmxvY2svYmxrLWlvY29zdC5jLTI1MzUtXFx0XFx0XFx0XFx0ICAgIGJvb2wgaXNfbWVyZ2UsIHU2NCAqY29zdHApXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmM9MjU3OT1zdGF0aWMgdTY0IGNhbGNfdnRpbWVfY29zdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBpb2NfZ3EgKmlvY2csIGJvb2wgaXNfbWVyZ2UpXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmMtMjU5OS1cXG5ibG9jay9ibGstaW9jb3N0LmM6MjYwMDpcXHRjYWxjX3Z0aW1lX2Nvc3RfYnVpbHRpbihiaW8sIGlvY2csIGlzX21lcmdlLCBcXHUwMDI2Y29zdCk7XFxuYmxvY2svYmxrLWlvY29zdC5jLTI2MDEtXFx0cmV0dXJuIGNvc3Q7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDExOjM2OjE0LjQ2Njc0NzIyOFoiLCJTZXEiOjE3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MjE0NjIzNjI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSU9Db3N0IFRyYWNlcG9pbnQgYW5kIE1vZGVsKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nIHdpdGggYHRyYWNlX2lvY29zdF9pb2NfdGlja2AgYW5kIGl0cyBhc3NvY2lhdGVkIGFkZGl0aW9ucy4gTG9va2luZyBhdCBgaW5jbHVkZS90cmFjZS9ldmVudHMvaW9jb3N0LmhgLCBJIHNlZSB0aGUgdHJhY2Vwb2ludCBkZWZpbml0aW9uLiBJdCdzIGNhcHR1cmluZyBzZXZlcmFsIGtleSBwaWVjZXMgb2YgaW5mb3JtYXRpb246IHRoZSBkZXZpY2UgbmFtZSwgdGhlIHBlcmlvZCBpbiBtaWNyb3NlY29uZHMsIHRoZSB2aXJ0dWFsIHJhdGUsIHRoZSBidXN5IGxldmVsLCBudW1iZXIgb2YgYWN0aXZlIHJlcXVlc3RzLCB1c2FnZSBwZXJjZW50YWdlLCBhbmQgYSAncnVubmluZycgZmxhZy4gSSBub3RpY2UgdGhhdCBhbGwgb2YgdGhlc2UgZmllbGRzIGFyZSBleHBsaWNpdGx5IGFzc2lnbmVkLCB3aGljaCBpcyBnb29kIGZvciBjbGFyaXR5IGFuZCBjb250cm9sLlxuXG5Ob3csIGxldCdzIHNoaWZ0IGdlYXJzIGFuZCBsb29rIGF0IGhvdyB0aGUgY29zdCBtb2RlbCBpcyBiZWluZyBwb3B1bGF0ZWQsIHNwZWNpZmljYWxseSB3aXRoIGBpb2NfY29zdF9tb2RlbF9wcmZpbGxgLiBUaGlzIGNvZGUgc25pcHBldCB1c2VzIGBzZXFfcHJpbnRmYCB0byBvdXRwdXQgY29zdCBtb2RlbCBwYXJhbWV0ZXJzLiBJIHNlZSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZGV0ZXJtaW5pbmcgdGhlIFwiY3RybFwiIHZhbHVlIOKAkyBpdCdzIGJhc2VkIG9uIGBpb2MtXHUwMDNlYnBmX2Nvc3RfbW9kZWxgIGFuZCBgaW9jLVx1MDAzZXVzZXJfY29zdF9tb2RlbGAuIEFoLCBzbyBgaW9jLVx1MDAzZWJwZl9jb3N0X21vZGVsYCBpcyBhIGJvb2xlYW4gdmFsdWUsIHNldCB2aWEgYFdSSVRFX09OQ0VgLiBUaGlzIHRlbGxzIG1lIHdoZXRoZXIgd2UncmUgdXNpbmcgYSBCUEYtYmFzZWQgY29zdCBtb2RlbCBvciBub3QuXG5cbkkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBsaWZlY3ljbGUgb2YgdGhlIGBzdHJ1Y3QgaW9jYCBpdHNlbGYuIEkga25vdyBpdCdzIGFsbG9jYXRlZC4gSSBuZWVkIHRvIHZlcmlmeSBleGFjdGx5IGhvdyB0aGF0IGFsbG9jYXRpb24gaGFwcGVucy4gSSBzaG91bGQgY2hlY2sgYGlvY19pbml0YCBvciBgaW9jb3N0X2luaXRgIHRvIGNvbmZpcm0gbXkgYXNzdW1wdGlvbiB0aGF0IGl0J3MgYmVpbmcgemVyb2VkIG91dCB3aXRoIGBremFsbG9jYC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBgaW9jYCBzdHJ1Y3QgaXMgaGFuZGxlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQzODIsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MTguNjgxMzczNzQzWiIsIlNlcSI6MTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTA3MjE3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJremFsbG9jLippb2NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiYmxvY2svXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImJsb2NrL2Jsay1pb2Nvc3QuYz0yOTM5PXN0YXRpYyBpbnQgYmxrX2lvY29zdF9pbml0KHN0cnVjdCBnZW5kaXNrICpkaXNrKVxcbi0tXFxuYmxvY2svYmxrLWlvY29zdC5jLTI5NDMtXFxuYmxvY2svYmxrLWlvY29zdC5jOjI5NDQ6XFx0aW9jID0ga3phbGxvY19vYmooKmlvYyk7XFxuYmxvY2svYmxrLWlvY29zdC5jLTI5NDUtXFx0aWYgKCFpb2MpXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmM9MzAwND1zdGF0aWMgc3RydWN0IGJsa2NnX3BvbGljeV9kYXRhICppb2NfY3BkX2FsbG9jKGdmcF90IGdmcClcXG4tLVxcbmJsb2NrL2Jsay1pb2Nvc3QuYy0zMDA3LVxcbmJsb2NrL2Jsay1pb2Nvc3QuYzozMDA4OlxcdGlvY2MgPSBremFsbG9jX29iaihzdHJ1Y3QgaW9jX2NncnAsIGdmcCk7XFxuYmxvY2svYmxrLWlvY29zdC5jLTMwMDktXFx0aWYgKCFpb2NjKVxcbi0tXFxuYmxvY2svYmxrLWlvY29zdC5jPTMwMjE9c3RhdGljIHN0cnVjdCBibGtnX3BvbGljeV9kYXRhICppb2NfcGRfYWxsb2Moc3RydWN0IGdlbmRpc2sgKmRpc2ssXFxuLS1cXG5ibG9jay9ibGstaW9jb3N0LmMtMzAyNi1cXG5ibG9jay9ibGstaW9jb3N0LmM6MzAyNzpcXHRpb2NnID0ga3phbGxvY19ub2RlKHN0cnVjdF9zaXplKGlvY2csIGFuY2VzdG9ycywgbGV2ZWxzKSwgZ2ZwLFxcbmJsb2NrL2Jsay1pb2Nvc3QuYy0zMDI4LVxcdFxcdFxcdCAgICBkaXNrLVxcdTAwM2Vub2RlX2lkKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MTguNzMwNDU3NTgzWiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjk5ODc1Nzg0NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQXNzZXNzbWVudDogYmxrLWlvY29zdCBCUEYgU3RydWN0X09wcyBTdXBwb3J0KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBzZWUgYGlvY2AgaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5IHVzaW5nIGBremFsbG9jX29iamAuIFRoZSBgaW9jX2Nvc3RfbW9kZWxfd3JpdGVgIGZ1bmN0aW9uIGxvb2tzIHNvdW5kLCB3aXRoIHByb3BlciBsb2NraW5nIGFuZCBpbml0aWFsaXphdGlvbiBvZiBgdXNlcmAgYW5kIGBicGZgIGZsYWdzIGJhc2VkIG9uIGlucHV0IHN0cmluZ3MgKFwiYXV0b1wiLCBcInVzZXJcIiwgXCJicGZcIikuIFRoZSBCUEYgbG9naWMgaXMgY29uZGl0aW9uYWxseSBlbmFibGVkIHdpdGggYENPTkZJR19CTEtfQ0dST1VQX0lPQ09TVF9CUEZgLCBhbmQgdGhlIGZpbmFsIGBXUklURV9PTkNFYCBlbnN1cmVzIGF0b21pYyB1cGRhdGUgb2YgYGlvYy1cdTAwM2VicGZfY29zdF9tb2RlbGAuIEV2ZXJ5dGhpbmcgc2VlbXMgd2VsbC1zdHJ1Y3R1cmVkIGF0IHRoaXMgbGV2ZWwuXG5cbk5vdywgb24gdG8gdGhlIEJQRiBzdHJ1Y3Rfb3BzIHJlZ2lzdHJhdGlvbiBpbiBgYmxvY2svYmxrLWlvY29zdC1icGYuY2AuIGBicGZfaW9jb3N0X21vZGVsX29wc2AgaXMgYSBzdGF0aWMgc3RydWN0LCBhbmQgdGhlIHJlZ2lzdHJhdGlvbiBsb2dpYyB3aXRoIGBtdXRleF9sb2NrYCwgYHJjdV9hc3NpZ25fcG9pbnRlcmAsIGFuZCBgc3RhdGljX2JyYW5jaF9pbmNgIGxvb2tzIHN0YW5kYXJkIGFuZCBzYWZlLCB1dGlsaXppbmcgUkNVIHByb3Blcmx5LiBgbmV3X29wc2AgaXMgcGFzc2VkIGluIGFzIGEgcG9pbnRlci5cblxuTXkgZm9jdXMgbm93IHNoaWZ0cyB0byBwb3RlbnRpYWwgS01TQU4gaXNzdWVzIOKAkyBpbmZvIGxlYWtzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBJJ20gYWN0aXZlbHkgbG9va2luZyBmb3IgYW55IHNjZW5hcmlvIHdoZXJlIHVuaW5pdGlhbGl6ZWQga2VybmVsIGRhdGEgY291bGQgbGVhayB0byB1c2Vyc3BhY2UuIEkndmUgZ290IHRvIGJlIGV4dHJhIHRob3JvdWdoIGhlcmUuXG5cbjEuICAqKktlcm5lbC10by1Vc2Vyc3BhY2UgTGVha3M6KiogSSBzZWUgbm8gZGlyZWN0IGV4cG9zdXJlIG9mIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSB2aWEgYGNvcHlfdG9fdXNlcmAsIGBwdXRfdXNlcmAsIHNvY2tldCBvcHRpb25zLCBldGMuLCB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzLiBUaGUgb3V0cHV0cyBhcmUgYWxsIHZpYSBzYWZlIG1ldGhvZHMgLSBzZXFcXF9maWxlIGZvcm1hdHRpbmcsIHRyYWNlcG9pbnRzIHdpdGggZXhwbGljaXQgZmllbGRzLCBhbmQgc3RhbmRhcmQgc3RydWN0XFxfb3BzIHJlZ2lzdHJhdGlvbiwgd2hpY2ggYXJlIGNoZWNrZWQuXG4yLiAgKipVbmluaXRpYWxpemVkIFZhcmlhYmxlIEJyYW5jaGluZzoqKiBUaGUgY29kZSBjaGVja3MgYXJlIGFsbCBleHBsaWNpdC4gQWxsIHZhcmlhYmxlcyBsaWtlIGBicGZgLCBgdXNlcmAsIGByZXRgLCBgY29zdGAgYXJlIGluaXRpYWxpemVkIGJlZm9yZSBhbnkgdXNlLlxuMy4gICoqQ29tcGxleCBEYXRhIFN0cnVjdHVyZXM6KiogQWxsIGFsbG9jYXRpb25zIGxvb2sgbGlrZSB0aGV5IGFyZSB6ZXJvZWQuXG40LiAgKipCdWZmZXIgQm91bmQgQ2hlY2tzOioqIFRoZSBidWZmZXIgYm91bmRzIGNoZWNrcyBkb24ndCBzZWVtIGxpa2UgdGhleSBhcmUgbW9kaWZpZWQgaW4gYSB3YXkgdGhhdCB3b3VsZCBsZWFkIHRvIGV4cG9zaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuXG5cblNvLCB0aGlzIGxvb2tzIHByZXR0eSBjbGVhbi5cblxuV2hhdCBhYm91dCBvdGhlciBidWcgY2xhc3Nlcz8gQ29uY3VycmVuY3kgaXNzdWVzIHdpdGggUkNVL211dGV4L3N0YXRpYyBrZXlzIGFyZSBhIHBvc3NpYmlsaXR5LCBidXQgTE9DS0RFUCwgS0FTQU4sIGFuZCBUU0FOIHNob3VsZCBjYXRjaCB0aG9zZS4gTlVMTCBkZXJlZmVyZW5jZXMgb3IgbG9naWMgYnVncyBjb3VsZCBzdGlsbCBzbmVhayB0aHJvdWdoLCBidXQgdGhlIHN0YW5kYXJkIGtlcm5lbCBjaGVja3MgYW5kIEtBU0FOIHdpbGwgYmUgdmVyeSBlZmZlY3RpdmUgaGVyZS4gQW55IEJQRiB2ZXJpZmllciBvciBzdHJ1Y3RcXF9vcHMgaW50ZXJhY3Rpb24gYnVncyBhcmUgYWxzbyBjb3ZlcmVkIGJ5IGV4aXN0aW5nIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTi5cblxuSSdtIHN0YXJ0aW5nIHRvIGZlZWwgY29uZmlkZW50LCBidXQgbGV0J3MgZG91YmxlLWNoZWNrIGV2ZXJ5dGhpbmcuIGBpbmNsdWRlL2xpbnV4L2Jsay1pb2Nvc3QuaGAgaXMganVzdCBkZWNsYXJhdGlvbnMuIGBibG9jay9ibGstaW9jb3N0LWJwZi5jYCBsb29rcyB2ZXJ5IGNsZWFuLCB3aXRoIHNjYWxhciBhcmd1bWVudHMgcGFzc2VkIGJ5IHZhbHVlIHRvIHRoZSBCUEYgcHJvZ3JhbSwgYW5kIHRoZSBgdTY0IGNvc3RgIGlzIHRob3JvdWdobHkgY2hlY2tlZC4gVGhlIGB0cmFjZV9pb2Nvc3RfaW9jX3RpY2tgIGZ1bmN0aW9uIGlzIGFzc2lnbmluZyBhbGwgZmllbGRzIGZyb20gc2NhbGFyIHZhcmlhYmxlcyBhbmQgYGlvY2AgZmllbGRzLCB3aGljaCBpcyBnb29kLiBUaGUgYnVpbGQgYW5kIGRvYyBjaGFuZ2VzIGluIGBEb2N1bWVudGF0aW9uL2AsIGBibG9jay9LY29uZmlnYCwgYW5kIGBibG9jay9NYWtlZmlsZWAgc2VlbSBzdGFuZGFyZC4gVGhlIHVzZXJzcGFjZSBzZWxmLXRlc3RzIGFyZSBwcmVzZW50IGFuZCB3ZWxsLWRlZmluZWQuXG5cblRoZXJlZm9yZSwgbXkgY29uY2x1c2lvbiBpcyBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cbkhlcmUncyBteSBjbGVhciBLTVNBTiByZWFzb25pbmc6XG5cbiogICBUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgc3RydWN0XFxfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIGJsay1pb2Nvc3QsIGVuYWJsaW5nIGR5bmFtaWMgdnRpbWUgY29zdCBjYWxjdWxhdGlvbiB2aWEgYSBCUEYgcHJvZ3JhbS4gSXQgYWxzbyBhZGRzIGEgdHJhY2Vwb2ludCBhbmQgdXBkYXRlcyBjb3N0IG1vZGVsIGNvbnRyb2wgbG9naWMuXG4qICAgS01TQU4gaXMgZGVzaWduZWQgdG8gZGV0ZWN0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIGFuZCBrZXJuZWwtdG8tdXNlciBpbmZvIGxlYWtzLiBJbiB0aGlzIHBhdGNoLCBhbGwgbmV3IHN0cnVjdHVyZXMsIGxvY2FsIHZhcmlhYmxlcywgYW5kIHRyYWNlcG9pbnQgZmllbGRzIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkLiBCUEYgc3RydWN0XFxfb3BzIGZ1bmN0aW9ucyB0YWtlIHNjYWxhciB2YWx1ZXMgcGFzc2VkIGJ5IHZhbHVlLCBhbmQgdGhlIG91dHB1dCBgYnBmX2Nvc3RgIGlzIHdyaXR0ZW4gZGlyZWN0bHkgYW5kIGNoZWNrZWQgYmVmb3JlIGJlaW5nIHJldHVybmVkLiBObyBrZXJuZWwgbWVtb3J5IGlzIGV4cG9zZWQgdG8gdXNlciBzcGFjZSB3aXRob3V0IGluaXRpYWxpemF0aW9uLlxuKiAgIFRoZSBwcmltYXJ5IGNvbmNlcm5zIGhlcmUgYXJlIGNvbmN1cnJlbmN5L2xvY2tpbmcgc3luY2hyb25pemF0aW9uIChSQ1UsIG11dGV4LCBhbmQgc3RhdGljIGtleXMpIGFuZCBwb3RlbnRpYWwgbG9naWMgYnVncyBvciBpbnZhbGlkIGRlcmVmZXJlbmNlcy4gVGhlc2UgY29uY2VybnMgYXJlIGFscmVhZHkgYWRkcmVzc2VkIGJ5IHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi5cbiogICBUaHVzLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGRhdGEgbGVha3MsIHNvIHRoaXMgcGF0Y2ggZG9lcyAqbm90KiBuZWVkIEtNU0FOLlxuXG5MZXQncyBsb2cgdGhpcyBhcyBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1NzA5LCJPdXRwdXRUb2tlbnMiOjM2MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExNjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTE6MzY6MjguNzE4MDM5OTJaIiwiU2VxIjoyMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjcyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHN0cnVjdF9vcHMgc3VwcG9ydCAoYGlvY29zdF9tb2RlbF9vcHNgKSBmb3IgdGhlIGJsay1pb2Nvc3QgSS9PIGNncm91cCBjb250cm9sbGVyLCBhbGxvd2luZyBwbHVnZ2FibGUgQlBGLWJhc2VkIGNvc3QgY2FsY3VsYXRpb24sIGFkZHMgYSBuZXcgdHJhY2Vwb2ludCAoYGlvY29zdF9pb2NfdGlja2ApLCBhbmQgdXBkYXRlcyB0aGUgY2dyb3VwIHYyIGBpby5jb3N0Lm1vZGVsYCBpbnRlcmZhY2UuXFxuXFxuQW5hbHlzaXMgcmVnYXJkaW5nIHNhbml0aXplcnM6XFxuMS4gS01TQU4gYXBwbGljYWJpbGl0eTpcXG4tIEtNU0FOIGRldGVjdHMgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSBhbmQga2VybmVsLXRvLXVzZXIgaW5mb3JtYXRpb24gbGVha3MuXFxuLSBJbiB0aGlzIHBhdGNoLCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIHBhc3NlZCB0byBgaW9jb3N0X2JwZl9jYWxjX2Nvc3QoKWAgYW5kIHRoZSBCUEYgc3RydWN0X29wcyBjYWxsYmFjayBhcmUgc2NhbGFyIGludGVnZXIgdmFsdWVzIHBhc3NlZCBieSB2YWx1ZS5cXG4tIE91dHB1dCBwb2ludGVycyAoc3VjaCBhcyBgKmNvc3RwYCBpbiBgaW9jb3N0X2JwZl9jYWxjX2Nvc3RgKSBhcmUgd3JpdHRlbiBiZWZvcmUgcmV0dXJuLCBhbmQgYWxsIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiBgYnBmYCwgYHVzZXJgLCBgY29zdGApIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBwcmlvciB0byBicmFuY2hpbmcgb3IgdXNlLlxcbi0gVGhlIG5ldyB0cmFjZXBvaW50IGBpb2Nvc3RfaW9jX3RpY2tgIGV4cGxpY2l0bHkgYXNzaWducyBhbGwgZmllbGRzIGluIGBUUF9mYXN0X2Fzc2lnbmAuXFxuLSBObyBzdHJ1Y3RzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgaGVhcCBhbGxvY2F0aW9ucyBhcmUgY29waWVkIHRvIHVzZXJzcGFjZS5cXG5cXG4yLiBLQVNBTiAvIExPQ0tERVAgYXBwbGljYWJpbGl0eTpcXG4tIFBvdGVudGlhbCByaXNrcyBpbiB0aGlzIHBhdGNoIHJldm9sdmUgYXJvdW5kIGNvbmN1cnJlbmN5IChzeW5jaHJvbml6YXRpb24gb2YgYGlvY29zdF9icGZfbW9kZWxgIHZpYSBSQ1UsIG11dGV4ZXMsIGFuZCBzdGF0aWMga2V5cykgb3IgbG9naWMvYm91bmRzIGVycm9ycywgd2hpY2ggYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQga2VybmVsIGJ1ZyBkZXRlY3RvcnMsIExPQ0tERVAsIGFuZCBLQVNBTi5cXG5cXG5UaGVyZWZvcmUsIHRoZSBjaGFuZ2VzIGRvIG5vdCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBzdHJ1Y3Rfb3BzIHN1cHBvcnQgKGBpb2Nvc3RfbW9kZWxfb3BzYCkgZm9yIHRoZSBibGstaW9jb3N0IEkvTyBjZ3JvdXAgY29udHJvbGxlciwgYWxsb3dpbmcgcGx1Z2dhYmxlIEJQRi1iYXNlZCBjb3N0IGNhbGN1bGF0aW9uLCBhZGRzIGEgbmV3IHRyYWNlcG9pbnQgKGBpb2Nvc3RfaW9jX3RpY2tgKSwgYW5kIHVwZGF0ZXMgdGhlIGNncm91cCB2MiBgaW8uY29zdC5tb2RlbGAgaW50ZXJmYWNlLlxcblxcbkFuYWx5c2lzIHJlZ2FyZGluZyBzYW5pdGl6ZXJzOlxcbjEuIEtNU0FOIGFwcGxpY2FiaWxpdHk6XFxuLSBLTVNBTiBkZXRlY3RzIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgYW5kIGtlcm5lbC10by11c2VyIGluZm9ybWF0aW9uIGxlYWtzLlxcbi0gSW4gdGhpcyBwYXRjaCwgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gYGlvY29zdF9icGZfY2FsY19jb3N0KClgIGFuZCB0aGUgQlBGIHN0cnVjdF9vcHMgY2FsbGJhY2sgYXJlIHNjYWxhciBpbnRlZ2VyIHZhbHVlcyBwYXNzZWQgYnkgdmFsdWUuXFxuLSBPdXRwdXQgcG9pbnRlcnMgKHN1Y2ggYXMgYCpjb3N0cGAgaW4gYGlvY29zdF9icGZfY2FsY19jb3N0YCkgYXJlIHdyaXR0ZW4gYmVmb3JlIHJldHVybiwgYW5kIGFsbCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4gYGJwZmAsIGB1c2VyYCwgYGNvc3RgKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gYnJhbmNoaW5nIG9yIHVzZS5cXG4tIFRoZSBuZXcgdHJhY2Vwb2ludCBgaW9jb3N0X2lvY190aWNrYCBleHBsaWNpdGx5IGFzc2lnbnMgYWxsIGZpZWxkcyBpbiBgVFBfZmFzdF9hc3NpZ25gLlxcbi0gTm8gc3RydWN0cyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGhlYXAgYWxsb2NhdGlvbnMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UuXFxuXFxuMi4gS0FTQU4gLyBMT0NLREVQIGFwcGxpY2FiaWxpdHk6XFxuLSBQb3RlbnRpYWwgcmlza3MgaW4gdGhpcyBwYXRjaCByZXZvbHZlIGFyb3VuZCBjb25jdXJyZW5jeSAoc3luY2hyb25pemF0aW9uIG9mIGBpb2Nvc3RfYnBmX21vZGVsYCB2aWEgUkNVLCBtdXRleGVzLCBhbmQgc3RhdGljIGtleXMpIG9yIGxvZ2ljL2JvdW5kcyBlcnJvcnMsIHdoaWNoIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLCBMT0NLREVQLCBhbmQgS0FTQU4uXFxuXFxuVGhlcmVmb3JlLCB0aGUgY2hhbmdlcyBkbyBub3QgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflow6wrsh[1] Phase: Succeeded StartedAt: 2026-09-08 11:36:40 +0000 UTC FinishedAt: 2026-09-08 11:36:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-08 11:36:40 +0000 UTC FinishedAt: 2026-09-08 11:36:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2] Phase: Succeeded StartedAt: 2026-09-08 11:36:40 +0000 UTC FinishedAt: 2026-09-08 15:17:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-08 11:36:40 +0000 UTC FinishedAt: 2026-09-08 15:17:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","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-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-08 11:36:40 +0000 UTC FinishedAt: 2026-09-08 11:36:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-08 11:36:40 +0000 UTC FinishedAt: 2026-09-08 11:36:45 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-workflow6wrsh/series-workflow6wrsh-convert-artifact-3386686950/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-08 11:36:50 +0000 UTC FinishedAt: 2026-09-08 11:52:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-08 11:36:50 +0000 UTC FinishedAt: 2026-09-08 11:52:43 +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:*08544b30-5c4a-47dd-9b02-34a897b8866f,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-workflow6wrsh/series-workflow6wrsh-convert-artifact-3386686950/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": "324a81e2-00d3-4faa-9a55-a7648fa942ed", "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-workflow6wrsh/series-workflow6wrsh-build-action-2715639164/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-08 11:36:50 +0000 UTC FinishedAt: 2026-09-08 11:52:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*08544b30-5c4a-47dd-9b02-34a897b8866f,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-workflow6wrsh/series-workflow6wrsh-convert-artifact-3386686950/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": "324a81e2-00d3-4faa-9a55-a7648fa942ed", "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-workflow6wrsh/series-workflow6wrsh-build-action-2715639164/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-08 11:52:43 +0000 UTC FinishedAt: 2026-09-08 11:52:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-08 11:52:43 +0000 UTC FinishedAt: 2026-09-08 11:52:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-08 11:52:43 +0000 UTC FinishedAt: 2026-09-08 11:52:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-08 11:52:43 +0000 UTC FinishedAt: 2026-09-08 11:52:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","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-workflow6wrsh/series-workflow6wrsh-convert-artifact-3087502649/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-08 11:52:53 +0000 UTC FinishedAt: 2026-09-08 11:55:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-08 11:52:54 +0000 UTC FinishedAt: 2026-09-08 11:55:19 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*324a81e2-00d3-4faa-9a55-a7648fa942ed,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-workflow6wrsh/series-workflow6wrsh-build-action-2715639164/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-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-08 11:55:28 +0000 UTC FinishedAt: 2026-09-08 11:55:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-08 11:55:28 +0000 UTC FinishedAt: 2026-09-08 11:55:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-08 11:55:28 +0000 UTC FinishedAt: 2026-09-08 12:11:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-08 11:55:28 +0000 UTC FinishedAt: 2026-09-08 12:11:48 +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:*08544b30-5c4a-47dd-9b02-34a897b8866f,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-workflow6wrsh/series-workflow6wrsh-convert-artifact-3087502649/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": "07f0cfcf-8d62-45b1-ab31-8ac65d6b97a8", "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-workflow6wrsh/series-workflow6wrsh-build-action-2093180437/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-08 11:55:28 +0000 UTC FinishedAt: 2026-09-08 12:11:38 +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:*08544b30-5c4a-47dd-9b02-34a897b8866f,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-workflow6wrsh/series-workflow6wrsh-convert-artifact-3087502649/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": "07f0cfcf-8d62-45b1-ab31-8ac65d6b97a8", "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-workflow6wrsh/series-workflow6wrsh-build-action-2093180437/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-08 12:11:48 +0000 UTC FinishedAt: 2026-09-08 12:11:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-08 12:11:48 +0000 UTC FinishedAt: 2026-09-08 12:11:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-08 12:11:48 +0000 UTC FinishedAt: 2026-09-08 12:13:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-08 12:11:48 +0000 UTC FinishedAt: 2026-09-08 12:13:36 +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:*07f0cfcf-8d62-45b1-ab31-8ac65d6b97a8,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-workflow6wrsh/series-workflow6wrsh-build-action-2093180437/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-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-08 12:13:45 +0000 UTC FinishedAt: 2026-09-08 15:17:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-08 12:13:45 +0000 UTC FinishedAt: 2026-09-08 15:17:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"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:*324a81e2-00d3-4faa-9a55-a7648fa942ed,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*07f0cfcf-8d62-45b1-ab31-8ac65d6b97a8,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-workflow6wrsh/series-workflow6wrsh-build-action-2715639164/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-workflow6wrsh/series-workflow6wrsh-build-action-2093180437/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-08 12:13:45 +0000 UTC FinishedAt: 2026-09-08 12:13:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-08 12:13:45 +0000 UTC FinishedAt: 2026-09-08 12:13:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"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-workflow6wrsh/series-workflow6wrsh-convert-artifact-1362312110/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-08 12:13:45 +0000 UTC FinishedAt: 2026-09-08 12:13:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-08 12:13:45 +0000 UTC FinishedAt: 2026-09-08 12:13:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-08 12:13:45 +0000 UTC FinishedAt: 2026-09-08 12:13:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-08 12:13:55 +0000 UTC FinishedAt: 2026-09-08 15:17:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow6wrsh[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"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-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["bpf","fs"],"focus_symbols":["iocost_bpf_calc_cost","bpf_iocost_reg","bpf_iocost_unreg","ioc_cost_model_write","ioc_cost_model_prfill","calc_vtime_cost"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"944a035ecca915ae947905dcfb03f2b9dc6d032c","config_name":"upstream-apparmor-kasan.config","enable_configs":["BLK_CGROUP_IOCOST_BPF","BLK_CGROUP_IOCOST","BLK_CGROUP","BPF_SYSCALL","BPF_JIT"],"series_id":"da43f7cc-b8ea-45e2-898a-52699aaec518","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-08 12:13:55 +0000 UTC FinishedAt: 2026-09-08 15:17:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*324a81e2-00d3-4faa-9a55-a7648fa942ed,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*07f0cfcf-8d62-45b1-ab31-8ac65d6b97a8,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-workflow6wrsh/series-workflow6wrsh-build-action-2715639164/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-workflow6wrsh/series-workflow6wrsh-build-action-2093180437/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-workflow6wrsh/series-workflow6wrsh-convert-artifact-1362312110/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,}