Name: series-workflowkz254 Phase: Succeeded StartedAt: 2026-08-27 10:44:45 +0000 UTC FinishedAt: 2026-08-27 14:55:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[0] Phase: Succeeded StartedAt: 2026-08-27 10:44:45 +0000 UTC FinishedAt: 2026-08-27 11:13:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[0].run-triage Phase: Succeeded StartedAt: 2026-08-27 10:44:45 +0000 UTC FinishedAt: 2026-08-27 11:13:12 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "48b69cc8825d411a4c4df32de854434e9235a1b0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "48b69cc8825d411a4c4df32de854434e9235a1b0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG" ], "series_id": "bde1e734-5682-40b9-aabe-2982eab01142" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI3IDExOjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBlQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHdoaWNoIGFjdHMgYXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmcm9tIGVCUEYgcHJvZ3JhbXMuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbGxvY2F0ZSBvciBpbml0aWFsaXplIGNvbXBsZXggc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUga2Z1bmMgYXJlIHZhbGlkYXRlZCBieSB0aGUgQlBGIHZlcmlmaWVyIChhIHZhbGlkIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBzY2FsYXIgc2l6ZSkuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgbGlrZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgb3IgbG9ja2luZyBidWdzIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCB0aGF0IGFsbG93cyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoaXMgZXhwb3NlcyBjb3JlIG1lbW9yeSByZWNsYWltIGxvZ2ljIChgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2ApIHRvIEJQRiBwcm9ncmFtcywgd2hpY2ggaXMgYSBuZXcgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBpdCBoYW5kbGVzIHZhcmlvdXMgaW5wdXRzIGFuZCBjb250ZXh0cyBjb3JyZWN0bHkgd2l0aG91dCBjYXVzaW5nIGRlYWRsb2NrcyBvciBtZW1vcnkgY29ycnVwdGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGJjOGE2MDlmYzcxYmZkOTNhNGNjYWYyNDlhMTdiNWIxM2M1ZDY4ZmFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEF1ZyAyNyAxMToxMjozMCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgJiM0Mzs2LDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG5AQCAtMTU5LDYgJiM0MzsxNjAsNDkgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZTogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG92ZXJ3cml0ZXNcbiYjNDM7ICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4mIzQzOyAqIHJlY2xhaW0gc3RhdGUuIFJlY2xhaW0gd2luZG93cyBhcmUgbWFya2VkIHdpdGggUEZfTUVNQUxMT0M7XG4mIzQzOyAqIHJlY2xhaW1fc3RhdGUgaXMgYWxzbyBjaGVja2VkIGJlY2F1c2UgaXQgaXMgaW5zdGFsbGVkIHNsaWdodGx5XG4mIzQzOyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAoY3VycmVudC1cdTAwM2VmbGFncyBcdTAwMjYgUEZfTUVNQUxMT0MpIHx8IGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4mIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4mIzQzOyAqXG4mIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiYjNDM7ICogbWVtb3J5LnJlY2xhaW0sIGJ1dCB3aXRob3V0IHJldHJ5aW5nIHVudGlsIEBzaXplIGlzIHJlYWNoZWQuXG4mIzQzOyAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcbiYjNDM7ICogbWF5IGRlYWRsb2NrIG9uIGl0IHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXG4mIzQzOyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2Ugb3IgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0gY29udGV4dC5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiYjNDM7XHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7XG4mIzQzO1xuJiM0MztcdGlmIChzaXplIFx1MDAzYyBQQUdFX1NJWkUgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuJiM0MztcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBOVUxMKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbiYjNDM7fVxuJiM0MztcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3Miw2ICYjNDM7MjE2LDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4mIzQzO1xuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjEyNzBkNzNjOTExNmVcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCAmIzQzOzEsNDgwIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbWl0cy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9oZWxwZXJzLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfYXJncyB7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4mIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4mIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbiYjNDM7I2RlZmluZSBSRUFEX1RJTUVTIDUwXG4mIzQzO1xuJiM0MzsjZGVmaW5lIENHX0RJUiBcJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbVwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcJiMzNDsvaGlnaFwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwmIzM0Oy9sb3dcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4mIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXG4mIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4mIzQzOyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbiYjNDM7ICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcbiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuJiM0MzsgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN0YXRmcyBzdDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFzdGF0ZnMoXCYjMzQ7L3RtcFwmIzM0OywgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7LlwmIzM0OztcbiYjNDM7XHRyZXR1cm4gXCYjMzQ7L3RtcFwmIzM0OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xuJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4mIzQzOyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4mIzQzOyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxuJiM0MzsgKi9cbiYjNDM7ZW51bSBjaGlsZF9leGl0X2NvZGUge1xuJiM0MztcdENISUxEX0VYSVRfT0sgPSAwLFxuJiM0MztcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4mIzQzO1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuJiM0MztcdENISUxEX0VYSVRfUkVBRF9GSUxFLFxuJiM0MztcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuJiM0Mzt7XG4mIzQzO1x0c3dpdGNoIChjb2RlKSB7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX09LOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3N1Y2Nlc3NcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O2pvaW4gY2dyb3VwXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3dyaXRlIGRhdGEgZmlsZVwmIzM0OztcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3JlYWQgZGF0YSBmaWxlXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7d3JpdGUgdGltZSBmaWxlXCYjMzQ7O1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7dW5rbm93blwmIzM0OztcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcdGNoYXIgbGltaXRfYnVmWzIwXTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcJiMzNDttZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCYjMzQ7JWx1XCYjMzQ7LCBDR19MSU1JVCk7XG4mIzQzO1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkubWF4XCYjMzQ7LCBsaW1pdF9idWYpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlXG4mIzQzO1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbiYjNDM7XHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghYWNjZXNzKFwmIzM0Oy9wcm9jL3N3YXBzXCYjMzQ7LCBGX09LKSkge1xuJiM0MztcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkuc3dhcC5tYXhcJiMzNDssIFwmIzM0OzBcJiMzNDspO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ISUdIX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19MT1dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwmIzM0O2dldF9jZ3JvdXBfaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4mIzQzO1x0Y2hhciAqYnVmZmVyO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcJiMzNDt3YlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFmcClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xuJiM0MztcdGlmICghYnVmZmVyKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZwO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoYnVmZmVyLCAmIzM5O0EmIzM5OywgQlVGRkVSX1NJWkUpO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4mIzQzO1x0XHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFx1MDAzYyBCVUZGRVJfU0laRSA/XG4mIzQzO1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRcdHdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmcmVlKGJ1ZmZlcik7XG4mIzQzO2NsZWFudXBfZnA6XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbiYjNDM7XHRjaGFyICptYXA7XG4mIzQzO1x0c2l6ZV90IGk7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcdHN0cnVjdCBzdGF0IHNiO1xuJiM0MztcbiYjNDM7XHRmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoZmQgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O0ZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTtcbiYjNDM7XHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHtcbiYjNDM7XHRcdFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cbiYjNDM7XHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuJiM0MztcdFx0XHQodm9pZCl2O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwX2ZkOlxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4mIzQzO1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbiYjNDM7XHRkb3VibGUgZWxhcHNlZDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbiYjNDM7XG4mIzQzO1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNnN0YXJ0KTtcbiYjNDM7XG4mIzQzO1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xuJiM0MztcbiYjNDM7XHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xuJiM0MztcbiYjNDM7XHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO1xuJiM0MztcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MztcbiYjNDM7XHRcdCAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7XG4mIzQzO1x0cHJpbnRmKFwmIzM0OyUuNmZcXG5cJiMzNDssIGVsYXBzZWQpO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XG4mIzQzO1x0ZnByaW50ZihmcCwgXCYjMzQ7JS42ZlwmIzM0OywgZWxhcHNlZCk7XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcdGNoYXIgYnVmWzY0XTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcJiMzNDtmZ2V0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGlmIChzc2NhbmYoYnVmLCBcJiMzNDslbGZcJiMzNDssIHRpbWUpICE9IDEpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7c3NjYW5mICVzXCYjMzQ7LCBidWYpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuJiM0MztcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xuJiM0MztcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbiYjNDM7XHRwaWRfdCB3YWl0X3JldDtcbiYjNDM7XHRpbnQgZmQsIHN0YXR1cztcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OywgZGlyKTtcbiYjNDM7XHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcdHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGxvd19waWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCYjMzQ7Zm9yayBsb3dcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChsb3dfcGlkID09IDApXG4mIzQzO1x0XHRfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4mIzQzO1xuJiM0MztcdGhpZ2hfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcJiMzNDtmb3JrIGhpZ2hcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChoaWdoX3BpZCA9PSAwKVxuJiM0MztcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuJiM0MztcbiYjNDM7XHR3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCYjMzQ7bG93IHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXG4mIzQzO1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4mIzQzO1x0ICovXG4mIzQzO1x0bG93X3BpZCA9IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2xvdyBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7bG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4mIzQzO1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0d2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcJiMzNDtoaWdoIHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuJiM0MztcdGhpZ2hfcGlkID0gLTE7XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7aGlnaCBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7aGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuJiM0MztcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAobG93X3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuJiM0MztcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcbiYjNDM7XHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuJiM0MztcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuJiM0MztcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xuJiM0MztcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4mIzQzO1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4mIzQzO1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuJiM0MztcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuJiM0MztcdH07XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuJiM0MztcdFx0LmN0eF9pbiA9IFx1MDAyNmFyZ3MsXG4mIzQzO1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuJiM0MztcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyb3Jfb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCYjMzQ7cHJvZ19pbml0IHJldHZhbFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XG4mIzQzO1x0KnNrZWxfcHRyID0gc2tlbDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2Vycm9yX291dDpcbiYjNDM7XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW0odm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfYnBmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuJiM0MztcdCAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbVxuJiM0MztcdCAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX2NhbGxzLCAwLCBcJiMzNDtyZWNsYWltX2NhbGxzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgMCwgXCYjMzQ7cmVjbGFpbWVkX2J5dGVzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpXG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWZcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChza2VsKVxuJiM0MztcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iMmNhNTE4NTE1MGZlXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICYjNDM7MSwxODEgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfZXhwZXJpbWVudGFsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbiYjNDM7I2RlZmluZSBQQUdFX1NJWkVcdFx0NDA5NlVMXG4mIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSXHQzMlxuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5XG4mIzQzOyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLlxuJiM0MzsgKi9cbiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7XG4mIzQzO3U2NCByZWNsYWltZWRfYnl0ZXM7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbiYjNDM7e1xuJiM0MztcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIWNtLVx1MDAzZWNncnApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuJiM0MztcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuJiM0MztcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4mIzQzO1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4mIzQzO1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4mIzQzO1x0XHRcdFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbFxuJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGN1ciwgZGVsdGE7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbiYjNDM7XHQqcHJldl9ldmVudCA9IGN1cjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFucilcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRyZWNsYWltZWRfYnl0ZXMgJiM0Mzs9IG5yO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7XG4mIzQzO1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4mIzQzO1x0dTY0IHByZXZfZXZlbnQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO1x0X190eXBlKGtleSwgX191MzIpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuJiM0Mzt9IHdxX21hcCBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xuJiM0MztcbiYjNDM7XHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4mIzQzO1x0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcbiYjNDM7XHRcdHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpO1xuJiM0MztcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbiYjNDM7e1xuJiM0MztcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4mIzQzO1x0aWYgKCFlbGVtKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGltZXJfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuJiM0MztcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuJiM0MztcbiYjNDM7XHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjcgMTE6MTI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYmM4YTYwOWZjNzFiZmQ5M2E0Y2NhZjI0OWExN2I1YjEzYzVkNjhmYQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgQXVnIDI3IDExOjEyOjMwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDQ5IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzCiYjNDM7ICogY3VycmVudC0mZ3Q7cmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlcgomIzQzOyAqIHJlY2xhaW0gc3RhdGUuIFJlY2xhaW0gd2luZG93cyBhcmUgbWFya2VkIHdpdGggUEZfTUVNQUxMT0M7CiYjNDM7ICogcmVjbGFpbV9zdGF0ZSBpcyBhbHNvIGNoZWNrZWQgYmVjYXVzZSBpdCBpcyBpbnN0YWxsZWQgc2xpZ2h0bHkKJiM0MzsgKiBiZWZvcmUgUEZfTUVNQUxMT0MuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIChjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQykgfHwgY3VycmVudC0mZ3Q7cmVjbGFpbV9zdGF0ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhIGZpbGVzeXN0ZW0gbG9jayBoZWxkOiB0aGUgcmVjbGFpbSBwYXRoCiYjNDM7ICogbWF5IGRlYWRsb2NrIG9uIGl0IHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpcwomIzQzOyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2Ugb3IgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0gY29udGV4dC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7CiYjNDM7CiYjNDM7CWlmIChzaXplICZsdDsgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJbnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSwKJiM0MzsJCQkJCQkgICAgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8CiYjNDM7CQkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJCSAgICBOVUxMKTsKJiM0MzsKJiM0MzsJcmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTsKJiM0Mzt9CiYjNDM7CiBfX2JwZl9rZnVuY19lbmRfZGVmcygpOwogCiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcykKQEAgLTE3Miw2ICYjNDM7MjE2LDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKIAomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSkKJiM0MzsKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xMjcwZDczYzkxMTZlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDQ4MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKQomIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDEKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwCiYjNDM7ICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGQKJiM0MzsgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkCiYjNDM7ICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUKJiM0MzsgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiYjNDM7ICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdGZzIHN0OwomIzQzOwomIzQzOwlpZiAoIXN0YXRmcygmIzM0Oy90bXAmIzM0OywgJmFtcDtzdCkgJmFtcDsmYW1wOwomIzQzOwkgICAgKHN0LmZfdHlwZSA9PSBUTVBGU19NQUdJQyB8fCBzdC5mX3R5cGUgPT0gUkFNRlNfTUFHSUMpKQomIzQzOwkJcmV0dXJuICYjMzQ7LiYjMzQ7OwomIzQzOwlyZXR1cm4gJiMzNDsvdG1wJiMzNDs7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzbwomIzQzOyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWQKJiM0MzsgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlcwomIzQzOyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLgomIzQzOyAqLwomIzQzO2VudW0gY2hpbGRfZXhpdF9jb2RlIHsKJiM0MzsJQ0hJTERfRVhJVF9PSyA9IDAsCiYjNDM7CUNISUxEX0VYSVRfSk9JTl9DR1JPVVAsCiYjNDM7CUNISUxEX0VYSVRfV1JJVEVfRklMRSwKJiM0MzsJQ0hJTERfRVhJVF9SRUFEX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfVElNRV9GSUxFLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKQomIzQzO3sKJiM0MzsJc3dpdGNoIChjb2RlKSB7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9PSzoKJiM0MzsJCXJldHVybiAmIzM0O3N1Y2Nlc3MmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOgomIzQzOwkJcmV0dXJuICYjMzQ7am9pbiBjZ3JvdXAmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDt3cml0ZSBkYXRhIGZpbGUmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1JFQURfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3JlYWQgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDt3cml0ZSB0aW1lIGZpbGUmIzM0OzsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCXJldHVybiAmIzM0O3Vua25vd24mIzM0OzsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsJY2hhciBsaW1pdF9idWZbMjBdOwomIzQzOwomIzQzOwlyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJcmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgJiMzNDttZW1vcnkmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtlbmFibGVfY29udHJvbGxlcnMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksICYjMzQ7JWx1JiMzNDssIENHX0xJTUlUKTsKJiM0MzsJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCAmIzM0O21lbW9yeS5tYXgmIzM0OywgbGltaXRfYnVmKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXgmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZQomIzQzOwkgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlbgomIzQzOwkgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0hJR0hfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfTE9XX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpOwomIzQzOwlwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7CiYjNDM7CXBpZF90IHdhaXRfcmV0OwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy53cV9wcm9nX2luaXQpOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5iMmNhNTE4NTE1MGZlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwxODEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRAkxCiYjNDM7I2RlZmluZSBQQUdFX1NJWkUJCTQwOTZVTAomIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFCQkoMzIgKiBQQUdFX1NJWkUpCiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSCTMyCiYjNDM7CiYjNDM7c3RydWN0IGJwZl9hcmdzIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnA7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOy8qCiYjNDM7ICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnkKJiM0MzsgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS4KJiM0MzsgKi8KJiM0Mzt1NjQgcmVjbGFpbV9jYWxsczsKJiM0Mzt1NjQgcmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csCiYjNDM7CQlicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sCiYjNDM7CQkJCSAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wKJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKQomIzQzO3sKJiM0MzsJdTY0IGN1ciwgZGVsdGE7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgJmFtcDtjdXIpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50OwomIzQzOwkqcHJldl9ldmVudCA9IGN1cjsKJiM0MzsKJiM0MzsJcmV0dXJuIGRlbHRhICZndDs9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZWNsYWltX2NhbGxzJiM0MzsmIzQzOzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7CiYjNDM7CiYjNDM7CQlpZiAoIW5yKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcmVjbGFpbWVkX2J5dGVzICYjNDM7PSBucjsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CiYjNDM7CWlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsICZhbXA7ZWxlbS0mZ3Q7cHJldl9ldmVudCwKJiM0MzsJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHsKJiM0MzsJCXJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpOwomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgcmVjbGFpbV93b3JrX2ZuLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9pbml0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsICZhbXA7d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB3cV90aW1lcl9jYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwllbGVtLSZndDtwcmV2X2V2ZW50ID0gMDsKJiM0MzsJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CWVsZW0tJmd0O2NoZWNrX25zID0gY3R4LSZndDtjaGVja19uczsKJiM0MzsKJiM0MzsJd3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtJmd0O2hpZ2hfY2dyb3VwX2lkOwomIzQzOwl3cV9sb3dfY2dyb3VwX2lkID0gY3R4LSZndDtsb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NzEzCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMzcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTmV3IEJQRiBQcm9hY3RpdmUgUmVjbGFpbSBGdW5jdGlvbioqCgpPa2F5LCBzbyB0aGVyZSYjMzk7cyBhIG5ldyBwYXRjaCBhZGRpbmcgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGtmdW5jIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gVGhpcyBpcyBpbnRyaWd1aW5nIOKAkyBpdCBnaXZlcyBCUEYgcHJvZ3JhbXMgdGhlIGFiaWxpdHkgdG8gdHJpZ2dlciBtZW1vcnkgcmVjbGFpbSB3aXRoaW4gYSBtZW1vcnkgY2dyb3VwLiBNeSBpbml0aWFsIHRob3VnaHQgaXM6IHRoaXMgbmVlZHMgYSB0aG9yb3VnaCBsb29rLiBJdCYjMzk7cyBhIG5ldyBCUEYgZW50cnkgcG9pbnQsIG1lYW5pbmcgaXQmIzM5O3MgYSBuZXcgYXR0YWNrIHN1cmZhY2UsIGFuZCBjb3VsZCBwb3RlbnRpYWxseSBpbnRlcmFjdCB3aXRoIGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIHBhdGNoIGFsc28gaW5jbHVkZXMgYSBzZWxmdGVzdCwgd2hpY2ggaXMgZ29vZCwgYnV0IGRvZXNuJiMzOTt0IHJlcGxhY2UgbXkgb3duIHNjcnV0aW55LgoKTGV0JiMzOTtzIGRpc3NlY3QgdGhlIGltcGxlbWVudGF0aW9uOiB0aGUgY29yZSBvZiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBpcyBzdHJhaWdodGZvcndhcmQsIGl0IGNoZWNrcyB0aGUgaW5wdXQgc2l6ZSBhbmQgcmVjbGFpbSBjb250ZXh0LiBJZiBpdCYjMzk7cyBzYWZlIGl0IGNhbGxzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC4gR2l2ZW4gdGhhdCB0aGlzIGlzIG5ldyBmdW5jdGlvbmFsaXR5IHRoYXQgZGlyZWN0bHkgaW1wYWN0cyBtZW1vcnkgcmVjbGFpbSBsb2dpYywgaXQmIzM5O3MgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMga2Z1bmMgaXMgYWRkZWQgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdCBmb3IgdGhlIGZ1enppbmcgc2V0dXAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgbmV3IGVudHJ5cG9pbnQsIGl0cyBwcmVjb25kaXRpb25zLCBhbmQgYW55IHBvdGVudGlhbCBzaWRlIGVmZmVjdHMuCgpOZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IGhvdyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBpcyBhY3R1YWxseSBjb21waWxlZCBhbmQgcmVhY2hhYmxlLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIGBtbS9NYWtlZmlsZWAgdG8gc2VlIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBgYnBmX21lbWNvbnRyb2wuY2AgZ2V0cyBpbmNsdWRlZCBhbmQgYnVpbHQuIFVuZGVyc3RhbmRpbmcgaXRzIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgaW5jbHVzaW9uIHByb2Nlc3MgaXMgY3JpdGljYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIG92ZXJhbGwgYXR0YWNrIHN1cmZhY2UgYW5kIGVuc3VyaW5nIGNvcnJlY3QgZnV6emluZyBzZXR1cC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticGZfbWVtY29udHJvbC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI3IDExOjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNTAzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgdGhvdWdodHMsIGZvcm1hdHRlZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipBc3Nlc3NpbmcgQlBGIGFuZCBNZW1vcnkgQ0dyb3VwcyBpbiB0aGUgS2VybmVsKioKCkFscmlnaHQsIHNvIHRoZSB0YXNrIGF0IGhhbmQgbG9va3MgdG8gYmUgZGVwZW5kZW50IG9uIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX01FTUNHYC4gVGhvc2UgYXJlIHRoZSBiYXNlbGluZSByZXF1aXJlbWVudHMsIHdoaWNoIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTm93LCBJIHNob3VsZCBpbnZlc3RpZ2F0ZSBmdXJ0aGVyOyBtYXliZSBzb21lIG90aGVyIG9ic2N1cmUgZmVhdHVyZXMgYXJlIGJyb3VnaHQgaW4gdG9vPwoKYGJwZl9pbl9yZWNsYWltX2NvbnRleHRgIGp1bXBzIG91dCBhdCBtZSBhcyBhIHBvdGVudGlhbCBwb2ludCBvZiBpbnRlcmVzdC4gSXQmIzM5O3MgbWFya2VkIGFzIGEgc3RhdGljIGhlbHBlciwgc28gaXQgaXMgcXVpdGUgcG9zc2libHkgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdGhhdCBtaWdodCBiZSBhZGRlZCB0byBteSB3b3JrLgoKQW5kIG5vdyBJIHNob3VsZCBwcm9iYWJseSBjaGVjayBgbW0vdm1zY2FuLmNgLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGxvb2sgY2xvc2VseSBhdCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoaXMgd2lsbCBsaWtlbHkgcmV2ZWFsIGhvdyBwYWdlcyBhcmUgYWN0dWFsbHkgZnJlZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgbWVtb3J5IGNncm91cCwgYW5kIHdoZXRoZXIgbXkgcHJldmlvdXMgZmluZGluZ3MgYXJlIHBlcnRpbmVudC4gVW5kZXJzdGFuZGluZyB0aGlzIGlzIGtleSB0byBnZXR0aW5nIHRoZSBjb21wbGV0ZSBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI3IDExOjEyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vYnBmX21lbWNvbnRyb2wuYz0xNTg9X19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0xNjMtLypcbm1tL2JwZl9tZW1jb250cm9sLmM6MTY0OiAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZTogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG92ZXJ3cml0ZXNcbm1tL2JwZl9tZW1jb250cm9sLmMtMTY1LSAqIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlclxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmM9MTg5PV9fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE5Ni1cbm1tL2JwZl9tZW1jb250cm9sLmM6MTk3Olx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTk4LVx0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYz0xNDgxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNTIyOlx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMy1cdFx0XHRcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE1NDA9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1My1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNTU0Olx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1NS1cdFx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL21lbWNvbnRyb2wuYz0yMzI4PXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2xhaW1faGlnaChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vbWVtY29udHJvbC5jLTIzNDMtXHRcdHBzaV9tZW1zdGFsbF9lbnRlcihcdTAwMjZwZmxhZ3MpO1xubW0vbWVtY29udHJvbC5jOjIzNDQ6XHRcdG5yX3JlY2xhaW1lZCAmIzQzOz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjM0NS1cdFx0XHRcdFx0XHRcdGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYz0yNTk1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYy0yNjU0LVx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjY1NTpcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxubW0vbWVtY29udHJvbC5jLTI2NTYtXHRcdFx0XHRcdFx0ICAgIGdmcF9tYXNrLCByZWNsYWltX29wdGlvbnMsIE5VTEwpO1xuLS1cbm1tL21lbWNvbnRyb2wuYz00NzY4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDgwMi1cbm1tL21lbWNvbnRyb2wuYzo0ODAzOlx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXG5tbS9tZW1jb250cm9sLmMtNDgwNC1cdFx0XHRcdFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ4MjA9c3RhdGljIHNzaXplX3QgbWVtb3J5X21heF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC5jLTQ4NTQtXHRcdGlmIChucl9yZWNsYWltcykge1xubW0vbWVtY29udHJvbC5jOjQ4NTU6XHRcdFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcbm1tL21lbWNvbnRyb2wuYy00ODU2LVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcbi0tXG5tbS92bXNjYW4uYz02NzIyPXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vdm1zY2FuLmMtNjc2MS1cbm1tL3Ztc2Nhbi5jOjY3NjI6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL3Ztc2Nhbi5jLTY3NjMtXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vdm1zY2FuLmMtNjgwMi0jZWxzZVxubW0vdm1zY2FuLmM6NjgwMzp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjgwNC1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYz03ODY2PWludCB1c2VyX3Byb2FjdGl2ZV9yZWNsYWltKGNoYXIgKmJ1Zixcbi0tXG5tbS92bXNjYW4uYy03OTMzLVx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xubW0vdm1zY2FuLmM6NzkzNDpcdFx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxubW0vdm1zY2FuLmMtNzkzNS1cdFx0XHRcdFx0XHQgYmF0Y2hfc2l6ZSwgZ2ZwX21hc2ssXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjcgMTE6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIxNDYKCQkJCQkJCW91dHB1dDogMTQyCgkJCQkJCQl0aG91Z2h0czogMjIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoJiMzOTtzIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgYSBuZXcgQlBGIGtmdW5jLiBHaXZlbiBteSBleHBlcmllbmNlLCBJIGltbWVkaWF0ZWx5IHNlZSB0aGUgZnV6emluZyBpbXBsaWNhdGlvbnMuIFRoaXMgaXMgZGVmaW5pdGVseSB3b3J0aCBleHBsb3JpbmcgdGhvcm91Z2hseS4gTXkgcHJpbWFyeSBmb2N1cyBzaG91bGQgYmUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAuCgpJIGRvdWJsZS1jaGVja2VkOyB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMgYXJlIGp1c3QgYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kIGBDT05GSUdfTUVNQ0dgLCB3aGljaCBpcyBzdGFuZGFyZCBmb3IgQlBGIGludGVyYWN0aW9uIHdpdGggbWVtb3J5IGNvbnRyb2wgZ3JvdXBzLiBOb3RoaW5nIHVudXN1YWwgdGhlcmUuIFRoZSBkb2N1bWVudGF0aW9uIGNvbmZpcm1zIHRoYXQgdGhpcyBuZXcga2Z1bmMgaXMgdGhlIG9ubHkgQVBJIGJlaW5nIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UuCgpOb3csIGxldCYjMzk7cyBjb25zb2xpZGF0ZSBteSBmaW5kaW5ncyBpbnRvIGEgZm9ybWFsIHJlc3BvbnNlLiBJdCYjMzk7cyBjbGVhcjogdGhpcyAqaXMqIHdvcnRoIGZ1enppbmcuIEkmIzM5O2xsIG5lZWQgdG8gZm9jdXMgb24gYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAuIFRoZSBhY3RpdmF0aW9uIGNvbmZpZ3Mgd2lsbCBiZSBgQlBGX1NZU0NBTExgIGFuZCBgTUVNQ0dgLiBNeSByZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOiBhIG5ldyBCUEYgQVBJIHNwZWNpZmljYWxseSB0YXJnZXRpbmcgbWVtb3J5IG1hbmFnZW1lbnQgbmVjZXNzaXRhdGVzIHJpZ29yb3VzIGZ1enppbmcgdG8gZXZhbHVhdGUgaXQgYWdhaW5zdCBtYWxpY2lvdXMgaW5wdXRzIG9yIG1pc2NvbmZpZ3VyZWQgY29udGV4dHMsIGFuZCBhbnkgcG90ZW50aWFsIGlzc3VlcyByZWdhcmRpbmcgbWVtb3J5IG1hbmFnZW1lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjcgMTE6MTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtNRU1DRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCB0aGF0IGFsbG93cyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoaXMgZXhwb3NlcyBjb3JlIG1lbW9yeSByZWNsYWltIGxvZ2ljIChgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2ApIHRvIEJQRiBwcm9ncmFtcywgd2hpY2ggaXMgYSBuZXcgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBpdCBoYW5kbGVzIHZhcmlvdXMgaW5wdXRzIGFuZCBjb250ZXh0cyBjb3JyZWN0bHkgd2l0aG91dCBjYXVzaW5nIGRlYWRsb2NrcyBvciBtZW1vcnkgY29ycnVwdGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI3IDExOjEyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZUJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCB3aGljaCBhY3RzIGFzIGEgd3JhcHBlciBhcm91bmQgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZnJvbSBlQlBGIHByb2dyYW1zLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgb3IgaW5pdGlhbGl6ZSBjb21wbGV4IHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGtmdW5jIGFyZSB2YWxpZGF0ZWQgYnkgdGhlIEJQRiB2ZXJpZmllciAoYSB2YWxpZCBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgc2NhbGFyIHNpemUpLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGxpa2Ugb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIG9yIGxvY2tpbmcgYnVncyB3b3VsZCBiZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYmM4YTYwOWZjNzFiZmQ5M2E0Y2NhZjI0OWExN2I1YjEzYzVkNjhmYQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgQXVnIDI3IDExOjEyOjMwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDQ5IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzCiYjNDM7ICogY3VycmVudC0mZ3Q7cmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlcgomIzQzOyAqIHJlY2xhaW0gc3RhdGUuIFJlY2xhaW0gd2luZG93cyBhcmUgbWFya2VkIHdpdGggUEZfTUVNQUxMT0M7CiYjNDM7ICogcmVjbGFpbV9zdGF0ZSBpcyBhbHNvIGNoZWNrZWQgYmVjYXVzZSBpdCBpcyBpbnN0YWxsZWQgc2xpZ2h0bHkKJiM0MzsgKiBiZWZvcmUgUEZfTUVNQUxMT0MuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIChjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQykgfHwgY3VycmVudC0mZ3Q7cmVjbGFpbV9zdGF0ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhIGZpbGVzeXN0ZW0gbG9jayBoZWxkOiB0aGUgcmVjbGFpbSBwYXRoCiYjNDM7ICogbWF5IGRlYWRsb2NrIG9uIGl0IHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpcwomIzQzOyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2Ugb3IgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0gY29udGV4dC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7CiYjNDM7CiYjNDM7CWlmIChzaXplICZsdDsgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJbnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSwKJiM0MzsJCQkJCQkgICAgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8CiYjNDM7CQkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJCSAgICBOVUxMKTsKJiM0MzsKJiM0MzsJcmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTsKJiM0Mzt9CiYjNDM7CiBfX2JwZl9rZnVuY19lbmRfZGVmcygpOwogCiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcykKQEAgLTE3Miw2ICYjNDM7MjE2LDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKIAomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSkKJiM0MzsKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xMjcwZDczYzkxMTZlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDQ4MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKQomIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDEKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwCiYjNDM7ICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGQKJiM0MzsgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkCiYjNDM7ICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUKJiM0MzsgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiYjNDM7ICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdGZzIHN0OwomIzQzOwomIzQzOwlpZiAoIXN0YXRmcygmIzM0Oy90bXAmIzM0OywgJmFtcDtzdCkgJmFtcDsmYW1wOwomIzQzOwkgICAgKHN0LmZfdHlwZSA9PSBUTVBGU19NQUdJQyB8fCBzdC5mX3R5cGUgPT0gUkFNRlNfTUFHSUMpKQomIzQzOwkJcmV0dXJuICYjMzQ7LiYjMzQ7OwomIzQzOwlyZXR1cm4gJiMzNDsvdG1wJiMzNDs7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzbwomIzQzOyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWQKJiM0MzsgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlcwomIzQzOyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLgomIzQzOyAqLwomIzQzO2VudW0gY2hpbGRfZXhpdF9jb2RlIHsKJiM0MzsJQ0hJTERfRVhJVF9PSyA9IDAsCiYjNDM7CUNISUxEX0VYSVRfSk9JTl9DR1JPVVAsCiYjNDM7CUNISUxEX0VYSVRfV1JJVEVfRklMRSwKJiM0MzsJQ0hJTERfRVhJVF9SRUFEX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfVElNRV9GSUxFLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKQomIzQzO3sKJiM0MzsJc3dpdGNoIChjb2RlKSB7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9PSzoKJiM0MzsJCXJldHVybiAmIzM0O3N1Y2Nlc3MmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOgomIzQzOwkJcmV0dXJuICYjMzQ7am9pbiBjZ3JvdXAmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDt3cml0ZSBkYXRhIGZpbGUmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1JFQURfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3JlYWQgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDt3cml0ZSB0aW1lIGZpbGUmIzM0OzsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCXJldHVybiAmIzM0O3Vua25vd24mIzM0OzsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsJY2hhciBsaW1pdF9idWZbMjBdOwomIzQzOwomIzQzOwlyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJcmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgJiMzNDttZW1vcnkmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtlbmFibGVfY29udHJvbGxlcnMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksICYjMzQ7JWx1JiMzNDssIENHX0xJTUlUKTsKJiM0MzsJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCAmIzM0O21lbW9yeS5tYXgmIzM0OywgbGltaXRfYnVmKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXgmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZQomIzQzOwkgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlbgomIzQzOwkgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0hJR0hfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfTE9XX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpOwomIzQzOwlwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7CiYjNDM7CXBpZF90IHdhaXRfcmV0OwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy53cV9wcm9nX2luaXQpOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5iMmNhNTE4NTE1MGZlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwxODEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRAkxCiYjNDM7I2RlZmluZSBQQUdFX1NJWkUJCTQwOTZVTAomIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFCQkoMzIgKiBQQUdFX1NJWkUpCiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSCTMyCiYjNDM7CiYjNDM7c3RydWN0IGJwZl9hcmdzIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnA7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOy8qCiYjNDM7ICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnkKJiM0MzsgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS4KJiM0MzsgKi8KJiM0Mzt1NjQgcmVjbGFpbV9jYWxsczsKJiM0Mzt1NjQgcmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csCiYjNDM7CQlicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sCiYjNDM7CQkJCSAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wKJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKQomIzQzO3sKJiM0MzsJdTY0IGN1ciwgZGVsdGE7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgJmFtcDtjdXIpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50OwomIzQzOwkqcHJldl9ldmVudCA9IGN1cjsKJiM0MzsKJiM0MzsJcmV0dXJuIGRlbHRhICZndDs9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZWNsYWltX2NhbGxzJiM0MzsmIzQzOzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7CiYjNDM7CiYjNDM7CQlpZiAoIW5yKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcmVjbGFpbWVkX2J5dGVzICYjNDM7PSBucjsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CiYjNDM7CWlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsICZhbXA7ZWxlbS0mZ3Q7cHJldl9ldmVudCwKJiM0MzsJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHsKJiM0MzsJCXJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpOwomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgcmVjbGFpbV93b3JrX2ZuLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9pbml0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsICZhbXA7d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB3cV90aW1lcl9jYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwllbGVtLSZndDtwcmV2X2V2ZW50ID0gMDsKJiM0MzsJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CWVsZW0tJmd0O2NoZWNrX25zID0gY3R4LSZndDtjaGVja19uczsKJiM0MzsKJiM0MzsJd3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtJmd0O2hpZ2hfY2dyb3VwX2lkOwomIzQzOwl3cV9sb3dfY2dyb3VwX2lkID0gY3R4LSZndDtsb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjcgMTE6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTcxMAoJCQkJCQkJb3V0cHV0OiAyMDIKCQkJCQkJCXRob3VnaHRzOiA0OTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUmV2aWV3aW5nIHRoZSBlQlBGIFByb2FjdGl2ZSBNZW1vcnkgUmVjbGFpbSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgd2hpY2ggaXMgcHJldHR5IGludGVyZXN0aW5nIGJlY2F1c2UgaXQgYWxsb3dzIGVCUEYgcHJvZ3JhbXMgdG8gYWN0aXZlbHkgdHJpZ2dlciBtZW1vcnkgcmVjbGFtYXRpb24gd2l0aGluIGEgbWVtb3J5IGNncm91cC4gUGx1cywgdGhlcmUmIzM5O3MgYSBuZXcgc2VsZnRlc3QgaW5jbHVkZWQsIHdoaWNoIGlzIGFsd2F5cyBnb29kIHRvIHNlZS4KCkxvb2tpbmcgYXQgdGhlIGNoYW5nZXMsIGl0JiMzOTtzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuIFdlIGhhdmUgYWRkaXRpb25zIHRvIGBtbS9icGZfbWVtY29udHJvbC5jYDogYSBoZWxwZXIsIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCwgYW5kIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYyBpdHNlbGYsIHdoaWNoIGlzIHJlZ2lzdGVyZWQgYXMgc2xlZXBhYmxlLiBUaGVuLCB0aGUgb2JsaWdhdG9yeSBzZWxmdGVzdHMgYXJlIGluIHBsYWNlOiBhIHRlc3QgZmlsZSBhbmQgYW4gYWNjb21wYW55aW5nIHByb2dyYW0uCgpUaGUgY29yZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhcHBlYXJzIHRvIGJlIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYy4gSXQgYWNjZXB0cyBhIGBtZW1fY2dyb3VwYCBwb2ludGVyIGFuZCBhIGBzaXplYC4gSW50ZXJuYWxseSwgaXQmIzM5O3MgY2FsbGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2Agd2l0aCB0aGUgYXBwcm9wcmlhdGUgYXJndW1lbnRzLiBUaGlzIGlzIHRoZSBrZXkgcGllY2UgdG8gYW5hbHl6ZSBmb3Igc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMuCgpNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gc2NydXRpbml6ZSB3aGV0aGVyIHRoaXMgZXhwb3NlcyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkuIEhvd2V2ZXIsIGFmdGVyIGNhcmVmdWwgcmV2aWV3LCBJIGRvbiYjMzk7dCBzZWUgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MuIFdlJiMzOTtyZSBlc3NlbnRpYWxseSB3cmFwcGluZyBhbiBleGlzdGluZyBrZXJuZWwgZnVuY3Rpb24uIFRoZSBhcmd1bWVudHMg4oCTIGEgcG9pbnRlciB0byBhIHN0cnVjdCB2ZXJpZmllZCBieSBCUEYgYW5kIGEgc2NhbGFyIHNpemUg4oCTIGRvbiYjMzk7dCBwcmVzZW50IHRoZSB0eXBpY2FsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBUaGVyZSYjMzk7cyBubyBjb3B5aW5nIG9mIHN0cnVjdHVyZXMgdG8gdXNlcnNwYWNlLCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgd2l0aGluIHRoZSBCUEYgcHJvZ3JhbSBpdHNlbGYsIGFuZCBub3RoaW5nIHRoYXQgc2VlbXMgdG8gaW50cm9kdWNlIGFueSBwb3RlbnRpYWwgZm9yIHNlbnNpdGl2ZSBkYXRhIGxlYWthZ2UuCgpUaGUgcGF0Y2ggbWFpbmx5IGZvY3VzZXMgb24gbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGVCUEYgaW50ZXJhY3Rpb25zLiBHaXZlbiB0aGF0LCBJIGRvbiYjMzk7dCB0aGluayBLTVNBTiBpcyBuZWNlc3NhcnkgaGVyZS4gS0FTQU4gYW5kIG90aGVyIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIHRoYXQgbWlnaHQgYmUgaW50cm9kdWNlZC4KCkxldCYjMzk7cyBkbyBhIGZpbmFsIHF1aWNrIHNhbml0eSBjaGVjayBvbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFllcCwgaXQmIzM5O3MgdGhlIHN0YW5kYXJkIG1lbW9yeSByZWNsYWltIGZ1bmN0aW9uIHdlJiMzOTtyZSBmYW1pbGlhciB3aXRoLgoKQWxyaWdodCwgd2l0aCBhbGwgdGhhdCBjb25zaWRlcmVkLCBJIHdpbGwgbWFyayB0aGlzIHBhdGNoIHdpdGggTmVlZHNLTVNBTj1mYWxzZSBhbmQgcHJvdmlkZSB0aGUgYWJvdmUgcmVhc29uaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGVCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgd2hpY2ggYWN0cyBhcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGlzdGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZnVuY3Rpb24gdG8gYWxsb3cgcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltIGZyb20gZUJQRiBwcm9ncmFtcy4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIG9yIGluaXRpYWxpemUgY29tcGxleCBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBrZnVuYyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIgKGEgdmFsaWQgcG9pbnRlciB0byBgc3RydWN0IG1lbV9jZ3JvdXBgIGFuZCBhIHNjYWxhciBzaXplKS4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyBsaWtlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBvciBsb2NraW5nIGJ1Z3Mgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGVCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgd2hpY2ggYWN0cyBhcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGlzdGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZnVuY3Rpb24gdG8gYWxsb3cgcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltIGZyb20gZUJQRiBwcm9ncmFtcy4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIG9yIGluaXRpYWxpemUgY29tcGxleCBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBrZnVuYyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIgKGEgdmFsaWQgcG9pbnRlciB0byBgc3RydWN0IG1lbV9jZ3JvdXBgIGFuZCBhIHNjYWxhciBzaXplKS4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyBsaWtlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBvciBsb2NraW5nIGJ1Z3Mgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI3VDExOjEyOjMxLjI0OTkxODQ2N1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI5MzMzMDY1NTk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBlQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHdoaWNoIGFjdHMgYXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmcm9tIGVCUEYgcHJvZ3JhbXMuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbGxvY2F0ZSBvciBpbml0aWFsaXplIGNvbXBsZXggc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUga2Z1bmMgYXJlIHZhbGlkYXRlZCBieSB0aGUgQlBGIHZlcmlmaWVyIChhIHZhbGlkIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBzY2FsYXIgc2l6ZSkuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgbGlrZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgb3IgbG9ja2luZyBidWdzIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjozMS4yNDk5MjY5MDdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM5MTU0ODM3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGJjOGE2MDlmYzcxYmZkOTNhNGNjYWYyNDlhMTdiNWIxM2M1ZDY4ZmFcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBBdWcgMjcgMTE6MTI6MzAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcXG5pbmRleCA3MTZkZjQ5ZDc2NDc3Li4yOTdmZjdmMDUwNDI3IDEwMDY0NFxcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcXG4rKysgYi9tbS9icGZfbWVtY29udHJvbC5jXFxuQEAgLTYsNiArNiw3IEBAXFxuICAqL1xcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N3YXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbiBcXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbkBAIC0xNTksNiArMTYwLDQ5IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbiBcXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcXG4gfVxcbiBcXG4rLypcXG4rICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlOiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgb3ZlcndyaXRlc1xcbisgKiBjdXJyZW50LVxcdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXFxuKyAqIHJlY2xhaW0gc3RhdGUuIFJlY2xhaW0gd2luZG93cyBhcmUgbWFya2VkIHdpdGggUEZfTUVNQUxMT0M7XFxuKyAqIHJlY2xhaW1fc3RhdGUgaXMgYWxzbyBjaGVja2VkIGJlY2F1c2UgaXQgaXMgaW5zdGFsbGVkIHNsaWdodGx5XFxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cXG4rICovXFxuK3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcXG4re1xcbitcXHRyZXR1cm4gKGN1cnJlbnQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUEZfTUVNQUxMT0MpIHx8IGN1cnJlbnQtXFx1MDAzZXJlY2xhaW1fc3RhdGU7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxcbisgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xcbisgKlxcbisgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvXFxuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxcbisgKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhIGZpbGVzeXN0ZW0gbG9jayBoZWxkOiB0aGUgcmVjbGFpbSBwYXRoXFxuKyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpc1xcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcXG4rXFxuK1xcdGlmIChzaXplIFxcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgTlVMTCk7XFxuK1xcbitcXHRyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFO1xcbit9XFxuK1xcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbiBcXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuQEAgLTE3Miw2ICsyMTYsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcXG4gXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcXG4rXFxuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcXG4gXFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTI3MGQ3M2M5MTE2ZVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDQ4MCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy92ZnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc2lnbmFsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N0aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGltaXRzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tYWdpYy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNncm91cF9oZWxwZXJzLmhcXFwiXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbisjaW5jbHVkZSBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcXFwiXFxuK1xcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxcbisjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxcbitcXG4rI2RlZmluZSBDR19ESVIgXFxcIi9tZW1jZ19hc3luY19yZWNsYWltXFxcIlxcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcXFwiL2hpZ2hcXFwiXFxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXFxcIi9sb3dcXFwiXFxuK1xcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXFxuK1xcbisvKlxcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXFxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcXG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cXG4rICovXFxuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xcbitcXG4rXFx0aWYgKCFzdGF0ZnMoXFxcIi90bXBcXFwiLCBcXHUwMDI2c3QpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXFxuK1xcdFxcdHJldHVybiBcXFwiLlxcXCI7XFxuK1xcdHJldHVybiBcXFwiL3RtcFxcXCI7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cXG4rICovXFxuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcXG4rXFx0Q0hJTERfRVhJVF9PSyA9IDAsXFxuK1xcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXFxuK1xcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcXG4rXFx0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXFxuK1xcdENISUxEX0VYSVRfVElNRV9GSUxFLFxcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxcbit7XFxuK1xcdHN3aXRjaCAoY29kZSkge1xcbitcXHRjYXNlIENISUxEX0VYSVRfT0s6XFxuK1xcdFxcdHJldHVybiBcXFwic3VjY2Vzc1xcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcXG4rXFx0XFx0cmV0dXJuIFxcXCJqb2luIGNncm91cFxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIGRhdGEgZmlsZVxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwicmVhZCBkYXRhIGZpbGVcXFwiO1xcbitcXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIHRpbWUgZmlsZVxcXCI7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiBcXFwidW5rbm93blxcXCI7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXHRjaGFyIGxpbWl0X2J1ZlsyMF07XFxuK1xcbitcXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcXFwibWVtb3J5XFxcIik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImVuYWJsZV9jb250cm9sbGVyc1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcXFwiJWx1XFxcIiwgQ0dfTElNSVQpO1xcbitcXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFxcXCJtZW1vcnkubWF4XFxcIiwgbGltaXRfYnVmKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcXG4rXFx0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cXG4rXFx0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cXG4rXFx0ICovXFxuK1xcdGlmICghYWNjZXNzKFxcXCIvcHJvYy9zd2Fwc1xcXCIsIEZfT0spKSB7XFxuK1xcdFxcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXFxcIm1lbW9yeS5zd2FwLm1heFxcXCIsIFxcXCIwXFxcIik7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdHNpemVfdCB3cml0dGVuID0gMDtcXG4rXFx0Y2hhciAqYnVmZmVyO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFxcXCJ3YlxcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XFxuK1xcdGlmICghYnVmZmVyKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZnA7XFxuK1xcbitcXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcXG4rXFxuK1xcdHdoaWxlICh3cml0dGVuIFxcdTAwM2MgRklMRV9TSVpFKSB7XFxuK1xcdFxcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXFx1MDAzYyBCVUZGRVJfU0laRSA/XFxuK1xcdFxcdFxcdFxcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xcbitcXG4rXFx0XFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0XFx0d3JpdHRlbiArPSB0b193cml0ZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZnJlZShidWZmZXIpO1xcbitjbGVhbnVwX2ZwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRjaGFyICptYXA7XFxuK1xcdHNpemVfdCBpO1xcbitcXHRpbnQgZmQ7XFxuK1xcdHN0cnVjdCBzdGF0IHNiO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCA9PSAtMSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoZnN0YXQoZmQsIFxcdTAwMjZzYikgPT0gLTEpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XFxuK1xcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcXG4rXFx0XFx0XFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cXG4rXFx0XFx0XFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xcbitcXHRcXHRcXHQodm9pZCl2O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9mZDpcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXFxuK1xcdFxcdFxcdFxcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xcbitcXHRkb3VibGUgZWxhcHNlZDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XFxuK1xcbitcXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXFx1MDAyNnN0YXJ0KTtcXG4rXFxuK1xcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xcbitcXG4rXFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xcbitcXG4rXFx0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFxcdTAwMjZlbmQpO1xcbitcXG4rXFx0aWYgKCF0aW1lX2ZpbGVuYW1lKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rXFxuK1xcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xcbitcXHRcXHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xcbitcXHRwcmludGYoXFxcIiUuNmZcXFxcblxcXCIsIGVsYXBzZWQpO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XFxuK1xcdGZwcmludGYoZnAsIFxcXCIlLjZmXFxcIiwgZWxhcHNlZCk7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcbitcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0Y2hhciBidWZbNjRdO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwiclxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFxcXCJmZ2V0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRpZiAoc3NjYW5mKGJ1ZiwgXFxcIiVsZlxcXCIsIHRpbWUpICE9IDEpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwic3NjYW5mICVzXFxcIiwgYnVmKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSAwO1xcbitjbGVhbnVwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xcbitcXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XFxuK1xcdHBpZF90IHdhaXRfcmV0O1xcbitcXHRpbnQgZmQsIHN0YXR1cztcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXG4rXFx0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFx0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0bG93X3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXFxcImZvcmsgbG93XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGxvd19waWQgPT0gMClcXG4rXFx0XFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHRoaWdoX3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsIFxcXCJmb3JrIGhpZ2hcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoaGlnaF9waWQgPT0gMClcXG4rXFx0XFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHR3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcXFwibG93IHdhaXRwaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHQvKlxcbitcXHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcXG4rXFx0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXFxuK1xcdCAqL1xcbitcXHRsb3dfcGlkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJsb3cgZXhpdGVkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXFxuK1xcdFxcdFxcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHdhaXRfcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcXFwiaGlnaCB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0LyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovXFxuK1xcdGhpZ2hfcGlkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJoaWdoIGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcXFwiLFxcbitcXHRcXHRcXHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcXG4rXFx0XFx0XFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdGlmIChoaWdoX3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdFxcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChsb3dfcGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XFxuK1xcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rc2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXFxuK1xcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcXG4rXFx0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XFxuK1xcdFxcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxcbitcXHRcXHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXFxuK1xcdFxcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXFxuK1xcdFxcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcXG4rXFx0fTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxcbitcXHRcXHQuY3R4X2luID0gXFx1MDAyNmFyZ3MsXFxuK1xcdFxcdC5jdHhfc2l6ZV9pbiA9IHNpemVvZihhcmdzKSk7XFxuK1xcdGludCBwcm9nX2luaXRfZmQsIGVycjtcXG4rXFxuK1xcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcXG4rXFxuK1xcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcXHUwMDI2cnVuX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFxcXCJwcm9nX2luaXQgcmV0dmFsXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXG4rXFx0KnNrZWxfcHRyID0gc2tlbDtcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitlcnJvcl9vdXQ6XFxuK1xcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdHJldHVybiAtMTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW0odm9pZClcXG4re1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XFxuK1xcdGludCBlcnI7XFxuK1xcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFxcdTAwMjZoaWdoX2Nncm91cF9pZCwgXFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcXHUwMDI2c2tlbCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2JwZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcXHUwMDI2aGlnaF90aW1lLCBcXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nXFxuK1xcdCAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbVxcbitcXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXFxuK1xcdCAqL1xcbitcXHRpZiAoIUFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFxcXCJyZWNsYWltX2NhbGxzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1lZF9ieXRlcywgMCwgXFxcInJlY2xhaW1lZF9ieXRlc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmIChoaWdoX3RpbWUgXFx1MDAzZT0gbG93X3RpbWUpXFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWZcXFwiLFxcbitcXHRcXHRcXHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcXG4rXFxuK291dDpcXG4rXFx0aWYgKHNrZWwpXFxuK1xcdFxcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmIyY2E1MTg1MTUwZmVcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbkBAIC0wLDAgKzEsMTgxIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuK1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiYnBmX2V4cGVyaW1lbnRhbC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFxcdDFcXG4rI2RlZmluZSBQQUdFX1NJWkVcXHRcXHQ0MDk2VUxcXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcXHRcXHQoMzIgKiBQQUdFX1NJWkUpXFxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlxcdDMyXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycDtcXG4rXFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xcbit9O1xcbitcXG4rc3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcXG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xcbitcXG4rLypcXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcXG4rICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXFxuKyAqL1xcbit1NjQgcmVjbGFpbV9jYWxscztcXG4rdTY0IHJlY2xhaW1lZF9ieXRlcztcXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGNtLVxcdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdGlmICghY20tXFx1MDAzZWNncnApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGNtLVxcdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcXHUwMDI2Y20tXFx1MDAzZWNncnAtXFx1MDAzZXNlbGYpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VtZW1jZykge1xcbitcXHRcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cXHUwMDNlbWVtY2cpO1xcbitcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcXG4rXFx0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXFxuK1xcdFxcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcXG4rXFx0XFx0XFx0XFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZWNsYWltX2NhbGxzKys7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcXG4rXFx0XFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xcbitcXG4rXFx0XFx0aWYgKCFucilcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcXG4rXFx0fVxcbitcXG4rXFx0cHV0X2Nncm91cF9tZW1jZyhcXHUwMDI2Y20pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0cnVjdCB3cV9lbGVtIHtcXG4rXFx0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcXG4rXFx0c3RydWN0IGJwZl93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTMyKTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XFxuK30gd3FfbWFwIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0YXRpYyBpbnQgcmVjbGFpbV93b3JrX2ZuKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxcbit7XFxuK1xcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XFxuK1xcbitcXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcXHUwMDI2ZWxlbS1cXHUwMDNlcHJldl9ldmVudCxcXG4rXFx0XFx0ZWxlbS1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xcbitcXHRcXHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcXG4rXFx0XFx0YnBmX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXFxuK3tcXG4rXFx0YnBmX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0YnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW07XFxuK1xcdF9fdTMyIGtleSA9IDA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2d3FfbWFwLCBcXHUwMDI2a2V5KTtcXG4rXFx0aWYgKCFlbGVtKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRyZXQgPSBicGZfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNndxX21hcCwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RpbWVyX2luaXQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBcXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGVsZW0tXFx1MDAzZXByZXZfZXZlbnQgPSAwO1xcbitcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0ZWxlbS1cXHUwMDNlY2hlY2tfbnMgPSBjdHgtXFx1MDAzZWNoZWNrX25zO1xcbitcXG4rXFx0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xcbitcXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2Vsb3dfY2dyb3VwX2lkO1xcbitcXG4rXFx0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rfVxcbitcXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI3VDExOjEyOjMxLjY0MjE2MjAxOFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE4ODU5OTM4MjE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiYzhhNjA5ZmM3MWJmZDkzYTRjY2FmMjQ5YTE3YjViMTNjNWQ2OGZhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjcgMTE6MTI6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNDkgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4rICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbisgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxuKyAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcbisgKiBtYXkgZGVhZGxvY2sgb24gaXQgdmlhIGZpbGVzeXN0ZW0gc2hyaW5rZXJzLlxuKyAqXG4rICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXG4rICogc21hbGxlciB0aGFuIGEgcGFnZSBvciB0aGUgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbSBjb250ZXh0LlxuKyAqL1xuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7XG4rXG4rXHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcbitcdFx0XHRcdFx0XHQgICAgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4rXHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuK1x0XHRcdFx0XHRcdCAgICBOVUxMKTtcbitcbitcdHJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7XG4rfVxuK1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgKzIxNiw4IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4rXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTI3MGQ3M2M5MTE2ZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDQ4MCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXG4rICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGRcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXG4rICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcbisgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cbisgKi9cbitzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpXG4re1xuK1x0c3RydWN0IHN0YXRmcyBzdDtcbitcbitcdGlmICghc3RhdGZzKFwiL3RtcFwiLCBcdTAwMjZzdCkgXHUwMDI2XHUwMDI2XG4rXHQgICAgKHN0LmZfdHlwZSA9PSBUTVBGU19NQUdJQyB8fCBzdC5mX3R5cGUgPT0gUkFNRlNfTUFHSUMpKVxuK1x0XHRyZXR1cm4gXCIuXCI7XG4rXHRyZXR1cm4gXCIvdG1wXCI7XG4rfVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xuKyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWRcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xuKyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxuKyAqL1xuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcbitcdENISUxEX0VYSVRfT0sgPSAwLFxuK1x0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcbitcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcbitcdENISUxEX0VYSVRfUkVBRF9GSUxFLFxuK1x0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXG4rfTtcbitcbitzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXG4re1xuK1x0c3dpdGNoIChjb2RlKSB7XG4rXHRjYXNlIENISUxEX0VYSVRfT0s6XG4rXHRcdHJldHVybiBcInN1Y2Nlc3NcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcbitcdFx0cmV0dXJuIFwiam9pbiBjZ3JvdXBcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxuK1x0XHRyZXR1cm4gXCJ3cml0ZSBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XG4rXHRcdHJldHVybiBcInJlYWQgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxuK1x0XHRyZXR1cm4gXCJ3cml0ZSB0aW1lIGZpbGVcIjtcbitcdGRlZmF1bHQ6XG4rXHRcdHJldHVybiBcInVua25vd25cIjtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuK1xuK1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwibWVtb3J5XCIpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImVuYWJsZV9jb250cm9sbGVyc1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCIlbHVcIiwgQ0dfTElNSVQpO1xuK1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5tYXhcIiwgbGltaXRfYnVmKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHQvKlxuK1x0ICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlXG4rXHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxuK1x0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cbitcdCAqL1xuK1x0aWYgKCFhY2Nlc3MoXCIvcHJvYy9zd2Fwc1wiLCBGX09LKSkge1xuK1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ISUdIX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0xPV19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2c3RhcnQpO1xuK1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7XG4rXG4rXHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcbitcdHByaW50ZihcIiUuNmZcXG5cIiwgZWxhcHNlZCk7XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwid1wiKTtcbitcdGlmICghZnApXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1RJTUVfRklMRTtcbitcdGZwcmludGYoZnAsIFwiJS42ZlwiLCBlbGFwc2VkKTtcbitcdGZjbG9zZShmcCk7XG4rXG4rXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbit9XG4rXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0RklMRSAqZnA7XG4rXHRjaGFyIGJ1Zls2NF07XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwiclwiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcImZnZXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoc3NjYW5mKGJ1ZiwgXCIlbGZcIiwgdGltZSkgIT0gMSkge1xuK1x0XHRQUklOVF9GQUlMKFwic3NjYW5mICVzXCIsIGJ1Zik7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y29uc3QgY2hhciAqZGlyID0gd29ya2xvYWRfZmlsZXNfZGlyKCk7XG4rXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4rXHRwaWRfdCB3YWl0X3JldDtcbitcdGludCBmZCwgc3RhdHVzO1xuK1x0aW50IHJldCA9IC0xO1xuK1xuK1x0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcIiwgZGlyKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0aGlnaF9waWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCJmb3JrIGhpZ2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChoaWdoX3BpZCA9PSAwKVxuK1x0XHRfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdHdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwibG93IHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qXG4rXHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcbitcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxuK1x0ICovXG4rXHRsb3dfcGlkID0gLTE7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImxvdyBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImxvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcIixcbitcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbitcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwiaGlnaCB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHQvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi9cbitcdGhpZ2hfcGlkID0gLTE7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImhpZ2ggZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJoaWdoIGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cDpcbitcdC8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovXG4rXHRpZiAocmV0KSB7XG4rXHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuK1x0XHRcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHRcdGlmIChsb3dfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbitcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHR9XG4rXHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuK1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuK1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnRcbitzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbitcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbit7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbitcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xuK1x0XHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcbitcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuK1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuK1x0XHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXG4rXHR9O1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuK1x0XHQuY3R4X2luID0gXHUwMDI2YXJncyxcbitcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpKTtcbitcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbitcbitcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsIFx1MDAyNnJ1bl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCJwcm9nX2luaXQgcmV0dmFsXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcbitcdCpza2VsX3B0ciA9IHNrZWw7XG4rXHRyZXR1cm4gMDtcbitcbitlcnJvcl9vdXQ6XG4rXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKVxuK3tcbitcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbitcdGludCBlcnI7XG4rXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbitcbitcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwicmVjbGFpbWVkX2J5dGVzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWZcIixcbitcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbitcbitvdXQ6XG4rXHRpZiAoc2tlbClcbitcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjJjYTUxODUxNTBmZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSwxODEgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbitcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuKyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbitcdGlmICghY20tXHUwMDNlY2dycClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbitcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK31cbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAtMTtcbitcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbitcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuK1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4rXHRcdFx0XHQgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdGludCBpO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZWNsYWltX2NhbGxzKys7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcbitcdFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xuK1xuK1x0XHRpZiAoIW5yKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRyZWNsYWltZWRfYnl0ZXMgKz0gbnI7XG4rXHR9XG4rXG4rXHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbitcdF9fdHlwZShrZXksIF9fdTMyKTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuK30gd3FfbWFwIFNFQyhcIi5tYXBzXCIpO1xuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV93b3JrX2ZuKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcbitcdF9fdTMyIGtleSA9IDA7XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2d3FfbWFwLCBcdTAwMjZrZXkpO1xuK1x0aWYgKCFlbGVtKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjozMS42NDIxNjMxNzhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2Nzk3MTYyMjU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTmV3IEJQRiBQcm9hY3RpdmUgUmVjbGFpbSBGdW5jdGlvbioqXG5cbk9rYXksIHNvIHRoZXJlJ3MgYSBuZXcgcGF0Y2ggYWRkaW5nIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AuIFRoaXMgaXMgaW50cmlndWluZyDigJMgaXQgZ2l2ZXMgQlBGIHByb2dyYW1zIHRoZSBhYmlsaXR5IHRvIHRyaWdnZXIgbWVtb3J5IHJlY2xhaW0gd2l0aGluIGEgbWVtb3J5IGNncm91cC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzOiB0aGlzIG5lZWRzIGEgdGhvcm91Z2ggbG9vay4gSXQncyBhIG5ldyBCUEYgZW50cnkgcG9pbnQsIG1lYW5pbmcgaXQncyBhIG5ldyBhdHRhY2sgc3VyZmFjZSwgYW5kIGNvdWxkIHBvdGVudGlhbGx5IGludGVyYWN0IHdpdGggbG93LWxldmVsIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGUgcGF0Y2ggYWxzbyBpbmNsdWRlcyBhIHNlbGZ0ZXN0LCB3aGljaCBpcyBnb29kLCBidXQgZG9lc24ndCByZXBsYWNlIG15IG93biBzY3J1dGlueS5cblxuTGV0J3MgZGlzc2VjdCB0aGUgaW1wbGVtZW50YXRpb246IHRoZSBjb3JlIG9mIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgaXQgY2hlY2tzIHRoZSBpbnB1dCBzaXplIGFuZCByZWNsYWltIGNvbnRleHQuIElmIGl0J3Mgc2FmZSBpdCBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIEdpdmVuIHRoYXQgdGhpcyBpcyBuZXcgZnVuY3Rpb25hbGl0eSB0aGF0IGRpcmVjdGx5IGltcGFjdHMgbWVtb3J5IHJlY2xhaW0gbG9naWMsIGl0J3MgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMga2Z1bmMgaXMgYWRkZWQgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdCBmb3IgdGhlIGZ1enppbmcgc2V0dXAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgbmV3IGVudHJ5cG9pbnQsIGl0cyBwcmVjb25kaXRpb25zLCBhbmQgYW55IHBvdGVudGlhbCBzaWRlIGVmZmVjdHMuXG5cbk5leHQsIEkgbmVlZCB0byB2ZXJpZnkgaG93IGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGlzIGFjdHVhbGx5IGNvbXBpbGVkIGFuZCByZWFjaGFibGUuIEknbGwgbmVlZCB0byBjaGVjayBgbW0vTWFrZWZpbGVgIHRvIHNlZSB1bmRlciB3aGF0IGNvbmRpdGlvbnMgYGJwZl9tZW1jb250cm9sLmNgIGdldHMgaW5jbHVkZWQgYW5kIGJ1aWx0LiBVbmRlcnN0YW5kaW5nIGl0cyBidWlsZCBkZXBlbmRlbmNpZXMgYW5kIGluY2x1c2lvbiBwcm9jZXNzIGlzIGNyaXRpY2FsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIGF0dGFjayBzdXJmYWNlIGFuZCBlbnN1cmluZyBjb3JyZWN0IGZ1enppbmcgc2V0dXAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk3MTMsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNzEsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjozOC40MzkzMjg3NTJaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc1MDkzMjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX21lbWNvbnRyb2wub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDY9aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xcbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjozOC40ODY4NDI3ODhaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjM4MzcyNzY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgdGhvdWdodHMsIGZvcm1hdHRlZCBhcyB5b3UgcmVxdWVzdGVkOlxuXG4qKkFzc2Vzc2luZyBCUEYgYW5kIE1lbW9yeSBDR3JvdXBzIGluIHRoZSBLZXJuZWwqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgdGFzayBhdCBoYW5kIGxvb2tzIHRvIGJlIGRlcGVuZGVudCBvbiBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19NRU1DR2AuIFRob3NlIGFyZSB0aGUgYmFzZWxpbmUgcmVxdWlyZW1lbnRzLCB3aGljaCBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgSSBzaG91bGQgaW52ZXN0aWdhdGUgZnVydGhlcjsgbWF5YmUgc29tZSBvdGhlciBvYnNjdXJlIGZlYXR1cmVzIGFyZSBicm91Z2h0IGluIHRvbz9cblxuYGJwZl9pbl9yZWNsYWltX2NvbnRleHRgIGp1bXBzIG91dCBhdCBtZSBhcyBhIHBvdGVudGlhbCBwb2ludCBvZiBpbnRlcmVzdC4gSXQncyBtYXJrZWQgYXMgYSBzdGF0aWMgaGVscGVyLCBzbyBpdCBpcyBxdWl0ZSBwb3NzaWJseSBhbiBpbnRlcm5hbCBmdW5jdGlvbiB0aGF0IG1pZ2h0IGJlIGFkZGVkIHRvIG15IHdvcmsuXG5cbkFuZCBub3cgSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgYG1tL3Ztc2Nhbi5jYC4gU3BlY2lmaWNhbGx5LCBJIHNob3VsZCBsb29rIGNsb3NlbHkgYXQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaGlzIHdpbGwgbGlrZWx5IHJldmVhbCBob3cgcGFnZXMgYXJlIGFjdHVhbGx5IGZyZWVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIG1lbW9yeSBjZ3JvdXAsIGFuZCB3aGV0aGVyIG15IHByZXZpb3VzIGZpbmRpbmdzIGFyZSBwZXJ0aW5lbnQuIFVuZGVyc3RhbmRpbmcgdGhpcyBpcyBrZXkgdG8gZ2V0dGluZyB0aGUgY29tcGxldGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA1MDMsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjo0Mi4xMjUyMTc1NDZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMxNTQzNDIzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2JwZl9tZW1jb250cm9sLmM9MTU4PV9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNjMtLypcXG5tbS9icGZfbWVtY29udHJvbC5jOjE2NDogKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNjUtICogY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlclxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYz0xODk9X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xOTYtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoxOTc6XFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcXG5tbS9icGZfbWVtY29udHJvbC5jLTE5OC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgR0ZQX0tFUk5FTCxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0xNDgxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIxLVxcbm1tL21lbWNvbnRyb2wtdjEuYzoxNTIyOlxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMy1cXHRcXHRcXHRcXHRtZW1zdyA/IDAgOiBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSkge1xcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTE1NDA9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTUzLVxcbm1tL21lbWNvbnRyb2wtdjEuYzoxNTU0OlxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1NS1cXHRcXHRcXHRcXHRcXHRcXHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxcbi0tXFxubW0vbWVtY29udHJvbC5jPTIzMjg9c3RhdGljIHVuc2lnbmVkIGxvbmcgcmVjbGFpbV9oaWdoKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0yMzQzLVxcdFxcdHBzaV9tZW1zdGFsbF9lbnRlcihcXHUwMDI2cGZsYWdzKTtcXG5tbS9tZW1jb250cm9sLmM6MjM0NDpcXHRcXHRucl9yZWNsYWltZWQgKz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxubW0vbWVtY29udHJvbC5jLTIzNDUtXFx0XFx0XFx0XFx0XFx0XFx0XFx0Z2ZwX21hc2ssXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9MjU5NT1zdGF0aWMgaW50IHRyeV9jaGFyZ2VfbWVtY2coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBnZnBfdCBnZnBfbWFzayxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0yNjU0LVxcdHBzaV9tZW1zdGFsbF9lbnRlcihcXHUwMDI2cGZsYWdzKTtcXG5tbS9tZW1jb250cm9sLmM6MjY1NTpcXHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbV9vdmVyX2xpbWl0LCBucl9wYWdlcyxcXG5tbS9tZW1jb250cm9sLmMtMjY1Ni1cXHRcXHRcXHRcXHRcXHRcXHQgICAgZ2ZwX21hc2ssIHJlY2xhaW1fb3B0aW9ucywgTlVMTCk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDc2OD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfaGlnaF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNDgwMi1cXG5tbS9tZW1jb250cm9sLmM6NDgwMzpcXHRcXHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXFxubW0vbWVtY29udHJvbC5jLTQ4MDQtXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDgyMD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfbWF4X3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00ODU0LVxcdFxcdGlmIChucl9yZWNsYWltcykge1xcbm1tL21lbWNvbnRyb2wuYzo0ODU1OlxcdFxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMgLSBtYXgsXFxubW0vbWVtY29udHJvbC5jLTQ4NTYtXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXFxuLS1cXG5tbS92bXNjYW4uYz02NzIyPXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS92bXNjYW4uYy02NzYxLVxcbm1tL3Ztc2Nhbi5jOjY3NjI6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5tbS92bXNjYW4uYy02NzYzLVxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS92bXNjYW4uYy02ODAyLSNlbHNlXFxubW0vdm1zY2FuLmM6NjgwMzp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTY4MDQtXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jPTc4NjY9aW50IHVzZXJfcHJvYWN0aXZlX3JlY2xhaW0oY2hhciAqYnVmLFxcbi0tXFxubW0vdm1zY2FuLmMtNzkzMy1cXHRcXHRcXHRcXHRcXHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xcbm1tL3Ztc2Nhbi5jOjc5MzQ6XFx0XFx0XFx0cmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZyxcXG5tbS92bXNjYW4uYy03OTM1LVxcdFxcdFxcdFxcdFxcdFxcdCBiYXRjaF9zaXplLCBnZnBfbWFzayxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjdUMTE6MTI6NDIuMzU2NzY5OThaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MDY2NTE2ODEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoJ3MgRnV6emluZyBQb3RlbnRpYWwqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGludHJvZHVjZXMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIGEgbmV3IEJQRiBrZnVuYy4gR2l2ZW4gbXkgZXhwZXJpZW5jZSwgSSBpbW1lZGlhdGVseSBzZWUgdGhlIGZ1enppbmcgaW1wbGljYXRpb25zLiBUaGlzIGlzIGRlZmluaXRlbHkgd29ydGggZXhwbG9yaW5nIHRob3JvdWdobHkuIE15IHByaW1hcnkgZm9jdXMgc2hvdWxkIGJlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLlxuXG5JIGRvdWJsZS1jaGVja2VkOyB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMgYXJlIGp1c3QgYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kIGBDT05GSUdfTUVNQ0dgLCB3aGljaCBpcyBzdGFuZGFyZCBmb3IgQlBGIGludGVyYWN0aW9uIHdpdGggbWVtb3J5IGNvbnRyb2wgZ3JvdXBzLiBOb3RoaW5nIHVudXN1YWwgdGhlcmUuIFRoZSBkb2N1bWVudGF0aW9uIGNvbmZpcm1zIHRoYXQgdGhpcyBuZXcga2Z1bmMgaXMgdGhlIG9ubHkgQVBJIGJlaW5nIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UuXG5cbk5vdywgbGV0J3MgY29uc29saWRhdGUgbXkgZmluZGluZ3MgaW50byBhIGZvcm1hbCByZXNwb25zZS4gSXQncyBjbGVhcjogdGhpcyAqaXMqIHdvcnRoIGZ1enppbmcuIEknbGwgbmVlZCB0byBmb2N1cyBvbiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gVGhlIGFjdGl2YXRpb24gY29uZmlncyB3aWxsIGJlIGBCUEZfU1lTQ0FMTGAgYW5kIGBNRU1DR2AuIE15IHJlYXNvbmluZyBpcyBzdHJhaWdodGZvcndhcmQ6IGEgbmV3IEJQRiBBUEkgc3BlY2lmaWNhbGx5IHRhcmdldGluZyBtZW1vcnkgbWFuYWdlbWVudCBuZWNlc3NpdGF0ZXMgcmlnb3JvdXMgZnV6emluZyB0byBldmFsdWF0ZSBpdCBhZ2FpbnN0IG1hbGljaW91cyBpbnB1dHMgb3IgbWlzY29uZmlndXJlZCBjb250ZXh0cywgYW5kIGFueSBwb3RlbnRpYWwgaXNzdWVzIHJlZ2FyZGluZyBtZW1vcnkgbWFuYWdlbWVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIxNDYsIk91dHB1dFRva2VucyI6MTQyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI3VDExOjEyOjUwLjQyMzI4OTM4MloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Nzg4MDgxMTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjo1MC41MDIxMDM3ODZaIiwiU2VxIjo5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAwODA4NzAyNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjo1MC41MDI1OTA0NzZaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTAwODAzODAzMTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZUJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCB3aGljaCBhY3RzIGFzIGEgd3JhcHBlciBhcm91bmQgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZnJvbSBlQlBGIHByb2dyYW1zLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgb3IgaW5pdGlhbGl6ZSBjb21wbGV4IHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGtmdW5jIGFyZSB2YWxpZGF0ZWQgYnkgdGhlIEJQRiB2ZXJpZmllciAoYSB2YWxpZCBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgc2NhbGFyIHNpemUpLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGxpa2Ugb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIG9yIGxvY2tpbmcgYnVncyB3b3VsZCBiZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiYzhhNjA5ZmM3MWJmZDkzYTRjY2FmMjQ5YTE3YjViMTNjNWQ2OGZhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjcgMTE6MTI6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNDkgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4rICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbisgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxuKyAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcbisgKiBtYXkgZGVhZGxvY2sgb24gaXQgdmlhIGZpbGVzeXN0ZW0gc2hyaW5rZXJzLlxuKyAqXG4rICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXG4rICogc21hbGxlciB0aGFuIGEgcGFnZSBvciB0aGUgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbSBjb250ZXh0LlxuKyAqL1xuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7XG4rXG4rXHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcbitcdFx0XHRcdFx0XHQgICAgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4rXHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuK1x0XHRcdFx0XHRcdCAgICBOVUxMKTtcbitcbitcdHJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7XG4rfVxuK1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgKzIxNiw4IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4rXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTI3MGQ3M2M5MTE2ZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDQ4MCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXG4rICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGRcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXG4rICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcbisgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cbisgKi9cbitzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpXG4re1xuK1x0c3RydWN0IHN0YXRmcyBzdDtcbitcbitcdGlmICghc3RhdGZzKFwiL3RtcFwiLCBcdTAwMjZzdCkgXHUwMDI2XHUwMDI2XG4rXHQgICAgKHN0LmZfdHlwZSA9PSBUTVBGU19NQUdJQyB8fCBzdC5mX3R5cGUgPT0gUkFNRlNfTUFHSUMpKVxuK1x0XHRyZXR1cm4gXCIuXCI7XG4rXHRyZXR1cm4gXCIvdG1wXCI7XG4rfVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xuKyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWRcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xuKyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxuKyAqL1xuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcbitcdENISUxEX0VYSVRfT0sgPSAwLFxuK1x0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcbitcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcbitcdENISUxEX0VYSVRfUkVBRF9GSUxFLFxuK1x0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXG4rfTtcbitcbitzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXG4re1xuK1x0c3dpdGNoIChjb2RlKSB7XG4rXHRjYXNlIENISUxEX0VYSVRfT0s6XG4rXHRcdHJldHVybiBcInN1Y2Nlc3NcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcbitcdFx0cmV0dXJuIFwiam9pbiBjZ3JvdXBcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxuK1x0XHRyZXR1cm4gXCJ3cml0ZSBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XG4rXHRcdHJldHVybiBcInJlYWQgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxuK1x0XHRyZXR1cm4gXCJ3cml0ZSB0aW1lIGZpbGVcIjtcbitcdGRlZmF1bHQ6XG4rXHRcdHJldHVybiBcInVua25vd25cIjtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuK1xuK1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwibWVtb3J5XCIpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImVuYWJsZV9jb250cm9sbGVyc1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCIlbHVcIiwgQ0dfTElNSVQpO1xuK1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5tYXhcIiwgbGltaXRfYnVmKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHQvKlxuK1x0ICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlXG4rXHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxuK1x0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cbitcdCAqL1xuK1x0aWYgKCFhY2Nlc3MoXCIvcHJvYy9zd2Fwc1wiLCBGX09LKSkge1xuK1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ISUdIX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0xPV19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2c3RhcnQpO1xuK1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7XG4rXG4rXHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcbitcdHByaW50ZihcIiUuNmZcXG5cIiwgZWxhcHNlZCk7XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwid1wiKTtcbitcdGlmICghZnApXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1RJTUVfRklMRTtcbitcdGZwcmludGYoZnAsIFwiJS42ZlwiLCBlbGFwc2VkKTtcbitcdGZjbG9zZShmcCk7XG4rXG4rXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbit9XG4rXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0RklMRSAqZnA7XG4rXHRjaGFyIGJ1Zls2NF07XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwiclwiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcImZnZXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoc3NjYW5mKGJ1ZiwgXCIlbGZcIiwgdGltZSkgIT0gMSkge1xuK1x0XHRQUklOVF9GQUlMKFwic3NjYW5mICVzXCIsIGJ1Zik7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y29uc3QgY2hhciAqZGlyID0gd29ya2xvYWRfZmlsZXNfZGlyKCk7XG4rXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4rXHRwaWRfdCB3YWl0X3JldDtcbitcdGludCBmZCwgc3RhdHVzO1xuK1x0aW50IHJldCA9IC0xO1xuK1xuK1x0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcIiwgZGlyKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0aGlnaF9waWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCJmb3JrIGhpZ2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChoaWdoX3BpZCA9PSAwKVxuK1x0XHRfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdHdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwibG93IHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qXG4rXHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcbitcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxuK1x0ICovXG4rXHRsb3dfcGlkID0gLTE7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImxvdyBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImxvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcIixcbitcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbitcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwiaGlnaCB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHQvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi9cbitcdGhpZ2hfcGlkID0gLTE7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImhpZ2ggZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJoaWdoIGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cDpcbitcdC8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovXG4rXHRpZiAocmV0KSB7XG4rXHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuK1x0XHRcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHRcdGlmIChsb3dfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbitcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHR9XG4rXHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuK1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuK1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnRcbitzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbitcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbit7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbitcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xuK1x0XHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcbitcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuK1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuK1x0XHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXG4rXHR9O1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuK1x0XHQuY3R4X2luID0gXHUwMDI2YXJncyxcbitcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpKTtcbitcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbitcbitcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsIFx1MDAyNnJ1bl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCJwcm9nX2luaXQgcmV0dmFsXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcbitcdCpza2VsX3B0ciA9IHNrZWw7XG4rXHRyZXR1cm4gMDtcbitcbitlcnJvcl9vdXQ6XG4rXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKVxuK3tcbitcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbitcdGludCBlcnI7XG4rXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbitcbitcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwicmVjbGFpbWVkX2J5dGVzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWZcIixcbitcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbitcbitvdXQ6XG4rXHRpZiAoc2tlbClcbitcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjJjYTUxODUxNTBmZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSwxODEgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbitcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuKyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbitcdGlmICghY20tXHUwMDNlY2dycClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbitcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK31cbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAtMTtcbitcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbitcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuK1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4rXHRcdFx0XHQgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdGludCBpO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZWNsYWltX2NhbGxzKys7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcbitcdFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xuK1xuK1x0XHRpZiAoIW5yKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRyZWNsYWltZWRfYnl0ZXMgKz0gbnI7XG4rXHR9XG4rXG4rXHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbitcdF9fdHlwZShrZXksIF9fdTMyKTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuK30gd3FfbWFwIFNFQyhcIi5tYXBzXCIpO1xuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV93b3JrX2ZuKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcbitcdF9fdTMyIGtleSA9IDA7XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2d3FfbWFwLCBcdTAwMjZrZXkpO1xuK1x0aWYgKCFlbGVtKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjo1MC41MDI1OTEzNTZaIiwiU2VxIjoxMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTAwODAzNjI0MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUmV2aWV3aW5nIHRoZSBlQlBGIFByb2FjdGl2ZSBNZW1vcnkgUmVjbGFpbSBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIHdoaWNoIGlzIHByZXR0eSBpbnRlcmVzdGluZyBiZWNhdXNlIGl0IGFsbG93cyBlQlBGIHByb2dyYW1zIHRvIGFjdGl2ZWx5IHRyaWdnZXIgbWVtb3J5IHJlY2xhbWF0aW9uIHdpdGhpbiBhIG1lbW9yeSBjZ3JvdXAuIFBsdXMsIHRoZXJlJ3MgYSBuZXcgc2VsZnRlc3QgaW5jbHVkZWQsIHdoaWNoIGlzIGFsd2F5cyBnb29kIHRvIHNlZS5cblxuTG9va2luZyBhdCB0aGUgY2hhbmdlcywgaXQncyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLiBXZSBoYXZlIGFkZGl0aW9ucyB0byBgbW0vYnBmX21lbWNvbnRyb2wuY2A6IGEgaGVscGVyLCBgYnBmX2luX3JlY2xhaW1fY29udGV4dGAsIGFuZCB0aGUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAga2Z1bmMgaXRzZWxmLCB3aGljaCBpcyByZWdpc3RlcmVkIGFzIHNsZWVwYWJsZS4gVGhlbiwgdGhlIG9ibGlnYXRvcnkgc2VsZnRlc3RzIGFyZSBpbiBwbGFjZTogYSB0ZXN0IGZpbGUgYW5kIGFuIGFjY29tcGFueWluZyBwcm9ncmFtLlxuXG5UaGUgY29yZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhcHBlYXJzIHRvIGJlIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYy4gSXQgYWNjZXB0cyBhIGBtZW1fY2dyb3VwYCBwb2ludGVyIGFuZCBhIGBzaXplYC4gSW50ZXJuYWxseSwgaXQncyBjYWxsaW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuIFRoaXMgaXMgdGhlIGtleSBwaWVjZSB0byBhbmFseXplIGZvciBzZWN1cml0eSBjb25zaWRlcmF0aW9ucy5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHNjcnV0aW5pemUgd2hldGhlciB0aGlzIGV4cG9zZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBIb3dldmVyLCBhZnRlciBjYXJlZnVsIHJldmlldywgSSBkb24ndCBzZWUgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MuIFdlJ3JlIGVzc2VudGlhbGx5IHdyYXBwaW5nIGFuIGV4aXN0aW5nIGtlcm5lbCBmdW5jdGlvbi4gVGhlIGFyZ3VtZW50cyDigJMgYSBwb2ludGVyIHRvIGEgc3RydWN0IHZlcmlmaWVkIGJ5IEJQRiBhbmQgYSBzY2FsYXIgc2l6ZSDigJMgZG9uJ3QgcHJlc2VudCB0aGUgdHlwaWNhbCB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gVGhlcmUncyBubyBjb3B5aW5nIG9mIHN0cnVjdHVyZXMgdG8gdXNlcnNwYWNlLCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgd2l0aGluIHRoZSBCUEYgcHJvZ3JhbSBpdHNlbGYsIGFuZCBub3RoaW5nIHRoYXQgc2VlbXMgdG8gaW50cm9kdWNlIGFueSBwb3RlbnRpYWwgZm9yIHNlbnNpdGl2ZSBkYXRhIGxlYWthZ2UuXG5cblRoZSBwYXRjaCBtYWlubHkgZm9jdXNlcyBvbiBtZW1vcnkgbWFuYWdlbWVudCBhbmQgZUJQRiBpbnRlcmFjdGlvbnMuIEdpdmVuIHRoYXQsIEkgZG9uJ3QgdGhpbmsgS01TQU4gaXMgbmVjZXNzYXJ5IGhlcmUuIEtBU0FOIGFuZCBvdGhlciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyB0aGF0IG1pZ2h0IGJlIGludHJvZHVjZWQuXG5cbkxldCdzIGRvIGEgZmluYWwgcXVpY2sgc2FuaXR5IGNoZWNrIG9uIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC4gWWVwLCBpdCdzIHRoZSBzdGFuZGFyZCBtZW1vcnkgcmVjbGFpbSBmdW5jdGlvbiB3ZSdyZSBmYW1pbGlhciB3aXRoLlxuXG5BbHJpZ2h0LCB3aXRoIGFsbCB0aGF0IGNvbnNpZGVyZWQsIEkgd2lsbCBtYXJrIHRoaXMgcGF0Y2ggd2l0aCBOZWVkc0tNU0FOPWZhbHNlIGFuZCBwcm92aWRlIHRoZSBhYm92ZSByZWFzb25pbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk3MTAsIk91dHB1dFRva2VucyI6MjAyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDk0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjdUMTE6MTM6MDAuNTgyOTU2MjI1WiIsIlNlcSI6MTIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMzMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGVCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgd2hpY2ggYWN0cyBhcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGlzdGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZnVuY3Rpb24gdG8gYWxsb3cgcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltIGZyb20gZUJQRiBwcm9ncmFtcy4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIG9yIGluaXRpYWxpemUgY29tcGxleCBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBrZnVuYyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIgKGEgdmFsaWQgcG9pbnRlciB0byBgc3RydWN0IG1lbV9jZ3JvdXBgIGFuZCBhIHNjYWxhciBzaXplKS4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyBsaWtlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBvciBsb2NraW5nIGJ1Z3Mgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBlQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHdoaWNoIGFjdHMgYXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmcm9tIGVCUEYgcHJvZ3JhbXMuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbGxvY2F0ZSBvciBpbml0aWFsaXplIGNvbXBsZXggc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUga2Z1bmMgYXJlIHZhbGlkYXRlZCBieSB0aGUgQlBGIHZlcmlmaWVyIChhIHZhbGlkIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBzY2FsYXIgc2l6ZSkuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgbGlrZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgb3IgbG9ja2luZyBidWdzIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowkz254[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-27 10:44:45 +0000 UTC FinishedAt: 2026-08-27 11:13:02 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "48b69cc8825d411a4c4df32de854434e9235a1b0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "48b69cc8825d411a4c4df32de854434e9235a1b0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG" ], "series_id": "bde1e734-5682-40b9-aabe-2982eab01142" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI3IDExOjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBlQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHdoaWNoIGFjdHMgYXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmcm9tIGVCUEYgcHJvZ3JhbXMuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbGxvY2F0ZSBvciBpbml0aWFsaXplIGNvbXBsZXggc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUga2Z1bmMgYXJlIHZhbGlkYXRlZCBieSB0aGUgQlBGIHZlcmlmaWVyIChhIHZhbGlkIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBzY2FsYXIgc2l6ZSkuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgbGlrZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgb3IgbG9ja2luZyBidWdzIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCB0aGF0IGFsbG93cyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoaXMgZXhwb3NlcyBjb3JlIG1lbW9yeSByZWNsYWltIGxvZ2ljIChgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2ApIHRvIEJQRiBwcm9ncmFtcywgd2hpY2ggaXMgYSBuZXcgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBpdCBoYW5kbGVzIHZhcmlvdXMgaW5wdXRzIGFuZCBjb250ZXh0cyBjb3JyZWN0bHkgd2l0aG91dCBjYXVzaW5nIGRlYWRsb2NrcyBvciBtZW1vcnkgY29ycnVwdGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGJjOGE2MDlmYzcxYmZkOTNhNGNjYWYyNDlhMTdiNWIxM2M1ZDY4ZmFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEF1ZyAyNyAxMToxMjozMCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgJiM0Mzs2LDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG5AQCAtMTU5LDYgJiM0MzsxNjAsNDkgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZTogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG92ZXJ3cml0ZXNcbiYjNDM7ICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4mIzQzOyAqIHJlY2xhaW0gc3RhdGUuIFJlY2xhaW0gd2luZG93cyBhcmUgbWFya2VkIHdpdGggUEZfTUVNQUxMT0M7XG4mIzQzOyAqIHJlY2xhaW1fc3RhdGUgaXMgYWxzbyBjaGVja2VkIGJlY2F1c2UgaXQgaXMgaW5zdGFsbGVkIHNsaWdodGx5XG4mIzQzOyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAoY3VycmVudC1cdTAwM2VmbGFncyBcdTAwMjYgUEZfTUVNQUxMT0MpIHx8IGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4mIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4mIzQzOyAqXG4mIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiYjNDM7ICogbWVtb3J5LnJlY2xhaW0sIGJ1dCB3aXRob3V0IHJldHJ5aW5nIHVudGlsIEBzaXplIGlzIHJlYWNoZWQuXG4mIzQzOyAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcbiYjNDM7ICogbWF5IGRlYWRsb2NrIG9uIGl0IHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXG4mIzQzOyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2Ugb3IgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0gY29udGV4dC5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiYjNDM7XHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7XG4mIzQzO1xuJiM0MztcdGlmIChzaXplIFx1MDAzYyBQQUdFX1NJWkUgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBzaXplIC8gUEFHRV9TSVpFLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuJiM0MztcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBOVUxMKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbiYjNDM7fVxuJiM0MztcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3Miw2ICYjNDM7MjE2LDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4mIzQzO1xuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjEyNzBkNzNjOTExNmVcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCAmIzQzOzEsNDgwIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbWl0cy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9oZWxwZXJzLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfYXJncyB7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4mIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4mIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbiYjNDM7I2RlZmluZSBSRUFEX1RJTUVTIDUwXG4mIzQzO1xuJiM0MzsjZGVmaW5lIENHX0RJUiBcJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbVwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcJiMzNDsvaGlnaFwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwmIzM0Oy9sb3dcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4mIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXG4mIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4mIzQzOyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbiYjNDM7ICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcbiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuJiM0MzsgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN0YXRmcyBzdDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFzdGF0ZnMoXCYjMzQ7L3RtcFwmIzM0OywgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7LlwmIzM0OztcbiYjNDM7XHRyZXR1cm4gXCYjMzQ7L3RtcFwmIzM0OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xuJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4mIzQzOyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4mIzQzOyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxuJiM0MzsgKi9cbiYjNDM7ZW51bSBjaGlsZF9leGl0X2NvZGUge1xuJiM0MztcdENISUxEX0VYSVRfT0sgPSAwLFxuJiM0MztcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4mIzQzO1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuJiM0MztcdENISUxEX0VYSVRfUkVBRF9GSUxFLFxuJiM0MztcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuJiM0Mzt7XG4mIzQzO1x0c3dpdGNoIChjb2RlKSB7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX09LOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3N1Y2Nlc3NcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O2pvaW4gY2dyb3VwXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3dyaXRlIGRhdGEgZmlsZVwmIzM0OztcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuJiM0MztcdFx0cmV0dXJuIFwmIzM0O3JlYWQgZGF0YSBmaWxlXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7d3JpdGUgdGltZSBmaWxlXCYjMzQ7O1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7dW5rbm93blwmIzM0OztcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcdGNoYXIgbGltaXRfYnVmWzIwXTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcJiMzNDttZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCYjMzQ7JWx1XCYjMzQ7LCBDR19MSU1JVCk7XG4mIzQzO1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkubWF4XCYjMzQ7LCBsaW1pdF9idWYpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlXG4mIzQzO1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbiYjNDM7XHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghYWNjZXNzKFwmIzM0Oy9wcm9jL3N3YXBzXCYjMzQ7LCBGX09LKSkge1xuJiM0MztcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkuc3dhcC5tYXhcJiMzNDssIFwmIzM0OzBcJiMzNDspO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ISUdIX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19MT1dfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwmIzM0O2dldF9jZ3JvdXBfaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4mIzQzO1x0Y2hhciAqYnVmZmVyO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcJiMzNDt3YlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFmcClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xuJiM0MztcdGlmICghYnVmZmVyKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZwO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoYnVmZmVyLCAmIzM5O0EmIzM5OywgQlVGRkVSX1NJWkUpO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4mIzQzO1x0XHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFx1MDAzYyBCVUZGRVJfU0laRSA/XG4mIzQzO1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRcdHdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmcmVlKGJ1ZmZlcik7XG4mIzQzO2NsZWFudXBfZnA6XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbiYjNDM7XHRjaGFyICptYXA7XG4mIzQzO1x0c2l6ZV90IGk7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcdHN0cnVjdCBzdGF0IHNiO1xuJiM0MztcbiYjNDM7XHRmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoZmQgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O0ZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTtcbiYjNDM7XHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHtcbiYjNDM7XHRcdFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cbiYjNDM7XHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuJiM0MztcdFx0XHQodm9pZCl2O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwX2ZkOlxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4mIzQzO1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbiYjNDM7XHRkb3VibGUgZWxhcHNlZDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbiYjNDM7XG4mIzQzO1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNnN0YXJ0KTtcbiYjNDM7XG4mIzQzO1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xuJiM0MztcbiYjNDM7XHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xuJiM0MztcbiYjNDM7XHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO1xuJiM0MztcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MztcbiYjNDM7XHRcdCAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7XG4mIzQzO1x0cHJpbnRmKFwmIzM0OyUuNmZcXG5cJiMzNDssIGVsYXBzZWQpO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XG4mIzQzO1x0ZnByaW50ZihmcCwgXCYjMzQ7JS42ZlwmIzM0OywgZWxhcHNlZCk7XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcdGNoYXIgYnVmWzY0XTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcJiMzNDtmZ2V0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGlmIChzc2NhbmYoYnVmLCBcJiMzNDslbGZcJiMzNDssIHRpbWUpICE9IDEpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7c3NjYW5mICVzXCYjMzQ7LCBidWYpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuJiM0MztcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xuJiM0MztcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbiYjNDM7XHRwaWRfdCB3YWl0X3JldDtcbiYjNDM7XHRpbnQgZmQsIHN0YXR1cztcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OywgZGlyKTtcbiYjNDM7XHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcdHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGxvd19waWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCYjMzQ7Zm9yayBsb3dcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChsb3dfcGlkID09IDApXG4mIzQzO1x0XHRfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4mIzQzO1xuJiM0MztcdGhpZ2hfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcJiMzNDtmb3JrIGhpZ2hcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChoaWdoX3BpZCA9PSAwKVxuJiM0MztcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuJiM0MztcbiYjNDM7XHR3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCYjMzQ7bG93IHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXG4mIzQzO1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4mIzQzO1x0ICovXG4mIzQzO1x0bG93X3BpZCA9IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2xvdyBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7bG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4mIzQzO1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0d2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcJiMzNDtoaWdoIHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuJiM0MztcdGhpZ2hfcGlkID0gLTE7XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7aGlnaCBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7aGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuJiM0MztcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAobG93X3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuJiM0MztcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcbiYjNDM7XHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuJiM0MztcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuJiM0MztcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xuJiM0MztcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4mIzQzO1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4mIzQzO1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuJiM0MztcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuJiM0MztcdH07XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuJiM0MztcdFx0LmN0eF9pbiA9IFx1MDAyNmFyZ3MsXG4mIzQzO1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuJiM0MztcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyb3Jfb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCYjMzQ7cHJvZ19pbml0IHJldHZhbFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XG4mIzQzO1x0KnNrZWxfcHRyID0gc2tlbDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2Vycm9yX291dDpcbiYjNDM7XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW0odm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfYnBmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuJiM0MztcdCAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbVxuJiM0MztcdCAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX2NhbGxzLCAwLCBcJiMzNDtyZWNsYWltX2NhbGxzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgMCwgXCYjMzQ7cmVjbGFpbWVkX2J5dGVzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpXG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWZcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChza2VsKVxuJiM0MztcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iMmNhNTE4NTE1MGZlXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICYjNDM7MSwxODEgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfZXhwZXJpbWVudGFsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbiYjNDM7I2RlZmluZSBQQUdFX1NJWkVcdFx0NDA5NlVMXG4mIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSXHQzMlxuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5XG4mIzQzOyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLlxuJiM0MzsgKi9cbiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7XG4mIzQzO3U2NCByZWNsYWltZWRfYnl0ZXM7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbiYjNDM7e1xuJiM0MztcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIWNtLVx1MDAzZWNncnApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuJiM0MztcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuJiM0MztcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4mIzQzO1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4mIzQzO1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4mIzQzO1x0XHRcdFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbFxuJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGN1ciwgZGVsdGE7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbiYjNDM7XHQqcHJldl9ldmVudCA9IGN1cjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFucilcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRyZWNsYWltZWRfYnl0ZXMgJiM0Mzs9IG5yO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7XG4mIzQzO1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4mIzQzO1x0dTY0IHByZXZfZXZlbnQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO1x0X190eXBlKGtleSwgX191MzIpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuJiM0Mzt9IHdxX21hcCBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xuJiM0MztcbiYjNDM7XHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4mIzQzO1x0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcbiYjNDM7XHRcdHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpO1xuJiM0MztcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbiYjNDM7e1xuJiM0MztcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4mIzQzO1x0aWYgKCFlbGVtKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGltZXJfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuJiM0MztcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuJiM0MztcbiYjNDM7XHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjcgMTE6MTI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYmM4YTYwOWZjNzFiZmQ5M2E0Y2NhZjI0OWExN2I1YjEzYzVkNjhmYQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgQXVnIDI3IDExOjEyOjMwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDQ5IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzCiYjNDM7ICogY3VycmVudC0mZ3Q7cmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlcgomIzQzOyAqIHJlY2xhaW0gc3RhdGUuIFJlY2xhaW0gd2luZG93cyBhcmUgbWFya2VkIHdpdGggUEZfTUVNQUxMT0M7CiYjNDM7ICogcmVjbGFpbV9zdGF0ZSBpcyBhbHNvIGNoZWNrZWQgYmVjYXVzZSBpdCBpcyBpbnN0YWxsZWQgc2xpZ2h0bHkKJiM0MzsgKiBiZWZvcmUgUEZfTUVNQUxMT0MuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIChjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQykgfHwgY3VycmVudC0mZ3Q7cmVjbGFpbV9zdGF0ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhIGZpbGVzeXN0ZW0gbG9jayBoZWxkOiB0aGUgcmVjbGFpbSBwYXRoCiYjNDM7ICogbWF5IGRlYWRsb2NrIG9uIGl0IHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpcwomIzQzOyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2Ugb3IgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0gY29udGV4dC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7CiYjNDM7CiYjNDM7CWlmIChzaXplICZsdDsgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJbnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSwKJiM0MzsJCQkJCQkgICAgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8CiYjNDM7CQkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJCSAgICBOVUxMKTsKJiM0MzsKJiM0MzsJcmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTsKJiM0Mzt9CiYjNDM7CiBfX2JwZl9rZnVuY19lbmRfZGVmcygpOwogCiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcykKQEAgLTE3Miw2ICYjNDM7MjE2LDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKIAomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSkKJiM0MzsKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xMjcwZDczYzkxMTZlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDQ4MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKQomIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDEKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwCiYjNDM7ICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGQKJiM0MzsgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkCiYjNDM7ICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUKJiM0MzsgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiYjNDM7ICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdGZzIHN0OwomIzQzOwomIzQzOwlpZiAoIXN0YXRmcygmIzM0Oy90bXAmIzM0OywgJmFtcDtzdCkgJmFtcDsmYW1wOwomIzQzOwkgICAgKHN0LmZfdHlwZSA9PSBUTVBGU19NQUdJQyB8fCBzdC5mX3R5cGUgPT0gUkFNRlNfTUFHSUMpKQomIzQzOwkJcmV0dXJuICYjMzQ7LiYjMzQ7OwomIzQzOwlyZXR1cm4gJiMzNDsvdG1wJiMzNDs7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzbwomIzQzOyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWQKJiM0MzsgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlcwomIzQzOyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLgomIzQzOyAqLwomIzQzO2VudW0gY2hpbGRfZXhpdF9jb2RlIHsKJiM0MzsJQ0hJTERfRVhJVF9PSyA9IDAsCiYjNDM7CUNISUxEX0VYSVRfSk9JTl9DR1JPVVAsCiYjNDM7CUNISUxEX0VYSVRfV1JJVEVfRklMRSwKJiM0MzsJQ0hJTERfRVhJVF9SRUFEX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfVElNRV9GSUxFLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKQomIzQzO3sKJiM0MzsJc3dpdGNoIChjb2RlKSB7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9PSzoKJiM0MzsJCXJldHVybiAmIzM0O3N1Y2Nlc3MmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOgomIzQzOwkJcmV0dXJuICYjMzQ7am9pbiBjZ3JvdXAmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDt3cml0ZSBkYXRhIGZpbGUmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1JFQURfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3JlYWQgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDt3cml0ZSB0aW1lIGZpbGUmIzM0OzsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCXJldHVybiAmIzM0O3Vua25vd24mIzM0OzsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsJY2hhciBsaW1pdF9idWZbMjBdOwomIzQzOwomIzQzOwlyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJcmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgJiMzNDttZW1vcnkmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtlbmFibGVfY29udHJvbGxlcnMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksICYjMzQ7JWx1JiMzNDssIENHX0xJTUlUKTsKJiM0MzsJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCAmIzM0O21lbW9yeS5tYXgmIzM0OywgbGltaXRfYnVmKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXgmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZQomIzQzOwkgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlbgomIzQzOwkgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0hJR0hfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfTE9XX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpOwomIzQzOwlwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7CiYjNDM7CXBpZF90IHdhaXRfcmV0OwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy53cV9wcm9nX2luaXQpOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5iMmNhNTE4NTE1MGZlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwxODEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRAkxCiYjNDM7I2RlZmluZSBQQUdFX1NJWkUJCTQwOTZVTAomIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFCQkoMzIgKiBQQUdFX1NJWkUpCiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSCTMyCiYjNDM7CiYjNDM7c3RydWN0IGJwZl9hcmdzIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnA7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOy8qCiYjNDM7ICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnkKJiM0MzsgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS4KJiM0MzsgKi8KJiM0Mzt1NjQgcmVjbGFpbV9jYWxsczsKJiM0Mzt1NjQgcmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csCiYjNDM7CQlicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sCiYjNDM7CQkJCSAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wKJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKQomIzQzO3sKJiM0MzsJdTY0IGN1ciwgZGVsdGE7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgJmFtcDtjdXIpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50OwomIzQzOwkqcHJldl9ldmVudCA9IGN1cjsKJiM0MzsKJiM0MzsJcmV0dXJuIGRlbHRhICZndDs9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZWNsYWltX2NhbGxzJiM0MzsmIzQzOzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7CiYjNDM7CiYjNDM7CQlpZiAoIW5yKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcmVjbGFpbWVkX2J5dGVzICYjNDM7PSBucjsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CiYjNDM7CWlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsICZhbXA7ZWxlbS0mZ3Q7cHJldl9ldmVudCwKJiM0MzsJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHsKJiM0MzsJCXJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpOwomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgcmVjbGFpbV93b3JrX2ZuLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9pbml0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsICZhbXA7d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB3cV90aW1lcl9jYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwllbGVtLSZndDtwcmV2X2V2ZW50ID0gMDsKJiM0MzsJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CWVsZW0tJmd0O2NoZWNrX25zID0gY3R4LSZndDtjaGVja19uczsKJiM0MzsKJiM0MzsJd3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtJmd0O2hpZ2hfY2dyb3VwX2lkOwomIzQzOwl3cV9sb3dfY2dyb3VwX2lkID0gY3R4LSZndDtsb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NzEzCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMzcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTmV3IEJQRiBQcm9hY3RpdmUgUmVjbGFpbSBGdW5jdGlvbioqCgpPa2F5LCBzbyB0aGVyZSYjMzk7cyBhIG5ldyBwYXRjaCBhZGRpbmcgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGtmdW5jIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gVGhpcyBpcyBpbnRyaWd1aW5nIOKAkyBpdCBnaXZlcyBCUEYgcHJvZ3JhbXMgdGhlIGFiaWxpdHkgdG8gdHJpZ2dlciBtZW1vcnkgcmVjbGFpbSB3aXRoaW4gYSBtZW1vcnkgY2dyb3VwLiBNeSBpbml0aWFsIHRob3VnaHQgaXM6IHRoaXMgbmVlZHMgYSB0aG9yb3VnaCBsb29rLiBJdCYjMzk7cyBhIG5ldyBCUEYgZW50cnkgcG9pbnQsIG1lYW5pbmcgaXQmIzM5O3MgYSBuZXcgYXR0YWNrIHN1cmZhY2UsIGFuZCBjb3VsZCBwb3RlbnRpYWxseSBpbnRlcmFjdCB3aXRoIGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIHBhdGNoIGFsc28gaW5jbHVkZXMgYSBzZWxmdGVzdCwgd2hpY2ggaXMgZ29vZCwgYnV0IGRvZXNuJiMzOTt0IHJlcGxhY2UgbXkgb3duIHNjcnV0aW55LgoKTGV0JiMzOTtzIGRpc3NlY3QgdGhlIGltcGxlbWVudGF0aW9uOiB0aGUgY29yZSBvZiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBpcyBzdHJhaWdodGZvcndhcmQsIGl0IGNoZWNrcyB0aGUgaW5wdXQgc2l6ZSBhbmQgcmVjbGFpbSBjb250ZXh0LiBJZiBpdCYjMzk7cyBzYWZlIGl0IGNhbGxzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC4gR2l2ZW4gdGhhdCB0aGlzIGlzIG5ldyBmdW5jdGlvbmFsaXR5IHRoYXQgZGlyZWN0bHkgaW1wYWN0cyBtZW1vcnkgcmVjbGFpbSBsb2dpYywgaXQmIzM5O3MgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMga2Z1bmMgaXMgYWRkZWQgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdCBmb3IgdGhlIGZ1enppbmcgc2V0dXAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgbmV3IGVudHJ5cG9pbnQsIGl0cyBwcmVjb25kaXRpb25zLCBhbmQgYW55IHBvdGVudGlhbCBzaWRlIGVmZmVjdHMuCgpOZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IGhvdyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBpcyBhY3R1YWxseSBjb21waWxlZCBhbmQgcmVhY2hhYmxlLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIGBtbS9NYWtlZmlsZWAgdG8gc2VlIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBgYnBmX21lbWNvbnRyb2wuY2AgZ2V0cyBpbmNsdWRlZCBhbmQgYnVpbHQuIFVuZGVyc3RhbmRpbmcgaXRzIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgaW5jbHVzaW9uIHByb2Nlc3MgaXMgY3JpdGljYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIG92ZXJhbGwgYXR0YWNrIHN1cmZhY2UgYW5kIGVuc3VyaW5nIGNvcnJlY3QgZnV6emluZyBzZXR1cC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticGZfbWVtY29udHJvbC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI3IDExOjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNTAzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgdGhvdWdodHMsIGZvcm1hdHRlZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipBc3Nlc3NpbmcgQlBGIGFuZCBNZW1vcnkgQ0dyb3VwcyBpbiB0aGUgS2VybmVsKioKCkFscmlnaHQsIHNvIHRoZSB0YXNrIGF0IGhhbmQgbG9va3MgdG8gYmUgZGVwZW5kZW50IG9uIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX01FTUNHYC4gVGhvc2UgYXJlIHRoZSBiYXNlbGluZSByZXF1aXJlbWVudHMsIHdoaWNoIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gTm93LCBJIHNob3VsZCBpbnZlc3RpZ2F0ZSBmdXJ0aGVyOyBtYXliZSBzb21lIG90aGVyIG9ic2N1cmUgZmVhdHVyZXMgYXJlIGJyb3VnaHQgaW4gdG9vPwoKYGJwZl9pbl9yZWNsYWltX2NvbnRleHRgIGp1bXBzIG91dCBhdCBtZSBhcyBhIHBvdGVudGlhbCBwb2ludCBvZiBpbnRlcmVzdC4gSXQmIzM5O3MgbWFya2VkIGFzIGEgc3RhdGljIGhlbHBlciwgc28gaXQgaXMgcXVpdGUgcG9zc2libHkgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdGhhdCBtaWdodCBiZSBhZGRlZCB0byBteSB3b3JrLgoKQW5kIG5vdyBJIHNob3VsZCBwcm9iYWJseSBjaGVjayBgbW0vdm1zY2FuLmNgLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGxvb2sgY2xvc2VseSBhdCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoaXMgd2lsbCBsaWtlbHkgcmV2ZWFsIGhvdyBwYWdlcyBhcmUgYWN0dWFsbHkgZnJlZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgbWVtb3J5IGNncm91cCwgYW5kIHdoZXRoZXIgbXkgcHJldmlvdXMgZmluZGluZ3MgYXJlIHBlcnRpbmVudC4gVW5kZXJzdGFuZGluZyB0aGlzIGlzIGtleSB0byBnZXR0aW5nIHRoZSBjb21wbGV0ZSBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI3IDExOjEyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vYnBmX21lbWNvbnRyb2wuYz0xNTg9X19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0xNjMtLypcbm1tL2JwZl9tZW1jb250cm9sLmM6MTY0OiAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZTogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG92ZXJ3cml0ZXNcbm1tL2JwZl9tZW1jb250cm9sLmMtMTY1LSAqIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlclxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmM9MTg5PV9fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE5Ni1cbm1tL2JwZl9tZW1jb250cm9sLmM6MTk3Olx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTk4LVx0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYz0xNDgxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNTIyOlx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMy1cdFx0XHRcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE1NDA9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1My1cbm1tL21lbWNvbnRyb2wtdjEuYzoxNTU0Olx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1NS1cdFx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL21lbWNvbnRyb2wuYz0yMzI4PXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2xhaW1faGlnaChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vbWVtY29udHJvbC5jLTIzNDMtXHRcdHBzaV9tZW1zdGFsbF9lbnRlcihcdTAwMjZwZmxhZ3MpO1xubW0vbWVtY29udHJvbC5jOjIzNDQ6XHRcdG5yX3JlY2xhaW1lZCAmIzQzOz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjM0NS1cdFx0XHRcdFx0XHRcdGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYz0yNTk1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYy0yNjU0LVx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjY1NTpcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxubW0vbWVtY29udHJvbC5jLTI2NTYtXHRcdFx0XHRcdFx0ICAgIGdmcF9tYXNrLCByZWNsYWltX29wdGlvbnMsIE5VTEwpO1xuLS1cbm1tL21lbWNvbnRyb2wuYz00NzY4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDgwMi1cbm1tL21lbWNvbnRyb2wuYzo0ODAzOlx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXG5tbS9tZW1jb250cm9sLmMtNDgwNC1cdFx0XHRcdFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ4MjA9c3RhdGljIHNzaXplX3QgbWVtb3J5X21heF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC5jLTQ4NTQtXHRcdGlmIChucl9yZWNsYWltcykge1xubW0vbWVtY29udHJvbC5jOjQ4NTU6XHRcdFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcbm1tL21lbWNvbnRyb2wuYy00ODU2LVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcbi0tXG5tbS92bXNjYW4uYz02NzIyPXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vdm1zY2FuLmMtNjc2MS1cbm1tL3Ztc2Nhbi5jOjY3NjI6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL3Ztc2Nhbi5jLTY3NjMtXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vdm1zY2FuLmMtNjgwMi0jZWxzZVxubW0vdm1zY2FuLmM6NjgwMzp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjgwNC1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYz03ODY2PWludCB1c2VyX3Byb2FjdGl2ZV9yZWNsYWltKGNoYXIgKmJ1Zixcbi0tXG5tbS92bXNjYW4uYy03OTMzLVx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xubW0vdm1zY2FuLmM6NzkzNDpcdFx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxubW0vdm1zY2FuLmMtNzkzNS1cdFx0XHRcdFx0XHQgYmF0Y2hfc2l6ZSwgZ2ZwX21hc2ssXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjcgMTE6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIxNDYKCQkJCQkJCW91dHB1dDogMTQyCgkJCQkJCQl0aG91Z2h0czogMjIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoJiMzOTtzIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgYSBuZXcgQlBGIGtmdW5jLiBHaXZlbiBteSBleHBlcmllbmNlLCBJIGltbWVkaWF0ZWx5IHNlZSB0aGUgZnV6emluZyBpbXBsaWNhdGlvbnMuIFRoaXMgaXMgZGVmaW5pdGVseSB3b3J0aCBleHBsb3JpbmcgdGhvcm91Z2hseS4gTXkgcHJpbWFyeSBmb2N1cyBzaG91bGQgYmUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAuCgpJIGRvdWJsZS1jaGVja2VkOyB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMgYXJlIGp1c3QgYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kIGBDT05GSUdfTUVNQ0dgLCB3aGljaCBpcyBzdGFuZGFyZCBmb3IgQlBGIGludGVyYWN0aW9uIHdpdGggbWVtb3J5IGNvbnRyb2wgZ3JvdXBzLiBOb3RoaW5nIHVudXN1YWwgdGhlcmUuIFRoZSBkb2N1bWVudGF0aW9uIGNvbmZpcm1zIHRoYXQgdGhpcyBuZXcga2Z1bmMgaXMgdGhlIG9ubHkgQVBJIGJlaW5nIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UuCgpOb3csIGxldCYjMzk7cyBjb25zb2xpZGF0ZSBteSBmaW5kaW5ncyBpbnRvIGEgZm9ybWFsIHJlc3BvbnNlLiBJdCYjMzk7cyBjbGVhcjogdGhpcyAqaXMqIHdvcnRoIGZ1enppbmcuIEkmIzM5O2xsIG5lZWQgdG8gZm9jdXMgb24gYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAuIFRoZSBhY3RpdmF0aW9uIGNvbmZpZ3Mgd2lsbCBiZSBgQlBGX1NZU0NBTExgIGFuZCBgTUVNQ0dgLiBNeSByZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOiBhIG5ldyBCUEYgQVBJIHNwZWNpZmljYWxseSB0YXJnZXRpbmcgbWVtb3J5IG1hbmFnZW1lbnQgbmVjZXNzaXRhdGVzIHJpZ29yb3VzIGZ1enppbmcgdG8gZXZhbHVhdGUgaXQgYWdhaW5zdCBtYWxpY2lvdXMgaW5wdXRzIG9yIG1pc2NvbmZpZ3VyZWQgY29udGV4dHMsIGFuZCBhbnkgcG90ZW50aWFsIGlzc3VlcyByZWdhcmRpbmcgbWVtb3J5IG1hbmFnZW1lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjcgMTE6MTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtNRU1DRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCB0aGF0IGFsbG93cyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoaXMgZXhwb3NlcyBjb3JlIG1lbW9yeSByZWNsYWltIGxvZ2ljIChgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2ApIHRvIEJQRiBwcm9ncmFtcywgd2hpY2ggaXMgYSBuZXcgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBpdCBoYW5kbGVzIHZhcmlvdXMgaW5wdXRzIGFuZCBjb250ZXh0cyBjb3JyZWN0bHkgd2l0aG91dCBjYXVzaW5nIGRlYWRsb2NrcyBvciBtZW1vcnkgY29ycnVwdGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI3IDExOjEyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZUJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCB3aGljaCBhY3RzIGFzIGEgd3JhcHBlciBhcm91bmQgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZnJvbSBlQlBGIHByb2dyYW1zLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgb3IgaW5pdGlhbGl6ZSBjb21wbGV4IHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGtmdW5jIGFyZSB2YWxpZGF0ZWQgYnkgdGhlIEJQRiB2ZXJpZmllciAoYSB2YWxpZCBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgc2NhbGFyIHNpemUpLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGxpa2Ugb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIG9yIGxvY2tpbmcgYnVncyB3b3VsZCBiZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYmM4YTYwOWZjNzFiZmQ5M2E0Y2NhZjI0OWExN2I1YjEzYzVkNjhmYQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgQXVnIDI3IDExOjEyOjMwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDQ5IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzCiYjNDM7ICogY3VycmVudC0mZ3Q7cmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlcgomIzQzOyAqIHJlY2xhaW0gc3RhdGUuIFJlY2xhaW0gd2luZG93cyBhcmUgbWFya2VkIHdpdGggUEZfTUVNQUxMT0M7CiYjNDM7ICogcmVjbGFpbV9zdGF0ZSBpcyBhbHNvIGNoZWNrZWQgYmVjYXVzZSBpdCBpcyBpbnN0YWxsZWQgc2xpZ2h0bHkKJiM0MzsgKiBiZWZvcmUgUEZfTUVNQUxMT0MuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIChjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQykgfHwgY3VycmVudC0mZ3Q7cmVjbGFpbV9zdGF0ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhIGZpbGVzeXN0ZW0gbG9jayBoZWxkOiB0aGUgcmVjbGFpbSBwYXRoCiYjNDM7ICogbWF5IGRlYWRsb2NrIG9uIGl0IHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpcwomIzQzOyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2Ugb3IgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0gY29udGV4dC4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7CiYjNDM7CiYjNDM7CWlmIChzaXplICZsdDsgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJbnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSwKJiM0MzsJCQkJCQkgICAgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8CiYjNDM7CQkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJCSAgICBOVUxMKTsKJiM0MzsKJiM0MzsJcmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTsKJiM0Mzt9CiYjNDM7CiBfX2JwZl9rZnVuY19lbmRfZGVmcygpOwogCiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcykKQEAgLTE3Miw2ICYjNDM7MjE2LDggQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKIAomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSkKJiM0MzsKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xMjcwZDczYzkxMTZlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDQ4MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKQomIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDEKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwCiYjNDM7ICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGQKJiM0MzsgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkCiYjNDM7ICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUKJiM0MzsgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiYjNDM7ICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdGZzIHN0OwomIzQzOwomIzQzOwlpZiAoIXN0YXRmcygmIzM0Oy90bXAmIzM0OywgJmFtcDtzdCkgJmFtcDsmYW1wOwomIzQzOwkgICAgKHN0LmZfdHlwZSA9PSBUTVBGU19NQUdJQyB8fCBzdC5mX3R5cGUgPT0gUkFNRlNfTUFHSUMpKQomIzQzOwkJcmV0dXJuICYjMzQ7LiYjMzQ7OwomIzQzOwlyZXR1cm4gJiMzNDsvdG1wJiMzNDs7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzbwomIzQzOyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWQKJiM0MzsgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlcwomIzQzOyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLgomIzQzOyAqLwomIzQzO2VudW0gY2hpbGRfZXhpdF9jb2RlIHsKJiM0MzsJQ0hJTERfRVhJVF9PSyA9IDAsCiYjNDM7CUNISUxEX0VYSVRfSk9JTl9DR1JPVVAsCiYjNDM7CUNISUxEX0VYSVRfV1JJVEVfRklMRSwKJiM0MzsJQ0hJTERfRVhJVF9SRUFEX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfVElNRV9GSUxFLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKQomIzQzO3sKJiM0MzsJc3dpdGNoIChjb2RlKSB7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9PSzoKJiM0MzsJCXJldHVybiAmIzM0O3N1Y2Nlc3MmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOgomIzQzOwkJcmV0dXJuICYjMzQ7am9pbiBjZ3JvdXAmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDt3cml0ZSBkYXRhIGZpbGUmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1JFQURfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3JlYWQgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDt3cml0ZSB0aW1lIGZpbGUmIzM0OzsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCXJldHVybiAmIzM0O3Vua25vd24mIzM0OzsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsJY2hhciBsaW1pdF9idWZbMjBdOwomIzQzOwomIzQzOwlyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJcmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgJiMzNDttZW1vcnkmIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtlbmFibGVfY29udHJvbGxlcnMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksICYjMzQ7JWx1JiMzNDssIENHX0xJTUlUKTsKJiM0MzsJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCAmIzM0O21lbW9yeS5tYXgmIzM0OywgbGltaXRfYnVmKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXgmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZQomIzQzOwkgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlbgomIzQzOwkgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0hJR0hfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfTE9XX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpOwomIzQzOwlwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7CiYjNDM7CXBpZF90IHdhaXRfcmV0OwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy53cV9wcm9nX2luaXQpOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5iMmNhNTE4NTE1MGZlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwxODEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRAkxCiYjNDM7I2RlZmluZSBQQUdFX1NJWkUJCTQwOTZVTAomIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFCQkoMzIgKiBQQUdFX1NJWkUpCiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSCTMyCiYjNDM7CiYjNDM7c3RydWN0IGJwZl9hcmdzIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnA7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOy8qCiYjNDM7ICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnkKJiM0MzsgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS4KJiM0MzsgKi8KJiM0Mzt1NjQgcmVjbGFpbV9jYWxsczsKJiM0Mzt1NjQgcmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csCiYjNDM7CQlicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sCiYjNDM7CQkJCSAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wKJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKQomIzQzO3sKJiM0MzsJdTY0IGN1ciwgZGVsdGE7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgJmFtcDtjdXIpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50OwomIzQzOwkqcHJldl9ldmVudCA9IGN1cjsKJiM0MzsKJiM0MzsJcmV0dXJuIGRlbHRhICZndDs9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZWNsYWltX2NhbGxzJiM0MzsmIzQzOzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1NjQgbnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSk7CiYjNDM7CiYjNDM7CQlpZiAoIW5yKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcmVjbGFpbWVkX2J5dGVzICYjNDM7PSBucjsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CiYjNDM7CWlmIChzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsICZhbXA7ZWxlbS0mZ3Q7cHJldl9ldmVudCwKJiM0MzsJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHsKJiM0MzsJCXJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQpOwomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgcmVjbGFpbV93b3JrX2ZuLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9pbml0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsICZhbXA7d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB3cV90aW1lcl9jYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwllbGVtLSZndDtwcmV2X2V2ZW50ID0gMDsKJiM0MzsJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CWVsZW0tJmd0O2NoZWNrX25zID0gY3R4LSZndDtjaGVja19uczsKJiM0MzsKJiM0MzsJd3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtJmd0O2hpZ2hfY2dyb3VwX2lkOwomIzQzOwl3cV9sb3dfY2dyb3VwX2lkID0gY3R4LSZndDtsb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjcgMTE6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTcxMAoJCQkJCQkJb3V0cHV0OiAyMDIKCQkJCQkJCXRob3VnaHRzOiA0OTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUmV2aWV3aW5nIHRoZSBlQlBGIFByb2FjdGl2ZSBNZW1vcnkgUmVjbGFpbSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgd2hpY2ggaXMgcHJldHR5IGludGVyZXN0aW5nIGJlY2F1c2UgaXQgYWxsb3dzIGVCUEYgcHJvZ3JhbXMgdG8gYWN0aXZlbHkgdHJpZ2dlciBtZW1vcnkgcmVjbGFtYXRpb24gd2l0aGluIGEgbWVtb3J5IGNncm91cC4gUGx1cywgdGhlcmUmIzM5O3MgYSBuZXcgc2VsZnRlc3QgaW5jbHVkZWQsIHdoaWNoIGlzIGFsd2F5cyBnb29kIHRvIHNlZS4KCkxvb2tpbmcgYXQgdGhlIGNoYW5nZXMsIGl0JiMzOTtzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuIFdlIGhhdmUgYWRkaXRpb25zIHRvIGBtbS9icGZfbWVtY29udHJvbC5jYDogYSBoZWxwZXIsIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCwgYW5kIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYyBpdHNlbGYsIHdoaWNoIGlzIHJlZ2lzdGVyZWQgYXMgc2xlZXBhYmxlLiBUaGVuLCB0aGUgb2JsaWdhdG9yeSBzZWxmdGVzdHMgYXJlIGluIHBsYWNlOiBhIHRlc3QgZmlsZSBhbmQgYW4gYWNjb21wYW55aW5nIHByb2dyYW0uCgpUaGUgY29yZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhcHBlYXJzIHRvIGJlIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYy4gSXQgYWNjZXB0cyBhIGBtZW1fY2dyb3VwYCBwb2ludGVyIGFuZCBhIGBzaXplYC4gSW50ZXJuYWxseSwgaXQmIzM5O3MgY2FsbGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2Agd2l0aCB0aGUgYXBwcm9wcmlhdGUgYXJndW1lbnRzLiBUaGlzIGlzIHRoZSBrZXkgcGllY2UgdG8gYW5hbHl6ZSBmb3Igc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMuCgpNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gc2NydXRpbml6ZSB3aGV0aGVyIHRoaXMgZXhwb3NlcyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkuIEhvd2V2ZXIsIGFmdGVyIGNhcmVmdWwgcmV2aWV3LCBJIGRvbiYjMzk7dCBzZWUgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MuIFdlJiMzOTtyZSBlc3NlbnRpYWxseSB3cmFwcGluZyBhbiBleGlzdGluZyBrZXJuZWwgZnVuY3Rpb24uIFRoZSBhcmd1bWVudHMg4oCTIGEgcG9pbnRlciB0byBhIHN0cnVjdCB2ZXJpZmllZCBieSBCUEYgYW5kIGEgc2NhbGFyIHNpemUg4oCTIGRvbiYjMzk7dCBwcmVzZW50IHRoZSB0eXBpY2FsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBUaGVyZSYjMzk7cyBubyBjb3B5aW5nIG9mIHN0cnVjdHVyZXMgdG8gdXNlcnNwYWNlLCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgd2l0aGluIHRoZSBCUEYgcHJvZ3JhbSBpdHNlbGYsIGFuZCBub3RoaW5nIHRoYXQgc2VlbXMgdG8gaW50cm9kdWNlIGFueSBwb3RlbnRpYWwgZm9yIHNlbnNpdGl2ZSBkYXRhIGxlYWthZ2UuCgpUaGUgcGF0Y2ggbWFpbmx5IGZvY3VzZXMgb24gbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGVCUEYgaW50ZXJhY3Rpb25zLiBHaXZlbiB0aGF0LCBJIGRvbiYjMzk7dCB0aGluayBLTVNBTiBpcyBuZWNlc3NhcnkgaGVyZS4gS0FTQU4gYW5kIG90aGVyIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIHRoYXQgbWlnaHQgYmUgaW50cm9kdWNlZC4KCkxldCYjMzk7cyBkbyBhIGZpbmFsIHF1aWNrIHNhbml0eSBjaGVjayBvbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFllcCwgaXQmIzM5O3MgdGhlIHN0YW5kYXJkIG1lbW9yeSByZWNsYWltIGZ1bmN0aW9uIHdlJiMzOTtyZSBmYW1pbGlhciB3aXRoLgoKQWxyaWdodCwgd2l0aCBhbGwgdGhhdCBjb25zaWRlcmVkLCBJIHdpbGwgbWFyayB0aGlzIHBhdGNoIHdpdGggTmVlZHNLTVNBTj1mYWxzZSBhbmQgcHJvdmlkZSB0aGUgYWJvdmUgcmVhc29uaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNyAxMToxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGVCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgd2hpY2ggYWN0cyBhcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGlzdGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZnVuY3Rpb24gdG8gYWxsb3cgcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltIGZyb20gZUJQRiBwcm9ncmFtcy4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIG9yIGluaXRpYWxpemUgY29tcGxleCBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBrZnVuYyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIgKGEgdmFsaWQgcG9pbnRlciB0byBgc3RydWN0IG1lbV9jZ3JvdXBgIGFuZCBhIHNjYWxhciBzaXplKS4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyBsaWtlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBvciBsb2NraW5nIGJ1Z3Mgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGVCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgd2hpY2ggYWN0cyBhcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGlzdGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZnVuY3Rpb24gdG8gYWxsb3cgcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltIGZyb20gZUJQRiBwcm9ncmFtcy4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIG9yIGluaXRpYWxpemUgY29tcGxleCBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBrZnVuYyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIgKGEgdmFsaWQgcG9pbnRlciB0byBgc3RydWN0IG1lbV9jZ3JvdXBgIGFuZCBhIHNjYWxhciBzaXplKS4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyBsaWtlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBvciBsb2NraW5nIGJ1Z3Mgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI3VDExOjEyOjMxLjI0OTkxODQ2N1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI5MzMzMDY1NTk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBlQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHdoaWNoIGFjdHMgYXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmcm9tIGVCUEYgcHJvZ3JhbXMuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbGxvY2F0ZSBvciBpbml0aWFsaXplIGNvbXBsZXggc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUga2Z1bmMgYXJlIHZhbGlkYXRlZCBieSB0aGUgQlBGIHZlcmlmaWVyIChhIHZhbGlkIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBzY2FsYXIgc2l6ZSkuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgbGlrZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgb3IgbG9ja2luZyBidWdzIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjozMS4yNDk5MjY5MDdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM5MTU0ODM3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGJjOGE2MDlmYzcxYmZkOTNhNGNjYWYyNDlhMTdiNWIxM2M1ZDY4ZmFcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBBdWcgMjcgMTE6MTI6MzAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcXG5pbmRleCA3MTZkZjQ5ZDc2NDc3Li4yOTdmZjdmMDUwNDI3IDEwMDY0NFxcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcXG4rKysgYi9tbS9icGZfbWVtY29udHJvbC5jXFxuQEAgLTYsNiArNiw3IEBAXFxuICAqL1xcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N3YXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbiBcXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbkBAIC0xNTksNiArMTYwLDQ5IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbiBcXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcXG4gfVxcbiBcXG4rLypcXG4rICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlOiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgb3ZlcndyaXRlc1xcbisgKiBjdXJyZW50LVxcdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXFxuKyAqIHJlY2xhaW0gc3RhdGUuIFJlY2xhaW0gd2luZG93cyBhcmUgbWFya2VkIHdpdGggUEZfTUVNQUxMT0M7XFxuKyAqIHJlY2xhaW1fc3RhdGUgaXMgYWxzbyBjaGVja2VkIGJlY2F1c2UgaXQgaXMgaW5zdGFsbGVkIHNsaWdodGx5XFxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cXG4rICovXFxuK3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcXG4re1xcbitcXHRyZXR1cm4gKGN1cnJlbnQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUEZfTUVNQUxMT0MpIHx8IGN1cnJlbnQtXFx1MDAzZXJlY2xhaW1fc3RhdGU7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxcbisgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xcbisgKlxcbisgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvXFxuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxcbisgKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhIGZpbGVzeXN0ZW0gbG9jayBoZWxkOiB0aGUgcmVjbGFpbSBwYXRoXFxuKyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpc1xcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcXG4rXFxuK1xcdGlmIChzaXplIFxcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgTlVMTCk7XFxuK1xcbitcXHRyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFO1xcbit9XFxuK1xcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbiBcXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuQEAgLTE3Miw2ICsyMTYsOCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXFxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcXG4gXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcXG4rXFxuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcXG4gXFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTI3MGQ3M2M5MTE2ZVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDQ4MCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy92ZnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc2lnbmFsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N0aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGltaXRzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tYWdpYy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNncm91cF9oZWxwZXJzLmhcXFwiXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbisjaW5jbHVkZSBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcXFwiXFxuK1xcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxcbisjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxcbitcXG4rI2RlZmluZSBDR19ESVIgXFxcIi9tZW1jZ19hc3luY19yZWNsYWltXFxcIlxcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcXFwiL2hpZ2hcXFwiXFxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXFxcIi9sb3dcXFwiXFxuK1xcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXFxuK1xcbisvKlxcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXFxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcXG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cXG4rICovXFxuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xcbitcXG4rXFx0aWYgKCFzdGF0ZnMoXFxcIi90bXBcXFwiLCBcXHUwMDI2c3QpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXFxuK1xcdFxcdHJldHVybiBcXFwiLlxcXCI7XFxuK1xcdHJldHVybiBcXFwiL3RtcFxcXCI7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cXG4rICovXFxuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcXG4rXFx0Q0hJTERfRVhJVF9PSyA9IDAsXFxuK1xcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXFxuK1xcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcXG4rXFx0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXFxuK1xcdENISUxEX0VYSVRfVElNRV9GSUxFLFxcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxcbit7XFxuK1xcdHN3aXRjaCAoY29kZSkge1xcbitcXHRjYXNlIENISUxEX0VYSVRfT0s6XFxuK1xcdFxcdHJldHVybiBcXFwic3VjY2Vzc1xcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcXG4rXFx0XFx0cmV0dXJuIFxcXCJqb2luIGNncm91cFxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIGRhdGEgZmlsZVxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwicmVhZCBkYXRhIGZpbGVcXFwiO1xcbitcXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIHRpbWUgZmlsZVxcXCI7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiBcXFwidW5rbm93blxcXCI7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXHRjaGFyIGxpbWl0X2J1ZlsyMF07XFxuK1xcbitcXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcXFwibWVtb3J5XFxcIik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImVuYWJsZV9jb250cm9sbGVyc1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcXFwiJWx1XFxcIiwgQ0dfTElNSVQpO1xcbitcXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFxcXCJtZW1vcnkubWF4XFxcIiwgbGltaXRfYnVmKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcXG4rXFx0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cXG4rXFx0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cXG4rXFx0ICovXFxuK1xcdGlmICghYWNjZXNzKFxcXCIvcHJvYy9zd2Fwc1xcXCIsIEZfT0spKSB7XFxuK1xcdFxcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXFxcIm1lbW9yeS5zd2FwLm1heFxcXCIsIFxcXCIwXFxcIik7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdHNpemVfdCB3cml0dGVuID0gMDtcXG4rXFx0Y2hhciAqYnVmZmVyO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFxcXCJ3YlxcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XFxuK1xcdGlmICghYnVmZmVyKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZnA7XFxuK1xcbitcXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcXG4rXFxuK1xcdHdoaWxlICh3cml0dGVuIFxcdTAwM2MgRklMRV9TSVpFKSB7XFxuK1xcdFxcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXFx1MDAzYyBCVUZGRVJfU0laRSA/XFxuK1xcdFxcdFxcdFxcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xcbitcXG4rXFx0XFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0XFx0d3JpdHRlbiArPSB0b193cml0ZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZnJlZShidWZmZXIpO1xcbitjbGVhbnVwX2ZwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRjaGFyICptYXA7XFxuK1xcdHNpemVfdCBpO1xcbitcXHRpbnQgZmQ7XFxuK1xcdHN0cnVjdCBzdGF0IHNiO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCA9PSAtMSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoZnN0YXQoZmQsIFxcdTAwMjZzYikgPT0gLTEpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XFxuK1xcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcXG4rXFx0XFx0XFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cXG4rXFx0XFx0XFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xcbitcXHRcXHRcXHQodm9pZCl2O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9mZDpcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXFxuK1xcdFxcdFxcdFxcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xcbitcXHRkb3VibGUgZWxhcHNlZDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XFxuK1xcbitcXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXFx1MDAyNnN0YXJ0KTtcXG4rXFxuK1xcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xcbitcXG4rXFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xcbitcXG4rXFx0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFxcdTAwMjZlbmQpO1xcbitcXG4rXFx0aWYgKCF0aW1lX2ZpbGVuYW1lKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rXFxuK1xcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xcbitcXHRcXHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xcbitcXHRwcmludGYoXFxcIiUuNmZcXFxcblxcXCIsIGVsYXBzZWQpO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XFxuK1xcdGZwcmludGYoZnAsIFxcXCIlLjZmXFxcIiwgZWxhcHNlZCk7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcbitcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0Y2hhciBidWZbNjRdO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwiclxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFxcXCJmZ2V0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRpZiAoc3NjYW5mKGJ1ZiwgXFxcIiVsZlxcXCIsIHRpbWUpICE9IDEpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwic3NjYW5mICVzXFxcIiwgYnVmKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSAwO1xcbitjbGVhbnVwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xcbitcXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XFxuK1xcdHBpZF90IHdhaXRfcmV0O1xcbitcXHRpbnQgZmQsIHN0YXR1cztcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXG4rXFx0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFx0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0bG93X3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXFxcImZvcmsgbG93XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGxvd19waWQgPT0gMClcXG4rXFx0XFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHRoaWdoX3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsIFxcXCJmb3JrIGhpZ2hcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoaGlnaF9waWQgPT0gMClcXG4rXFx0XFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHR3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcXFwibG93IHdhaXRwaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHQvKlxcbitcXHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcXG4rXFx0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXFxuK1xcdCAqL1xcbitcXHRsb3dfcGlkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJsb3cgZXhpdGVkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXFxuK1xcdFxcdFxcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHdhaXRfcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcXFwiaGlnaCB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0LyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovXFxuK1xcdGhpZ2hfcGlkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJoaWdoIGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcXFwiLFxcbitcXHRcXHRcXHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcXG4rXFx0XFx0XFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdGlmIChoaWdoX3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdFxcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChsb3dfcGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XFxuK1xcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rc2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXFxuK1xcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcXG4rXFx0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XFxuK1xcdFxcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxcbitcXHRcXHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXFxuK1xcdFxcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXFxuK1xcdFxcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcXG4rXFx0fTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxcbitcXHRcXHQuY3R4X2luID0gXFx1MDAyNmFyZ3MsXFxuK1xcdFxcdC5jdHhfc2l6ZV9pbiA9IHNpemVvZihhcmdzKSk7XFxuK1xcdGludCBwcm9nX2luaXRfZmQsIGVycjtcXG4rXFxuK1xcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcXG4rXFxuK1xcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcXHUwMDI2cnVuX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFxcXCJwcm9nX2luaXQgcmV0dmFsXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXG4rXFx0KnNrZWxfcHRyID0gc2tlbDtcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitlcnJvcl9vdXQ6XFxuK1xcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdHJldHVybiAtMTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW0odm9pZClcXG4re1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XFxuK1xcdGludCBlcnI7XFxuK1xcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFxcdTAwMjZoaWdoX2Nncm91cF9pZCwgXFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcXHUwMDI2c2tlbCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2JwZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcXHUwMDI2aGlnaF90aW1lLCBcXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nXFxuK1xcdCAqIHJlY2xhaW0gZnJvbSBhIG5vLW9wIG9uZSwgc28gcmVxdWlyZSB0aGF0IHRoZSBCUEYgcHJvZ3JhbVxcbitcXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXFxuK1xcdCAqL1xcbitcXHRpZiAoIUFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFxcXCJyZWNsYWltX2NhbGxzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1lZF9ieXRlcywgMCwgXFxcInJlY2xhaW1lZF9ieXRlc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmIChoaWdoX3RpbWUgXFx1MDAzZT0gbG93X3RpbWUpXFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWZcXFwiLFxcbitcXHRcXHRcXHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcXG4rXFxuK291dDpcXG4rXFx0aWYgKHNrZWwpXFxuK1xcdFxcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmIyY2E1MTg1MTUwZmVcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbkBAIC0wLDAgKzEsMTgxIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuK1xcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiYnBmX2V4cGVyaW1lbnRhbC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFxcdDFcXG4rI2RlZmluZSBQQUdFX1NJWkVcXHRcXHQ0MDk2VUxcXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcXHRcXHQoMzIgKiBQQUdFX1NJWkUpXFxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlxcdDMyXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycDtcXG4rXFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xcbit9O1xcbitcXG4rc3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcXG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xcbitcXG4rLypcXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcXG4rICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXFxuKyAqL1xcbit1NjQgcmVjbGFpbV9jYWxscztcXG4rdTY0IHJlY2xhaW1lZF9ieXRlcztcXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGNtLVxcdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdGlmICghY20tXFx1MDAzZWNncnApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGNtLVxcdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcXHUwMDI2Y20tXFx1MDAzZWNncnAtXFx1MDAzZXNlbGYpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VtZW1jZykge1xcbitcXHRcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cXHUwMDNlbWVtY2cpO1xcbitcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcXG4rXFx0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXFxuK1xcdFxcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcXG4rXFx0XFx0XFx0XFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZWNsYWltX2NhbGxzKys7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcXG4rXFx0XFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xcbitcXG4rXFx0XFx0aWYgKCFucilcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcXG4rXFx0fVxcbitcXG4rXFx0cHV0X2Nncm91cF9tZW1jZyhcXHUwMDI2Y20pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0cnVjdCB3cV9lbGVtIHtcXG4rXFx0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcXG4rXFx0c3RydWN0IGJwZl93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTMyKTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XFxuK30gd3FfbWFwIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0YXRpYyBpbnQgcmVjbGFpbV93b3JrX2ZuKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxcbit7XFxuK1xcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XFxuK1xcbitcXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcXHUwMDI2ZWxlbS1cXHUwMDNlcHJldl9ldmVudCxcXG4rXFx0XFx0ZWxlbS1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xcbitcXHRcXHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcXG4rXFx0XFx0YnBmX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXFxuK3tcXG4rXFx0YnBmX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0YnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW07XFxuK1xcdF9fdTMyIGtleSA9IDA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2d3FfbWFwLCBcXHUwMDI2a2V5KTtcXG4rXFx0aWYgKCFlbGVtKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRyZXQgPSBicGZfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNndxX21hcCwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RpbWVyX2luaXQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBcXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGVsZW0tXFx1MDAzZXByZXZfZXZlbnQgPSAwO1xcbitcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0ZWxlbS1cXHUwMDNlY2hlY2tfbnMgPSBjdHgtXFx1MDAzZWNoZWNrX25zO1xcbitcXG4rXFx0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xcbitcXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2Vsb3dfY2dyb3VwX2lkO1xcbitcXG4rXFx0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rfVxcbitcXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI3VDExOjEyOjMxLjY0MjE2MjAxOFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE4ODU5OTM4MjE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiYzhhNjA5ZmM3MWJmZDkzYTRjY2FmMjQ5YTE3YjViMTNjNWQ2OGZhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjcgMTE6MTI6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNDkgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4rICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbisgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxuKyAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcbisgKiBtYXkgZGVhZGxvY2sgb24gaXQgdmlhIGZpbGVzeXN0ZW0gc2hyaW5rZXJzLlxuKyAqXG4rICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXG4rICogc21hbGxlciB0aGFuIGEgcGFnZSBvciB0aGUgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbSBjb250ZXh0LlxuKyAqL1xuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7XG4rXG4rXHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcbitcdFx0XHRcdFx0XHQgICAgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4rXHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuK1x0XHRcdFx0XHRcdCAgICBOVUxMKTtcbitcbitcdHJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7XG4rfVxuK1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgKzIxNiw4IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4rXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTI3MGQ3M2M5MTE2ZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDQ4MCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXG4rICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGRcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXG4rICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcbisgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cbisgKi9cbitzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpXG4re1xuK1x0c3RydWN0IHN0YXRmcyBzdDtcbitcbitcdGlmICghc3RhdGZzKFwiL3RtcFwiLCBcdTAwMjZzdCkgXHUwMDI2XHUwMDI2XG4rXHQgICAgKHN0LmZfdHlwZSA9PSBUTVBGU19NQUdJQyB8fCBzdC5mX3R5cGUgPT0gUkFNRlNfTUFHSUMpKVxuK1x0XHRyZXR1cm4gXCIuXCI7XG4rXHRyZXR1cm4gXCIvdG1wXCI7XG4rfVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xuKyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWRcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xuKyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxuKyAqL1xuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcbitcdENISUxEX0VYSVRfT0sgPSAwLFxuK1x0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcbitcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcbitcdENISUxEX0VYSVRfUkVBRF9GSUxFLFxuK1x0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXG4rfTtcbitcbitzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXG4re1xuK1x0c3dpdGNoIChjb2RlKSB7XG4rXHRjYXNlIENISUxEX0VYSVRfT0s6XG4rXHRcdHJldHVybiBcInN1Y2Nlc3NcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcbitcdFx0cmV0dXJuIFwiam9pbiBjZ3JvdXBcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxuK1x0XHRyZXR1cm4gXCJ3cml0ZSBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XG4rXHRcdHJldHVybiBcInJlYWQgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxuK1x0XHRyZXR1cm4gXCJ3cml0ZSB0aW1lIGZpbGVcIjtcbitcdGRlZmF1bHQ6XG4rXHRcdHJldHVybiBcInVua25vd25cIjtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuK1xuK1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwibWVtb3J5XCIpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImVuYWJsZV9jb250cm9sbGVyc1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCIlbHVcIiwgQ0dfTElNSVQpO1xuK1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5tYXhcIiwgbGltaXRfYnVmKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHQvKlxuK1x0ICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlXG4rXHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxuK1x0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cbitcdCAqL1xuK1x0aWYgKCFhY2Nlc3MoXCIvcHJvYy9zd2Fwc1wiLCBGX09LKSkge1xuK1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ISUdIX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0xPV19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2c3RhcnQpO1xuK1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7XG4rXG4rXHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcbitcdHByaW50ZihcIiUuNmZcXG5cIiwgZWxhcHNlZCk7XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwid1wiKTtcbitcdGlmICghZnApXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1RJTUVfRklMRTtcbitcdGZwcmludGYoZnAsIFwiJS42ZlwiLCBlbGFwc2VkKTtcbitcdGZjbG9zZShmcCk7XG4rXG4rXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbit9XG4rXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0RklMRSAqZnA7XG4rXHRjaGFyIGJ1Zls2NF07XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwiclwiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcImZnZXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoc3NjYW5mKGJ1ZiwgXCIlbGZcIiwgdGltZSkgIT0gMSkge1xuK1x0XHRQUklOVF9GQUlMKFwic3NjYW5mICVzXCIsIGJ1Zik7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y29uc3QgY2hhciAqZGlyID0gd29ya2xvYWRfZmlsZXNfZGlyKCk7XG4rXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4rXHRwaWRfdCB3YWl0X3JldDtcbitcdGludCBmZCwgc3RhdHVzO1xuK1x0aW50IHJldCA9IC0xO1xuK1xuK1x0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcIiwgZGlyKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0aGlnaF9waWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCJmb3JrIGhpZ2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChoaWdoX3BpZCA9PSAwKVxuK1x0XHRfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdHdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwibG93IHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qXG4rXHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcbitcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxuK1x0ICovXG4rXHRsb3dfcGlkID0gLTE7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImxvdyBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImxvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcIixcbitcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbitcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwiaGlnaCB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHQvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi9cbitcdGhpZ2hfcGlkID0gLTE7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImhpZ2ggZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJoaWdoIGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cDpcbitcdC8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovXG4rXHRpZiAocmV0KSB7XG4rXHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuK1x0XHRcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHRcdGlmIChsb3dfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbitcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHR9XG4rXHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuK1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuK1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnRcbitzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbitcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbit7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbitcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xuK1x0XHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcbitcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuK1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuK1x0XHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXG4rXHR9O1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuK1x0XHQuY3R4X2luID0gXHUwMDI2YXJncyxcbitcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpKTtcbitcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbitcbitcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsIFx1MDAyNnJ1bl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCJwcm9nX2luaXQgcmV0dmFsXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcbitcdCpza2VsX3B0ciA9IHNrZWw7XG4rXHRyZXR1cm4gMDtcbitcbitlcnJvcl9vdXQ6XG4rXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKVxuK3tcbitcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbitcdGludCBlcnI7XG4rXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbitcbitcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwicmVjbGFpbWVkX2J5dGVzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWZcIixcbitcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbitcbitvdXQ6XG4rXHRpZiAoc2tlbClcbitcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjJjYTUxODUxNTBmZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSwxODEgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbitcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuKyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbitcdGlmICghY20tXHUwMDNlY2dycClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbitcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK31cbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAtMTtcbitcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbitcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuK1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4rXHRcdFx0XHQgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdGludCBpO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZWNsYWltX2NhbGxzKys7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcbitcdFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xuK1xuK1x0XHRpZiAoIW5yKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRyZWNsYWltZWRfYnl0ZXMgKz0gbnI7XG4rXHR9XG4rXG4rXHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbitcdF9fdHlwZShrZXksIF9fdTMyKTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuK30gd3FfbWFwIFNFQyhcIi5tYXBzXCIpO1xuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV93b3JrX2ZuKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcbitcdF9fdTMyIGtleSA9IDA7XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2d3FfbWFwLCBcdTAwMjZrZXkpO1xuK1x0aWYgKCFlbGVtKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjozMS42NDIxNjMxNzhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2Nzk3MTYyMjU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTmV3IEJQRiBQcm9hY3RpdmUgUmVjbGFpbSBGdW5jdGlvbioqXG5cbk9rYXksIHNvIHRoZXJlJ3MgYSBuZXcgcGF0Y2ggYWRkaW5nIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AuIFRoaXMgaXMgaW50cmlndWluZyDigJMgaXQgZ2l2ZXMgQlBGIHByb2dyYW1zIHRoZSBhYmlsaXR5IHRvIHRyaWdnZXIgbWVtb3J5IHJlY2xhaW0gd2l0aGluIGEgbWVtb3J5IGNncm91cC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzOiB0aGlzIG5lZWRzIGEgdGhvcm91Z2ggbG9vay4gSXQncyBhIG5ldyBCUEYgZW50cnkgcG9pbnQsIG1lYW5pbmcgaXQncyBhIG5ldyBhdHRhY2sgc3VyZmFjZSwgYW5kIGNvdWxkIHBvdGVudGlhbGx5IGludGVyYWN0IHdpdGggbG93LWxldmVsIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGUgcGF0Y2ggYWxzbyBpbmNsdWRlcyBhIHNlbGZ0ZXN0LCB3aGljaCBpcyBnb29kLCBidXQgZG9lc24ndCByZXBsYWNlIG15IG93biBzY3J1dGlueS5cblxuTGV0J3MgZGlzc2VjdCB0aGUgaW1wbGVtZW50YXRpb246IHRoZSBjb3JlIG9mIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgaXQgY2hlY2tzIHRoZSBpbnB1dCBzaXplIGFuZCByZWNsYWltIGNvbnRleHQuIElmIGl0J3Mgc2FmZSBpdCBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIEdpdmVuIHRoYXQgdGhpcyBpcyBuZXcgZnVuY3Rpb25hbGl0eSB0aGF0IGRpcmVjdGx5IGltcGFjdHMgbWVtb3J5IHJlY2xhaW0gbG9naWMsIGl0J3MgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMga2Z1bmMgaXMgYWRkZWQgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdCBmb3IgdGhlIGZ1enppbmcgc2V0dXAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgbmV3IGVudHJ5cG9pbnQsIGl0cyBwcmVjb25kaXRpb25zLCBhbmQgYW55IHBvdGVudGlhbCBzaWRlIGVmZmVjdHMuXG5cbk5leHQsIEkgbmVlZCB0byB2ZXJpZnkgaG93IGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGlzIGFjdHVhbGx5IGNvbXBpbGVkIGFuZCByZWFjaGFibGUuIEknbGwgbmVlZCB0byBjaGVjayBgbW0vTWFrZWZpbGVgIHRvIHNlZSB1bmRlciB3aGF0IGNvbmRpdGlvbnMgYGJwZl9tZW1jb250cm9sLmNgIGdldHMgaW5jbHVkZWQgYW5kIGJ1aWx0LiBVbmRlcnN0YW5kaW5nIGl0cyBidWlsZCBkZXBlbmRlbmNpZXMgYW5kIGluY2x1c2lvbiBwcm9jZXNzIGlzIGNyaXRpY2FsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIGF0dGFjayBzdXJmYWNlIGFuZCBlbnN1cmluZyBjb3JyZWN0IGZ1enppbmcgc2V0dXAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk3MTMsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNzEsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjozOC40MzkzMjg3NTJaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc1MDkzMjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX21lbWNvbnRyb2wub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDY9aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xcbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjozOC40ODY4NDI3ODhaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjM4MzcyNzY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgdGhvdWdodHMsIGZvcm1hdHRlZCBhcyB5b3UgcmVxdWVzdGVkOlxuXG4qKkFzc2Vzc2luZyBCUEYgYW5kIE1lbW9yeSBDR3JvdXBzIGluIHRoZSBLZXJuZWwqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgdGFzayBhdCBoYW5kIGxvb2tzIHRvIGJlIGRlcGVuZGVudCBvbiBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19NRU1DR2AuIFRob3NlIGFyZSB0aGUgYmFzZWxpbmUgcmVxdWlyZW1lbnRzLCB3aGljaCBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgSSBzaG91bGQgaW52ZXN0aWdhdGUgZnVydGhlcjsgbWF5YmUgc29tZSBvdGhlciBvYnNjdXJlIGZlYXR1cmVzIGFyZSBicm91Z2h0IGluIHRvbz9cblxuYGJwZl9pbl9yZWNsYWltX2NvbnRleHRgIGp1bXBzIG91dCBhdCBtZSBhcyBhIHBvdGVudGlhbCBwb2ludCBvZiBpbnRlcmVzdC4gSXQncyBtYXJrZWQgYXMgYSBzdGF0aWMgaGVscGVyLCBzbyBpdCBpcyBxdWl0ZSBwb3NzaWJseSBhbiBpbnRlcm5hbCBmdW5jdGlvbiB0aGF0IG1pZ2h0IGJlIGFkZGVkIHRvIG15IHdvcmsuXG5cbkFuZCBub3cgSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgYG1tL3Ztc2Nhbi5jYC4gU3BlY2lmaWNhbGx5LCBJIHNob3VsZCBsb29rIGNsb3NlbHkgYXQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaGlzIHdpbGwgbGlrZWx5IHJldmVhbCBob3cgcGFnZXMgYXJlIGFjdHVhbGx5IGZyZWVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIG1lbW9yeSBjZ3JvdXAsIGFuZCB3aGV0aGVyIG15IHByZXZpb3VzIGZpbmRpbmdzIGFyZSBwZXJ0aW5lbnQuIFVuZGVyc3RhbmRpbmcgdGhpcyBpcyBrZXkgdG8gZ2V0dGluZyB0aGUgY29tcGxldGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA1MDMsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjo0Mi4xMjUyMTc1NDZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMxNTQzNDIzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2JwZl9tZW1jb250cm9sLmM9MTU4PV9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNjMtLypcXG5tbS9icGZfbWVtY29udHJvbC5jOjE2NDogKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNjUtICogY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlclxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYz0xODk9X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xOTYtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoxOTc6XFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcXG5tbS9icGZfbWVtY29udHJvbC5jLTE5OC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgR0ZQX0tFUk5FTCxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0xNDgxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIxLVxcbm1tL21lbWNvbnRyb2wtdjEuYzoxNTIyOlxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMy1cXHRcXHRcXHRcXHRtZW1zdyA/IDAgOiBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSkge1xcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTE1NDA9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTUzLVxcbm1tL21lbWNvbnRyb2wtdjEuYzoxNTU0OlxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1NS1cXHRcXHRcXHRcXHRcXHRcXHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxcbi0tXFxubW0vbWVtY29udHJvbC5jPTIzMjg9c3RhdGljIHVuc2lnbmVkIGxvbmcgcmVjbGFpbV9oaWdoKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0yMzQzLVxcdFxcdHBzaV9tZW1zdGFsbF9lbnRlcihcXHUwMDI2cGZsYWdzKTtcXG5tbS9tZW1jb250cm9sLmM6MjM0NDpcXHRcXHRucl9yZWNsYWltZWQgKz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxubW0vbWVtY29udHJvbC5jLTIzNDUtXFx0XFx0XFx0XFx0XFx0XFx0XFx0Z2ZwX21hc2ssXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9MjU5NT1zdGF0aWMgaW50IHRyeV9jaGFyZ2VfbWVtY2coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBnZnBfdCBnZnBfbWFzayxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0yNjU0LVxcdHBzaV9tZW1zdGFsbF9lbnRlcihcXHUwMDI2cGZsYWdzKTtcXG5tbS9tZW1jb250cm9sLmM6MjY1NTpcXHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbV9vdmVyX2xpbWl0LCBucl9wYWdlcyxcXG5tbS9tZW1jb250cm9sLmMtMjY1Ni1cXHRcXHRcXHRcXHRcXHRcXHQgICAgZ2ZwX21hc2ssIHJlY2xhaW1fb3B0aW9ucywgTlVMTCk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDc2OD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfaGlnaF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNDgwMi1cXG5tbS9tZW1jb250cm9sLmM6NDgwMzpcXHRcXHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXFxubW0vbWVtY29udHJvbC5jLTQ4MDQtXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDgyMD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfbWF4X3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00ODU0LVxcdFxcdGlmIChucl9yZWNsYWltcykge1xcbm1tL21lbWNvbnRyb2wuYzo0ODU1OlxcdFxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMgLSBtYXgsXFxubW0vbWVtY29udHJvbC5jLTQ4NTYtXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXFxuLS1cXG5tbS92bXNjYW4uYz02NzIyPXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS92bXNjYW4uYy02NzYxLVxcbm1tL3Ztc2Nhbi5jOjY3NjI6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5tbS92bXNjYW4uYy02NzYzLVxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS92bXNjYW4uYy02ODAyLSNlbHNlXFxubW0vdm1zY2FuLmM6NjgwMzp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTY4MDQtXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jPTc4NjY9aW50IHVzZXJfcHJvYWN0aXZlX3JlY2xhaW0oY2hhciAqYnVmLFxcbi0tXFxubW0vdm1zY2FuLmMtNzkzMy1cXHRcXHRcXHRcXHRcXHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xcbm1tL3Ztc2Nhbi5jOjc5MzQ6XFx0XFx0XFx0cmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZyxcXG5tbS92bXNjYW4uYy03OTM1LVxcdFxcdFxcdFxcdFxcdFxcdCBiYXRjaF9zaXplLCBnZnBfbWFzayxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjdUMTE6MTI6NDIuMzU2NzY5OThaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MDY2NTE2ODEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoJ3MgRnV6emluZyBQb3RlbnRpYWwqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGludHJvZHVjZXMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIGEgbmV3IEJQRiBrZnVuYy4gR2l2ZW4gbXkgZXhwZXJpZW5jZSwgSSBpbW1lZGlhdGVseSBzZWUgdGhlIGZ1enppbmcgaW1wbGljYXRpb25zLiBUaGlzIGlzIGRlZmluaXRlbHkgd29ydGggZXhwbG9yaW5nIHRob3JvdWdobHkuIE15IHByaW1hcnkgZm9jdXMgc2hvdWxkIGJlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLlxuXG5JIGRvdWJsZS1jaGVja2VkOyB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMgYXJlIGp1c3QgYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kIGBDT05GSUdfTUVNQ0dgLCB3aGljaCBpcyBzdGFuZGFyZCBmb3IgQlBGIGludGVyYWN0aW9uIHdpdGggbWVtb3J5IGNvbnRyb2wgZ3JvdXBzLiBOb3RoaW5nIHVudXN1YWwgdGhlcmUuIFRoZSBkb2N1bWVudGF0aW9uIGNvbmZpcm1zIHRoYXQgdGhpcyBuZXcga2Z1bmMgaXMgdGhlIG9ubHkgQVBJIGJlaW5nIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UuXG5cbk5vdywgbGV0J3MgY29uc29saWRhdGUgbXkgZmluZGluZ3MgaW50byBhIGZvcm1hbCByZXNwb25zZS4gSXQncyBjbGVhcjogdGhpcyAqaXMqIHdvcnRoIGZ1enppbmcuIEknbGwgbmVlZCB0byBmb2N1cyBvbiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gVGhlIGFjdGl2YXRpb24gY29uZmlncyB3aWxsIGJlIGBCUEZfU1lTQ0FMTGAgYW5kIGBNRU1DR2AuIE15IHJlYXNvbmluZyBpcyBzdHJhaWdodGZvcndhcmQ6IGEgbmV3IEJQRiBBUEkgc3BlY2lmaWNhbGx5IHRhcmdldGluZyBtZW1vcnkgbWFuYWdlbWVudCBuZWNlc3NpdGF0ZXMgcmlnb3JvdXMgZnV6emluZyB0byBldmFsdWF0ZSBpdCBhZ2FpbnN0IG1hbGljaW91cyBpbnB1dHMgb3IgbWlzY29uZmlndXJlZCBjb250ZXh0cywgYW5kIGFueSBwb3RlbnRpYWwgaXNzdWVzIHJlZ2FyZGluZyBtZW1vcnkgbWFuYWdlbWVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIxNDYsIk91dHB1dFRva2VucyI6MTQyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI3VDExOjEyOjUwLjQyMzI4OTM4MloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Nzg4MDgxMTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHRoYXQgYWxsb3dzIEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhpcyBleHBvc2VzIGNvcmUgbWVtb3J5IHJlY2xhaW0gbG9naWMgKGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCkgdG8gQlBGIHByb2dyYW1zLCB3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIGl0IGhhbmRsZXMgdmFyaW91cyBpbnB1dHMgYW5kIGNvbnRleHRzIGNvcnJlY3RseSB3aXRob3V0IGNhdXNpbmcgZGVhZGxvY2tzIG9yIG1lbW9yeSBjb3JydXB0aW9uLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjo1MC41MDIxMDM3ODZaIiwiU2VxIjo5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAwODA4NzAyNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjo1MC41MDI1OTA0NzZaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTAwODAzODAzMTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZUJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCB3aGljaCBhY3RzIGFzIGEgd3JhcHBlciBhcm91bmQgdGhlIGV4aXN0aW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBmdW5jdGlvbiB0byBhbGxvdyBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gZnJvbSBlQlBGIHByb2dyYW1zLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgb3IgaW5pdGlhbGl6ZSBjb21wbGV4IHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGtmdW5jIGFyZSB2YWxpZGF0ZWQgYnkgdGhlIEJQRiB2ZXJpZmllciAoYSB2YWxpZCBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgc2NhbGFyIHNpemUpLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuIEFueSBwb3RlbnRpYWwgaXNzdWVzIGxpa2Ugb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIG9yIGxvY2tpbmcgYnVncyB3b3VsZCBiZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiYzhhNjA5ZmM3MWJmZDkzYTRjY2FmMjQ5YTE3YjViMTNjNWQ2OGZhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBBdWcgMjcgMTE6MTI6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uMjk3ZmY3ZjA1MDQyNyAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNDkgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4rICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbisgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxuKyAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcbisgKiBtYXkgZGVhZGxvY2sgb24gaXQgdmlhIGZpbGVzeXN0ZW0gc2hyaW5rZXJzLlxuKyAqXG4rICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXG4rICogc21hbGxlciB0aGFuIGEgcGFnZSBvciB0aGUgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbSBjb250ZXh0LlxuKyAqL1xuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7XG4rXG4rXHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgc2l6ZSAvIFBBR0VfU0laRSxcbitcdFx0XHRcdFx0XHQgICAgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4rXHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuK1x0XHRcdFx0XHRcdCAgICBOVUxMKTtcbitcbitcdHJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7XG4rfVxuK1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgKzIxNiw4IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4rXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTI3MGQ3M2M5MTE2ZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDQ4MCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXG4rICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGRcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXG4rICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcbisgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cbisgKi9cbitzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpXG4re1xuK1x0c3RydWN0IHN0YXRmcyBzdDtcbitcbitcdGlmICghc3RhdGZzKFwiL3RtcFwiLCBcdTAwMjZzdCkgXHUwMDI2XHUwMDI2XG4rXHQgICAgKHN0LmZfdHlwZSA9PSBUTVBGU19NQUdJQyB8fCBzdC5mX3R5cGUgPT0gUkFNRlNfTUFHSUMpKVxuK1x0XHRyZXR1cm4gXCIuXCI7XG4rXHRyZXR1cm4gXCIvdG1wXCI7XG4rfVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xuKyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWRcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xuKyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxuKyAqL1xuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcbitcdENISUxEX0VYSVRfT0sgPSAwLFxuK1x0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcbitcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcbitcdENISUxEX0VYSVRfUkVBRF9GSUxFLFxuK1x0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXG4rfTtcbitcbitzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXG4re1xuK1x0c3dpdGNoIChjb2RlKSB7XG4rXHRjYXNlIENISUxEX0VYSVRfT0s6XG4rXHRcdHJldHVybiBcInN1Y2Nlc3NcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcbitcdFx0cmV0dXJuIFwiam9pbiBjZ3JvdXBcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxuK1x0XHRyZXR1cm4gXCJ3cml0ZSBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XG4rXHRcdHJldHVybiBcInJlYWQgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxuK1x0XHRyZXR1cm4gXCJ3cml0ZSB0aW1lIGZpbGVcIjtcbitcdGRlZmF1bHQ6XG4rXHRcdHJldHVybiBcInVua25vd25cIjtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuK1xuK1x0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwibWVtb3J5XCIpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcImVuYWJsZV9jb250cm9sbGVyc1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXCIlbHVcIiwgQ0dfTElNSVQpO1xuK1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5tYXhcIiwgbGltaXRfYnVmKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHQvKlxuK1x0ICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlXG4rXHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxuK1x0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cbitcdCAqL1xuK1x0aWYgKCFhY2Nlc3MoXCIvcHJvYy9zd2Fwc1wiLCBGX09LKSkge1xuK1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ISUdIX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0xPV19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2c3RhcnQpO1xuK1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7XG4rXG4rXHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcbitcdHByaW50ZihcIiUuNmZcXG5cIiwgZWxhcHNlZCk7XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwid1wiKTtcbitcdGlmICghZnApXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1RJTUVfRklMRTtcbitcdGZwcmludGYoZnAsIFwiJS42ZlwiLCBlbGFwc2VkKTtcbitcdGZjbG9zZShmcCk7XG4rXG4rXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbit9XG4rXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0RklMRSAqZnA7XG4rXHRjaGFyIGJ1Zls2NF07XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwiclwiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcImZnZXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoc3NjYW5mKGJ1ZiwgXCIlbGZcIiwgdGltZSkgIT0gMSkge1xuK1x0XHRQUklOVF9GQUlMKFwic3NjYW5mICVzXCIsIGJ1Zik7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuK1x0Y29uc3QgY2hhciAqZGlyID0gd29ya2xvYWRfZmlsZXNfZGlyKCk7XG4rXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4rXHRwaWRfdCB3YWl0X3JldDtcbitcdGludCBmZCwgc3RhdHVzO1xuK1x0aW50IHJldCA9IC0xO1xuK1xuK1x0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcIiwgZGlyKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0aGlnaF9waWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCJmb3JrIGhpZ2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChoaWdoX3BpZCA9PSAwKVxuK1x0XHRfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbitcbitcdHdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwibG93IHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qXG4rXHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcbitcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxuK1x0ICovXG4rXHRsb3dfcGlkID0gLTE7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImxvdyBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImxvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcIixcbitcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbitcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwiaGlnaCB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHQvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi9cbitcdGhpZ2hfcGlkID0gLTE7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImhpZ2ggZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJoaWdoIGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cDpcbitcdC8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovXG4rXHRpZiAocmV0KSB7XG4rXHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuK1x0XHRcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHRcdGlmIChsb3dfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbitcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHR9XG4rXHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuK1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuK1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnRcbitzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbitcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbit7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbitcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xuK1x0XHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcbitcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuK1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuK1x0XHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXG4rXHR9O1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuK1x0XHQuY3R4X2luID0gXHUwMDI2YXJncyxcbitcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpKTtcbitcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbitcbitcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsIFx1MDAyNnJ1bl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCJwcm9nX2luaXQgcmV0dmFsXCIpKVxuK1x0XHRnb3RvIGVycm9yX291dDtcbitcbitcdCpza2VsX3B0ciA9IHNrZWw7XG4rXHRyZXR1cm4gMDtcbitcbitlcnJvcl9vdXQ6XG4rXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKVxuK3tcbitcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbitcdGludCBlcnI7XG4rXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbitcbitcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwicmVjbGFpbWVkX2J5dGVzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWZcIixcbitcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbitcbitvdXQ6XG4rXHRpZiAoc2tlbClcbitcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjJjYTUxODUxNTBmZVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSwxODEgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbitcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuKyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbitcdGlmICghY20tXHUwMDNlY2dycClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbitcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK31cbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAtMTtcbitcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbitcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuK1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4rXHRcdFx0XHQgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdGludCBpO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZWNsYWltX2NhbGxzKys7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcbitcdFx0dTY0IG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpO1xuK1xuK1x0XHRpZiAoIW5yKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRyZWNsYWltZWRfYnl0ZXMgKz0gbnI7XG4rXHR9XG4rXG4rXHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbitcdF9fdHlwZShrZXksIF9fdTMyKTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuK30gd3FfbWFwIFNFQyhcIi5tYXBzXCIpO1xuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV93b3JrX2ZuKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcbitcdF9fdTMyIGtleSA9IDA7XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2d3FfbWFwLCBcdTAwMjZrZXkpO1xuK1x0aWYgKCFlbGVtKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitjaGFyIF9saWNlbnNlW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yN1QxMToxMjo1MC41MDI1OTEzNTZaIiwiU2VxIjoxMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTAwODAzNjI0MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUmV2aWV3aW5nIHRoZSBlQlBGIFByb2FjdGl2ZSBNZW1vcnkgUmVjbGFpbSBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIHdoaWNoIGlzIHByZXR0eSBpbnRlcmVzdGluZyBiZWNhdXNlIGl0IGFsbG93cyBlQlBGIHByb2dyYW1zIHRvIGFjdGl2ZWx5IHRyaWdnZXIgbWVtb3J5IHJlY2xhbWF0aW9uIHdpdGhpbiBhIG1lbW9yeSBjZ3JvdXAuIFBsdXMsIHRoZXJlJ3MgYSBuZXcgc2VsZnRlc3QgaW5jbHVkZWQsIHdoaWNoIGlzIGFsd2F5cyBnb29kIHRvIHNlZS5cblxuTG9va2luZyBhdCB0aGUgY2hhbmdlcywgaXQncyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLiBXZSBoYXZlIGFkZGl0aW9ucyB0byBgbW0vYnBmX21lbWNvbnRyb2wuY2A6IGEgaGVscGVyLCBgYnBmX2luX3JlY2xhaW1fY29udGV4dGAsIGFuZCB0aGUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAga2Z1bmMgaXRzZWxmLCB3aGljaCBpcyByZWdpc3RlcmVkIGFzIHNsZWVwYWJsZS4gVGhlbiwgdGhlIG9ibGlnYXRvcnkgc2VsZnRlc3RzIGFyZSBpbiBwbGFjZTogYSB0ZXN0IGZpbGUgYW5kIGFuIGFjY29tcGFueWluZyBwcm9ncmFtLlxuXG5UaGUgY29yZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhcHBlYXJzIHRvIGJlIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYy4gSXQgYWNjZXB0cyBhIGBtZW1fY2dyb3VwYCBwb2ludGVyIGFuZCBhIGBzaXplYC4gSW50ZXJuYWxseSwgaXQncyBjYWxsaW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuIFRoaXMgaXMgdGhlIGtleSBwaWVjZSB0byBhbmFseXplIGZvciBzZWN1cml0eSBjb25zaWRlcmF0aW9ucy5cblxuTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHNjcnV0aW5pemUgd2hldGhlciB0aGlzIGV4cG9zZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBIb3dldmVyLCBhZnRlciBjYXJlZnVsIHJldmlldywgSSBkb24ndCBzZWUgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MuIFdlJ3JlIGVzc2VudGlhbGx5IHdyYXBwaW5nIGFuIGV4aXN0aW5nIGtlcm5lbCBmdW5jdGlvbi4gVGhlIGFyZ3VtZW50cyDigJMgYSBwb2ludGVyIHRvIGEgc3RydWN0IHZlcmlmaWVkIGJ5IEJQRiBhbmQgYSBzY2FsYXIgc2l6ZSDigJMgZG9uJ3QgcHJlc2VudCB0aGUgdHlwaWNhbCB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gVGhlcmUncyBubyBjb3B5aW5nIG9mIHN0cnVjdHVyZXMgdG8gdXNlcnNwYWNlLCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgd2l0aGluIHRoZSBCUEYgcHJvZ3JhbSBpdHNlbGYsIGFuZCBub3RoaW5nIHRoYXQgc2VlbXMgdG8gaW50cm9kdWNlIGFueSBwb3RlbnRpYWwgZm9yIHNlbnNpdGl2ZSBkYXRhIGxlYWthZ2UuXG5cblRoZSBwYXRjaCBtYWlubHkgZm9jdXNlcyBvbiBtZW1vcnkgbWFuYWdlbWVudCBhbmQgZUJQRiBpbnRlcmFjdGlvbnMuIEdpdmVuIHRoYXQsIEkgZG9uJ3QgdGhpbmsgS01TQU4gaXMgbmVjZXNzYXJ5IGhlcmUuIEtBU0FOIGFuZCBvdGhlciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyB0aGF0IG1pZ2h0IGJlIGludHJvZHVjZWQuXG5cbkxldCdzIGRvIGEgZmluYWwgcXVpY2sgc2FuaXR5IGNoZWNrIG9uIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC4gWWVwLCBpdCdzIHRoZSBzdGFuZGFyZCBtZW1vcnkgcmVjbGFpbSBmdW5jdGlvbiB3ZSdyZSBmYW1pbGlhciB3aXRoLlxuXG5BbHJpZ2h0LCB3aXRoIGFsbCB0aGF0IGNvbnNpZGVyZWQsIEkgd2lsbCBtYXJrIHRoaXMgcGF0Y2ggd2l0aCBOZWVkc0tNU0FOPWZhbHNlIGFuZCBwcm92aWRlIHRoZSBhYm92ZSByZWFzb25pbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk3MTAsIk91dHB1dFRva2VucyI6MjAyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDk0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjdUMTE6MTM6MDAuNTgyOTU2MjI1WiIsIlNlcSI6MTIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMzMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGVCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgd2hpY2ggYWN0cyBhcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGlzdGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgZnVuY3Rpb24gdG8gYWxsb3cgcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltIGZyb20gZUJQRiBwcm9ncmFtcy4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIG9yIGluaXRpYWxpemUgY29tcGxleCBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBrZnVuYyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBCUEYgdmVyaWZpZXIgKGEgdmFsaWQgcG9pbnRlciB0byBgc3RydWN0IG1lbV9jZ3JvdXBgIGFuZCBhIHNjYWxhciBzaXplKS4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyBsaWtlIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBvciBsb2NraW5nIGJ1Z3Mgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBlQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHdoaWNoIGFjdHMgYXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhpc3RpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGZ1bmN0aW9uIHRvIGFsbG93IHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSBmcm9tIGVCUEYgcHJvZ3JhbXMuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IG5ldyBkYXRhIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBhbGxvY2F0ZSBvciBpbml0aWFsaXplIGNvbXBsZXggc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUga2Z1bmMgYXJlIHZhbGlkYXRlZCBieSB0aGUgQlBGIHZlcmlmaWVyIChhIHZhbGlkIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBzY2FsYXIgc2l6ZSkuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgbGlrZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgb3IgbG9ja2luZyBidWdzIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowkz254[1] Phase: Succeeded StartedAt: 2026-08-27 11:13:12 +0000 UTC FinishedAt: 2026-08-27 11:13:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-27 11:13:12 +0000 UTC FinishedAt: 2026-08-27 11:13:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2] Phase: Succeeded StartedAt: 2026-08-27 11:13:12 +0000 UTC FinishedAt: 2026-08-27 14:55:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-27 11:13:12 +0000 UTC FinishedAt: 2026-08-27 14:55:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-27 11:13:12 +0000 UTC FinishedAt: 2026-08-27 11:13:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-27 11:13:12 +0000 UTC FinishedAt: 2026-08-27 11:13:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowkz254/series-workflowkz254-convert-artifact-278424092/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-27 11:13:22 +0000 UTC FinishedAt: 2026-08-27 11:29:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-27 11:13:22 +0000 UTC FinishedAt: 2026-08-27 11:29:42 +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:*18bb58b9-5c59-4024-b3a7-e4f4f9b81a77,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-workflowkz254/series-workflowkz254-convert-artifact-278424092/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": "78fd2e36-788d-48ed-bc0a-bb3ee8071589", "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-workflowkz254/series-workflowkz254-build-action-2403536970/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-27 11:13:22 +0000 UTC FinishedAt: 2026-08-27 11:29:32 +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:*18bb58b9-5c59-4024-b3a7-e4f4f9b81a77,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-workflowkz254/series-workflowkz254-convert-artifact-278424092/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": "78fd2e36-788d-48ed-bc0a-bb3ee8071589", "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-workflowkz254/series-workflowkz254-build-action-2403536970/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-27 11:29:42 +0000 UTC FinishedAt: 2026-08-27 11:29:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-27 11:29:42 +0000 UTC FinishedAt: 2026-08-27 11:29:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-27 11:29:42 +0000 UTC FinishedAt: 2026-08-27 11:29:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-27 11:29:42 +0000 UTC FinishedAt: 2026-08-27 11:29:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowkz254/series-workflowkz254-convert-artifact-2461836635/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-27 11:29:52 +0000 UTC FinishedAt: 2026-08-27 11:31:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-27 11:29:52 +0000 UTC FinishedAt: 2026-08-27 11:31:34 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*78fd2e36-788d-48ed-bc0a-bb3ee8071589,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-workflowkz254/series-workflowkz254-build-action-2403536970/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-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-27 11:31:40 +0000 UTC FinishedAt: 2026-08-27 11:31:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-27 11:31:40 +0000 UTC FinishedAt: 2026-08-27 11:31:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-27 11:31:40 +0000 UTC FinishedAt: 2026-08-27 11:47:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-27 11:31:40 +0000 UTC FinishedAt: 2026-08-27 11:47:49 +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:*18bb58b9-5c59-4024-b3a7-e4f4f9b81a77,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-workflowkz254/series-workflowkz254-convert-artifact-2461836635/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": "ce3e6a13-50ab-4ba9-9419-8dfa4d7e81a9", "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-workflowkz254/series-workflowkz254-build-action-2498776063/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-27 11:31:40 +0000 UTC FinishedAt: 2026-08-27 11:47:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*18bb58b9-5c59-4024-b3a7-e4f4f9b81a77,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-workflowkz254/series-workflowkz254-convert-artifact-2461836635/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": "ce3e6a13-50ab-4ba9-9419-8dfa4d7e81a9", "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-workflowkz254/series-workflowkz254-build-action-2498776063/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-27 11:47:49 +0000 UTC FinishedAt: 2026-08-27 11:47:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-27 11:47:49 +0000 UTC FinishedAt: 2026-08-27 11:47:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-27 11:47:49 +0000 UTC FinishedAt: 2026-08-27 11:49:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-27 11:47:49 +0000 UTC FinishedAt: 2026-08-27 11:49:44 +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:*ce3e6a13-50ab-4ba9-9419-8dfa4d7e81a9,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-workflowkz254/series-workflowkz254-build-action-2498776063/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-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-27 11:49:53 +0000 UTC FinishedAt: 2026-08-27 14:55:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-27 11:49:53 +0000 UTC FinishedAt: 2026-08-27 14:55:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},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:*78fd2e36-788d-48ed-bc0a-bb3ee8071589,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*ce3e6a13-50ab-4ba9-9419-8dfa4d7e81a9,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-workflowkz254/series-workflowkz254-build-action-2403536970/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-workflowkz254/series-workflowkz254-build-action-2498776063/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-27 11:49:53 +0000 UTC FinishedAt: 2026-08-27 11:50:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-27 11:49:53 +0000 UTC FinishedAt: 2026-08-27 11:49:58 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},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-workflowkz254/series-workflowkz254-convert-artifact-1866091092/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-27 11:49:53 +0000 UTC FinishedAt: 2026-08-27 11:49:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-27 11:49:53 +0000 UTC FinishedAt: 2026-08-27 11:49:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-27 11:49:53 +0000 UTC FinishedAt: 2026-08-27 11:49:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-27 11:50:03 +0000 UTC FinishedAt: 2026-08-27 14:55:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkz254[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"48b69cc8825d411a4c4df32de854434e9235a1b0","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"bde1e734-5682-40b9-aabe-2982eab01142","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-27 11:50:03 +0000 UTC FinishedAt: 2026-08-27 14:55:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*78fd2e36-788d-48ed-bc0a-bb3ee8071589,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*ce3e6a13-50ab-4ba9-9419-8dfa4d7e81a9,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-workflowkz254/series-workflowkz254-build-action-2403536970/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-workflowkz254/series-workflowkz254-build-action-2498776063/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-workflowkz254/series-workflowkz254-convert-artifact-1866091092/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,}