Name: series-workflowjz725 Phase: Succeeded StartedAt: 2026-08-12 20:12:29 +0000 UTC FinishedAt: 2026-08-13 00:01:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[0] Phase: Succeeded StartedAt: 2026-08-12 20:12:29 +0000 UTC FinishedAt: 2026-08-12 20:16:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[0].run-triage Phase: Succeeded StartedAt: 2026-08-12 20:12:29 +0000 UTC FinishedAt: 2026-08-12 20:16:04 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "1029098ee3275ea5b78e329ce132262affa2f8cc", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "1029098ee3275ea5b78e329ce132262affa2f8cc", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "series_id": "deb6dd68-24b9-4bd9-8ca0-10d57d546eed" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__split_huge_page_to_list_to_order", "folio_split_unmapped", "folio_check_splittable", "__swap_cache_replace_folio" ], "corpus_urls": [ "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+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O2ZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChzcGVjaWZpY2FsbHkgYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYCksIGludHJvZHVjaW5nIHNlcGFyYXRlIHBhdGhzIGZvciBhbm9ueW1vdXMvc3dhcGNhY2hlIGZvbGlvcyBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBUaGUgY2hhbmdlcyBpbnZvbHZlIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBMUlUgbGlzdCBtYW5hZ2VtZW50LCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHVwZGF0ZXMuXG5cblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxMiAyMDoxNDoyMiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggY2VkNDAwZjcyZDQzYS4uMWM2MWI3ZDM5Y2QwMyAxMDA2NDRcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmNcbkBAIC0zNTg5LDkgJiM0MzszNTg5LDYgQEAgc3RhdGljIHZvaWQgcmVtYXBfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yLCBpbnQgZmxhZ3MpXG4ge1xuIFx0aW50IGkgPSAwO1xuIFxuLVx0LyogSWYgdW5tYXBfZm9saW8oKSB1c2VzIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSwgcmVtb3ZlIHRoaXMgY2hlY2sgKi9cbi1cdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbi1cdFx0cmV0dXJuO1xuIFx0Zm9yICg7Oykge1xuIFx0XHRyZW1vdmVfbWlncmF0aW9uX3B0ZXMoZm9saW8sIGZvbGlvLCBUVFVfUk1BUF9MT0NLRUQgfCBmbGFncyk7XG4gXHRcdGkgJiM0Mzs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbkBAIC0zNjM0LDYgJiM0MzszNjMxLDE4IEBAIHN0YXRpYyBib29sIHBhZ2VfcmFuZ2VfaGFzX2h3cG9pc29uZWQoc3RydWN0IHBhZ2UgKnBhZ2UsIGxvbmcgbnJfcGFnZXMpXG4gXHRyZXR1cm4gZmFsc2U7XG4gfVxuIFxuJiM0MzsvKipcbiYjNDM7ICogZm9yX2VhY2hfZm9saW9fc2FmZSAtIGl0ZXJhdGUgb3ZlciBjb250aWd1b3VzIGZvbGlvcyBzYWZlIGFnYWluc3QgZm9saW8gZnJlZVxuJiM0MzsgKiBAc3RhcnQ6IHRoZSBmaXJzdCBmb2xpbyB0byBpdGVyYXRlXG4mIzQzOyAqIEBlbmQ6IHNlbnRpbmVsLCBmb2xpb19uZXh0KCkgb2YgdGhlIGxhc3QgZm9saW8gdG8gaXRlcmF0ZVxuJiM0MzsgKiBAc3ViX2ZvbGlvOiBzdHJ1Y3QgZm9saW8gKiB0byB1c2UgYXMgdGhlIGxvb3AgY3Vyc29yXG4mIzQzOyAqIEBuZXh0OiBzdHJ1Y3QgZm9saW8gKiB1c2VkIGFzIHRlbXBvcmFyeSBzdG9yYWdlXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIGZvcl9lYWNoX2ZvbGlvX3NhZmUoc3RhcnQsIGVuZCwgc3ViX2ZvbGlvLCBuZXh0KSBcXFxuJiM0MztcdGZvciAoc3ViX2ZvbGlvID0gKHN0YXJ0KSwgbmV4dCA9IGZvbGlvX25leHQoc3ViX2ZvbGlvKTsgXFxcbiYjNDM7XHQgICAgIHN1Yl9mb2xpbyAhPSAoZW5kKTsgXFxcbiYjNDM7XHQgICAgIHN1Yl9mb2xpbyA9IG5leHQsIG5leHQgPSBmb2xpb19uZXh0KG5leHQpKVxuJiM0MztcbiAvKlxuICAqIEl0IHNwbGl0cyBAZm9saW8gaW50byBAbmV3X29yZGVyIGZvbGlvcyBhbmQgY29waWVzIHRoZSBAZm9saW8gbWV0YWRhdGEgdG9cbiAgKiBhbGwgdGhlIHJlc3VsdGluZyBmb2xpb3MuXG5AQCAtMzc1NSw4ICYjNDM7Mzc2NCw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiB9XG4gXG4gLyoqXG4tICogX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIC0gc3BsaXRzIGFuIHVubWFwcGVkIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MgaW5cbi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cbiYjNDM7ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zXG4mIzQzOyAqIGluIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XG4gICogICAgICAgICAgICAgYWxsb2NhdG9yIGxpa2Ugc3BsaXQgZ2VuZXJhdGVzIGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tIEBmb2xpbyYjMzk7c1xuQEAgLTM3OTUsMTEgJiM0MzszODA0LDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4mIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcbiBcdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4mIzQzO1x0Y29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0aW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxO1xuIFx0c3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbztcbkBAIC0zODE0LDggJiM0MzszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHQgICAgIHNwbGl0X29yZGVyLS0pIHtcbiBcdFx0aW50IG5yX25ld19mb2xpb3MgPSAxVUwgXHUwMDNjXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XG4gXG4tXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbi1cdFx0aWYgKGlzX2Fub24gXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4mIzQzO1x0XHQvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuJiM0MztcdFx0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4gXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdGlmIChtYXBwaW5nKSB7XG5AQCAtMzg3OCwzMiAmIzQzOzM4ODgsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4mIzQzO1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiYjNDM7XG4gXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbiBcdC8qXG4gXHQgKiBGb2xpb3MgdGhhdCBqdXN0IGdvdCB0cnVuY2F0ZWQgY2Fubm90IGdldCBzcGxpdC4gU2lnbmFsIHRvIHRoZVxuLVx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS5cbi1cdCAqXG4tXHQgKiBUT0RPOiB0aGlzIHdpbGwgYWxzbyBjdXJyZW50bHkgcmVmdXNlIGZvbGlvcyB3aXRob3V0IGEgbWFwcGluZyBpbiB0aGVcbi1cdCAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLlxuJiM0MztcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuJiM0MztcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxuIFx0ICovXG4tXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuJiM0MztcdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWlzX3N3YXBjYWNoZSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbi1cdC8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi9cbi1cdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4tXG4gXHQvKlxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMFxuLVx0ICpcbi1cdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cbi1cdCAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnlcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWRcbi1cdCAqIGhlcmUuXG4mIzQzO1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuJiM0MztcdCAqIGRlZmVycmVkIHNwbGl0IGxpc3QsIGh5YnJpZCBzaG1lbSBcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxuJiM0MztcdCAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZFxuJiM0MztcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4mIzQzO1x0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdH1cbiBcbiBcdGlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0zOTExLDM5ICYjNDM7MzkxNSw5NyBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXG4mIzQzO1x0ICogc2htZW0gZm9saW8gdW5kZXIgU1dBUCBJTywgaXQmIzM5O3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXG4mIzQzO1x0ICogc2htZW0gbWFwcGluZyBhZnRlcndhcmQuIFRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZyB0aGVtXG4mIzQzO1x0ICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghaXNfYW5vbiBcdTAwMjZcdTAwMjYgaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiBmb2xpby1cdTAwM2VtYXBwaW5nKVxuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqL1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4mIzQzOy8qKlxuJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpb1xuJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZFxuJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4mIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG9cbiYjNDM7ICogICAgICAgICAgdGhlIExSVSBsaXN0XG4mIzQzOyAqIEBhbm9uX3VubWFwOiBpZiB0cnVlLCB1bm1hcCBAZm9saW8gYmVmb3JlIHRoZSBzcGxpdCBhbmQgcmVtYXAgaXQgYWZ0ZXJcbiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4mIzQzOyAqXG4mIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzXG4mIzQzOyAqIEBhbm9uX3VubWFwIGlzIGZhbHNlKSwgZnJlZXplcyBpdHMgcmVmY291bnQsIGFuZCBwZXJmb3JtcyB0aGUgc3BsaXQsIHVwZGF0ZXNcbiYjNDM7ICogdGhlIHN3YXAgY2FjaGUgZW50cmllcy4gU3BsaXQgZm9saW9zIGFyZSB1bmZyb3plbiBhbmQgcmVtYXBwZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuJiM0MztcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4mIzQzO1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuJiM0MztcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuJiM0MztcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4gXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XG4mIzQzO1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xuIFx0aW50IHJldCA9IDA7XG4gXG4tXHRWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgXHUwMDI2XHUwMDI2IGVuZCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcbiYjNDM7XHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cbiYjNDM7XHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbiYjNDM7XHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xuJiM0MztcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4mIzQzO1x0XHRpZiAoIWFub25fdm1hKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi9cbiYjNDM7XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gb3V0X3VubG9jaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChhbm9uX3VubWFwKVxuJiM0MztcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuJiM0MztcbiYjNDM7XHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuJiM0MztcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCxcbiYjNDM7XHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4mIzQzO1x0ZGVxdWV1ZV9kZWZlcnJlZCA9IG9sZF9vcmRlciBcdTAwM2UgMSBcdTAwMjZcdTAwMjYgaXNfYW5vbjtcbiBcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4gXHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiBcbkBAIC0zOTUyLDEyOCAmIzQzOzQwMTQsMjUyIEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gXHRcdGxydSA9IGxpc3RfbHJ1X2xvY2soXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxuIFx0XHRcdFx0ICAgIGZvbGlvX25pZChmb2xpbyksIFx1MDAyNm1lbWNnKTtcbiBcdH1cbi1cdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4mIzQzO1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkge1xuIFx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuLVx0XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuLVx0XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4tXHRcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbi1cdFx0XHRcdFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuLVx0XHRcdH1cbiBcdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbiBcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0fVxuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gb3V0X25vX3NwbGl0O1xuJiM0MztcdH1cbiBcbi1cdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4tXG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX1NITUVNX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9GSUxFX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuJiM0MztcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4mIzQzO1x0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbiYjNDM7XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbiYjNDM7XHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4mIzQzO1x0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuJiM0MztcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbiYjNDM7XHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbiYjNDM7XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4mIzQzO1x0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiYjNDM7XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4gXG4tXHRcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbi1cdFx0fVxuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4mIzQzO1xuJiM0MztcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLFxuJiM0MztcdFx0XHRcdCAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIHRoZSBwb3N0LXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbiYjNDM7XHQgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzXG4mIzQzO1x0ICogaW4gc3dhcCBjYWNoZSBtdXN0IGJlIHVwZGF0ZWQgZmlyc3QsIHNvIGEgY29uY3VycmVudFxuJiM0MztcdCAqIHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKCkgY2Fubm90IHJldHVybiB0aGUgaGVhZCBmb2xpbyBmb3IgYSBzdWJcbiYjNDM7XHQgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvcl9lYWNoX2ZvbGlvX3NhZmUoZm9saW9fbmV4dChmb2xpbyksIGVuZF9mb2xpbywgbmV3X2ZvbGlvLCBuZXh0KSB7XG4mIzQzO1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuJiM0MztcdFx0XHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XG4mIzQzO1x0XHRpZiAoY2kpXG4mIzQzO1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbiYjNDM7XHR9XG4gXG4tXHRcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcyxcbi1cdFx0XHRcdFx0ICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbiYjNDM7XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbiYjNDM7XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4tXHRcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZVxuLVx0XHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3Ncbi1cdFx0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxuLVx0XHQgKiBAZm9saW8uXG4tXHRcdCAqL1xuLVx0XHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuLVx0XHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcbi1cdFx0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbiYjNDM7XHRpZiAoZG9fbHJ1KVxuJiM0MztcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuJiM0MztcdGlmIChjaSlcbiYjNDM7XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuJiM0MztvdXRfbm9fc3BsaXQ6XG4mIzQzO1x0bG9jYWxfaXJxX2VuYWJsZSgpO1xuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbiYjNDM7XHRcdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4mIzQzO1x0XHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4mIzQzO1x0fVxuJiM0MztvdXRfdW5sb2NrOlxuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuJiM0MztcdFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcbiYjNDM7XHR9XG4gXG4tXHRcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4gXG4tXHRcdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcbiYjNDM7LyoqXG4mIzQzOyAqIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKCkgLSBzcGxpdCBhIGZpbGUtYmFja2VkIGZvbGlvXG4mIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZFxuJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4mIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuJiM0MzsgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXG4mIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbiYjNDM7ICpcbiYjNDM7ICogSGVscGVyIGZvciBzcGxpdHRpbmcgYSBmaWxlLWJhY2tlZCBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbywgZnJlZXplcyBpdHNcbiYjNDM7ICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdFxuJiM0MzsgKiBmb2xpb3MgYXJlIHVuZnJvemVuIGJ1dCBub3QgcmVtYXBwZWQsIHRoZXkgYXJlIGZhdWx0ZWQgYmFjayBpbiBvbiBkZW1hbmQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTVxuJiM0MzsgKiBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlcilcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4mIzQzO1x0WEFfU1RBVEUoeGFzLCBcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuJiM0MztcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4mIzQzO1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4mIzQzO1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuJiM0MztcdHBnb2ZmX3QgZW5kID0gMDtcbiYjNDM7XHRnZnBfdCBnZnA7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4gXG4tXHRcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbi1cdFx0XHRcdFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7XG4mIzQzO1x0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4mIzQzO1x0aWYgKG5ld19vcmRlciBcdTAwM2MgbWluX29yZGVyKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4mIzQzO1x0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuJiM0MztcdCAqL1xuJiM0MztcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4mIzQzO1x0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbm9ueW1vdXMgZm9saW8gd2l0aCBzd2FwIGNhY2hlLlxuLVx0XHRcdCAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKGNpKSB7XG4tXHRcdFx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4mIzQzO1x0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKTtcbiYjNDM7XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuJiM0MztcdFx0cmV0ID0gLUVCVVNZO1xuJiM0MztcdFx0Z290byBmYWlsX2ZyZWU7XG4mIzQzO1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbiBcbi1cdFx0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbi1cdFx0XHRpZiAobmV3X2ZvbGlvLVx1MDAzZWluZGV4IFx1MDAzYyBlbmQpIHtcbi1cdFx0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4tXHRcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4mIzQzO1x0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4mIzQzO1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlcztcbi1cdFx0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4tXHRcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQoXG4tXHRcdFx0XHRcdG5ld19mb2xpbywgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4tXHRcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuLVx0XHRcdGZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpO1xuJiM0MztcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuJiM0MztcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbiYjNDM7XHRcdGlmICh4YXNfZXJyb3IoXHUwMDI2eGFzKSkge1xuJiM0MztcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbiYjNDM7XHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbiYjNDM7XHR9XG4gXG4tXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuLVx0XHQgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuXG4tXHRcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4tXHRcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKi9cbi1cdFx0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4gXG4tXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuJiM0MztcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSAqL1xuJiM0MztcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBmYWlsX21tYXBfdW5sb2NrO1xuJiM0MztcdH1cbiBcbi1cdFx0aWYgKGNpKVxuLVx0XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0fSBlbHNlIHtcbi1cdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4mIzQzO1x0ICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmVcbiYjNDM7XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4mIzQzO1x0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4mIzQzO1x0ICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbiYjNDM7XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbiYjNDM7XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4mIzQzO1xuJiM0MztcdHVubWFwX2ZvbGlvKGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0eGFzX2xvY2tfaXJxKFx1MDAyNnhhcyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS5cbiYjNDM7XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICYjNDM7IDEpKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbiYjNDM7XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKVxuJiM0MztcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NITUVNX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbiYjNDM7XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4mIzQzO1x0cmV0ID0gX19zcGxpdF9mcm96ZW5fZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcyxcbiYjNDM7XHRcdFx0XHQgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4mIzQzO1x0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlXG4mIzQzO1x0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4mIzQzO1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbiYjNDM7XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4mIzQzO1x0ICogQGZvbGlvLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvcl9lYWNoX2ZvbGlvX3NhZmUoZm9saW9fbmV4dChmb2xpbyksIGVuZF9mb2xpbywgbmV3X2ZvbGlvLCBuZXh0KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuJiM0MztcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgJiM0MzsgMSk7XG4mIzQzO1xuJiM0MztcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuJiM0MztcbiYjNDM7XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuJiM0MztcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4mIzQzO1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4mIzQzO1x0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4mIzQzO1xuJiM0MztcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbiYjNDM7XHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuJiM0MztcdFx0XHRucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlcztcbiYjNDM7XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbiYjNDM7XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuJiM0MztcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuJiM0MztcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuJiM0MztcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbiYjNDM7XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuJiM0MztcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbiYjNDM7ZmFpbDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbiYjNDM7XHQgKiByZW1lbWJlciB0byBhZGQgcmVtYXBfcGFnZSgpIGFuZCBhZGFwdCBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuJiM0MztmYWlsX21tYXBfdW5sb2NrOlxuJiM0MztcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuJiM0MztcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4mIzQzO1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuJiM0MztcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcbiYjNDM7XHQgKiB0aGUgbWFwcGluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4mIzQzO2ZhaWxfZnJlZTpcbiYjNDM7XHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuJiM0MztcdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcbiYjNDM7XHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4mIzQzO1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSAmIzQzOzQyNzIsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuICAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbiAgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4gICpcbi0gKiBJdCBjYWxscyBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiYjNDM7ICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cbiYjNDM7ICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICYjNDM7NDI4OCwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCxcbiBcdFx0c3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuLVx0WEFfU1RBVEUoeGFzLCBcdTAwMjZmb2xpby1cdTAwM2VtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbiYjNDM7XHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICYjNDM7NDMwMCwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuJiM0MztcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRpZiAobmV3X29yZGVyIFx1MDAzZT0gb2xkX29yZGVyKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuJiM0MztcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIHN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbiYjNDM7XHRpZiAoaXNfYW5vbilcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbiYjNDM7XHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXG4mIzQzO1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgJiM0Mzs0MzMzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpXG4gXHRcdFx0Y29udGludWU7XG4gXG4tXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuIFx0XHQvKlxuIFx0XHQgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWRcbiBcdFx0ICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlXG4tXHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWxcbiYjNDM7XHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4mIzQzO1x0XHRpZiAoaXNfc3dhcGNhY2hlKVxuJiM0MztcdFx0XHRmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTtcbiYjNDM7XHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcHV0KG5ld19mb2xpbyk7XG4gXHR9XG4gXG4tb3V0X3VubG9jazpcbi1cdGlmIChhbm9uX3ZtYSkge1xuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuLVx0fVxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbiBvdXQ6XG4tXHQvKiByZXN0b3JlIHRvIGNhbGxlciYjMzk7cyBvbGRfbWVtY2cgKi9cbi1cdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcbi1cdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcbi1vdXRfbm9fbWVtY2c6XG4tXHR4YXNfZGVzdHJveShcdTAwMjZ4YXMpO1xuIFx0aWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKVxuIFx0XHRjb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpO1xuIFx0Y291bnRfbXRocF9zdGF0KG9sZF9vcmRlciwgIXJldCA/IE1USFBfU1RBVF9TUExJVCA6IE1USFBfU1RBVF9TUExJVF9GQUlMRUQpO1xuQEAgLTQzMTEsMjkgJiM0Mzs0MzY5LDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKVxuICAqXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcbi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbiYjNDM7ICogZm9saW9fZnJlZV9zd2FwKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbiAgKlxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0b1xuICAqICAgICAgICAgaW5zdWZmaWNpZW50IHJlZmVyZW5jZSBjb3VudCBvciBleHRyYSBwaW5zKS5cbiAgKi9cbiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiB7XG4tXHRpbnQgcmV0ID0gMDtcbi1cbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4gXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSlcbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4tXG4tXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIE5VTEwsXG4tXHRcdFx0XHRcdFx0TlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSxcbi1cdFx0XHRcdFx0XHQwLCBOVUxMKTtcbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0dXJuIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBmYWxzZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTAgJiM0Mzs0NDAxLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogICAgR1VQIHBpbnMsIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xpbyBub3QgZ2V0dGluZyBzcGxpdDsgaW5zdGVhZCwgdGhlIGNhbGxlclxuICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLlxuICAqXG4tICogNCkgQG5ld19vcmRlciBcdTAwM2UgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3Rcbi0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIHdoaWNoXG4tICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTFcbi0gKiAgICBmb2xpbyBvbmx5IGhhcyBzdWJwYWdlcyAwIGFuZCAxLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxuJiM0MzsgKiA0KSBAbmV3X29yZGVyICE9IDEgZm9yIGFub24gb3Igc3dhcGNhY2hlLiBBbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3JcbiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcbiYjNDM7ICogICAgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxuICAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGNhbGxlciYjMzk7cyBmb2xpbyByZWZlcmVuY2Ugd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byBAcGFnZSxcbkBAIC00Mzg0LDcgJiM0Mzs0NDMyLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxuICAqL1xuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuIFxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggJiM0MzszODgsOSBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXHQgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7XG4gXHRcdGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtXHUwMDNlc3dhcCk7XG4gXHRcdGNpX2VuZCA9IGNpX29mZiAmIzQzOyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmJiM0MzsmIzQzOyBcdTAwM2MgY2lfZW5kKVxuJiM0MztcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbiYjNDM7XHRcdH0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEF1ZyAxMiAyMDoxNDoyMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jCmluZGV4IGNlZDQwMGY3MmQ0M2EuLjFjNjFiN2QzOWNkMDMgMTAwNjQ0Ci0tLSBhL21tL2h1Z2VfbWVtb3J5LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vaHVnZV9tZW1vcnkuYwpAQCAtMzU4OSw5ICYjNDM7MzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKQogewogCWludCBpID0gMDsKIAotCS8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovCi0JaWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKQotCQlyZXR1cm47CiAJZm9yICg7OykgewogCQlyZW1vdmVfbWlncmF0aW9uX3B0ZXMoZm9saW8sIGZvbGlvLCBUVFVfUk1BUF9MT0NLRUQgfCBmbGFncyk7CiAJCWkgJiM0Mzs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKQEAgLTM2MzQsNiAmIzQzOzM2MzEsMTggQEAgc3RhdGljIGJvb2wgcGFnZV9yYW5nZV9oYXNfaHdwb2lzb25lZChzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9uZyBucl9wYWdlcykKIAlyZXR1cm4gZmFsc2U7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBmb3JfZWFjaF9mb2xpb19zYWZlIC0gaXRlcmF0ZSBvdmVyIGNvbnRpZ3VvdXMgZm9saW9zIHNhZmUgYWdhaW5zdCBmb2xpbyBmcmVlCiYjNDM7ICogQHN0YXJ0OiB0aGUgZmlyc3QgZm9saW8gdG8gaXRlcmF0ZQomIzQzOyAqIEBlbmQ6IHNlbnRpbmVsLCBmb2xpb19uZXh0KCkgb2YgdGhlIGxhc3QgZm9saW8gdG8gaXRlcmF0ZQomIzQzOyAqIEBzdWJfZm9saW86IHN0cnVjdCBmb2xpbyAqIHRvIHVzZSBhcyB0aGUgbG9vcCBjdXJzb3IKJiM0MzsgKiBAbmV4dDogc3RydWN0IGZvbGlvICogdXNlZCBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQomIzQzOyAqLwomIzQzOyNkZWZpbmUgZm9yX2VhY2hfZm9saW9fc2FmZShzdGFydCwgZW5kLCBzdWJfZm9saW8sIG5leHQpIFwKJiM0MzsJZm9yIChzdWJfZm9saW8gPSAoc3RhcnQpLCBuZXh0ID0gZm9saW9fbmV4dChzdWJfZm9saW8pOyBcCiYjNDM7CSAgICAgc3ViX2ZvbGlvICE9IChlbmQpOyBcCiYjNDM7CSAgICAgc3ViX2ZvbGlvID0gbmV4dCwgbmV4dCA9IGZvbGlvX25leHQobmV4dCkpCiYjNDM7CiAvKgogICogSXQgc3BsaXRzIEBmb2xpbyBpbnRvIEBuZXdfb3JkZXIgZm9saW9zIGFuZCBjb3BpZXMgdGhlIEBmb2xpbyBtZXRhZGF0YSB0bwogICogYWxsIHRoZSByZXN1bHRpbmcgZm9saW9zLgpAQCAtMzc1NSw4ICYjNDM7Mzc2NCw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlciwKIH0KIAogLyoqCi0gKiBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgLSBzcGxpdHMgYW4gdW5tYXBwZWQgQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvcyBpbgotICogdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuCiYjNDM7ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zCiYjNDM7ICogaW4gdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuCiAgKiBAZm9saW86IHRoZSB0by1iZS1zcGxpdCBmb2xpbwogICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5CiAgKiAgICAgICAgICAgICBhbGxvY2F0b3IgbGlrZSBzcGxpdCBnZW5lcmF0ZXMgZm9saW9zIHdpdGggb3JkZXJzIGZyb20gQGZvbGlvJiMzOTtzCkBAIC0zNzk1LDExICYjNDM7MzgwNCwxMiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCAmbHQ7MCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlCiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spCiAgKi8KLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAomIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKIAkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewogCWNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CWNvbnN0IGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJaW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxOwogCXN0cnVjdCBmb2xpbyAqb2xkX2ZvbGlvID0gZm9saW87CkBAIC0zODE0LDggJiM0MzszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsCiAJICAgICBzcGxpdF9vcmRlci0tKSB7CiAJCWludCBucl9uZXdfZm9saW9zID0gMVVMICZsdDsmbHQ7IChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7CiAKLQkJLyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqLwotCQlpZiAoaXNfYW5vbiAmYW1wOyZhbXA7IHNwbGl0X29yZGVyID09IDEpCiYjNDM7CQkvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqLwomIzQzOwkJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQogCQkJY29udGludWU7CiAKIAkJaWYgKG1hcHBpbmcpIHsKQEAgLTM4NzgsMzIgJiM0MzszODg4LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJCSAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKJiM0MzsKIAlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAkvKgogCSAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlCi0JICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4KLQkgKgotCSAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZQotCSAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLgomIzQzOwkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8KJiM0MzsJICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuCiAJICovCi0JaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQomIzQzOwlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWlzX3N3YXBjYWNoZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi8KLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qCi0JICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMAotCSAqCi0JICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbQotCSAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnkKLQkgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkCi0JICogaGVyZS4KJiM0MzsJICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZQomIzQzOwkgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gJmFtcDsgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdAomIzQzOwkgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGQKJiM0MzsJICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LgogCSAqLwotCWlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgJmFtcDsmYW1wOyBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKJiM0MzsJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJaWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzkxMSwzOSAmIzQzOzM5MTUsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAlpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKQogCQlyZXR1cm4gLUVCVVNZOwogCiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhCiYjNDM7CSAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0JiMzOTtzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvcgomIzQzOwkgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW0KJiM0MzsJICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkCiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGUKJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXQKJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIKJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG8KJiM0MzsgKiAgICAgICAgICB0aGUgTFJVIGxpc3QKJiM0MzsgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzCiYjNDM7ICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlcwomIzQzOyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLAomIzQzOwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7NDAxNCwyNTIgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLAomIzQzOwkJCQkgICBOVUxMLCBzcGxpdF90eXBlKTsKIAotCQkvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi8KJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIHBvc3Qtc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzCiYjNDM7CSAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnQKJiM0MzsJICogc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvIGZvciBhIHN1YgomIzQzOwkgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLgomIzQzOwkgKi8KJiM0MzsJZm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHsKJiM0MzsJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiAJCWlmIChkb19scnUpCi0JCQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkJaWYgKGNpKQomIzQzOwkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJfQogCi0JCXJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcywKLQkJCQkJICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7CiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiAKLQkJLyoKLQkJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAotCQkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGUKLQkJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCi0JCSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKLQkJICogQGZvbGlvLgotCQkgKi8KLQkJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKLQkJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7Ci0JCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTsKJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJaWYgKGNpKQomIzQzOwkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7CiYjNDM7b3V0X25vX3NwbGl0OgomIzQzOwlsb2NhbF9pcnFfZW5hYmxlKCk7CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwomIzQzOwkJcHV0X2Fub25fdm1hKGFub25fdm1hKTsKJiM0MzsJfQogCi0JCQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KIAotCQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZAomIzQzOyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlCiYjNDM7ICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpCiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0CiYjNDM7ICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzCiYjNDM7ICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdAomIzQzOyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTQomIzQzOyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiYjNDM7CQkJCQkgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwomIzQzOwlYQV9TVEFURSh4YXMsICZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgZm9saW8tJmd0O2luZGV4KTsKJiM0MzsJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKJiM0MzsJbG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZzsKJiM0MzsJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwomIzQzOwlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGludCBtaW5fb3JkZXI7CiYjNDM7CXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKJiM0MzsJcGdvZmZfdCBlbmQgPSAwOwomIzQzOwlnZnBfdCBnZnA7CiYjNDM7CWludCByZXQgPSAwOwogCi0JCQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAotCQkJCQkgICBmb2xpb19jYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7CiYjNDM7CWlmIChuZXdfb3JkZXIgJmx0OyBtaW5fb3JkZXIpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKGRvX2xydSkKLQkJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CS8qCiYjNDM7CSAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kCiYjNDM7CSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KJiM0MzsJICovCiYjNDM7CW1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7CiYjNDM7CW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwogCi0JCQkvKgotCQkJICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS4KLQkJCSAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0JCQkgKi8KLQkJCWlmIChjaSkgewotCQkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKLQkJCQljb250aW51ZTsKLQkJCX0KJiM0MzsJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7IEdGUF9SRUNMQUlNX01BU0spOwomIzQzOwlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewomIzQzOwkJcmV0ID0gLUVCVVNZOwomIzQzOwkJZ290byBmYWlsX2ZyZWU7CiYjNDM7CX0KIAotCQkJLyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqLwotCQkJaWYgKCFtYXBwaW5nKQotCQkJCWNvbnRpbnVlOwomIzQzOwltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwogCi0JCQkvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi8KLQkJCWlmIChuZXdfZm9saW8tJmd0O2luZGV4ICZsdDsgZW5kKSB7Ci0JCQkJX194YV9zdG9yZSgmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIG5ld19mb2xpby0mZ3Q7aW5kZXgsCi0JCQkJCSAgIG5ld19mb2xpbywgMCk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewomIzQzOwkJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAotCQkJVk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTsKLQkJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KLQkJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpICZhbXA7JmFtcDsgbnJfc2htZW1fZHJvcHBlZCkKLQkJCQkqbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7Ci0JCQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCi0JCQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKAotCQkJCQluZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKLQkJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKLQkJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwomIzQzOwkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwomIzQzOwkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwomIzQzOwkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKJiM0MzsJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwomIzQzOwkJCWdvdG8gZmFpbF9mcmVlOwogCQl9CiYjNDM7CX0KIAotCQl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKLQkJLyoKLQkJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKLQkJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgotCQkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwotCQkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICovCi0JCWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKIAotCQlpZiAoZG9fbHJ1KQotCQkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwkvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi8KJiM0MzsJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWxfbW1hcF91bmxvY2s7CiYjNDM7CX0KIAotCQlpZiAoY2kpCi0JCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKLQl9IGVsc2UgewotCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJLyoKJiM0MzsJICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmQKJiM0MzsJICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmUKJiM0MzsJICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLgomIzQzOwkgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCwKJiM0MzsJICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy4KJiM0MzsJICovCiYjNDM7CWVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLSZndDtob3N0KSwgUEFHRV9TSVpFKTsKJiM0MzsJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQllbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy0mZ3Q7aG9zdCwgZW5kKTsKJiM0MzsKJiM0MzsJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwl4YXNfbG9ja19pcnEoJmFtcDt4YXMpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgomIzQzOwkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KJiM0MzsJICovCiYjNDM7CWlmICh4YXNfbG9hZCgmYW1wO3hhcykgIT0gZm9saW8pIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgJiM0MzsgMSkpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciAmbHQ7IEhQQUdFX1BNRF9PUkRFUikgewomIzQzOwkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsJcmV0ID0gX19zcGxpdF9mcm96ZW5fZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsICZhbXA7eGFzLAomIzQzOwkJCQkgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGUKJiM0MzsJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCiYjNDM7CSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCiYjNDM7CSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKJiM0MzsJICogQGZvbGlvLgomIzQzOwkgKi8KJiM0MzsJZm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pOwomIzQzOwomIzQzOwkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKJiM0MzsJCQkJICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsKJiM0MzsJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKJiM0MzsKJiM0MzsJCS8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqLwomIzQzOwkJaWYgKG5ld19mb2xpby0mZ3Q7aW5kZXggJmx0OyBlbmQpIHsKJiM0MzsJCQlfX3hhX3N0b3JlKCZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgbmV3X2ZvbGlvLSZndDtpbmRleCwKJiM0MzsJCQkJICAgbmV3X2ZvbGlvLCAwKTsKJiM0MzsJCQljb250aW51ZTsKIAkJfQotCQlyZXR1cm4gLUVBR0FJTjsKJiM0MzsKJiM0MzsJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KJiM0MzsJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJCW5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwomIzQzOwkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2FjY291bnRfY2xlYW5lZChuZXdfZm9saW8sCiYjNDM7CQkJCQkgICAgICBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7CiYjNDM7CQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7CiYjNDM7CQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKIAl9CiAKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKJiM0MzsJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgomIzQzOwkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwomIzQzOwkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KJiM0MzsJICovCiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpOwomIzQzOwlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7ZmFpbDoKJiM0MzsJLyoKJiM0MzsJICogSWYgd2Ugd2FudCB0byB1c2UgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlIGluIHVubWFwX2ZvbGlvLAomIzQzOwkgKiByZW1lbWJlciB0byBhZGQgcmVtYXBfcGFnZSgpIGFuZCBhZGFwdCBpdC4KJiM0MzsJICovCiYjNDM7CXhhc191bmxvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MztmYWlsX21tYXBfdW5sb2NrOgomIzQzOwlpZiAobnJfc2htZW1fZHJvcHBlZCkKJiM0MzsJCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5cwomIzQzOwkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlCiYjNDM7CSAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IKJiM0MzsJICogdGhlIG1hcHBpbmcuCiYjNDM7CSAqLwomIzQzOwlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiYjNDM7ZmFpbF9mcmVlOgomIzQzOwkvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqLwomIzQzOwlzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7CiYjNDM7CW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKJiM0MzsJeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQwODYsOSAmIzQzOzQyNzIsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbgogICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAogICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KQogICoKLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LgomIzQzOyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC4KICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZAotICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpLgomIzQzOyAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZAogICogYW5kIG90aGVycyBhcmUgdW5sb2NrZWQ6CkBAIC00MTAyLDE3ICYjNDM7NDI4OCwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCwKIAkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7Ci0JWEFfU1RBVEUoeGFzLCAmYW1wO2ZvbGlvLSZndDttYXBwaW5nLSZndDtpX3BhZ2VzLCBmb2xpby0mZ3Q7aW5kZXgpOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwogCWJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDsKLQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDsKIAlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDsKLQlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7Ci0JZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDsKLQlwZ29mZl90IGVuZCA9IDA7CiAJaW50IHJldDsKIAogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7CkBAIC00MTIwLDE0MSAmIzQzOzQzMDAsMjkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAKIAlpZiAoZm9saW8gIT0gcGFnZV9mb2xpbyhzcGxpdF9hdCkgfHwgZm9saW8gIT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkgewogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9ub19tZW1jZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAogCWlmIChuZXdfb3JkZXIgJmd0Oz0gb2xkX29yZGVyKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJcmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTsKIAlpZiAocmV0KSB7CiAJCVZNX1dBUk5fT05DRShyZXQgPT0gLUVJTlZBTCwgJiMzNDtUcmllZCB0byBzcGxpdCBhbiB1bnNwbGl0dGFibGUgZm9saW8mIzM0Oyk7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwotCX0KLQotCS8qCi0JICogc3dpdGNoIHRvIGZvbGlvJiMzOTtzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmQKLQkgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuCi0JICovCi0JbWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTsKLQlvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTsKLQotCWlmIChpc19hbm9uKSB7Ci0JCS8qCi0JCSAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZAotCQkgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhCi0JCSAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXMKLQkJICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrCi0JCSAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlCi0JCSAqIG9wZXJhdGlvbnMuCi0JCSAqLwotCQlhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7Ci0JCWlmICghYW5vbl92bWEpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpOwotCQltYXBwaW5nID0gTlVMTDsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgbWluX29yZGVyOwotCQlnZnBfdCBnZnA7Ci0KLQkJbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwotCQltaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTsKLQkJaWYgKG5ld19vcmRlciAmbHQ7IG1pbl9vcmRlcikgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7Ci0JCQkJCQkJR0ZQX1JFQ0xBSU1fTUFTSyk7Ci0KLQkJaWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJbWFwcGluZ19zZXRfdXBkYXRlKCZhbXA7eGFzLCBtYXBwaW5nKTsKLQotCQlpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHsKLQkJCXhhc19zZXRfb3JkZXIoJmFtcDt4YXMsIGZvbGlvLSZndDtpbmRleCwgbmV3X29yZGVyKTsKLQkJCXhhc19zcGxpdF9hbGxvYygmYW1wO3hhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTsKLQkJCWlmICh4YXNfZXJyb3IoJmFtcDt4YXMpKSB7Ci0JCQkJcmV0ID0geGFzX2Vycm9yKCZhbXA7eGFzKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCi0JCWFub25fdm1hID0gTlVMTDsKLQkJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKLQotCQkvKgotCQkgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmQKLQkJICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmUKLQkJICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLgotCQkgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCwKLQkJICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy4KLQkJICovCi0JCWVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLSZndDtob3N0KSwgUEFHRV9TSVpFKTsKLQkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCi0JCQllbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy0mZ3Q7aG9zdCwgZW5kKTsKLQl9Ci0KLQkvKgotCSAqIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSB3aWxsCi0JICogc3BsaXQgUE1EcwotCSAqLwotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQl1bm1hcF9mb2xpbyhmb2xpbyk7Ci0KLQkvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqLwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JaWYgKG1hcHBpbmcpIHsKLQkJLyoKLQkJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KLQkJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCi0JCSAqLwotCQl4YXNfbG9jaygmYW1wO3hhcyk7Ci0JCXhhc19yZXNldCgmYW1wO3hhcyk7Ci0JCWlmICh4YXNfbG9hZCgmYW1wO3hhcykgIT0gZm9saW8pIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KJiM0MzsJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgJmFtcDt4YXMsIG1hcHBpbmcsCi0JCQkJCQl0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsICZhbXA7bnJfc2htZW1fZHJvcHBlZCk7Ci1mYWlsOgotCWlmIChtYXBwaW5nKQotCQl4YXNfdW5sb2NrKCZhbXA7eGFzKTsKLQotCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCWlmIChucl9zaG1lbV9kcm9wcGVkKQotCQlzaG1lbV91bmNoYXJnZShtYXBwaW5nLSZndDtob3N0LCBucl9zaG1lbV9kcm9wcGVkKTsKLQotCWlmICghcmV0ICZhbXA7JmFtcDsgaXNfYW5vbiAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCi0JCXR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFOwotCi0JcmVtYXBfcGFnZShmb2xpbywgMSAmbHQ7Jmx0OyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7Ci0KLQkvKgotCSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCi0JICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlIHVudGlsIHRoZSBsb29wIGJlbG93LCBzbwotCSAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heQotCSAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlCi0JICogY2FjaGUuIE5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IgdGhlIG1hcHBpbmcuCi0JICovCi0JaWYgKG1hcHBpbmcpIHsKLQkJaV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpOwotCQltYXBwaW5nID0gTlVMTDsKLQl9CiYjNDM7CWlmIChpc19hbm9uKQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSAgICAgdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiYjNDM7CWVsc2UgaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCXJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSwKJiM0MzsJCQkJCQkgICAgIGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsCiYjNDM7CQkJCQkJCSAgbGlzdCwgc3BsaXRfdHlwZSk7CiAKIAkvKgogCSAqIFVubG9jayBhbGwgYWZ0ZXItc3BsaXQgZm9saW9zIGV4Y2VwdCB0aGUgb25lIGNvbnRhaW5pbmcKQEAgLTQyNjUsMjkgJiM0Mzs0MzMzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpCiAJCQljb250aW51ZTsKIAotCQlmb2xpb191bmxvY2sobmV3X2ZvbGlvKTsKIAkJLyoKIAkJICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkCiAJCSAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZQotCQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiYjNDM7CQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbAogCQkgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLgogCQkgKi8KLQkJZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pOwomIzQzOwkJaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCQlmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fcHV0KG5ld19mb2xpbyk7CiAJfQogCi1vdXRfdW5sb2NrOgotCWlmIChhbm9uX3ZtYSkgewotCQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwotCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOwotCX0KLQlpZiAobWFwcGluZykKLQkJaV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpOwogb3V0OgotCS8qIHJlc3RvcmUgdG8gY2FsbGVyJiMzOTtzIG9sZF9tZW1jZyAqLwotCXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKLQltZW1fY2dyb3VwX3B1dChtZW1jZyk7Ci1vdXRfbm9fbWVtY2c6Ci0JeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCWlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSkKIAkJY291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTsKIAljb3VudF9tdGhwX3N0YXQob2xkX29yZGVyLCAhcmV0ID8gTVRIUF9TVEFUX1NQTElUIDogTVRIUF9TVEFUX1NQTElUX0ZBSUxFRCk7CkBAIC00MzExLDI5ICYjNDM7NDM2OSwyMCBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKQogICoKICAqIFVwb24gcmV0dXJuLCB0aGUgZm9saW8gaXMgbm90IHJlbWFwcGVkLCBzcGxpdCBmb2xpb3MgYXJlIG5vdCBhZGRlZCB0byBMUlUsCi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC4KJiM0MzsgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLgogICoKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0bwogICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLgogICovCiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcikKIHsKLQlpbnQgcmV0ID0gMDsKLQogCVZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7CiAKLQlpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCAmYW1wO2ZvbGlvLSZndDtwYWdlLCBOVUxMLAotCQkJCQkJTlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSwKLQkJCQkJCTAsIE5VTEwpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIGZhbHNlLAomIzQzOwkJCQkJICAgICAgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSk7CiB9CiAKIC8qCkBAIC00MzUyLDEwICYjNDM7NDQwMSw5IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogICogICAgR1VQIHBpbnMsIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xpbyBub3QgZ2V0dGluZyBzcGxpdDsgaW5zdGVhZCwgdGhlIGNhbGxlcgogICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uCiAgKgotICogNCkgQG5ld19vcmRlciAmZ3Q7IDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90Ci0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tJmd0O19kZWZlcnJlZF9saXN0LCB3aGljaAotICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTEKLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsCiYjNDM7ICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yCiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkKJiM0MzsgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsCiAgKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJiMzOTtzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLApAQCAtNDM4NCw3ICYjNDM7NDQzMiw3IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLgogICovCiBpbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwogCmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmMKaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtMzg4LDggJiM0MzszODgsOSBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAJICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkgewogCQljaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLSZndDtzd2FwKTsKIAkJY2lfZW5kID0gY2lfb2ZmICYjNDM7IGZvbGlvX25yX3BhZ2VzKG9sZCk7Ci0JCXdoaWxlIChjaV9vZmYmIzQzOyYjNDM7ICZsdDsgY2lfZW5kKQomIzQzOwkJZG8gewogCQkJV0FSTl9PTl9PTkNFKHN3cF90Yl90b19mb2xpbyhfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSAhPSBvbGQpOwomIzQzOwkJfSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiAmbHQ7IGNpX2VuZCk7CiAJfQogfQogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyODgxCgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoIFNlcmllczogRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoaXMgcGF0Y2ggc2VyaWVzIGlzIGNsZWFybHkgdG91Y2hpbmcgY3J1Y2lhbCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgIGZpbGVzLiBJdCYjMzk7cyByZWZhY3RvcmluZyBmb2xpbyBzcGxpdHRpbmcgbG9naWMsIHBhcnRpY3VsYXJseSBmb3IgYW5vbnltb3VzIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBUaGUgaW50cm9kdWN0aW9uIG9mIHRoZXNlIG5ldyBmdW5jdGlvbnMsIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVgLCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGVgIGFuZCBjaGFuZ2VzIHRvIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBzdHJvbmdseSBzdWdnZXN0IGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW1wYWN0aW5nIFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLiBUaGlzIGlzbiYjMzk7dCBqdXN0IGEgdHJpdmlhbCByZWZhY3Rvci4gR2l2ZW4gdGhhdCB0aGlzIGFyZWEgaXMgYWxyZWFkeSBmYWlybHkgY29tcGxleCBhbmQgcHJvbmUgdG8gc3VidGxlIHJhY2UgY29uZGl0aW9ucywgaXQmIzM5O3MgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuCgpNeSBpbW1lZGlhdGUgbmV4dCBzdGVwIGlzIGFsd2F5cyB0byBpZGVudGlmeSB0aGUgZm9jdXMgc3ltYm9scy4gTGV0JiMzOTtzIHNlZS4uLiB0aGUgcGF0Y2ggaW50cm9kdWNlczoKCiogICBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCAoc3RhdGljKSAtIExpa2VseSBhbiBpbnRlcm5hbCBoZWxwZXIKKiAgIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAgKHN0YXRpYykgLSBTaW1pbGFyIHRvIGFib3ZlCiogICBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIChleHBvcnRlZC9nbG9iYWwpIC0gQSBsaWtlbHkgc3RhcnRpbmcgcG9pbnQKKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCAoZXhwb3J0ZWQvZ2xvYmFsKSAtIEFub3RoZXIgcG90ZW50aWFsIGVudHJ5IHBvaW50LgoqICAgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIChnbG9iYWwpIC0gSW1wb3J0YW50IGZvciB0cmlnZ2VyaW5nIHRoZSBuZXcgY29kZSBwYXRocy4KCldhaXQgYSBzZWNvbmQsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgKm5vdCogc3RhdGljLCBzbyB0aGF0JiMzOTtzIGRlZmluaXRlbHkgYSBzdGFydGluZyBwb2ludC4gYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGdsb2JhbCwgd2hpY2ggaXMgZ29vZC4gTm93LCBpcyBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGEgbWFjcm8gb3IgYSBmdW5jdGlvbj8gTGV0JiMzOTtzIHF1aWNrbHkgZG91YmxlLWNoZWNrIGBtbS9odWdlX21lbW9yeS5jYCB0byBiZSBzdXJlLiBUaGF0JiMzOTtzIGEgY2xhc3NpYyBnb3RjaGEuIEFsd2F5cyB2ZXJpZnkgdGhlc2UgYXNzdW1wdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9NDM3Nz1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MzMtICovXG5tbS9odWdlX21lbW9yeS5jOjQ0MzQ6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5tbS9odWdlX21lbW9yeS5jLTQ0MzUtXHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0NTEtICogSXQgaGFzIHRoZSBzYW1lIHByZXJlcXVpc2l0ZXMgYW5kIHJldHVybnMgYXNcbm1tL2h1Z2VfbWVtb3J5LmM6NDQ1MjogKiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpLlxubW0vaHVnZV9tZW1vcnkuYy00NDUzLSAqXG4tLVxubW0vaHVnZV9tZW1vcnkuYz00NTAxPWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXG5tbS9odWdlX21lbW9yeS5jLTQ1MDIte1xubW0vaHVnZV9tZW1vcnkuYzo0NTAzOlx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIGxpc3QsIDApO1xubW0vaHVnZV9tZW1vcnkuYy00NTA0LX1cbi0tXG5tbS9odWdlX21lbW9yeS5jPTQ3ODc9c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX3BpZChpbnQgcGlkLCB1bnNpZ25lZCBsb25nIHZhZGRyX3N0YXJ0LFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDg1Ni1cdFx0Lypcbm1tL2h1Z2VfbWVtb3J5LmM6NDg1NzpcdFx0ICogRm9yIGZvbGlvcyB3aXRoIHByaXZhdGUsIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKClcbm1tL2h1Z2VfbWVtb3J5LmMtNDg1OC1cdFx0ICogd2lsbCB0cnkgdG8gZHJvcCBpdCBiZWZvcmUgc3BsaXQgYW5kIHRoZW4gY2hlY2sgaWYgdGhlIGZvbGlvXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQxMzAKCQkJCQkJCW91dHB1dDogNDIKCQkJCQkJCXRob3VnaHRzOiAzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSYjMzk7bSBkZWVwbHkgZmFtaWxpYXIgd2l0aCBMaW51eCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQ6CgoqKkh1bnRpbmcgRG93biB0aGUgSHVnZSBQYWdlIFNwbGl0IExvZ2ljKioKCkFscmlnaHQsIHRoZSBwcm9ibGVtIEkmIzM5O20gd29ya2luZyBvbiBzdWdnZXN0cyB0aGVyZSYjMzk7cyBhIGJyZWFrZG93biBpbiBob3cgaHVnZSBwYWdlcyBhcmUgaGFuZGxlZCwgc3BlY2lmaWNhbGx5IHdoZW4gdGhleSBuZWVkIHRvIGJlIHNwbGl0LiBNeSBpbnN0aW5jdCBpcyB0byB0cmFjZSB0aGUgZXhlY3V0aW9uIHBhdGggdGhhdCBoYW5kbGVzIHRoaXMgc3BsaXQgb3BlcmF0aW9uLiBUaGUgbmFtaW5nIGNvbnZlbnRpb24gc3Ryb25nbHkgc3VnZ2VzdHMgdGhlIGZ1bmN0aW9uIEkgbmVlZCBpcyBpbiB0aGUgYGluY2x1ZGUvbGludXgvaHVnZV9tbS5oYCBoZWFkZXIgZmlsZS4gVGhlIHNwZWNpZmljIGZ1bmN0aW9uIEkgbmVlZCB0byBsb29rIGF0IHdpbGwgYmUgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gVGhpcyBmdW5jdGlvbiBuYW1lLCBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBhbG1vc3QgY2VydGFpbmx5IG1lYW5zIGl0IHNwbGl0cyBhIGh1Z2UgcGFnZSwgYWRkcyB0aGUgc21hbGxlciBwYWdlcyB0byBhIGZyZWVsaXN0LCBhbmQgdGhlbiBsaWtlbHkgYWRqdXN0cyB0aGUgYWxsb2NhdGlvbiBvcmRlci4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRldGFpbHMgb2YgaG93IGl0JiMzOTtzIHNwbGl0dGluZywgd2hhdCBmcmVlbGlzdCBpdCYjMzk7cyB1c2luZywgYW5kIGhvdyBpdCYjMzk7cyBtYW5hZ2luZyB0aGUgYWxsb2NhdGlvbiBvcmRlciBhZnRlciB0aGUgc3BsaXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsb2dpYyBoZXJlIGlzIHdoZXJlIHRoZSBwcm9ibGVtIGlzIG9yaWdpbmF0aW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDAyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MTA9aW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsIHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxMi1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMzpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNC1cdFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNS17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MTY6XHRyZXR1cm4gX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBsaXN0LCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE3LX1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQxOD1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTkte1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIwOlx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIE5VTEwsIG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjEtfVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQyMz1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjQte1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDI1Olx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIE5VTEwsIDApO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDI2LX1cbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD02NDU9c3RhdGljIGlubGluZSBpbnRcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjY0NjpzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY0Ny1cdFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD04MjY9c3RhdGljIGlubGluZSBpbnQgc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcilcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTgyNy17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo4Mjg6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTgyOS19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUxMzUKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA4MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHRlY2huaWNhbCBzbmlwcGV0LCBwdXQgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXMgcmVxdWVzdGVkOgoKKipEZWNvbnN0cnVjdGluZyBUaGlzIFBhdGNoJiMzOTtzIEZvY3VzKioKCkFscmlnaHQsIHNvIHRoaXMgcGF0Y2ggaXMgY2xlYXJseSB0b3VjaGluZyBzb21lIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHN3YXBwaW5nIGxvZ2ljLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCYjMzk7cyBob25pbmcgaW4gb24gYSBmZXcgc3BlY2lmaWMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaHVnZSBwYWdlIHNwbGl0dGluZyBhbmQgZm9saW8gb3BlcmF0aW9ucy4gU3BlY2lmaWNhbGx5LCBJIHNlZSBpdCYjMzk7cyBwb2tpbmcgYXJvdW5kIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYW5kIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYC4gVGhvc2UgYWxsIHNjcmVhbSAmIzM0O2h1Z2UgcGFnZSBtYW5hZ2VtZW50JiMzNDsgdG8gbWUuCgpCdXQgdGhlcmUmIzM5O3Mgc29tZXRoaW5nIGVsc2UuLi4gaXQgYWxzbyBtZW50aW9ucyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIHdpdGhpbiBgbW0vc3dhcF9zdGF0ZS5jYC4gVGhhdCBmdW5jdGlvbiYjMzk7cyBpbnZvbHZlZCBpbiBzd2FwcGluZywgYnV0IGl0JiMzOTtzICpzdGF0aWMqIHdpdGhpbiB0aGF0IGZpbGUsIHdoaWNoIG1ha2VzIG1lIGN1cmlvdXMuIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBjaGVjayB0aGF0IGZ1bmN0aW9uJiMzOTtzIGRlZmluaXRpb24sIGJlY2F1c2UgdGhlIGZhY3QgdGhhdCBpdCYjMzk7cyBzdGF0aWMgaXMgcG90ZW50aWFsbHkgc2lnbmlmaWNhbnQuIEl0IGNvdWxkIG1lYW4gdGhpcyBwYXRjaCBpcyBtb3JlIHRhcmdldGVkIHRoYW4gaXQgaW5pdGlhbGx5IHNlZW1zLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCAqd2h5KiBpdCYjMzk7cyB0b3VjaGluZyBhIHN0YXRpYyBmdW5jdGlvbiB3aXRoaW4gYSBzd2FwcGluZyBjb250ZXh0IGFsb25nc2lkZSBodWdlIHBhZ2Ugc3BsaXR0aW5nLCBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyB2ZXJ5IGludGVyZXN0aW5nIGhhcHBlbmluZy4gSXMgdGhlcmUgYSBjb25uZWN0aW9uIEkmIzM5O20gbWlzc2luZz8gVGhhdCBmdW5jdGlvbiYjMzk7cyBkZXNpZ24gY291bGQgYmUgaW1wb3J0YW50IGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9zd2FwX3N0YXRlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM0Ny0vKipcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcF9zdGF0ZS5jLTM2Mi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTcwMQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDoKCioqRGlnZ2luZyBpbnRvIFN3YXAgQ2FjaGUgUmVwbGFjZW1lbnQqKgoKT2theSwgc28gSSYjMzk7bSBkZWFsaW5nIHdpdGggYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBhbmQgSSYjMzk7bSBwcmV0dHkgc3VyZSBpdCYjMzk7cyBhIGdsb2JhbCBmdW5jdGlvbiwgYnV0IEkgZG9uJiMzOTt0IHJlY2FsbCBzZWVpbmcgaXQgZXhwb3J0ZWQgYW55d2hlcmUuIFRoYXQgbWFrZXMgbWUgdGhpbmsgaXQmIzM5O3MgbGlrZWx5IGludGVybmFsIHRvIHRoZSBzd2FwIGNhY2hlIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBmYWlyIGVub3VnaC4gVG8gY29uZmlybSB0aGlzIGFuZCB0byB1bmRlcnN0YW5kIGl0cyB1c2UsIEkgc2hvdWxkIHByb2JhYmx5IHRha2UgYSBsb29rIGF0IHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHN3YXAgc3RhdGUgbWFuYWdlbWVudC4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgYG1tL3N3YXBfc3RhdGUuY2AgZm9yIHRoZSBkZWZpbml0aW9uIGFuZCBhbnkgcmVsYXRlZCBjYWxscyB0byBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaGF0JiMzOTtzIHdoZXJlIEkmIzM5O2xsIGdldCB0aGUgcmVhbCBzdG9yeS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvc3dhcC5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU5NDgKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIGBtbS9zd2FwLmhgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIHN3YXAgaW1wbGVtZW50YXRpb24uIE15IGluaXRpYWwgZm9jdXMgaXMgYWx3YXlzIG9uIHRoZSBoZWFkZXIgZmlsZXPigJRgbW0vc3dhcC5oYCBpbiB0aGlzIGNhc2UuIEkgd2FudCB0byBxdWlja2x5IHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb3JlIGRlZmluZXMgaW52b2x2ZWQuIEkmIzM5O20gbG9va2luZyBmb3IgdGhlIGZvdW5kYXRpb25hbCBidWlsZGluZyBibG9ja3M6IHRoZSBgc3dhcF9lbnRyeV90YCBwZXJoYXBzLCBhbnkgcmVsZXZhbnQgcGFnZSBmbGFncywgYW5kIHBvdGVudGlhbGx5IHRoZSBpbnRlcmZhY2VzIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBzd2FwIHNwYWNlIGl0c2VsZi4gQXJlIHRoZXJlIGFueSBuZXcgQVBJcyBpbnRyb2R1Y2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgSSByZWFsbHkgZGlzc2VjdGVkIHRoaXMgY29kZT8gQW55IHJlY2VudCBjaGFuZ2VzIGluIGhvdyBzd2FwIGVudHJpZXMgYXJlIG1hbmFnZWQsIG9yIGhvdyB0aGUgYmFja2luZyBzdG9yZSBpcyBkZWZpbmVkPyBJIG5lZWQgYSBjbGVhciBtZW50YWwgbW9kZWwgb2YgdGhlIGtleSBhYnN0cmFjdGlvbnMgYmVmb3JlIEkgZGVsdmUgZGVlcGVyIGludG8gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIExldCYjMzk7cyBzZWUgd2hhdCBgbW0vc3dhcC5oYCByZXZlYWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL3N3YXAuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zd2FwLmg9MzQyPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcC5oLTM0My1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XG5tbS9zd2FwLmg6MzQ0OnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zNDUtXHRcdFx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpO1xuLS1cbm1tL3N3YXAuaD00NzY9c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwLmgtNDgwLVxubW0vc3dhcC5oOjQ4MTpzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC00ODItXHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY0MDAKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBTd2FwIENhY2hlIFJlcGxhY2VtZW50IEZvbGlvIEZ1bmN0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhpcyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGZ1bmN0aW9uLiBJIHNlZSBpdCYjMzk7cyBkZWZpbmVkIGluIGBtbS9zd2FwLmhgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdGhlIGNvcmUgbG9naWMsIHNvIEkmIzM5O20gZ29pbmcgdG8gemVybyBpbiBvbiB0aGVzZSBmdW5jdGlvbnM6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgbmF0dXJhbGx5LCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGl0c2VsZi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIHBpZWNlcyBmaXQgdG9nZXRoZXIuCgpNeSBuZXh0IHN0ZXAgaXMgdG8gc2VlIGlmIGFueSBzcGVjaWZpYyBrZXJuZWwgY29uZmlndXJhdGlvbnMgYXJlIHByZXJlcXVpc2l0ZXMuIEkmIzM5O20gbm90aW5nIHRoYXQgdGhlIGNvZGUgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHdoaWNoLCBmcm9tIG1lbW9yeSwgaXMgY29tcGlsZWQgd2hlbiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlbmFibGVkLiBJIHNob3VsZCBkb3VibGUgY2hlY2sgdGhpcyBieSByZWZlcmVuY2luZyBgbW0vTWFrZWZpbGVgIHRvIGNvbmZpcm0gdGhlIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgZW5zdXJlIEkgZnVsbHkgdW5kZXJzdGFuZCB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uIEdvdHRhIG1ha2Ugc3VyZSBJJiMzOTttIG5vdCBtaXNzaW5nIGFueXRoaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtodWdlX21lbW9yeS5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZV9kZXZpY2Uub1xubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgJiM0Mzs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2ODgyCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogNDIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQW5hbHl6aW5nIEtlcm5lbCBDb25maWd1cmF0aW9uIERlcGVuZGVuY2llcyoqCgpBbHJpZ2h0LCBzbyB0aGUgZGlzY3Vzc2lvbiBoYXMgY2xlYXJseSBlc3RhYmxpc2hlZCB0aGF0IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgbm9uLW5lZ290aWFibGUgaGVyZS4gVGhhdCYjMzk7cyBhIGdpdmVuLiBCdXQgbm93LCBJIG5lZWQgdG8gZGVsdmUgYSBiaXQgZGVlcGVyIGFuZCBsb29rIGF0IHRoZSBkZXBlbmRlbmNpZXMgbW9yZSBjb21wcmVoZW5zaXZlbHkuIE15IG5leHQgdGhvdWdodCBpcyBhcm91bmQgYG1tL3N3YXBfc3RhdGUuY2AuIEkga25vdyBpdCYjMzk7cyBjb21waWxlZCB3aGVuIGBDT05GSUdfU1dBUGAgaXMgZW5hYmxlZCwgYnV0IEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIGFuZCB3aGF0IGl0cyBwb3RlbnRpYWwgcmVsZXZhbmNlIGlzIGluIHRoaXMgc3BlY2lmaWMgc2NlbmFyaW8uIEl0JiMzOTtzIHRpbWUgdG8gZGlnIGludG8gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRyYW5zcGFyZW50IGh1Z2VwYWdlcyBhbmQgc3dhcCwgYW5kIGVuc3VyZSBub3RoaW5nIGdldHMgbWlzc2VkLiBUaGlzIGZlZWxzIGxpa2UgYSBjb3JlIHBpZWNlIEkgbmVlZCB0byBnZXQgYSBmaXJtIGdyYXNwIG9uLCB0byBiZSBzdXJlIEkgYW0gbm90IG1pc3NpbmcgYW55IGNyaXRpY2FsIHBpZWNlcyBpbiB0aGUgZGVzaWduLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzd2FwX3N0YXRlLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT03Nj1lbmRpZlxubW0vTWFrZWZpbGUtNzctXG5tbS9NYWtlZmlsZTo3ODpvYmotJChDT05GSUdfU1dBUClcdCYjNDM7PSBwYWdlX2lvLm8gc3dhcF9zdGF0ZS5vIHN3YXBmaWxlLm9cbm1tL01ha2VmaWxlLTc5LW9iai0kKENPTkZJR19aU1dBUClcdCYjNDM7PSB6c3dhcC5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3MjExCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogOTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZywgdGhpbmtpbmcgdGhyb3VnaCB0aGlzIGxpa2UgSSB3b3VsZDoKCioqRXhhbWluaW5nIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzIGZvciBGb2xpby1SZWxhdGVkIENvZGUqKgoKQWxyaWdodCwgc28gSSBzZWUgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBgU1dBUGAgYWdhaW4sIGp1c3QgbGlrZSBJIHN1c3BlY3RlZC4gR290dGEgbWFrZSBzdXJlIHRoYXQmIzM5O3MgYWNjb3VudGVkIGZvci4gSSYjMzk7bSBnb2luZyB0byBxdWlja2x5IHNjYW4gZm9yIG90aGVyIHBvdGVudGlhbCBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcyB0aGF0IHRoaXMgcGF0Y2ggbWlnaHQgdG91Y2guIFRoZSBjb2RlIHJlZmVyZW5jZXMgYGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKWAgYW5kIGBmb2xpb190ZXN0X2Fub24oZm9saW8pYC4gVGhhdCBuYXJyb3dzIGl0IGRvd24gcHJldHR5IGNsZWFybHksIGl0IGxvb2tzIGxpa2UgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBDT05GSUdfU1dBUGAgYXJlIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb25zIGluIHBsYXkgaGVyZS4gSSYjMzk7bSBjb25maWRlbnQgdGhhdCB0aGVzZSBhcmUgdGhlIHR3byBtYWluIGRyaXZlcnMgb2YgdGhlIGNoYW5nZXMuIE5vdywgbGV0JiMzOTtzIGp1c3QgZG8gYSBxdWljayBjcm9zcy1yZWZlcmVuY2UgdG8gYmUgY2VydGFpbjogSSYjMzk7bSBnb2luZyB0byBsb29rIGZvciBwbGFjZXMgd2hlcmUgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyBjYWxsZWQuIFRoYXQgc2hvdWxkIGVpdGhlciBjb25maXJtIHRoZSBkZXBlbmRlbmN5IG9yIG1heWJlIHNob3cgdXMgaWYgdGhlcmUgaXMgYW55dGhpbmcgZWxzZSB3ZSBuZWVkIHRvIGluY2x1ZGUuIEkganVzdCB3YW50IHRvIGJlIHRob3JvdWdoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MDM9aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXHRcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA1OmludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNi11bnNpZ25lZCBpbnQgbWluX29yZGVyX2Zvcl9zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQyODc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MzU1LS8qKlxubW0vaHVnZV9tZW1vcnkuYzo0MzU2OiAqIGZvbGlvX3NwbGl0X3VubWFwcGVkKCkgLSBzcGxpdCBhIGxhcmdlIGFub24gZm9saW8gdGhhdCBpcyBhbHJlYWR5IHVubWFwcGVkXG5tbS9odWdlX21lbW9yeS5jLTQzNTctICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDM3Ni0gKi9cbm1tL2h1Z2VfbWVtb3J5LmM6NDM3NzppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbm1tL2h1Z2VfbWVtb3J5LmMtNDM3OC17XG4tLVxubW0vbWlncmF0ZV9kZXZpY2UuYz05MTI9c3RhdGljIGludCBtaWdyYXRlX3ZtYV9zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgbWlncmF0ZV92bWEgKm1pZ3JhdGUsXG4tLVxubW0vbWlncmF0ZV9kZXZpY2UuYy05MjYtXHRzcGxpdF9odWdlX3BtZF9hZGRyZXNzKG1pZ3JhdGUtXHUwMDNldm1hLCBhZGRyLCB0cnVlKTtcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTI3Olx0cmV0ID0gZm9saW9fc3BsaXRfdW5tYXBwZWQoZm9saW8sIDApO1xubW0vbWlncmF0ZV9kZXZpY2UuYy05MjgtXHRpZiAocmV0KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzk3MgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDg2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNvZGUgc25pcHBldCwgZGlzdGlsbGVkIGludG8gYSBmaXJzdC1wZXJzb24gcGVyc3BlY3RpdmUsIGFzIGl0IHJlbGF0ZXMgdG8gbXkgZXhwZXJ0aXNlOgoKKipNeSBVbmRlcnN0YW5kaW5nIG9mIEZvbGlvIFNwbGl0dGluZyBGdW5jdGlvbnMqKgoKT2theSwgc28gSSBzZWUgYSBjbGVhciByZWxhdGlvbnNoaXAgZW1lcmdpbmcgYmV0d2VlbiB0aGVzZSBmb2xpbyBzcGxpdHRpbmcgZnVuY3Rpb25zLiBJdCBsb29rcyBsaWtlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgYSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhIGZvbGlvIHNwbGl0LCBpbnZva2VkIHdpdGhpbiB0aGUgYnJvYWRlciBjb250ZXh0IG9mIGRldmljZSBtaWdyYXRpb24gKGBtaWdyYXRlX3ZtYV9zcGxpdF91bm1hcHBlZF9mb2xpb2ApIGluIHRoZSBgbW0vbWlncmF0ZV9kZXZpY2UuY2AgZmlsZS4gVGhpcyB0ZWxscyBtZSB0aGlzIHNwbGl0IGlzIGZvciB1bm1hcHBlZCBmb2xpb3MgaW52b2x2ZWQgaW4gZGV2aWNlIG1pZ3JhdGlvbiwgbGlrZWx5IGVuc3VyaW5nIGRhdGEgaW50ZWdyaXR5IGFuZCBjb3JyZWN0IGhhbmRsaW5nIG9mIHBhZ2Ugb3duZXJzaGlwIGR1cmluZyB0aGUgcHJvY2VzcywgZ2l2ZW4gdGhlIG1pZ3JhdGlvbiBjb250ZXh0LgoKVGhlbiwgdGhlcmUmIzM5O3MgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGlzIG9uZSBpcyBpbnRlcmVzdGluZyBiZWNhdXNlIGl0JiMzOTtzIGNhbGxlZCBmcm9tIGEgd2lkZSBhcnJheSBvZiBwbGFjZXMuIFRoYXQgbWFrZXMgbWUgdGhpbmsgaXQmIzM5O3MgdGhlIGNvcmUsIGxvdy1sZXZlbCBmdW5jdGlvbiBmb3IgYWN0dWFsbHkgZG9pbmcgdGhlIHNwbGl0dGluZywgcG90ZW50aWFsbHkgaGFuZGxpbmcgdGhlIHBoeXNpY2FsIHBhZ2UgbWFuaXB1bGF0aW9ucyBhbmQgbGlzdCBtYW5hZ2VtZW50IGludm9sdmVkIGluIHRyYW5zZm9ybWluZyBhIGh1Z2UgcGFnZSBpbnRvIGEgc2V0IG9mIHNtYWxsZXIsIG9yZGVyZWQgZm9saW9zLiBUaGUgJiMzNDt0b19saXN0X3RvX29yZGVyJiMzNDsgcGFydCBkZWZpbml0ZWx5IGhpbnRzIGF0IGtlZXBpbmcgdHJhY2sgb2YgdGhlIHNtYWxsZXIgZm9saW9zIGluIHRoZSBjb3JyZWN0IG9yZGVyIGZvciBsYXRlciByZWFzc2VtYmx5IG9yIG90aGVyIG9wZXJhdGlvbnMsIHNvIGl0JiMzOTtzIGEgY3JpdGljYWwgcGllY2Ugb2YgdGhlIHB1enpsZS4KCkZpbmFsbHksIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhcHBlYXJzIHRvIGJlIGEgcHJlcmVxdWlzaXRlIGNoZWNrLiBJdCYjMzk7cyBjYWxsZWQgYmVmb3JlIGFueSBhY3R1YWwgc3BsaXR0aW5nIGlzIGRvbmUsIGZyb20gYm90aCB0aGUgZ2VuZXJhbCBzcGxpdHRpbmcgZnVuY3Rpb24gYF9fZm9saW9fc3BsaXRgIGFuZCBmcm9tIHRoZSBwcm9jZXNzLXNwZWNpZmljIGh1Z2UgcGFnZSBzcGxpdHRpbmcgZnVuY3Rpb24gYHNwbGl0X2h1Z2VfcGFnZXNfcGlkYC4gVGhhdCBwb2ludHMgdG8gdGhpcyBjaGVjayBiZWluZyBhYm91dCBkZXRlcm1pbmluZyBpZiBhIGZvbGlvICpjYW4qIGJlIHNwbGl0LiBUaGlzIGNvdWxkIGJlIGNoZWNraW5nIHRoaW5ncyBsaWtlIHdoZXRoZXIgaXQmIzM5O3MgbG9ja2VkLCB3aGV0aGVyIGl0JiMzOTtzIGEgdmFsaWQgY2FuZGlkYXRlIGZvciBzcGxpdHRpbmcgZ2l2ZW4gaXRzIGN1cnJlbnQgc3RhdGUsIGFuZCBwb3RlbnRpYWxseSBvdGhlciBjb25zdHJhaW50cy4gVGhlIGZhY3QgdGhhdCBpdCYjMzk7cyBjYWxsZWQgZnJvbSB0aG9zZSB0d28gZnVuY3Rpb25zIG1lYW5zIGl0IGlzIHVuaXZlcnNhbGx5IGFwcGxpY2FibGUgYW5kIGxpa2VseSBlbmZvcmNlcyBuZWNlc3NhcnkgaW52YXJpYW50cyBiZWZvcmUgYXR0ZW1wdGluZyB0byBicmVhayBhIGh1Z2UgcGFnZSBkb3duLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwNz1pbnQgc3BsaXRfZm9saW9fdG9fbGlzdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwODppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA5LVx0XHRcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jPTM4MDc9c3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzg3Mi0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg3MzogKiBmb2xpb19jaGVja19zcGxpdHRhYmxlKCkgLSBjaGVjayBpZiBhIGZvbGlvIGNhbiBiZSBzcGxpdCB0byBhIGdpdmVuIG9yZGVyXG5tbS9odWdlX21lbW9yeS5jLTM4NzQtICogQGZvbGlvOiBmb2xpbyB0byBiZSBzcGxpdFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzg3OS0gKlxubW0vaHVnZV9tZW1vcnkuYzozODgwOiAqIGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoKSBjaGVja3MgaWYgQGZvbGlvIGNhbiBiZSBzcGxpdCB0byBAbmV3X29yZGVyIHVzaW5nXG5tbS9odWdlX21lbW9yeS5jLTM4ODEtICogQHNwbGl0X3R5cGUgbWV0aG9kLiBUaGUgdHJ1bmNhdGVkIGZvbGlvIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbi0tXG5tbS9odWdlX21lbW9yeS5jLTM4ODctICovXG5tbS9odWdlX21lbW9yeS5jOjM4ODg6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbm1tL2h1Z2VfbWVtb3J5LmMtMzg4OS1cdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQyODc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MzEwLVxubW0vaHVnZV9tZW1vcnkuYzo0MzExOlx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtNDMxMi1cdGlmIChyZXQpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg5NzIKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBjb2RlIGludGVyYWN0aW9ucy4KCioqVGhpbmtpbmcgVGhyb3VnaCBGb2xpbyBTcGxpdHRpbmcqKgoKUmlnaHQsIHNvIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBnZXRzIGludm9rZWQgYnkgYF9fZm9saW9fc3BsaXRgLCB3aGljaCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBOb3cgSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoaXMgc3BsaXR0aW5nIHByb2Nlc3MuIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlc2Uga2V5IHN5bWJvbHM6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhvc2UgYXJlIHRoZSB1c3VhbCBzdXNwZWN0cy4KCkhhbmcgb24gYSBzZWNvbmTigKYgSSYjMzk7bSBqdXN0IHJlY2FsbGluZyB0aGF0IGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AmIzM5O3MgY2FsbCBncmFwaCBtaWdodCBiZSBtb3JlIGxpbWl0ZWQgdGhhbiBJIGluaXRpYWxseSB0aG91Z2h0LiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIHByaW1hcmlseSBjYWxsZWQgZnJvbSBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYC4gSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY2FsbCBzaXRlcywganVzdCB0byBiZSBzdXJlLiBJdCBwYXlzIHRvIGJlIHRob3JvdWdoIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggbWVtb3J5IG1hbmFnZW1lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9Mzk1Nz1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDA2MS1cdFx0aWYgKGNpKVxubW0vaHVnZV9tZW1vcnkuYzo0MDYyOlx0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbm1tL2h1Z2VfbWVtb3J5LmMtNDA2My1cdH1cbi0tXG5tbS9taWdyYXRlLmM9NTgzPXN0YXRpYyBpbnQgX19mb2xpb19taWdyYXRlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxubW0vbWlncmF0ZS5jLTY1Ni1cdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG5tbS9taWdyYXRlLmM6NjU3Olx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld2ZvbGlvKTtcbm1tL21pZ3JhdGUuYy02NTgtXHRlbHNlXG4tLVxubW0vc2htZW0uYz0yMDg4PXN0YXRpYyBpbnQgc2htZW1fcmVwbGFjZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIGdmcF90IGdmcCxcbi0tXG5tbS9zaG1lbS5jLTIxMjUtXHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2tfaXJxKG9sZCk7XG5tbS9zaG1lbS5jOjIxMjY6XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgb2xkLCBuZXcpO1xubW0vc2htZW0uYy0yMTI3LVx0bWVtX2Nncm91cF9yZXBsYWNlX2ZvbGlvKG9sZCwgbmV3KTtcbi0tXG5tbS9zd2FwLmg9MzQyPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcC5oLTM0My1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XG5tbS9zd2FwLmg6MzQ0OnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zNDUtXHRcdFx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpO1xuLS1cbm1tL3N3YXAuaD00NzY9c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwLmgtNDgwLVxubW0vc3dhcC5oOjQ4MTpzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC00ODItXHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbi0tXG5tbS9zd2FwX3N0YXRlLmM9MzM1PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9zd2FwX3N0YXRlLmMtMzQ3LS8qKlxubW0vc3dhcF9zdGF0ZS5jOjM0ODogKiBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyAtIFJlcGxhY2UgYSBmb2xpbyBpbiB0aGUgc3dhcCBjYWNoZS5cbm1tL3N3YXBfc3RhdGUuYy0zNDktICogQGNpOiBUaGUgbG9ja2VkIHN3YXAgY2x1c3Rlci5cbi0tXG5tbS9zd2FwX3N0YXRlLmMtMzYwLSAqL1xubW0vc3dhcF9zdGF0ZS5jOjM2MTp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwX3N0YXRlLmMtMzYyLVx0XHRcdFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDA1NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI2NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBGb2xpbyBTcGxpdHRpbmcgYW5kIFN3YXAgT3BlcmF0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCDigJMgdGhhdCYjMzk7cyBkZWZpbml0ZWx5IGEgZ2xvYmFsIHN5bWJvbCwgZXhwb3J0ZWQgZnJvbSBgbW0vc3dhcF9zdGF0ZS5jYC4gR29vZCB0byBrbm93LiBOb3csIGxldCYjMzk7cyBzZWUgd2hhdCBlbHNlIHdlIG5lZWQgdG8gY29uc2lkZXIgaW4gdGVybXMgb2YgY29uZmlndXJhdGlvbnMuCgpIbW0sIGBDT05GSUdfREVWSUNFX01JR1JBVElPTmAgaXMgdGllZCB0byBgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW9gLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmb2xpb19zcGxpdF91bm1hcHBlZGAuIEJ1dCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIHJlc2lkZXMgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCwgYW5kIHRoYXQmIzM5O3MgY29tcGlsZWQgd2l0aCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gU28sIGl0IGxvb2tzIGxpa2UgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFNXQVBgIGFyZSB0aGUgYmlnIG9uZXMgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eS4gTWFrZXMgc2Vuc2UuCgpBbHJpZ2h0LCBsZXQmIzM5O3MgcXVpY2tseSByZXZpZXcgdGhlIGludGVybmFscy4gYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAgYXJlIHN0YXRpYyBmdW5jdGlvbnMg4oCTIG5vdCB2ZXJ5IGhlbHBmdWwgYXMgZGlyZWN0IGVudHJ5IHBvaW50cyBmb3IgYW5hbHlzaXMuIEhvd2V2ZXIsIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBzZWVtcyB0byBiZSB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3Igc3BsaXR0aW5nLiBUaGVuLCB3ZSBoYXZlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYXMgYW5vdGhlciBwb3RlbnRpYWwgZW50cnkgcG9pbnQuCgpJIGxpa2UgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGFzIGEgZm9jdXMgc3ltYm9sOyB0aGF0IHNlZW1zIGxpa2UgYSBnb29kIHBsYWNlIHRvIGRpZyBpbi4gQW5kLCBhcyBhIHJlbWluZGVyLCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGlzIGFsc28gYSBzb2xpZCBvcHRpb24sIGdpdmVuIGl0cyBnbG9iYWwgbmF0dXJlLgoKSnVzdCBnb2luZyB0byBkb3VibGUtY2hlY2sgdGhvc2UgY29uZmlncyBhZ2Fpbi4uLmFsd2F5cyBhIGdvb2QgaWRlYSB0byBjb25maXJtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9ODMxPWNvbmZpZyBNTV9JRFxuLS1cbm1tL0tjb25maWctODMzLVxubW0vS2NvbmZpZzo4MzQ6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy04MzUtXHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg1Mj1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg1Ny1cbm1tL0tjb25maWc6ODU4Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NTktXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NjQtXG5tbS9LY29uZmlnOjg2NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg2Ni1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzMtXG5tbS9LY29uZmlnOjg3NDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04NzUtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg4MT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg5MC1cbm1tL0tjb25maWc6ODkxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctODkyLVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDAtXG5tbS9LY29uZmlnOjkwMTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MDItXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDgtXG5tbS9LY29uZmlnOjkwOTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkxMC1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTE2LVxubW0vS2NvbmZpZzo5MTc6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTE4LVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTI2PWNob2ljZVxuLS1cbm1tL0tjb25maWctOTM1LVxubW0vS2NvbmZpZzo5MzY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05MzctXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk0NC1cbm1tL0tjb25maWc6OTQ1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk0Ni1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1Mi1cbm1tL0tjb25maWc6OTUzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTU0LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NjAtXG5tbS9LY29uZmlnOjk2MTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NjItXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxNDE5CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCYjMzk7cyBpbnRlcm5hbCBtb25vbG9ndWU6CgoqKlF1aWNrIENvbmZpZ3VyYXRpb24gQ2hlY2sqKgoKQWxyaWdodCwgbGV0JiMzOTtzIHNlZSwgZ29pbmcgb3ZlciB0aGUgc3lzdGVtIHNldHVwLiBJIHNlZSBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGRlZmluaXRlbHkgZmxhZ2dlZCBpbiB0aGUgY29uZmlnLiBPa2F5LCB0aGF0JiMzOTtzIGV4cGVjdGVkLCBidXQgYWx3YXlzIGdvb2QgdG8gY29uZmlybS4gVGhlbiwgdGhlcmUmIzM5O3MgYFNXQVBgLCB3aGljaCBpcyBhbm90aGVyIGtleSBwYXJhbWV0ZXIuIE5lZWQgdG8gY29uc2lkZXIgaG93IHRoYXQgcGxheXMgaW50byBldmVyeXRoaW5nLiBJJiMzOTtsbCBuZWVkIHRvIGtlZXAgdGhhdCBpbiBtaW5kIHdoZW4gZXhhbWluaW5nIHRoZSBvdGhlciBzZXR0aW5ncy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFNXQVAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9OT1jb25maWcgQVJDSF9OT19TV0FQXG4tLVxubW0vS2NvbmZpZy0xMS1cbm1tL0tjb25maWc6MTI6bWVudWNvbmZpZyBTV0FQXG5tbS9LY29uZmlnLTEzLVx0Ym9vbCBcJiMzNDtTdXBwb3J0IGZvciBwYWdpbmcgb2YgYW5vbnltb3VzIG1lbW9yeSAoc3dhcClcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE2NTUKCQkJCQkJCW91dHB1dDogMTYzCgkJCQkJCQl0aG91Z2h0czogMjQxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgVGhpcyBQYXRjaCoqCgpPa2F5LCBzbyBJIHNlZSB0aGF0IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBTV0FQYCBhcmUgZGVmaW5pdGVseSByZWxldmFudCBoZXJlOyB0aG9zZSBhcmUgdGhlIGtleSBjb25maWd1cmF0aW9uIGZsYWdzIHdlIG5lZWQgdG8ga2VlcCBpbiBtaW5kLiBMZXQmIzM5O3MgYnJlYWsgZG93biB0aGUgY3JpdGljYWwgc3ltYm9scyB0aGF0IGp1bXAgb3V0IHRvIG1lOiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRob3NlIGFyZSB0ZWxsaW5nLgoKVGhlIGNoYW5nZXMgYXJlLCB3aXRob3V0IGEgZG91YnQsIGZ1bmN0aW9uYWwgYW5kIGRyaWxsaW5nIGRvd24gaW50byB0aGUgaGVhcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQuIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBUaGUgZmFjdCB0aGF0IHVzZXJzcGFjZSBjYW4gdHJpZ2dlciB0aGVzZSBjaGFuZ2VzIHRocm91Z2ggYG1hZHZpc2VgLCBgbWJpbmRgLCBvciBldmVuIGp1c3QgcGxhaW4gb2xkIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBzd2FwcGluZyBzZWFscyB0aGUgZGVhbC4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgYSBzdWJzdGFudGlhbCBhdHRhY2sgc3VyZmFjZS4KClRoaXMgcGF0Y2ggcmVmYWN0b3JzIHRoZSBzcGxpdHRpbmcgb2YgZm9saW9zLCBlc3BlY2lhbGx5IGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSSYjMzk7bSBzZWVpbmcgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgbmV3IGZ1bmN0aW9ucyBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCBhbmQgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlYCwgd2hpY2ggdGVsbHMgbWUgaXQmIzM5O3MgaGFuZGxpbmcgdGhlIHNwbGl0dGluZyBwcm9jZXNzIGRpcmVjdGx5LCBhbmQgY2hhbmdlcyB0byB0aGUgY29uZGl0aW9ucyBpbiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAuIFRoZSBmYWN0IHRoYXQgdGhlc2UgYXJlIHRvdWNoaW5nIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHdpdGggVEhQIGFuZCBzd2FwIG1ha2VzIHRoaXMgY3JpdGljYWwuIEdpdmVuIHRoZSB1c2Vyc3BhY2UgcmVhY2gsIGZ1enppbmcgdGhpcyBpcyBhYnNvbHV0ZWx5IGp1c3RpZmllZC4gSXQmIzM5O3MgYSBjbGVhciBjYW5kaWRhdGUgZm9yIGBXb3J0aEZ1enppbmc9dHJ1ZWAuCgpUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O2ZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBtb2RpZmllcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHBhcnRpY3VsYXJseSBmb3IgYW5vbnltb3VzIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIHNwbGl0dGluZyBhbmQgbW9kaWZpZXMgY29uZGl0aW9ucyBpbiBmb2xpb19jaGVja19zcGxpdHRhYmxlLiBUaGVzZSBhcmUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIGFmZmVjdGluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGFuZCBzd2FwLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChzcGVjaWZpY2FsbHkgYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYCksIGludHJvZHVjaW5nIHNlcGFyYXRlIHBhdGhzIGZvciBhbm9ueW1vdXMvc3dhcGNhY2hlIGZvbGlvcyBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBUaGUgY2hhbmdlcyBpbnZvbHZlIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBMUlUgbGlzdCBtYW5hZ2VtZW50LCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHVwZGF0ZXMuXG5cblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEF1ZyAxMiAyMDoxNDoyMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jCmluZGV4IGNlZDQwMGY3MmQ0M2EuLjFjNjFiN2QzOWNkMDMgMTAwNjQ0Ci0tLSBhL21tL2h1Z2VfbWVtb3J5LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vaHVnZV9tZW1vcnkuYwpAQCAtMzU4OSw5ICYjNDM7MzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKQogewogCWludCBpID0gMDsKIAotCS8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovCi0JaWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKQotCQlyZXR1cm47CiAJZm9yICg7OykgewogCQlyZW1vdmVfbWlncmF0aW9uX3B0ZXMoZm9saW8sIGZvbGlvLCBUVFVfUk1BUF9MT0NLRUQgfCBmbGFncyk7CiAJCWkgJiM0Mzs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKQEAgLTM2MzQsNiAmIzQzOzM2MzEsMTggQEAgc3RhdGljIGJvb2wgcGFnZV9yYW5nZV9oYXNfaHdwb2lzb25lZChzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9uZyBucl9wYWdlcykKIAlyZXR1cm4gZmFsc2U7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBmb3JfZWFjaF9mb2xpb19zYWZlIC0gaXRlcmF0ZSBvdmVyIGNvbnRpZ3VvdXMgZm9saW9zIHNhZmUgYWdhaW5zdCBmb2xpbyBmcmVlCiYjNDM7ICogQHN0YXJ0OiB0aGUgZmlyc3QgZm9saW8gdG8gaXRlcmF0ZQomIzQzOyAqIEBlbmQ6IHNlbnRpbmVsLCBmb2xpb19uZXh0KCkgb2YgdGhlIGxhc3QgZm9saW8gdG8gaXRlcmF0ZQomIzQzOyAqIEBzdWJfZm9saW86IHN0cnVjdCBmb2xpbyAqIHRvIHVzZSBhcyB0aGUgbG9vcCBjdXJzb3IKJiM0MzsgKiBAbmV4dDogc3RydWN0IGZvbGlvICogdXNlZCBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQomIzQzOyAqLwomIzQzOyNkZWZpbmUgZm9yX2VhY2hfZm9saW9fc2FmZShzdGFydCwgZW5kLCBzdWJfZm9saW8sIG5leHQpIFwKJiM0MzsJZm9yIChzdWJfZm9saW8gPSAoc3RhcnQpLCBuZXh0ID0gZm9saW9fbmV4dChzdWJfZm9saW8pOyBcCiYjNDM7CSAgICAgc3ViX2ZvbGlvICE9IChlbmQpOyBcCiYjNDM7CSAgICAgc3ViX2ZvbGlvID0gbmV4dCwgbmV4dCA9IGZvbGlvX25leHQobmV4dCkpCiYjNDM7CiAvKgogICogSXQgc3BsaXRzIEBmb2xpbyBpbnRvIEBuZXdfb3JkZXIgZm9saW9zIGFuZCBjb3BpZXMgdGhlIEBmb2xpbyBtZXRhZGF0YSB0bwogICogYWxsIHRoZSByZXN1bHRpbmcgZm9saW9zLgpAQCAtMzc1NSw4ICYjNDM7Mzc2NCw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlciwKIH0KIAogLyoqCi0gKiBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgLSBzcGxpdHMgYW4gdW5tYXBwZWQgQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvcyBpbgotICogdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuCiYjNDM7ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zCiYjNDM7ICogaW4gdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuCiAgKiBAZm9saW86IHRoZSB0by1iZS1zcGxpdCBmb2xpbwogICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5CiAgKiAgICAgICAgICAgICBhbGxvY2F0b3IgbGlrZSBzcGxpdCBnZW5lcmF0ZXMgZm9saW9zIHdpdGggb3JkZXJzIGZyb20gQGZvbGlvJiMzOTtzCkBAIC0zNzk1LDExICYjNDM7MzgwNCwxMiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCAmbHQ7MCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlCiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spCiAgKi8KLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAomIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKIAkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewogCWNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CWNvbnN0IGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJaW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxOwogCXN0cnVjdCBmb2xpbyAqb2xkX2ZvbGlvID0gZm9saW87CkBAIC0zODE0LDggJiM0MzszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsCiAJICAgICBzcGxpdF9vcmRlci0tKSB7CiAJCWludCBucl9uZXdfZm9saW9zID0gMVVMICZsdDsmbHQ7IChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7CiAKLQkJLyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqLwotCQlpZiAoaXNfYW5vbiAmYW1wOyZhbXA7IHNwbGl0X29yZGVyID09IDEpCiYjNDM7CQkvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqLwomIzQzOwkJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQogCQkJY29udGludWU7CiAKIAkJaWYgKG1hcHBpbmcpIHsKQEAgLTM4NzgsMzIgJiM0MzszODg4LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJCSAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKJiM0MzsKIAlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAkvKgogCSAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlCi0JICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4KLQkgKgotCSAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZQotCSAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLgomIzQzOwkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8KJiM0MzsJICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuCiAJICovCi0JaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQomIzQzOwlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWlzX3N3YXBjYWNoZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi8KLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qCi0JICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMAotCSAqCi0JICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbQotCSAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnkKLQkgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkCi0JICogaGVyZS4KJiM0MzsJICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZQomIzQzOwkgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gJmFtcDsgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdAomIzQzOwkgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGQKJiM0MzsJICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LgogCSAqLwotCWlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgJmFtcDsmYW1wOyBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKJiM0MzsJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJaWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzkxMSwzOSAmIzQzOzM5MTUsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAlpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKQogCQlyZXR1cm4gLUVCVVNZOwogCiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhCiYjNDM7CSAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0JiMzOTtzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvcgomIzQzOwkgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW0KJiM0MzsJICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkCiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGUKJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXQKJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIKJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG8KJiM0MzsgKiAgICAgICAgICB0aGUgTFJVIGxpc3QKJiM0MzsgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzCiYjNDM7ICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlcwomIzQzOyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLAomIzQzOwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7NDAxNCwyNTIgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLAomIzQzOwkJCQkgICBOVUxMLCBzcGxpdF90eXBlKTsKIAotCQkvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi8KJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIHBvc3Qtc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzCiYjNDM7CSAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnQKJiM0MzsJICogc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvIGZvciBhIHN1YgomIzQzOwkgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLgomIzQzOwkgKi8KJiM0MzsJZm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHsKJiM0MzsJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiAJCWlmIChkb19scnUpCi0JCQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkJaWYgKGNpKQomIzQzOwkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJfQogCi0JCXJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcywKLQkJCQkJICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7CiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiAKLQkJLyoKLQkJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAotCQkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGUKLQkJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCi0JCSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKLQkJICogQGZvbGlvLgotCQkgKi8KLQkJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKLQkJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7Ci0JCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTsKJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJaWYgKGNpKQomIzQzOwkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7CiYjNDM7b3V0X25vX3NwbGl0OgomIzQzOwlsb2NhbF9pcnFfZW5hYmxlKCk7CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwomIzQzOwkJcHV0X2Fub25fdm1hKGFub25fdm1hKTsKJiM0MzsJfQogCi0JCQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KIAotCQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZAomIzQzOyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlCiYjNDM7ICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpCiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0CiYjNDM7ICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzCiYjNDM7ICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdAomIzQzOyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTQomIzQzOyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiYjNDM7CQkJCQkgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwomIzQzOwlYQV9TVEFURSh4YXMsICZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgZm9saW8tJmd0O2luZGV4KTsKJiM0MzsJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKJiM0MzsJbG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZzsKJiM0MzsJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwomIzQzOwlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGludCBtaW5fb3JkZXI7CiYjNDM7CXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKJiM0MzsJcGdvZmZfdCBlbmQgPSAwOwomIzQzOwlnZnBfdCBnZnA7CiYjNDM7CWludCByZXQgPSAwOwogCi0JCQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAotCQkJCQkgICBmb2xpb19jYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7CiYjNDM7CWlmIChuZXdfb3JkZXIgJmx0OyBtaW5fb3JkZXIpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKGRvX2xydSkKLQkJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CS8qCiYjNDM7CSAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kCiYjNDM7CSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KJiM0MzsJICovCiYjNDM7CW1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7CiYjNDM7CW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwogCi0JCQkvKgotCQkJICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS4KLQkJCSAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0JCQkgKi8KLQkJCWlmIChjaSkgewotCQkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKLQkJCQljb250aW51ZTsKLQkJCX0KJiM0MzsJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7IEdGUF9SRUNMQUlNX01BU0spOwomIzQzOwlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewomIzQzOwkJcmV0ID0gLUVCVVNZOwomIzQzOwkJZ290byBmYWlsX2ZyZWU7CiYjNDM7CX0KIAotCQkJLyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqLwotCQkJaWYgKCFtYXBwaW5nKQotCQkJCWNvbnRpbnVlOwomIzQzOwltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwogCi0JCQkvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi8KLQkJCWlmIChuZXdfZm9saW8tJmd0O2luZGV4ICZsdDsgZW5kKSB7Ci0JCQkJX194YV9zdG9yZSgmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIG5ld19mb2xpby0mZ3Q7aW5kZXgsCi0JCQkJCSAgIG5ld19mb2xpbywgMCk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewomIzQzOwkJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAotCQkJVk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTsKLQkJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KLQkJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpICZhbXA7JmFtcDsgbnJfc2htZW1fZHJvcHBlZCkKLQkJCQkqbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7Ci0JCQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCi0JCQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKAotCQkJCQluZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKLQkJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKLQkJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwomIzQzOwkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwomIzQzOwkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwomIzQzOwkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKJiM0MzsJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwomIzQzOwkJCWdvdG8gZmFpbF9mcmVlOwogCQl9CiYjNDM7CX0KIAotCQl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKLQkJLyoKLQkJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKLQkJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgotCQkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwotCQkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICovCi0JCWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKIAotCQlpZiAoZG9fbHJ1KQotCQkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwkvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi8KJiM0MzsJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWxfbW1hcF91bmxvY2s7CiYjNDM7CX0KIAotCQlpZiAoY2kpCi0JCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKLQl9IGVsc2UgewotCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJLyoKJiM0MzsJICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmQKJiM0MzsJICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmUKJiM0MzsJICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLgomIzQzOwkgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCwKJiM0MzsJICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy4KJiM0MzsJICovCiYjNDM7CWVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLSZndDtob3N0KSwgUEFHRV9TSVpFKTsKJiM0MzsJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQllbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy0mZ3Q7aG9zdCwgZW5kKTsKJiM0MzsKJiM0MzsJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwl4YXNfbG9ja19pcnEoJmFtcDt4YXMpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgomIzQzOwkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KJiM0MzsJICovCiYjNDM7CWlmICh4YXNfbG9hZCgmYW1wO3hhcykgIT0gZm9saW8pIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgJiM0MzsgMSkpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciAmbHQ7IEhQQUdFX1BNRF9PUkRFUikgewomIzQzOwkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsJcmV0ID0gX19zcGxpdF9mcm96ZW5fZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsICZhbXA7eGFzLAomIzQzOwkJCQkgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGUKJiM0MzsJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCiYjNDM7CSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCiYjNDM7CSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKJiM0MzsJICogQGZvbGlvLgomIzQzOwkgKi8KJiM0MzsJZm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pOwomIzQzOwomIzQzOwkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKJiM0MzsJCQkJICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsKJiM0MzsJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKJiM0MzsKJiM0MzsJCS8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqLwomIzQzOwkJaWYgKG5ld19mb2xpby0mZ3Q7aW5kZXggJmx0OyBlbmQpIHsKJiM0MzsJCQlfX3hhX3N0b3JlKCZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgbmV3X2ZvbGlvLSZndDtpbmRleCwKJiM0MzsJCQkJICAgbmV3X2ZvbGlvLCAwKTsKJiM0MzsJCQljb250aW51ZTsKIAkJfQotCQlyZXR1cm4gLUVBR0FJTjsKJiM0MzsKJiM0MzsJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KJiM0MzsJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJCW5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwomIzQzOwkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2FjY291bnRfY2xlYW5lZChuZXdfZm9saW8sCiYjNDM7CQkJCQkgICAgICBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7CiYjNDM7CQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7CiYjNDM7CQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKIAl9CiAKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKJiM0MzsJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgomIzQzOwkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwomIzQzOwkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KJiM0MzsJICovCiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpOwomIzQzOwlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7ZmFpbDoKJiM0MzsJLyoKJiM0MzsJICogSWYgd2Ugd2FudCB0byB1c2UgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlIGluIHVubWFwX2ZvbGlvLAomIzQzOwkgKiByZW1lbWJlciB0byBhZGQgcmVtYXBfcGFnZSgpIGFuZCBhZGFwdCBpdC4KJiM0MzsJICovCiYjNDM7CXhhc191bmxvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MztmYWlsX21tYXBfdW5sb2NrOgomIzQzOwlpZiAobnJfc2htZW1fZHJvcHBlZCkKJiM0MzsJCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5cwomIzQzOwkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlCiYjNDM7CSAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IKJiM0MzsJICogdGhlIG1hcHBpbmcuCiYjNDM7CSAqLwomIzQzOwlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiYjNDM7ZmFpbF9mcmVlOgomIzQzOwkvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqLwomIzQzOwlzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7CiYjNDM7CW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKJiM0MzsJeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQwODYsOSAmIzQzOzQyNzIsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbgogICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAogICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KQogICoKLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LgomIzQzOyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC4KICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZAotICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpLgomIzQzOyAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZAogICogYW5kIG90aGVycyBhcmUgdW5sb2NrZWQ6CkBAIC00MTAyLDE3ICYjNDM7NDI4OCwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCwKIAkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7Ci0JWEFfU1RBVEUoeGFzLCAmYW1wO2ZvbGlvLSZndDttYXBwaW5nLSZndDtpX3BhZ2VzLCBmb2xpby0mZ3Q7aW5kZXgpOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwogCWJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDsKLQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDsKIAlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDsKLQlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7Ci0JZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDsKLQlwZ29mZl90IGVuZCA9IDA7CiAJaW50IHJldDsKIAogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7CkBAIC00MTIwLDE0MSAmIzQzOzQzMDAsMjkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAKIAlpZiAoZm9saW8gIT0gcGFnZV9mb2xpbyhzcGxpdF9hdCkgfHwgZm9saW8gIT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkgewogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9ub19tZW1jZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAogCWlmIChuZXdfb3JkZXIgJmd0Oz0gb2xkX29yZGVyKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJcmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTsKIAlpZiAocmV0KSB7CiAJCVZNX1dBUk5fT05DRShyZXQgPT0gLUVJTlZBTCwgJiMzNDtUcmllZCB0byBzcGxpdCBhbiB1bnNwbGl0dGFibGUgZm9saW8mIzM0Oyk7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwotCX0KLQotCS8qCi0JICogc3dpdGNoIHRvIGZvbGlvJiMzOTtzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmQKLQkgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuCi0JICovCi0JbWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTsKLQlvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTsKLQotCWlmIChpc19hbm9uKSB7Ci0JCS8qCi0JCSAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZAotCQkgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhCi0JCSAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXMKLQkJICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrCi0JCSAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlCi0JCSAqIG9wZXJhdGlvbnMuCi0JCSAqLwotCQlhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7Ci0JCWlmICghYW5vbl92bWEpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpOwotCQltYXBwaW5nID0gTlVMTDsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgbWluX29yZGVyOwotCQlnZnBfdCBnZnA7Ci0KLQkJbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwotCQltaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTsKLQkJaWYgKG5ld19vcmRlciAmbHQ7IG1pbl9vcmRlcikgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7Ci0JCQkJCQkJR0ZQX1JFQ0xBSU1fTUFTSyk7Ci0KLQkJaWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJbWFwcGluZ19zZXRfdXBkYXRlKCZhbXA7eGFzLCBtYXBwaW5nKTsKLQotCQlpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHsKLQkJCXhhc19zZXRfb3JkZXIoJmFtcDt4YXMsIGZvbGlvLSZndDtpbmRleCwgbmV3X29yZGVyKTsKLQkJCXhhc19zcGxpdF9hbGxvYygmYW1wO3hhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTsKLQkJCWlmICh4YXNfZXJyb3IoJmFtcDt4YXMpKSB7Ci0JCQkJcmV0ID0geGFzX2Vycm9yKCZhbXA7eGFzKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCi0JCWFub25fdm1hID0gTlVMTDsKLQkJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKLQotCQkvKgotCQkgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmQKLQkJICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmUKLQkJICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLgotCQkgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCwKLQkJICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy4KLQkJICovCi0JCWVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLSZndDtob3N0KSwgUEFHRV9TSVpFKTsKLQkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCi0JCQllbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy0mZ3Q7aG9zdCwgZW5kKTsKLQl9Ci0KLQkvKgotCSAqIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSB3aWxsCi0JICogc3BsaXQgUE1EcwotCSAqLwotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQl1bm1hcF9mb2xpbyhmb2xpbyk7Ci0KLQkvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqLwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JaWYgKG1hcHBpbmcpIHsKLQkJLyoKLQkJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KLQkJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCi0JCSAqLwotCQl4YXNfbG9jaygmYW1wO3hhcyk7Ci0JCXhhc19yZXNldCgmYW1wO3hhcyk7Ci0JCWlmICh4YXNfbG9hZCgmYW1wO3hhcykgIT0gZm9saW8pIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KJiM0MzsJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgJmFtcDt4YXMsIG1hcHBpbmcsCi0JCQkJCQl0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsICZhbXA7bnJfc2htZW1fZHJvcHBlZCk7Ci1mYWlsOgotCWlmIChtYXBwaW5nKQotCQl4YXNfdW5sb2NrKCZhbXA7eGFzKTsKLQotCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCWlmIChucl9zaG1lbV9kcm9wcGVkKQotCQlzaG1lbV91bmNoYXJnZShtYXBwaW5nLSZndDtob3N0LCBucl9zaG1lbV9kcm9wcGVkKTsKLQotCWlmICghcmV0ICZhbXA7JmFtcDsgaXNfYW5vbiAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCi0JCXR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFOwotCi0JcmVtYXBfcGFnZShmb2xpbywgMSAmbHQ7Jmx0OyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7Ci0KLQkvKgotCSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCi0JICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlIHVudGlsIHRoZSBsb29wIGJlbG93LCBzbwotCSAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heQotCSAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlCi0JICogY2FjaGUuIE5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IgdGhlIG1hcHBpbmcuCi0JICovCi0JaWYgKG1hcHBpbmcpIHsKLQkJaV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpOwotCQltYXBwaW5nID0gTlVMTDsKLQl9CiYjNDM7CWlmIChpc19hbm9uKQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSAgICAgdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiYjNDM7CWVsc2UgaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCXJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSwKJiM0MzsJCQkJCQkgICAgIGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsCiYjNDM7CQkJCQkJCSAgbGlzdCwgc3BsaXRfdHlwZSk7CiAKIAkvKgogCSAqIFVubG9jayBhbGwgYWZ0ZXItc3BsaXQgZm9saW9zIGV4Y2VwdCB0aGUgb25lIGNvbnRhaW5pbmcKQEAgLTQyNjUsMjkgJiM0Mzs0MzMzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpCiAJCQljb250aW51ZTsKIAotCQlmb2xpb191bmxvY2sobmV3X2ZvbGlvKTsKIAkJLyoKIAkJICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkCiAJCSAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZQotCQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiYjNDM7CQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbAogCQkgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLgogCQkgKi8KLQkJZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pOwomIzQzOwkJaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCQlmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fcHV0KG5ld19mb2xpbyk7CiAJfQogCi1vdXRfdW5sb2NrOgotCWlmIChhbm9uX3ZtYSkgewotCQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwotCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOwotCX0KLQlpZiAobWFwcGluZykKLQkJaV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpOwogb3V0OgotCS8qIHJlc3RvcmUgdG8gY2FsbGVyJiMzOTtzIG9sZF9tZW1jZyAqLwotCXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKLQltZW1fY2dyb3VwX3B1dChtZW1jZyk7Ci1vdXRfbm9fbWVtY2c6Ci0JeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCWlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSkKIAkJY291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTsKIAljb3VudF9tdGhwX3N0YXQob2xkX29yZGVyLCAhcmV0ID8gTVRIUF9TVEFUX1NQTElUIDogTVRIUF9TVEFUX1NQTElUX0ZBSUxFRCk7CkBAIC00MzExLDI5ICYjNDM7NDM2OSwyMCBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKQogICoKICAqIFVwb24gcmV0dXJuLCB0aGUgZm9saW8gaXMgbm90IHJlbWFwcGVkLCBzcGxpdCBmb2xpb3MgYXJlIG5vdCBhZGRlZCB0byBMUlUsCi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC4KJiM0MzsgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLgogICoKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0bwogICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLgogICovCiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcikKIHsKLQlpbnQgcmV0ID0gMDsKLQogCVZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7CiAKLQlpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCAmYW1wO2ZvbGlvLSZndDtwYWdlLCBOVUxMLAotCQkJCQkJTlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSwKLQkJCQkJCTAsIE5VTEwpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIGZhbHNlLAomIzQzOwkJCQkJICAgICAgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSk7CiB9CiAKIC8qCkBAIC00MzUyLDEwICYjNDM7NDQwMSw5IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogICogICAgR1VQIHBpbnMsIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xpbyBub3QgZ2V0dGluZyBzcGxpdDsgaW5zdGVhZCwgdGhlIGNhbGxlcgogICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uCiAgKgotICogNCkgQG5ld19vcmRlciAmZ3Q7IDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90Ci0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tJmd0O19kZWZlcnJlZF9saXN0LCB3aGljaAotICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTEKLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsCiYjNDM7ICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yCiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkKJiM0MzsgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsCiAgKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJiMzOTtzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLApAQCAtNDM4NCw3ICYjNDM7NDQzMiw3IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLgogICovCiBpbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwogCmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmMKaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtMzg4LDggJiM0MzszODgsOSBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAJICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkgewogCQljaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLSZndDtzd2FwKTsKIAkJY2lfZW5kID0gY2lfb2ZmICYjNDM7IGZvbGlvX25yX3BhZ2VzKG9sZCk7Ci0JCXdoaWxlIChjaV9vZmYmIzQzOyYjNDM7ICZsdDsgY2lfZW5kKQomIzQzOwkJZG8gewogCQkJV0FSTl9PTl9PTkNFKHN3cF90Yl90b19mb2xpbyhfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSAhPSBvbGQpOwomIzQzOwkJfSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiAmbHQ7IGNpX2VuZCk7CiAJfQogfQogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjg3OAoJCQkJCQkJb3V0cHV0OiAyMTAKCQkJCQkJCXRob3VnaHRzOiA1NjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudDogS01TQU4gTm90IE5lZWRlZCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBmb2xpbyBzcGxpdHRpbmcsIGluIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AuIEl0JiMzOTtzIHJlZmFjdG9yaW5nIHRoZSBleGlzdGluZyBjb2RlLCBzcGxpdHRpbmcgdGhpbmdzIGludG8gZnVuY3Rpb25zIGxpa2UgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIHZhcmlhbnRzLCBkZWFsaW5nIHdpdGggYW5vbiwgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBJdCYjMzk7cyBlc3NlbnRpYWxseSBhYm91dCBob3cgd2UgaGFuZGxlIHNwbGl0dGluZyBmb2xpb3MgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgoKVGhlIGtleSB0aGluZyBJIG5lZWQgdG8gY2hlY2sgaXMgaWYgdGhpcyBpbnRyb2R1Y2VzICphbnkqIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgZXhwb3NlZC4gVGhhdCYjMzk7cyB3aGF0IEtNU0FOIGlzIGZvciwgYWZ0ZXIgYWxsLiBGcm9tIHdoYXQgSSBzZWUsIGl0IGRvZXNuJiMzOTt0LiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBzZW50IHVwIHRvIHVzZXIgc3BhY2UsIHdoaWNoIGlzIGEgY29tbW9uIGFyZWEgZm9yIGxlYWtzLiBObyBuZXcgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBoYXBwZW5pbmcgdGhhdCAqYXJlbiYjMzk7dCogaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gVGhlIGNvZGUgdXNlcyBgZm9saW9fcmVmX2ZyZWV6ZWAsIGB1bm1hcF9mb2xpb2AsIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AsIGFuZCBzbyBvbi4gVGhlc2UgYXJlIGFsbCB3ZWxsLWVzdGFibGlzaGVkIGZ1bmN0aW9ucy4KCkkmIzM5O20gZm9jdXNpbmcgc3BlY2lmaWNhbGx5IG9uIHVuaW5pdGlhbGl6ZWQgcmVhZHMuIElzIHRoZXJlIGEgc2NlbmFyaW8gd2hlcmUgdGhpcyBwYXRjaCAqY291bGQqIGxlYWQgdG8gYSBrZXJuZWwgdmFyaWFibGUgYmVpbmcgcmVhZCBiZWZvcmUgaXQmIzM5O3MgYmVlbiBhc3NpZ25lZCBhIHZhbHVlLCBwb3RlbnRpYWxseSBsZWFraW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiwgb3IgY3JlYXRpbmcgYSBjb250cm9sIGZsb3cgdnVsbmVyYWJpbGl0eT8gTm8uIFRoZSBwYXRjaCBsb29rcyBzYWZlIGluIHRoaXMgcmVzcGVjdC4gSXQgb25seSBtb2RpZmllcyBleGlzdGluZyBtZW1vcnkgbWFuYWdlbWVudCBzdHJ1Y3R1cmVzIGFuZCBsb2dpYywgaXQgZG9lcyBub3QgY3JlYXRlIGFueSBuZXcgY29kZSBwYXRocyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MgaXMgcG9zc2libGUuCgpUaGVyZWZvcmUsIHRoZSBwb3RlbnRpYWwgYnVncyB3b3VsZCBiZSBjbGFzc2ljIG1lbW9yeSBjb3JydXB0aW9uIGJ1Z3M6IHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZXMsIG1lbW9yeSBsZWFrcywgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyAoYmVjYXVzZSBvZiBpbmNvcnJlY3QgcGFnZSBjb3VudHMpLCBvciBldmVuIGRlYWRsb2Nrcy4gQnV0IGFsbCBvZiB0aGVzZSBhcmUgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgdGhlIHVzdWFsIGtlcm5lbCBtZW1vcnkgYnVnIGRldGVjdG9ycy4gS01TQU4gaXMgZm9yIGEgZGlmZmVyZW50IGNsYXNzIG9mIHByb2JsZW0sIHdoaWNoIGlzbiYjMzk7dCBwcmVzZW50IGhlcmUuCgpTbywgSSYjMzk7bSBjb25maWRlbnQgaW4gc2F5aW5nIHRoYXQgYE5lZWRzS01TQU5gIHNob3VsZCBiZSBmYWxzZSBmb3IgdGhpcyBwYXRjaC4gSSBzZWUgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxuXG5UaGVzZSBtb2RpZmljYXRpb25zIGRvIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRoYXQgaXMgc3Vic2VxdWVudGx5IHJlYWQgb3IgdXNlZCBpbiBjb250cm9sIGZsb3cuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCB3b3VsZCBsaWtlbHkgbWFuaWZlc3QgYXMgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBsb2NraW5nIGlzc3VlcyAoZGVhZGxvY2tzL3JhY2UgY29uZGl0aW9ucykuIFN1Y2ggYnVncyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxuXG5UaGVzZSBtb2RpZmljYXRpb25zIGRvIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRoYXQgaXMgc3Vic2VxdWVudGx5IHJlYWQgb3IgdXNlZCBpbiBjb250cm9sIGZsb3cuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCB3b3VsZCBsaWtlbHkgbWFuaWZlc3QgYXMgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBsb2NraW5nIGlzc3VlcyAoZGVhZGxvY2tzL3JhY2UgY29uZGl0aW9ucykuIFN1Y2ggYnVncyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDoyMy4zMjU4NTYzMzhaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4ODkzOTM0NjMwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxcblxcblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBtb2RpZmllcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHBhcnRpY3VsYXJseSBmb3IgYW5vbnltb3VzIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIHNwbGl0dGluZyBhbmQgbW9kaWZpZXMgY29uZGl0aW9ucyBpbiBmb2xpb19jaGVja19zcGxpdHRhYmxlLiBUaGVzZSBhcmUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIGFmZmVjdGluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGFuZCBzd2FwLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDoyMy4zMjU4NjA5NThaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUzNjQ0OTEyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBBdWcgMTIgMjA6MTQ6MjIgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi4xYzYxYjdkMzljZDAzIDEwMDY0NFxcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXFxuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxcbiB7XFxuIFxcdGludCBpID0gMDtcXG4gXFxuLVxcdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXFxuLVxcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4tXFx0XFx0cmV0dXJuO1xcbiBcXHRmb3IgKDs7KSB7XFxuIFxcdFxcdHJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTtcXG4gXFx0XFx0aSArPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuQEAgLTM2MzQsNiArMzYzMSwxOCBAQCBzdGF0aWMgYm9vbCBwYWdlX3JhbmdlX2hhc19od3BvaXNvbmVkKHN0cnVjdCBwYWdlICpwYWdlLCBsb25nIG5yX3BhZ2VzKVxcbiBcXHRyZXR1cm4gZmFsc2U7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBmb3JfZWFjaF9mb2xpb19zYWZlIC0gaXRlcmF0ZSBvdmVyIGNvbnRpZ3VvdXMgZm9saW9zIHNhZmUgYWdhaW5zdCBmb2xpbyBmcmVlXFxuKyAqIEBzdGFydDogdGhlIGZpcnN0IGZvbGlvIHRvIGl0ZXJhdGVcXG4rICogQGVuZDogc2VudGluZWwsIGZvbGlvX25leHQoKSBvZiB0aGUgbGFzdCBmb2xpbyB0byBpdGVyYXRlXFxuKyAqIEBzdWJfZm9saW86IHN0cnVjdCBmb2xpbyAqIHRvIHVzZSBhcyB0aGUgbG9vcCBjdXJzb3JcXG4rICogQG5leHQ6IHN0cnVjdCBmb2xpbyAqIHVzZWQgYXMgdGVtcG9yYXJ5IHN0b3JhZ2VcXG4rICovXFxuKyNkZWZpbmUgZm9yX2VhY2hfZm9saW9fc2FmZShzdGFydCwgZW5kLCBzdWJfZm9saW8sIG5leHQpIFxcXFxcXG4rXFx0Zm9yIChzdWJfZm9saW8gPSAoc3RhcnQpLCBuZXh0ID0gZm9saW9fbmV4dChzdWJfZm9saW8pOyBcXFxcXFxuK1xcdCAgICAgc3ViX2ZvbGlvICE9IChlbmQpOyBcXFxcXFxuK1xcdCAgICAgc3ViX2ZvbGlvID0gbmV4dCwgbmV4dCA9IGZvbGlvX25leHQobmV4dCkpXFxuK1xcbiAvKlxcbiAgKiBJdCBzcGxpdHMgQGZvbGlvIGludG8gQG5ld19vcmRlciBmb2xpb3MgYW5kIGNvcGllcyB0aGUgQGZvbGlvIG1ldGFkYXRhIHRvXFxuICAqIGFsbCB0aGUgcmVzdWx0aW5nIGZvbGlvcy5cXG5AQCAtMzc1NSw4ICszNzY0LDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxcbiB9XFxuIFxcbiAvKipcXG4tICogX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIC0gc3BsaXRzIGFuIHVubWFwcGVkIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MgaW5cXG4tICogdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuXFxuKyAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgLSBzcGxpdHMgYSBmcm96ZW4gQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvc1xcbisgKiBpbiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cXG4gICogQGZvbGlvOiB0aGUgdG8tYmUtc3BsaXQgZm9saW9cXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XFxuICAqICAgICAgICAgICAgIGFsbG9jYXRvciBsaWtlIHNwbGl0IGdlbmVyYXRlcyBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbSBAZm9saW8nc1xcbkBAIC0zNzk1LDExICszODA0LDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcXG4gICogUmV0dXJuOiAwIC0gc3VjY2Vzc2Z1bCwgXFx1MDAzYzAgLSBmYWlsZWQgKGlmIC1FTk9NRU0gaXMgcmV0dXJuZWQsIEBmb2xpbyBtaWdodCBiZVxcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXFxuICAqL1xcbi1zdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4rc3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxcbiBcXHRcXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4gXFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4rXFx0Y29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcdGludCBzdGFydF9vcmRlciA9IHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNID8gbmV3X29yZGVyIDogb2xkX29yZGVyIC0gMTtcXG4gXFx0c3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbztcXG5AQCAtMzgxNCw4ICszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIFxcdCAgICAgc3BsaXRfb3JkZXItLSkge1xcbiBcXHRcXHRpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpO1xcbiBcXG4tXFx0XFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xcbi1cXHRcXHRpZiAoaXNfYW5vbiBcXHUwMDI2XFx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxcbitcXHRcXHQvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xcbitcXHRcXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcXHUwMDI2XFx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdGlmIChtYXBwaW5nKSB7XFxuQEAgLTM4NzgsMzIgKzM4ODgsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdFxcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxcbiB7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbitcXG4gXFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XFxuIFxcdC8qXFxuIFxcdCAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlXFxuLVxcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXFxuLVxcdCAqXFxuLVxcdCAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZVxcbi1cXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cXG4rXFx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvXFxuK1xcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFmb2xpby1cXHUwMDNlbWFwcGluZyBcXHUwMDI2XFx1MDAyNiAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4rXFx0aWYgKCFmb2xpby1cXHUwMDNlbWFwcGluZyBcXHUwMDI2XFx1MDAyNiAhaXNfc3dhcGNhY2hlKVxcbiBcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbiBcXG4tXFx0Lyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqL1xcbi1cXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcXG4tXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcbiBcXHQvKlxcbi1cXHQgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwXFxuLVxcdCAqXFxuLVxcdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cXG4tXFx0ICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueVxcbi1cXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXFxuLVxcdCAqIGhlcmUuXFxuK1xcdCAqIE9yZGVyLTEgaXMgdW5zdXBwb3J0ZWQ6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciB0aGVcXG4rXFx0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFxcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxcbitcXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcXG4rXFx0ICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcXHUwMDI2XFx1MDAyNiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcXG4rXFx0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXFx1MDAyNlxcdTAwMjYgbmV3X29yZGVyID09IDEpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHR9XFxuIFxcbiBcXHRpZiAoaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuQEAgLTM5MTEsMzkgKzM5MTUsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcXG4gXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXFxuK1xcdCAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0J3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXFxuK1xcdCAqIHNobWVtIG1hcHBpbmcgYWZ0ZXJ3YXJkLiBUaGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmcgdGhlbVxcbitcXHQgKiBoZW5jZSByZWplY3QgaXQgaGVyZSB1cCBmcm9udCBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWlzX2Fub24gXFx1MDAyNlxcdTAwMjYgaXNfc3dhcGNhY2hlIFxcdTAwMjZcXHUwMDI2IGZvbGlvLVxcdTAwM2VtYXBwaW5nKVxcbitcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLS8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHBhZ2VjYWNoZSBvciB0aGUgc3dhcGNhY2hlLiAqL1xcbi1zdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX2NhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiB7XFxuLVxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuK1xcdGlmICghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFx0cmV0dXJuIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBib29sIGRvX2xydSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBwZ29mZl90IGVuZCwgaW50ICpucl9zaG1lbV9kcm9wcGVkKVxcbisvKipcXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKCkgLSBzcGxpdCBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW9cXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWRcXG4rICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXFxuKyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxcbisgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcXG4rICogQGRvX2xydTogaWYgdHJ1ZSwgYWRkIGFmdGVyLXNwbGl0IGZvbGlvcyB0byBAbGlzdCBpZiBub24gTlVMTCwgb3RoZXJ3aXNlIHRvXFxuKyAqICAgICAgICAgIHRoZSBMUlUgbGlzdFxcbisgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyXFxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKlxcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW8uIEl0IHVubWFwcyBAZm9saW8gKHVubGVzc1xcbisgKiBAYW5vbl91bm1hcCBpcyBmYWxzZSksIGZyZWV6ZXMgaXRzIHJlZmNvdW50LCBhbmQgcGVyZm9ybXMgdGhlIHNwbGl0LCB1cGRhdGVzXFxuKyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC5cXG4rICovXFxuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxcbitcXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxcbiB7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuK1xcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xcbitcXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xcbiBcXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4gXFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xcbiBcXHRpbnQgcmV0ID0gMDtcXG4gXFxuLVxcdFZNX1dBUk5fT05fT05DRSghbWFwcGluZyBcXHUwMDI2XFx1MDAyNiBlbmQpO1xcbitcXHQvKlxcbitcXHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcXG4rXFx0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXFxuK1xcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xcbitcXHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xcbitcXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cXG4rXFx0ICovXFxuK1xcdGlmIChhbm9uX3VubWFwKSB7XFxuK1xcdFxcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcXG4rXFx0XFx0aWYgKCFhbm9uX3ZtYSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFx0XFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdGhlIG9wdGlvbmFsIHVubWFwLiAqL1xcbitcXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChhbm9uX3VubWFwKVxcbitcXHRcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xcbitcXG4gXFx0LypcXG4gXFx0ICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dFxcbiBcXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXFxuIFxcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxcbiBcXHQgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlXFxuIFxcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXFxuK1xcdCAqXFxuK1xcdCAqIE9ubHkgYW5vbiBmb2xpb3MgYXJlIGV2ZXIgcXVldWVkIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBsaXN0LFxcbitcXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXFxuIFxcdCAqL1xcbi1cXHRkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBvbGRfb3JkZXIgXFx1MDAzZSAxO1xcbitcXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFxcdTAwM2UgMSBcXHUwMDI2XFx1MDAyNiBpc19hbm9uO1xcbiBcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbiBcXHRcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XFxuIFxcbkBAIC0zOTUyLDEyOCArNDAxNCwyNTIgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cXG4gXFx0XFx0bHJ1ID0gbGlzdF9scnVfbG9jayhcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxcbiBcXHRcXHRcXHRcXHQgICAgZm9saW9fbmlkKGZvbGlvKSwgXFx1MDAyNm1lbWNnKTtcXG4gXFx0fVxcbi1cXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XFxuLVxcdFxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbi1cXHRcXHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XFxuIFxcbitcXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcXG4gXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0X19saXN0X2xydV9kZWwoXFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxcbi1cXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNmZvbGlvLVxcdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XFxuLVxcdFxcdFxcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xcbi1cXHRcXHRcXHRcXHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcXG4tXFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xcbi1cXHRcXHRcXHR9XFxuIFxcdFxcdFxcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xcbiBcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFx0XFx0fVxcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIG91dF9ub19zcGxpdDtcXG4rXFx0fVxcbiBcXG4tXFx0XFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0XFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbi1cXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHQgICAgbmV3X29yZGVyIFxcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XFxuLVxcdFxcdFxcdFxcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdFxcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0TlJfU0hNRU1fVEhQUywgLW5yKTtcXG4tXFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHROUl9GSUxFX1RIUFMsIC1ucik7XFxuLVxcdFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbitcXHRcXHRfX2xpc3RfbHJ1X2RlbChcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXFxuK1xcdFxcdFxcdCAgICAgICBcXHUwMDI2Zm9saW8tXFx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcXG4rXFx0XFx0XFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XFxuK1xcdFxcdFxcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XFxuIFxcdFxcdH1cXG4rXFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGlmIChtYXBwaW5nKSB7XFxuLVxcdFxcdFxcdFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XFxuLVxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuK1xcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XFxuIFxcbi1cXHRcXHRcXHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xcbi1cXHRcXHR9XFxuK1xcdGlmIChkb19scnUpXFxuK1xcdFxcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcXG4rXFxuK1xcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLFxcbitcXHRcXHRcXHRcXHQgICBOVUxMLCBzcGxpdF90eXBlKTtcXG4gXFxuLVxcdFxcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHQvKlxcbitcXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XFxuK1xcdCAqIHBsYWNlLiBLZWVwIHRoZSBoZWFkIEBmb2xpbyBmcm96ZW4gdW50aWwgdGhlIGVuZDogc3ViIGVudHJpZXNcXG4rXFx0ICogaW4gc3dhcCBjYWNoZSBtdXN0IGJlIHVwZGF0ZWQgZmlyc3QsIHNvIGEgY29uY3VycmVudFxcbitcXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXFxuK1xcdCAqIGVudHJ5IChmb2xpb190cnlfZ2V0KCkgd2lsbCBmYWlsIG9uIHRoZSBoZWFkIEBmb2xpbyB1bnRpbCB1bmZyZWV6ZSkuXFxuK1xcdCAqL1xcbitcXHRmb3JfZWFjaF9mb2xpb19zYWZlKGZvbGlvX25leHQoZm9saW8pLCBlbmRfZm9saW8sIG5ld19mb2xpbywgbmV4dCkge1xcbitcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbitcXHRcXHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxcbitcXHRcXHRcXHRcXHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4gXFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xcbitcXHRcXHRcXHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XFxuK1xcdFxcdGlmIChjaSlcXG4rXFx0XFx0XFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XFxuK1xcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xcbitcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XFxuIFxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XFxuLVxcdFxcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZVxcbi1cXHRcXHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3NcXG4tXFx0XFx0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cXG4tXFx0XFx0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxcbi1cXHRcXHQgKiBAZm9saW8uXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xcbi1cXHRcXHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcXG4tXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XFxuK1xcdGlmIChkb19scnUpXFxuK1xcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0aWYgKGNpKVxcbitcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4rb3V0X25vX3NwbGl0OlxcbitcXHRsb2NhbF9pcnFfZW5hYmxlKCk7XFxuK1xcdGlmIChhbm9uX3VubWFwKSB7XFxuK1xcdFxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXFxuK1xcdFxcdFxcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xcbitcXHRcXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFxcdTAwM2NcXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcXG4rXFx0fVxcbitvdXRfdW5sb2NrOlxcbitcXHRpZiAoYW5vbl91bm1hcCkge1xcbitcXHRcXHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xcbitcXHRcXHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuIFxcbi1cXHRcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbisvKipcXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW9cXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWQgYW5kIGZpbGUtYmFja2VkXFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXFxuKyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXRcXG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXFxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKlxcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0c1xcbisgKiByZWZjb3VudCwgYW5kIHBlcmZvcm0gdGhlIHNwbGl0LCB1cGRhdGVzIHRoZSBwYWdlIGNhY2hlIGVudHJpZXMuIFNwbGl0XFxuKyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuIChpZiAtRU5PTUVNXFxuKyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKVxcbisgKi9cXG4rc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuK3tcXG4rXFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4rXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2bWFwcGluZy1cXHUwMDNlaV9wYWdlcywgZm9saW8tXFx1MDAzZWluZGV4KTtcXG4rXFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcXG4rXFx0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcXG4rXFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xcbitcXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XFxuK1xcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4rXFx0cGdvZmZfdCBlbmQgPSAwO1xcbitcXHRnZnBfdCBnZnA7XFxuK1xcdGludCByZXQgPSAwO1xcbiBcXG4tXFx0XFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4rXFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuK1xcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0XFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXHQvKlxcbitcXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXFxuK1xcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cXG4rXFx0ICovXFxuK1xcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuK1xcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cXG4tXFx0XFx0XFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChjaSkge1xcbi1cXHRcXHRcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spO1xcbitcXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gZmFpbF9mcmVlO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXFxuLVxcdFxcdFxcdGlmICghbWFwcGluZylcXG4tXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdG1hcHBpbmdfc2V0X3VwZGF0ZShcXHUwMDI2eGFzLCBtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdFxcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xcbi1cXHRcXHRcXHRpZiAobmV3X2ZvbGlvLVxcdTAwM2VpbmRleCBcXHUwMDNjIGVuZCkge1xcbi1cXHRcXHRcXHRcXHRfX3hhX3N0b3JlKFxcdTAwMjZtYXBwaW5nLVxcdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXFx1MDAzZWluZGV4LFxcbi1cXHRcXHRcXHRcXHRcXHQgICBuZXdfZm9saW8sIDApO1xcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcXG4rXFx0XFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XFxuLVxcdFxcdFxcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVxcdTAwM2VpbmRleCBcXHUwMDNlPSBlbmQgKi9cXG4tXFx0XFx0XFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXFx1MDAyNlxcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcXG4tXFx0XFx0XFx0XFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxcbi1cXHRcXHRcXHRcXHRcXHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXFx1MDAzZWhvc3QpKTtcXG4tXFx0XFx0XFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xcbi1cXHRcXHRcXHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcXG4rXFx0XFx0eGFzX3NldF9vcmRlcihcXHUwMDI2eGFzLCBmb2xpby1cXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XFxuK1xcdFxcdHhhc19zcGxpdF9hbGxvYyhcXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xcbitcXHRcXHRpZiAoeGFzX2Vycm9yKFxcdTAwMjZ4YXMpKSB7XFxuK1xcdFxcdFxcdHJldCA9IHhhc19lcnJvcihcXHUwMDI2eGFzKTtcXG4rXFx0XFx0XFx0Z290byBmYWlsX2ZyZWU7XFxuIFxcdFxcdH1cXG4rXFx0fVxcbiBcXG4tXFx0XFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuLVxcdFxcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4tXFx0XFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4tXFx0XFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcXG4rXFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdGlmIChkb19scnUpXFxuLVxcdFxcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovXFxuK1xcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuK1xcdFxcdHJldCA9IC1FQUdBSU47XFxuK1xcdFxcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcXG4rXFx0fVxcbiBcXG4tXFx0XFx0aWYgKGNpKVxcbi1cXHRcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHQvKlxcbitcXHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbitcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbitcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuK1xcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbitcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbitcXHQgKi9cXG4rXFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbitcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuK1xcbitcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHR4YXNfbG9ja19pcnEoXFx1MDAyNnhhcyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxcbitcXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cXG4rXFx0ICovXFxuK1xcdGlmICh4YXNfbG9hZChcXHUwMDI2eGFzKSAhPSBmb2xpbykge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcXG4rXFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2IG5ld19vcmRlciBcXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcXG4rXFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XFxuK1xcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcXHUwMDI2eGFzLFxcbitcXHRcXHRcXHRcXHQgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcXG4rXFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlXFxuK1xcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xcbitcXHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxcbitcXHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXFxuK1xcdCAqIEBmb2xpby5cXG4rXFx0ICovXFxuK1xcdGZvcl9lYWNoX2ZvbGlvX3NhZmUoZm9saW9fbmV4dChmb2xpbyksIGVuZF9mb2xpbywgbmV3X2ZvbGlvLCBuZXh0KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xcbitcXG4rXFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4rXFx0XFx0XFx0XFx0ICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSArIDEpO1xcbitcXG4rXFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXG4rXFx0XFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXFxuK1xcdFxcdGlmIChuZXdfZm9saW8tXFx1MDAzZWluZGV4IFxcdTAwM2MgZW5kKSB7XFxuK1xcdFxcdFxcdF9feGFfc3RvcmUoXFx1MDAyNm1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cXHUwMDNlaW5kZXgsXFxuK1xcdFxcdFxcdFxcdCAgIG5ld19mb2xpbywgMCk7XFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHR9XFxuLVxcdFxcdHJldHVybiAtRUFHQUlOO1xcbitcXG4rXFx0XFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXFx1MDAzZWluZGV4IFxcdTAwM2U9IGVuZCAqL1xcbitcXHRcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0XFx0bnJfc2htZW1fZHJvcHBlZCArPSBucl9wYWdlcztcXG4rXFx0XFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxcbitcXHRcXHRcXHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVxcdTAwM2Vob3N0KSk7XFxuK1xcdFxcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcXG4rXFx0XFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XFxuIFxcdH1cXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuK1xcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4rXFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4rXFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuK1xcdCAqL1xcbitcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xcbitcXHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XFxuK2ZhaWw6XFxuK1xcdC8qXFxuK1xcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcXG4rXFx0ICogcmVtZW1iZXIgdG8gYWRkIHJlbWFwX3BhZ2UoKSBhbmQgYWRhcHQgaXQuXFxuK1xcdCAqL1xcbitcXHR4YXNfdW5sb2NrX2lycShcXHUwMDI2eGFzKTtcXG4rZmFpbF9tbWFwX3VubG9jazpcXG4rXFx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXFxuK1xcdFxcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXFx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xcbitcXHQvKlxcbitcXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xcbitcXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXFxuK1xcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcXG4rXFx0ICogdGhlIG1hcHBpbmcuXFxuK1xcdCAqL1xcbitcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuK2ZhaWxfZnJlZTpcXG4rXFx0LyogUmVzdG9yZSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbWVtY2cgKi9cXG4rXFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbitcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuK1xcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbkBAIC00MDg2LDkgKzQyNzIsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxcbiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcXG4gICpcXG4tICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuXFxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cXG4gICogSXQgaXMgaW4gY2hhcmdlIG9mIGNoZWNraW5nIHdoZXRoZXIgdGhlIHNwbGl0IGlzIHN1cHBvcnRlZCBvciBub3QgYW5kXFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cXG4gICpcXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZFxcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcXG5AQCAtNDEwMiwxNyArNDI4OCwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0XFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCxcXG4gXFx0XFx0c3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4tXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2Zm9saW8tXFx1MDAzZW1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIGZvbGlvLVxcdTAwM2VpbmRleCk7XFxuK1xcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xcbiBcXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xcbi1cXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XFxuLVxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcXG4tXFx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcXG4tXFx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xcbi1cXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xcbi1cXHRwZ29mZl90IGVuZCA9IDA7XFxuIFxcdGludCByZXQ7XFxuIFxcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xcbkBAIC00MTIwLDE0MSArNDMwMCwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFxuIFxcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XFxuIFxcdFxcdHJldCA9IC1FSU5WQUw7XFxuLVxcdFxcdGdvdG8gb3V0X25vX21lbWNnO1xcbitcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4gXFx0aWYgKG5ld19vcmRlciBcXHUwMDNlPSBvbGRfb3JkZXIpIHtcXG4gXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0Z290byBvdXRfbm9fbWVtY2c7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xcbiBcXHRpZiAocmV0KSB7XFxuIFxcdFxcdFZNX1dBUk5fT05DRShyZXQgPT0gLUVJTlZBTCwgXFxcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1xcXCIpO1xcbi1cXHRcXHRnb3RvIG91dF9ub19tZW1jZztcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxcbi1cXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXFxuLVxcdCAqL1xcbi1cXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xcbi1cXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcXG4tXFxuLVxcdGlmIChpc19hbm9uKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxcbi1cXHRcXHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXFxuLVxcdFxcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcXG4tXFx0XFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXFxuLVxcdFxcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXFxuLVxcdFxcdCAqIG9wZXJhdGlvbnMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XFxuLVxcdFxcdGlmICghYW5vbl92bWEpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVCVVNZO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4tXFx0XFx0bWFwcGluZyA9IE5VTEw7XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuLVxcdFxcdGdmcF90IGdmcDtcXG4tXFxuLVxcdFxcdG1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4tXFx0XFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuLVxcdFxcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2XFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdEdGUF9SRUNMQUlNX01BU0spO1xcbi1cXG4tXFx0XFx0aWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVCVVNZO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0bWFwcGluZ19zZXRfdXBkYXRlKFxcdTAwMjZ4YXMsIG1hcHBpbmcpO1xcbi1cXG4tXFx0XFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XFxuLVxcdFxcdFxcdHhhc19zZXRfb3JkZXIoXFx1MDAyNnhhcywgZm9saW8tXFx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xcbi1cXHRcXHRcXHR4YXNfc3BsaXRfYWxsb2MoXFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcXG4tXFx0XFx0XFx0aWYgKHhhc19lcnJvcihcXHUwMDI2eGFzKSkge1xcbi1cXHRcXHRcXHRcXHRyZXQgPSB4YXNfZXJyb3IoXFx1MDAyNnhhcyk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdGFub25fdm1hID0gTlVMTDtcXG4tXFx0XFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbi1cXHRcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbi1cXHRcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuLVxcdFxcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbi1cXHRcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbi1cXHRcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4tXFx0XFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuLVxcdH1cXG4tXFxuLVxcdC8qXFxuLVxcdCAqIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSB3aWxsXFxuLVxcdCAqIHNwbGl0IFBNRHNcXG4tXFx0ICovXFxuLVxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuLVxcdFxcdHJldCA9IC1FQUdBSU47XFxuLVxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4tXFx0fVxcbi1cXG4tXFx0dW5tYXBfZm9saW8oZm9saW8pO1xcbi1cXG4tXFx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cXG4tXFx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcXG4tXFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS5cXG4tXFx0XFx0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHR4YXNfbG9jayhcXHUwMDI2eGFzKTtcXG4tXFx0XFx0eGFzX3Jlc2V0KFxcdTAwMjZ4YXMpO1xcbi1cXHRcXHRpZiAoeGFzX2xvYWQoXFx1MDAyNnhhcykgIT0gZm9saW8pIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4tXFx0XFx0XFx0Z290byBmYWlsO1xcbi1cXHRcXHR9XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbi1cXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFxcdTAwMjZ4YXMsIG1hcHBpbmcsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdHRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgXFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xcbi1mYWlsOlxcbi1cXHRpZiAobWFwcGluZylcXG4tXFx0XFx0eGFzX3VubG9jayhcXHUwMDI2eGFzKTtcXG4tXFxuLVxcdGxvY2FsX2lycV9lbmFibGUoKTtcXG4tXFxuLVxcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxcbi1cXHRcXHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVxcdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcXG4tXFxuLVxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2IGlzX2Fub24gXFx1MDAyNlxcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcXG4tXFx0XFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XFxuLVxcbi1cXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFxcdTAwM2NcXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXFxuLVxcdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cXG4tXFx0ICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5XFxuLVxcdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXFxuLVxcdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxcbi1cXHQgKi9cXG4tXFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xcbi1cXHRcXHRtYXBwaW5nID0gTlVMTDtcXG4tXFx0fVxcbitcXHRpZiAoaXNfYW5vbilcXG4rXFx0XFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbitcXHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXFxuK1xcdFxcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBmYWxzZSwgbGlzdCwgc3BsaXRfdHlwZSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXFxuQEAgLTQyNjUsMjkgKzQzMzMsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXFxuIFxcdFxcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxcbi1cXHRcXHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXFxuK1xcdFxcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXFxuIFxcdFxcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XFxuK1xcdFxcdGlmIChpc19zd2FwY2FjaGUpXFxuK1xcdFxcdFxcdGZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pO1xcbitcXHRcXHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fcHV0KG5ld19mb2xpbyk7XFxuIFxcdH1cXG4gXFxuLW91dF91bmxvY2s6XFxuLVxcdGlmIChhbm9uX3ZtYSkge1xcbi1cXHRcXHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xcbi1cXHRcXHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xcbi1cXHR9XFxuLVxcdGlmIChtYXBwaW5nKVxcbi1cXHRcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuIG91dDpcXG4tXFx0LyogcmVzdG9yZSB0byBjYWxsZXIncyBvbGRfbWVtY2cgKi9cXG4tXFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbi1cXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuLW91dF9ub19tZW1jZzpcXG4tXFx0eGFzX2Rlc3Ryb3koXFx1MDAyNnhhcyk7XFxuIFxcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcXG4gXFx0XFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcXG4gXFx0Y291bnRfbXRocF9zdGF0KG9sZF9vcmRlciwgIXJldCA/IE1USFBfU1RBVF9TUExJVCA6IE1USFBfU1RBVF9TUExJVF9GQUlMRUQpO1xcbkBAIC00MzExLDI5ICs0MzY5LDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiAgKiBpc29sYXRlZCBmcm9tIExSVSAoaWYgYXBwbGljYWJsZSlcXG4gICpcXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcXG4tICogZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZSgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuXFxuKyAqIGZvbGlvX2ZyZWVfc3dhcCgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuXFxuICAqXFxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0b1xcbiAgKiAgICAgICAgIGluc3VmZmljaWVudCByZWZlcmVuY2UgY291bnQgb3IgZXh0cmEgcGlucykuXFxuICAqL1xcbiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4ge1xcbi1cXHRpbnQgcmV0ID0gMDtcXG4tXFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sYXJnZShmb2xpbyksIGZvbGlvKTtcXG4gXFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XFxuIFxcbi1cXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSlcXG4tXFx0XFx0cmV0dXJuIC1FQUdBSU47XFxuLVxcbi1cXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xcbi1cXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBOVUxMLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQwLCBOVUxMKTtcXG4tXFx0bG9jYWxfaXJxX2VuYWJsZSgpO1xcbi1cXHRyZXR1cm4gcmV0O1xcbitcXHRyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgZmFsc2UsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC00MzUyLDEwICs0NDAxLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXJcXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXFxuICAqXFxuLSAqIDQpIEBuZXdfb3JkZXIgXFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxcbi0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tXFx1MDAzZV9kZWZlcnJlZF9saXN0LCB3aGljaFxcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxcbi0gKiAgICBmb2xpbyBvbmx5IGhhcyBzdWJwYWdlcyAwIGFuZCAxLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxcbisgKiA0KSBAbmV3X29yZGVyICE9IDEgZm9yIGFub24gb3Igc3dhcGNhY2hlLiBBbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3JcXG4rICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcXG4rICogICAgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxcbiAgKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuXFxuICAqXFxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGNhbGxlcidzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLFxcbkBAIC00Mzg0LDcgKzQ0MzIsNyBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxcbiAgKi9cXG4gaW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuLVxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuIHtcXG4gXFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuIFxcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmNcXG5pbmRleCA1YmU4MjU5MTFlNjQ1Li5mMTQwNWU1YjgxM2VlIDEwMDY0NFxcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xcbisrKyBiL21tL3N3YXBfc3RhdGUuY1xcbkBAIC0zODgsOCArMzg4LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXHQgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7XFxuIFxcdFxcdGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtXFx1MDAzZXN3YXApO1xcbiBcXHRcXHRjaV9lbmQgPSBjaV9vZmYgKyBmb2xpb19ucl9wYWdlcyhvbGQpO1xcbi1cXHRcXHR3aGlsZSAoY2lfb2ZmKysgXFx1MDAzYyBjaV9lbmQpXFxuK1xcdFxcdGRvIHtcXG4gXFx0XFx0XFx0V0FSTl9PTl9PTkNFKHN3cF90Yl90b19mb2xpbyhfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSAhPSBvbGQpO1xcbitcXHRcXHR9IHdoaWxlICgrK2NpX29mZiBcXHUwMDNjIGNpX2VuZCk7XFxuIFxcdH1cXG4gfVxcbiBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6MjMuODYzMjIzODEzWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NzcxNzg5MTg3NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyXCIsXG4gICAgXCJmb2xpb19zcGxpdF91bm1hcHBlZFwiLFxuICAgIFwiZm9saW9fY2hlY2tfc3BsaXR0YWJsZVwiLFxuICAgIFwiX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIG1vZGlmaWVzIHRoZSBsb2dpYyBmb3Igc3BsaXR0aW5nIGZvbGlvcywgcGFydGljdWxhcmx5IGZvciBhbm9ueW1vdXMgYW5kIHN3YXBjYWNoZSBmb2xpb3MuIEl0IGludHJvZHVjZXMgbmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgc3BsaXR0aW5nIGFuZCBtb2RpZmllcyBjb25kaXRpb25zIGluIGZvbGlvX2NoZWNrX3NwbGl0dGFibGUuIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgYWZmZWN0aW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgYW5kIHN3YXAsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxMiAyMDoxNDoyMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi4xYzYxYjdkMzljZDAzIDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbkBAIC0zNjM0LDYgKzM2MzEsMTggQEAgc3RhdGljIGJvb2wgcGFnZV9yYW5nZV9oYXNfaHdwb2lzb25lZChzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9uZyBucl9wYWdlcylcbiBcdHJldHVybiBmYWxzZTtcbiB9XG4gXG4rLyoqXG4rICogZm9yX2VhY2hfZm9saW9fc2FmZSAtIGl0ZXJhdGUgb3ZlciBjb250aWd1b3VzIGZvbGlvcyBzYWZlIGFnYWluc3QgZm9saW8gZnJlZVxuKyAqIEBzdGFydDogdGhlIGZpcnN0IGZvbGlvIHRvIGl0ZXJhdGVcbisgKiBAZW5kOiBzZW50aW5lbCwgZm9saW9fbmV4dCgpIG9mIHRoZSBsYXN0IGZvbGlvIHRvIGl0ZXJhdGVcbisgKiBAc3ViX2ZvbGlvOiBzdHJ1Y3QgZm9saW8gKiB0byB1c2UgYXMgdGhlIGxvb3AgY3Vyc29yXG4rICogQG5leHQ6IHN0cnVjdCBmb2xpbyAqIHVzZWQgYXMgdGVtcG9yYXJ5IHN0b3JhZ2VcbisgKi9cbisjZGVmaW5lIGZvcl9lYWNoX2ZvbGlvX3NhZmUoc3RhcnQsIGVuZCwgc3ViX2ZvbGlvLCBuZXh0KSBcXFxuK1x0Zm9yIChzdWJfZm9saW8gPSAoc3RhcnQpLCBuZXh0ID0gZm9saW9fbmV4dChzdWJfZm9saW8pOyBcXFxuK1x0ICAgICBzdWJfZm9saW8gIT0gKGVuZCk7IFxcXG4rXHQgICAgIHN1Yl9mb2xpbyA9IG5leHQsIG5leHQgPSBmb2xpb19uZXh0KG5leHQpKVxuK1xuIC8qXG4gICogSXQgc3BsaXRzIEBmb2xpbyBpbnRvIEBuZXdfb3JkZXIgZm9saW9zIGFuZCBjb3BpZXMgdGhlIEBmb2xpbyBtZXRhZGF0YSB0b1xuICAqIGFsbCB0aGUgcmVzdWx0aW5nIGZvbGlvcy5cbkBAIC0zNzU1LDggKzM3NjQsOCBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsXG4gfVxuIFxuIC8qKlxuLSAqIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSAtIHNwbGl0cyBhbiB1bm1hcHBlZCBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zIGluXG4tICogdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuXG4rICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zXG4rICogaW4gdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuXG4gICogQGZvbGlvOiB0aGUgdG8tYmUtc3BsaXQgZm9saW9cbiAgKiBAbmV3X29yZGVyOiB0aGUgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyIHNwbGl0IGZvbGlvcyAoc2luY2UgYnVkZHlcbiAgKiAgICAgICAgICAgICBhbGxvY2F0b3IgbGlrZSBzcGxpdCBnZW5lcmF0ZXMgZm9saW9zIHdpdGggb3JkZXJzIGZyb20gQGZvbGlvJ3NcbkBAIC0zNzk1LDExICszODA0LDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4rc3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuIFx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGNvbnN0IGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdGludCBzdGFydF9vcmRlciA9IHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNID8gbmV3X29yZGVyIDogb2xkX29yZGVyIC0gMTtcbiBcdHN0cnVjdCBmb2xpbyAqb2xkX2ZvbGlvID0gZm9saW87XG5AQCAtMzgxNCw4ICszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHQgICAgIHNwbGl0X29yZGVyLS0pIHtcbiBcdFx0aW50IG5yX25ld19mb2xpb3MgPSAxVUwgXHUwMDNjXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XG4gXG4tXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbi1cdFx0aWYgKGlzX2Fub24gXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4rXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4rXHRcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRpZiAobWFwcGluZykge1xuQEAgLTM4NzgsMzIgKzM4ODgsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4rXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuK1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4rXG4gXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbiBcdC8qXG4gXHQgKiBGb2xpb3MgdGhhdCBqdXN0IGdvdCB0cnVuY2F0ZWQgY2Fubm90IGdldCBzcGxpdC4gU2lnbmFsIHRvIHRoZVxuLVx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS5cbi1cdCAqXG4tXHQgKiBUT0RPOiB0aGlzIHdpbGwgYWxzbyBjdXJyZW50bHkgcmVmdXNlIGZvbGlvcyB3aXRob3V0IGEgbWFwcGluZyBpbiB0aGVcbi1cdCAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLlxuK1x0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvXG4rXHQgKiBoYXMgbm8gcGFnZSBjYWNoZSBlbnRyaWVzIHRvIHVwZGF0ZSwgc28gaXQgaXMgZmluZSB0byBzcGxpdC5cbiBcdCAqL1xuLVx0aWYgKCFmb2xpby1cdTAwM2VtYXBwaW5nIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbitcdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWlzX3N3YXBjYWNoZSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbi1cdC8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi9cbi1cdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4tXG4gXHQvKlxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMFxuLVx0ICpcbi1cdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cbi1cdCAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnlcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWRcbi1cdCAqIGhlcmUuXG4rXHQgKiBPcmRlci0xIGlzIHVuc3VwcG9ydGVkOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgdGhlXG4rXHQgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gXHUwMDI2IHN3YXAgY2FjaGUgZm9saW9zIGFyZSBub3RcbitcdCAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZFxuK1x0ICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LlxuIFx0ICovXG4tXHRpZiAoKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9OT05fVU5JRk9STSB8fCBuZXdfb3JkZXIpIFx1MDAyNlx1MDAyNiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbitcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4tXHR9XG4gXG4gXHRpZiAoaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG5AQCAtMzkxMSwzOSArMzkxNSw5NyBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbitcdC8qXG4rXHQgKiBBIG5vbi1hbm9uIHN3YXBjYWNoZSBmb2xpbyB0aGF0IHN0aWxsIGhhcyBhIG1hcHBpbmcgY2FuIG9ubHkgYmUgYVxuK1x0ICogc2htZW0gZm9saW8gdW5kZXIgU1dBUCBJTywgaXQncyByZW1vdmVkIGZyb20gZWl0aGVyIHN3YXAgY2FjaGUgb3JcbitcdCAqIHNobWVtIG1hcHBpbmcgYWZ0ZXJ3YXJkLiBUaGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmcgdGhlbVxuK1x0ICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLlxuK1x0ICovXG4rXHRpZiAoIWlzX2Fub24gXHUwMDI2XHUwMDI2IGlzX3N3YXBjYWNoZSBcdTAwMjZcdTAwMjYgZm9saW8tXHUwMDNlbWFwcGluZylcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcbiBcdHJldHVybiAwO1xuIH1cbiBcbi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi9cbi1zdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX2NhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuKy8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHN3YXBjYWNoZS4gKi9cbitzdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbitcdGlmICghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuIFx0XHRyZXR1cm4gMDtcbiBcdHJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4gfVxuIFxuLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsXG4tXHRcdFx0XHRcdCAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZClcbisvKipcbisgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpb1xuKyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkXG4rICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcbisgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbisgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXRcbisgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcbisgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG9cbisgKiAgICAgICAgICB0aGUgTFJVIGxpc3RcbisgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyXG4rICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuKyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbisgKlxuKyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzXG4rICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlc1xuKyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuXG4rICovXG4rc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LCBib29sIGFub25fdW5tYXAsXG4rXHRcdFx0XHRcdCAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbitcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4rXHRzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDtcbitcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4gXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XG4rXHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXHRib29sIGRlcXVldWVfZGVmZXJyZWQ7XG4gXHRpbnQgcmV0ID0gMDtcbiBcbi1cdFZNX1dBUk5fT05fT05DRSghbWFwcGluZyBcdTAwMjZcdTAwMjYgZW5kKTtcbitcdC8qXG4rXHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcbitcdCAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbVxuK1x0ICogZGlzYXBwZWFyaW5nLCBzbyB3ZSBmaXJzdCB0YWtlIGEgcmVmZXJlbmNlIGFuZCBsb2NrIGl0LiBUaGlzIGlzXG4rXHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xuK1x0ICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuXG4rXHQgKi9cbitcdGlmIChhbm9uX3VubWFwKSB7XG4rXHRcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcbitcdFx0aWYgKCFhbm9uX3ZtYSlcbitcdFx0XHRyZXR1cm4gLUVCVVNZO1xuK1x0XHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcbitcdH1cbitcbitcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdGhlIG9wdGlvbmFsIHVubWFwLiAqL1xuK1x0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBvdXRfdW5sb2NrO1xuK1x0fVxuK1xuK1x0aWYgKGFub25fdW5tYXApXG4rXHRcdHVubWFwX2ZvbGlvKGZvbGlvKTtcbitcbitcdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4rXG4gXHQvKlxuIFx0ICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dFxuIFx0ICogdGhlIHNocmlua2VyIGJlZm9yZSBmcmVlemluZyB0aGUgcmVmLiBJZiB0aGUgc2hyaW5rZXIgc2Vlc1xuIFx0ICogYSAwLXJlZiBmb2xpbywgaXQgYXNzdW1lcyBpdCBiZWF0IGZvbGlvX3B1dCgpIHRvIHRoZSBsaXN0XG4gXHQgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlXG4gXHQgKiB3aWxsIGRvIGJlbG93IGFzIHBhcnQgb2YgdGhlIHNwbGl0LlxuK1x0ICpcbitcdCAqIE9ubHkgYW5vbiBmb2xpb3MgYXJlIGV2ZXIgcXVldWVkIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBsaXN0LFxuK1x0ICogc28gbm9uLWFub24gZm9saW9zIChtYXBwaW5nbGVzcyBzd2FwY2FjaGUpIG5ldmVyIG5lZWQgZGVxdWV1aW5nLlxuIFx0ICovXG4tXHRkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgb2xkX29yZGVyIFx1MDAzZSAxO1xuK1x0ZGVxdWV1ZV9kZWZlcnJlZCA9IG9sZF9vcmRlciBcdTAwM2UgMSBcdTAwMjZcdTAwMjYgaXNfYW5vbjtcbiBcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4gXHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiBcbkBAIC0zOTUyLDEyOCArNDAxNCwyNTIgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cbiBcdFx0bHJ1ID0gbGlzdF9scnVfbG9jayhcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsXG4gXHRcdFx0XHQgICAgZm9saW9fbmlkKGZvbGlvKSwgXHUwMDI2bWVtY2cpO1xuIFx0fVxuLVx0aWYgKGZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKSkge1xuLVx0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbi1cdFx0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFxuK1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XG4gXHRcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4tXHRcdFx0X19saXN0X2xydV9kZWwoXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXG4tXHRcdFx0XHQgICAgICAgXHUwMDI2Zm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcbi1cdFx0XHRcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxuLVx0XHRcdFx0XHRNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4tXHRcdFx0fVxuIFx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuIFx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHR9XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gb3V0X25vX3NwbGl0O1xuK1x0fVxuIFxuLVx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdGludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbi1cbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNlxuLVx0XHRcdCAgICBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuLVx0XHRcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfU0hNRU1fVEhQUywgLW5yKTtcbi1cdFx0XHRcdH0gZWxzZSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX0ZJTEVfVEhQUywgLW5yKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4rXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuK1x0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbitcdFx0XHQgICAgICAgXHUwMDI2Zm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xuK1x0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuK1x0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuK1x0XHRcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxuK1x0XHRcdFx0ICAgICAgTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuIFx0XHR9XG4rXHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdH1cbiBcbi1cdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xuLVx0XHRcdGlmIChtYXBwaW5nKSB7XG4tXHRcdFx0XHRWTV9XQVJOX09OX09OQ0VfRk9MSU8obWFwcGluZywgZm9saW8pO1xuLVx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4tXHRcdFx0fVxuK1x0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbitcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbiBcbi1cdFx0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuLVx0XHR9XG4rXHRpZiAoZG9fbHJ1KVxuK1x0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXG4rXHRyZXQgPSBfX3NwbGl0X2Zyb3plbl9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCxcbitcdFx0XHRcdCAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzXG4rXHQgKiBpbiBzd2FwIGNhY2hlIG11c3QgYmUgdXBkYXRlZCBmaXJzdCwgc28gYSBjb25jdXJyZW50XG4rXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXG4rXHQgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLlxuK1x0ICovXG4rXHRmb3JfZWFjaF9mb2xpb19zYWZlKGZvbGlvX25leHQoZm9saW8pLCBlbmRfZm9saW8sIG5ld19mb2xpbywgbmV4dCkge1xuK1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuK1x0XHRcdFx0ICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1x0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdFx0aWYgKGNpKVxuK1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbitcdH1cbiBcbi1cdFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxuLVx0XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuK1x0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbi1cdFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlXG4tXHRcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuLVx0XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4tXHRcdCAqIEBmb2xpby5cbi1cdFx0ICovXG4tXHRcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4tXHRcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1x0aWYgKGNpKVxuK1x0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbitvdXRfbm9fc3BsaXQ6XG4rXHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuK1x0fVxuIFxuLVx0XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbiBcbi1cdFx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuKy8qKlxuKyAqIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKCkgLSBzcGxpdCBhIGZpbGUtYmFja2VkIGZvbGlvXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWQgYW5kIGZpbGUtYmFja2VkXG4rICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcbisgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbisgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXRcbisgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcbisgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxuKyAqXG4rICogSGVscGVyIGZvciBzcGxpdHRpbmcgYSBmaWxlLWJhY2tlZCBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbywgZnJlZXplcyBpdHNcbisgKiByZWZjb3VudCwgYW5kIHBlcmZvcm0gdGhlIHNwbGl0LCB1cGRhdGVzIHRoZSBwYWdlIGNhY2hlIGVudHJpZXMuIFNwbGl0XG4rICogZm9saW9zIGFyZSB1bmZyb3plbiBidXQgbm90IHJlbWFwcGVkLCB0aGV5IGFyZSBmYXVsdGVkIGJhY2sgaW4gb24gZGVtYW5kLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuIChpZiAtRU5PTUVNXG4rICogaXMgcmV0dXJuZWQsIEBmb2xpbyBtaWdodCBiZSBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIpXG4rICovXG4rc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0XHQgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuK1x0XHRcdFx0XHQgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4re1xuK1x0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cdTAwM2VtYXBwaW5nO1xuK1x0WEFfU1RBVEUoeGFzLCBcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbitcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4rXHRsb25nIG9sZF9ucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbitcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbitcdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbitcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4rXHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4rXHRwZ29mZl90IGVuZCA9IDA7XG4rXHRnZnBfdCBnZnA7XG4rXHRpbnQgcmV0ID0gMDtcbiBcbi1cdFx0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuLVx0XHRcdFx0XHQgICBmb2xpb19jYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSArIDEpO1xuK1x0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4rXHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0XHRcdGlmIChkb19scnUpXG4tXHRcdFx0XHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XG4rXHQvKlxuK1x0ICogU3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuK1x0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuK1x0ICovXG4rXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuK1x0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbm9ueW1vdXMgZm9saW8gd2l0aCBzd2FwIGNhY2hlLlxuLVx0XHRcdCAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKGNpKSB7XG4tXHRcdFx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4rXHRnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spO1xuK1x0aWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHtcbitcdFx0cmV0ID0gLUVCVVNZO1xuK1x0XHRnb3RvIGZhaWxfZnJlZTtcbitcdH1cbiBcbi1cdFx0XHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXG4tXHRcdFx0aWYgKCFtYXBwaW5nKVxuLVx0XHRcdFx0Y29udGludWU7XG4rXHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbiBcbi1cdFx0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbi1cdFx0XHRpZiAobmV3X2ZvbGlvLVx1MDAzZWluZGV4IFx1MDAzYyBlbmQpIHtcbi1cdFx0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4tXHRcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4rXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbitcdFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcbi1cdFx0XHRWTV9XQVJOX09OX09OQ0UoIW5yX3NobWVtX2Ryb3BwZWQpO1xuLVx0XHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4tXHRcdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXHUwMDI2XHUwMDI2IG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdFx0XHQqbnJfc2htZW1fZHJvcHBlZCArPSBucl9wYWdlcztcbi1cdFx0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4tXHRcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQoXG4tXHRcdFx0XHRcdG5ld19mb2xpbywgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4tXHRcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuLVx0XHRcdGZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpO1xuK1x0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4rXHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4rXHRcdGlmICh4YXNfZXJyb3IoXHUwMDI2eGFzKSkge1xuK1x0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuK1x0XHRcdGdvdG8gZmFpbF9mcmVlO1xuIFx0XHR9XG4rXHR9XG4gXG4tXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuLVx0XHQgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuXG4tXHRcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4tXHRcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKi9cbi1cdFx0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XG4rXHRpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpO1xuIFxuLVx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbitcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSAqL1xuK1x0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsX21tYXBfdW5sb2NrO1xuK1x0fVxuIFxuLVx0XHRpZiAoY2kpXG4tXHRcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0LypcbitcdCAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4rXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuK1x0ICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLlxuK1x0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4rXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuK1x0ICovXG4rXHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbitcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuK1x0XHRlbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy1cdTAwM2Vob3N0LCBlbmQpO1xuK1xuK1x0dW5tYXBfZm9saW8oZm9saW8pO1xuK1xuK1x0eGFzX2xvY2tfaXJxKFx1MDAyNnhhcyk7XG4rXG4rXHQvKlxuK1x0ICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS5cbitcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuK1x0ICovXG4rXHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIG9sZF9ucl9wYWdlcyArIDEpKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2IG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4rXHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKVxuK1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7XG4rXHRcdGVsc2VcbitcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XG4rXHR9XG4rXG4rXHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbitcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsXG4rXHRcdFx0XHQgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHtcbitcdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XG4rXG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICsgMSk7XG4rXG4rXHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcbitcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4rXHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuK1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4rXHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuK1x0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG4tXHRcdHJldHVybiAtRUFHQUlOO1xuK1xuK1x0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuK1x0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0XHRucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuK1x0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbitcdFx0XHRcdFx0ICAgICAgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4rXHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbitcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4rXHQvKlxuK1x0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbitcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbitcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4rXHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqL1xuK1x0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgKyAxKTtcbitcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbitmYWlsOlxuK1x0LypcbitcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbitcdCAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LlxuK1x0ICovXG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSArNDI3Miw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbiAgKlxuLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiAgKiBJdCBpcyBpbiBjaGFyZ2Ugb2YgY2hlY2tpbmcgd2hldGhlciB0aGUgc3BsaXQgaXMgc3VwcG9ydGVkIG9yIG5vdCBhbmRcbi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICs0Mjg4LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxuIFx0XHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4tXHRYQV9TVEFURSh4YXMsIFx1MDAyNmZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuIFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbi1cdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbi1cdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcbi1cdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbi1cdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbi1cdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4tXHRwZ29mZl90IGVuZCA9IDA7XG4gXHRpbnQgcmV0O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbkBAIC00MTIwLDE0MSArNDMwMCwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuK1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdGlmIChuZXdfb3JkZXIgXHUwMDNlPSBvbGRfb3JkZXIpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbiBcdGlmIChyZXQpIHtcbiBcdFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wiKTtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuLVx0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuLVx0ICovXG4tXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuLVx0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4tXG4tXHRpZiAoaXNfYW5vbikge1xuLVx0XHQvKlxuLVx0XHQgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGRcbi1cdFx0ICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYVxuLVx0XHQgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzXG4tXHRcdCAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9ja1xuLVx0XHQgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZVxuLVx0XHQgKiBvcGVyYXRpb25zLlxuLVx0XHQgKi9cbi1cdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuLVx0XHRpZiAoIWFub25fdm1hKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH0gZWxzZSB7XG4tXHRcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4tXHRcdGdmcF90IGdmcDtcbi1cbi1cdFx0bWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4tXHRcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuLVx0XHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpIHtcbi1cdFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjZcbi1cdFx0XHRcdFx0XHRcdEdGUF9SRUNMQUlNX01BU0spO1xuLVxuLVx0XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuLVx0XHRcdHJldCA9IC1FQlVTWTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbi1cbi1cdFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4tXHRcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuLVx0XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4tXHRcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4tXHRcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuLVxuLVx0XHRhbm9uX3ZtYSA9IE5VTEw7XG4tXHRcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuLVx0XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuLVx0XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4tXHRcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuLVx0XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuLVx0XHQgKi9cbi1cdFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4tXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuLVx0XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcbi1cdCAqIHNwbGl0IFBNRHNcbi1cdCAqL1xuLVx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbi1cdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0dW5tYXBfZm9saW8oZm9saW8pO1xuLVxuLVx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRpZiAobWFwcGluZykge1xuLVx0XHQvKlxuLVx0XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuLVx0XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbi1cdFx0ICovXG4tXHRcdHhhc19sb2NrKFx1MDAyNnhhcyk7XG4tXHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuLVx0XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuLVx0XHRcdHJldCA9IC1FQUdBSU47XG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHR9XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbitcdGlmIChpc19hbm9uKVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuK1x0ZWxzZVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgKzQzMzMsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XG4gXHRcdC8qXG4gXHRcdCAqIFN1YnBhZ2VzIHdob3NlIG1hcHBpbmcgaGFzIGJlZW4gemFwcGVkIG1heSBiZSBmcmVlZFxuIFx0XHQgKiBlYXJsaWVyLCBidXQgZnJlZWluZyB0aGVtIHJlcXVpcmVzIHRha2luZyB0aGVcbi1cdFx0ICogbHJ1X2xvY2ssIHNvIHdlIGRlZmVyIHB1dF9wYWdlKCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuK1x0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuIFx0XHQgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLlxuIFx0XHQgKi9cbi1cdFx0ZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pO1xuK1x0XHRpZiAoaXNfc3dhcGNhY2hlKVxuK1x0XHRcdGZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pO1xuK1x0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbitcdFx0Zm9saW9fcHV0KG5ld19mb2xpbyk7XG4gXHR9XG4gXG4tb3V0X3VubG9jazpcbi1cdGlmIChhbm9uX3ZtYSkge1xuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuLVx0fVxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbiBvdXQ6XG4tXHQvKiByZXN0b3JlIHRvIGNhbGxlcidzIG9sZF9tZW1jZyAqL1xuLVx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuLVx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuLW91dF9ub19tZW1jZzpcbi1cdHhhc19kZXN0cm95KFx1MDAyNnhhcyk7XG4gXHRpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpXG4gXHRcdGNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7XG4gXHRjb3VudF9tdGhwX3N0YXQob2xkX29yZGVyLCAhcmV0ID8gTVRIUF9TVEFUX1NQTElUIDogTVRIUF9TVEFUX1NQTElUX0ZBSUxFRCk7XG5AQCAtNDMxMSwyOSArNDM2OSwyMCBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiAgKiBpc29sYXRlZCBmcm9tIExSVSAoaWYgYXBwbGljYWJsZSlcbiAgKlxuICAqIFVwb24gcmV0dXJuLCB0aGUgZm9saW8gaXMgbm90IHJlbWFwcGVkLCBzcGxpdCBmb2xpb3MgYXJlIG5vdCBhZGRlZCB0byBMUlUsXG4tICogZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZSgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuXG4rICogZm9saW9fZnJlZV9zd2FwKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbiAgKlxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0b1xuICAqICAgICAgICAgaW5zdWZmaWNpZW50IHJlZmVyZW5jZSBjb3VudCBvciBleHRyYSBwaW5zKS5cbiAgKi9cbiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiB7XG4tXHRpbnQgcmV0ID0gMDtcbi1cbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4gXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSlcbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4tXG4tXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIE5VTEwsXG4tXHRcdFx0XHRcdFx0TlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSxcbi1cdFx0XHRcdFx0XHQwLCBOVUxMKTtcbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cdHJldHVybiByZXQ7XG4rXHRyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIGZhbHNlLFxuK1x0XHRcdFx0XHQgICAgICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTtcbiB9XG4gXG4gLypcbkBAIC00MzUyLDEwICs0NDAxLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogICAgR1VQIHBpbnMsIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xpbyBub3QgZ2V0dGluZyBzcGxpdDsgaW5zdGVhZCwgdGhlIGNhbGxlclxuICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLlxuICAqXG4tICogNCkgQG5ld19vcmRlciBcdTAwM2UgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3Rcbi0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIHdoaWNoXG4tICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTFcbi0gKiAgICBmb2xpbyBvbmx5IGhhcyBzdWJwYWdlcyAwIGFuZCAxLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxuKyAqIDQpIEBuZXdfb3JkZXIgIT0gMSBmb3IgYW5vbiBvciBzd2FwY2FjaGUuIEFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvclxuKyAqICAgIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xIGZvbGlvcyBsYWNrLCBhbmQgYSBzd2FwY2FjaGUgZm9saW8gbWF5XG4rICogICAgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxuICAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGNhbGxlcidzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLFxuQEAgLTQzODQsNyArNDQzMiw3IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuICAqIHdpdGggdGhlIGZvbGlvLiBTcGxpdHRpbmcgdG8gb3JkZXIgMCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIGZvbGlvcy5cbiAgKi9cbiBpbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbi1cdFx0XHRcdCAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuIFxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuKysrIGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggKzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdCAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHtcbiBcdFx0Y2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC1cdTAwM2Vzd2FwKTtcbiBcdFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcbi1cdFx0d2hpbGUgKGNpX29mZisrIFx1MDAzYyBjaV9lbmQpXG4rXHRcdGRvIHtcbiBcdFx0XHRXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7XG4rXHRcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE0OjIzLjg2MzIyNTc5M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcyMjg3MjExOTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2ggU2VyaWVzOiBGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoaXMgcGF0Y2ggc2VyaWVzIGlzIGNsZWFybHkgdG91Y2hpbmcgY3J1Y2lhbCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgIGZpbGVzLiBJdCdzIHJlZmFjdG9yaW5nIGZvbGlvIHNwbGl0dGluZyBsb2dpYywgcGFydGljdWxhcmx5IGZvciBhbm9ueW1vdXMgYW5kIHN3YXBjYWNoZSBmb2xpb3MuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlc2UgbmV3IGZ1bmN0aW9ucywgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAsIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAgYW5kIGNoYW5nZXMgdG8gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHN0cm9uZ2x5IHN1Z2dlc3QgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbXBhY3RpbmcgVEhQIGFuZCBmb2xpbyBzcGxpdHRpbmcuIFRoaXMgaXNuJ3QganVzdCBhIHRyaXZpYWwgcmVmYWN0b3IuIEdpdmVuIHRoYXQgdGhpcyBhcmVhIGlzIGFscmVhZHkgZmFpcmx5IGNvbXBsZXggYW5kIHByb25lIHRvIHN1YnRsZSByYWNlIGNvbmRpdGlvbnMsIGl0J3MgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuXG5cbk15IGltbWVkaWF0ZSBuZXh0IHN0ZXAgaXMgYWx3YXlzIHRvIGlkZW50aWZ5IHRoZSBmb2N1cyBzeW1ib2xzLiBMZXQncyBzZWUuLi4gdGhlIHBhdGNoIGludHJvZHVjZXM6XG5cbiogICBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCAoc3RhdGljKSAtIExpa2VseSBhbiBpbnRlcm5hbCBoZWxwZXJcbiogICBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGVgIChzdGF0aWMpIC0gU2ltaWxhciB0byBhYm92ZVxuKiAgIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgKGV4cG9ydGVkL2dsb2JhbCkgLSBBIGxpa2VseSBzdGFydGluZyBwb2ludFxuKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCAoZXhwb3J0ZWQvZ2xvYmFsKSAtIEFub3RoZXIgcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuKiAgIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCAoZ2xvYmFsKSAtIEltcG9ydGFudCBmb3IgdHJpZ2dlcmluZyB0aGUgbmV3IGNvZGUgcGF0aHMuXG5cbldhaXQgYSBzZWNvbmQsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgKm5vdCogc3RhdGljLCBzbyB0aGF0J3MgZGVmaW5pdGVseSBhIHN0YXJ0aW5nIHBvaW50LiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgZ2xvYmFsLCB3aGljaCBpcyBnb29kLiBOb3csIGlzIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgYSBtYWNybyBvciBhIGZ1bmN0aW9uPyBMZXQncyBxdWlja2x5IGRvdWJsZS1jaGVjayBgbW0vaHVnZV9tZW1vcnkuY2AgdG8gYmUgc3VyZS4gVGhhdCdzIGEgY2xhc3NpYyBnb3RjaGEuIEFsd2F5cyB2ZXJpZnkgdGhlc2UgYXNzdW1wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyODgxLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYzLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6MzEuMDkxOTQ5OTMxWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU0ODg4NjA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vaHVnZV9tZW1vcnkuYz00Mzc3PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDMzLSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQzNDppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQ0MzUtXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ0NTEtICogSXQgaGFzIHRoZSBzYW1lIHByZXJlcXVpc2l0ZXMgYW5kIHJldHVybnMgYXNcXG5tbS9odWdlX21lbW9yeS5jOjQ0NTI6ICogc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoKS5cXG5tbS9odWdlX21lbW9yeS5jLTQ0NTMtICpcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDUwMT1pbnQgc3BsaXRfZm9saW9fdG9fbGlzdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDUwMi17XFxubW0vaHVnZV9tZW1vcnkuYzo0NTAzOlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIGxpc3QsIDApO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNDUwNC19XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQ3ODc9c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX3BpZChpbnQgcGlkLCB1bnNpZ25lZCBsb25nIHZhZGRyX3N0YXJ0LFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00ODU2LVxcdFxcdC8qXFxubW0vaHVnZV9tZW1vcnkuYzo0ODU3OlxcdFxcdCAqIEZvciBmb2xpb3Mgd2l0aCBwcml2YXRlLCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpXFxubW0vaHVnZV9tZW1vcnkuYy00ODU4LVxcdFxcdCAqIHdpbGwgdHJ5IHRvIGRyb3AgaXQgYmVmb3JlIHNwbGl0IGFuZCB0aGVuIGNoZWNrIGlmIHRoZSBmb2xpb1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDozMS4xNDY4NDQwN1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5OTkxNTIwNjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSdtIGRlZXBseSBmYW1pbGlhciB3aXRoIExpbnV4IGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudDpcblxuKipIdW50aW5nIERvd24gdGhlIEh1Z2UgUGFnZSBTcGxpdCBMb2dpYyoqXG5cbkFscmlnaHQsIHRoZSBwcm9ibGVtIEknbSB3b3JraW5nIG9uIHN1Z2dlc3RzIHRoZXJlJ3MgYSBicmVha2Rvd24gaW4gaG93IGh1Z2UgcGFnZXMgYXJlIGhhbmRsZWQsIHNwZWNpZmljYWxseSB3aGVuIHRoZXkgbmVlZCB0byBiZSBzcGxpdC4gTXkgaW5zdGluY3QgaXMgdG8gdHJhY2UgdGhlIGV4ZWN1dGlvbiBwYXRoIHRoYXQgaGFuZGxlcyB0aGlzIHNwbGl0IG9wZXJhdGlvbi4gVGhlIG5hbWluZyBjb252ZW50aW9uIHN0cm9uZ2x5IHN1Z2dlc3RzIHRoZSBmdW5jdGlvbiBJIG5lZWQgaXMgaW4gdGhlIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAgaGVhZGVyIGZpbGUuIFRoZSBzcGVjaWZpYyBmdW5jdGlvbiBJIG5lZWQgdG8gbG9vayBhdCB3aWxsIGJlIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIFRoaXMgZnVuY3Rpb24gbmFtZSwgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYWxtb3N0IGNlcnRhaW5seSBtZWFucyBpdCBzcGxpdHMgYSBodWdlIHBhZ2UsIGFkZHMgdGhlIHNtYWxsZXIgcGFnZXMgdG8gYSBmcmVlbGlzdCwgYW5kIHRoZW4gbGlrZWx5IGFkanVzdHMgdGhlIGFsbG9jYXRpb24gb3JkZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBkZXRhaWxzIG9mIGhvdyBpdCdzIHNwbGl0dGluZywgd2hhdCBmcmVlbGlzdCBpdCdzIHVzaW5nLCBhbmQgaG93IGl0J3MgbWFuYWdpbmcgdGhlIGFsbG9jYXRpb24gb3JkZXIgYWZ0ZXIgdGhlIHNwbGl0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgbG9naWMgaGVyZSBpcyB3aGVyZSB0aGUgcHJvYmxlbSBpcyBvcmlnaW5hdGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQxMzAsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDozNS4xNDU5OTg3ODhaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODg1ODE5MjgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQxMD1pbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDEzOnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNS17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDE2OlxcdHJldHVybiBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIGxpc3QsIG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE3LX1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MTg9c3RhdGljIGlubGluZSBpbnQgc3BsaXRfaHVnZV9wYWdlX3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxOS17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIwOlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBOVUxMLCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyMS19XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MjM9c3RhdGljIGlubGluZSBpbnQgc3BsaXRfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyNC17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDI1OlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBOVUxMLCAwKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjYtfVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NjQ1PXN0YXRpYyBpbmxpbmUgaW50XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjQ2OnNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY0Ny1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9ODI2PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI3LXtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo4Mjg6XFx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC04MjktfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDozNS4yMzQ1ODU3NzZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODU2ODA4MzMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyB0ZWNobmljYWwgc25pcHBldCwgcHV0IGluIHRoZSBmaXJzdCBwZXJzb24sIGFzIHJlcXVlc3RlZDpcblxuKipEZWNvbnN0cnVjdGluZyBUaGlzIFBhdGNoJ3MgRm9jdXMqKlxuXG5BbHJpZ2h0LCBzbyB0aGlzIHBhdGNoIGlzIGNsZWFybHkgdG91Y2hpbmcgc29tZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBzd2FwcGluZyBsb2dpYy4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQncyBob25pbmcgaW4gb24gYSBmZXcgc3BlY2lmaWMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaHVnZSBwYWdlIHNwbGl0dGluZyBhbmQgZm9saW8gb3BlcmF0aW9ucy4gU3BlY2lmaWNhbGx5LCBJIHNlZSBpdCdzIHBva2luZyBhcm91bmQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLiBUaG9zZSBhbGwgc2NyZWFtIFwiaHVnZSBwYWdlIG1hbmFnZW1lbnRcIiB0byBtZS5cblxuQnV0IHRoZXJlJ3Mgc29tZXRoaW5nIGVsc2UuLi4gaXQgYWxzbyBtZW50aW9ucyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIHdpdGhpbiBgbW0vc3dhcF9zdGF0ZS5jYC4gVGhhdCBmdW5jdGlvbidzIGludm9sdmVkIGluIHN3YXBwaW5nLCBidXQgaXQncyAqc3RhdGljKiB3aXRoaW4gdGhhdCBmaWxlLCB3aGljaCBtYWtlcyBtZSBjdXJpb3VzLiBJJ20gZ29pbmcgdG8gcXVpY2tseSBjaGVjayB0aGF0IGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbiwgYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3Mgc3RhdGljIGlzIHBvdGVudGlhbGx5IHNpZ25pZmljYW50LiBJdCBjb3VsZCBtZWFuIHRoaXMgcGF0Y2ggaXMgbW9yZSB0YXJnZXRlZCB0aGFuIGl0IGluaXRpYWxseSBzZWVtcy4gSSB3YW50IHRvIHVuZGVyc3RhbmQgKndoeSogaXQncyB0b3VjaGluZyBhIHN0YXRpYyBmdW5jdGlvbiB3aXRoaW4gYSBzd2FwcGluZyBjb250ZXh0IGFsb25nc2lkZSBodWdlIHBhZ2Ugc3BsaXR0aW5nLCBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyB2ZXJ5IGludGVyZXN0aW5nIGhhcHBlbmluZy4gSXMgdGhlcmUgYSBjb25uZWN0aW9uIEknbSBtaXNzaW5nPyBUaGF0IGZ1bmN0aW9uJ3MgZGVzaWduIGNvdWxkIGJlIGltcG9ydGFudCBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTEzNSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE0OjM5LjA5MTM5NzAxOFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDc1ODE4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9zd2FwX3N0YXRlLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmMtMzQ3LS8qKlxcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXFxubW0vc3dhcF9zdGF0ZS5jLTM0OS0gKiBAY2k6IFRoZSBsb2NrZWQgc3dhcCBjbHVzdGVyLlxcbi0tXFxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cXG5tbS9zd2FwX3N0YXRlLmM6MzYxOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwX3N0YXRlLmMtMzYyLVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6MzkuMTQ2MTU5NDg2WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDEwNjUyNDc5NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDpcblxuKipEaWdnaW5nIGludG8gU3dhcCBDYWNoZSBSZXBsYWNlbWVudCoqXG5cbk9rYXksIHNvIEknbSBkZWFsaW5nIHdpdGggYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBhbmQgSSdtIHByZXR0eSBzdXJlIGl0J3MgYSBnbG9iYWwgZnVuY3Rpb24sIGJ1dCBJIGRvbid0IHJlY2FsbCBzZWVpbmcgaXQgZXhwb3J0ZWQgYW55d2hlcmUuIFRoYXQgbWFrZXMgbWUgdGhpbmsgaXQncyBsaWtlbHkgaW50ZXJuYWwgdG8gdGhlIHN3YXAgY2FjaGUgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIGZhaXIgZW5vdWdoLiBUbyBjb25maXJtIHRoaXMgYW5kIHRvIHVuZGVyc3RhbmQgaXRzIHVzZSwgSSBzaG91bGQgcHJvYmFibHkgdGFrZSBhIGxvb2sgYXQgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgc3dhcCBzdGF0ZSBtYW5hZ2VtZW50LiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjaGVjayBgbW0vc3dhcF9zdGF0ZS5jYCBmb3IgdGhlIGRlZmluaXRpb24gYW5kIGFueSByZWxhdGVkIGNhbGxzIHRvIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRoYXQncyB3aGVyZSBJJ2xsIGdldCB0aGUgcmVhbCBzdG9yeS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU3MDEsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDo0My4yNTI2ODk0ODJaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgxOTgyNTI4LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL2xpbnV4L3N3YXAuaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6NDMuMzM0NjgxNzFaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODE0NDE5NzM4MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgbW0vc3dhcC5oYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIHN3YXAgaW1wbGVtZW50YXRpb24uIE15IGluaXRpYWwgZm9jdXMgaXMgYWx3YXlzIG9uIHRoZSBoZWFkZXIgZmlsZXPigJRgbW0vc3dhcC5oYCBpbiB0aGlzIGNhc2UuIEkgd2FudCB0byBxdWlja2x5IHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb3JlIGRlZmluZXMgaW52b2x2ZWQuIEknbSBsb29raW5nIGZvciB0aGUgZm91bmRhdGlvbmFsIGJ1aWxkaW5nIGJsb2NrczogdGhlIGBzd2FwX2VudHJ5X3RgIHBlcmhhcHMsIGFueSByZWxldmFudCBwYWdlIGZsYWdzLCBhbmQgcG90ZW50aWFsbHkgdGhlIGludGVyZmFjZXMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIHN3YXAgc3BhY2UgaXRzZWxmLiBBcmUgdGhlcmUgYW55IG5ldyBBUElzIGludHJvZHVjZWQgc2luY2UgdGhlIGxhc3QgdGltZSBJIHJlYWxseSBkaXNzZWN0ZWQgdGhpcyBjb2RlPyBBbnkgcmVjZW50IGNoYW5nZXMgaW4gaG93IHN3YXAgZW50cmllcyBhcmUgbWFuYWdlZCwgb3IgaG93IHRoZSBiYWNraW5nIHN0b3JlIGlzIGRlZmluZWQ/IEkgbmVlZCBhIGNsZWFyIG1lbnRhbCBtb2RlbCBvZiB0aGUga2V5IGFic3RyYWN0aW9ucyBiZWZvcmUgSSBkZWx2ZSBkZWVwZXIgaW50byB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gTGV0J3Mgc2VlIHdoYXQgYG1tL3N3YXAuaGAgcmV2ZWFscy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU5NDgsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDo1MS40Nzg4ODM2MzJaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU3MDU1MTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL3N3YXAuaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwLmg9MzQyPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXAuaC0zNDMtXFx0XFx0XFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LCB2b2lkICpzaGFkb3cpO1xcbm1tL3N3YXAuaDozNDQ6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXAuaC0zNDUtXFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KTtcXG4tLVxcbm1tL3N3YXAuaD00NzY9c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4tLVxcbm1tL3N3YXAuaC00ODAtXFxubW0vc3dhcC5oOjQ4MTpzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtNDgyLVxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6NTEuNTM1OTQzMzAxWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3MTYyODM5NDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBTd2FwIENhY2hlIFJlcGxhY2VtZW50IEZvbGlvIEZ1bmN0aW9uKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBmdW5jdGlvbi4gSSBzZWUgaXQncyBkZWZpbmVkIGluIGBtbS9zd2FwLmhgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdGhlIGNvcmUgbG9naWMsIHNvIEknbSBnb2luZyB0byB6ZXJvIGluIG9uIHRoZXNlIGZ1bmN0aW9uczogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGFuZCBuYXR1cmFsbHksIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgcGllY2VzIGZpdCB0b2dldGhlci5cblxuTXkgbmV4dCBzdGVwIGlzIHRvIHNlZSBpZiBhbnkgc3BlY2lmaWMga2VybmVsIGNvbmZpZ3VyYXRpb25zIGFyZSBwcmVyZXF1aXNpdGVzLiBJJ20gbm90aW5nIHRoYXQgdGhlIGNvZGUgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHdoaWNoLCBmcm9tIG1lbW9yeSwgaXMgY29tcGlsZWQgd2hlbiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlbmFibGVkLiBJIHNob3VsZCBkb3VibGUgY2hlY2sgdGhpcyBieSByZWZlcmVuY2luZyBgbW0vTWFrZWZpbGVgIHRvIGNvbmZpcm0gdGhlIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgZW5zdXJlIEkgZnVsbHkgdW5kZXJzdGFuZCB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uIEdvdHRhIG1ha2Ugc3VyZSBJJ20gbm90IG1pc3NpbmcgYW55dGhpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NDAwLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTM2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE0OjU2LjI1MjIzMDkzOVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzYyOTA5NzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaHVnZV9tZW1vcnkub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDo1Ni4zMjg1MjYxMzdaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzYzNzg5NjE1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIEtlcm5lbCBDb25maWd1cmF0aW9uIERlcGVuZGVuY2llcyoqXG5cbkFscmlnaHQsIHNvIHRoZSBkaXNjdXNzaW9uIGhhcyBjbGVhcmx5IGVzdGFibGlzaGVkIHRoYXQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBub24tbmVnb3RpYWJsZSBoZXJlLiBUaGF0J3MgYSBnaXZlbi4gQnV0IG5vdywgSSBuZWVkIHRvIGRlbHZlIGEgYml0IGRlZXBlciBhbmQgbG9vayBhdCB0aGUgZGVwZW5kZW5jaWVzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LiBNeSBuZXh0IHRob3VnaHQgaXMgYXJvdW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBJIGtub3cgaXQncyBjb21waWxlZCB3aGVuIGBDT05GSUdfU1dBUGAgaXMgZW5hYmxlZCwgYnV0IEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIGFuZCB3aGF0IGl0cyBwb3RlbnRpYWwgcmVsZXZhbmNlIGlzIGluIHRoaXMgc3BlY2lmaWMgc2NlbmFyaW8uIEl0J3MgdGltZSB0byBkaWcgaW50byB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIGFuZCBzd2FwLCBhbmQgZW5zdXJlIG5vdGhpbmcgZ2V0cyBtaXNzZWQuIFRoaXMgZmVlbHMgbGlrZSBhIGNvcmUgcGllY2UgSSBuZWVkIHRvIGdldCBhIGZpcm0gZ3Jhc3Agb24sIHRvIGJlIHN1cmUgSSBhbSBub3QgbWlzc2luZyBhbnkgY3JpdGljYWwgcGllY2VzIGluIHRoZSBkZXNpZ24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2ODgyLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6NTkuOTY2NDI2MDM2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3OTI2NTk5NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzd2FwX3N0YXRlLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vTWFrZWZpbGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9NzY9ZW5kaWZcXG5tbS9NYWtlZmlsZS03Ny1cXG5tbS9NYWtlZmlsZTo3ODpvYmotJChDT05GSUdfU1dBUClcXHQrPSBwYWdlX2lvLm8gc3dhcF9zdGF0ZS5vIHN3YXBmaWxlLm9cXG5tbS9NYWtlZmlsZS03OS1vYmotJChDT05GSUdfWlNXQVApXFx0Kz0genN3YXAub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNTowMC4wNDU2OTYxNjNaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTQwODc4NDcxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHVuZGVyc3RhbmRpbmcsIHRoaW5raW5nIHRocm91Z2ggdGhpcyBsaWtlIEkgd291bGQ6XG5cbioqRXhhbWluaW5nIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzIGZvciBGb2xpby1SZWxhdGVkIENvZGUqKlxuXG5BbHJpZ2h0LCBzbyBJIHNlZSB3ZSdyZSBkZWFsaW5nIHdpdGggYFNXQVBgIGFnYWluLCBqdXN0IGxpa2UgSSBzdXNwZWN0ZWQuIEdvdHRhIG1ha2Ugc3VyZSB0aGF0J3MgYWNjb3VudGVkIGZvci4gSSdtIGdvaW5nIHRvIHF1aWNrbHkgc2NhbiBmb3Igb3RoZXIgcG90ZW50aWFsIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzIHRoYXQgdGhpcyBwYXRjaCBtaWdodCB0b3VjaC4gVGhlIGNvZGUgcmVmZXJlbmNlcyBgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pYCBhbmQgYGZvbGlvX3Rlc3RfYW5vbihmb2xpbylgLiBUaGF0IG5hcnJvd3MgaXQgZG93biBwcmV0dHkgY2xlYXJseSwgaXQgbG9va3MgbGlrZSBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYENPTkZJR19TV0FQYCBhcmUgdGhlIHByaW1hcnkgY29uZmlndXJhdGlvbnMgaW4gcGxheSBoZXJlLiBJJ20gY29uZmlkZW50IHRoYXQgdGhlc2UgYXJlIHRoZSB0d28gbWFpbiBkcml2ZXJzIG9mIHRoZSBjaGFuZ2VzLiBOb3csIGxldCdzIGp1c3QgZG8gYSBxdWljayBjcm9zcy1yZWZlcmVuY2UgdG8gYmUgY2VydGFpbjogSSdtIGdvaW5nIHRvIGxvb2sgZm9yIHBsYWNlcyB3aGVyZSBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIGlzIGNhbGxlZC4gVGhhdCBzaG91bGQgZWl0aGVyIGNvbmZpcm0gdGhlIGRlcGVuZGVuY3kgb3IgbWF5YmUgc2hvdyB1cyBpZiB0aGVyZSBpcyBhbnl0aGluZyBlbHNlIHdlIG5lZWQgdG8gaW5jbHVkZS4gSSBqdXN0IHdhbnQgdG8gYmUgdGhvcm91Z2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3MjExLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MDUuNDU0NDgzOTcyWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDc4ODc2OTExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MDM9aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVxcdFxcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwNTppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA2LXVuc2lnbmVkIGludCBtaW5fb3JkZXJfZm9yX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00Mjg3PXN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00MzU1LS8qKlxcbm1tL2h1Z2VfbWVtb3J5LmM6NDM1NjogKiBmb2xpb19zcGxpdF91bm1hcHBlZCgpIC0gc3BsaXQgYSBsYXJnZSBhbm9uIGZvbGlvIHRoYXQgaXMgYWxyZWFkeSB1bm1hcHBlZFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM1Ny0gKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQzNzYtICovXFxubW0vaHVnZV9tZW1vcnkuYzo0Mzc3OmludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM3OC17XFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jPTkxMj1zdGF0aWMgaW50IG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBtaWdyYXRlX3ZtYSAqbWlncmF0ZSxcXG4tLVxcbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTI2LVxcdHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3MobWlncmF0ZS1cXHUwMDNldm1hLCBhZGRyLCB0cnVlKTtcXG5tbS9taWdyYXRlX2RldmljZS5jOjkyNzpcXHRyZXQgPSBmb2xpb19zcGxpdF91bm1hcHBlZChmb2xpbywgMCk7XFxubW0vbWlncmF0ZV9kZXZpY2UuYy05MjgtXFx0aWYgKHJldClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MDcuOTMzMzY2NzQzWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY2ODQ1MDE4NjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjb2RlIHNuaXBwZXQsIGRpc3RpbGxlZCBpbnRvIGEgZmlyc3QtcGVyc29uIHBlcnNwZWN0aXZlLCBhcyBpdCByZWxhdGVzIHRvIG15IGV4cGVydGlzZTpcblxuKipNeSBVbmRlcnN0YW5kaW5nIG9mIEZvbGlvIFNwbGl0dGluZyBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJIHNlZSBhIGNsZWFyIHJlbGF0aW9uc2hpcCBlbWVyZ2luZyBiZXR3ZWVuIHRoZXNlIGZvbGlvIHNwbGl0dGluZyBmdW5jdGlvbnMuIEl0IGxvb2tzIGxpa2UgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyBhIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIGEgZm9saW8gc3BsaXQsIGludm9rZWQgd2l0aGluIHRoZSBicm9hZGVyIGNvbnRleHQgb2YgZGV2aWNlIG1pZ3JhdGlvbiAoYG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCkgaW4gdGhlIGBtbS9taWdyYXRlX2RldmljZS5jYCBmaWxlLiBUaGlzIHRlbGxzIG1lIHRoaXMgc3BsaXQgaXMgZm9yIHVubWFwcGVkIGZvbGlvcyBpbnZvbHZlZCBpbiBkZXZpY2UgbWlncmF0aW9uLCBsaWtlbHkgZW5zdXJpbmcgZGF0YSBpbnRlZ3JpdHkgYW5kIGNvcnJlY3QgaGFuZGxpbmcgb2YgcGFnZSBvd25lcnNoaXAgZHVyaW5nIHRoZSBwcm9jZXNzLCBnaXZlbiB0aGUgbWlncmF0aW9uIGNvbnRleHQuXG5cblRoZW4sIHRoZXJlJ3MgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGlzIG9uZSBpcyBpbnRlcmVzdGluZyBiZWNhdXNlIGl0J3MgY2FsbGVkIGZyb20gYSB3aWRlIGFycmF5IG9mIHBsYWNlcy4gVGhhdCBtYWtlcyBtZSB0aGluayBpdCdzIHRoZSBjb3JlLCBsb3ctbGV2ZWwgZnVuY3Rpb24gZm9yIGFjdHVhbGx5IGRvaW5nIHRoZSBzcGxpdHRpbmcsIHBvdGVudGlhbGx5IGhhbmRsaW5nIHRoZSBwaHlzaWNhbCBwYWdlIG1hbmlwdWxhdGlvbnMgYW5kIGxpc3QgbWFuYWdlbWVudCBpbnZvbHZlZCBpbiB0cmFuc2Zvcm1pbmcgYSBodWdlIHBhZ2UgaW50byBhIHNldCBvZiBzbWFsbGVyLCBvcmRlcmVkIGZvbGlvcy4gVGhlIFwidG9fbGlzdF90b19vcmRlclwiIHBhcnQgZGVmaW5pdGVseSBoaW50cyBhdCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBzbWFsbGVyIGZvbGlvcyBpbiB0aGUgY29ycmVjdCBvcmRlciBmb3IgbGF0ZXIgcmVhc3NlbWJseSBvciBvdGhlciBvcGVyYXRpb25zLCBzbyBpdCdzIGEgY3JpdGljYWwgcGllY2Ugb2YgdGhlIHB1enpsZS5cblxuRmluYWxseSwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGFwcGVhcnMgdG8gYmUgYSBwcmVyZXF1aXNpdGUgY2hlY2suIEl0J3MgY2FsbGVkIGJlZm9yZSBhbnkgYWN0dWFsIHNwbGl0dGluZyBpcyBkb25lLCBmcm9tIGJvdGggdGhlIGdlbmVyYWwgc3BsaXR0aW5nIGZ1bmN0aW9uIGBfX2ZvbGlvX3NwbGl0YCBhbmQgZnJvbSB0aGUgcHJvY2Vzcy1zcGVjaWZpYyBodWdlIHBhZ2Ugc3BsaXR0aW5nIGZ1bmN0aW9uIGBzcGxpdF9odWdlX3BhZ2VzX3BpZGAuIFRoYXQgcG9pbnRzIHRvIHRoaXMgY2hlY2sgYmVpbmcgYWJvdXQgZGV0ZXJtaW5pbmcgaWYgYSBmb2xpbyAqY2FuKiBiZSBzcGxpdC4gVGhpcyBjb3VsZCBiZSBjaGVja2luZyB0aGluZ3MgbGlrZSB3aGV0aGVyIGl0J3MgbG9ja2VkLCB3aGV0aGVyIGl0J3MgYSB2YWxpZCBjYW5kaWRhdGUgZm9yIHNwbGl0dGluZyBnaXZlbiBpdHMgY3VycmVudCBzdGF0ZSwgYW5kIHBvdGVudGlhbGx5IG90aGVyIGNvbnN0cmFpbnRzLiBUaGUgZmFjdCB0aGF0IGl0J3MgY2FsbGVkIGZyb20gdGhvc2UgdHdvIGZ1bmN0aW9ucyBtZWFucyBpdCBpcyB1bml2ZXJzYWxseSBhcHBsaWNhYmxlIGFuZCBsaWtlbHkgZW5mb3JjZXMgbmVjZXNzYXJ5IGludmFyaWFudHMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYnJlYWsgYSBodWdlIHBhZ2UgZG93bi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc5NzIsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNToxNC42MTc4NzQ4OTZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzNTUwNTEwMjUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZm9saW9fY2hlY2tfc3BsaXR0YWJsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDA3PWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwODppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwOS1cXHRcXHRcXHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTM4MDc9c3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zODcyLS8qKlxcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg3MzogKiBmb2xpb19jaGVja19zcGxpdHRhYmxlKCkgLSBjaGVjayBpZiBhIGZvbGlvIGNhbiBiZSBzcGxpdCB0byBhIGdpdmVuIG9yZGVyXFxubW0vaHVnZV9tZW1vcnkuYy0zODc0LSAqIEBmb2xpbzogZm9saW8gdG8gYmUgc3BsaXRcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3OS0gKlxcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg4MDogKiBmb2xpb19jaGVja19zcGxpdHRhYmxlKCkgY2hlY2tzIGlmIEBmb2xpbyBjYW4gYmUgc3BsaXQgdG8gQG5ld19vcmRlciB1c2luZ1xcbm1tL2h1Z2VfbWVtb3J5LmMtMzg4MS0gKiBAc3BsaXRfdHlwZSBtZXRob2QuIFRoZSB0cnVuY2F0ZWQgZm9saW8gY2hlY2sgbXVzdCBjb21lIGZpcnN0Llxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zODg3LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg4ODppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg4OS1cXHRcXHRcXHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDI4Nz1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDMxMC1cXG5tbS9odWdlX21lbW9yeS5jOjQzMTE6XFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcXG5tbS9odWdlX21lbW9yeS5jLTQzMTItXFx0aWYgKHJldCkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNToxNi45NzI5MzE3NjFaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY2Nzg1ODMwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgY29kZSBpbnRlcmFjdGlvbnMuXG5cbioqVGhpbmtpbmcgVGhyb3VnaCBGb2xpbyBTcGxpdHRpbmcqKlxuXG5SaWdodCwgc28gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGdldHMgaW52b2tlZCBieSBgX19mb2xpb19zcGxpdGAsIHdoaWNoIG1ha2VzIHBlcmZlY3Qgc2Vuc2UuIE5vdyBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUgY3JpdGljYWwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhpcyBzcGxpdHRpbmcgcHJvY2Vzcy4gSSdtIGZvY3VzaW5nIG9uIHRoZXNlIGtleSBzeW1ib2xzOiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRob3NlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMuXG5cbkhhbmcgb24gYSBzZWNvbmTigKYgSSdtIGp1c3QgcmVjYWxsaW5nIHRoYXQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCdzIGNhbGwgZ3JhcGggbWlnaHQgYmUgbW9yZSBsaW1pdGVkIHRoYW4gSSBpbml0aWFsbHkgdGhvdWdodC4gSXQgbG9va3MgbGlrZSBpdCdzIHByaW1hcmlseSBjYWxsZWQgZnJvbSBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYC4gSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY2FsbCBzaXRlcywganVzdCB0byBiZSBzdXJlLiBJdCBwYXlzIHRvIGJlIHRob3JvdWdoIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggbWVtb3J5IG1hbmFnZW1lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4OTcyLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE1OjIxLjY0MDgwNjRaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxODQyNjQ0ODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9Mzk1Nz1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00MDYxLVxcdFxcdGlmIChjaSlcXG5tbS9odWdlX21lbW9yeS5jOjQwNjI6XFx0XFx0XFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNDA2My1cXHR9XFxuLS1cXG5tbS9taWdyYXRlLmM9NTgzPXN0YXRpYyBpbnQgX19mb2xpb19taWdyYXRlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5tbS9taWdyYXRlLmMtNjU2LVxcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxubW0vbWlncmF0ZS5jOjY1NzpcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld2ZvbGlvKTtcXG5tbS9taWdyYXRlLmMtNjU4LVxcdGVsc2VcXG4tLVxcbm1tL3NobWVtLmM9MjA4OD1zdGF0aWMgaW50IHNobWVtX3JlcGxhY2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBnZnBfdCBnZnAsXFxuLS1cXG5tbS9zaG1lbS5jLTIxMjUtXFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrX2lycShvbGQpO1xcbm1tL3NobWVtLmM6MjEyNjpcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgb2xkLCBuZXcpO1xcbm1tL3NobWVtLmMtMjEyNy1cXHRtZW1fY2dyb3VwX3JlcGxhY2VfZm9saW8ob2xkLCBuZXcpO1xcbi0tXFxubW0vc3dhcC5oPTM0Mj12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzQzLVxcdFxcdFxcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTtcXG5tbS9zd2FwLmg6MzQ0OnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzQ1LVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldyk7XFxuLS1cXG5tbS9zd2FwLmg9NDc2PXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLS1cXG5tbS9zd2FwLmgtNDgwLVxcbm1tL3N3YXAuaDo0ODE6c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxubW0vc3dhcC5oLTQ4Mi1cXHRcXHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmM9MzM1PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYy0zNDctLyoqXFxubW0vc3dhcF9zdGF0ZS5jOjM0ODogKiBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyAtIFJlcGxhY2UgYSBmb2xpbyBpbiB0aGUgc3dhcCBjYWNoZS5cXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmMtMzYwLSAqL1xcbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXBfc3RhdGUuYy0zNjItXFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNToyMy44MjUwNzg2MVoiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NzQ3MDUzMTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIEZvbGlvIFNwbGl0dGluZyBhbmQgU3dhcCBPcGVyYXRpb25zKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCDigJMgdGhhdCdzIGRlZmluaXRlbHkgYSBnbG9iYWwgc3ltYm9sLCBleHBvcnRlZCBmcm9tIGBtbS9zd2FwX3N0YXRlLmNgLiBHb29kIHRvIGtub3cuIE5vdywgbGV0J3Mgc2VlIHdoYXQgZWxzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIGluIHRlcm1zIG9mIGNvbmZpZ3VyYXRpb25zLlxuXG5IbW0sIGBDT05GSUdfREVWSUNFX01JR1JBVElPTmAgaXMgdGllZCB0byBgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW9gLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmb2xpb19zcGxpdF91bm1hcHBlZGAuIEJ1dCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIHJlc2lkZXMgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCwgYW5kIHRoYXQncyBjb21waWxlZCB3aXRoIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBTbywgaXQgbG9va3MgbGlrZSBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgYXJlIHRoZSBiaWcgb25lcyBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5LiBNYWtlcyBzZW5zZS5cblxuQWxyaWdodCwgbGV0J3MgcXVpY2tseSByZXZpZXcgdGhlIGludGVybmFscy4gYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAgYXJlIHN0YXRpYyBmdW5jdGlvbnMg4oCTIG5vdCB2ZXJ5IGhlbHBmdWwgYXMgZGlyZWN0IGVudHJ5IHBvaW50cyBmb3IgYW5hbHlzaXMuIEhvd2V2ZXIsIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBzZWVtcyB0byBiZSB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3Igc3BsaXR0aW5nLiBUaGVuLCB3ZSBoYXZlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYXMgYW5vdGhlciBwb3RlbnRpYWwgZW50cnkgcG9pbnQuXG5cbkkgbGlrZSBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAgYXMgYSBmb2N1cyBzeW1ib2w7IHRoYXQgc2VlbXMgbGlrZSBhIGdvb2QgcGxhY2UgdG8gZGlnIGluLiBBbmQsIGFzIGEgcmVtaW5kZXIsIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgaXMgYWxzbyBhIHNvbGlkIG9wdGlvbiwgZ2l2ZW4gaXRzIGdsb2JhbCBuYXR1cmUuXG5cbkp1c3QgZ29pbmcgdG8gZG91YmxlLWNoZWNrIHRob3NlIGNvbmZpZ3MgYWdhaW4uLi5hbHdheXMgYSBnb29kIGlkZWEgdG8gY29uZmlybS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAwNTYsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MjkuNTcyMTM1ODM5WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTIxMjQ1OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTgzMT1jb25maWcgTU1fSURcXG4tLVxcbm1tL0tjb25maWctODMzLVxcbm1tL0tjb25maWc6ODM0Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTgzNS1cXHRib29sIFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XFxcIlxcbi0tXFxubW0vS2NvbmZpZz04NTI9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg1Ny1cXG5tbS9LY29uZmlnOjg1ODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NTktXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NjQtXFxubW0vS2NvbmZpZzo4NjU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg2Ni1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzMtXFxubW0vS2NvbmZpZzo4NzQ6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04NzUtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg4MT1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODkwLVxcbm1tL0tjb25maWc6ODkxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy04OTItXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwMC1cXG5tbS9LY29uZmlnOjkwMTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTkwMi1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwOC1cXG5tbS9LY29uZmlnOjkwOTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTEwLVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MTYtXFxubW0vS2NvbmZpZzo5MTc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05MTgtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZz05MjY9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTkzNS1cXG5tbS9LY29uZmlnOjkzNjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxcbm1tL0tjb25maWctOTM3LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NDQtXFxubW0vS2NvbmZpZzo5NDU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05NDYtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NTItXFxubW0vS2NvbmZpZzo5NTM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTk1NC1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTYwLVxcbm1tL0tjb25maWc6OTYxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTYyLVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MjkuNjMzMzU0Mzg4WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ2MjQ2NTY4MjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKlF1aWNrIENvbmZpZ3VyYXRpb24gQ2hlY2sqKlxuXG5BbHJpZ2h0LCBsZXQncyBzZWUsIGdvaW5nIG92ZXIgdGhlIHN5c3RlbSBzZXR1cC4gSSBzZWUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBkZWZpbml0ZWx5IGZsYWdnZWQgaW4gdGhlIGNvbmZpZy4gT2theSwgdGhhdCdzIGV4cGVjdGVkLCBidXQgYWx3YXlzIGdvb2QgdG8gY29uZmlybS4gVGhlbiwgdGhlcmUncyBgU1dBUGAsIHdoaWNoIGlzIGFub3RoZXIga2V5IHBhcmFtZXRlci4gTmVlZCB0byBjb25zaWRlciBob3cgdGhhdCBwbGF5cyBpbnRvIGV2ZXJ5dGhpbmcuIEknbGwgbmVlZCB0byBrZWVwIHRoYXQgaW4gbWluZCB3aGVuIGV4YW1pbmluZyB0aGUgb3RoZXIgc2V0dGluZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNDE5LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MzQuMjU4MDE0NzU4WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NTI5OTcyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgU1dBUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9OT1jb25maWcgQVJDSF9OT19TV0FQXFxuLS1cXG5tbS9LY29uZmlnLTExLVxcbm1tL0tjb25maWc6MTI6bWVudWNvbmZpZyBTV0FQXFxubW0vS2NvbmZpZy0xMy1cXHRib29sIFxcXCJTdXBwb3J0IGZvciBwYWdpbmcgb2YgYW5vbnltb3VzIG1lbW9yeSAoc3dhcClcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE1OjM0LjMyMzMyMDIyNloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2NjAxMDgxMjY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgVGhpcyBQYXRjaCoqXG5cbk9rYXksIHNvIEkgc2VlIHRoYXQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFNXQVBgIGFyZSBkZWZpbml0ZWx5IHJlbGV2YW50IGhlcmU7IHRob3NlIGFyZSB0aGUga2V5IGNvbmZpZ3VyYXRpb24gZmxhZ3Mgd2UgbmVlZCB0byBrZWVwIGluIG1pbmQuIExldCdzIGJyZWFrIGRvd24gdGhlIGNyaXRpY2FsIHN5bWJvbHMgdGhhdCBqdW1wIG91dCB0byBtZTogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaG9zZSBhcmUgdGVsbGluZy5cblxuVGhlIGNoYW5nZXMgYXJlLCB3aXRob3V0IGEgZG91YnQsIGZ1bmN0aW9uYWwgYW5kIGRyaWxsaW5nIGRvd24gaW50byB0aGUgaGVhcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQuIFRoYXQncyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIFRoZSBmYWN0IHRoYXQgdXNlcnNwYWNlIGNhbiB0cmlnZ2VyIHRoZXNlIGNoYW5nZXMgdGhyb3VnaCBgbWFkdmlzZWAsIGBtYmluZGAsIG9yIGV2ZW4ganVzdCBwbGFpbiBvbGQgbWVtb3J5IGFsbG9jYXRpb24gYW5kIHN3YXBwaW5nIHNlYWxzIHRoZSBkZWFsLiBXZSdyZSB0YWxraW5nIGFib3V0IGEgc3Vic3RhbnRpYWwgYXR0YWNrIHN1cmZhY2UuXG5cblRoaXMgcGF0Y2ggcmVmYWN0b3JzIHRoZSBzcGxpdHRpbmcgb2YgZm9saW9zLCBlc3BlY2lhbGx5IGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSSdtIHNlZWluZyB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBuZXcgZnVuY3Rpb25zIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVgIGFuZCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGVgLCB3aGljaCB0ZWxscyBtZSBpdCdzIGhhbmRsaW5nIHRoZSBzcGxpdHRpbmcgcHJvY2VzcyBkaXJlY3RseSwgYW5kIGNoYW5nZXMgdG8gdGhlIGNvbmRpdGlvbnMgaW4gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLiBUaGUgZmFjdCB0aGF0IHRoZXNlIGFyZSB0b3VjaGluZyB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCB3aXRoIFRIUCBhbmQgc3dhcCBtYWtlcyB0aGlzIGNyaXRpY2FsLiBHaXZlbiB0aGUgdXNlcnNwYWNlIHJlYWNoLCBmdXp6aW5nIHRoaXMgaXMgYWJzb2x1dGVseSBqdXN0aWZpZWQuIEl0J3MgYSBjbGVhciBjYW5kaWRhdGUgZm9yIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cblRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTY1NSwiT3V0cHV0VG9rZW5zIjoxNjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNDEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6NDAuOTI0NDAzMzkyWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE3NzM1ODg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6NDEuMDQyMTQ2Mzc5WiIsIlNlcSI6MjksIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTIyMzA0MzA3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE1OjQxLjA0MjczNzEyOVoiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxMTIyMjQ0NjUzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxcblxcblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNWFlNzBmN2EyNjc5MzdiNWVhYmNkMTk2ZmZmNTJlMjQ3OWQwY2QyZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDEyIDIwOjE0OjIyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGNlZDQwMGY3MmQ0M2EuLjFjNjFiN2QzOWNkMDMgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtMzU4OSw5ICszNTg5LDYgQEAgc3RhdGljIHZvaWQgcmVtYXBfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yLCBpbnQgZmxhZ3MpXG4ge1xuIFx0aW50IGkgPSAwO1xuIFxuLVx0LyogSWYgdW5tYXBfZm9saW8oKSB1c2VzIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSwgcmVtb3ZlIHRoaXMgY2hlY2sgKi9cbi1cdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbi1cdFx0cmV0dXJuO1xuIFx0Zm9yICg7Oykge1xuIFx0XHRyZW1vdmVfbWlncmF0aW9uX3B0ZXMoZm9saW8sIGZvbGlvLCBUVFVfUk1BUF9MT0NLRUQgfCBmbGFncyk7XG4gXHRcdGkgKz0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuQEAgLTM2MzQsNiArMzYzMSwxOCBAQCBzdGF0aWMgYm9vbCBwYWdlX3JhbmdlX2hhc19od3BvaXNvbmVkKHN0cnVjdCBwYWdlICpwYWdlLCBsb25nIG5yX3BhZ2VzKVxuIFx0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbisvKipcbisgKiBmb3JfZWFjaF9mb2xpb19zYWZlIC0gaXRlcmF0ZSBvdmVyIGNvbnRpZ3VvdXMgZm9saW9zIHNhZmUgYWdhaW5zdCBmb2xpbyBmcmVlXG4rICogQHN0YXJ0OiB0aGUgZmlyc3QgZm9saW8gdG8gaXRlcmF0ZVxuKyAqIEBlbmQ6IHNlbnRpbmVsLCBmb2xpb19uZXh0KCkgb2YgdGhlIGxhc3QgZm9saW8gdG8gaXRlcmF0ZVxuKyAqIEBzdWJfZm9saW86IHN0cnVjdCBmb2xpbyAqIHRvIHVzZSBhcyB0aGUgbG9vcCBjdXJzb3JcbisgKiBAbmV4dDogc3RydWN0IGZvbGlvICogdXNlZCBhcyB0ZW1wb3Jhcnkgc3RvcmFnZVxuKyAqL1xuKyNkZWZpbmUgZm9yX2VhY2hfZm9saW9fc2FmZShzdGFydCwgZW5kLCBzdWJfZm9saW8sIG5leHQpIFxcXG4rXHRmb3IgKHN1Yl9mb2xpbyA9IChzdGFydCksIG5leHQgPSBmb2xpb19uZXh0KHN1Yl9mb2xpbyk7IFxcXG4rXHQgICAgIHN1Yl9mb2xpbyAhPSAoZW5kKTsgXFxcbitcdCAgICAgc3ViX2ZvbGlvID0gbmV4dCwgbmV4dCA9IGZvbGlvX25leHQobmV4dCkpXG4rXG4gLypcbiAgKiBJdCBzcGxpdHMgQGZvbGlvIGludG8gQG5ld19vcmRlciBmb2xpb3MgYW5kIGNvcGllcyB0aGUgQGZvbGlvIG1ldGFkYXRhIHRvXG4gICogYWxsIHRoZSByZXN1bHRpbmcgZm9saW9zLlxuQEAgLTM3NTUsOCArMzc2NCw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiB9XG4gXG4gLyoqXG4tICogX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIC0gc3BsaXRzIGFuIHVubWFwcGVkIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MgaW5cbi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cbisgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIC0gc3BsaXRzIGEgZnJvemVuIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3NcbisgKiBpbiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cbiAgKiBAZm9saW86IHRoZSB0by1iZS1zcGxpdCBmb2xpb1xuICAqIEBuZXdfb3JkZXI6IHRoZSBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXIgc3BsaXQgZm9saW9zIChzaW5jZSBidWRkeVxuICAqICAgICAgICAgICAgIGFsbG9jYXRvciBsaWtlIHNwbGl0IGdlbmVyYXRlcyBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbSBAZm9saW8nc1xuQEAgLTM3OTUsMTEgKzM4MDQsMTIgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuICAqIFJldHVybjogMCAtIHN1Y2Nlc3NmdWwsIFx1MDAzYzAgLSBmYWlsZWQgKGlmIC1FTk9NRU0gaXMgcmV0dXJuZWQsIEBmb2xpbyBtaWdodCBiZVxuICAqIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlciwgdGhlIGNhbGxlciBuZWVkcyB0byBjaGVjaylcbiAgKi9cbi1zdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbitzdGF0aWMgaW50IF9fc3BsaXRfZnJvemVuX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4gXHRcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4gXHRjb25zdCBib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuK1x0Y29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0aW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxO1xuIFx0c3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbztcbkBAIC0zODE0LDggKzM4MjQsOCBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdCAgICAgc3BsaXRfb3JkZXItLSkge1xuIFx0XHRpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCBcdTAwM2NcdTAwM2MgKG9sZF9vcmRlciAtIHNwbGl0X29yZGVyKTtcbiBcbi1cdFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuLVx0XHRpZiAoaXNfYW5vbiBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbitcdFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbitcdFx0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4gXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdGlmIChtYXBwaW5nKSB7XG5AQCAtMzg3OCwzMiArMzg4OCwyNiBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbitcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbitcbiBcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0LypcbiBcdCAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlXG4tXHQgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLlxuLVx0ICpcbi1cdCAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZVxuLVx0ICogc3dhcGNhY2hlIChzaG1lbSBvciB0by1iZS1hbm9uIGZvbGlvcykuXG4rXHQgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW9cbitcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxuIFx0ICovXG4tXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuK1x0aWYgKCFmb2xpby1cdTAwM2VtYXBwaW5nIFx1MDAyNlx1MDAyNiAhaXNfc3dhcGNhY2hlKVxuIFx0XHRyZXR1cm4gLUVCVVNZO1xuIFxuLVx0Lyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqL1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbiBcdC8qXG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwXG4tXHQgKlxuLVx0ICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbVxuLVx0ICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueVxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIHNwbGl0LiBPbmx5IHVuaWZvcm0gc3BsaXQgdG8gb3JkZXItMCBjYW4gYmUgdXNlZFxuLVx0ICogaGVyZS5cbitcdCAqIE9yZGVyLTEgaXMgdW5zdXBwb3J0ZWQ6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciB0aGVcbitcdCAqIGRlZmVycmVkIHNwbGl0IGxpc3QsIGh5YnJpZCBzaG1lbSBcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxuK1x0ICogc3BsaXR0YWJsZSwgYW5kIGEgc3BsaXR0YWJsZSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvIGNvdWxkXG4rXHQgKiBiZSBlaXRoZXIgYW5vbiBvciBzaG1lbSwgd2hpY2ggd2UgY2Fubm90IHRlbGwgYXBhcnQuXG4gXHQgKi9cbi1cdGlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgXHUwMDI2XHUwMDI2IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xuK1x0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdH1cbiBcbiBcdGlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0zOTExLDM5ICszOTE1LDk3IEBAIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVCVVNZO1xuIFxuK1x0LypcbitcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXG4rXHQgKiBzaG1lbSBmb2xpbyB1bmRlciBTV0FQIElPLCBpdCdzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvclxuK1x0ICogc2htZW0gbWFwcGluZyBhZnRlcndhcmQuIFRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZyB0aGVtXG4rXHQgKiBoZW5jZSByZWplY3QgaXQgaGVyZSB1cCBmcm9udCBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcuXG4rXHQgKi9cbitcdGlmICghaXNfYW5vbiBcdTAwMjZcdTAwMjYgaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiBmb2xpby1cdTAwM2VtYXBwaW5nKVxuK1x0XHRyZXR1cm4gLUVCVVNZO1xuK1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLS8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHBhZ2VjYWNoZSBvciB0aGUgc3dhcGNhY2hlLiAqL1xuLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4rLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqL1xuK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbi1cdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuK1x0aWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4gXHRcdHJldHVybiAwO1xuIFx0cmV0dXJuIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbiB9XG4gXG4tc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBib29sIGRvX2xydSxcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSxcbi1cdFx0XHRcdFx0ICAgICBwZ29mZl90IGVuZCwgaW50ICpucl9zaG1lbV9kcm9wcGVkKVxuKy8qKlxuKyAqIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZSgpIC0gc3BsaXQgYW4gYW5vbiBvciBzd2FwIGNhY2hlIGZvbGlvXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWRcbisgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuKyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KVxuKyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxuKyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuKyAqIEBkb19scnU6IGlmIHRydWUsIGFkZCBhZnRlci1zcGxpdCBmb2xpb3MgdG8gQGxpc3QgaWYgbm9uIE5VTEwsIG90aGVyd2lzZSB0b1xuKyAqICAgICAgICAgIHRoZSBMUlUgbGlzdFxuKyAqIEBhbm9uX3VubWFwOiBpZiB0cnVlLCB1bm1hcCBAZm9saW8gYmVmb3JlIHRoZSBzcGxpdCBhbmQgcmVtYXAgaXQgYWZ0ZXJcbisgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxuKyAqXG4rICogSGVscGVyIGZvciBzcGxpdHRpbmcgYW4gYW5vbiBvciBzd2FwIGNhY2hlIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvICh1bmxlc3NcbisgKiBAYW5vbl91bm1hcCBpcyBmYWxzZSksIGZyZWV6ZXMgaXRzIHJlZmNvdW50LCBhbmQgcGVyZm9ybXMgdGhlIHNwbGl0LCB1cGRhdGVzXG4rICogdGhlIHN3YXAgY2FjaGUgZW50cmllcy4gU3BsaXQgZm9saW9zIGFyZSB1bmZyb3plbiBhbmQgcmVtYXBwZWQuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC5cbisgKi9cbitzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgYm9vbCBkb19scnUsIGJvb2wgYW5vbl91bm1hcCxcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbitcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuK1x0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbiBcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcdGJvb2wgZGVxdWV1ZV9kZWZlcnJlZDtcbiBcdGludCByZXQgPSAwO1xuIFxuLVx0Vk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nIFx1MDAyNlx1MDAyNiBlbmQpO1xuK1x0LypcbitcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxuK1x0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXG4rXHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbitcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXG4rXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cbitcdCAqL1xuK1x0aWYgKGFub25fdW5tYXApIHtcbitcdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuK1x0XHRpZiAoIWFub25fdm1hKVxuK1x0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0fVxuK1xuK1x0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovXG4rXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF91bmxvY2s7XG4rXHR9XG4rXG4rXHRpZiAoYW5vbl91bm1hcClcbitcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuK1xuK1x0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbitcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4rXHQgKlxuK1x0ICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsXG4rXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4rXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFx1MDAzZSAxIFx1MDAyNlx1MDAyNiBpc19hbm9uO1xuIFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiBcdFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuIFxuQEAgLTM5NTIsMTI4ICs0MDE0LDI1MiBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuIFx0XHRscnUgPSBsaXN0X2xydV9sb2NrKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSxcbiBcdFx0XHRcdCAgICBmb2xpb19uaWQoZm9saW8pLCBcdTAwMjZtZW1jZyk7XG4gXHR9XG4tXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4rXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbiBcdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbi1cdFx0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbi1cdFx0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuLVx0XHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4tXHRcdFx0XHRcdE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbi1cdFx0XHR9XG4gXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4gXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdH1cbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBvdXRfbm9fc3BsaXQ7XG4rXHR9XG4gXG4tXHRcdGlmIChtYXBwaW5nKSB7XG4tXHRcdFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuLVxuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2XG4tXHRcdFx0ICAgIG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9TSE1FTV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfRklMRV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbitcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4rXHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuK1x0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4rXHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4rXHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4rXHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4rXHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbitcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4rXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuK1x0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuIFxuLVx0XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4tXHRcdH1cbitcdGlmIChkb19scnUpXG4rXHRcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbitcbitcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLFxuK1x0XHRcdFx0ICAgTlVMTCwgc3BsaXRfdHlwZSk7XG4gXG4tXHRcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuK1x0LypcbitcdCAqIFVuZnJlZXplIHRoZSBwb3N0LXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbitcdCAqIHBsYWNlLiBLZWVwIHRoZSBoZWFkIEBmb2xpbyBmcm96ZW4gdW50aWwgdGhlIGVuZDogc3ViIGVudHJpZXNcbitcdCAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnRcbitcdCAqIHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKCkgY2Fubm90IHJldHVybiB0aGUgaGVhZCBmb2xpbyBmb3IgYSBzdWJcbitcdCAqIGVudHJ5IChmb2xpb190cnlfZ2V0KCkgd2lsbCBmYWlsIG9uIHRoZSBoZWFkIEBmb2xpbyB1bnRpbCB1bmZyZWV6ZSkuXG4rXHQgKi9cbitcdGZvcl9lYWNoX2ZvbGlvX3NhZmUoZm9saW9fbmV4dChmb2xpbyksIGVuZF9mb2xpbywgbmV3X2ZvbGlvLCBuZXh0KSB7XG4rXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0XHRpZiAoY2kpXG4rXHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0fVxuIFxuLVx0XHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXG4tXHRcdFx0XHRcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XG4rXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbitcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuLVx0XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGVcbi1cdFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4tXHRcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2Zcbi1cdFx0ICogQGZvbGlvLlxuLVx0XHQgKi9cbi1cdFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbi1cdFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XG4rXHRpZiAoZG9fbHJ1KVxuK1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRpZiAoY2kpXG4rXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuK291dF9ub19zcGxpdDpcbitcdGxvY2FsX2lycV9lbmFibGUoKTtcbitcdGlmIChhbm9uX3VubWFwKSB7XG4rXHRcdGlmICghcmV0IFx1MDAyNlx1MDAyNiAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKVxuK1x0XHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuK1x0XHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4rXHR9XG4rb3V0X3VubG9jazpcbitcdGlmIChhbm9uX3VubWFwKSB7XG4rXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4rXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4rXHR9XG4gXG4tXHRcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbitcdHJldHVybiByZXQ7XG4rfVxuIFxuLVx0XHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4rLyoqXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW9cbisgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZCBhbmQgZmlsZS1iYWNrZWRcbisgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuKyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KVxuKyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxuKyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbisgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICpcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0c1xuKyAqIHJlZmNvdW50LCBhbmQgcGVyZm9ybSB0aGUgc3BsaXQsIHVwZGF0ZXMgdGhlIHBhZ2UgY2FjaGUgZW50cmllcy4gU3BsaXRcbisgKiBmb2xpb3MgYXJlIHVuZnJvemVuIGJ1dCBub3QgcmVtYXBwZWQsIHRoZXkgYXJlIGZhdWx0ZWQgYmFjayBpbiBvbiBkZW1hbmQuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC4gKGlmIC1FTk9NRU1cbisgKiBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlcilcbisgKi9cbitzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4rXHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG4rXHRcdFx0XHRcdCAgICAgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbit7XG4rXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4rXHRYQV9TVEFURSh4YXMsIFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbitcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuK1x0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuK1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuK1x0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbitcdHBnb2ZmX3QgZW5kID0gMDtcbitcdGdmcF90IGdmcDtcbitcdGludCByZXQgPSAwO1xuIFxuLVx0XHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4tXHRcdFx0XHRcdCAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4rXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTtcbitcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdC8qXG4rXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4rXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4rXHQgKi9cbitcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4rXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuXG4tXHRcdFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoY2kpIHtcbi1cdFx0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjYgR0ZQX1JFQ0xBSU1fTUFTSyk7XG4rXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuK1x0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gZmFpbF9mcmVlO1xuK1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbitcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuIFxuLVx0XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuLVx0XHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuLVx0XHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbi1cdFx0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkge1xuK1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuLVx0XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbi1cdFx0XHRcdGZvbGlvX2FjY291bnRfY2xlYW5lZChcbi1cdFx0XHRcdFx0bmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbi1cdFx0XHRfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7XG4tXHRcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4rXHRcdHhhc19zZXRfb3JkZXIoXHUwMDI2eGFzLCBmb2xpby1cdTAwM2VpbmRleCwgbmV3X29yZGVyKTtcbitcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbitcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4rXHRcdFx0cmV0ID0geGFzX2Vycm9yKFx1MDAyNnhhcyk7XG4rXHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbitcdH1cbiBcbi1cdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXG4tXHRcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbi1cdFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbi1cdFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqL1xuLVx0XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbitcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4gXG4tXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1x0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovXG4rXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIGZhaWxfbW1hcF91bmxvY2s7XG4rXHR9XG4gXG4tXHRcdGlmIChjaSlcbi1cdFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdH0gZWxzZSB7XG4tXHRcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4tXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHQvKlxuK1x0ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmRcbitcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4rXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4rXHQgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCxcbitcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4rXHQgKi9cbitcdGVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLVx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xuK1x0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4rXHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4rXG4rXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHR4YXNfbG9ja19pcnEoXHUwMDI2eGFzKTtcbitcbitcdC8qXG4rXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuK1x0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXG4rXHQgKi9cbitcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbitcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdH1cbitcbitcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuK1x0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1x0cmV0ID0gX19zcGxpdF9mcm96ZW5fZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcyxcbitcdFx0XHRcdCAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuK1xuK1x0LypcbitcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbitcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96ZW4gdW50aWwgcGFnZSBjYWNoZVxuK1x0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4rXHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuK1x0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxuK1x0ICogQGZvbGlvLlxuK1x0ICovXG4rXHRmb3JfZWFjaF9mb2xpb19zYWZlKGZvbGlvX25leHQoZm9saW8pLCBlbmRfZm9saW8sIG5ld19mb2xpbywgbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbitcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgKyAxKTtcbitcbitcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1xuK1x0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbitcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4rXHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbitcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4rXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4rXG4rXHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4rXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuK1x0XHRcdG5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4rXHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbitcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxuK1x0XHRcdFx0XHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbitcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuK1x0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiBcdH1cbiBcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuK1x0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuK1x0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbitcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuK1x0ICovXG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xuK1x0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK2ZhaWw6XG4rXHQvKlxuK1x0ICogSWYgd2Ugd2FudCB0byB1c2UgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlIGluIHVubWFwX2ZvbGlvLFxuK1x0ICogcmVtZW1iZXIgdG8gYWRkIHJlbWFwX3BhZ2UoKSBhbmQgYWRhcHQgaXQuXG4rXHQgKi9cbitcdHhhc191bmxvY2tfaXJxKFx1MDAyNnhhcyk7XG4rZmFpbF9tbWFwX3VubG9jazpcbitcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuK1x0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuK1x0LypcbitcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4rXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXG4rXHQgKiB0aGUgaW5vZGUgeWV0LCBub3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yXG4rXHQgKiB0aGUgbWFwcGluZy5cbitcdCAqL1xuK1x0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuK2ZhaWxfZnJlZTpcbitcdC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovXG4rXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4rXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4rXHR4YXNfZGVzdHJveShcdTAwMjZ4YXMpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG5AQCAtNDA4Niw5ICs0MjcyLDkgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cbiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXG4gICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxuICAqXG4tICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuXG4rICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cbisgKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X2Zyb3plbl9mb2xpbygpLlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZFxuICAqIGFuZCBvdGhlcnMgYXJlIHVubG9ja2VkOlxuQEAgLTQxMDIsMTcgKzQyODgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXG4gXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbi1cdFhBX1NUQVRFKHhhcywgXHUwMDI2Zm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICs0MzAwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFxuIFx0aWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0aWYgKG5ld19vcmRlciBcdTAwM2U9IG9sZF9vcmRlcikge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwiVHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvXCIpO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBzd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcywgbWFwcGluZyxcbi1cdFx0XHRcdFx0XHR0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsIFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xuLWZhaWw6XG4tXHRpZiAobWFwcGluZylcbi1cdFx0eGFzX3VubG9jayhcdTAwMjZ4YXMpO1xuLVxuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVxuLVx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXHUwMDNlaG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7XG4tXG4tXHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgaXNfYW5vbiBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbi1cdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4tXG4tXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4tXG4tXHQvKlxuLVx0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcbi1cdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cbi1cdCAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heVxuLVx0ICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2Vcbi1cdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxuLVx0ICovXG4tXHRpZiAobWFwcGluZykge1xuLVx0XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fVxuK1x0aWYgKGlzX2Fub24pXG4rXHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcbitcdFx0XHRcdFx0XHQgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xuK1x0ZWxzZSBpZiAoaXNfc3dhcGNhY2hlKVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0ICAgICBmYWxzZSwgbGlzdCwgc3BsaXRfdHlwZSk7XG4rXHRlbHNlXG4rXHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LFxuK1x0XHRcdFx0XHRcdFx0ICBsaXN0LCBzcGxpdF90eXBlKTtcbiBcbiBcdC8qXG4gXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXG5AQCAtNDI2NSwyOSArNDMzMywxOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0aWYgKG5ld19mb2xpbyA9PSBwYWdlX2ZvbGlvKGxvY2tfYXQpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbiBcdFx0LypcbiBcdFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXG4gXHRcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxuLVx0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4rXHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4rXHRcdGlmIChpc19zd2FwY2FjaGUpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzExLDI5ICs0MzY5LDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKVxuICAqXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcbi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbisgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgZmFsc2UsXG4rXHRcdFx0XHRcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTAgKzQ0MDEsOSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXG4gICpcbi0gKiA0KSBAbmV3X29yZGVyIFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxuLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxuLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4rICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yXG4rICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcbisgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG5AQCAtNDM4NCw3ICs0NDMyLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxuICAqL1xuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCA1YmU4MjU5MTFlNjQ1Li5mMTQwNWU1YjgxM2VlIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0zODgsOCArMzg4LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xuIFx0XHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVx1MDAzZXN3YXApO1xuIFx0XHRjaV9lbmQgPSBjaV9vZmYgKyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmKysgXHUwMDNjIGNpX2VuZClcbitcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbitcdFx0fSB3aGlsZSAoKytjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6NDEuMDQyNzM4MDQ5WiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExMjIyNDE1MTU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQ6IEtNU0FOIE5vdCBOZWVkZWQqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgdG91Y2hpbmcgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IGZvbGlvIHNwbGl0dGluZywgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYC4gSXQncyByZWZhY3RvcmluZyB0aGUgZXhpc3RpbmcgY29kZSwgc3BsaXR0aW5nIHRoaW5ncyBpbnRvIGZ1bmN0aW9ucyBsaWtlIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVgIGFuZCB2YXJpYW50cywgZGVhbGluZyB3aXRoIGFub24sIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQncyBlc3NlbnRpYWxseSBhYm91dCBob3cgd2UgaGFuZGxlIHNwbGl0dGluZyBmb2xpb3MgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLlxuXG5UaGUga2V5IHRoaW5nIEkgbmVlZCB0byBjaGVjayBpcyBpZiB0aGlzIGludHJvZHVjZXMgKmFueSogcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBleHBvc2VkLiBUaGF0J3Mgd2hhdCBLTVNBTiBpcyBmb3IsIGFmdGVyIGFsbC4gRnJvbSB3aGF0IEkgc2VlLCBpdCBkb2Vzbid0LiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBzZW50IHVwIHRvIHVzZXIgc3BhY2UsIHdoaWNoIGlzIGEgY29tbW9uIGFyZWEgZm9yIGxlYWtzLiBObyBuZXcgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBoYXBwZW5pbmcgdGhhdCAqYXJlbid0KiBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBUaGUgY29kZSB1c2VzIGBmb2xpb19yZWZfZnJlZXplYCwgYHVubWFwX2ZvbGlvYCwgYF9fc3BsaXRfZnJvemVuX2ZvbGlvYCwgYW5kIHNvIG9uLiBUaGVzZSBhcmUgYWxsIHdlbGwtZXN0YWJsaXNoZWQgZnVuY3Rpb25zLlxuXG5JJ20gZm9jdXNpbmcgc3BlY2lmaWNhbGx5IG9uIHVuaW5pdGlhbGl6ZWQgcmVhZHMuIElzIHRoZXJlIGEgc2NlbmFyaW8gd2hlcmUgdGhpcyBwYXRjaCAqY291bGQqIGxlYWQgdG8gYSBrZXJuZWwgdmFyaWFibGUgYmVpbmcgcmVhZCBiZWZvcmUgaXQncyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUsIHBvdGVudGlhbGx5IGxlYWtpbmcgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLCBvciBjcmVhdGluZyBhIGNvbnRyb2wgZmxvdyB2dWxuZXJhYmlsaXR5PyBOby4gVGhlIHBhdGNoIGxvb2tzIHNhZmUgaW4gdGhpcyByZXNwZWN0LiBJdCBvbmx5IG1vZGlmaWVzIGV4aXN0aW5nIG1lbW9yeSBtYW5hZ2VtZW50IHN0cnVjdHVyZXMgYW5kIGxvZ2ljLCBpdCBkb2VzIG5vdCBjcmVhdGUgYW55IG5ldyBjb2RlIHBhdGhzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBpcyBwb3NzaWJsZS5cblxuVGhlcmVmb3JlLCB0aGUgcG90ZW50aWFsIGJ1Z3Mgd291bGQgYmUgY2xhc3NpYyBtZW1vcnkgY29ycnVwdGlvbiBidWdzOiB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWVzLCBtZW1vcnkgbGVha3MsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgKGJlY2F1c2Ugb2YgaW5jb3JyZWN0IHBhZ2UgY291bnRzKSwgb3IgZXZlbiBkZWFkbG9ja3MuIEJ1dCBhbGwgb2YgdGhlc2UgYXJlIGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHRoZSB1c3VhbCBrZXJuZWwgbWVtb3J5IGJ1ZyBkZXRlY3RvcnMuIEtNU0FOIGlzIGZvciBhIGRpZmZlcmVudCBjbGFzcyBvZiBwcm9ibGVtLCB3aGljaCBpc24ndCBwcmVzZW50IGhlcmUuXG5cblNvLCBJJ20gY29uZmlkZW50IGluIHNheWluZyB0aGF0IGBOZWVkc0tNU0FOYCBzaG91bGQgYmUgZmFsc2UgZm9yIHRoaXMgcGF0Y2guIEkgc2VlIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyODc4LCJPdXRwdXRUb2tlbnMiOjIxMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU2OSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE1OjUyLjI2NTE1NjYyNloiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzNDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxcblxcblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxcblxcblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowjz725[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-12 20:12:29 +0000 UTC FinishedAt: 2026-08-12 20:15:54 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "1029098ee3275ea5b78e329ce132262affa2f8cc", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "1029098ee3275ea5b78e329ce132262affa2f8cc", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "SWAP" ], "series_id": "deb6dd68-24b9-4bd9-8ca0-10d57d546eed" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__split_huge_page_to_list_to_order", "folio_split_unmapped", "folio_check_splittable", "__swap_cache_replace_folio" ], "corpus_urls": [ "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+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O2ZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChzcGVjaWZpY2FsbHkgYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYCksIGludHJvZHVjaW5nIHNlcGFyYXRlIHBhdGhzIGZvciBhbm9ueW1vdXMvc3dhcGNhY2hlIGZvbGlvcyBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBUaGUgY2hhbmdlcyBpbnZvbHZlIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBMUlUgbGlzdCBtYW5hZ2VtZW50LCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHVwZGF0ZXMuXG5cblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxMiAyMDoxNDoyMiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggY2VkNDAwZjcyZDQzYS4uMWM2MWI3ZDM5Y2QwMyAxMDA2NDRcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmNcbkBAIC0zNTg5LDkgJiM0MzszNTg5LDYgQEAgc3RhdGljIHZvaWQgcmVtYXBfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yLCBpbnQgZmxhZ3MpXG4ge1xuIFx0aW50IGkgPSAwO1xuIFxuLVx0LyogSWYgdW5tYXBfZm9saW8oKSB1c2VzIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSwgcmVtb3ZlIHRoaXMgY2hlY2sgKi9cbi1cdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbi1cdFx0cmV0dXJuO1xuIFx0Zm9yICg7Oykge1xuIFx0XHRyZW1vdmVfbWlncmF0aW9uX3B0ZXMoZm9saW8sIGZvbGlvLCBUVFVfUk1BUF9MT0NLRUQgfCBmbGFncyk7XG4gXHRcdGkgJiM0Mzs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbkBAIC0zNjM0LDYgJiM0MzszNjMxLDE4IEBAIHN0YXRpYyBib29sIHBhZ2VfcmFuZ2VfaGFzX2h3cG9pc29uZWQoc3RydWN0IHBhZ2UgKnBhZ2UsIGxvbmcgbnJfcGFnZXMpXG4gXHRyZXR1cm4gZmFsc2U7XG4gfVxuIFxuJiM0MzsvKipcbiYjNDM7ICogZm9yX2VhY2hfZm9saW9fc2FmZSAtIGl0ZXJhdGUgb3ZlciBjb250aWd1b3VzIGZvbGlvcyBzYWZlIGFnYWluc3QgZm9saW8gZnJlZVxuJiM0MzsgKiBAc3RhcnQ6IHRoZSBmaXJzdCBmb2xpbyB0byBpdGVyYXRlXG4mIzQzOyAqIEBlbmQ6IHNlbnRpbmVsLCBmb2xpb19uZXh0KCkgb2YgdGhlIGxhc3QgZm9saW8gdG8gaXRlcmF0ZVxuJiM0MzsgKiBAc3ViX2ZvbGlvOiBzdHJ1Y3QgZm9saW8gKiB0byB1c2UgYXMgdGhlIGxvb3AgY3Vyc29yXG4mIzQzOyAqIEBuZXh0OiBzdHJ1Y3QgZm9saW8gKiB1c2VkIGFzIHRlbXBvcmFyeSBzdG9yYWdlXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIGZvcl9lYWNoX2ZvbGlvX3NhZmUoc3RhcnQsIGVuZCwgc3ViX2ZvbGlvLCBuZXh0KSBcXFxuJiM0MztcdGZvciAoc3ViX2ZvbGlvID0gKHN0YXJ0KSwgbmV4dCA9IGZvbGlvX25leHQoc3ViX2ZvbGlvKTsgXFxcbiYjNDM7XHQgICAgIHN1Yl9mb2xpbyAhPSAoZW5kKTsgXFxcbiYjNDM7XHQgICAgIHN1Yl9mb2xpbyA9IG5leHQsIG5leHQgPSBmb2xpb19uZXh0KG5leHQpKVxuJiM0MztcbiAvKlxuICAqIEl0IHNwbGl0cyBAZm9saW8gaW50byBAbmV3X29yZGVyIGZvbGlvcyBhbmQgY29waWVzIHRoZSBAZm9saW8gbWV0YWRhdGEgdG9cbiAgKiBhbGwgdGhlIHJlc3VsdGluZyBmb2xpb3MuXG5AQCAtMzc1NSw4ICYjNDM7Mzc2NCw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiB9XG4gXG4gLyoqXG4tICogX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIC0gc3BsaXRzIGFuIHVubWFwcGVkIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MgaW5cbi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cbiYjNDM7ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zXG4mIzQzOyAqIGluIHR3byB3YXlzOiB1bmlmb3JtIHNwbGl0IG9yIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEBmb2xpbzogdGhlIHRvLWJlLXNwbGl0IGZvbGlvXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XG4gICogICAgICAgICAgICAgYWxsb2NhdG9yIGxpa2Ugc3BsaXQgZ2VuZXJhdGVzIGZvbGlvcyB3aXRoIG9yZGVycyBmcm9tIEBmb2xpbyYjMzk7c1xuQEAgLTM3OTUsMTEgJiM0MzszODA0LDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4mIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcbiBcdFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbiBcdGNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4mIzQzO1x0Y29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0aW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxO1xuIFx0c3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbztcbkBAIC0zODE0LDggJiM0MzszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHQgICAgIHNwbGl0X29yZGVyLS0pIHtcbiBcdFx0aW50IG5yX25ld19mb2xpb3MgPSAxVUwgXHUwMDNjXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XG4gXG4tXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbi1cdFx0aWYgKGlzX2Fub24gXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4mIzQzO1x0XHQvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuJiM0MztcdFx0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4gXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdGlmIChtYXBwaW5nKSB7XG5AQCAtMzg3OCwzMiAmIzQzOzM4ODgsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4mIzQzO1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbiYjNDM7XHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiYjNDM7XG4gXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbiBcdC8qXG4gXHQgKiBGb2xpb3MgdGhhdCBqdXN0IGdvdCB0cnVuY2F0ZWQgY2Fubm90IGdldCBzcGxpdC4gU2lnbmFsIHRvIHRoZVxuLVx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS5cbi1cdCAqXG4tXHQgKiBUT0RPOiB0aGlzIHdpbGwgYWxzbyBjdXJyZW50bHkgcmVmdXNlIGZvbGlvcyB3aXRob3V0IGEgbWFwcGluZyBpbiB0aGVcbi1cdCAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLlxuJiM0MztcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuIEEgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpb1xuJiM0MztcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxuIFx0ICovXG4tXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuJiM0MztcdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWlzX3N3YXBjYWNoZSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbi1cdC8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi9cbi1cdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4tXG4gXHQvKlxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMFxuLVx0ICpcbi1cdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cbi1cdCAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnlcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWRcbi1cdCAqIGhlcmUuXG4mIzQzO1x0ICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZVxuJiM0MztcdCAqIGRlZmVycmVkIHNwbGl0IGxpc3QsIGh5YnJpZCBzaG1lbSBcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxuJiM0MztcdCAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZFxuJiM0MztcdCAqIGJlIGVpdGhlciBhbm9uIG9yIHNobWVtLCB3aGljaCB3ZSBjYW5ub3QgdGVsbCBhcGFydC5cbiBcdCAqL1xuLVx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcdTAwMjZcdTAwMjYgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4mIzQzO1x0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdH1cbiBcbiBcdGlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0zOTExLDM5ICYjNDM7MzkxNSw5NyBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXG4mIzQzO1x0ICogc2htZW0gZm9saW8gdW5kZXIgU1dBUCBJTywgaXQmIzM5O3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXG4mIzQzO1x0ICogc2htZW0gbWFwcGluZyBhZnRlcndhcmQuIFRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZyB0aGVtXG4mIzQzO1x0ICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghaXNfYW5vbiBcdTAwMjZcdTAwMjYgaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiBmb2xpby1cdTAwM2VtYXBwaW5nKVxuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFnZWNhY2hlIG9yIHRoZSBzd2FwY2FjaGUuICovXG4tc3RhdGljIHVuc2lnbmVkIGludCBmb2xpb19jYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqL1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiBcdFx0cmV0dXJuIDA7XG4gXHRyZXR1cm4gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGJvb2wgZG9fbHJ1LFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlLFxuLVx0XHRcdFx0XHQgICAgIHBnb2ZmX3QgZW5kLCBpbnQgKm5yX3NobWVtX2Ryb3BwZWQpXG4mIzQzOy8qKlxuJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpb1xuJiM0MzsgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZFxuJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4mIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG9cbiYjNDM7ICogICAgICAgICAgdGhlIExSVSBsaXN0XG4mIzQzOyAqIEBhbm9uX3VubWFwOiBpZiB0cnVlLCB1bm1hcCBAZm9saW8gYmVmb3JlIHRoZSBzcGxpdCBhbmQgcmVtYXAgaXQgYWZ0ZXJcbiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuJiM0MzsgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4mIzQzOyAqXG4mIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzXG4mIzQzOyAqIEBhbm9uX3VubWFwIGlzIGZhbHNlKSwgZnJlZXplcyBpdHMgcmVmY291bnQsIGFuZCBwZXJmb3JtcyB0aGUgc3BsaXQsIHVwZGF0ZXNcbiYjNDM7ICogdGhlIHN3YXAgY2FjaGUgZW50cmllcy4gU3BsaXQgZm9saW9zIGFyZSB1bmZyb3plbiBhbmQgcmVtYXBwZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuJiM0MztcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4mIzQzO1x0c3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuJiM0MztcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuJiM0MztcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4gXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XG4mIzQzO1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xuIFx0aW50IHJldCA9IDA7XG4gXG4tXHRWTV9XQVJOX09OX09OQ0UoIW1hcHBpbmcgXHUwMDI2XHUwMDI2IGVuZCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcbiYjNDM7XHQgKiBob2xkIGFuIG1tYXBfbG9jayB0aGF0IHdvdWxkIHByZXZlbnQgdGhlIGFub25fdm1hIGZyb21cbiYjNDM7XHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbiYjNDM7XHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xuJiM0MztcdCAqIHRha2VuIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4mIzQzO1x0XHRpZiAoIWFub25fdm1hKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHRoZSBvcHRpb25hbCB1bm1hcC4gKi9cbiYjNDM7XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gb3V0X3VubG9jaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChhbm9uX3VubWFwKVxuJiM0MztcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuJiM0MztcbiYjNDM7XHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuJiM0MztcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBPbmx5IGFub24gZm9saW9zIGFyZSBldmVyIHF1ZXVlZCBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgbGlzdCxcbiYjNDM7XHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4mIzQzO1x0ZGVxdWV1ZV9kZWZlcnJlZCA9IG9sZF9vcmRlciBcdTAwM2UgMSBcdTAwMjZcdTAwMjYgaXNfYW5vbjtcbiBcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4gXHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiBcbkBAIC0zOTUyLDEyOCAmIzQzOzQwMTQsMjUyIEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gXHRcdGxydSA9IGxpc3RfbHJ1X2xvY2soXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxuIFx0XHRcdFx0ICAgIGZvbGlvX25pZChmb2xpbyksIFx1MDAyNm1lbWNnKTtcbiBcdH1cbi1cdGlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4mIzQzO1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkge1xuIFx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuLVx0XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuLVx0XHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4tXHRcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbi1cdFx0XHRcdFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuLVx0XHRcdH1cbiBcdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbiBcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcdFx0fVxuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gb3V0X25vX3NwbGl0O1xuJiM0MztcdH1cbiBcbi1cdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRpbnQgbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4tXG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX1NITUVNX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9GSUxFX1RIUFMsIC1ucik7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fVxuJiM0MztcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4mIzQzO1x0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbiYjNDM7XHRcdFx0ICAgICAgIFx1MDAyNmZvbGlvLVx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcbiYjNDM7XHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4mIzQzO1x0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuJiM0MztcdFx0XHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcbiYjNDM7XHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbiYjNDM7XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4mIzQzO1x0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbiYjNDM7XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4gXG4tXHRcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbi1cdFx0fVxuJiM0MztcdGlmIChkb19scnUpXG4mIzQzO1x0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4mIzQzO1xuJiM0MztcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLFxuJiM0MztcdFx0XHRcdCAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuZnJlZXplIHRoZSBwb3N0LXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbiYjNDM7XHQgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzXG4mIzQzO1x0ICogaW4gc3dhcCBjYWNoZSBtdXN0IGJlIHVwZGF0ZWQgZmlyc3QsIHNvIGEgY29uY3VycmVudFxuJiM0MztcdCAqIHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKCkgY2Fubm90IHJldHVybiB0aGUgaGVhZCBmb2xpbyBmb3IgYSBzdWJcbiYjNDM7XHQgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvcl9lYWNoX2ZvbGlvX3NhZmUoZm9saW9fbmV4dChmb2xpbyksIGVuZF9mb2xpbywgbmV3X2ZvbGlvLCBuZXh0KSB7XG4mIzQzO1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuJiM0MztcdFx0XHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XG4mIzQzO1x0XHRpZiAoY2kpXG4mIzQzO1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbiYjNDM7XHR9XG4gXG4tXHRcdHJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcyxcbi1cdFx0XHRcdFx0ICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbiYjNDM7XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbiYjNDM7XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4tXHRcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZVxuLVx0XHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3Ncbi1cdFx0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbi1cdFx0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxuLVx0XHQgKiBAZm9saW8uXG4tXHRcdCAqL1xuLVx0XHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xuLVx0XHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcbi1cdFx0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbiYjNDM7XHRpZiAoZG9fbHJ1KVxuJiM0MztcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuJiM0MztcdGlmIChjaSlcbiYjNDM7XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuJiM0MztvdXRfbm9fc3BsaXQ6XG4mIzQzO1x0bG9jYWxfaXJxX2VuYWJsZSgpO1xuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbiYjNDM7XHRcdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4mIzQzO1x0XHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4mIzQzO1x0fVxuJiM0MztvdXRfdW5sb2NrOlxuJiM0MztcdGlmIChhbm9uX3VubWFwKSB7XG4mIzQzO1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuJiM0MztcdFx0cHV0X2Fub25fdm1hKGFub25fdm1hKTtcbiYjNDM7XHR9XG4gXG4tXHRcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4gXG4tXHRcdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTtcbiYjNDM7LyoqXG4mIzQzOyAqIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKCkgLSBzcGxpdCBhIGZpbGUtYmFja2VkIGZvbGlvXG4mIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZFxuJiM0MzsgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0XG4mIzQzOyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuJiM0MzsgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXG4mIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbiYjNDM7ICpcbiYjNDM7ICogSGVscGVyIGZvciBzcGxpdHRpbmcgYSBmaWxlLWJhY2tlZCBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbywgZnJlZXplcyBpdHNcbiYjNDM7ICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdFxuJiM0MzsgKiBmb2xpb3MgYXJlIHVuZnJvemVuIGJ1dCBub3QgcmVtYXBwZWQsIHRoZXkgYXJlIGZhdWx0ZWQgYmFjayBpbiBvbiBkZW1hbmQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTVxuJiM0MzsgKiBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlcilcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4mIzQzO1x0WEFfU1RBVEUoeGFzLCBcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuJiM0MztcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XG4mIzQzO1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4mIzQzO1x0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuJiM0MztcdHBnb2ZmX3QgZW5kID0gMDtcbiYjNDM7XHRnZnBfdCBnZnA7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4gXG4tXHRcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbi1cdFx0XHRcdFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7XG4mIzQzO1x0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4mIzQzO1x0aWYgKG5ld19vcmRlciBcdTAwM2MgbWluX29yZGVyKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4mIzQzO1x0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuJiM0MztcdCAqL1xuJiM0MztcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4mIzQzO1x0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbm9ueW1vdXMgZm9saW8gd2l0aCBzd2FwIGNhY2hlLlxuLVx0XHRcdCAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKGNpKSB7XG4tXHRcdFx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4mIzQzO1x0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKTtcbiYjNDM7XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuJiM0MztcdFx0cmV0ID0gLUVCVVNZO1xuJiM0MztcdFx0Z290byBmYWlsX2ZyZWU7XG4mIzQzO1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbiBcbi1cdFx0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbi1cdFx0XHRpZiAobmV3X2ZvbGlvLVx1MDAzZWluZGV4IFx1MDAzYyBlbmQpIHtcbi1cdFx0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4tXHRcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4mIzQzO1x0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4mIzQzO1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlcztcbi1cdFx0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4tXHRcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQoXG4tXHRcdFx0XHRcdG5ld19mb2xpbywgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4tXHRcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuLVx0XHRcdGZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpO1xuJiM0MztcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuJiM0MztcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbiYjNDM7XHRcdGlmICh4YXNfZXJyb3IoXHUwMDI2eGFzKSkge1xuJiM0MztcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbiYjNDM7XHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbiYjNDM7XHR9XG4gXG4tXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuLVx0XHQgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuXG4tXHRcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4tXHRcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKi9cbi1cdFx0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4gXG4tXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuJiM0MztcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSAqL1xuJiM0MztcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBmYWlsX21tYXBfdW5sb2NrO1xuJiM0MztcdH1cbiBcbi1cdFx0aWYgKGNpKVxuLVx0XHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuLVx0fSBlbHNlIHtcbi1cdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRsaXN0X2xydV91bmxvY2sobHJ1KTtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4mIzQzO1x0ICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmVcbiYjNDM7XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4mIzQzO1x0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4mIzQzO1x0ICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbiYjNDM7XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbiYjNDM7XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4mIzQzO1xuJiM0MztcdHVubWFwX2ZvbGlvKGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0eGFzX2xvY2tfaXJxKFx1MDAyNnhhcyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS5cbiYjNDM7XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuJiM0MztcdFx0cmV0ID0gLUVBR0FJTjtcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICYjNDM7IDEpKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUFHQUlOO1xuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbiYjNDM7XHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKVxuJiM0MztcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX1NITUVNX1RIUFMsIC1vbGRfbnJfcGFnZXMpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbiYjNDM7XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4mIzQzO1x0cmV0ID0gX19zcGxpdF9mcm96ZW5fZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcyxcbiYjNDM7XHRcdFx0XHQgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4mIzQzO1x0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlXG4mIzQzO1x0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4mIzQzO1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbiYjNDM7XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4mIzQzO1x0ICogQGZvbGlvLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvcl9lYWNoX2ZvbGlvX3NhZmUoZm9saW9fbmV4dChmb2xpbyksIGVuZF9mb2xpbywgbmV3X2ZvbGlvLCBuZXh0KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuJiM0MztcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgJiM0MzsgMSk7XG4mIzQzO1xuJiM0MztcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuJiM0MztcbiYjNDM7XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuJiM0MztcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4mIzQzO1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4mIzQzO1x0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4mIzQzO1xuJiM0MztcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbiYjNDM7XHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuJiM0MztcdFx0XHRucl9zaG1lbV9kcm9wcGVkICYjNDM7PSBucl9wYWdlcztcbiYjNDM7XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbiYjNDM7XHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIGlub2RlX3RvX3diKG1hcHBpbmctXHUwMDNlaG9zdCkpO1xuJiM0MztcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuJiM0MztcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuJiM0MztcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbiYjNDM7XHQgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpb1xuJiM0MztcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpO1xuJiM0MztcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbiYjNDM7ZmFpbDpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbiYjNDM7XHQgKiByZW1lbWJlciB0byBhZGQgcmVtYXBfcGFnZSgpIGFuZCBhZGFwdCBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuJiM0MztmYWlsX21tYXBfdW5sb2NrOlxuJiM0MztcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuJiM0MztcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4mIzQzO1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuJiM0MztcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcbiYjNDM7XHQgKiB0aGUgbWFwcGluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4mIzQzO2ZhaWxfZnJlZTpcbiYjNDM7XHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuJiM0MztcdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcbiYjNDM7XHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4mIzQzO1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSAmIzQzOzQyNzIsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuICAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbiAgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4gICpcbi0gKiBJdCBjYWxscyBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiYjNDM7ICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cbiYjNDM7ICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICYjNDM7NDI4OCwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCxcbiBcdFx0c3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuLVx0WEFfU1RBVEUoeGFzLCBcdTAwMjZmb2xpby1cdTAwM2VtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbiYjNDM7XHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICYjNDM7NDMwMCwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuJiM0MztcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRpZiAobmV3X29yZGVyIFx1MDAzZT0gb2xkX29yZGVyKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuJiM0MztcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwmIzM0O1RyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIHN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbiYjNDM7XHRpZiAoaXNfYW5vbilcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbiYjNDM7XHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXG4mIzQzO1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgJiM0Mzs0MzMzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpXG4gXHRcdFx0Y29udGludWU7XG4gXG4tXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuIFx0XHQvKlxuIFx0XHQgKiBTdWJwYWdlcyB3aG9zZSBtYXBwaW5nIGhhcyBiZWVuIHphcHBlZCBtYXkgYmUgZnJlZWRcbiBcdFx0ICogZWFybGllciwgYnV0IGZyZWVpbmcgdGhlbSByZXF1aXJlcyB0YWtpbmcgdGhlXG4tXHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBwdXRfcGFnZSgpIG9uIHRhaWwgcGFnZXMgdW50aWxcbiYjNDM7XHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4mIzQzO1x0XHRpZiAoaXNfc3dhcGNhY2hlKVxuJiM0MztcdFx0XHRmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTtcbiYjNDM7XHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcHV0KG5ld19mb2xpbyk7XG4gXHR9XG4gXG4tb3V0X3VubG9jazpcbi1cdGlmIChhbm9uX3ZtYSkge1xuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuLVx0fVxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbiBvdXQ6XG4tXHQvKiByZXN0b3JlIHRvIGNhbGxlciYjMzk7cyBvbGRfbWVtY2cgKi9cbi1cdHNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTtcbi1cdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcbi1vdXRfbm9fbWVtY2c6XG4tXHR4YXNfZGVzdHJveShcdTAwMjZ4YXMpO1xuIFx0aWYgKGlzX3BtZF9vcmRlcihvbGRfb3JkZXIpKVxuIFx0XHRjb3VudF92bV9ldmVudCghcmV0ID8gVEhQX1NQTElUX1BBR0UgOiBUSFBfU1BMSVRfUEFHRV9GQUlMRUQpO1xuIFx0Y291bnRfbXRocF9zdGF0KG9sZF9vcmRlciwgIXJldCA/IE1USFBfU1RBVF9TUExJVCA6IE1USFBfU1RBVF9TUExJVF9GQUlMRUQpO1xuQEAgLTQzMTEsMjkgJiM0Mzs0MzY5LDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKVxuICAqXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcbi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbiYjNDM7ICogZm9saW9fZnJlZV9zd2FwKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbiAgKlxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0b1xuICAqICAgICAgICAgaW5zdWZmaWNpZW50IHJlZmVyZW5jZSBjb3VudCBvciBleHRyYSBwaW5zKS5cbiAgKi9cbiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiB7XG4tXHRpbnQgcmV0ID0gMDtcbi1cbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4gXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSlcbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4tXG4tXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIE5VTEwsXG4tXHRcdFx0XHRcdFx0TlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSxcbi1cdFx0XHRcdFx0XHQwLCBOVUxMKTtcbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0dXJuIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBcdTAwMjZmb2xpby1cdTAwM2VwYWdlLCBmYWxzZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTAgJiM0Mzs0NDAxLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogICAgR1VQIHBpbnMsIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xpbyBub3QgZ2V0dGluZyBzcGxpdDsgaW5zdGVhZCwgdGhlIGNhbGxlclxuICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLlxuICAqXG4tICogNCkgQG5ld19vcmRlciBcdTAwM2UgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3Rcbi0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIHdoaWNoXG4tICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTFcbi0gKiAgICBmb2xpbyBvbmx5IGhhcyBzdWJwYWdlcyAwIGFuZCAxLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxuJiM0MzsgKiA0KSBAbmV3X29yZGVyICE9IDEgZm9yIGFub24gb3Igc3dhcGNhY2hlLiBBbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3JcbiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcbiYjNDM7ICogICAgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxuICAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGNhbGxlciYjMzk7cyBmb2xpbyByZWZlcmVuY2Ugd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byBAcGFnZSxcbkBAIC00Mzg0LDcgJiM0Mzs0NDMyLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxuICAqL1xuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuIFxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggJiM0MzszODgsOSBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG4gXHQgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7XG4gXHRcdGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtXHUwMDNlc3dhcCk7XG4gXHRcdGNpX2VuZCA9IGNpX29mZiAmIzQzOyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmJiM0MzsmIzQzOyBcdTAwM2MgY2lfZW5kKVxuJiM0MztcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbiYjNDM7XHRcdH0gd2hpbGUgKCYjNDM7JiM0MztjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEF1ZyAxMiAyMDoxNDoyMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jCmluZGV4IGNlZDQwMGY3MmQ0M2EuLjFjNjFiN2QzOWNkMDMgMTAwNjQ0Ci0tLSBhL21tL2h1Z2VfbWVtb3J5LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vaHVnZV9tZW1vcnkuYwpAQCAtMzU4OSw5ICYjNDM7MzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKQogewogCWludCBpID0gMDsKIAotCS8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovCi0JaWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKQotCQlyZXR1cm47CiAJZm9yICg7OykgewogCQlyZW1vdmVfbWlncmF0aW9uX3B0ZXMoZm9saW8sIGZvbGlvLCBUVFVfUk1BUF9MT0NLRUQgfCBmbGFncyk7CiAJCWkgJiM0Mzs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKQEAgLTM2MzQsNiAmIzQzOzM2MzEsMTggQEAgc3RhdGljIGJvb2wgcGFnZV9yYW5nZV9oYXNfaHdwb2lzb25lZChzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9uZyBucl9wYWdlcykKIAlyZXR1cm4gZmFsc2U7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBmb3JfZWFjaF9mb2xpb19zYWZlIC0gaXRlcmF0ZSBvdmVyIGNvbnRpZ3VvdXMgZm9saW9zIHNhZmUgYWdhaW5zdCBmb2xpbyBmcmVlCiYjNDM7ICogQHN0YXJ0OiB0aGUgZmlyc3QgZm9saW8gdG8gaXRlcmF0ZQomIzQzOyAqIEBlbmQ6IHNlbnRpbmVsLCBmb2xpb19uZXh0KCkgb2YgdGhlIGxhc3QgZm9saW8gdG8gaXRlcmF0ZQomIzQzOyAqIEBzdWJfZm9saW86IHN0cnVjdCBmb2xpbyAqIHRvIHVzZSBhcyB0aGUgbG9vcCBjdXJzb3IKJiM0MzsgKiBAbmV4dDogc3RydWN0IGZvbGlvICogdXNlZCBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQomIzQzOyAqLwomIzQzOyNkZWZpbmUgZm9yX2VhY2hfZm9saW9fc2FmZShzdGFydCwgZW5kLCBzdWJfZm9saW8sIG5leHQpIFwKJiM0MzsJZm9yIChzdWJfZm9saW8gPSAoc3RhcnQpLCBuZXh0ID0gZm9saW9fbmV4dChzdWJfZm9saW8pOyBcCiYjNDM7CSAgICAgc3ViX2ZvbGlvICE9IChlbmQpOyBcCiYjNDM7CSAgICAgc3ViX2ZvbGlvID0gbmV4dCwgbmV4dCA9IGZvbGlvX25leHQobmV4dCkpCiYjNDM7CiAvKgogICogSXQgc3BsaXRzIEBmb2xpbyBpbnRvIEBuZXdfb3JkZXIgZm9saW9zIGFuZCBjb3BpZXMgdGhlIEBmb2xpbyBtZXRhZGF0YSB0bwogICogYWxsIHRoZSByZXN1bHRpbmcgZm9saW9zLgpAQCAtMzc1NSw4ICYjNDM7Mzc2NCw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlciwKIH0KIAogLyoqCi0gKiBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgLSBzcGxpdHMgYW4gdW5tYXBwZWQgQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvcyBpbgotICogdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuCiYjNDM7ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zCiYjNDM7ICogaW4gdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuCiAgKiBAZm9saW86IHRoZSB0by1iZS1zcGxpdCBmb2xpbwogICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5CiAgKiAgICAgICAgICAgICBhbGxvY2F0b3IgbGlrZSBzcGxpdCBnZW5lcmF0ZXMgZm9saW9zIHdpdGggb3JkZXJzIGZyb20gQGZvbGlvJiMzOTtzCkBAIC0zNzk1LDExICYjNDM7MzgwNCwxMiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCAmbHQ7MCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlCiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spCiAgKi8KLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAomIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKIAkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewogCWNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CWNvbnN0IGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJaW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxOwogCXN0cnVjdCBmb2xpbyAqb2xkX2ZvbGlvID0gZm9saW87CkBAIC0zODE0LDggJiM0MzszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsCiAJICAgICBzcGxpdF9vcmRlci0tKSB7CiAJCWludCBucl9uZXdfZm9saW9zID0gMVVMICZsdDsmbHQ7IChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7CiAKLQkJLyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqLwotCQlpZiAoaXNfYW5vbiAmYW1wOyZhbXA7IHNwbGl0X29yZGVyID09IDEpCiYjNDM7CQkvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqLwomIzQzOwkJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQogCQkJY29udGludWU7CiAKIAkJaWYgKG1hcHBpbmcpIHsKQEAgLTM4NzgsMzIgJiM0MzszODg4LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJCSAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKJiM0MzsKIAlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAkvKgogCSAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlCi0JICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4KLQkgKgotCSAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZQotCSAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLgomIzQzOwkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8KJiM0MzsJICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuCiAJICovCi0JaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQomIzQzOwlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWlzX3N3YXBjYWNoZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi8KLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qCi0JICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMAotCSAqCi0JICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbQotCSAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnkKLQkgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkCi0JICogaGVyZS4KJiM0MzsJICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZQomIzQzOwkgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gJmFtcDsgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdAomIzQzOwkgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGQKJiM0MzsJICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LgogCSAqLwotCWlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgJmFtcDsmYW1wOyBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKJiM0MzsJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJaWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzkxMSwzOSAmIzQzOzM5MTUsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAlpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKQogCQlyZXR1cm4gLUVCVVNZOwogCiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhCiYjNDM7CSAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0JiMzOTtzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvcgomIzQzOwkgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW0KJiM0MzsJICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkCiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGUKJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXQKJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIKJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG8KJiM0MzsgKiAgICAgICAgICB0aGUgTFJVIGxpc3QKJiM0MzsgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzCiYjNDM7ICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlcwomIzQzOyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLAomIzQzOwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7NDAxNCwyNTIgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLAomIzQzOwkJCQkgICBOVUxMLCBzcGxpdF90eXBlKTsKIAotCQkvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi8KJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIHBvc3Qtc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzCiYjNDM7CSAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnQKJiM0MzsJICogc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvIGZvciBhIHN1YgomIzQzOwkgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLgomIzQzOwkgKi8KJiM0MzsJZm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHsKJiM0MzsJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiAJCWlmIChkb19scnUpCi0JCQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkJaWYgKGNpKQomIzQzOwkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJfQogCi0JCXJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcywKLQkJCQkJICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7CiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiAKLQkJLyoKLQkJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAotCQkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGUKLQkJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCi0JCSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKLQkJICogQGZvbGlvLgotCQkgKi8KLQkJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKLQkJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7Ci0JCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTsKJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJaWYgKGNpKQomIzQzOwkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7CiYjNDM7b3V0X25vX3NwbGl0OgomIzQzOwlsb2NhbF9pcnFfZW5hYmxlKCk7CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwomIzQzOwkJcHV0X2Fub25fdm1hKGFub25fdm1hKTsKJiM0MzsJfQogCi0JCQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KIAotCQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZAomIzQzOyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlCiYjNDM7ICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpCiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0CiYjNDM7ICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzCiYjNDM7ICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdAomIzQzOyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTQomIzQzOyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiYjNDM7CQkJCQkgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwomIzQzOwlYQV9TVEFURSh4YXMsICZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgZm9saW8tJmd0O2luZGV4KTsKJiM0MzsJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKJiM0MzsJbG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZzsKJiM0MzsJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwomIzQzOwlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGludCBtaW5fb3JkZXI7CiYjNDM7CXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKJiM0MzsJcGdvZmZfdCBlbmQgPSAwOwomIzQzOwlnZnBfdCBnZnA7CiYjNDM7CWludCByZXQgPSAwOwogCi0JCQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAotCQkJCQkgICBmb2xpb19jYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7CiYjNDM7CWlmIChuZXdfb3JkZXIgJmx0OyBtaW5fb3JkZXIpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKGRvX2xydSkKLQkJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CS8qCiYjNDM7CSAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kCiYjNDM7CSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KJiM0MzsJICovCiYjNDM7CW1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7CiYjNDM7CW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwogCi0JCQkvKgotCQkJICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS4KLQkJCSAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0JCQkgKi8KLQkJCWlmIChjaSkgewotCQkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKLQkJCQljb250aW51ZTsKLQkJCX0KJiM0MzsJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7IEdGUF9SRUNMQUlNX01BU0spOwomIzQzOwlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewomIzQzOwkJcmV0ID0gLUVCVVNZOwomIzQzOwkJZ290byBmYWlsX2ZyZWU7CiYjNDM7CX0KIAotCQkJLyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqLwotCQkJaWYgKCFtYXBwaW5nKQotCQkJCWNvbnRpbnVlOwomIzQzOwltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwogCi0JCQkvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi8KLQkJCWlmIChuZXdfZm9saW8tJmd0O2luZGV4ICZsdDsgZW5kKSB7Ci0JCQkJX194YV9zdG9yZSgmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIG5ld19mb2xpby0mZ3Q7aW5kZXgsCi0JCQkJCSAgIG5ld19mb2xpbywgMCk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewomIzQzOwkJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAotCQkJVk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTsKLQkJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KLQkJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpICZhbXA7JmFtcDsgbnJfc2htZW1fZHJvcHBlZCkKLQkJCQkqbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7Ci0JCQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCi0JCQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKAotCQkJCQluZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKLQkJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKLQkJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwomIzQzOwkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwomIzQzOwkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwomIzQzOwkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKJiM0MzsJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwomIzQzOwkJCWdvdG8gZmFpbF9mcmVlOwogCQl9CiYjNDM7CX0KIAotCQl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKLQkJLyoKLQkJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKLQkJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgotCQkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwotCQkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICovCi0JCWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKIAotCQlpZiAoZG9fbHJ1KQotCQkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwkvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi8KJiM0MzsJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWxfbW1hcF91bmxvY2s7CiYjNDM7CX0KIAotCQlpZiAoY2kpCi0JCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKLQl9IGVsc2UgewotCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJLyoKJiM0MzsJICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmQKJiM0MzsJICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmUKJiM0MzsJICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLgomIzQzOwkgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCwKJiM0MzsJICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy4KJiM0MzsJICovCiYjNDM7CWVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLSZndDtob3N0KSwgUEFHRV9TSVpFKTsKJiM0MzsJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQllbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy0mZ3Q7aG9zdCwgZW5kKTsKJiM0MzsKJiM0MzsJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwl4YXNfbG9ja19pcnEoJmFtcDt4YXMpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgomIzQzOwkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KJiM0MzsJICovCiYjNDM7CWlmICh4YXNfbG9hZCgmYW1wO3hhcykgIT0gZm9saW8pIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgJiM0MzsgMSkpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciAmbHQ7IEhQQUdFX1BNRF9PUkRFUikgewomIzQzOwkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsJcmV0ID0gX19zcGxpdF9mcm96ZW5fZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsICZhbXA7eGFzLAomIzQzOwkJCQkgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGUKJiM0MzsJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCiYjNDM7CSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCiYjNDM7CSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKJiM0MzsJICogQGZvbGlvLgomIzQzOwkgKi8KJiM0MzsJZm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pOwomIzQzOwomIzQzOwkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKJiM0MzsJCQkJICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsKJiM0MzsJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKJiM0MzsKJiM0MzsJCS8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqLwomIzQzOwkJaWYgKG5ld19mb2xpby0mZ3Q7aW5kZXggJmx0OyBlbmQpIHsKJiM0MzsJCQlfX3hhX3N0b3JlKCZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgbmV3X2ZvbGlvLSZndDtpbmRleCwKJiM0MzsJCQkJICAgbmV3X2ZvbGlvLCAwKTsKJiM0MzsJCQljb250aW51ZTsKIAkJfQotCQlyZXR1cm4gLUVBR0FJTjsKJiM0MzsKJiM0MzsJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KJiM0MzsJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJCW5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwomIzQzOwkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2FjY291bnRfY2xlYW5lZChuZXdfZm9saW8sCiYjNDM7CQkJCQkgICAgICBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7CiYjNDM7CQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7CiYjNDM7CQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKIAl9CiAKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKJiM0MzsJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgomIzQzOwkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwomIzQzOwkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KJiM0MzsJICovCiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpOwomIzQzOwlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7ZmFpbDoKJiM0MzsJLyoKJiM0MzsJICogSWYgd2Ugd2FudCB0byB1c2UgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlIGluIHVubWFwX2ZvbGlvLAomIzQzOwkgKiByZW1lbWJlciB0byBhZGQgcmVtYXBfcGFnZSgpIGFuZCBhZGFwdCBpdC4KJiM0MzsJICovCiYjNDM7CXhhc191bmxvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MztmYWlsX21tYXBfdW5sb2NrOgomIzQzOwlpZiAobnJfc2htZW1fZHJvcHBlZCkKJiM0MzsJCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5cwomIzQzOwkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlCiYjNDM7CSAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IKJiM0MzsJICogdGhlIG1hcHBpbmcuCiYjNDM7CSAqLwomIzQzOwlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiYjNDM7ZmFpbF9mcmVlOgomIzQzOwkvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqLwomIzQzOwlzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7CiYjNDM7CW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKJiM0MzsJeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQwODYsOSAmIzQzOzQyNzIsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbgogICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAogICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KQogICoKLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LgomIzQzOyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC4KICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZAotICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpLgomIzQzOyAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZAogICogYW5kIG90aGVycyBhcmUgdW5sb2NrZWQ6CkBAIC00MTAyLDE3ICYjNDM7NDI4OCwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCwKIAkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7Ci0JWEFfU1RBVEUoeGFzLCAmYW1wO2ZvbGlvLSZndDttYXBwaW5nLSZndDtpX3BhZ2VzLCBmb2xpby0mZ3Q7aW5kZXgpOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwogCWJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDsKLQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDsKIAlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDsKLQlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7Ci0JZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDsKLQlwZ29mZl90IGVuZCA9IDA7CiAJaW50IHJldDsKIAogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7CkBAIC00MTIwLDE0MSAmIzQzOzQzMDAsMjkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAKIAlpZiAoZm9saW8gIT0gcGFnZV9mb2xpbyhzcGxpdF9hdCkgfHwgZm9saW8gIT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkgewogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9ub19tZW1jZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAogCWlmIChuZXdfb3JkZXIgJmd0Oz0gb2xkX29yZGVyKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJcmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTsKIAlpZiAocmV0KSB7CiAJCVZNX1dBUk5fT05DRShyZXQgPT0gLUVJTlZBTCwgJiMzNDtUcmllZCB0byBzcGxpdCBhbiB1bnNwbGl0dGFibGUgZm9saW8mIzM0Oyk7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwotCX0KLQotCS8qCi0JICogc3dpdGNoIHRvIGZvbGlvJiMzOTtzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmQKLQkgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuCi0JICovCi0JbWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTsKLQlvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTsKLQotCWlmIChpc19hbm9uKSB7Ci0JCS8qCi0JCSAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZAotCQkgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhCi0JCSAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXMKLQkJICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrCi0JCSAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlCi0JCSAqIG9wZXJhdGlvbnMuCi0JCSAqLwotCQlhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7Ci0JCWlmICghYW5vbl92bWEpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpOwotCQltYXBwaW5nID0gTlVMTDsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgbWluX29yZGVyOwotCQlnZnBfdCBnZnA7Ci0KLQkJbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwotCQltaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTsKLQkJaWYgKG5ld19vcmRlciAmbHQ7IG1pbl9vcmRlcikgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7Ci0JCQkJCQkJR0ZQX1JFQ0xBSU1fTUFTSyk7Ci0KLQkJaWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJbWFwcGluZ19zZXRfdXBkYXRlKCZhbXA7eGFzLCBtYXBwaW5nKTsKLQotCQlpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHsKLQkJCXhhc19zZXRfb3JkZXIoJmFtcDt4YXMsIGZvbGlvLSZndDtpbmRleCwgbmV3X29yZGVyKTsKLQkJCXhhc19zcGxpdF9hbGxvYygmYW1wO3hhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTsKLQkJCWlmICh4YXNfZXJyb3IoJmFtcDt4YXMpKSB7Ci0JCQkJcmV0ID0geGFzX2Vycm9yKCZhbXA7eGFzKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCi0JCWFub25fdm1hID0gTlVMTDsKLQkJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKLQotCQkvKgotCQkgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmQKLQkJICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmUKLQkJICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLgotCQkgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCwKLQkJICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy4KLQkJICovCi0JCWVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLSZndDtob3N0KSwgUEFHRV9TSVpFKTsKLQkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCi0JCQllbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy0mZ3Q7aG9zdCwgZW5kKTsKLQl9Ci0KLQkvKgotCSAqIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSB3aWxsCi0JICogc3BsaXQgUE1EcwotCSAqLwotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQl1bm1hcF9mb2xpbyhmb2xpbyk7Ci0KLQkvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqLwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JaWYgKG1hcHBpbmcpIHsKLQkJLyoKLQkJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KLQkJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCi0JCSAqLwotCQl4YXNfbG9jaygmYW1wO3hhcyk7Ci0JCXhhc19yZXNldCgmYW1wO3hhcyk7Ci0JCWlmICh4YXNfbG9hZCgmYW1wO3hhcykgIT0gZm9saW8pIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KJiM0MzsJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgJmFtcDt4YXMsIG1hcHBpbmcsCi0JCQkJCQl0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsICZhbXA7bnJfc2htZW1fZHJvcHBlZCk7Ci1mYWlsOgotCWlmIChtYXBwaW5nKQotCQl4YXNfdW5sb2NrKCZhbXA7eGFzKTsKLQotCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCWlmIChucl9zaG1lbV9kcm9wcGVkKQotCQlzaG1lbV91bmNoYXJnZShtYXBwaW5nLSZndDtob3N0LCBucl9zaG1lbV9kcm9wcGVkKTsKLQotCWlmICghcmV0ICZhbXA7JmFtcDsgaXNfYW5vbiAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCi0JCXR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFOwotCi0JcmVtYXBfcGFnZShmb2xpbywgMSAmbHQ7Jmx0OyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7Ci0KLQkvKgotCSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCi0JICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlIHVudGlsIHRoZSBsb29wIGJlbG93LCBzbwotCSAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heQotCSAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlCi0JICogY2FjaGUuIE5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IgdGhlIG1hcHBpbmcuCi0JICovCi0JaWYgKG1hcHBpbmcpIHsKLQkJaV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpOwotCQltYXBwaW5nID0gTlVMTDsKLQl9CiYjNDM7CWlmIChpc19hbm9uKQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSAgICAgdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiYjNDM7CWVsc2UgaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCXJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSwKJiM0MzsJCQkJCQkgICAgIGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsCiYjNDM7CQkJCQkJCSAgbGlzdCwgc3BsaXRfdHlwZSk7CiAKIAkvKgogCSAqIFVubG9jayBhbGwgYWZ0ZXItc3BsaXQgZm9saW9zIGV4Y2VwdCB0aGUgb25lIGNvbnRhaW5pbmcKQEAgLTQyNjUsMjkgJiM0Mzs0MzMzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpCiAJCQljb250aW51ZTsKIAotCQlmb2xpb191bmxvY2sobmV3X2ZvbGlvKTsKIAkJLyoKIAkJICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkCiAJCSAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZQotCQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiYjNDM7CQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbAogCQkgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLgogCQkgKi8KLQkJZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pOwomIzQzOwkJaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCQlmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fcHV0KG5ld19mb2xpbyk7CiAJfQogCi1vdXRfdW5sb2NrOgotCWlmIChhbm9uX3ZtYSkgewotCQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwotCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOwotCX0KLQlpZiAobWFwcGluZykKLQkJaV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpOwogb3V0OgotCS8qIHJlc3RvcmUgdG8gY2FsbGVyJiMzOTtzIG9sZF9tZW1jZyAqLwotCXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKLQltZW1fY2dyb3VwX3B1dChtZW1jZyk7Ci1vdXRfbm9fbWVtY2c6Ci0JeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCWlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSkKIAkJY291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTsKIAljb3VudF9tdGhwX3N0YXQob2xkX29yZGVyLCAhcmV0ID8gTVRIUF9TVEFUX1NQTElUIDogTVRIUF9TVEFUX1NQTElUX0ZBSUxFRCk7CkBAIC00MzExLDI5ICYjNDM7NDM2OSwyMCBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKQogICoKICAqIFVwb24gcmV0dXJuLCB0aGUgZm9saW8gaXMgbm90IHJlbWFwcGVkLCBzcGxpdCBmb2xpb3MgYXJlIG5vdCBhZGRlZCB0byBMUlUsCi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC4KJiM0MzsgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLgogICoKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0bwogICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLgogICovCiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcikKIHsKLQlpbnQgcmV0ID0gMDsKLQogCVZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7CiAKLQlpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCAmYW1wO2ZvbGlvLSZndDtwYWdlLCBOVUxMLAotCQkJCQkJTlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSwKLQkJCQkJCTAsIE5VTEwpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIGZhbHNlLAomIzQzOwkJCQkJICAgICAgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSk7CiB9CiAKIC8qCkBAIC00MzUyLDEwICYjNDM7NDQwMSw5IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogICogICAgR1VQIHBpbnMsIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xpbyBub3QgZ2V0dGluZyBzcGxpdDsgaW5zdGVhZCwgdGhlIGNhbGxlcgogICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uCiAgKgotICogNCkgQG5ld19vcmRlciAmZ3Q7IDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90Ci0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tJmd0O19kZWZlcnJlZF9saXN0LCB3aGljaAotICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTEKLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsCiYjNDM7ICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yCiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkKJiM0MzsgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsCiAgKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJiMzOTtzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLApAQCAtNDM4NCw3ICYjNDM7NDQzMiw3IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLgogICovCiBpbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwogCmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmMKaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtMzg4LDggJiM0MzszODgsOSBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAJICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkgewogCQljaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLSZndDtzd2FwKTsKIAkJY2lfZW5kID0gY2lfb2ZmICYjNDM7IGZvbGlvX25yX3BhZ2VzKG9sZCk7Ci0JCXdoaWxlIChjaV9vZmYmIzQzOyYjNDM7ICZsdDsgY2lfZW5kKQomIzQzOwkJZG8gewogCQkJV0FSTl9PTl9PTkNFKHN3cF90Yl90b19mb2xpbyhfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSAhPSBvbGQpOwomIzQzOwkJfSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiAmbHQ7IGNpX2VuZCk7CiAJfQogfQogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyODgxCgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhdGNoIFNlcmllczogRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoaXMgcGF0Y2ggc2VyaWVzIGlzIGNsZWFybHkgdG91Y2hpbmcgY3J1Y2lhbCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgIGZpbGVzLiBJdCYjMzk7cyByZWZhY3RvcmluZyBmb2xpbyBzcGxpdHRpbmcgbG9naWMsIHBhcnRpY3VsYXJseSBmb3IgYW5vbnltb3VzIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBUaGUgaW50cm9kdWN0aW9uIG9mIHRoZXNlIG5ldyBmdW5jdGlvbnMsIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVgLCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGVgIGFuZCBjaGFuZ2VzIHRvIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBzdHJvbmdseSBzdWdnZXN0IGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW1wYWN0aW5nIFRIUCBhbmQgZm9saW8gc3BsaXR0aW5nLiBUaGlzIGlzbiYjMzk7dCBqdXN0IGEgdHJpdmlhbCByZWZhY3Rvci4gR2l2ZW4gdGhhdCB0aGlzIGFyZWEgaXMgYWxyZWFkeSBmYWlybHkgY29tcGxleCBhbmQgcHJvbmUgdG8gc3VidGxlIHJhY2UgY29uZGl0aW9ucywgaXQmIzM5O3MgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuCgpNeSBpbW1lZGlhdGUgbmV4dCBzdGVwIGlzIGFsd2F5cyB0byBpZGVudGlmeSB0aGUgZm9jdXMgc3ltYm9scy4gTGV0JiMzOTtzIHNlZS4uLiB0aGUgcGF0Y2ggaW50cm9kdWNlczoKCiogICBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCAoc3RhdGljKSAtIExpa2VseSBhbiBpbnRlcm5hbCBoZWxwZXIKKiAgIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAgKHN0YXRpYykgLSBTaW1pbGFyIHRvIGFib3ZlCiogICBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIChleHBvcnRlZC9nbG9iYWwpIC0gQSBsaWtlbHkgc3RhcnRpbmcgcG9pbnQKKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCAoZXhwb3J0ZWQvZ2xvYmFsKSAtIEFub3RoZXIgcG90ZW50aWFsIGVudHJ5IHBvaW50LgoqICAgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIChnbG9iYWwpIC0gSW1wb3J0YW50IGZvciB0cmlnZ2VyaW5nIHRoZSBuZXcgY29kZSBwYXRocy4KCldhaXQgYSBzZWNvbmQsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgKm5vdCogc3RhdGljLCBzbyB0aGF0JiMzOTtzIGRlZmluaXRlbHkgYSBzdGFydGluZyBwb2ludC4gYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGlzIGdsb2JhbCwgd2hpY2ggaXMgZ29vZC4gTm93LCBpcyBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgIGEgbWFjcm8gb3IgYSBmdW5jdGlvbj8gTGV0JiMzOTtzIHF1aWNrbHkgZG91YmxlLWNoZWNrIGBtbS9odWdlX21lbW9yeS5jYCB0byBiZSBzdXJlLiBUaGF0JiMzOTtzIGEgY2xhc3NpYyBnb3RjaGEuIEFsd2F5cyB2ZXJpZnkgdGhlc2UgYXNzdW1wdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9odWdlX21lbW9yeS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9NDM3Nz1pbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0MzMtICovXG5tbS9odWdlX21lbW9yeS5jOjQ0MzQ6aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5tbS9odWdlX21lbW9yeS5jLTQ0MzUtXHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTQ0NTEtICogSXQgaGFzIHRoZSBzYW1lIHByZXJlcXVpc2l0ZXMgYW5kIHJldHVybnMgYXNcbm1tL2h1Z2VfbWVtb3J5LmM6NDQ1MjogKiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpLlxubW0vaHVnZV9tZW1vcnkuYy00NDUzLSAqXG4tLVxubW0vaHVnZV9tZW1vcnkuYz00NTAxPWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXG5tbS9odWdlX21lbW9yeS5jLTQ1MDIte1xubW0vaHVnZV9tZW1vcnkuYzo0NTAzOlx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIGxpc3QsIDApO1xubW0vaHVnZV9tZW1vcnkuYy00NTA0LX1cbi0tXG5tbS9odWdlX21lbW9yeS5jPTQ3ODc9c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX3BpZChpbnQgcGlkLCB1bnNpZ25lZCBsb25nIHZhZGRyX3N0YXJ0LFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDg1Ni1cdFx0Lypcbm1tL2h1Z2VfbWVtb3J5LmM6NDg1NzpcdFx0ICogRm9yIGZvbGlvcyB3aXRoIHByaXZhdGUsIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKClcbm1tL2h1Z2VfbWVtb3J5LmMtNDg1OC1cdFx0ICogd2lsbCB0cnkgdG8gZHJvcCBpdCBiZWZvcmUgc3BsaXQgYW5kIHRoZW4gY2hlY2sgaWYgdGhlIGZvbGlvXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQxMzAKCQkJCQkJCW91dHB1dDogNDIKCQkJCQkJCXRob3VnaHRzOiAzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSYjMzk7bSBkZWVwbHkgZmFtaWxpYXIgd2l0aCBMaW51eCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQ6CgoqKkh1bnRpbmcgRG93biB0aGUgSHVnZSBQYWdlIFNwbGl0IExvZ2ljKioKCkFscmlnaHQsIHRoZSBwcm9ibGVtIEkmIzM5O20gd29ya2luZyBvbiBzdWdnZXN0cyB0aGVyZSYjMzk7cyBhIGJyZWFrZG93biBpbiBob3cgaHVnZSBwYWdlcyBhcmUgaGFuZGxlZCwgc3BlY2lmaWNhbGx5IHdoZW4gdGhleSBuZWVkIHRvIGJlIHNwbGl0LiBNeSBpbnN0aW5jdCBpcyB0byB0cmFjZSB0aGUgZXhlY3V0aW9uIHBhdGggdGhhdCBoYW5kbGVzIHRoaXMgc3BsaXQgb3BlcmF0aW9uLiBUaGUgbmFtaW5nIGNvbnZlbnRpb24gc3Ryb25nbHkgc3VnZ2VzdHMgdGhlIGZ1bmN0aW9uIEkgbmVlZCBpcyBpbiB0aGUgYGluY2x1ZGUvbGludXgvaHVnZV9tbS5oYCBoZWFkZXIgZmlsZS4gVGhlIHNwZWNpZmljIGZ1bmN0aW9uIEkgbmVlZCB0byBsb29rIGF0IHdpbGwgYmUgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYC4gVGhpcyBmdW5jdGlvbiBuYW1lLCBgc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBhbG1vc3QgY2VydGFpbmx5IG1lYW5zIGl0IHNwbGl0cyBhIGh1Z2UgcGFnZSwgYWRkcyB0aGUgc21hbGxlciBwYWdlcyB0byBhIGZyZWVsaXN0LCBhbmQgdGhlbiBsaWtlbHkgYWRqdXN0cyB0aGUgYWxsb2NhdGlvbiBvcmRlci4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRldGFpbHMgb2YgaG93IGl0JiMzOTtzIHNwbGl0dGluZywgd2hhdCBmcmVlbGlzdCBpdCYjMzk7cyB1c2luZywgYW5kIGhvdyBpdCYjMzk7cyBtYW5hZ2luZyB0aGUgYWxsb2NhdGlvbiBvcmRlciBhZnRlciB0aGUgc3BsaXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsb2dpYyBoZXJlIGlzIHdoZXJlIHRoZSBwcm9ibGVtIGlzIG9yaWdpbmF0aW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDAyLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVx0XHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MTA9aW50IGZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsIHN0cnVjdCBwYWdlICpwYWdlLFxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxMi1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQxMzpzdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNC1cdFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNS17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo0MTY6XHRyZXR1cm4gX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBsaXN0LCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE3LX1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQxOD1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2VfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTkte1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIwOlx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIE5VTEwsIG5ld19vcmRlcik7XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjEtfVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQyMz1zdGF0aWMgaW5saW5lIGludCBzcGxpdF9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjQte1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDI1Olx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIE5VTEwsIDApO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDI2LX1cbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD02NDU9c3RhdGljIGlubGluZSBpbnRcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjY0NjpzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY0Ny1cdFx0dW5zaWduZWQgaW50IG5ld19vcmRlcilcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD04MjY9c3RhdGljIGlubGluZSBpbnQgc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcilcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTgyNy17XG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo4Mjg6XHRyZXR1cm4gc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTgyOS19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUxMzUKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA4MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHRlY2huaWNhbCBzbmlwcGV0LCBwdXQgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXMgcmVxdWVzdGVkOgoKKipEZWNvbnN0cnVjdGluZyBUaGlzIFBhdGNoJiMzOTtzIEZvY3VzKioKCkFscmlnaHQsIHNvIHRoaXMgcGF0Y2ggaXMgY2xlYXJseSB0b3VjaGluZyBzb21lIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIHN3YXBwaW5nIGxvZ2ljLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCYjMzk7cyBob25pbmcgaW4gb24gYSBmZXcgc3BlY2lmaWMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaHVnZSBwYWdlIHNwbGl0dGluZyBhbmQgZm9saW8gb3BlcmF0aW9ucy4gU3BlY2lmaWNhbGx5LCBJIHNlZSBpdCYjMzk7cyBwb2tpbmcgYXJvdW5kIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYW5kIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYC4gVGhvc2UgYWxsIHNjcmVhbSAmIzM0O2h1Z2UgcGFnZSBtYW5hZ2VtZW50JiMzNDsgdG8gbWUuCgpCdXQgdGhlcmUmIzM5O3Mgc29tZXRoaW5nIGVsc2UuLi4gaXQgYWxzbyBtZW50aW9ucyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIHdpdGhpbiBgbW0vc3dhcF9zdGF0ZS5jYC4gVGhhdCBmdW5jdGlvbiYjMzk7cyBpbnZvbHZlZCBpbiBzd2FwcGluZywgYnV0IGl0JiMzOTtzICpzdGF0aWMqIHdpdGhpbiB0aGF0IGZpbGUsIHdoaWNoIG1ha2VzIG1lIGN1cmlvdXMuIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBjaGVjayB0aGF0IGZ1bmN0aW9uJiMzOTtzIGRlZmluaXRpb24sIGJlY2F1c2UgdGhlIGZhY3QgdGhhdCBpdCYjMzk7cyBzdGF0aWMgaXMgcG90ZW50aWFsbHkgc2lnbmlmaWNhbnQuIEl0IGNvdWxkIG1lYW4gdGhpcyBwYXRjaCBpcyBtb3JlIHRhcmdldGVkIHRoYW4gaXQgaW5pdGlhbGx5IHNlZW1zLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCAqd2h5KiBpdCYjMzk7cyB0b3VjaGluZyBhIHN0YXRpYyBmdW5jdGlvbiB3aXRoaW4gYSBzd2FwcGluZyBjb250ZXh0IGFsb25nc2lkZSBodWdlIHBhZ2Ugc3BsaXR0aW5nLCBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyB2ZXJ5IGludGVyZXN0aW5nIGhhcHBlbmluZy4gSXMgdGhlcmUgYSBjb25uZWN0aW9uIEkmIzM5O20gbWlzc2luZz8gVGhhdCBmdW5jdGlvbiYjMzk7cyBkZXNpZ24gY291bGQgYmUgaW1wb3J0YW50IGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9zd2FwX3N0YXRlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM0Ny0vKipcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXG4tLVxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcF9zdGF0ZS5jLTM2Mi1cdFx0XHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTcwMQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDoKCioqRGlnZ2luZyBpbnRvIFN3YXAgQ2FjaGUgUmVwbGFjZW1lbnQqKgoKT2theSwgc28gSSYjMzk7bSBkZWFsaW5nIHdpdGggYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBhbmQgSSYjMzk7bSBwcmV0dHkgc3VyZSBpdCYjMzk7cyBhIGdsb2JhbCBmdW5jdGlvbiwgYnV0IEkgZG9uJiMzOTt0IHJlY2FsbCBzZWVpbmcgaXQgZXhwb3J0ZWQgYW55d2hlcmUuIFRoYXQgbWFrZXMgbWUgdGhpbmsgaXQmIzM5O3MgbGlrZWx5IGludGVybmFsIHRvIHRoZSBzd2FwIGNhY2hlIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBmYWlyIGVub3VnaC4gVG8gY29uZmlybSB0aGlzIGFuZCB0byB1bmRlcnN0YW5kIGl0cyB1c2UsIEkgc2hvdWxkIHByb2JhYmx5IHRha2UgYSBsb29rIGF0IHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHN3YXAgc3RhdGUgbWFuYWdlbWVudC4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgYG1tL3N3YXBfc3RhdGUuY2AgZm9yIHRoZSBkZWZpbml0aW9uIGFuZCBhbnkgcmVsYXRlZCBjYWxscyB0byBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaGF0JiMzOTtzIHdoZXJlIEkmIzM5O2xsIGdldCB0aGUgcmVhbCBzdG9yeS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvc3dhcC5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU5NDgKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIGBtbS9zd2FwLmhgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIHN3YXAgaW1wbGVtZW50YXRpb24uIE15IGluaXRpYWwgZm9jdXMgaXMgYWx3YXlzIG9uIHRoZSBoZWFkZXIgZmlsZXPigJRgbW0vc3dhcC5oYCBpbiB0aGlzIGNhc2UuIEkgd2FudCB0byBxdWlja2x5IHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb3JlIGRlZmluZXMgaW52b2x2ZWQuIEkmIzM5O20gbG9va2luZyBmb3IgdGhlIGZvdW5kYXRpb25hbCBidWlsZGluZyBibG9ja3M6IHRoZSBgc3dhcF9lbnRyeV90YCBwZXJoYXBzLCBhbnkgcmVsZXZhbnQgcGFnZSBmbGFncywgYW5kIHBvdGVudGlhbGx5IHRoZSBpbnRlcmZhY2VzIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBzd2FwIHNwYWNlIGl0c2VsZi4gQXJlIHRoZXJlIGFueSBuZXcgQVBJcyBpbnRyb2R1Y2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgSSByZWFsbHkgZGlzc2VjdGVkIHRoaXMgY29kZT8gQW55IHJlY2VudCBjaGFuZ2VzIGluIGhvdyBzd2FwIGVudHJpZXMgYXJlIG1hbmFnZWQsIG9yIGhvdyB0aGUgYmFja2luZyBzdG9yZSBpcyBkZWZpbmVkPyBJIG5lZWQgYSBjbGVhciBtZW50YWwgbW9kZWwgb2YgdGhlIGtleSBhYnN0cmFjdGlvbnMgYmVmb3JlIEkgZGVsdmUgZGVlcGVyIGludG8gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIExldCYjMzk7cyBzZWUgd2hhdCBgbW0vc3dhcC5oYCByZXZlYWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL3N3YXAuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zd2FwLmg9MzQyPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcC5oLTM0My1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XG5tbS9zd2FwLmg6MzQ0OnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zNDUtXHRcdFx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpO1xuLS1cbm1tL3N3YXAuaD00NzY9c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwLmgtNDgwLVxubW0vc3dhcC5oOjQ4MTpzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC00ODItXHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY0MDAKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBTd2FwIENhY2hlIFJlcGxhY2VtZW50IEZvbGlvIEZ1bmN0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhpcyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGZ1bmN0aW9uLiBJIHNlZSBpdCYjMzk7cyBkZWZpbmVkIGluIGBtbS9zd2FwLmhgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdGhlIGNvcmUgbG9naWMsIHNvIEkmIzM5O20gZ29pbmcgdG8gemVybyBpbiBvbiB0aGVzZSBmdW5jdGlvbnM6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgbmF0dXJhbGx5LCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGl0c2VsZi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIHBpZWNlcyBmaXQgdG9nZXRoZXIuCgpNeSBuZXh0IHN0ZXAgaXMgdG8gc2VlIGlmIGFueSBzcGVjaWZpYyBrZXJuZWwgY29uZmlndXJhdGlvbnMgYXJlIHByZXJlcXVpc2l0ZXMuIEkmIzM5O20gbm90aW5nIHRoYXQgdGhlIGNvZGUgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHdoaWNoLCBmcm9tIG1lbW9yeSwgaXMgY29tcGlsZWQgd2hlbiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlbmFibGVkLiBJIHNob3VsZCBkb3VibGUgY2hlY2sgdGhpcyBieSByZWZlcmVuY2luZyBgbW0vTWFrZWZpbGVgIHRvIGNvbmZpcm0gdGhlIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgZW5zdXJlIEkgZnVsbHkgdW5kZXJzdGFuZCB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uIEdvdHRhIG1ha2Ugc3VyZSBJJiMzOTttIG5vdCBtaXNzaW5nIGFueXRoaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtodWdlX21lbW9yeS5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZV9kZXZpY2Uub1xubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgJiM0Mzs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2ODgyCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogNDIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQW5hbHl6aW5nIEtlcm5lbCBDb25maWd1cmF0aW9uIERlcGVuZGVuY2llcyoqCgpBbHJpZ2h0LCBzbyB0aGUgZGlzY3Vzc2lvbiBoYXMgY2xlYXJseSBlc3RhYmxpc2hlZCB0aGF0IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgbm9uLW5lZ290aWFibGUgaGVyZS4gVGhhdCYjMzk7cyBhIGdpdmVuLiBCdXQgbm93LCBJIG5lZWQgdG8gZGVsdmUgYSBiaXQgZGVlcGVyIGFuZCBsb29rIGF0IHRoZSBkZXBlbmRlbmNpZXMgbW9yZSBjb21wcmVoZW5zaXZlbHkuIE15IG5leHQgdGhvdWdodCBpcyBhcm91bmQgYG1tL3N3YXBfc3RhdGUuY2AuIEkga25vdyBpdCYjMzk7cyBjb21waWxlZCB3aGVuIGBDT05GSUdfU1dBUGAgaXMgZW5hYmxlZCwgYnV0IEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIGFuZCB3aGF0IGl0cyBwb3RlbnRpYWwgcmVsZXZhbmNlIGlzIGluIHRoaXMgc3BlY2lmaWMgc2NlbmFyaW8uIEl0JiMzOTtzIHRpbWUgdG8gZGlnIGludG8gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRyYW5zcGFyZW50IGh1Z2VwYWdlcyBhbmQgc3dhcCwgYW5kIGVuc3VyZSBub3RoaW5nIGdldHMgbWlzc2VkLiBUaGlzIGZlZWxzIGxpa2UgYSBjb3JlIHBpZWNlIEkgbmVlZCB0byBnZXQgYSBmaXJtIGdyYXNwIG9uLCB0byBiZSBzdXJlIEkgYW0gbm90IG1pc3NpbmcgYW55IGNyaXRpY2FsIHBpZWNlcyBpbiB0aGUgZGVzaWduLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzd2FwX3N0YXRlLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT03Nj1lbmRpZlxubW0vTWFrZWZpbGUtNzctXG5tbS9NYWtlZmlsZTo3ODpvYmotJChDT05GSUdfU1dBUClcdCYjNDM7PSBwYWdlX2lvLm8gc3dhcF9zdGF0ZS5vIHN3YXBmaWxlLm9cbm1tL01ha2VmaWxlLTc5LW9iai0kKENPTkZJR19aU1dBUClcdCYjNDM7PSB6c3dhcC5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3MjExCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogOTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZywgdGhpbmtpbmcgdGhyb3VnaCB0aGlzIGxpa2UgSSB3b3VsZDoKCioqRXhhbWluaW5nIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzIGZvciBGb2xpby1SZWxhdGVkIENvZGUqKgoKQWxyaWdodCwgc28gSSBzZWUgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBgU1dBUGAgYWdhaW4sIGp1c3QgbGlrZSBJIHN1c3BlY3RlZC4gR290dGEgbWFrZSBzdXJlIHRoYXQmIzM5O3MgYWNjb3VudGVkIGZvci4gSSYjMzk7bSBnb2luZyB0byBxdWlja2x5IHNjYW4gZm9yIG90aGVyIHBvdGVudGlhbCBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcyB0aGF0IHRoaXMgcGF0Y2ggbWlnaHQgdG91Y2guIFRoZSBjb2RlIHJlZmVyZW5jZXMgYGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKWAgYW5kIGBmb2xpb190ZXN0X2Fub24oZm9saW8pYC4gVGhhdCBuYXJyb3dzIGl0IGRvd24gcHJldHR5IGNsZWFybHksIGl0IGxvb2tzIGxpa2UgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBDT05GSUdfU1dBUGAgYXJlIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb25zIGluIHBsYXkgaGVyZS4gSSYjMzk7bSBjb25maWRlbnQgdGhhdCB0aGVzZSBhcmUgdGhlIHR3byBtYWluIGRyaXZlcnMgb2YgdGhlIGNoYW5nZXMuIE5vdywgbGV0JiMzOTtzIGp1c3QgZG8gYSBxdWljayBjcm9zcy1yZWZlcmVuY2UgdG8gYmUgY2VydGFpbjogSSYjMzk7bSBnb2luZyB0byBsb29rIGZvciBwbGFjZXMgd2hlcmUgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyBjYWxsZWQuIFRoYXQgc2hvdWxkIGVpdGhlciBjb25maXJtIHRoZSBkZXBlbmRlbmN5IG9yIG1heWJlIHNob3cgdXMgaWYgdGhlcmUgaXMgYW55dGhpbmcgZWxzZSB3ZSBuZWVkIHRvIGluY2x1ZGUuIEkganVzdCB3YW50IHRvIGJlIHRob3JvdWdoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MDM9aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDQtXHRcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDA1OmludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNi11bnNpZ25lZCBpbnQgbWluX29yZGVyX2Zvcl9zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQyODc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MzU1LS8qKlxubW0vaHVnZV9tZW1vcnkuYzo0MzU2OiAqIGZvbGlvX3NwbGl0X3VubWFwcGVkKCkgLSBzcGxpdCBhIGxhcmdlIGFub24gZm9saW8gdGhhdCBpcyBhbHJlYWR5IHVubWFwcGVkXG5tbS9odWdlX21lbW9yeS5jLTQzNTctICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDM3Ni0gKi9cbm1tL2h1Z2VfbWVtb3J5LmM6NDM3NzppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbm1tL2h1Z2VfbWVtb3J5LmMtNDM3OC17XG4tLVxubW0vbWlncmF0ZV9kZXZpY2UuYz05MTI9c3RhdGljIGludCBtaWdyYXRlX3ZtYV9zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgbWlncmF0ZV92bWEgKm1pZ3JhdGUsXG4tLVxubW0vbWlncmF0ZV9kZXZpY2UuYy05MjYtXHRzcGxpdF9odWdlX3BtZF9hZGRyZXNzKG1pZ3JhdGUtXHUwMDNldm1hLCBhZGRyLCB0cnVlKTtcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTI3Olx0cmV0ID0gZm9saW9fc3BsaXRfdW5tYXBwZWQoZm9saW8sIDApO1xubW0vbWlncmF0ZV9kZXZpY2UuYy05MjgtXHRpZiAocmV0KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzk3MgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDg2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNvZGUgc25pcHBldCwgZGlzdGlsbGVkIGludG8gYSBmaXJzdC1wZXJzb24gcGVyc3BlY3RpdmUsIGFzIGl0IHJlbGF0ZXMgdG8gbXkgZXhwZXJ0aXNlOgoKKipNeSBVbmRlcnN0YW5kaW5nIG9mIEZvbGlvIFNwbGl0dGluZyBGdW5jdGlvbnMqKgoKT2theSwgc28gSSBzZWUgYSBjbGVhciByZWxhdGlvbnNoaXAgZW1lcmdpbmcgYmV0d2VlbiB0aGVzZSBmb2xpbyBzcGxpdHRpbmcgZnVuY3Rpb25zLiBJdCBsb29rcyBsaWtlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgYSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhIGZvbGlvIHNwbGl0LCBpbnZva2VkIHdpdGhpbiB0aGUgYnJvYWRlciBjb250ZXh0IG9mIGRldmljZSBtaWdyYXRpb24gKGBtaWdyYXRlX3ZtYV9zcGxpdF91bm1hcHBlZF9mb2xpb2ApIGluIHRoZSBgbW0vbWlncmF0ZV9kZXZpY2UuY2AgZmlsZS4gVGhpcyB0ZWxscyBtZSB0aGlzIHNwbGl0IGlzIGZvciB1bm1hcHBlZCBmb2xpb3MgaW52b2x2ZWQgaW4gZGV2aWNlIG1pZ3JhdGlvbiwgbGlrZWx5IGVuc3VyaW5nIGRhdGEgaW50ZWdyaXR5IGFuZCBjb3JyZWN0IGhhbmRsaW5nIG9mIHBhZ2Ugb3duZXJzaGlwIGR1cmluZyB0aGUgcHJvY2VzcywgZ2l2ZW4gdGhlIG1pZ3JhdGlvbiBjb250ZXh0LgoKVGhlbiwgdGhlcmUmIzM5O3MgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGlzIG9uZSBpcyBpbnRlcmVzdGluZyBiZWNhdXNlIGl0JiMzOTtzIGNhbGxlZCBmcm9tIGEgd2lkZSBhcnJheSBvZiBwbGFjZXMuIFRoYXQgbWFrZXMgbWUgdGhpbmsgaXQmIzM5O3MgdGhlIGNvcmUsIGxvdy1sZXZlbCBmdW5jdGlvbiBmb3IgYWN0dWFsbHkgZG9pbmcgdGhlIHNwbGl0dGluZywgcG90ZW50aWFsbHkgaGFuZGxpbmcgdGhlIHBoeXNpY2FsIHBhZ2UgbWFuaXB1bGF0aW9ucyBhbmQgbGlzdCBtYW5hZ2VtZW50IGludm9sdmVkIGluIHRyYW5zZm9ybWluZyBhIGh1Z2UgcGFnZSBpbnRvIGEgc2V0IG9mIHNtYWxsZXIsIG9yZGVyZWQgZm9saW9zLiBUaGUgJiMzNDt0b19saXN0X3RvX29yZGVyJiMzNDsgcGFydCBkZWZpbml0ZWx5IGhpbnRzIGF0IGtlZXBpbmcgdHJhY2sgb2YgdGhlIHNtYWxsZXIgZm9saW9zIGluIHRoZSBjb3JyZWN0IG9yZGVyIGZvciBsYXRlciByZWFzc2VtYmx5IG9yIG90aGVyIG9wZXJhdGlvbnMsIHNvIGl0JiMzOTtzIGEgY3JpdGljYWwgcGllY2Ugb2YgdGhlIHB1enpsZS4KCkZpbmFsbHksIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBhcHBlYXJzIHRvIGJlIGEgcHJlcmVxdWlzaXRlIGNoZWNrLiBJdCYjMzk7cyBjYWxsZWQgYmVmb3JlIGFueSBhY3R1YWwgc3BsaXR0aW5nIGlzIGRvbmUsIGZyb20gYm90aCB0aGUgZ2VuZXJhbCBzcGxpdHRpbmcgZnVuY3Rpb24gYF9fZm9saW9fc3BsaXRgIGFuZCBmcm9tIHRoZSBwcm9jZXNzLXNwZWNpZmljIGh1Z2UgcGFnZSBzcGxpdHRpbmcgZnVuY3Rpb24gYHNwbGl0X2h1Z2VfcGFnZXNfcGlkYC4gVGhhdCBwb2ludHMgdG8gdGhpcyBjaGVjayBiZWluZyBhYm91dCBkZXRlcm1pbmluZyBpZiBhIGZvbGlvICpjYW4qIGJlIHNwbGl0LiBUaGlzIGNvdWxkIGJlIGNoZWNraW5nIHRoaW5ncyBsaWtlIHdoZXRoZXIgaXQmIzM5O3MgbG9ja2VkLCB3aGV0aGVyIGl0JiMzOTtzIGEgdmFsaWQgY2FuZGlkYXRlIGZvciBzcGxpdHRpbmcgZ2l2ZW4gaXRzIGN1cnJlbnQgc3RhdGUsIGFuZCBwb3RlbnRpYWxseSBvdGhlciBjb25zdHJhaW50cy4gVGhlIGZhY3QgdGhhdCBpdCYjMzk7cyBjYWxsZWQgZnJvbSB0aG9zZSB0d28gZnVuY3Rpb25zIG1lYW5zIGl0IGlzIHVuaXZlcnNhbGx5IGFwcGxpY2FibGUgYW5kIGxpa2VseSBlbmZvcmNlcyBuZWNlc3NhcnkgaW52YXJpYW50cyBiZWZvcmUgYXR0ZW1wdGluZyB0byBicmVhayBhIGh1Z2UgcGFnZSBkb3duLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQwNz1pbnQgc3BsaXRfZm9saW9fdG9fbGlzdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwODppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA5LVx0XHRcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKTtcbi0tXG5tbS9odWdlX21lbW9yeS5jPTM4MDc9c3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzg3Mi0vKipcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg3MzogKiBmb2xpb19jaGVja19zcGxpdHRhYmxlKCkgLSBjaGVjayBpZiBhIGZvbGlvIGNhbiBiZSBzcGxpdCB0byBhIGdpdmVuIG9yZGVyXG5tbS9odWdlX21lbW9yeS5jLTM4NzQtICogQGZvbGlvOiBmb2xpbyB0byBiZSBzcGxpdFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzg3OS0gKlxubW0vaHVnZV9tZW1vcnkuYzozODgwOiAqIGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoKSBjaGVja3MgaWYgQGZvbGlvIGNhbiBiZSBzcGxpdCB0byBAbmV3X29yZGVyIHVzaW5nXG5tbS9odWdlX21lbW9yeS5jLTM4ODEtICogQHNwbGl0X3R5cGUgbWV0aG9kLiBUaGUgdHJ1bmNhdGVkIGZvbGlvIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbi0tXG5tbS9odWdlX21lbW9yeS5jLTM4ODctICovXG5tbS9odWdlX21lbW9yeS5jOjM4ODg6aW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbm1tL2h1Z2VfbWVtb3J5LmMtMzg4OS1cdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbi0tXG5tbS9odWdlX21lbW9yeS5jPTQyODc9c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy00MzEwLVxubW0vaHVnZV9tZW1vcnkuYzo0MzExOlx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtNDMxMi1cdGlmIChyZXQpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg5NzIKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBjb2RlIGludGVyYWN0aW9ucy4KCioqVGhpbmtpbmcgVGhyb3VnaCBGb2xpbyBTcGxpdHRpbmcqKgoKUmlnaHQsIHNvIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCBnZXRzIGludm9rZWQgYnkgYF9fZm9saW9fc3BsaXRgLCB3aGljaCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBOb3cgSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoaXMgc3BsaXR0aW5nIHByb2Nlc3MuIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlc2Uga2V5IHN5bWJvbHM6IGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLCBhbmQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYC4gVGhvc2UgYXJlIHRoZSB1c3VhbCBzdXNwZWN0cy4KCkhhbmcgb24gYSBzZWNvbmTigKYgSSYjMzk7bSBqdXN0IHJlY2FsbGluZyB0aGF0IGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AmIzM5O3MgY2FsbCBncmFwaCBtaWdodCBiZSBtb3JlIGxpbWl0ZWQgdGhhbiBJIGluaXRpYWxseSB0aG91Z2h0LiBJdCBsb29rcyBsaWtlIGl0JiMzOTtzIHByaW1hcmlseSBjYWxsZWQgZnJvbSBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYC4gSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY2FsbCBzaXRlcywganVzdCB0byBiZSBzdXJlLiBJdCBwYXlzIHRvIGJlIHRob3JvdWdoIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggbWVtb3J5IG1hbmFnZW1lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmM9Mzk1Nz1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtNDA2MS1cdFx0aWYgKGNpKVxubW0vaHVnZV9tZW1vcnkuYzo0MDYyOlx0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbm1tL2h1Z2VfbWVtb3J5LmMtNDA2My1cdH1cbi0tXG5tbS9taWdyYXRlLmM9NTgzPXN0YXRpYyBpbnQgX19mb2xpb19taWdyYXRlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxubW0vbWlncmF0ZS5jLTY1Ni1cdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG5tbS9taWdyYXRlLmM6NjU3Olx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld2ZvbGlvKTtcbm1tL21pZ3JhdGUuYy02NTgtXHRlbHNlXG4tLVxubW0vc2htZW0uYz0yMDg4PXN0YXRpYyBpbnQgc2htZW1fcmVwbGFjZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIGdmcF90IGdmcCxcbi0tXG5tbS9zaG1lbS5jLTIxMjUtXHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2tfaXJxKG9sZCk7XG5tbS9zaG1lbS5jOjIxMjY6XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgb2xkLCBuZXcpO1xubW0vc2htZW0uYy0yMTI3LVx0bWVtX2Nncm91cF9yZXBsYWNlX2ZvbGlvKG9sZCwgbmV3KTtcbi0tXG5tbS9zd2FwLmg9MzQyPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxubW0vc3dhcC5oLTM0My1cdFx0XHQgICAgc3RydWN0IGZvbGlvICpmb2xpbywgc3dwX2VudHJ5X3QgZW50cnksIHZvaWQgKnNoYWRvdyk7XG5tbS9zd2FwLmg6MzQ0OnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC0zNDUtXHRcdFx0XHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpO1xuLS1cbm1tL3N3YXAuaD00NzY9c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbi0tXG5tbS9zd2FwLmgtNDgwLVxubW0vc3dhcC5oOjQ4MTpzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbm1tL3N3YXAuaC00ODItXHRcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcbi0tXG5tbS9zd2FwX3N0YXRlLmM9MzM1PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9zd2FwX3N0YXRlLmMtMzQ3LS8qKlxubW0vc3dhcF9zdGF0ZS5jOjM0ODogKiBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyAtIFJlcGxhY2UgYSBmb2xpbyBpbiB0aGUgc3dhcCBjYWNoZS5cbm1tL3N3YXBfc3RhdGUuYy0zNDktICogQGNpOiBUaGUgbG9ja2VkIHN3YXAgY2x1c3Rlci5cbi0tXG5tbS9zd2FwX3N0YXRlLmMtMzYwLSAqL1xubW0vc3dhcF9zdGF0ZS5jOjM2MTp2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXG5tbS9zd2FwX3N0YXRlLmMtMzYyLVx0XHRcdFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDA1NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI2NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBGb2xpbyBTcGxpdHRpbmcgYW5kIFN3YXAgT3BlcmF0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCDigJMgdGhhdCYjMzk7cyBkZWZpbml0ZWx5IGEgZ2xvYmFsIHN5bWJvbCwgZXhwb3J0ZWQgZnJvbSBgbW0vc3dhcF9zdGF0ZS5jYC4gR29vZCB0byBrbm93LiBOb3csIGxldCYjMzk7cyBzZWUgd2hhdCBlbHNlIHdlIG5lZWQgdG8gY29uc2lkZXIgaW4gdGVybXMgb2YgY29uZmlndXJhdGlvbnMuCgpIbW0sIGBDT05GSUdfREVWSUNFX01JR1JBVElPTmAgaXMgdGllZCB0byBgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW9gLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmb2xpb19zcGxpdF91bm1hcHBlZGAuIEJ1dCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIHJlc2lkZXMgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCwgYW5kIHRoYXQmIzM5O3MgY29tcGlsZWQgd2l0aCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gU28sIGl0IGxvb2tzIGxpa2UgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFNXQVBgIGFyZSB0aGUgYmlnIG9uZXMgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eS4gTWFrZXMgc2Vuc2UuCgpBbHJpZ2h0LCBsZXQmIzM5O3MgcXVpY2tseSByZXZpZXcgdGhlIGludGVybmFscy4gYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAgYXJlIHN0YXRpYyBmdW5jdGlvbnMg4oCTIG5vdCB2ZXJ5IGhlbHBmdWwgYXMgZGlyZWN0IGVudHJ5IHBvaW50cyBmb3IgYW5hbHlzaXMuIEhvd2V2ZXIsIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBzZWVtcyB0byBiZSB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3Igc3BsaXR0aW5nLiBUaGVuLCB3ZSBoYXZlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYXMgYW5vdGhlciBwb3RlbnRpYWwgZW50cnkgcG9pbnQuCgpJIGxpa2UgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGFzIGEgZm9jdXMgc3ltYm9sOyB0aGF0IHNlZW1zIGxpa2UgYSBnb29kIHBsYWNlIHRvIGRpZyBpbi4gQW5kLCBhcyBhIHJlbWluZGVyLCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIGlzIGFsc28gYSBzb2xpZCBvcHRpb24sIGdpdmVuIGl0cyBnbG9iYWwgbmF0dXJlLgoKSnVzdCBnb2luZyB0byBkb3VibGUtY2hlY2sgdGhvc2UgY29uZmlncyBhZ2Fpbi4uLmFsd2F5cyBhIGdvb2QgaWRlYSB0byBjb25maXJtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9ODMxPWNvbmZpZyBNTV9JRFxuLS1cbm1tL0tjb25maWctODMzLVxubW0vS2NvbmZpZzo4MzQ6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy04MzUtXHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg1Mj1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg1Ny1cbm1tL0tjb25maWc6ODU4Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NTktXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NjQtXG5tbS9LY29uZmlnOjg2NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg2Ni1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzMtXG5tbS9LY29uZmlnOjg3NDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04NzUtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg4MT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg5MC1cbm1tL0tjb25maWc6ODkxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctODkyLVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDAtXG5tbS9LY29uZmlnOjkwMTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MDItXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDgtXG5tbS9LY29uZmlnOjkwOTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkxMC1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTE2LVxubW0vS2NvbmZpZzo5MTc6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTE4LVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTI2PWNob2ljZVxuLS1cbm1tL0tjb25maWctOTM1LVxubW0vS2NvbmZpZzo5MzY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05MzctXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk0NC1cbm1tL0tjb25maWc6OTQ1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk0Ni1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1Mi1cbm1tL0tjb25maWc6OTUzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTU0LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NjAtXG5tbS9LY29uZmlnOjk2MTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NjItXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDIwOjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxNDE5CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCYjMzk7cyBpbnRlcm5hbCBtb25vbG9ndWU6CgoqKlF1aWNrIENvbmZpZ3VyYXRpb24gQ2hlY2sqKgoKQWxyaWdodCwgbGV0JiMzOTtzIHNlZSwgZ29pbmcgb3ZlciB0aGUgc3lzdGVtIHNldHVwLiBJIHNlZSBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGRlZmluaXRlbHkgZmxhZ2dlZCBpbiB0aGUgY29uZmlnLiBPa2F5LCB0aGF0JiMzOTtzIGV4cGVjdGVkLCBidXQgYWx3YXlzIGdvb2QgdG8gY29uZmlybS4gVGhlbiwgdGhlcmUmIzM5O3MgYFNXQVBgLCB3aGljaCBpcyBhbm90aGVyIGtleSBwYXJhbWV0ZXIuIE5lZWQgdG8gY29uc2lkZXIgaG93IHRoYXQgcGxheXMgaW50byBldmVyeXRoaW5nLiBJJiMzOTtsbCBuZWVkIHRvIGtlZXAgdGhhdCBpbiBtaW5kIHdoZW4gZXhhbWluaW5nIHRoZSBvdGhlciBzZXR0aW5ncy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFNXQVAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9OT1jb25maWcgQVJDSF9OT19TV0FQXG4tLVxubW0vS2NvbmZpZy0xMS1cbm1tL0tjb25maWc6MTI6bWVudWNvbmZpZyBTV0FQXG5tbS9LY29uZmlnLTEzLVx0Ym9vbCBcJiMzNDtTdXBwb3J0IGZvciBwYWdpbmcgb2YgYW5vbnltb3VzIG1lbW9yeSAoc3dhcClcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE2NTUKCQkJCQkJCW91dHB1dDogMTYzCgkJCQkJCQl0aG91Z2h0czogMjQxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgVGhpcyBQYXRjaCoqCgpPa2F5LCBzbyBJIHNlZSB0aGF0IGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgYW5kIGBTV0FQYCBhcmUgZGVmaW5pdGVseSByZWxldmFudCBoZXJlOyB0aG9zZSBhcmUgdGhlIGtleSBjb25maWd1cmF0aW9uIGZsYWdzIHdlIG5lZWQgdG8ga2VlcCBpbiBtaW5kLiBMZXQmIzM5O3MgYnJlYWsgZG93biB0aGUgY3JpdGljYWwgc3ltYm9scyB0aGF0IGp1bXAgb3V0IHRvIG1lOiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRob3NlIGFyZSB0ZWxsaW5nLgoKVGhlIGNoYW5nZXMgYXJlLCB3aXRob3V0IGEgZG91YnQsIGZ1bmN0aW9uYWwgYW5kIGRyaWxsaW5nIGRvd24gaW50byB0aGUgaGVhcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQuIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBUaGUgZmFjdCB0aGF0IHVzZXJzcGFjZSBjYW4gdHJpZ2dlciB0aGVzZSBjaGFuZ2VzIHRocm91Z2ggYG1hZHZpc2VgLCBgbWJpbmRgLCBvciBldmVuIGp1c3QgcGxhaW4gb2xkIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBzd2FwcGluZyBzZWFscyB0aGUgZGVhbC4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgYSBzdWJzdGFudGlhbCBhdHRhY2sgc3VyZmFjZS4KClRoaXMgcGF0Y2ggcmVmYWN0b3JzIHRoZSBzcGxpdHRpbmcgb2YgZm9saW9zLCBlc3BlY2lhbGx5IGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSSYjMzk7bSBzZWVpbmcgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgbmV3IGZ1bmN0aW9ucyBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCBhbmQgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlYCwgd2hpY2ggdGVsbHMgbWUgaXQmIzM5O3MgaGFuZGxpbmcgdGhlIHNwbGl0dGluZyBwcm9jZXNzIGRpcmVjdGx5LCBhbmQgY2hhbmdlcyB0byB0aGUgY29uZGl0aW9ucyBpbiBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAuIFRoZSBmYWN0IHRoYXQgdGhlc2UgYXJlIHRvdWNoaW5nIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHdpdGggVEhQIGFuZCBzd2FwIG1ha2VzIHRoaXMgY3JpdGljYWwuIEdpdmVuIHRoZSB1c2Vyc3BhY2UgcmVhY2gsIGZ1enppbmcgdGhpcyBpcyBhYnNvbHV0ZWx5IGp1c3RpZmllZC4gSXQmIzM5O3MgYSBjbGVhciBjYW5kaWRhdGUgZm9yIGBXb3J0aEZ1enppbmc9dHJ1ZWAuCgpUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyJiMzNDssCiAgICAmIzM0O2ZvbGlvX3NwbGl0X3VubWFwcGVkJiMzNDssCiAgICAmIzM0O2ZvbGlvX2NoZWNrX3NwbGl0dGFibGUmIzM0OywKICAgICYjMzQ7X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBtb2RpZmllcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHBhcnRpY3VsYXJseSBmb3IgYW5vbnltb3VzIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIHNwbGl0dGluZyBhbmQgbW9kaWZpZXMgY29uZGl0aW9ucyBpbiBmb2xpb19jaGVja19zcGxpdHRhYmxlLiBUaGVzZSBhcmUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIGFmZmVjdGluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGFuZCBzd2FwLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlciYjMzQ7LAogICAgJiMzNDtmb2xpb19zcGxpdF91bm1hcHBlZCYjMzQ7LAogICAgJiMzNDtmb2xpb19jaGVja19zcGxpdHRhYmxlJiMzNDssCiAgICAmIzM0O19fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGZvbGlvIHNwbGl0dGluZyBsb2dpYyBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtIChzcGVjaWZpY2FsbHkgYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYCksIGludHJvZHVjaW5nIHNlcGFyYXRlIHBhdGhzIGZvciBhbm9ueW1vdXMvc3dhcGNhY2hlIGZvbGlvcyBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBUaGUgY2hhbmdlcyBpbnZvbHZlIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCBsb2NraW5nLCBMUlUgbGlzdCBtYW5hZ2VtZW50LCBhbmQgcGFnZSBjYWNoZS9zd2FwIGNhY2hlIHVwZGF0ZXMuXG5cblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIEF1ZyAxMiAyMDoxNDoyMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jCmluZGV4IGNlZDQwMGY3MmQ0M2EuLjFjNjFiN2QzOWNkMDMgMTAwNjQ0Ci0tLSBhL21tL2h1Z2VfbWVtb3J5LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vaHVnZV9tZW1vcnkuYwpAQCAtMzU4OSw5ICYjNDM7MzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKQogewogCWludCBpID0gMDsKIAotCS8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovCi0JaWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKQotCQlyZXR1cm47CiAJZm9yICg7OykgewogCQlyZW1vdmVfbWlncmF0aW9uX3B0ZXMoZm9saW8sIGZvbGlvLCBUVFVfUk1BUF9MT0NLRUQgfCBmbGFncyk7CiAJCWkgJiM0Mzs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKQEAgLTM2MzQsNiAmIzQzOzM2MzEsMTggQEAgc3RhdGljIGJvb2wgcGFnZV9yYW5nZV9oYXNfaHdwb2lzb25lZChzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9uZyBucl9wYWdlcykKIAlyZXR1cm4gZmFsc2U7CiB9CiAKJiM0MzsvKioKJiM0MzsgKiBmb3JfZWFjaF9mb2xpb19zYWZlIC0gaXRlcmF0ZSBvdmVyIGNvbnRpZ3VvdXMgZm9saW9zIHNhZmUgYWdhaW5zdCBmb2xpbyBmcmVlCiYjNDM7ICogQHN0YXJ0OiB0aGUgZmlyc3QgZm9saW8gdG8gaXRlcmF0ZQomIzQzOyAqIEBlbmQ6IHNlbnRpbmVsLCBmb2xpb19uZXh0KCkgb2YgdGhlIGxhc3QgZm9saW8gdG8gaXRlcmF0ZQomIzQzOyAqIEBzdWJfZm9saW86IHN0cnVjdCBmb2xpbyAqIHRvIHVzZSBhcyB0aGUgbG9vcCBjdXJzb3IKJiM0MzsgKiBAbmV4dDogc3RydWN0IGZvbGlvICogdXNlZCBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQomIzQzOyAqLwomIzQzOyNkZWZpbmUgZm9yX2VhY2hfZm9saW9fc2FmZShzdGFydCwgZW5kLCBzdWJfZm9saW8sIG5leHQpIFwKJiM0MzsJZm9yIChzdWJfZm9saW8gPSAoc3RhcnQpLCBuZXh0ID0gZm9saW9fbmV4dChzdWJfZm9saW8pOyBcCiYjNDM7CSAgICAgc3ViX2ZvbGlvICE9IChlbmQpOyBcCiYjNDM7CSAgICAgc3ViX2ZvbGlvID0gbmV4dCwgbmV4dCA9IGZvbGlvX25leHQobmV4dCkpCiYjNDM7CiAvKgogICogSXQgc3BsaXRzIEBmb2xpbyBpbnRvIEBuZXdfb3JkZXIgZm9saW9zIGFuZCBjb3BpZXMgdGhlIEBmb2xpbyBtZXRhZGF0YSB0bwogICogYWxsIHRoZSByZXN1bHRpbmcgZm9saW9zLgpAQCAtMzc1NSw4ICYjNDM7Mzc2NCw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlciwKIH0KIAogLyoqCi0gKiBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgLSBzcGxpdHMgYW4gdW5tYXBwZWQgQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvcyBpbgotICogdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuCiYjNDM7ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zCiYjNDM7ICogaW4gdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuCiAgKiBAZm9saW86IHRoZSB0by1iZS1zcGxpdCBmb2xpbwogICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5CiAgKiAgICAgICAgICAgICBhbGxvY2F0b3IgbGlrZSBzcGxpdCBnZW5lcmF0ZXMgZm9saW9zIHdpdGggb3JkZXJzIGZyb20gQGZvbGlvJiMzOTtzCkBAIC0zNzk1LDExICYjNDM7MzgwNCwxMiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsCiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCAmbHQ7MCAtIGZhaWxlZCAoaWYgLUVOT01FTSBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlCiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spCiAgKi8KLXN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAomIzQzO3N0YXRpYyBpbnQgX19zcGxpdF9mcm96ZW5fZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKIAkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewogCWNvbnN0IGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CWNvbnN0IGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pOwogCWludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7CiAJaW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxOwogCXN0cnVjdCBmb2xpbyAqb2xkX2ZvbGlvID0gZm9saW87CkBAIC0zODE0LDggJiM0MzszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsCiAJICAgICBzcGxpdF9vcmRlci0tKSB7CiAJCWludCBucl9uZXdfZm9saW9zID0gMVVMICZsdDsmbHQ7IChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7CiAKLQkJLyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqLwotCQlpZiAoaXNfYW5vbiAmYW1wOyZhbXA7IHNwbGl0X29yZGVyID09IDEpCiYjNDM7CQkvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqLwomIzQzOwkJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBzcGxpdF9vcmRlciA9PSAxKQogCQkJY29udGludWU7CiAKIAkJaWYgKG1hcHBpbmcpIHsKQEAgLTM4NzgsMzIgJiM0MzszODg4LDI2IEBAIHN0YXRpYyBpbnQgX19zcGxpdF91bm1hcHBlZF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLAogaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJCSAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKQogewomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKJiM0MzsKIAlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAkvKgogCSAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlCi0JICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4KLQkgKgotCSAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZQotCSAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLgomIzQzOwkgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8KJiM0MzsJICogaGFzIG5vIHBhZ2UgY2FjaGUgZW50cmllcyB0byB1cGRhdGUsIHNvIGl0IGlzIGZpbmUgdG8gc3BsaXQuCiAJICovCi0JaWYgKCFmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQomIzQzOwlpZiAoIWZvbGlvLSZndDttYXBwaW5nICZhbXA7JmFtcDsgIWlzX3N3YXBjYWNoZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi8KLQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciA9PSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qCi0JICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMAotCSAqCi0JICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbQotCSAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnkKLQkgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkCi0JICogaGVyZS4KJiM0MzsJICogT3JkZXItMSBpcyB1bnN1cHBvcnRlZDogYW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yIHRoZQomIzQzOwkgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gJmFtcDsgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdAomIzQzOwkgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGQKJiM0MzsJICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LgogCSAqLwotCWlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgJmFtcDsmYW1wOyBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHsKJiM0MzsJaWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgJmFtcDsmYW1wOyBuZXdfb3JkZXIgPT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJaWYgKGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzkxMSwzOSAmIzQzOzM5MTUsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAlpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKQogCQlyZXR1cm4gLUVCVVNZOwogCiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhCiYjNDM7CSAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0JiMzOTtzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvcgomIzQzOwkgKiBzaG1lbSBtYXBwaW5nIGFmdGVyd2FyZC4gVGhlcmUgaXMgbGl0dGxlIGJlbmVmaXQgaW4gc3BsaXR0aW5nIHRoZW0KJiM0MzsJICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19hbm9uICZhbXA7JmFtcDsgaXNfc3dhcGNhY2hlICZhbXA7JmFtcDsgZm9saW8tJmd0O21hcHBpbmcpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwogCXJldHVybiAwOwogfQogCi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7LyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewotCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiAJCXJldHVybiAwOwogCXJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiB9CiAKLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCi0JCQkJCSAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcywKLQkJCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsCi0JCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsCi0JCQkJCSAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZCkKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkCiYjNDM7ICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGUKJiM0MzsgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXQKJiM0MzsgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXIKJiM0MzsgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG8KJiM0MzsgKiAgICAgICAgICB0aGUgTFJVIGxpc3QKJiM0MzsgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzCiYjNDM7ICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlcwomIzQzOyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLAomIzQzOwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSkKIHsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwomIzQzOwlib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwomIzQzOwlzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7CiAJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKJiM0MzsJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7CiAJc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1OwomIzQzOwlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAJYm9vbCBkZXF1ZXVlX2RlZmVycmVkOwogCWludCByZXQgPSAwOwogCi0JVk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nICZhbXA7JmFtcDsgZW5kKTsKJiM0MzsJLyoKJiM0MzsJICogVW5tYXAvcmVtYXAgbmVlZHMgdGhlIGFub25fdm1hLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5CiYjNDM7CSAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbQomIzQzOwkgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXMKJiM0MzsJICogc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoKSBleGNlcHQgdGhlIHdyaXRlIGxvY2sgaXMKJiM0MzsJICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoYW5vbl91bm1hcCkgewomIzQzOwkJYW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pOwomIzQzOwkJaWYgKCFhbm9uX3ZtYSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJYW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovCiYjNDM7CWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7CiYjNDM7CQlyZXQgPSAtRUFHQUlOOwomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChhbm9uX3VubWFwKQomIzQzOwkJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwlsb2NhbF9pcnFfZGlzYWJsZSgpOwomIzQzOwogCS8qCiAJICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dAogCSAqIHRoZSBzaHJpbmtlciBiZWZvcmUgZnJlZXppbmcgdGhlIHJlZi4gSWYgdGhlIHNocmlua2VyIHNlZXMKIAkgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3QKIAkgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlCiAJICogd2lsbCBkbyBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBzcGxpdC4KJiM0MzsJICoKJiM0MzsJICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsCiYjNDM7CSAqIHNvIG5vbi1hbm9uIGZvbGlvcyAobWFwcGluZ2xlc3Mgc3dhcGNhY2hlKSBuZXZlciBuZWVkIGRlcXVldWluZy4KIAkgKi8KLQlkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7IG9sZF9vcmRlciAmZ3Q7IDE7CiYjNDM7CWRlcXVldWVfZGVmZXJyZWQgPSBvbGRfb3JkZXIgJmd0OyAxICZhbXA7JmFtcDsgaXNfYW5vbjsKIAlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKQEAgLTM5NTIsMTI4ICYjNDM7NDAxNCwyNTIgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG4KIAkJbHJ1ID0gbGlzdF9scnVfbG9jaygmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwKIAkJCQkgICAgZm9saW9fbmlkKGZvbGlvKSwgJmFtcDttZW1jZyk7CiAJfQotCWlmIChmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICYjNDM7IDEpKSB7Ci0JCXN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMOwotCQlzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7CiAKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKSkgewogCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJX19saXN0X2xydV9kZWwoJmFtcDtkZWZlcnJlZF9zcGxpdF9scnUsIGxydSwKLQkJCQkgICAgICAgJmFtcDtmb2xpby0mZ3Q7X2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpOwotCQkJaWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHsKLQkJCQlmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTsKLQkJCQltb2RfbXRocF9zdGF0KG9sZF9vcmRlciwKLQkJCQkJTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpOwotCQkJfQogCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQomIzQzOwkJcmV0ID0gLUVBR0FJTjsKJiM0MzsJCWdvdG8gb3V0X25vX3NwbGl0OwomIzQzOwl9CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCWludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsKLQotCQkJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkgICAgbmV3X29yZGVyICZsdDsgSFBBR0VfUE1EX09SREVSKSB7Ci0JCQkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX1NITUVNX1RIUFMsIC1ucik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLAotCQkJCQkJCU5SX0ZJTEVfVEhQUywgLW5yKTsKLQkJCQl9Ci0JCQl9CiYjNDM7CWlmIChkZXF1ZXVlX2RlZmVycmVkKSB7CiYjNDM7CQlfX2xpc3RfbHJ1X2RlbCgmYW1wO2RlZmVycmVkX3NwbGl0X2xydSwgbHJ1LAomIzQzOwkJCSAgICAgICAmYW1wO2ZvbGlvLSZndDtfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkgewomIzQzOwkJCWZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pOwomIzQzOwkJCW1vZF9tdGhwX3N0YXQob2xkX29yZGVyLAomIzQzOwkJCQkgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7CiAJCX0KJiM0MzsJCWxpc3RfbHJ1X3VubG9jayhscnUpOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CX0KIAotCQlpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7Ci0JCQlpZiAobWFwcGluZykgewotCQkJCVZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiYjNDM7CWlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpCiYjNDM7CQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwogCi0JCQljaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pOwotCQl9CiYjNDM7CWlmIChkb19scnUpCiYjNDM7CQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CiYjNDM7CXJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLAomIzQzOwkJCQkgICBOVUxMLCBzcGxpdF90eXBlKTsKIAotCQkvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi8KJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgdGhlIHBvc3Qtc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzCiYjNDM7CSAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnQKJiM0MzsJICogc3dhcF9jYWNoZV9nZXRfZm9saW8oKSBjYW5ub3QgcmV0dXJuIHRoZSBoZWFkIGZvbGlvIGZvciBhIHN1YgomIzQzOwkgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLgomIzQzOwkgKi8KJiM0MzsJZm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHsKJiM0MzsJCXpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7CiYjNDM7CQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAomIzQzOwkJCQkgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgJiM0MzsgMSk7CiAJCWlmIChkb19scnUpCi0JCQlscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7CiYjNDM7CQkJbHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpOwomIzQzOwkJaWYgKGNpKQomIzQzOwkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsJfQogCi0JCXJldCA9IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHhhcywKLQkJCQkJICAgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7CiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgJiM0MzsgMSk7CiAKLQkJLyoKLQkJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAotCQkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGUKLQkJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCi0JCSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCi0JCSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKLQkJICogQGZvbGlvLgotCQkgKi8KLQkJZm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbzsKLQkJICAgICBuZXdfZm9saW8gPSBuZXh0KSB7Ci0JCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTsKJiM0MzsJaWYgKGRvX2xydSkKJiM0MzsJCWxydXZlY191bmxvY2sobHJ1dmVjKTsKJiM0MzsJaWYgKGNpKQomIzQzOwkJc3dhcF9jbHVzdGVyX3VubG9jayhjaSk7CiYjNDM7b3V0X25vX3NwbGl0OgomIzQzOwlsb2NhbF9pcnFfZW5hYmxlKCk7CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlpZiAoIXJldCAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCiYjNDM7CQkJdHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7CiYjNDM7CQlyZW1hcF9wYWdlKGZvbGlvLCAxICZsdDsmbHQ7IG9sZF9vcmRlciwgdHR1X2ZsYWdzKTsKJiM0MzsJfQomIzQzO291dF91bmxvY2s6CiYjNDM7CWlmIChhbm9uX3VubWFwKSB7CiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwomIzQzOwkJcHV0X2Fub25fdm1hKGFub25fdm1hKTsKJiM0MzsJfQogCi0JCQluZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KIAotCQkJem9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgbmV3X2ZvbGlvKTsKJiM0MzsvKioKJiM0MzsgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZSgpIC0gc3BsaXQgYSBmaWxlLWJhY2tlZCBmb2xpbwomIzQzOyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkIGFuZCBmaWxlLWJhY2tlZAomIzQzOyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlCiYjNDM7ICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpCiYjNDM7ICogQHNwbGl0X2F0OiBpbiBub24tdW5pZm9ybSBzcGxpdCwgdGhlIGZvbGlvIGNvbnRhaW5pbmcgQHNwbGl0X2F0IGlzIHNwbGl0CiYjNDM7ICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyCiYjNDM7ICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAomIzQzOyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdCkKJiM0MzsgKgomIzQzOyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGEgZmlsZS1iYWNrZWQgZm9saW8uIEl0IHVubWFwcyBAZm9saW8sIGZyZWV6ZXMgaXRzCiYjNDM7ICogcmVmY291bnQsIGFuZCBwZXJmb3JtIHRoZSBzcGxpdCwgdXBkYXRlcyB0aGUgcGFnZSBjYWNoZSBlbnRyaWVzLiBTcGxpdAomIzQzOyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyIGlzIHJldHVybmVkLiAoaWYgLUVOT01FTQomIzQzOyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKJiM0MzsJCQkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiYjNDM7CQkJCQkgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwomIzQzOwlYQV9TVEFURSh4YXMsICZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgZm9saW8tJmd0O2luZGV4KTsKJiM0MzsJc3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsKJiM0MzsJbG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZzsKJiM0MzsJc3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0OwomIzQzOwlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGludCBtaW5fb3JkZXI7CiYjNDM7CXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKJiM0MzsJcGdvZmZfdCBlbmQgPSAwOwomIzQzOwlnZnBfdCBnZnA7CiYjNDM7CWludCByZXQgPSAwOwogCi0JCQlmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLAotCQkJCQkgICBmb2xpb19jYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7CiYjNDM7CWlmIChuZXdfb3JkZXIgJmx0OyBtaW5fb3JkZXIpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKGRvX2xydSkKLQkJCQlscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7CiYjNDM7CS8qCiYjNDM7CSAqIFN3aXRjaCB0byBmb2xpbyYjMzk7cyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kCiYjNDM7CSAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC4KJiM0MzsJICovCiYjNDM7CW1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7CiYjNDM7CW9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpOwogCi0JCQkvKgotCQkJICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS4KLQkJCSAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0JCQkgKi8KLQkJCWlmIChjaSkgewotCQkJCV9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTsKLQkJCQljb250aW51ZTsKLQkJCX0KJiM0MzsJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7IEdGUF9SRUNMQUlNX01BU0spOwomIzQzOwlpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkgewomIzQzOwkJcmV0ID0gLUVCVVNZOwomIzQzOwkJZ290byBmYWlsX2ZyZWU7CiYjNDM7CX0KIAotCQkJLyogQW5vbnltb3VzIGZvbGlvIHdpdGhvdXQgc3dhcCBjYWNoZSAqLwotCQkJaWYgKCFtYXBwaW5nKQotCQkJCWNvbnRpbnVlOwomIzQzOwltYXBwaW5nX3NldF91cGRhdGUoJmFtcDt4YXMsIG1hcHBpbmcpOwogCi0JCQkvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi8KLQkJCWlmIChuZXdfZm9saW8tJmd0O2luZGV4ICZsdDsgZW5kKSB7Ci0JCQkJX194YV9zdG9yZSgmYW1wO21hcHBpbmctJmd0O2lfcGFnZXMsIG5ld19mb2xpby0mZ3Q7aW5kZXgsCi0JCQkJCSAgIG5ld19mb2xpbywgMCk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiYjNDM7CWlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkgewomIzQzOwkJaW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTsKIAotCQkJVk1fV0FSTl9PTl9PTkNFKCFucl9zaG1lbV9kcm9wcGVkKTsKLQkJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KLQkJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpICZhbXA7JmFtcDsgbnJfc2htZW1fZHJvcHBlZCkKLQkJCQkqbnJfc2htZW1fZHJvcHBlZCAmIzQzOz0gbnJfcGFnZXM7Ci0JCQllbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpCi0JCQkJZm9saW9fYWNjb3VudF9jbGVhbmVkKAotCQkJCQluZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctJmd0O2hvc3QpKTsKLQkJCV9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTsKLQkJCWZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpOwomIzQzOwkJeGFzX3NldF9vcmRlcigmYW1wO3hhcywgZm9saW8tJmd0O2luZGV4LCBuZXdfb3JkZXIpOwomIzQzOwkJeGFzX3NwbGl0X2FsbG9jKCZhbXA7eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApOwomIzQzOwkJaWYgKHhhc19lcnJvcigmYW1wO3hhcykpIHsKJiM0MzsJCQlyZXQgPSB4YXNfZXJyb3IoJmFtcDt4YXMpOwomIzQzOwkJCWdvdG8gZmFpbF9mcmVlOwogCQl9CiYjNDM7CX0KIAotCQl6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTsKLQkJLyoKLQkJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKLQkJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgotCQkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwotCQkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KLQkJICovCi0JCWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSAmIzQzOyAxKTsKJiM0MzsJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKIAotCQlpZiAoZG9fbHJ1KQotCQkJbHJ1dmVjX3VubG9jayhscnV2ZWMpOwomIzQzOwkvKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgKi8KJiM0MzsJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWxfbW1hcF91bmxvY2s7CiYjNDM7CX0KIAotCQlpZiAoY2kpCi0JCQlzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTsKLQl9IGVsc2UgewotCQlpZiAoZGVxdWV1ZV9kZWZlcnJlZCkgewotCQkJbGlzdF9scnVfdW5sb2NrKGxydSk7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJLyoKJiM0MzsJICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmQKJiM0MzsJICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmUKJiM0MzsJICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLgomIzQzOwkgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCwKJiM0MzsJICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy4KJiM0MzsJICovCiYjNDM7CWVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLSZndDtob3N0KSwgUEFHRV9TSVpFKTsKJiM0MzsJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCiYjNDM7CQllbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy0mZ3Q7aG9zdCwgZW5kKTsKJiM0MzsKJiM0MzsJdW5tYXBfZm9saW8oZm9saW8pOwomIzQzOwomIzQzOwl4YXNfbG9ja19pcnEoJmFtcDt4YXMpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLgomIzQzOwkgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS4KJiM0MzsJICovCiYjNDM7CWlmICh4YXNfbG9hZCgmYW1wO3hhcykgIT0gZm9saW8pIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBvbGRfbnJfcGFnZXMgJiM0MzsgMSkpIHsKJiM0MzsJCXJldCA9IC1FQUdBSU47CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSAmYW1wOyZhbXA7IG5ld19vcmRlciAmbHQ7IEhQQUdFX1BNRF9PUkRFUikgewomIzQzOwkJaWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpCiYjNDM7CQkJbHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogbG9jayBscnUgbGlzdC9QYWdlQ29tcG91bmQsIHJlZiBmcm96ZW4gYnkgcGFnZV9yZWZfZnJlZXplICovCiYjNDM7CWxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTsKJiM0MzsJcmV0ID0gX19zcGxpdF9mcm96ZW5fZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsICZhbXA7eGFzLAomIzQzOwkJCQkgICBtYXBwaW5nLCBzcGxpdF90eXBlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodAomIzQzOwkgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGUKJiM0MzsJICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zCiYjNDM7CSAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuCiYjNDM7CSAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2YKJiM0MzsJICogQGZvbGlvLgomIzQzOwkgKi8KJiM0MzsJZm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pOwomIzQzOwomIzQzOwkJZm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbywKJiM0MzsJCQkJICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSAmIzQzOyAxKTsKJiM0MzsKJiM0MzsJCWxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTsKJiM0MzsKJiM0MzsJCS8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqLwomIzQzOwkJaWYgKG5ld19mb2xpby0mZ3Q7aW5kZXggJmx0OyBlbmQpIHsKJiM0MzsJCQlfX3hhX3N0b3JlKCZhbXA7bWFwcGluZy0mZ3Q7aV9wYWdlcywgbmV3X2ZvbGlvLSZndDtpbmRleCwKJiM0MzsJCQkJICAgbmV3X2ZvbGlvLCAwKTsKJiM0MzsJCQljb250aW51ZTsKIAkJfQotCQlyZXR1cm4gLUVBR0FJTjsKJiM0MzsKJiM0MzsJCS8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLSZndDtpbmRleCAmZ3Q7PSBlbmQgKi8KJiM0MzsJCWlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKQomIzQzOwkJCW5yX3NobWVtX2Ryb3BwZWQgJiM0Mzs9IG5yX3BhZ2VzOwomIzQzOwkJZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKQomIzQzOwkJCWZvbGlvX2FjY291bnRfY2xlYW5lZChuZXdfZm9saW8sCiYjNDM7CQkJCQkgICAgICBpbm9kZV90b193YihtYXBwaW5nLSZndDtob3N0KSk7CiYjNDM7CQlfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7CiYjNDM7CQlmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTsKIAl9CiAKJiM0MzsJLyoKJiM0MzsJICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2gKJiM0MzsJICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLgomIzQzOwkgKiBPdGhlcndpc2UsIGEgcGFyYWxsZWwgZm9saW9fdHJ5X2dldCgpIGNhbiBncmFiIEBmb2xpbwomIzQzOwkgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy4KJiM0MzsJICovCiYjNDM7CWZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fbnJfcGFnZXMoZm9saW8pICYjNDM7IDEpOwomIzQzOwlscnV2ZWNfdW5sb2NrKGxydXZlYyk7CiYjNDM7ZmFpbDoKJiM0MzsJLyoKJiM0MzsJICogSWYgd2Ugd2FudCB0byB1c2UgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlIGluIHVubWFwX2ZvbGlvLAomIzQzOwkgKiByZW1lbWJlciB0byBhZGQgcmVtYXBfcGFnZSgpIGFuZCBhZGFwdCBpdC4KJiM0MzsJICovCiYjNDM7CXhhc191bmxvY2tfaXJxKCZhbXA7eGFzKTsKJiM0MztmYWlsX21tYXBfdW5sb2NrOgomIzQzOwlpZiAobnJfc2htZW1fZHJvcHBlZCkKJiM0MzsJCXNobWVtX3VuY2hhcmdlKG1hcHBpbmctJmd0O2hvc3QsIG5yX3NobWVtX2Ryb3BwZWQpOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5cwomIzQzOwkgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlCiYjNDM7CSAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IKJiM0MzsJICogdGhlIG1hcHBpbmcuCiYjNDM7CSAqLwomIzQzOwlpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7CiYjNDM7ZmFpbF9mcmVlOgomIzQzOwkvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqLwomIzQzOwlzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7CiYjNDM7CW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKJiM0MzsJeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQwODYsOSAmIzQzOzQyNzIsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbgogICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTAogICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KQogICoKLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LgomIzQzOyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC4KICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZAotICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpLgomIzQzOyAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZAogICogYW5kIG90aGVycyBhcmUgdW5sb2NrZWQ6CkBAIC00MTAyLDE3ICYjNDM7NDI4OCwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKIAkJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCwKIAkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpCiB7Ci0JWEFfU1RBVEUoeGFzLCAmYW1wO2ZvbGlvLSZndDttYXBwaW5nLSZndDtpX3BhZ2VzLCBmb2xpby0mZ3Q7aW5kZXgpOwomIzQzOwlib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTsKIAlzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOwogCWJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDsKLQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDsKIAlpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pOwogCXN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDsKLQlpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7Ci0JZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDsKLQlwZ29mZl90IGVuZCA9IDA7CiAJaW50IHJldDsKIAogCVZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7CkBAIC00MTIwLDE0MSAmIzQzOzQzMDAsMjkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsCiAKIAlpZiAoZm9saW8gIT0gcGFnZV9mb2xpbyhzcGxpdF9hdCkgfHwgZm9saW8gIT0gcGFnZV9mb2xpbyhsb2NrX2F0KSkgewogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9ub19tZW1jZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAogCWlmIChuZXdfb3JkZXIgJmd0Oz0gb2xkX29yZGVyKSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwomIzQzOwkJZ290byBvdXQ7CiAJfQogCiAJcmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTsKIAlpZiAocmV0KSB7CiAJCVZNX1dBUk5fT05DRShyZXQgPT0gLUVJTlZBTCwgJiMzNDtUcmllZCB0byBzcGxpdCBhbiB1bnNwbGl0dGFibGUgZm9saW8mIzM0Oyk7Ci0JCWdvdG8gb3V0X25vX21lbWNnOwotCX0KLQotCS8qCi0JICogc3dpdGNoIHRvIGZvbGlvJiMzOTtzIG1lbWNnIGFzIHhhcnJheSBub2RlIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBhbmQKLQkgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuCi0JICovCi0JbWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX2ZvbGlvKGZvbGlvKTsKLQlvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTsKLQotCWlmIChpc19hbm9uKSB7Ci0JCS8qCi0JCSAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZAotCQkgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhCi0JCSAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXMKLQkJICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrCi0JCSAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlCi0JCSAqIG9wZXJhdGlvbnMuCi0JCSAqLwotCQlhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7Ci0JCWlmICghYW5vbl92bWEpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpOwotCQltYXBwaW5nID0gTlVMTDsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgbWluX29yZGVyOwotCQlnZnBfdCBnZnA7Ci0KLQkJbWFwcGluZyA9IGZvbGlvLSZndDttYXBwaW5nOwotCQltaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTsKLQkJaWYgKG5ld19vcmRlciAmbHQ7IG1pbl9vcmRlcikgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZ2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICZhbXA7Ci0JCQkJCQkJR0ZQX1JFQ0xBSU1fTUFTSyk7Ci0KLQkJaWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJbWFwcGluZ19zZXRfdXBkYXRlKCZhbXA7eGFzLCBtYXBwaW5nKTsKLQotCQlpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHsKLQkJCXhhc19zZXRfb3JkZXIoJmFtcDt4YXMsIGZvbGlvLSZndDtpbmRleCwgbmV3X29yZGVyKTsKLQkJCXhhc19zcGxpdF9hbGxvYygmYW1wO3hhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTsKLQkJCWlmICh4YXNfZXJyb3IoJmFtcDt4YXMpKSB7Ci0JCQkJcmV0ID0geGFzX2Vycm9yKCZhbXA7eGFzKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCi0JCWFub25fdm1hID0gTlVMTDsKLQkJaV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTsKLQotCQkvKgotCQkgKl9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmQKLQkJICogRU9GOiBidXQgb24gMzItYml0LCBpX3NpemVfcmVhZCgpIHRha2VzIGFuIGlycS11bnNhZmUKLQkJICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLgotCQkgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCwKLQkJICogYnV0IGZvbGlvIGxvY2sgaXMgZ29vZCBlbm91Z2ggdG8gc2VyaWFsaXplIHRoZSB0cmltbWluZy4KLQkJICovCi0JCWVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLSZndDtob3N0KSwgUEFHRV9TSVpFKTsKLQkJaWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpCi0JCQllbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy0mZ3Q7aG9zdCwgZW5kKTsKLQl9Ci0KLQkvKgotCSAqIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSB3aWxsCi0JICogc3BsaXQgUE1EcwotCSAqLwotCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQl1bm1hcF9mb2xpbyhmb2xpbyk7Ci0KLQkvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqLwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JaWYgKG1hcHBpbmcpIHsKLQkJLyoKLQkJICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS4KLQkJICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuCi0JCSAqLwotCQl4YXNfbG9jaygmYW1wO3hhcyk7Ci0JCXhhc19yZXNldCgmYW1wO3hhcyk7Ci0JCWlmICh4YXNfbG9hZCgmYW1wO3hhcykgIT0gZm9saW8pIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KJiM0MzsJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgJmFtcDt4YXMsIG1hcHBpbmcsCi0JCQkJCQl0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsICZhbXA7bnJfc2htZW1fZHJvcHBlZCk7Ci1mYWlsOgotCWlmIChtYXBwaW5nKQotCQl4YXNfdW5sb2NrKCZhbXA7eGFzKTsKLQotCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCWlmIChucl9zaG1lbV9kcm9wcGVkKQotCQlzaG1lbV91bmNoYXJnZShtYXBwaW5nLSZndDtob3N0LCBucl9zaG1lbV9kcm9wcGVkKTsKLQotCWlmICghcmV0ICZhbXA7JmFtcDsgaXNfYW5vbiAmYW1wOyZhbXA7ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpCi0JCXR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFOwotCi0JcmVtYXBfcGFnZShmb2xpbywgMSAmbHQ7Jmx0OyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7Ci0KLQkvKgotCSAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzCi0JICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlIHVudGlsIHRoZSBsb29wIGJlbG93LCBzbwotCSAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heQotCSAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlCi0JICogY2FjaGUuIE5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3IgdGhlIG1hcHBpbmcuCi0JICovCi0JaWYgKG1hcHBpbmcpIHsKLQkJaV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpOwotCQltYXBwaW5nID0gTlVMTDsKLQl9CiYjNDM7CWlmIChpc19hbm9uKQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLAomIzQzOwkJCQkJCSAgICAgdHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSk7CiYjNDM7CWVsc2UgaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCXJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSwKJiM0MzsJCQkJCQkgICAgIGZhbHNlLCBsaXN0LCBzcGxpdF90eXBlKTsKJiM0MzsJZWxzZQomIzQzOwkJcmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsCiYjNDM7CQkJCQkJCSAgbGlzdCwgc3BsaXRfdHlwZSk7CiAKIAkvKgogCSAqIFVubG9jayBhbGwgYWZ0ZXItc3BsaXQgZm9saW9zIGV4Y2VwdCB0aGUgb25lIGNvbnRhaW5pbmcKQEAgLTQyNjUsMjkgJiM0Mzs0MzMzLDE5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLAogCQlpZiAobmV3X2ZvbGlvID09IHBhZ2VfZm9saW8obG9ja19hdCkpCiAJCQljb250aW51ZTsKIAotCQlmb2xpb191bmxvY2sobmV3X2ZvbGlvKTsKIAkJLyoKIAkJICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkCiAJCSAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZQotCQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsCiYjNDM7CQkgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbAogCQkgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLgogCQkgKi8KLQkJZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pOwomIzQzOwkJaWYgKGlzX3N3YXBjYWNoZSkKJiM0MzsJCQlmb2xpb19mcmVlX3N3YXAobmV3X2ZvbGlvKTsKJiM0MzsJCWZvbGlvX3VubG9jayhuZXdfZm9saW8pOwomIzQzOwkJZm9saW9fcHV0KG5ld19mb2xpbyk7CiAJfQogCi1vdXRfdW5sb2NrOgotCWlmIChhbm9uX3ZtYSkgewotCQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpOwotCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOwotCX0KLQlpZiAobWFwcGluZykKLQkJaV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpOwogb3V0OgotCS8qIHJlc3RvcmUgdG8gY2FsbGVyJiMzOTtzIG9sZF9tZW1jZyAqLwotCXNldF9hY3RpdmVfbWVtY2cob2xkX21lbWNnKTsKLQltZW1fY2dyb3VwX3B1dChtZW1jZyk7Ci1vdXRfbm9fbWVtY2c6Ci0JeGFzX2Rlc3Ryb3koJmFtcDt4YXMpOwogCWlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSkKIAkJY291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTsKIAljb3VudF9tdGhwX3N0YXQob2xkX29yZGVyLCAhcmV0ID8gTVRIUF9TVEFUX1NQTElUIDogTVRIUF9TVEFUX1NQTElUX0ZBSUxFRCk7CkBAIC00MzExLDI5ICYjNDM7NDM2OSwyMCBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwKICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKQogICoKICAqIFVwb24gcmV0dXJuLCB0aGUgZm9saW8gaXMgbm90IHJlbWFwcGVkLCBzcGxpdCBmb2xpb3MgYXJlIG5vdCBhZGRlZCB0byBMUlUsCi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC4KJiM0MzsgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLgogICoKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0bwogICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLgogICovCiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcikKIHsKLQlpbnQgcmV0ID0gMDsKLQogCVZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7CiAJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7CiAKLQlpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXJldCA9IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChmb2xpbywgbmV3X29yZGVyLCAmYW1wO2ZvbGlvLSZndDtwYWdlLCBOVUxMLAotCQkJCQkJTlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSwKLQkJCQkJCTAsIE5VTEwpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsICZhbXA7Zm9saW8tJmd0O3BhZ2UsIGZhbHNlLAomIzQzOwkJCQkJICAgICAgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSk7CiB9CiAKIC8qCkBAIC00MzUyLDEwICYjNDM7NDQwMSw5IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogICogICAgR1VQIHBpbnMsIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xpbyBub3QgZ2V0dGluZyBzcGxpdDsgaW5zdGVhZCwgdGhlIGNhbGxlcgogICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uCiAgKgotICogNCkgQG5ld19vcmRlciAmZ3Q7IDEsIHVzdWFsbHkuIFNwbGl0dGluZyB0byBvcmRlci0xIGFub255bW91cyBmb2xpb3MgaXMgbm90Ci0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tJmd0O19kZWZlcnJlZF9saXN0LCB3aGljaAotICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTEKLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsCiYjNDM7ICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yCiYjNDM7ICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXkKJiM0MzsgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsCiAgKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuCiAgKgogICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJiMzOTtzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLApAQCAtNDM4NCw3ICYjNDM7NDQzMiw3IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLgogICovCiBpbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpCiYjNDM7CQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKQogewogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwogCmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmMKaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDQKLS0tIGEvbW0vc3dhcF9zdGF0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBfc3RhdGUuYwpAQCAtMzg4LDggJiM0MzszODgsOSBAQCB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksCiAJICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkgewogCQljaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLSZndDtzd2FwKTsKIAkJY2lfZW5kID0gY2lfb2ZmICYjNDM7IGZvbGlvX25yX3BhZ2VzKG9sZCk7Ci0JCXdoaWxlIChjaV9vZmYmIzQzOyYjNDM7ICZsdDsgY2lfZW5kKQomIzQzOwkJZG8gewogCQkJV0FSTl9PTl9PTkNFKHN3cF90Yl90b19mb2xpbyhfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSAhPSBvbGQpOwomIzQzOwkJfSB3aGlsZSAoJiM0MzsmIzQzO2NpX29mZiAmbHQ7IGNpX2VuZCk7CiAJfQogfQogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAyMDoxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjg3OAoJCQkJCQkJb3V0cHV0OiAyMTAKCQkJCQkJCXRob3VnaHRzOiA1NjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudDogS01TQU4gTm90IE5lZWRlZCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBmb2xpbyBzcGxpdHRpbmcsIGluIGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2AuIEl0JiMzOTtzIHJlZmFjdG9yaW5nIHRoZSBleGlzdGluZyBjb2RlLCBzcGxpdHRpbmcgdGhpbmdzIGludG8gZnVuY3Rpb25zIGxpa2UgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIHZhcmlhbnRzLCBkZWFsaW5nIHdpdGggYW5vbiwgc3dhcGNhY2hlLCBhbmQgZmlsZS1iYWNrZWQgZm9saW9zLiBJdCYjMzk7cyBlc3NlbnRpYWxseSBhYm91dCBob3cgd2UgaGFuZGxlIHNwbGl0dGluZyBmb2xpb3MgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgoKVGhlIGtleSB0aGluZyBJIG5lZWQgdG8gY2hlY2sgaXMgaWYgdGhpcyBpbnRyb2R1Y2VzICphbnkqIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgZXhwb3NlZC4gVGhhdCYjMzk7cyB3aGF0IEtNU0FOIGlzIGZvciwgYWZ0ZXIgYWxsLiBGcm9tIHdoYXQgSSBzZWUsIGl0IGRvZXNuJiMzOTt0LiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBzZW50IHVwIHRvIHVzZXIgc3BhY2UsIHdoaWNoIGlzIGEgY29tbW9uIGFyZWEgZm9yIGxlYWtzLiBObyBuZXcgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBoYXBwZW5pbmcgdGhhdCAqYXJlbiYjMzk7dCogaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gVGhlIGNvZGUgdXNlcyBgZm9saW9fcmVmX2ZyZWV6ZWAsIGB1bm1hcF9mb2xpb2AsIGBfX3NwbGl0X2Zyb3plbl9mb2xpb2AsIGFuZCBzbyBvbi4gVGhlc2UgYXJlIGFsbCB3ZWxsLWVzdGFibGlzaGVkIGZ1bmN0aW9ucy4KCkkmIzM5O20gZm9jdXNpbmcgc3BlY2lmaWNhbGx5IG9uIHVuaW5pdGlhbGl6ZWQgcmVhZHMuIElzIHRoZXJlIGEgc2NlbmFyaW8gd2hlcmUgdGhpcyBwYXRjaCAqY291bGQqIGxlYWQgdG8gYSBrZXJuZWwgdmFyaWFibGUgYmVpbmcgcmVhZCBiZWZvcmUgaXQmIzM5O3MgYmVlbiBhc3NpZ25lZCBhIHZhbHVlLCBwb3RlbnRpYWxseSBsZWFraW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiwgb3IgY3JlYXRpbmcgYSBjb250cm9sIGZsb3cgdnVsbmVyYWJpbGl0eT8gTm8uIFRoZSBwYXRjaCBsb29rcyBzYWZlIGluIHRoaXMgcmVzcGVjdC4gSXQgb25seSBtb2RpZmllcyBleGlzdGluZyBtZW1vcnkgbWFuYWdlbWVudCBzdHJ1Y3R1cmVzIGFuZCBsb2dpYywgaXQgZG9lcyBub3QgY3JlYXRlIGFueSBuZXcgY29kZSBwYXRocyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MgaXMgcG9zc2libGUuCgpUaGVyZWZvcmUsIHRoZSBwb3RlbnRpYWwgYnVncyB3b3VsZCBiZSBjbGFzc2ljIG1lbW9yeSBjb3JydXB0aW9uIGJ1Z3M6IHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZXMsIG1lbW9yeSBsZWFrcywgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyAoYmVjYXVzZSBvZiBpbmNvcnJlY3QgcGFnZSBjb3VudHMpLCBvciBldmVuIGRlYWRsb2Nrcy4gQnV0IGFsbCBvZiB0aGVzZSBhcmUgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgdGhlIHVzdWFsIGtlcm5lbCBtZW1vcnkgYnVnIGRldGVjdG9ycy4gS01TQU4gaXMgZm9yIGEgZGlmZmVyZW50IGNsYXNzIG9mIHByb2JsZW0sIHdoaWNoIGlzbiYjMzk7dCBwcmVzZW50IGhlcmUuCgpTbywgSSYjMzk7bSBjb25maWRlbnQgaW4gc2F5aW5nIHRoYXQgYE5lZWRzS01TQU5gIHNob3VsZCBiZSBmYWxzZSBmb3IgdGhpcyBwYXRjaC4gSSBzZWUgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMjA6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxuXG5UaGVzZSBtb2RpZmljYXRpb25zIGRvIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRoYXQgaXMgc3Vic2VxdWVudGx5IHJlYWQgb3IgdXNlZCBpbiBjb250cm9sIGZsb3cuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCB3b3VsZCBsaWtlbHkgbWFuaWZlc3QgYXMgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBsb2NraW5nIGlzc3VlcyAoZGVhZGxvY2tzL3JhY2UgY29uZGl0aW9ucykuIFN1Y2ggYnVncyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxuXG5UaGVzZSBtb2RpZmljYXRpb25zIGRvIG5vdCBpbnRyb2R1Y2UgbmV3IGRhdGEgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGFsbG9jYXRlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRoYXQgaXMgc3Vic2VxdWVudGx5IHJlYWQgb3IgdXNlZCBpbiBjb250cm9sIGZsb3cuIEFueSBidWdzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCB3b3VsZCBsaWtlbHkgbWFuaWZlc3QgYXMgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBsb2NraW5nIGlzc3VlcyAoZGVhZGxvY2tzL3JhY2UgY29uZGl0aW9ucykuIFN1Y2ggYnVncyBhcmUgZWZmZWN0aXZlbHkgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDoyMy4zMjU4NTYzMzhaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4ODkzOTM0NjMwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxcblxcblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGFuZCBtb2RpZmllcyB0aGUgbG9naWMgZm9yIHNwbGl0dGluZyBmb2xpb3MsIHBhcnRpY3VsYXJseSBmb3IgYW5vbnltb3VzIGFuZCBzd2FwY2FjaGUgZm9saW9zLiBJdCBpbnRyb2R1Y2VzIG5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIHNwbGl0dGluZyBhbmQgbW9kaWZpZXMgY29uZGl0aW9ucyBpbiBmb2xpb19jaGVja19zcGxpdHRhYmxlLiBUaGVzZSBhcmUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjaGFuZ2VzIGFmZmVjdGluZyBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGFuZCBzd2FwLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIGFuZCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDoyMy4zMjU4NjA5NThaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUzNjQ0OTEyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBBdWcgMTIgMjA6MTQ6MjIgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi4xYzYxYjdkMzljZDAzIDEwMDY0NFxcbi0tLSBhL21tL2h1Z2VfbWVtb3J5LmNcXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXFxuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxcbiB7XFxuIFxcdGludCBpID0gMDtcXG4gXFxuLVxcdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXFxuLVxcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4tXFx0XFx0cmV0dXJuO1xcbiBcXHRmb3IgKDs7KSB7XFxuIFxcdFxcdHJlbW92ZV9taWdyYXRpb25fcHRlcyhmb2xpbywgZm9saW8sIFRUVV9STUFQX0xPQ0tFRCB8IGZsYWdzKTtcXG4gXFx0XFx0aSArPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuQEAgLTM2MzQsNiArMzYzMSwxOCBAQCBzdGF0aWMgYm9vbCBwYWdlX3JhbmdlX2hhc19od3BvaXNvbmVkKHN0cnVjdCBwYWdlICpwYWdlLCBsb25nIG5yX3BhZ2VzKVxcbiBcXHRyZXR1cm4gZmFsc2U7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBmb3JfZWFjaF9mb2xpb19zYWZlIC0gaXRlcmF0ZSBvdmVyIGNvbnRpZ3VvdXMgZm9saW9zIHNhZmUgYWdhaW5zdCBmb2xpbyBmcmVlXFxuKyAqIEBzdGFydDogdGhlIGZpcnN0IGZvbGlvIHRvIGl0ZXJhdGVcXG4rICogQGVuZDogc2VudGluZWwsIGZvbGlvX25leHQoKSBvZiB0aGUgbGFzdCBmb2xpbyB0byBpdGVyYXRlXFxuKyAqIEBzdWJfZm9saW86IHN0cnVjdCBmb2xpbyAqIHRvIHVzZSBhcyB0aGUgbG9vcCBjdXJzb3JcXG4rICogQG5leHQ6IHN0cnVjdCBmb2xpbyAqIHVzZWQgYXMgdGVtcG9yYXJ5IHN0b3JhZ2VcXG4rICovXFxuKyNkZWZpbmUgZm9yX2VhY2hfZm9saW9fc2FmZShzdGFydCwgZW5kLCBzdWJfZm9saW8sIG5leHQpIFxcXFxcXG4rXFx0Zm9yIChzdWJfZm9saW8gPSAoc3RhcnQpLCBuZXh0ID0gZm9saW9fbmV4dChzdWJfZm9saW8pOyBcXFxcXFxuK1xcdCAgICAgc3ViX2ZvbGlvICE9IChlbmQpOyBcXFxcXFxuK1xcdCAgICAgc3ViX2ZvbGlvID0gbmV4dCwgbmV4dCA9IGZvbGlvX25leHQobmV4dCkpXFxuK1xcbiAvKlxcbiAgKiBJdCBzcGxpdHMgQGZvbGlvIGludG8gQG5ld19vcmRlciBmb2xpb3MgYW5kIGNvcGllcyB0aGUgQGZvbGlvIG1ldGFkYXRhIHRvXFxuICAqIGFsbCB0aGUgcmVzdWx0aW5nIGZvbGlvcy5cXG5AQCAtMzc1NSw4ICszNzY0LDggQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxcbiB9XFxuIFxcbiAvKipcXG4tICogX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIC0gc3BsaXRzIGFuIHVubWFwcGVkIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MgaW5cXG4tICogdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuXFxuKyAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgLSBzcGxpdHMgYSBmcm96ZW4gQGZvbGlvIHRvIGxvd2VyIG9yZGVyIGZvbGlvc1xcbisgKiBpbiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cXG4gICogQGZvbGlvOiB0aGUgdG8tYmUtc3BsaXQgZm9saW9cXG4gICogQG5ld19vcmRlcjogdGhlIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlciBzcGxpdCBmb2xpb3MgKHNpbmNlIGJ1ZGR5XFxuICAqICAgICAgICAgICAgIGFsbG9jYXRvciBsaWtlIHNwbGl0IGdlbmVyYXRlcyBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbSBAZm9saW8nc1xcbkBAIC0zNzk1LDExICszODA0LDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcXG4gICogUmV0dXJuOiAwIC0gc3VjY2Vzc2Z1bCwgXFx1MDAzYzAgLSBmYWlsZWQgKGlmIC1FTk9NRU0gaXMgcmV0dXJuZWQsIEBmb2xpbyBtaWdodCBiZVxcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXFxuICAqL1xcbi1zdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcXG4rc3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxcbiBcXHRcXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4gXFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4rXFx0Y29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcdGludCBzdGFydF9vcmRlciA9IHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNID8gbmV3X29yZGVyIDogb2xkX29yZGVyIC0gMTtcXG4gXFx0c3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbztcXG5AQCAtMzgxNCw4ICszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIFxcdCAgICAgc3BsaXRfb3JkZXItLSkge1xcbiBcXHRcXHRpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyAob2xkX29yZGVyIC0gc3BsaXRfb3JkZXIpO1xcbiBcXG4tXFx0XFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xcbi1cXHRcXHRpZiAoaXNfYW5vbiBcXHUwMDI2XFx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxcbitcXHRcXHQvKiBvcmRlci0xIGFub255bW91cyBvciBzd2FwY2FjaGUgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xcbitcXHRcXHRpZiAoKGlzX2Fub24gfHwgaXNfc3dhcGNhY2hlKSBcXHUwMDI2XFx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdGlmIChtYXBwaW5nKSB7XFxuQEAgLTM4NzgsMzIgKzM4ODgsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXFxuIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdFxcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxcbiB7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbitcXG4gXFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XFxuIFxcdC8qXFxuIFxcdCAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlXFxuLVxcdCAqIGNhbGxlciB0aGF0IHRoZXJlIHdhcyBhIHJhY2UuXFxuLVxcdCAqXFxuLVxcdCAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZVxcbi1cXHQgKiBzd2FwY2FjaGUgKHNobWVtIG9yIHRvLWJlLWFub24gZm9saW9zKS5cXG4rXFx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvXFxuK1xcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFmb2xpby1cXHUwMDNlbWFwcGluZyBcXHUwMDI2XFx1MDAyNiAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4rXFx0aWYgKCFmb2xpby1cXHUwMDNlbWFwcGluZyBcXHUwMDI2XFx1MDAyNiAhaXNfc3dhcGNhY2hlKVxcbiBcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbiBcXG4tXFx0Lyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqL1xcbi1cXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcXG4tXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcbiBcXHQvKlxcbi1cXHQgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwXFxuLVxcdCAqXFxuLVxcdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cXG4tXFx0ICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueVxcbi1cXHQgKiBzd2FwY2FjaGUgZm9saW8gc3BsaXQuIE9ubHkgdW5pZm9ybSBzcGxpdCB0byBvcmRlci0wIGNhbiBiZSB1c2VkXFxuLVxcdCAqIGhlcmUuXFxuK1xcdCAqIE9yZGVyLTEgaXMgdW5zdXBwb3J0ZWQ6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciB0aGVcXG4rXFx0ICogZGVmZXJyZWQgc3BsaXQgbGlzdCwgaHlicmlkIHNobWVtIFxcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxcbitcXHQgKiBzcGxpdHRhYmxlLCBhbmQgYSBzcGxpdHRhYmxlIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW8gY291bGRcXG4rXFx0ICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LlxcbiBcXHQgKi9cXG4tXFx0aWYgKChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfTk9OX1VOSUZPUk0gfHwgbmV3X29yZGVyKSBcXHUwMDI2XFx1MDAyNiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcXG4rXFx0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXFx1MDAyNlxcdTAwMjYgbmV3X29yZGVyID09IDEpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHR9XFxuIFxcbiBcXHRpZiAoaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuQEAgLTM5MTEsMzkgKzM5MTUsOTcgQEAgaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcXG4gXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXFxuK1xcdCAqIHNobWVtIGZvbGlvIHVuZGVyIFNXQVAgSU8sIGl0J3MgcmVtb3ZlZCBmcm9tIGVpdGhlciBzd2FwIGNhY2hlIG9yXFxuK1xcdCAqIHNobWVtIG1hcHBpbmcgYWZ0ZXJ3YXJkLiBUaGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmcgdGhlbVxcbitcXHQgKiBoZW5jZSByZWplY3QgaXQgaGVyZSB1cCBmcm9udCBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWlzX2Fub24gXFx1MDAyNlxcdTAwMjYgaXNfc3dhcGNhY2hlIFxcdTAwMjZcXHUwMDI2IGZvbGlvLVxcdTAwM2VtYXBwaW5nKVxcbitcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLS8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHBhZ2VjYWNoZSBvciB0aGUgc3dhcGNhY2hlLiAqL1xcbi1zdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX2NhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbisvKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBzd2FwY2FjaGUuICovXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiB7XFxuLVxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuK1xcdGlmICghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFx0cmV0dXJuIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBib29sIGRvX2xydSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICBwZ29mZl90IGVuZCwgaW50ICpucl9zaG1lbV9kcm9wcGVkKVxcbisvKipcXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKCkgLSBzcGxpdCBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW9cXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWRcXG4rICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcXG4rICogICAgICAgICAgICAgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAobm9uLXVuaWZvcm0gc3BsaXQpXFxuKyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxcbisgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcXG4rICogQGRvX2xydTogaWYgdHJ1ZSwgYWRkIGFmdGVyLXNwbGl0IGZvbGlvcyB0byBAbGlzdCBpZiBub24gTlVMTCwgb3RoZXJ3aXNlIHRvXFxuKyAqICAgICAgICAgIHRoZSBMUlUgbGlzdFxcbisgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyXFxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKlxcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhbiBhbm9uIG9yIHN3YXAgY2FjaGUgZm9saW8uIEl0IHVubWFwcyBAZm9saW8gKHVubGVzc1xcbisgKiBAYW5vbl91bm1hcCBpcyBmYWxzZSksIGZyZWV6ZXMgaXRzIHJlZmNvdW50LCBhbmQgcGVyZm9ybXMgdGhlIHNwbGl0LCB1cGRhdGVzXFxuKyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC5cXG4rICovXFxuK3N0YXRpYyBpbnQgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBib29sIGRvX2xydSwgYm9vbCBhbm9uX3VubWFwLFxcbitcXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxcbiB7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XFxuK1xcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuK1xcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKm5ld19mb2xpbywgKm5leHQ7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuK1xcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xcbitcXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xcbiBcXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4gXFx0Ym9vbCBkZXF1ZXVlX2RlZmVycmVkO1xcbiBcXHRpbnQgcmV0ID0gMDtcXG4gXFxuLVxcdFZNX1dBUk5fT05fT05DRSghbWFwcGluZyBcXHUwMDI2XFx1MDAyNiBlbmQpO1xcbitcXHQvKlxcbitcXHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcXG4rXFx0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXFxuK1xcdCAqIGRpc2FwcGVhcmluZywgc28gd2UgZmlyc3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgbG9jayBpdC4gVGhpcyBpc1xcbitcXHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xcbitcXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cXG4rXFx0ICovXFxuK1xcdGlmIChhbm9uX3VubWFwKSB7XFxuK1xcdFxcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcXG4rXFx0XFx0aWYgKCFhbm9uX3ZtYSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFx0XFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdGhlIG9wdGlvbmFsIHVubWFwLiAqL1xcbitcXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChhbm9uX3VubWFwKVxcbitcXHRcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xcbitcXG4gXFx0LypcXG4gXFx0ICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dFxcbiBcXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXFxuIFxcdCAqIGEgMC1yZWYgZm9saW8sIGl0IGFzc3VtZXMgaXQgYmVhdCBmb2xpb19wdXQoKSB0byB0aGUgbGlzdFxcbiBcXHQgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlXFxuIFxcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXFxuK1xcdCAqXFxuK1xcdCAqIE9ubHkgYW5vbiBmb2xpb3MgYXJlIGV2ZXIgcXVldWVkIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBsaXN0LFxcbitcXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXFxuIFxcdCAqL1xcbi1cXHRkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBvbGRfb3JkZXIgXFx1MDAzZSAxO1xcbitcXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFxcdTAwM2UgMSBcXHUwMDI2XFx1MDAyNiBpc19hbm9uO1xcbiBcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbiBcXHRcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XFxuIFxcbkBAIC0zOTUyLDEyOCArNDAxNCwyNTIgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cXG4gXFx0XFx0bHJ1ID0gbGlzdF9scnVfbG9jayhcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LFxcbiBcXHRcXHRcXHRcXHQgICAgZm9saW9fbmlkKGZvbGlvKSwgXFx1MDAyNm1lbWNnKTtcXG4gXFx0fVxcbi1cXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XFxuLVxcdFxcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xcbi1cXHRcXHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XFxuIFxcbitcXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcXG4gXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0X19saXN0X2xydV9kZWwoXFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxcbi1cXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNmZvbGlvLVxcdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XFxuLVxcdFxcdFxcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xcbi1cXHRcXHRcXHRcXHRtb2RfbXRocF9zdGF0KG9sZF9vcmRlcixcXG4tXFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xcbi1cXHRcXHRcXHR9XFxuIFxcdFxcdFxcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xcbiBcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFx0XFx0fVxcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIG91dF9ub19zcGxpdDtcXG4rXFx0fVxcbiBcXG4tXFx0XFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0XFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbi1cXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHQgICAgbmV3X29yZGVyIFxcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XFxuLVxcdFxcdFxcdFxcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdFxcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0TlJfU0hNRU1fVEhQUywgLW5yKTtcXG4tXFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHROUl9GSUxFX1RIUFMsIC1ucik7XFxuLVxcdFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xcbitcXHRcXHRfX2xpc3RfbHJ1X2RlbChcXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXFxuK1xcdFxcdFxcdCAgICAgICBcXHUwMDI2Zm9saW8tXFx1MDAzZV9kZWZlcnJlZF9saXN0LCBmb2xpb19uaWQoZm9saW8pKTtcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcXG4rXFx0XFx0XFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XFxuK1xcdFxcdFxcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XFxuIFxcdFxcdH1cXG4rXFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGlmIChtYXBwaW5nKSB7XFxuLVxcdFxcdFxcdFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XFxuLVxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxuK1xcdFxcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XFxuIFxcbi1cXHRcXHRcXHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xcbi1cXHRcXHR9XFxuK1xcdGlmIChkb19scnUpXFxuK1xcdFxcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcXG4rXFxuK1xcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLFxcbitcXHRcXHRcXHRcXHQgICBOVUxMLCBzcGxpdF90eXBlKTtcXG4gXFxuLVxcdFxcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHQvKlxcbitcXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XFxuK1xcdCAqIHBsYWNlLiBLZWVwIHRoZSBoZWFkIEBmb2xpbyBmcm96ZW4gdW50aWwgdGhlIGVuZDogc3ViIGVudHJpZXNcXG4rXFx0ICogaW4gc3dhcCBjYWNoZSBtdXN0IGJlIHVwZGF0ZWQgZmlyc3QsIHNvIGEgY29uY3VycmVudFxcbitcXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXFxuK1xcdCAqIGVudHJ5IChmb2xpb190cnlfZ2V0KCkgd2lsbCBmYWlsIG9uIHRoZSBoZWFkIEBmb2xpbyB1bnRpbCB1bmZyZWV6ZSkuXFxuK1xcdCAqL1xcbitcXHRmb3JfZWFjaF9mb2xpb19zYWZlKGZvbGlvX25leHQoZm9saW8pLCBlbmRfZm9saW8sIG5ld19mb2xpbywgbmV4dCkge1xcbitcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbitcXHRcXHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxcbitcXHRcXHRcXHRcXHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4gXFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xcbitcXHRcXHRcXHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XFxuK1xcdFxcdGlmIChjaSlcXG4rXFx0XFx0XFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XFxuK1xcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xcbitcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XFxuIFxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XFxuLVxcdFxcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96b24gdW50aWwgcGFnZSBjYWNoZVxcbi1cXHRcXHQgKiBlbnRyaWVzIGFyZSB1cGRhdGVkIHdpdGggYWxsIHRoZSBvdGhlciBhZnRlci1zcGxpdCBmb2xpb3NcXG4tXFx0XFx0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cXG4tXFx0XFx0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxcbi1cXHRcXHQgKiBAZm9saW8uXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb3IgKG5ld19mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pOyBuZXdfZm9saW8gIT0gZW5kX2ZvbGlvO1xcbi1cXHRcXHQgICAgIG5ld19mb2xpbyA9IG5leHQpIHtcXG4tXFx0XFx0XFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XFxuK1xcdGlmIChkb19scnUpXFxuK1xcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0aWYgKGNpKVxcbitcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4rb3V0X25vX3NwbGl0OlxcbitcXHRsb2NhbF9pcnFfZW5hYmxlKCk7XFxuK1xcdGlmIChhbm9uX3VubWFwKSB7XFxuK1xcdFxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXFxuK1xcdFxcdFxcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xcbitcXHRcXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFxcdTAwM2NcXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcXG4rXFx0fVxcbitvdXRfdW5sb2NrOlxcbitcXHRpZiAoYW5vbl91bm1hcCkge1xcbitcXHRcXHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xcbitcXHRcXHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHRuZXh0ID0gZm9saW9fbmV4dChuZXdfZm9saW8pO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuIFxcbi1cXHRcXHRcXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xcbisvKipcXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW9cXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWQgYW5kIGZpbGUtYmFja2VkXFxuKyAqIEBuZXdfb3JkZXI6IHRoZSBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zICh1bmlmb3JtIHNwbGl0KSwgb3IgdGhlXFxuKyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXRcXG4rICogICAgICAgICAgICB1bnRpbCBpdHMgb3JkZXIgYmVjb21lcyBAbmV3X29yZGVyXFxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxcbisgKlxcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0c1xcbisgKiByZWZjb3VudCwgYW5kIHBlcmZvcm0gdGhlIHNwbGl0LCB1cGRhdGVzIHRoZSBwYWdlIGNhY2hlIGVudHJpZXMuIFNwbGl0XFxuKyAqIGZvbGlvcyBhcmUgdW5mcm96ZW4gYnV0IG5vdCByZW1hcHBlZCwgdGhleSBhcmUgZmF1bHRlZCBiYWNrIGluIG9uIGRlbWFuZC5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuIChpZiAtRU5PTUVNXFxuKyAqIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmUgc3BsaXQgYnV0IG5vdCB0byBAbmV3X29yZGVyKVxcbisgKi9cXG4rc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuK3tcXG4rXFx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4rXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2bWFwcGluZy1cXHUwMDNlaV9wYWdlcywgZm9saW8tXFx1MDAzZWluZGV4KTtcXG4rXFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcXG4rXFx0bG9uZyBvbGRfbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcXG4rXFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xcbitcXHRpbnQgbnJfc2htZW1fZHJvcHBlZCA9IDA7XFxuK1xcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuK1xcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4rXFx0cGdvZmZfdCBlbmQgPSAwO1xcbitcXHRnZnBfdCBnZnA7XFxuK1xcdGludCByZXQgPSAwO1xcbiBcXG4tXFx0XFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgZm9saW9fY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcXG4rXFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuK1xcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4tXFx0XFx0XFx0aWYgKGRvX2xydSlcXG4tXFx0XFx0XFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXHQvKlxcbitcXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXFxuK1xcdCAqIG5lZWRzIHRvIGNoYXJnZSB0byBpdC5cXG4rXFx0ICovXFxuK1xcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuK1xcdG9sZF9tZW1jZyA9IHNldF9hY3RpdmVfbWVtY2cobWVtY2cpO1xcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQW5vbnltb3VzIGZvbGlvIHdpdGggc3dhcCBjYWNoZS5cXG4tXFx0XFx0XFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChjaSkge1xcbi1cXHRcXHRcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHRcXHR9XFxuK1xcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spO1xcbitcXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gZmFpbF9mcmVlO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRcXHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXFxuLVxcdFxcdFxcdGlmICghbWFwcGluZylcXG4tXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdG1hcHBpbmdfc2V0X3VwZGF0ZShcXHUwMDI2eGFzLCBtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdFxcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xcbi1cXHRcXHRcXHRpZiAobmV3X2ZvbGlvLVxcdTAwM2VpbmRleCBcXHUwMDNjIGVuZCkge1xcbi1cXHRcXHRcXHRcXHRfX3hhX3N0b3JlKFxcdTAwMjZtYXBwaW5nLVxcdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXFx1MDAzZWluZGV4LFxcbi1cXHRcXHRcXHRcXHRcXHQgICBuZXdfZm9saW8sIDApO1xcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0XFx0fVxcbitcXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcXG4rXFx0XFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XFxuLVxcdFxcdFxcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVxcdTAwM2VpbmRleCBcXHUwMDNlPSBlbmQgKi9cXG4tXFx0XFx0XFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXFx1MDAyNlxcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcXG4tXFx0XFx0XFx0XFx0Km5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKFxcbi1cXHRcXHRcXHRcXHRcXHRuZXdfZm9saW8sIGlub2RlX3RvX3diKG1hcHBpbmctXFx1MDAzZWhvc3QpKTtcXG4tXFx0XFx0XFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xcbi1cXHRcXHRcXHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcXG4rXFx0XFx0eGFzX3NldF9vcmRlcihcXHUwMDI2eGFzLCBmb2xpby1cXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XFxuK1xcdFxcdHhhc19zcGxpdF9hbGxvYyhcXHUwMDI2eGFzLCBmb2xpbywgb2xkX29yZGVyLCBnZnApO1xcbitcXHRcXHRpZiAoeGFzX2Vycm9yKFxcdTAwMjZ4YXMpKSB7XFxuK1xcdFxcdFxcdHJldCA9IHhhc19lcnJvcihcXHUwMDI2eGFzKTtcXG4rXFx0XFx0XFx0Z290byBmYWlsX2ZyZWU7XFxuIFxcdFxcdH1cXG4rXFx0fVxcbiBcXG4tXFx0XFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuLVxcdFxcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4tXFx0XFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4tXFx0XFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcXG4rXFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4gXFxuLVxcdFxcdGlmIChkb19scnUpXFxuLVxcdFxcdFxcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcXG4rXFx0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovXFxuK1xcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuK1xcdFxcdHJldCA9IC1FQUdBSU47XFxuK1xcdFxcdGdvdG8gZmFpbF9tbWFwX3VubG9jaztcXG4rXFx0fVxcbiBcXG4tXFx0XFx0aWYgKGNpKVxcbi1cXHRcXHRcXHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcXG4tXFx0XFx0XFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHQvKlxcbitcXHQgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbitcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbitcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuK1xcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbitcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbitcXHQgKi9cXG4rXFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbitcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuK1xcbitcXHR1bm1hcF9mb2xpbyhmb2xpbyk7XFxuK1xcbitcXHR4YXNfbG9ja19pcnEoXFx1MDAyNnhhcyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxcbitcXHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cXG4rXFx0ICovXFxuK1xcdGlmICh4YXNfbG9hZChcXHUwMDI2eGFzKSAhPSBmb2xpbykge1xcbitcXHRcXHRyZXQgPSAtRUFHQUlOO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcXG4rXFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFxcdTAwMjZcXHUwMDI2IG5ld19vcmRlciBcXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcXG4rXFx0XFx0XFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xcbitcXHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XFxuK1xcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcXHUwMDI2eGFzLFxcbitcXHRcXHRcXHRcXHQgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcXG4rXFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3plbiB1bnRpbCBwYWdlIGNhY2hlXFxuK1xcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xcbitcXHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxcbitcXHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXFxuK1xcdCAqIEBmb2xpby5cXG4rXFx0ICovXFxuK1xcdGZvcl9lYWNoX2ZvbGlvX3NhZmUoZm9saW9fbmV4dChmb2xpbyksIGVuZF9mb2xpbywgbmV3X2ZvbGlvLCBuZXh0KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xcbitcXG4rXFx0XFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcXG4rXFx0XFx0XFx0XFx0ICAgZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKSArIDEpO1xcbitcXG4rXFx0XFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xcbitcXG4rXFx0XFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXFxuK1xcdFxcdGlmIChuZXdfZm9saW8tXFx1MDAzZWluZGV4IFxcdTAwM2MgZW5kKSB7XFxuK1xcdFxcdFxcdF9feGFfc3RvcmUoXFx1MDAyNm1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cXHUwMDNlaW5kZXgsXFxuK1xcdFxcdFxcdFxcdCAgIG5ld19mb2xpbywgMCk7XFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHR9XFxuLVxcdFxcdHJldHVybiAtRUFHQUlOO1xcbitcXG4rXFx0XFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXFx1MDAzZWluZGV4IFxcdTAwM2U9IGVuZCAqL1xcbitcXHRcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4rXFx0XFx0XFx0bnJfc2htZW1fZHJvcHBlZCArPSBucl9wYWdlcztcXG4rXFx0XFx0ZWxzZSBpZiAoZm9saW9fdGVzdF9jbGVhcl9kaXJ0eShuZXdfZm9saW8pKVxcbitcXHRcXHRcXHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVxcdTAwM2Vob3N0KSk7XFxuK1xcdFxcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcXG4rXFx0XFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XFxuIFxcdH1cXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXFxuK1xcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cXG4rXFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cXG4rXFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXFxuK1xcdCAqL1xcbitcXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xcbitcXHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XFxuK2ZhaWw6XFxuK1xcdC8qXFxuK1xcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcXG4rXFx0ICogcmVtZW1iZXIgdG8gYWRkIHJlbWFwX3BhZ2UoKSBhbmQgYWRhcHQgaXQuXFxuK1xcdCAqL1xcbitcXHR4YXNfdW5sb2NrX2lycShcXHUwMDI2eGFzKTtcXG4rZmFpbF9tbWFwX3VubG9jazpcXG4rXFx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXFxuK1xcdFxcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXFx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xcbitcXHQvKlxcbitcXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xcbitcXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXFxuK1xcdCAqIHRoZSBpbm9kZSB5ZXQsIG5vdGhpbmcgcGFzdCB0aGlzIHBvaW50IG1heSB0b3VjaCB0aGUgaW5vZGUgb3JcXG4rXFx0ICogdGhlIG1hcHBpbmcuXFxuK1xcdCAqL1xcbitcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuK2ZhaWxfZnJlZTpcXG4rXFx0LyogUmVzdG9yZSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbWVtY2cgKi9cXG4rXFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbitcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuK1xcdHhhc19kZXN0cm95KFxcdTAwMjZ4YXMpO1xcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbkBAIC00MDg2LDkgKzQyNzIsOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxcbiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcXG4gICpcXG4tICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuXFxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cXG4gICogSXQgaXMgaW4gY2hhcmdlIG9mIGNoZWNraW5nIHdoZXRoZXIgdGhlIHNwbGl0IGlzIHN1cHBvcnRlZCBvciBub3QgYW5kXFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cXG4gICpcXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZFxcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcXG5AQCAtNDEwMiwxNyArNDI4OCwxMSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFx0XFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgcGFnZSAqbG9ja19hdCxcXG4gXFx0XFx0c3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXFxuIHtcXG4tXFx0WEFfU1RBVEUoeGFzLCBcXHUwMDI2Zm9saW8tXFx1MDAzZW1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIGZvbGlvLVxcdTAwM2VpbmRleCk7XFxuK1xcdGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xcbiBcXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xcbiBcXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xcbi1cXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csICpvbGRfbWVtY2c7XFxuLVxcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcXG4tXFx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XFxuIFxcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XFxuIFxcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcXG4tXFx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xcbi1cXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSAwO1xcbi1cXHRwZ29mZl90IGVuZCA9IDA7XFxuIFxcdGludCByZXQ7XFxuIFxcbiBcXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xcbkBAIC00MTIwLDE0MSArNDMwMCwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4gXFxuIFxcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XFxuIFxcdFxcdHJldCA9IC1FSU5WQUw7XFxuLVxcdFxcdGdvdG8gb3V0X25vX21lbWNnO1xcbitcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4gXFx0aWYgKG5ld19vcmRlciBcXHUwMDNlPSBvbGRfb3JkZXIpIHtcXG4gXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0Z290byBvdXRfbm9fbWVtY2c7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbiBcXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xcbiBcXHRpZiAocmV0KSB7XFxuIFxcdFxcdFZNX1dBUk5fT05DRShyZXQgPT0gLUVJTlZBTCwgXFxcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1xcXCIpO1xcbi1cXHRcXHRnb3RvIG91dF9ub19tZW1jZztcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxcbi1cXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXFxuLVxcdCAqL1xcbi1cXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xcbi1cXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcXG4tXFxuLVxcdGlmIChpc19hbm9uKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxcbi1cXHRcXHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXFxuLVxcdFxcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcXG4tXFx0XFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXFxuLVxcdFxcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXFxuLVxcdFxcdCAqIG9wZXJhdGlvbnMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XFxuLVxcdFxcdGlmICghYW5vbl92bWEpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVCVVNZO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcXG4tXFx0XFx0bWFwcGluZyA9IE5VTEw7XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XFxuLVxcdFxcdGdmcF90IGdmcDtcXG4tXFxuLVxcdFxcdG1hcHBpbmcgPSBmb2xpby1cXHUwMDNlbWFwcGluZztcXG4tXFx0XFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuLVxcdFxcdGlmIChuZXdfb3JkZXIgXFx1MDAzYyBtaW5fb3JkZXIpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcXHUwMDI2XFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdEdGUF9SRUNMQUlNX01BU0spO1xcbi1cXG4tXFx0XFx0aWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVCVVNZO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0bWFwcGluZ19zZXRfdXBkYXRlKFxcdTAwMjZ4YXMsIG1hcHBpbmcpO1xcbi1cXG4tXFx0XFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XFxuLVxcdFxcdFxcdHhhc19zZXRfb3JkZXIoXFx1MDAyNnhhcywgZm9saW8tXFx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xcbi1cXHRcXHRcXHR4YXNfc3BsaXRfYWxsb2MoXFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcXG4tXFx0XFx0XFx0aWYgKHhhc19lcnJvcihcXHUwMDI2eGFzKSkge1xcbi1cXHRcXHRcXHRcXHRyZXQgPSB4YXNfZXJyb3IoXFx1MDAyNnhhcyk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdGFub25fdm1hID0gTlVMTDtcXG4tXFx0XFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxcbi1cXHRcXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxcbi1cXHRcXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXFxuLVxcdFxcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxcbi1cXHRcXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXFx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xcbi1cXHRcXHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcXG4tXFx0XFx0XFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXFx1MDAzZWhvc3QsIGVuZCk7XFxuLVxcdH1cXG4tXFxuLVxcdC8qXFxuLVxcdCAqIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSB3aWxsXFxuLVxcdCAqIHNwbGl0IFBNRHNcXG4tXFx0ICovXFxuLVxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKSB7XFxuLVxcdFxcdHJldCA9IC1FQUdBSU47XFxuLVxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4tXFx0fVxcbi1cXG4tXFx0dW5tYXBfZm9saW8oZm9saW8pO1xcbi1cXG4tXFx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cXG4tXFx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcXG4tXFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS5cXG4tXFx0XFx0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHR4YXNfbG9jayhcXHUwMDI2eGFzKTtcXG4tXFx0XFx0eGFzX3Jlc2V0KFxcdTAwMjZ4YXMpO1xcbi1cXHRcXHRpZiAoeGFzX2xvYWQoXFx1MDAyNnhhcykgIT0gZm9saW8pIHtcXG4tXFx0XFx0XFx0cmV0ID0gLUVBR0FJTjtcXG4tXFx0XFx0XFx0Z290byBmYWlsO1xcbi1cXHRcXHR9XFxuK1xcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuIFxcbi1cXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFxcdTAwMjZ4YXMsIG1hcHBpbmcsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdHRydWUsIGxpc3QsIHNwbGl0X3R5cGUsIGVuZCwgXFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xcbi1mYWlsOlxcbi1cXHRpZiAobWFwcGluZylcXG4tXFx0XFx0eGFzX3VubG9jayhcXHUwMDI2eGFzKTtcXG4tXFxuLVxcdGxvY2FsX2lycV9lbmFibGUoKTtcXG4tXFxuLVxcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxcbi1cXHRcXHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVxcdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcXG4tXFxuLVxcdGlmICghcmV0IFxcdTAwMjZcXHUwMDI2IGlzX2Fub24gXFx1MDAyNlxcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcXG4tXFx0XFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XFxuLVxcbi1cXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFxcdTAwM2NcXHUwMDNjIG9sZF9vcmRlciwgdHR1X2ZsYWdzKTtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXFxuLVxcdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cXG4tXFx0ICogZXZpY3Rpb24gY2Fubm90IGZyZWUgdGhlIGlub2RlIHlldDsgQGxvY2tfYXQgaXMgbm90IGVub3VnaCwgaXQgbWF5XFxuLVxcdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXFxuLVxcdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxcbi1cXHQgKi9cXG4tXFx0aWYgKG1hcHBpbmcpIHtcXG4tXFx0XFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xcbi1cXHRcXHRtYXBwaW5nID0gTlVMTDtcXG4tXFx0fVxcbitcXHRpZiAoaXNfYW5vbilcXG4rXFx0XFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xcbitcXHRlbHNlIGlmIChpc19zd2FwY2FjaGUpXFxuK1xcdFxcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBmYWxzZSwgbGlzdCwgc3BsaXRfdHlwZSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXFxuQEAgLTQyNjUsMjkgKzQzMzMsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXFxuIFxcdFxcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXFxuIFxcdFxcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxcbi1cXHRcXHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXFxuK1xcdFxcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXFxuIFxcdFxcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XFxuK1xcdFxcdGlmIChpc19zd2FwY2FjaGUpXFxuK1xcdFxcdFxcdGZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pO1xcbitcXHRcXHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fcHV0KG5ld19mb2xpbyk7XFxuIFxcdH1cXG4gXFxuLW91dF91bmxvY2s6XFxuLVxcdGlmIChhbm9uX3ZtYSkge1xcbi1cXHRcXHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xcbi1cXHRcXHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xcbi1cXHR9XFxuLVxcdGlmIChtYXBwaW5nKVxcbi1cXHRcXHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XFxuIG91dDpcXG4tXFx0LyogcmVzdG9yZSB0byBjYWxsZXIncyBvbGRfbWVtY2cgKi9cXG4tXFx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xcbi1cXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuLW91dF9ub19tZW1jZzpcXG4tXFx0eGFzX2Rlc3Ryb3koXFx1MDAyNnhhcyk7XFxuIFxcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcXG4gXFx0XFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcXG4gXFx0Y291bnRfbXRocF9zdGF0KG9sZF9vcmRlciwgIXJldCA/IE1USFBfU1RBVF9TUExJVCA6IE1USFBfU1RBVF9TUExJVF9GQUlMRUQpO1xcbkBAIC00MzExLDI5ICs0MzY5LDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbiAgKiBpc29sYXRlZCBmcm9tIExSVSAoaWYgYXBwbGljYWJsZSlcXG4gICpcXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcXG4tICogZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZSgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuXFxuKyAqIGZvbGlvX2ZyZWVfc3dhcCgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuXFxuICAqXFxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0b1xcbiAgKiAgICAgICAgIGluc3VmZmljaWVudCByZWZlcmVuY2UgY291bnQgb3IgZXh0cmEgcGlucykuXFxuICAqL1xcbiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4ge1xcbi1cXHRpbnQgcmV0ID0gMDtcXG4tXFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sYXJnZShmb2xpbyksIGZvbGlvKTtcXG4gXFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XFxuIFxcbi1cXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSlcXG4tXFx0XFx0cmV0dXJuIC1FQUdBSU47XFxuLVxcbi1cXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xcbi1cXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBOVUxMLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQwLCBOVUxMKTtcXG4tXFx0bG9jYWxfaXJxX2VuYWJsZSgpO1xcbi1cXHRyZXR1cm4gcmV0O1xcbitcXHRyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgZmFsc2UsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC00MzUyLDEwICs0NDAxLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuICAqICAgIEdVUCBwaW5zLCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9saW8gbm90IGdldHRpbmcgc3BsaXQ7IGluc3RlYWQsIHRoZSBjYWxsZXJcXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXFxuICAqXFxuLSAqIDQpIEBuZXdfb3JkZXIgXFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxcbi0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tXFx1MDAzZV9kZWZlcnJlZF9saXN0LCB3aGljaFxcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxcbi0gKiAgICBmb2xpbyBvbmx5IGhhcyBzdWJwYWdlcyAwIGFuZCAxLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxcbisgKiA0KSBAbmV3X29yZGVyICE9IDEgZm9yIGFub24gb3Igc3dhcGNhY2hlLiBBbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3JcXG4rICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcXG4rICogICAgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxcbiAgKiAgICBzaW5jZSB0aGV5IGRvIG5vdCB1c2UgX2RlZmVycmVkX2xpc3QuXFxuICAqXFxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGNhbGxlcidzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLFxcbkBAIC00Mzg0LDcgKzQ0MzIsNyBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxcbiAgKi9cXG4gaW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuLVxcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuIHtcXG4gXFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuIFxcbmRpZmYgLS1naXQgYS9tbS9zd2FwX3N0YXRlLmMgYi9tbS9zd2FwX3N0YXRlLmNcXG5pbmRleCA1YmU4MjU5MTFlNjQ1Li5mMTQwNWU1YjgxM2VlIDEwMDY0NFxcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xcbisrKyBiL21tL3N3YXBfc3RhdGUuY1xcbkBAIC0zODgsOCArMzg4LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbiBcXHQgICAgZm9saW9fb3JkZXIob2xkKSAhPSBmb2xpb19vcmRlcihuZXcpKSB7XFxuIFxcdFxcdGNpX29mZiA9IHN3cF9jbHVzdGVyX29mZnNldChvbGQtXFx1MDAzZXN3YXApO1xcbiBcXHRcXHRjaV9lbmQgPSBjaV9vZmYgKyBmb2xpb19ucl9wYWdlcyhvbGQpO1xcbi1cXHRcXHR3aGlsZSAoY2lfb2ZmKysgXFx1MDAzYyBjaV9lbmQpXFxuK1xcdFxcdGRvIHtcXG4gXFx0XFx0XFx0V0FSTl9PTl9PTkNFKHN3cF90Yl90b19mb2xpbyhfX3N3YXBfdGFibGVfZ2V0KGNpLCBjaV9vZmYpKSAhPSBvbGQpO1xcbitcXHRcXHR9IHdoaWxlICgrK2NpX29mZiBcXHUwMDNjIGNpX2VuZCk7XFxuIFxcdH1cXG4gfVxcbiBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6MjMuODYzMjIzODEzWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NzcxNzg5MTg3NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyXCIsXG4gICAgXCJmb2xpb19zcGxpdF91bm1hcHBlZFwiLFxuICAgIFwiZm9saW9fY2hlY2tfc3BsaXR0YWJsZVwiLFxuICAgIFwiX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgYW5kIG1vZGlmaWVzIHRoZSBsb2dpYyBmb3Igc3BsaXR0aW5nIGZvbGlvcywgcGFydGljdWxhcmx5IGZvciBhbm9ueW1vdXMgYW5kIHN3YXBjYWNoZSBmb2xpb3MuIEl0IGludHJvZHVjZXMgbmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgc3BsaXR0aW5nIGFuZCBtb2RpZmllcyBjb25kaXRpb25zIGluIGZvbGlvX2NoZWNrX3NwbGl0dGFibGUuIFRoZXNlIGFyZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNoYW5nZXMgYWZmZWN0aW5nIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgYW5kIHN3YXAsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgYW5kIHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDVhZTcwZjdhMjY3OTM3YjVlYWJjZDE5NmZmZjUyZTI0NzlkMGNkMmVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxMiAyMDoxNDoyMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBjZWQ0MDBmNzJkNDNhLi4xYzYxYjdkMzljZDAzIDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTM1ODksOSArMzU4OSw2IEBAIHN0YXRpYyB2b2lkIHJlbWFwX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBuciwgaW50IGZsYWdzKVxuIHtcbiBcdGludCBpID0gMDtcbiBcbi1cdC8qIElmIHVubWFwX2ZvbGlvKCkgdXNlcyB0cnlfdG9fbWlncmF0ZSgpIG9uIGZpbGUsIHJlbW92ZSB0aGlzIGNoZWNrICovXG4tXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4tXHRcdHJldHVybjtcbiBcdGZvciAoOzspIHtcbiBcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGZvbGlvLCBmb2xpbywgVFRVX1JNQVBfTE9DS0VEIHwgZmxhZ3MpO1xuIFx0XHRpICs9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbkBAIC0zNjM0LDYgKzM2MzEsMTggQEAgc3RhdGljIGJvb2wgcGFnZV9yYW5nZV9oYXNfaHdwb2lzb25lZChzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9uZyBucl9wYWdlcylcbiBcdHJldHVybiBmYWxzZTtcbiB9XG4gXG4rLyoqXG4rICogZm9yX2VhY2hfZm9saW9fc2FmZSAtIGl0ZXJhdGUgb3ZlciBjb250aWd1b3VzIGZvbGlvcyBzYWZlIGFnYWluc3QgZm9saW8gZnJlZVxuKyAqIEBzdGFydDogdGhlIGZpcnN0IGZvbGlvIHRvIGl0ZXJhdGVcbisgKiBAZW5kOiBzZW50aW5lbCwgZm9saW9fbmV4dCgpIG9mIHRoZSBsYXN0IGZvbGlvIHRvIGl0ZXJhdGVcbisgKiBAc3ViX2ZvbGlvOiBzdHJ1Y3QgZm9saW8gKiB0byB1c2UgYXMgdGhlIGxvb3AgY3Vyc29yXG4rICogQG5leHQ6IHN0cnVjdCBmb2xpbyAqIHVzZWQgYXMgdGVtcG9yYXJ5IHN0b3JhZ2VcbisgKi9cbisjZGVmaW5lIGZvcl9lYWNoX2ZvbGlvX3NhZmUoc3RhcnQsIGVuZCwgc3ViX2ZvbGlvLCBuZXh0KSBcXFxuK1x0Zm9yIChzdWJfZm9saW8gPSAoc3RhcnQpLCBuZXh0ID0gZm9saW9fbmV4dChzdWJfZm9saW8pOyBcXFxuK1x0ICAgICBzdWJfZm9saW8gIT0gKGVuZCk7IFxcXG4rXHQgICAgIHN1Yl9mb2xpbyA9IG5leHQsIG5leHQgPSBmb2xpb19uZXh0KG5leHQpKVxuK1xuIC8qXG4gICogSXQgc3BsaXRzIEBmb2xpbyBpbnRvIEBuZXdfb3JkZXIgZm9saW9zIGFuZCBjb3BpZXMgdGhlIEBmb2xpbyBtZXRhZGF0YSB0b1xuICAqIGFsbCB0aGUgcmVzdWx0aW5nIGZvbGlvcy5cbkBAIC0zNzU1LDggKzM3NjQsOCBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBvbGRfb3JkZXIsXG4gfVxuIFxuIC8qKlxuLSAqIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSAtIHNwbGl0cyBhbiB1bm1hcHBlZCBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zIGluXG4tICogdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuXG4rICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSAtIHNwbGl0cyBhIGZyb3plbiBAZm9saW8gdG8gbG93ZXIgb3JkZXIgZm9saW9zXG4rICogaW4gdHdvIHdheXM6IHVuaWZvcm0gc3BsaXQgb3Igbm9uLXVuaWZvcm0gc3BsaXQuXG4gICogQGZvbGlvOiB0aGUgdG8tYmUtc3BsaXQgZm9saW9cbiAgKiBAbmV3X29yZGVyOiB0aGUgc21hbGxlc3Qgb3JkZXIgb2YgdGhlIGFmdGVyIHNwbGl0IGZvbGlvcyAoc2luY2UgYnVkZHlcbiAgKiAgICAgICAgICAgICBhbGxvY2F0b3IgbGlrZSBzcGxpdCBnZW5lcmF0ZXMgZm9saW9zIHdpdGggb3JkZXJzIGZyb20gQGZvbGlvJ3NcbkBAIC0zNzk1LDExICszODA0LDEyIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiAgKiBSZXR1cm46IDAgLSBzdWNjZXNzZnVsLCBcdTAwM2MwIC0gZmFpbGVkIChpZiAtRU5PTUVNIGlzIHJldHVybmVkLCBAZm9saW8gbWlnaHQgYmVcbiAgKiBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIsIHRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2spXG4gICovXG4tc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4rc3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuIFx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0Y29uc3QgYm9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdGNvbnN0IGJvb2wgaXNfc3dhcGNhY2hlID0gZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdGludCBzdGFydF9vcmRlciA9IHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNID8gbmV3X29yZGVyIDogb2xkX29yZGVyIC0gMTtcbiBcdHN0cnVjdCBmb2xpbyAqb2xkX2ZvbGlvID0gZm9saW87XG5AQCAtMzgxNCw4ICszODI0LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHQgICAgIHNwbGl0X29yZGVyLS0pIHtcbiBcdFx0aW50IG5yX25ld19mb2xpb3MgPSAxVUwgXHUwMDNjXHUwMDNjIChvbGRfb3JkZXIgLSBzcGxpdF9vcmRlcik7XG4gXG4tXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbi1cdFx0aWYgKGlzX2Fub24gXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4rXHRcdC8qIG9yZGVyLTEgYW5vbnltb3VzIG9yIHN3YXBjYWNoZSBmb2xpbyBpcyBub3Qgc3VwcG9ydGVkICovXG4rXHRcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBzcGxpdF9vcmRlciA9PSAxKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRpZiAobWFwcGluZykge1xuQEAgLTM4NzgsMzIgKzM4ODgsMjYgQEAgc3RhdGljIGludCBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gaW50IGZvbGlvX2NoZWNrX3NwbGl0dGFibGUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0XHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4rXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuK1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4rXG4gXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbiBcdC8qXG4gXHQgKiBGb2xpb3MgdGhhdCBqdXN0IGdvdCB0cnVuY2F0ZWQgY2Fubm90IGdldCBzcGxpdC4gU2lnbmFsIHRvIHRoZVxuLVx0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS5cbi1cdCAqXG4tXHQgKiBUT0RPOiB0aGlzIHdpbGwgYWxzbyBjdXJyZW50bHkgcmVmdXNlIGZvbGlvcyB3aXRob3V0IGEgbWFwcGluZyBpbiB0aGVcbi1cdCAqIHN3YXBjYWNoZSAoc2htZW0gb3IgdG8tYmUtYW5vbiBmb2xpb3MpLlxuK1x0ICogY2FsbGVyIHRoYXQgdGhlcmUgd2FzIGEgcmFjZS4gQSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvXG4rXHQgKiBoYXMgbm8gcGFnZSBjYWNoZSBlbnRyaWVzIHRvIHVwZGF0ZSwgc28gaXQgaXMgZmluZSB0byBzcGxpdC5cbiBcdCAqL1xuLVx0aWYgKCFmb2xpby1cdTAwM2VtYXBwaW5nIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbitcdGlmICghZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjYgIWlzX3N3YXBjYWNoZSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbi1cdC8qIG9yZGVyLTEgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4gKi9cbi1cdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4tXG4gXHQvKlxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIGNvdWxkIG9ubHkgYmUgc3BsaXQgdG8gb3JkZXIgMFxuLVx0ICpcbi1cdCAqIG5vbi11bmlmb3JtIHNwbGl0IGNyZWF0ZXMgYWZ0ZXItc3BsaXQgZm9saW9zIHdpdGggb3JkZXJzIGZyb21cbi1cdCAqIGZvbGlvX29yZGVyKGZvbGlvKSAtIDEgdG8gbmV3X29yZGVyLCBtYWtpbmcgaXQgbm90IHN1aXRhYmxlIGZvciBhbnlcbi1cdCAqIHN3YXBjYWNoZSBmb2xpbyBzcGxpdC4gT25seSB1bmlmb3JtIHNwbGl0IHRvIG9yZGVyLTAgY2FuIGJlIHVzZWRcbi1cdCAqIGhlcmUuXG4rXHQgKiBPcmRlci0xIGlzIHVuc3VwcG9ydGVkOiBhbm9uIGZvbGlvcyBuZWVkIHN1YnBhZ2UgMiBmb3IgdGhlXG4rXHQgKiBkZWZlcnJlZCBzcGxpdCBsaXN0LCBoeWJyaWQgc2htZW0gXHUwMDI2IHN3YXAgY2FjaGUgZm9saW9zIGFyZSBub3RcbitcdCAqIHNwbGl0dGFibGUsIGFuZCBhIHNwbGl0dGFibGUgbWFwcGluZ2xlc3Mgc3dhcCBjYWNoZSBmb2xpbyBjb3VsZFxuK1x0ICogYmUgZWl0aGVyIGFub24gb3Igc2htZW0sIHdoaWNoIHdlIGNhbm5vdCB0ZWxsIGFwYXJ0LlxuIFx0ICovXG4tXHRpZiAoKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9OT05fVU5JRk9STSB8fCBuZXdfb3JkZXIpIFx1MDAyNlx1MDAyNiBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpIHtcbitcdGlmICgoaXNfYW5vbiB8fCBpc19zd2FwY2FjaGUpIFx1MDAyNlx1MDAyNiBuZXdfb3JkZXIgPT0gMSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4tXHR9XG4gXG4gXHRpZiAoaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG5AQCAtMzkxMSwzOSArMzkxNSw5NyBAQCBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0aWYgKGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSlcbiBcdFx0cmV0dXJuIC1FQlVTWTtcbiBcbitcdC8qXG4rXHQgKiBBIG5vbi1hbm9uIHN3YXBjYWNoZSBmb2xpbyB0aGF0IHN0aWxsIGhhcyBhIG1hcHBpbmcgY2FuIG9ubHkgYmUgYVxuK1x0ICogc2htZW0gZm9saW8gdW5kZXIgU1dBUCBJTywgaXQncyByZW1vdmVkIGZyb20gZWl0aGVyIHN3YXAgY2FjaGUgb3JcbitcdCAqIHNobWVtIG1hcHBpbmcgYWZ0ZXJ3YXJkLiBUaGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBzcGxpdHRpbmcgdGhlbVxuK1x0ICogaGVuY2UgcmVqZWN0IGl0IGhlcmUgdXAgZnJvbnQgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLlxuK1x0ICovXG4rXHRpZiAoIWlzX2Fub24gXHUwMDI2XHUwMDI2IGlzX3N3YXBjYWNoZSBcdTAwMjZcdTAwMjYgZm9saW8tXHUwMDNlbWFwcGluZylcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcbiBcdHJldHVybiAwO1xuIH1cbiBcbi0vKiBOdW1iZXIgb2YgZm9saW8gcmVmZXJlbmNlcyBmcm9tIHRoZSBwYWdlY2FjaGUgb3IgdGhlIHN3YXBjYWNoZS4gKi9cbi1zdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX2NhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuKy8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHN3YXBjYWNoZS4gKi9cbitzdGF0aWMgdW5zaWduZWQgaW50IGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4tXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbitcdGlmICghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuIFx0XHRyZXR1cm4gMDtcbiBcdHJldHVybiBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4gfVxuIFxuLXN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgeGFfc3RhdGUgKnhhcyxcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgYm9vbCBkb19scnUsXG4tXHRcdFx0XHRcdCAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUsXG4tXHRcdFx0XHRcdCAgICAgcGdvZmZfdCBlbmQsIGludCAqbnJfc2htZW1fZHJvcHBlZClcbisvKipcbisgKiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoKSAtIHNwbGl0IGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpb1xuKyAqIEBmb2xpbzogZm9saW8gdG8gc3BsaXQsIG11c3QgYmUgbG9ja2VkXG4rICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcbisgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbisgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXRcbisgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcbisgKiBAZG9fbHJ1OiBpZiB0cnVlLCBhZGQgYWZ0ZXItc3BsaXQgZm9saW9zIHRvIEBsaXN0IGlmIG5vbiBOVUxMLCBvdGhlcndpc2UgdG9cbisgKiAgICAgICAgICB0aGUgTFJVIGxpc3RcbisgKiBAYW5vbl91bm1hcDogaWYgdHJ1ZSwgdW5tYXAgQGZvbGlvIGJlZm9yZSB0aGUgc3BsaXQgYW5kIHJlbWFwIGl0IGFmdGVyXG4rICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuKyAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbisgKlxuKyAqIEhlbHBlciBmb3Igc3BsaXR0aW5nIGFuIGFub24gb3Igc3dhcCBjYWNoZSBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbyAodW5sZXNzXG4rICogQGFub25fdW5tYXAgaXMgZmFsc2UpLCBmcmVlemVzIGl0cyByZWZjb3VudCwgYW5kIHBlcmZvcm1zIHRoZSBzcGxpdCwgdXBkYXRlc1xuKyAqIHRoZSBzd2FwIGNhY2hlIGVudHJpZXMuIFNwbGl0IGZvbGlvcyBhcmUgdW5mcm96ZW4gYW5kIHJlbWFwcGVkLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuXG4rICovXG4rc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIGJvb2wgZG9fbHJ1LCBib29sIGFub25fdW5tYXAsXG4rXHRcdFx0XHRcdCAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4ge1xuIFx0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbitcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbiBcdGludCBvbGRfb3JkZXIgPSBmb2xpb19vcmRlcihmb2xpbyk7XG4rXHRzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDtcbitcdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4gXHRzdHJ1Y3QgbGlzdF9scnVfb25lICpscnU7XG4rXHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXHRib29sIGRlcXVldWVfZGVmZXJyZWQ7XG4gXHRpbnQgcmV0ID0gMDtcbiBcbi1cdFZNX1dBUk5fT05fT05DRSghbWFwcGluZyBcdTAwMjZcdTAwMjYgZW5kKTtcbitcdC8qXG4rXHQgKiBVbm1hcC9yZW1hcCBuZWVkcyB0aGUgYW5vbl92bWEuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHlcbitcdCAqIGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGQgcHJldmVudCB0aGUgYW5vbl92bWEgZnJvbVxuK1x0ICogZGlzYXBwZWFyaW5nLCBzbyB3ZSBmaXJzdCB0YWtlIGEgcmVmZXJlbmNlIGFuZCBsb2NrIGl0LiBUaGlzIGlzXG4rXHQgKiBzaW1pbGFyIHRvIGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCgpIGV4Y2VwdCB0aGUgd3JpdGUgbG9jayBpc1xuK1x0ICogdGFrZW4gdG8gc2VyaWFsaXplIGFnYWluc3QgcGFyYWxsZWwgc3BsaXQgb3IgY29sbGFwc2UuXG4rXHQgKi9cbitcdGlmIChhbm9uX3VubWFwKSB7XG4rXHRcdGFub25fdm1hID0gZm9saW9fZ2V0X2Fub25fdm1hKGZvbGlvKTtcbitcdFx0aWYgKCFhbm9uX3ZtYSlcbitcdFx0XHRyZXR1cm4gLUVCVVNZO1xuK1x0XHRhbm9uX3ZtYV9sb2NrX3dyaXRlKGFub25fdm1hKTtcbitcdH1cbitcbitcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdGhlIG9wdGlvbmFsIHVubWFwLiAqL1xuK1x0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBvdXRfdW5sb2NrO1xuK1x0fVxuK1xuK1x0aWYgKGFub25fdW5tYXApXG4rXHRcdHVubWFwX2ZvbGlvKGZvbGlvKTtcbitcbitcdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4rXG4gXHQvKlxuIFx0ICogSWYgdGhpcyBmb2xpbyBjYW4gYmUgb24gdGhlIGRlZmVycmVkIHNwbGl0IHF1ZXVlLCBsb2NrIG91dFxuIFx0ICogdGhlIHNocmlua2VyIGJlZm9yZSBmcmVlemluZyB0aGUgcmVmLiBJZiB0aGUgc2hyaW5rZXIgc2Vlc1xuIFx0ICogYSAwLXJlZiBmb2xpbywgaXQgYXNzdW1lcyBpdCBiZWF0IGZvbGlvX3B1dCgpIHRvIHRoZSBsaXN0XG4gXHQgKiBsb2NrIGFuZCBtdXN0IGNsZWFuIHVwIHRoZSBMUlUgc3RhdGUgLSB0aGUgc2FtZSBkZXF1ZXVlIHdlXG4gXHQgKiB3aWxsIGRvIGJlbG93IGFzIHBhcnQgb2YgdGhlIHNwbGl0LlxuK1x0ICpcbitcdCAqIE9ubHkgYW5vbiBmb2xpb3MgYXJlIGV2ZXIgcXVldWVkIG9uIHRoZSBkZWZlcnJlZCBzcGxpdCBsaXN0LFxuK1x0ICogc28gbm9uLWFub24gZm9saW9zIChtYXBwaW5nbGVzcyBzd2FwY2FjaGUpIG5ldmVyIG5lZWQgZGVxdWV1aW5nLlxuIFx0ICovXG4tXHRkZXF1ZXVlX2RlZmVycmVkID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgb2xkX29yZGVyIFx1MDAzZSAxO1xuK1x0ZGVxdWV1ZV9kZWZlcnJlZCA9IG9sZF9vcmRlciBcdTAwM2UgMSBcdTAwMjZcdTAwMjYgaXNfYW5vbjtcbiBcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4gXHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiBcbkBAIC0zOTUyLDEyOCArNDAxNCwyNTIgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cbiBcdFx0bHJ1ID0gbGlzdF9scnVfbG9jayhcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsXG4gXHRcdFx0XHQgICAgZm9saW9fbmlkKGZvbGlvKSwgXHUwMDI2bWVtY2cpO1xuIFx0fVxuLVx0aWYgKGZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKSkge1xuLVx0XHRzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpID0gTlVMTDtcbi1cdFx0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFxuK1x0aWYgKCFmb2xpb19yZWZfZnJlZXplKGZvbGlvLCBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XG4gXHRcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4tXHRcdFx0X19saXN0X2xydV9kZWwoXHUwMDI2ZGVmZXJyZWRfc3BsaXRfbHJ1LCBscnUsXG4tXHRcdFx0XHQgICAgICAgXHUwMDI2Zm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRmb2xpb19jbGVhcl9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKTtcbi1cdFx0XHRcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxuLVx0XHRcdFx0XHRNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4tXHRcdFx0fVxuIFx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuIFx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFx0XHR9XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gb3V0X25vX3NwbGl0O1xuK1x0fVxuIFxuLVx0XHRpZiAobWFwcGluZykge1xuLVx0XHRcdGludCBuciA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbi1cbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pIFx1MDAyNlx1MDAyNlxuLVx0XHRcdCAgICBuZXdfb3JkZXIgXHUwMDNjIEhQQUdFX1BNRF9PUkRFUikge1xuLVx0XHRcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfU0hNRU1fVEhQUywgLW5yKTtcbi1cdFx0XHRcdH0gZWxzZSB7XG4tXHRcdFx0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbyxcbi1cdFx0XHRcdFx0XHRcdE5SX0ZJTEVfVEhQUywgLW5yKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4rXHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuK1x0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbitcdFx0XHQgICAgICAgXHUwMDI2Zm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIGZvbGlvX25pZChmb2xpbykpO1xuK1x0XHRpZiAoZm9saW9fdGVzdF9wYXJ0aWFsbHlfbWFwcGVkKGZvbGlvKSkge1xuK1x0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuK1x0XHRcdG1vZF9tdGhwX3N0YXQob2xkX29yZGVyLFxuK1x0XHRcdFx0ICAgICAgTVRIUF9TVEFUX05SX0FOT05fUEFSVElBTExZX01BUFBFRCwgLTEpO1xuIFx0XHR9XG4rXHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdH1cbiBcbi1cdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xuLVx0XHRcdGlmIChtYXBwaW5nKSB7XG4tXHRcdFx0XHRWTV9XQVJOX09OX09OQ0VfRk9MSU8obWFwcGluZywgZm9saW8pO1xuLVx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4tXHRcdFx0fVxuK1x0aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSlcbitcdFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrKGZvbGlvKTtcbiBcbi1cdFx0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuLVx0XHR9XG4rXHRpZiAoZG9fbHJ1KVxuK1x0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXG4rXHRyZXQgPSBfX3NwbGl0X2Zyb3plbl9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgTlVMTCxcbitcdFx0XHRcdCAgIE5VTEwsIHNwbGl0X3R5cGUpO1xuIFxuLVx0XHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSB0aGUgcG9zdC1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBwbGFjZS4gS2VlcCB0aGUgaGVhZCBAZm9saW8gZnJvemVuIHVudGlsIHRoZSBlbmQ6IHN1YiBlbnRyaWVzXG4rXHQgKiBpbiBzd2FwIGNhY2hlIG11c3QgYmUgdXBkYXRlZCBmaXJzdCwgc28gYSBjb25jdXJyZW50XG4rXHQgKiBzd2FwX2NhY2hlX2dldF9mb2xpbygpIGNhbm5vdCByZXR1cm4gdGhlIGhlYWQgZm9saW8gZm9yIGEgc3ViXG4rXHQgKiBlbnRyeSAoZm9saW9fdHJ5X2dldCgpIHdpbGwgZmFpbCBvbiB0aGUgaGVhZCBAZm9saW8gdW50aWwgdW5mcmVlemUpLlxuK1x0ICovXG4rXHRmb3JfZWFjaF9mb2xpb19zYWZlKGZvbGlvX25leHQoZm9saW8pLCBlbmRfZm9saW8sIG5ld19mb2xpbywgbmV4dCkge1xuK1x0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuK1x0XHRcdFx0ICAgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4gXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1x0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdFx0aWYgKGNpKVxuK1x0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbitcdH1cbiBcbi1cdFx0cmV0ID0gX19zcGxpdF91bm1hcHBlZF9mb2xpbyhmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgeGFzLFxuLVx0XHRcdFx0XHQgICAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuK1x0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbi1cdFx0ICogbGlzdC4gQGZvbGlvIHNob3VsZCBiZSBrZXB0IGZyb3pvbiB1bnRpbCBwYWdlIGNhY2hlXG4tXHRcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuLVx0XHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKiBBcyBhIHJlc3VsdCwgbmV3X2ZvbGlvIHN0YXJ0cyBmcm9tIHRoZSBuZXh0IGZvbGlvIG9mXG4tXHRcdCAqIEBmb2xpby5cbi1cdFx0ICovXG4tXHRcdGZvciAobmV3X2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7IG5ld19mb2xpbyAhPSBlbmRfZm9saW87XG4tXHRcdCAgICAgbmV3X2ZvbGlvID0gbmV4dCkge1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pO1xuK1x0aWYgKGRvX2xydSlcbitcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1x0aWYgKGNpKVxuK1x0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbitvdXRfbm9fc3BsaXQ6XG4rXHRsb2NhbF9pcnFfZW5hYmxlKCk7XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbitcdFx0XHR0dHVfZmxhZ3MgPSBUVFVfVVNFX1NIQVJFRF9aRVJPUEFHRTtcbitcdFx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuK1x0fVxuK291dF91bmxvY2s6XG4rXHRpZiAoYW5vbl91bm1hcCkge1xuK1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuK1x0fVxuIFxuLVx0XHRcdG5leHQgPSBmb2xpb19uZXh0KG5ld19mb2xpbyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbiBcbi1cdFx0XHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBuZXdfZm9saW8pO1xuKy8qKlxuKyAqIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKCkgLSBzcGxpdCBhIGZpbGUtYmFja2VkIGZvbGlvXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWQgYW5kIGZpbGUtYmFja2VkXG4rICogQG5ld19vcmRlcjogdGhlIG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKHVuaWZvcm0gc3BsaXQpLCBvciB0aGVcbisgKiAgICAgICAgICAgICBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXItc3BsaXQgZm9saW9zIChub24tdW5pZm9ybSBzcGxpdClcbisgKiBAc3BsaXRfYXQ6IGluIG5vbi11bmlmb3JtIHNwbGl0LCB0aGUgZm9saW8gY29udGFpbmluZyBAc3BsaXRfYXQgaXMgc3BsaXRcbisgKiAgICAgICAgICAgIHVudGlsIGl0cyBvcmRlciBiZWNvbWVzIEBuZXdfb3JkZXJcbisgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxuKyAqXG4rICogSGVscGVyIGZvciBzcGxpdHRpbmcgYSBmaWxlLWJhY2tlZCBmb2xpby4gSXQgdW5tYXBzIEBmb2xpbywgZnJlZXplcyBpdHNcbisgKiByZWZjb3VudCwgYW5kIHBlcmZvcm0gdGhlIHNwbGl0LCB1cGRhdGVzIHRoZSBwYWdlIGNhY2hlIGVudHJpZXMuIFNwbGl0XG4rICogZm9saW9zIGFyZSB1bmZyb3plbiBidXQgbm90IHJlbWFwcGVkLCB0aGV5IGFyZSBmYXVsdGVkIGJhY2sgaW4gb24gZGVtYW5kLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuIChpZiAtRU5PTUVNXG4rICogaXMgcmV0dXJuZWQsIEBmb2xpbyBtaWdodCBiZSBzcGxpdCBidXQgbm90IHRvIEBuZXdfb3JkZXIpXG4rICovXG4rc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0XHQgICAgICAgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuK1x0XHRcdFx0XHQgICAgICAgZW51bSBzcGxpdF90eXBlIHNwbGl0X3R5cGUpXG4re1xuK1x0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmb2xpby1cdTAwM2VtYXBwaW5nO1xuK1x0WEFfU1RBVEUoeGFzLCBcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIGZvbGlvLVx1MDAzZWluZGV4KTtcbitcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4rXHRsb25nIG9sZF9ucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbitcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbitcdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbitcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4rXHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4rXHRwZ29mZl90IGVuZCA9IDA7XG4rXHRnZnBfdCBnZnA7XG4rXHRpbnQgcmV0ID0gMDtcbiBcbi1cdFx0XHRmb2xpb19yZWZfdW5mcmVlemUobmV3X2ZvbGlvLFxuLVx0XHRcdFx0XHQgICBmb2xpb19jYWNoZV9yZWZfY291bnQobmV3X2ZvbGlvKSArIDEpO1xuK1x0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4rXHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0XHRcdGlmIChkb19scnUpXG4tXHRcdFx0XHRscnVfYWRkX3NwbGl0X2ZvbGlvKGZvbGlvLCBuZXdfZm9saW8sIGxydXZlYywgbGlzdCk7XG4rXHQvKlxuK1x0ICogU3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuK1x0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuK1x0ICovXG4rXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuK1x0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbm9ueW1vdXMgZm9saW8gd2l0aCBzd2FwIGNhY2hlLlxuLVx0XHRcdCAqIE5PVEU6IHNobWVtIGluIHN3YXAgY2FjaGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKGNpKSB7XG4tXHRcdFx0XHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld19mb2xpbyk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4rXHRnZnAgPSBjdXJyZW50X2dmcF9jb250ZXh0KG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spO1xuK1x0aWYgKCFmaWxlbWFwX3JlbGVhc2VfZm9saW8oZm9saW8sIGdmcCkpIHtcbitcdFx0cmV0ID0gLUVCVVNZO1xuK1x0XHRnb3RvIGZhaWxfZnJlZTtcbitcdH1cbiBcbi1cdFx0XHQvKiBBbm9ueW1vdXMgZm9saW8gd2l0aG91dCBzd2FwIGNhY2hlICovXG4tXHRcdFx0aWYgKCFtYXBwaW5nKVxuLVx0XHRcdFx0Y29udGludWU7XG4rXHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbiBcbi1cdFx0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbi1cdFx0XHRpZiAobmV3X2ZvbGlvLVx1MDAzZWluZGV4IFx1MDAzYyBlbmQpIHtcbi1cdFx0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4tXHRcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHR9XG4rXHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbitcdFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcbi1cdFx0XHRWTV9XQVJOX09OX09OQ0UoIW5yX3NobWVtX2Ryb3BwZWQpO1xuLVx0XHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4tXHRcdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykgXHUwMDI2XHUwMDI2IG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdFx0XHQqbnJfc2htZW1fZHJvcHBlZCArPSBucl9wYWdlcztcbi1cdFx0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4tXHRcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQoXG4tXHRcdFx0XHRcdG5ld19mb2xpbywgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4tXHRcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuLVx0XHRcdGZvbGlvX3B1dF9yZWZzKG5ld19mb2xpbywgbnJfcGFnZXMpO1xuK1x0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4rXHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4rXHRcdGlmICh4YXNfZXJyb3IoXHUwMDI2eGFzKSkge1xuK1x0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuK1x0XHRcdGdvdG8gZmFpbF9mcmVlO1xuIFx0XHR9XG4rXHR9XG4gXG4tXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIE5VTEwpO1xuLVx0XHQvKlxuLVx0XHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuLVx0XHQgKiB1c2VkIHRvIHBvaW50IHRvIGl0LCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIG5ldyBmb2xpb3MuXG4tXHRcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4tXHRcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuLVx0XHQgKi9cbi1cdFx0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19jYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSk7XG4rXHRpX21tYXBfbG9ja19yZWFkKG1hcHBpbmcpO1xuIFxuLVx0XHRpZiAoZG9fbHJ1KVxuLVx0XHRcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbitcdC8qIFJhY3kgY2hlY2sgaWYgd2UgY2FuIHNwbGl0IHRoZSBwYWdlLCBiZWZvcmUgdW5tYXBfZm9saW8oKSAqL1xuK1x0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsX21tYXBfdW5sb2NrO1xuK1x0fVxuIFxuLVx0XHRpZiAoY2kpXG4tXHRcdFx0c3dhcF9jbHVzdGVyX3VubG9jayhjaSk7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoZGVxdWV1ZV9kZWZlcnJlZCkge1xuLVx0XHRcdGxpc3RfbHJ1X3VubG9jayhscnUpO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0LypcbitcdCAqIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4rXHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuK1x0ICogc2VxbG9jaywgd2hpY2ggY2Fubm90IGJlIG5lc3RlZCBpbnNpZGUgdGhlIHBhZ2UgdHJlZSBsb2NrLlxuK1x0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4rXHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuK1x0ICovXG4rXHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbitcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuK1x0XHRlbmQgPSBzaG1lbV9mYWxsb2NlbmQobWFwcGluZy1cdTAwM2Vob3N0LCBlbmQpO1xuK1xuK1x0dW5tYXBfZm9saW8oZm9saW8pO1xuK1xuK1x0eGFzX2xvY2tfaXJxKFx1MDAyNnhhcyk7XG4rXG4rXHQvKlxuK1x0ICogQ2hlY2sgaWYgdGhlIGZvbGlvIGlzIHByZXNlbnQgaW4gcGFnZSBjYWNoZS5cbitcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuK1x0ICovXG4rXHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIG9sZF9ucl9wYWdlcyArIDEpKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2IG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4rXHRcdGlmIChmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKVxuK1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfU0hNRU1fVEhQUywgLW9sZF9ucl9wYWdlcyk7XG4rXHRcdGVsc2VcbitcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sIE5SX0ZJTEVfVEhQUywgLW9sZF9ucl9wYWdlcyk7XG4rXHR9XG4rXG4rXHQvKiBsb2NrIGxydSBsaXN0L1BhZ2VDb21wb3VuZCwgcmVmIGZyb3plbiBieSBwYWdlX3JlZl9mcmVlemUgKi9cbitcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbitcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsXG4rXHRcdFx0XHQgICBtYXBwaW5nLCBzcGxpdF90eXBlKTtcbitcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBhZnRlci1zcGxpdCBmb2xpb3MgYW5kIHB1dCB0aGVtIGJhY2sgdG8gdGhlIHJpZ2h0XG4rXHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvemVuIHVudGlsIHBhZ2UgY2FjaGVcbitcdCAqIGVudHJpZXMgYXJlIHVwZGF0ZWQgd2l0aCBhbGwgdGhlIG90aGVyIGFmdGVyLXNwbGl0IGZvbGlvc1xuK1x0ICogdG8gcHJldmVudCBvdGhlcnMgc2VlaW5nIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2ZcbitcdCAqIEBmb2xpby5cbitcdCAqL1xuK1x0Zm9yX2VhY2hfZm9saW9fc2FmZShmb2xpb19uZXh0KGZvbGlvKSwgZW5kX2ZvbGlvLCBuZXdfZm9saW8sIG5leHQpIHtcbitcdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XG4rXG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19ucl9wYWdlcyhuZXdfZm9saW8pICsgMSk7XG4rXG4rXHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcbitcdFx0LyogQWRkIHRoZSBuZXcgZm9saW8gdG8gdGhlIHBhZ2UgY2FjaGUuICovXG4rXHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuK1x0XHRcdF9feGFfc3RvcmUoXHUwMDI2bWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBuZXdfZm9saW8tXHUwMDNlaW5kZXgsXG4rXHRcdFx0XHQgICBuZXdfZm9saW8sIDApO1xuK1x0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG4tXHRcdHJldHVybiAtRUFHQUlOO1xuK1xuK1x0XHQvKiBEcm9wIGZvbGlvIGJleW9uZCBFT0Y6IC1cdTAwM2VpbmRleCBcdTAwM2U9IGVuZCAqL1xuK1x0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSlcbitcdFx0XHRucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuK1x0XHRlbHNlIGlmIChmb2xpb190ZXN0X2NsZWFyX2RpcnR5KG5ld19mb2xpbykpXG4rXHRcdFx0Zm9saW9fYWNjb3VudF9jbGVhbmVkKG5ld19mb2xpbyxcbitcdFx0XHRcdFx0ICAgICAgaW5vZGVfdG9fd2IobWFwcGluZy1cdTAwM2Vob3N0KSk7XG4rXHRcdF9fZmlsZW1hcF9yZW1vdmVfZm9saW8obmV3X2ZvbGlvLCBOVUxMKTtcbitcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4gXHR9XG4gXG4rXHQvKlxuK1x0ICogVW5mcmVlemUgQGZvbGlvIG9ubHkgYWZ0ZXIgYWxsIHBhZ2UgY2FjaGUgZW50cmllcywgd2hpY2hcbitcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbitcdCAqIE90aGVyd2lzZSwgYSBwYXJhbGxlbCBmb2xpb190cnlfZ2V0KCkgY2FuIGdyYWIgQGZvbGlvXG4rXHQgKiBhbmQgaXRzIGNhbGxlciBjYW4gc2VlIHN0YWxlIHBhZ2UgY2FjaGUgZW50cmllcy5cbitcdCAqL1xuK1x0Zm9saW9fcmVmX3VuZnJlZXplKGZvbGlvLCBmb2xpb19ucl9wYWdlcyhmb2xpbykgKyAxKTtcbitcdGxydXZlY191bmxvY2sobHJ1dmVjKTtcbitmYWlsOlxuK1x0LypcbitcdCAqIElmIHdlIHdhbnQgdG8gdXNlIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSBpbiB1bm1hcF9mb2xpbyxcbitcdCAqIHJlbWVtYmVyIHRvIGFkZCByZW1hcF9wYWdlKCkgYW5kIGFkYXB0IGl0LlxuK1x0ICovXG4rXHR4YXNfdW5sb2NrX2lycShcdTAwMjZ4YXMpO1xuK2ZhaWxfbW1hcF91bmxvY2s6XG4rXHRpZiAobnJfc2htZW1fZHJvcHBlZClcbitcdFx0c2htZW1fdW5jaGFyZ2UobWFwcGluZy1cdTAwM2Vob3N0LCBucl9zaG1lbV9kcm9wcGVkKTtcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBtYXBwaW5nIHdoaWxlIHRoZSBpbm9kZSBpcyBzdGlsbCBwaW5uZWQuIEBmb2xpbyBzdGF5c1xuK1x0ICogbG9ja2VkIGFuZCBwcmVzZW50IGluIHRoZSBwYWdlIGNhY2hlLCBzbyBldmljdGlvbiBjYW5ub3QgZnJlZVxuK1x0ICogdGhlIGlub2RlIHlldCwgbm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvclxuK1x0ICogdGhlIG1hcHBpbmcuXG4rXHQgKi9cbitcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbitmYWlsX2ZyZWU6XG4rXHQvKiBSZXN0b3JlIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBtZW1jZyAqL1xuK1x0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuK1x0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuK1x0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuQEAgLTQwODYsOSArNDI3Miw5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuXG4gICogQGxpc3Q6IGFmdGVyLXNwbGl0IGZvbGlvcyB3aWxsIGJlIHB1dCBvbiBpdCBpZiBub24gTlVMTFxuICAqIEBzcGxpdF90eXBlOiBwZXJmb3JtIHVuaWZvcm0gc3BsaXQgb3Igbm90IChub24tdW5pZm9ybSBzcGxpdClcbiAgKlxuLSAqIEl0IGNhbGxzIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuKyAqIEl0IGNhbGxzIF9fc3BsaXRfZnJvemVuX2ZvbGlvKCkgdG8gcGVyZm9ybSB1bmlmb3JtIGFuZCBub24tdW5pZm9ybSBzcGxpdC5cbiAgKiBJdCBpcyBpbiBjaGFyZ2Ugb2YgY2hlY2tpbmcgd2hldGhlciB0aGUgc3BsaXQgaXMgc3VwcG9ydGVkIG9yIG5vdCBhbmRcbi0gKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkuXG4rICogcHJlcGFyaW5nIEBmb2xpbyBmb3IgX19zcGxpdF9mcm96ZW5fZm9saW8oKS5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGFmdGVyLXNwbGl0IGZvbGlvIGNvbnRhaW5pbmcgQGxvY2tfYXQgcmVtYWlucyBsb2NrZWRcbiAgKiBhbmQgb3RoZXJzIGFyZSB1bmxvY2tlZDpcbkBAIC00MTAyLDE3ICs0Mjg4LDExIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBwYWdlICpsb2NrX2F0LFxuIFx0XHRzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4tXHRYQV9TVEFURSh4YXMsIFx1MDAyNmZvbGlvLVx1MDAzZW1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0Ym9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuIFx0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbi1cdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgKm9sZF9tZW1jZztcbi1cdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gTlVMTDtcbi1cdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqbmV3X2ZvbGlvLCAqbmV4dDtcbi1cdGludCBucl9zaG1lbV9kcm9wcGVkID0gMDtcbi1cdGVudW0gdHR1X2ZsYWdzIHR0dV9mbGFncyA9IDA7XG4tXHRwZ29mZl90IGVuZCA9IDA7XG4gXHRpbnQgcmV0O1xuIFxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbyksIGZvbGlvKTtcbkBAIC00MTIwLDE0MSArNDMwMCwyOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcbiBcdGlmIChmb2xpbyAhPSBwYWdlX2ZvbGlvKHNwbGl0X2F0KSB8fCBmb2xpbyAhPSBwYWdlX2ZvbGlvKGxvY2tfYXQpKSB7XG4gXHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdGdvdG8gb3V0X25vX21lbWNnO1xuK1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcbiBcdGlmIChuZXdfb3JkZXIgXHUwMDNlPSBvbGRfb3JkZXIpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcbiBcdGlmIChyZXQpIHtcbiBcdFx0Vk1fV0FSTl9PTkNFKHJldCA9PSAtRUlOVkFMLCBcIlRyaWVkIHRvIHNwbGl0IGFuIHVuc3BsaXR0YWJsZSBmb2xpb1wiKTtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogc3dpdGNoIHRvIGZvbGlvJ3MgbWVtY2cgYXMgeGFycmF5IG5vZGUgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGFuZFxuLVx0ICogbmVlZHMgdG8gY2hhcmdlIHRvIGl0LlxuLVx0ICovXG4tXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xuLVx0b2xkX21lbWNnID0gc2V0X2FjdGl2ZV9tZW1jZyhtZW1jZyk7XG4tXG4tXHRpZiAoaXNfYW5vbikge1xuLVx0XHQvKlxuLVx0XHQgKiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhvbGQgYW4gbW1hcF9sb2NrIHRoYXQgd291bGRcbi1cdFx0ICogcHJldmVudCB0aGUgYW5vbl92bWEgZGlzYXBwZWFyaW5nIHNvIHdlIGZpcnN0IHdlIHRha2UgYVxuLVx0XHQgKiByZWZlcmVuY2UgdG8gaXQgYW5kIHRoZW4gbG9jayB0aGUgYW5vbl92bWEgZm9yIHdyaXRlLiBUaGlzXG4tXHRcdCAqIGlzIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkIGV4Y2VwdCB0aGUgd3JpdGUgbG9ja1xuLVx0XHQgKiBpcyB0YWtlbiB0byBzZXJpYWxpc2UgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZVxuLVx0XHQgKiBvcGVyYXRpb25zLlxuLVx0XHQgKi9cbi1cdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuLVx0XHRpZiAoIWFub25fdm1hKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH0gZWxzZSB7XG4tXHRcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4tXHRcdGdmcF90IGdmcDtcbi1cbi1cdFx0bWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4tXHRcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuLVx0XHRpZiAobmV3X29yZGVyIFx1MDAzYyBtaW5fb3JkZXIpIHtcbi1cdFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjZcbi1cdFx0XHRcdFx0XHRcdEdGUF9SRUNMQUlNX01BU0spO1xuLVxuLVx0XHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuLVx0XHRcdHJldCA9IC1FQlVTWTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRtYXBwaW5nX3NldF91cGRhdGUoXHUwMDI2eGFzLCBtYXBwaW5nKTtcbi1cbi1cdFx0aWYgKHNwbGl0X3R5cGUgPT0gU1BMSVRfVFlQRV9VTklGT1JNKSB7XG4tXHRcdFx0eGFzX3NldF9vcmRlcihcdTAwMjZ4YXMsIGZvbGlvLVx1MDAzZWluZGV4LCBuZXdfb3JkZXIpO1xuLVx0XHRcdHhhc19zcGxpdF9hbGxvYyhcdTAwMjZ4YXMsIGZvbGlvLCBvbGRfb3JkZXIsIGdmcCk7XG4tXHRcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4tXHRcdFx0XHRyZXQgPSB4YXNfZXJyb3IoXHUwMDI2eGFzKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuLVxuLVx0XHRhbm9uX3ZtYSA9IE5VTEw7XG4tXHRcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIG1heSBuZWVkIHRvIHRyaW0gb2ZmIHBhZ2VzIGJleW9uZFxuLVx0XHQgKiBFT0Y6IGJ1dCBvbiAzMi1iaXQsIGlfc2l6ZV9yZWFkKCkgdGFrZXMgYW4gaXJxLXVuc2FmZVxuLVx0XHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4tXHRcdCAqIFNvIG5vdGUgZW5kIG5vdzogaV9zaXplIGl0c2VsZiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgbW9tZW50LFxuLVx0XHQgKiBidXQgZm9saW8gbG9jayBpcyBnb29kIGVub3VnaCB0byBzZXJpYWxpemUgdGhlIHRyaW1taW5nLlxuLVx0XHQgKi9cbi1cdFx0ZW5kID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKG1hcHBpbmctXHUwMDNlaG9zdCksIFBBR0VfU0laRSk7XG4tXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuLVx0XHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpIHdpbGxcbi1cdCAqIHNwbGl0IFBNRHNcbi1cdCAqL1xuLVx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSAtIDEpIHtcbi1cdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0dW5tYXBfZm9saW8oZm9saW8pO1xuLVxuLVx0LyogYmxvY2sgaW50ZXJydXB0IHJlZW50cnkgaW4geGFfbG9jayBhbmQgc3BpbmxvY2sgKi9cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRpZiAobWFwcGluZykge1xuLVx0XHQvKlxuLVx0XHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuLVx0XHQgKiBXZSBhc3N1bWUgYWxsIHRhaWwgYXJlIHByZXNlbnQgdG9vLCBpZiBmb2xpbyBpcyB0aGVyZS5cbi1cdFx0ICovXG4tXHRcdHhhc19sb2NrKFx1MDAyNnhhcyk7XG4tXHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuLVx0XHRpZiAoeGFzX2xvYWQoXHUwMDI2eGFzKSAhPSBmb2xpbykge1xuLVx0XHRcdHJldCA9IC1FQUdBSU47XG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHR9XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBcdTAwMjZ4YXMsIG1hcHBpbmcsXG4tXHRcdFx0XHRcdFx0dHJ1ZSwgbGlzdCwgc3BsaXRfdHlwZSwgZW5kLCBcdTAwMjZucl9zaG1lbV9kcm9wcGVkKTtcbi1mYWlsOlxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdHhhc191bmxvY2soXHUwMDI2eGFzKTtcbi1cbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cbi1cdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuLVx0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuLVxuLVx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGlzX2Fub24gXHUwMDI2XHUwMDI2ICFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpXG4tXHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuLVxuLVx0cmVtYXBfcGFnZShmb2xpbywgMSBcdTAwM2NcdTAwM2Mgb2xkX29yZGVyLCB0dHVfZmxhZ3MpO1xuLVxuLVx0Lypcbi1cdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4tXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUgdW50aWwgdGhlIGxvb3AgYmVsb3csIHNvXG4tXHQgKiBldmljdGlvbiBjYW5ub3QgZnJlZSB0aGUgaW5vZGUgeWV0OyBAbG9ja19hdCBpcyBub3QgZW5vdWdoLCBpdCBtYXlcbi1cdCAqIGJlIGEgdGFpbCBiZXlvbmQgRU9GIHRoYXQgdGhlIHNwbGl0IGFscmVhZHkgZHJvcHBlZCBmcm9tIHRoZSBwYWdlXG4tXHQgKiBjYWNoZS4gTm90aGluZyBwYXN0IHRoaXMgcG9pbnQgbWF5IHRvdWNoIHRoZSBpbm9kZSBvciB0aGUgbWFwcGluZy5cbi1cdCAqL1xuLVx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuLVx0XHRtYXBwaW5nID0gTlVMTDtcbi1cdH1cbitcdGlmIChpc19hbm9uKVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0ICAgICB0cnVlLCBsaXN0LCBzcGxpdF90eXBlKTtcbitcdGVsc2UgaWYgKGlzX3N3YXBjYWNoZSlcbitcdFx0cmV0ID0gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB0cnVlLFxuK1x0XHRcdFx0XHRcdCAgICAgZmFsc2UsIGxpc3QsIHNwbGl0X3R5cGUpO1xuK1x0ZWxzZVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCxcbitcdFx0XHRcdFx0XHRcdCAgbGlzdCwgc3BsaXRfdHlwZSk7XG4gXG4gXHQvKlxuIFx0ICogVW5sb2NrIGFsbCBhZnRlci1zcGxpdCBmb2xpb3MgZXhjZXB0IHRoZSBvbmUgY29udGFpbmluZ1xuQEAgLTQyNjUsMjkgKzQzMzMsMTkgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdGlmIChuZXdfZm9saW8gPT0gcGFnZV9mb2xpbyhsb2NrX2F0KSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0Zm9saW9fdW5sb2NrKG5ld19mb2xpbyk7XG4gXHRcdC8qXG4gXHRcdCAqIFN1YnBhZ2VzIHdob3NlIG1hcHBpbmcgaGFzIGJlZW4gemFwcGVkIG1heSBiZSBmcmVlZFxuIFx0XHQgKiBlYXJsaWVyLCBidXQgZnJlZWluZyB0aGVtIHJlcXVpcmVzIHRha2luZyB0aGVcbi1cdFx0ICogbHJ1X2xvY2ssIHNvIHdlIGRlZmVyIHB1dF9wYWdlKCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuK1x0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgZm9saW9fcHV0KCkgb24gdGFpbCBwYWdlcyB1bnRpbFxuIFx0XHQgKiBhZnRlciB0aGUgc3BsaXQgY29tcGxldGVzLlxuIFx0XHQgKi9cbi1cdFx0ZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZShuZXdfZm9saW8pO1xuK1x0XHRpZiAoaXNfc3dhcGNhY2hlKVxuK1x0XHRcdGZvbGlvX2ZyZWVfc3dhcChuZXdfZm9saW8pO1xuK1x0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbitcdFx0Zm9saW9fcHV0KG5ld19mb2xpbyk7XG4gXHR9XG4gXG4tb3V0X3VubG9jazpcbi1cdGlmIChhbm9uX3ZtYSkge1xuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUoYW5vbl92bWEpO1xuLVx0XHRwdXRfYW5vbl92bWEoYW5vbl92bWEpO1xuLVx0fVxuLVx0aWYgKG1hcHBpbmcpXG4tXHRcdGlfbW1hcF91bmxvY2tfcmVhZChtYXBwaW5nKTtcbiBvdXQ6XG4tXHQvKiByZXN0b3JlIHRvIGNhbGxlcidzIG9sZF9tZW1jZyAqL1xuLVx0c2V0X2FjdGl2ZV9tZW1jZyhvbGRfbWVtY2cpO1xuLVx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuLW91dF9ub19tZW1jZzpcbi1cdHhhc19kZXN0cm95KFx1MDAyNnhhcyk7XG4gXHRpZiAoaXNfcG1kX29yZGVyKG9sZF9vcmRlcikpXG4gXHRcdGNvdW50X3ZtX2V2ZW50KCFyZXQgPyBUSFBfU1BMSVRfUEFHRSA6IFRIUF9TUExJVF9QQUdFX0ZBSUxFRCk7XG4gXHRjb3VudF9tdGhwX3N0YXQob2xkX29yZGVyLCAhcmV0ID8gTVRIUF9TVEFUX1NQTElUIDogTVRIUF9TVEFUX1NQTElUX0ZBSUxFRCk7XG5AQCAtNDMxMSwyOSArNDM2OSwyMCBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiAgKiBpc29sYXRlZCBmcm9tIExSVSAoaWYgYXBwbGljYWJsZSlcbiAgKlxuICAqIFVwb24gcmV0dXJuLCB0aGUgZm9saW8gaXMgbm90IHJlbWFwcGVkLCBzcGxpdCBmb2xpb3MgYXJlIG5vdCBhZGRlZCB0byBMUlUsXG4tICogZnJlZV9mb2xpb19hbmRfc3dhcF9jYWNoZSgpIGlzIG5vdCBjYWxsZWQsIGFuZCBuZXcgZm9saW9zIHJlbWFpbiBsb2NrZWQuXG4rICogZm9saW9fZnJlZV9zd2FwKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbiAgKlxuICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUFHQUlOIGlmIHRoZSBmb2xpbyBjYW5ub3QgYmUgc3BsaXQgKGUuZy4sIGR1ZSB0b1xuICAqICAgICAgICAgaW5zdWZmaWNpZW50IHJlZmVyZW5jZSBjb3VudCBvciBleHRyYSBwaW5zKS5cbiAgKi9cbiBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiB7XG4tXHRpbnQgcmV0ID0gMDtcbi1cbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhmb2xpb19tYXBwZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4gXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSlcbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4tXG4tXHRsb2NhbF9pcnFfZGlzYWJsZSgpO1xuLVx0cmV0ID0gX19mb2xpb19mcmVlemVfYW5kX3NwbGl0X3VubWFwcGVkKGZvbGlvLCBuZXdfb3JkZXIsIFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIE5VTEwsXG4tXHRcdFx0XHRcdFx0TlVMTCwgZmFsc2UsIE5VTEwsIFNQTElUX1RZUEVfVU5JRk9STSxcbi1cdFx0XHRcdFx0XHQwLCBOVUxMKTtcbi1cdGxvY2FsX2lycV9lbmFibGUoKTtcbi1cdHJldHVybiByZXQ7XG4rXHRyZXR1cm4gX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplKGZvbGlvLCBuZXdfb3JkZXIsIFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIGZhbHNlLFxuK1x0XHRcdFx0XHQgICAgICBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNKTtcbiB9XG4gXG4gLypcbkBAIC00MzUyLDEwICs0NDAxLDkgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogICAgR1VQIHBpbnMsIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xpbyBub3QgZ2V0dGluZyBzcGxpdDsgaW5zdGVhZCwgdGhlIGNhbGxlclxuICAqICAgIHdpbGwgcmVjZWl2ZSBhbiAtRUFHQUlOLlxuICAqXG4tICogNCkgQG5ld19vcmRlciBcdTAwM2UgMSwgdXN1YWxseS4gU3BsaXR0aW5nIHRvIG9yZGVyLTEgYW5vbnltb3VzIGZvbGlvcyBpcyBub3Rcbi0gKiAgICBzdXBwb3J0ZWQgZm9yIG5vbi1maWxlLWJhY2tlZCBmb2xpb3MsIGJlY2F1c2UgZm9saW8tXHUwMDNlX2RlZmVycmVkX2xpc3QsIHdoaWNoXG4tICogICAgaXMgdXNlZCBieSBwYXJ0aWFsbHkgbWFwcGVkIGZvbGlvcywgaXMgc3RvcmVkIGluIHN1YnBhZ2UgMiwgYnV0IGFuIG9yZGVyLTFcbi0gKiAgICBmb2xpbyBvbmx5IGhhcyBzdWJwYWdlcyAwIGFuZCAxLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxuKyAqIDQpIEBuZXdfb3JkZXIgIT0gMSBmb3IgYW5vbiBvciBzd2FwY2FjaGUuIEFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvclxuKyAqICAgIF9kZWZlcnJlZF9saXN0LCB3aGljaCBvcmRlci0xIGZvbGlvcyBsYWNrLCBhbmQgYSBzd2FwY2FjaGUgZm9saW8gbWF5XG4rICogICAgYmVjb21lIGFub24gb25jZSBmYXVsdGVkIGluLiBGaWxlLWJhY2tlZCBvcmRlci0xIGZvbGlvcyBhcmUgc3VwcG9ydGVkLFxuICAqICAgIHNpbmNlIHRoZXkgZG8gbm90IHVzZSBfZGVmZXJyZWRfbGlzdC5cbiAgKlxuICAqIEFmdGVyIHNwbGl0dGluZywgdGhlIGNhbGxlcidzIGZvbGlvIHJlZmVyZW5jZSB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIEBwYWdlLFxuQEAgLTQzODQsNyArNDQzMiw3IEBAIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuICAqIHdpdGggdGhlIGZvbGlvLiBTcGxpdHRpbmcgdG8gb3JkZXIgMCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIGZvbGlvcy5cbiAgKi9cbiBpbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcbi1cdFx0XHRcdCAgICAgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuIFxuZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuY1xuaW5kZXggNWJlODI1OTExZTY0NS4uZjE0MDVlNWI4MTNlZSAxMDA2NDRcbi0tLSBhL21tL3N3YXBfc3RhdGUuY1xuKysrIGIvbW0vc3dhcF9zdGF0ZS5jXG5AQCAtMzg4LDggKzM4OCw5IEBAIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcbiBcdCAgICBmb2xpb19vcmRlcihvbGQpICE9IGZvbGlvX29yZGVyKG5ldykpIHtcbiBcdFx0Y2lfb2ZmID0gc3dwX2NsdXN0ZXJfb2Zmc2V0KG9sZC1cdTAwM2Vzd2FwKTtcbiBcdFx0Y2lfZW5kID0gY2lfb2ZmICsgZm9saW9fbnJfcGFnZXMob2xkKTtcbi1cdFx0d2hpbGUgKGNpX29mZisrIFx1MDAzYyBjaV9lbmQpXG4rXHRcdGRvIHtcbiBcdFx0XHRXQVJOX09OX09OQ0Uoc3dwX3RiX3RvX2ZvbGlvKF9fc3dhcF90YWJsZV9nZXQoY2ksIGNpX29mZikpICE9IG9sZCk7XG4rXHRcdH0gd2hpbGUgKCsrY2lfb2ZmIFx1MDAzYyBjaV9lbmQpO1xuIFx0fVxuIH1cbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE0OjIzLjg2MzIyNTc5M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcyMjg3MjExOTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2ggU2VyaWVzOiBGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoaXMgcGF0Y2ggc2VyaWVzIGlzIGNsZWFybHkgdG91Y2hpbmcgY3J1Y2lhbCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBgbW0vaHVnZV9tZW1vcnkuY2AgYW5kIGBtbS9zd2FwX3N0YXRlLmNgIGZpbGVzLiBJdCdzIHJlZmFjdG9yaW5nIGZvbGlvIHNwbGl0dGluZyBsb2dpYywgcGFydGljdWxhcmx5IGZvciBhbm9ueW1vdXMgYW5kIHN3YXBjYWNoZSBmb2xpb3MuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlc2UgbmV3IGZ1bmN0aW9ucywgYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAsIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAgYW5kIGNoYW5nZXMgdG8gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIHN0cm9uZ2x5IHN1Z2dlc3QgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbXBhY3RpbmcgVEhQIGFuZCBmb2xpbyBzcGxpdHRpbmcuIFRoaXMgaXNuJ3QganVzdCBhIHRyaXZpYWwgcmVmYWN0b3IuIEdpdmVuIHRoYXQgdGhpcyBhcmVhIGlzIGFscmVhZHkgZmFpcmx5IGNvbXBsZXggYW5kIHByb25lIHRvIHN1YnRsZSByYWNlIGNvbmRpdGlvbnMsIGl0J3MgYSBwcmltZSBjYW5kaWRhdGUgZm9yIGZ1enppbmcuXG5cbk15IGltbWVkaWF0ZSBuZXh0IHN0ZXAgaXMgYWx3YXlzIHRvIGlkZW50aWZ5IHRoZSBmb2N1cyBzeW1ib2xzLiBMZXQncyBzZWUuLi4gdGhlIHBhdGNoIGludHJvZHVjZXM6XG5cbiogICBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYCAoc3RhdGljKSAtIExpa2VseSBhbiBpbnRlcm5hbCBoZWxwZXJcbiogICBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGVgIChzdGF0aWMpIC0gU2ltaWxhciB0byBhYm92ZVxuKiAgIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgKGV4cG9ydGVkL2dsb2JhbCkgLSBBIGxpa2VseSBzdGFydGluZyBwb2ludFxuKiAgIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCAoZXhwb3J0ZWQvZ2xvYmFsKSAtIEFub3RoZXIgcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuKiAgIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCAoZ2xvYmFsKSAtIEltcG9ydGFudCBmb3IgdHJpZ2dlcmluZyB0aGUgbmV3IGNvZGUgcGF0aHMuXG5cbldhaXQgYSBzZWNvbmQsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgaXMgKm5vdCogc3RhdGljLCBzbyB0aGF0J3MgZGVmaW5pdGVseSBhIHN0YXJ0aW5nIHBvaW50LiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgaXMgZ2xvYmFsLCB3aGljaCBpcyBnb29kLiBOb3csIGlzIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAgYSBtYWNybyBvciBhIGZ1bmN0aW9uPyBMZXQncyBxdWlja2x5IGRvdWJsZS1jaGVjayBgbW0vaHVnZV9tZW1vcnkuY2AgdG8gYmUgc3VyZS4gVGhhdCdzIGEgY2xhc3NpYyBnb3RjaGEuIEFsd2F5cyB2ZXJpZnkgdGhlc2UgYXNzdW1wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyODgxLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYzLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6MzEuMDkxOTQ5OTMxWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU0ODg4NjA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vaHVnZV9tZW1vcnkuYz00Mzc3PWludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00NDMzLSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6NDQzNDppbnQgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCxcXG5tbS9odWdlX21lbW9yeS5jLTQ0MzUtXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQ0NTEtICogSXQgaGFzIHRoZSBzYW1lIHByZXJlcXVpc2l0ZXMgYW5kIHJldHVybnMgYXNcXG5tbS9odWdlX21lbW9yeS5jOjQ0NTI6ICogc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoKS5cXG5tbS9odWdlX21lbW9yeS5jLTQ0NTMtICpcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDUwMT1pbnQgc3BsaXRfZm9saW9fdG9fbGlzdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDUwMi17XFxubW0vaHVnZV9tZW1vcnkuYzo0NTAzOlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIGxpc3QsIDApO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNDUwNC19XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTQ3ODc9c3RhdGljIGludCBzcGxpdF9odWdlX3BhZ2VzX3BpZChpbnQgcGlkLCB1bnNpZ25lZCBsb25nIHZhZGRyX3N0YXJ0LFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00ODU2LVxcdFxcdC8qXFxubW0vaHVnZV9tZW1vcnkuYzo0ODU3OlxcdFxcdCAqIEZvciBmb2xpb3Mgd2l0aCBwcml2YXRlLCBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcigpXFxubW0vaHVnZV9tZW1vcnkuYy00ODU4LVxcdFxcdCAqIHdpbGwgdHJ5IHRvIGRyb3AgaXQgYmVmb3JlIHNwbGl0IGFuZCB0aGVuIGNoZWNrIGlmIHRoZSBmb2xpb1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDozMS4xNDY4NDQwN1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5OTkxNTIwNjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSdtIGRlZXBseSBmYW1pbGlhciB3aXRoIExpbnV4IGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudDpcblxuKipIdW50aW5nIERvd24gdGhlIEh1Z2UgUGFnZSBTcGxpdCBMb2dpYyoqXG5cbkFscmlnaHQsIHRoZSBwcm9ibGVtIEknbSB3b3JraW5nIG9uIHN1Z2dlc3RzIHRoZXJlJ3MgYSBicmVha2Rvd24gaW4gaG93IGh1Z2UgcGFnZXMgYXJlIGhhbmRsZWQsIHNwZWNpZmljYWxseSB3aGVuIHRoZXkgbmVlZCB0byBiZSBzcGxpdC4gTXkgaW5zdGluY3QgaXMgdG8gdHJhY2UgdGhlIGV4ZWN1dGlvbiBwYXRoIHRoYXQgaGFuZGxlcyB0aGlzIHNwbGl0IG9wZXJhdGlvbi4gVGhlIG5hbWluZyBjb252ZW50aW9uIHN0cm9uZ2x5IHN1Z2dlc3RzIHRoZSBmdW5jdGlvbiBJIG5lZWQgaXMgaW4gdGhlIGBpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaGAgaGVhZGVyIGZpbGUuIFRoZSBzcGVjaWZpYyBmdW5jdGlvbiBJIG5lZWQgdG8gbG9vayBhdCB3aWxsIGJlIGBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAuIFRoaXMgZnVuY3Rpb24gbmFtZSwgYHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCwgYWxtb3N0IGNlcnRhaW5seSBtZWFucyBpdCBzcGxpdHMgYSBodWdlIHBhZ2UsIGFkZHMgdGhlIHNtYWxsZXIgcGFnZXMgdG8gYSBmcmVlbGlzdCwgYW5kIHRoZW4gbGlrZWx5IGFkanVzdHMgdGhlIGFsbG9jYXRpb24gb3JkZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBkZXRhaWxzIG9mIGhvdyBpdCdzIHNwbGl0dGluZywgd2hhdCBmcmVlbGlzdCBpdCdzIHVzaW5nLCBhbmQgaG93IGl0J3MgbWFuYWdpbmcgdGhlIGFsbG9jYXRpb24gb3JkZXIgYWZ0ZXIgdGhlIHNwbGl0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgbG9naWMgaGVyZSBpcyB3aGVyZSB0aGUgcHJvYmxlbSBpcyBvcmlnaW5hdGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQxMzAsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDozNS4xNDU5OTg3ODhaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODg1ODE5MjgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9Mzk4PWVudW0gc3BsaXRfdHlwZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MDItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDAzOmludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQxMD1pbnQgZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlciwgc3RydWN0IHBhZ2UgKnBhZ2UsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MTItXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDEzOnN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNC1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxNS17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDE2OlxcdHJldHVybiBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHBhZ2UsIGxpc3QsIG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDE3LX1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MTg9c3RhdGljIGlubGluZSBpbnQgc3BsaXRfaHVnZV9wYWdlX3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQxOS17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDIwOlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBOVUxMLCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyMS19XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MjM9c3RhdGljIGlubGluZSBpbnQgc3BsaXRfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQyNC17XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NDI1OlxcdHJldHVybiBzcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcihwYWdlLCBOVUxMLCAwKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00MjYtfVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NjQ1PXN0YXRpYyBpbmxpbmUgaW50XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NjQ2OnNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTY0Ny1cXHRcXHR1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9ODI2PXN0YXRpYyBpbmxpbmUgaW50IHNwbGl0X2ZvbGlvX3RvX29yZGVyKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIpXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtODI3LXtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo4Mjg6XFx0cmV0dXJuIHNwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgTlVMTCwgbmV3X29yZGVyKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC04MjktfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDozNS4yMzQ1ODU3NzZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODU2ODA4MzMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyB0ZWNobmljYWwgc25pcHBldCwgcHV0IGluIHRoZSBmaXJzdCBwZXJzb24sIGFzIHJlcXVlc3RlZDpcblxuKipEZWNvbnN0cnVjdGluZyBUaGlzIFBhdGNoJ3MgRm9jdXMqKlxuXG5BbHJpZ2h0LCBzbyB0aGlzIHBhdGNoIGlzIGNsZWFybHkgdG91Y2hpbmcgc29tZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBzd2FwcGluZyBsb2dpYy4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQncyBob25pbmcgaW4gb24gYSBmZXcgc3BlY2lmaWMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaHVnZSBwYWdlIHNwbGl0dGluZyBhbmQgZm9saW8gb3BlcmF0aW9ucy4gU3BlY2lmaWNhbGx5LCBJIHNlZSBpdCdzIHBva2luZyBhcm91bmQgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBhbmQgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLiBUaG9zZSBhbGwgc2NyZWFtIFwiaHVnZSBwYWdlIG1hbmFnZW1lbnRcIiB0byBtZS5cblxuQnV0IHRoZXJlJ3Mgc29tZXRoaW5nIGVsc2UuLi4gaXQgYWxzbyBtZW50aW9ucyBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gIHdpdGhpbiBgbW0vc3dhcF9zdGF0ZS5jYC4gVGhhdCBmdW5jdGlvbidzIGludm9sdmVkIGluIHN3YXBwaW5nLCBidXQgaXQncyAqc3RhdGljKiB3aXRoaW4gdGhhdCBmaWxlLCB3aGljaCBtYWtlcyBtZSBjdXJpb3VzLiBJJ20gZ29pbmcgdG8gcXVpY2tseSBjaGVjayB0aGF0IGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbiwgYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3Mgc3RhdGljIGlzIHBvdGVudGlhbGx5IHNpZ25pZmljYW50LiBJdCBjb3VsZCBtZWFuIHRoaXMgcGF0Y2ggaXMgbW9yZSB0YXJnZXRlZCB0aGFuIGl0IGluaXRpYWxseSBzZWVtcy4gSSB3YW50IHRvIHVuZGVyc3RhbmQgKndoeSogaXQncyB0b3VjaGluZyBhIHN0YXRpYyBmdW5jdGlvbiB3aXRoaW4gYSBzd2FwcGluZyBjb250ZXh0IGFsb25nc2lkZSBodWdlIHBhZ2Ugc3BsaXR0aW5nLCBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyB2ZXJ5IGludGVyZXN0aW5nIGhhcHBlbmluZy4gSXMgdGhlcmUgYSBjb25uZWN0aW9uIEknbSBtaXNzaW5nPyBUaGF0IGZ1bmN0aW9uJ3MgZGVzaWduIGNvdWxkIGJlIGltcG9ydGFudCBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTEzNSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE0OjM5LjA5MTM5NzAxOFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDc1ODE4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9zd2FwX3N0YXRlLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc3dhcF9zdGF0ZS5jPTMzNT12b2lkIHN3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmMtMzQ3LS8qKlxcbm1tL3N3YXBfc3RhdGUuYzozNDg6ICogX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8gLSBSZXBsYWNlIGEgZm9saW8gaW4gdGhlIHN3YXAgY2FjaGUuXFxubW0vc3dhcF9zdGF0ZS5jLTM0OS0gKiBAY2k6IFRoZSBsb2NrZWQgc3dhcCBjbHVzdGVyLlxcbi0tXFxubW0vc3dhcF9zdGF0ZS5jLTM2MC0gKi9cXG5tbS9zd2FwX3N0YXRlLmM6MzYxOnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwX3N0YXRlLmMtMzYyLVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6MzkuMTQ2MTU5NDg2WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDEwNjUyNDc5NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDpcblxuKipEaWdnaW5nIGludG8gU3dhcCBDYWNoZSBSZXBsYWNlbWVudCoqXG5cbk9rYXksIHNvIEknbSBkZWFsaW5nIHdpdGggYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBhbmQgSSdtIHByZXR0eSBzdXJlIGl0J3MgYSBnbG9iYWwgZnVuY3Rpb24sIGJ1dCBJIGRvbid0IHJlY2FsbCBzZWVpbmcgaXQgZXhwb3J0ZWQgYW55d2hlcmUuIFRoYXQgbWFrZXMgbWUgdGhpbmsgaXQncyBsaWtlbHkgaW50ZXJuYWwgdG8gdGhlIHN3YXAgY2FjaGUgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIGZhaXIgZW5vdWdoLiBUbyBjb25maXJtIHRoaXMgYW5kIHRvIHVuZGVyc3RhbmQgaXRzIHVzZSwgSSBzaG91bGQgcHJvYmFibHkgdGFrZSBhIGxvb2sgYXQgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgc3dhcCBzdGF0ZSBtYW5hZ2VtZW50LiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBjaGVjayBgbW0vc3dhcF9zdGF0ZS5jYCBmb3IgdGhlIGRlZmluaXRpb24gYW5kIGFueSByZWxhdGVkIGNhbGxzIHRvIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRoYXQncyB3aGVyZSBJJ2xsIGdldCB0aGUgcmVhbCBzdG9yeS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU3MDEsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDo0My4yNTI2ODk0ODJaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgxOTgyNTI4LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL2xpbnV4L3N3YXAuaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6NDMuMzM0NjgxNzFaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODE0NDE5NzM4MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgbW0vc3dhcC5oYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIHN3YXAgaW1wbGVtZW50YXRpb24uIE15IGluaXRpYWwgZm9jdXMgaXMgYWx3YXlzIG9uIHRoZSBoZWFkZXIgZmlsZXPigJRgbW0vc3dhcC5oYCBpbiB0aGlzIGNhc2UuIEkgd2FudCB0byBxdWlja2x5IHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb3JlIGRlZmluZXMgaW52b2x2ZWQuIEknbSBsb29raW5nIGZvciB0aGUgZm91bmRhdGlvbmFsIGJ1aWxkaW5nIGJsb2NrczogdGhlIGBzd2FwX2VudHJ5X3RgIHBlcmhhcHMsIGFueSByZWxldmFudCBwYWdlIGZsYWdzLCBhbmQgcG90ZW50aWFsbHkgdGhlIGludGVyZmFjZXMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIHN3YXAgc3BhY2UgaXRzZWxmLiBBcmUgdGhlcmUgYW55IG5ldyBBUElzIGludHJvZHVjZWQgc2luY2UgdGhlIGxhc3QgdGltZSBJIHJlYWxseSBkaXNzZWN0ZWQgdGhpcyBjb2RlPyBBbnkgcmVjZW50IGNoYW5nZXMgaW4gaG93IHN3YXAgZW50cmllcyBhcmUgbWFuYWdlZCwgb3IgaG93IHRoZSBiYWNraW5nIHN0b3JlIGlzIGRlZmluZWQ/IEkgbmVlZCBhIGNsZWFyIG1lbnRhbCBtb2RlbCBvZiB0aGUga2V5IGFic3RyYWN0aW9ucyBiZWZvcmUgSSBkZWx2ZSBkZWVwZXIgaW50byB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gTGV0J3Mgc2VlIHdoYXQgYG1tL3N3YXAuaGAgcmV2ZWFscy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU5NDgsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDo1MS40Nzg4ODM2MzJaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU3MDU1MTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL3N3YXAuaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwLmg9MzQyPXZvaWQgX19zd2FwX2NhY2hlX2RlbF9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXAuaC0zNDMtXFx0XFx0XFx0ICAgIHN0cnVjdCBmb2xpbyAqZm9saW8sIHN3cF9lbnRyeV90IGVudHJ5LCB2b2lkICpzaGFkb3cpO1xcbm1tL3N3YXAuaDozNDQ6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXAuaC0zNDUtXFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KTtcXG4tLVxcbm1tL3N3YXAuaD00NzY9c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG4tLVxcbm1tL3N3YXAuaC00ODAtXFxubW0vc3dhcC5oOjQ4MTpzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtNDgyLVxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6NTEuNTM1OTQzMzAxWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3MTYyODM5NDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBTd2FwIENhY2hlIFJlcGxhY2VtZW50IEZvbGlvIEZ1bmN0aW9uKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCBmdW5jdGlvbi4gSSBzZWUgaXQncyBkZWZpbmVkIGluIGBtbS9zd2FwLmhgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgb24gdGhlIGNvcmUgbG9naWMsIHNvIEknbSBnb2luZyB0byB6ZXJvIGluIG9uIHRoZXNlIGZ1bmN0aW9uczogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGFuZCBuYXR1cmFsbHksIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgcGllY2VzIGZpdCB0b2dldGhlci5cblxuTXkgbmV4dCBzdGVwIGlzIHRvIHNlZSBpZiBhbnkgc3BlY2lmaWMga2VybmVsIGNvbmZpZ3VyYXRpb25zIGFyZSBwcmVyZXF1aXNpdGVzLiBJJ20gbm90aW5nIHRoYXQgdGhlIGNvZGUgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHdoaWNoLCBmcm9tIG1lbW9yeSwgaXMgY29tcGlsZWQgd2hlbiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlbmFibGVkLiBJIHNob3VsZCBkb3VibGUgY2hlY2sgdGhpcyBieSByZWZlcmVuY2luZyBgbW0vTWFrZWZpbGVgIHRvIGNvbmZpcm0gdGhlIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgZW5zdXJlIEkgZnVsbHkgdW5kZXJzdGFuZCB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uIEdvdHRhIG1ha2Ugc3VyZSBJJ20gbm90IG1pc3NpbmcgYW55dGhpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NDAwLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTM2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE0OjU2LjI1MjIzMDkzOVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzYyOTA5NzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaHVnZV9tZW1vcnkub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNDo1Ni4zMjg1MjYxMzdaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzYzNzg5NjE1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIEtlcm5lbCBDb25maWd1cmF0aW9uIERlcGVuZGVuY2llcyoqXG5cbkFscmlnaHQsIHNvIHRoZSBkaXNjdXNzaW9uIGhhcyBjbGVhcmx5IGVzdGFibGlzaGVkIHRoYXQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBub24tbmVnb3RpYWJsZSBoZXJlLiBUaGF0J3MgYSBnaXZlbi4gQnV0IG5vdywgSSBuZWVkIHRvIGRlbHZlIGEgYml0IGRlZXBlciBhbmQgbG9vayBhdCB0aGUgZGVwZW5kZW5jaWVzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LiBNeSBuZXh0IHRob3VnaHQgaXMgYXJvdW5kIGBtbS9zd2FwX3N0YXRlLmNgLiBJIGtub3cgaXQncyBjb21waWxlZCB3aGVuIGBDT05GSUdfU1dBUGAgaXMgZW5hYmxlZCwgYnV0IEkgbmVlZCB0byB1bmRlcnN0YW5kICp3aHkqIGFuZCB3aGF0IGl0cyBwb3RlbnRpYWwgcmVsZXZhbmNlIGlzIGluIHRoaXMgc3BlY2lmaWMgc2NlbmFyaW8uIEl0J3MgdGltZSB0byBkaWcgaW50byB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIGFuZCBzd2FwLCBhbmQgZW5zdXJlIG5vdGhpbmcgZ2V0cyBtaXNzZWQuIFRoaXMgZmVlbHMgbGlrZSBhIGNvcmUgcGllY2UgSSBuZWVkIHRvIGdldCBhIGZpcm0gZ3Jhc3Agb24sIHRvIGJlIHN1cmUgSSBhbSBub3QgbWlzc2luZyBhbnkgY3JpdGljYWwgcGllY2VzIGluIHRoZSBkZXNpZ24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2ODgyLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTQ6NTkuOTY2NDI2MDM2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3OTI2NTk5NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzd2FwX3N0YXRlLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vTWFrZWZpbGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9NzY9ZW5kaWZcXG5tbS9NYWtlZmlsZS03Ny1cXG5tbS9NYWtlZmlsZTo3ODpvYmotJChDT05GSUdfU1dBUClcXHQrPSBwYWdlX2lvLm8gc3dhcF9zdGF0ZS5vIHN3YXBmaWxlLm9cXG5tbS9NYWtlZmlsZS03OS1vYmotJChDT05GSUdfWlNXQVApXFx0Kz0genN3YXAub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNTowMC4wNDU2OTYxNjNaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTQwODc4NDcxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHVuZGVyc3RhbmRpbmcsIHRoaW5raW5nIHRocm91Z2ggdGhpcyBsaWtlIEkgd291bGQ6XG5cbioqRXhhbWluaW5nIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzIGZvciBGb2xpby1SZWxhdGVkIENvZGUqKlxuXG5BbHJpZ2h0LCBzbyBJIHNlZSB3ZSdyZSBkZWFsaW5nIHdpdGggYFNXQVBgIGFnYWluLCBqdXN0IGxpa2UgSSBzdXNwZWN0ZWQuIEdvdHRhIG1ha2Ugc3VyZSB0aGF0J3MgYWNjb3VudGVkIGZvci4gSSdtIGdvaW5nIHRvIHF1aWNrbHkgc2NhbiBmb3Igb3RoZXIgcG90ZW50aWFsIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzIHRoYXQgdGhpcyBwYXRjaCBtaWdodCB0b3VjaC4gVGhlIGNvZGUgcmVmZXJlbmNlcyBgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pYCBhbmQgYGZvbGlvX3Rlc3RfYW5vbihmb2xpbylgLiBUaGF0IG5hcnJvd3MgaXQgZG93biBwcmV0dHkgY2xlYXJseSwgaXQgbG9va3MgbGlrZSBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYENPTkZJR19TV0FQYCBhcmUgdGhlIHByaW1hcnkgY29uZmlndXJhdGlvbnMgaW4gcGxheSBoZXJlLiBJJ20gY29uZmlkZW50IHRoYXQgdGhlc2UgYXJlIHRoZSB0d28gbWFpbiBkcml2ZXJzIG9mIHRoZSBjaGFuZ2VzLiBOb3csIGxldCdzIGp1c3QgZG8gYSBxdWljayBjcm9zcy1yZWZlcmVuY2UgdG8gYmUgY2VydGFpbjogSSdtIGdvaW5nIHRvIGxvb2sgZm9yIHBsYWNlcyB3aGVyZSBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIGlzIGNhbGxlZC4gVGhhdCBzaG91bGQgZWl0aGVyIGNvbmZpcm0gdGhlIGRlcGVuZGVuY3kgb3IgbWF5YmUgc2hvdyB1cyBpZiB0aGVyZSBpcyBhbnl0aGluZyBlbHNlIHdlIG5lZWQgdG8gaW5jbHVkZS4gSSBqdXN0IHdhbnQgdG8gYmUgdGhvcm91Z2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3MjExLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MDUuNDU0NDgzOTcyWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDc4ODc2OTExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD00MDM9aW50IF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA0LVxcdFxcdHVuc2lnbmVkIGludCBuZXdfb3JkZXIpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwNTppbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcik7XFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDA2LXVuc2lnbmVkIGludCBtaW5fb3JkZXJfZm9yX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz00Mjg3PXN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00MzU1LS8qKlxcbm1tL2h1Z2VfbWVtb3J5LmM6NDM1NjogKiBmb2xpb19zcGxpdF91bm1hcHBlZCgpIC0gc3BsaXQgYSBsYXJnZSBhbm9uIGZvbGlvIHRoYXQgaXMgYWxyZWFkeSB1bm1hcHBlZFxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM1Ny0gKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTQzNzYtICovXFxubW0vaHVnZV9tZW1vcnkuYzo0Mzc3OmludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDM3OC17XFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jPTkxMj1zdGF0aWMgaW50IG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBtaWdyYXRlX3ZtYSAqbWlncmF0ZSxcXG4tLVxcbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTI2LVxcdHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3MobWlncmF0ZS1cXHUwMDNldm1hLCBhZGRyLCB0cnVlKTtcXG5tbS9taWdyYXRlX2RldmljZS5jOjkyNzpcXHRyZXQgPSBmb2xpb19zcGxpdF91bm1hcHBlZChmb2xpbywgMCk7XFxubW0vbWlncmF0ZV9kZXZpY2UuYy05MjgtXFx0aWYgKHJldClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MDcuOTMzMzY2NzQzWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY2ODQ1MDE4NjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjb2RlIHNuaXBwZXQsIGRpc3RpbGxlZCBpbnRvIGEgZmlyc3QtcGVyc29uIHBlcnNwZWN0aXZlLCBhcyBpdCByZWxhdGVzIHRvIG15IGV4cGVydGlzZTpcblxuKipNeSBVbmRlcnN0YW5kaW5nIG9mIEZvbGlvIFNwbGl0dGluZyBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJIHNlZSBhIGNsZWFyIHJlbGF0aW9uc2hpcCBlbWVyZ2luZyBiZXR3ZWVuIHRoZXNlIGZvbGlvIHNwbGl0dGluZyBmdW5jdGlvbnMuIEl0IGxvb2tzIGxpa2UgYGZvbGlvX3NwbGl0X3VubWFwcGVkYCBpcyBhIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIGEgZm9saW8gc3BsaXQsIGludm9rZWQgd2l0aGluIHRoZSBicm9hZGVyIGNvbnRleHQgb2YgZGV2aWNlIG1pZ3JhdGlvbiAoYG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvYCkgaW4gdGhlIGBtbS9taWdyYXRlX2RldmljZS5jYCBmaWxlLiBUaGlzIHRlbGxzIG1lIHRoaXMgc3BsaXQgaXMgZm9yIHVubWFwcGVkIGZvbGlvcyBpbnZvbHZlZCBpbiBkZXZpY2UgbWlncmF0aW9uLCBsaWtlbHkgZW5zdXJpbmcgZGF0YSBpbnRlZ3JpdHkgYW5kIGNvcnJlY3QgaGFuZGxpbmcgb2YgcGFnZSBvd25lcnNoaXAgZHVyaW5nIHRoZSBwcm9jZXNzLCBnaXZlbiB0aGUgbWlncmF0aW9uIGNvbnRleHQuXG5cblRoZW4sIHRoZXJlJ3MgYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLiBUaGlzIG9uZSBpcyBpbnRlcmVzdGluZyBiZWNhdXNlIGl0J3MgY2FsbGVkIGZyb20gYSB3aWRlIGFycmF5IG9mIHBsYWNlcy4gVGhhdCBtYWtlcyBtZSB0aGluayBpdCdzIHRoZSBjb3JlLCBsb3ctbGV2ZWwgZnVuY3Rpb24gZm9yIGFjdHVhbGx5IGRvaW5nIHRoZSBzcGxpdHRpbmcsIHBvdGVudGlhbGx5IGhhbmRsaW5nIHRoZSBwaHlzaWNhbCBwYWdlIG1hbmlwdWxhdGlvbnMgYW5kIGxpc3QgbWFuYWdlbWVudCBpbnZvbHZlZCBpbiB0cmFuc2Zvcm1pbmcgYSBodWdlIHBhZ2UgaW50byBhIHNldCBvZiBzbWFsbGVyLCBvcmRlcmVkIGZvbGlvcy4gVGhlIFwidG9fbGlzdF90b19vcmRlclwiIHBhcnQgZGVmaW5pdGVseSBoaW50cyBhdCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBzbWFsbGVyIGZvbGlvcyBpbiB0aGUgY29ycmVjdCBvcmRlciBmb3IgbGF0ZXIgcmVhc3NlbWJseSBvciBvdGhlciBvcGVyYXRpb25zLCBzbyBpdCdzIGEgY3JpdGljYWwgcGllY2Ugb2YgdGhlIHB1enpsZS5cblxuRmluYWxseSwgYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGFwcGVhcnMgdG8gYmUgYSBwcmVyZXF1aXNpdGUgY2hlY2suIEl0J3MgY2FsbGVkIGJlZm9yZSBhbnkgYWN0dWFsIHNwbGl0dGluZyBpcyBkb25lLCBmcm9tIGJvdGggdGhlIGdlbmVyYWwgc3BsaXR0aW5nIGZ1bmN0aW9uIGBfX2ZvbGlvX3NwbGl0YCBhbmQgZnJvbSB0aGUgcHJvY2Vzcy1zcGVjaWZpYyBodWdlIHBhZ2Ugc3BsaXR0aW5nIGZ1bmN0aW9uIGBzcGxpdF9odWdlX3BhZ2VzX3BpZGAuIFRoYXQgcG9pbnRzIHRvIHRoaXMgY2hlY2sgYmVpbmcgYWJvdXQgZGV0ZXJtaW5pbmcgaWYgYSBmb2xpbyAqY2FuKiBiZSBzcGxpdC4gVGhpcyBjb3VsZCBiZSBjaGVja2luZyB0aGluZ3MgbGlrZSB3aGV0aGVyIGl0J3MgbG9ja2VkLCB3aGV0aGVyIGl0J3MgYSB2YWxpZCBjYW5kaWRhdGUgZm9yIHNwbGl0dGluZyBnaXZlbiBpdHMgY3VycmVudCBzdGF0ZSwgYW5kIHBvdGVudGlhbGx5IG90aGVyIGNvbnN0cmFpbnRzLiBUaGUgZmFjdCB0aGF0IGl0J3MgY2FsbGVkIGZyb20gdGhvc2UgdHdvIGZ1bmN0aW9ucyBtZWFucyBpdCBpcyB1bml2ZXJzYWxseSBhcHBsaWNhYmxlIGFuZCBsaWtlbHkgZW5mb3JjZXMgbmVjZXNzYXJ5IGludmFyaWFudHMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYnJlYWsgYSBodWdlIHBhZ2UgZG93bi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc5NzIsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNToxNC42MTc4NzQ4OTZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzNTUwNTEwMjUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZm9saW9fY2hlY2tfc3BsaXR0YWJsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NDA3PWludCBzcGxpdF9mb2xpb190b19saXN0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQwODppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQwOS1cXHRcXHRcXHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSk7XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTM4MDc9c3RhdGljIGludCBfX3NwbGl0X2Zyb3plbl9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zODcyLS8qKlxcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg3MzogKiBmb2xpb19jaGVja19zcGxpdHRhYmxlKCkgLSBjaGVjayBpZiBhIGZvbGlvIGNhbiBiZSBzcGxpdCB0byBhIGdpdmVuIG9yZGVyXFxubW0vaHVnZV9tZW1vcnkuYy0zODc0LSAqIEBmb2xpbzogZm9saW8gdG8gYmUgc3BsaXRcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg3OS0gKlxcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg4MDogKiBmb2xpb19jaGVja19zcGxpdHRhYmxlKCkgY2hlY2tzIGlmIEBmb2xpbyBjYW4gYmUgc3BsaXQgdG8gQG5ld19vcmRlciB1c2luZ1xcbm1tL2h1Z2VfbWVtb3J5LmMtMzg4MS0gKiBAc3BsaXRfdHlwZSBtZXRob2QuIFRoZSB0cnVuY2F0ZWQgZm9saW8gY2hlY2sgbXVzdCBjb21lIGZpcnN0Llxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zODg3LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6Mzg4ODppbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMzg4OS1cXHRcXHRcXHQgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9NDI4Nz1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtNDMxMC1cXG5tbS9odWdlX21lbW9yeS5jOjQzMTE6XFx0cmV0ID0gZm9saW9fY2hlY2tfc3BsaXR0YWJsZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF90eXBlKTtcXG5tbS9odWdlX21lbW9yeS5jLTQzMTItXFx0aWYgKHJldCkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNToxNi45NzI5MzE3NjFaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY2Nzg1ODMwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgY29kZSBpbnRlcmFjdGlvbnMuXG5cbioqVGhpbmtpbmcgVGhyb3VnaCBGb2xpbyBTcGxpdHRpbmcqKlxuXG5SaWdodCwgc28gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgIGdldHMgaW52b2tlZCBieSBgX19mb2xpb19zcGxpdGAsIHdoaWNoIG1ha2VzIHBlcmZlY3Qgc2Vuc2UuIE5vdyBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUgY3JpdGljYWwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhpcyBzcGxpdHRpbmcgcHJvY2Vzcy4gSSdtIGZvY3VzaW5nIG9uIHRoZXNlIGtleSBzeW1ib2xzOiBgX19zcGxpdF9odWdlX3BhZ2VfdG9fbGlzdF90b19vcmRlcmAsIGBmb2xpb19zcGxpdF91bm1hcHBlZGAsIGBmb2xpb19jaGVja19zcGxpdHRhYmxlYCwgYW5kIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AuIFRob3NlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMuXG5cbkhhbmcgb24gYSBzZWNvbmTigKYgSSdtIGp1c3QgcmVjYWxsaW5nIHRoYXQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCdzIGNhbGwgZ3JhcGggbWlnaHQgYmUgbW9yZSBsaW1pdGVkIHRoYW4gSSBpbml0aWFsbHkgdGhvdWdodC4gSXQgbG9va3MgbGlrZSBpdCdzIHByaW1hcmlseSBjYWxsZWQgZnJvbSBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplYC4gSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY2FsbCBzaXRlcywganVzdCB0byBiZSBzdXJlLiBJdCBwYXlzIHRvIGJlIHRob3JvdWdoIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggbWVtb3J5IG1hbmFnZW1lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4OTcyLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE1OjIxLjY0MDgwNjRaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxODQyNjQ0ODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2h1Z2VfbWVtb3J5LmM9Mzk1Nz1zdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy00MDYxLVxcdFxcdGlmIChjaSlcXG5tbS9odWdlX21lbW9yeS5jOjQwNjI6XFx0XFx0XFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xcbm1tL2h1Z2VfbWVtb3J5LmMtNDA2My1cXHR9XFxuLS1cXG5tbS9taWdyYXRlLmM9NTgzPXN0YXRpYyBpbnQgX19mb2xpb19taWdyYXRlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5tbS9taWdyYXRlLmMtNjU2LVxcdGlmIChmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXFxubW0vbWlncmF0ZS5jOjY1NzpcXHRcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgZm9saW8sIG5ld2ZvbGlvKTtcXG5tbS9taWdyYXRlLmMtNjU4LVxcdGVsc2VcXG4tLVxcbm1tL3NobWVtLmM9MjA4OD1zdGF0aWMgaW50IHNobWVtX3JlcGxhY2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBnZnBfdCBnZnAsXFxuLS1cXG5tbS9zaG1lbS5jLTIxMjUtXFx0Y2kgPSBzd2FwX2NsdXN0ZXJfZ2V0X2FuZF9sb2NrX2lycShvbGQpO1xcbm1tL3NobWVtLmM6MjEyNjpcXHRfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhjaSwgb2xkLCBuZXcpO1xcbm1tL3NobWVtLmMtMjEyNy1cXHRtZW1fY2dyb3VwX3JlcGxhY2VfZm9saW8ob2xkLCBuZXcpO1xcbi0tXFxubW0vc3dhcC5oPTM0Mj12b2lkIF9fc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzQzLVxcdFxcdFxcdCAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzd3BfZW50cnlfdCBlbnRyeSwgdm9pZCAqc2hhZG93KTtcXG5tbS9zd2FwLmg6MzQ0OnZvaWQgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oc3RydWN0IHN3YXBfY2x1c3Rlcl9pbmZvICpjaSxcXG5tbS9zd2FwLmgtMzQ1LVxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqb2xkLCBzdHJ1Y3QgZm9saW8gKm5ldyk7XFxuLS1cXG5tbS9zd2FwLmg9NDc2PXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N3YXBfY2FjaGVfZGVsX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxuLS1cXG5tbS9zd2FwLmgtNDgwLVxcbm1tL3N3YXAuaDo0ODE6c3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2ksXFxubW0vc3dhcC5oLTQ4Mi1cXHRcXHRzdHJ1Y3QgZm9saW8gKm9sZCwgc3RydWN0IGZvbGlvICpuZXcpXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmM9MzM1PXZvaWQgc3dhcF9jYWNoZV9kZWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3N3YXBfc3RhdGUuYy0zNDctLyoqXFxubW0vc3dhcF9zdGF0ZS5jOjM0ODogKiBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyAtIFJlcGxhY2UgYSBmb2xpbyBpbiB0aGUgc3dhcCBjYWNoZS5cXG5tbS9zd2FwX3N0YXRlLmMtMzQ5LSAqIEBjaTogVGhlIGxvY2tlZCBzd2FwIGNsdXN0ZXIuXFxuLS1cXG5tbS9zd2FwX3N0YXRlLmMtMzYwLSAqL1xcbm1tL3N3YXBfc3RhdGUuYzozNjE6dm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxcbm1tL3N3YXBfc3RhdGUuYy0zNjItXFx0XFx0XFx0XFx0c3RydWN0IGZvbGlvICpvbGQsIHN0cnVjdCBmb2xpbyAqbmV3KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQyMDoxNToyMy44MjUwNzg2MVoiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NzQ3MDUzMTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIEZvbGlvIFNwbGl0dGluZyBhbmQgU3dhcCBPcGVyYXRpb25zKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvYCDigJMgdGhhdCdzIGRlZmluaXRlbHkgYSBnbG9iYWwgc3ltYm9sLCBleHBvcnRlZCBmcm9tIGBtbS9zd2FwX3N0YXRlLmNgLiBHb29kIHRvIGtub3cuIE5vdywgbGV0J3Mgc2VlIHdoYXQgZWxzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIGluIHRlcm1zIG9mIGNvbmZpZ3VyYXRpb25zLlxuXG5IbW0sIGBDT05GSUdfREVWSUNFX01JR1JBVElPTmAgaXMgdGllZCB0byBgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW9gLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmb2xpb19zcGxpdF91bm1hcHBlZGAuIEJ1dCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgIHJlc2lkZXMgd2l0aGluIGBtbS9odWdlX21lbW9yeS5jYCwgYW5kIHRoYXQncyBjb21waWxlZCB3aXRoIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBTbywgaXQgbG9va3MgbGlrZSBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFuZCBgU1dBUGAgYXJlIHRoZSBiaWcgb25lcyBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5LiBNYWtlcyBzZW5zZS5cblxuQWxyaWdodCwgbGV0J3MgcXVpY2tseSByZXZpZXcgdGhlIGludGVybmFscy4gYF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZWAgYW5kIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVfZmlsZWAgYXJlIHN0YXRpYyBmdW5jdGlvbnMg4oCTIG5vdCB2ZXJ5IGhlbHBmdWwgYXMgZGlyZWN0IGVudHJ5IHBvaW50cyBmb3IgYW5hbHlzaXMuIEhvd2V2ZXIsIGBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyYCBzZWVtcyB0byBiZSB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3Igc3BsaXR0aW5nLiBUaGVuLCB3ZSBoYXZlIGBmb2xpb19zcGxpdF91bm1hcHBlZGAgYXMgYW5vdGhlciBwb3RlbnRpYWwgZW50cnkgcG9pbnQuXG5cbkkgbGlrZSBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAgYXMgYSBmb2N1cyBzeW1ib2w7IHRoYXQgc2VlbXMgbGlrZSBhIGdvb2QgcGxhY2UgdG8gZGlnIGluLiBBbmQsIGFzIGEgcmVtaW5kZXIsIGBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb2AgaXMgYWxzbyBhIHNvbGlkIG9wdGlvbiwgZ2l2ZW4gaXRzIGdsb2JhbCBuYXR1cmUuXG5cbkp1c3QgZ29pbmcgdG8gZG91YmxlLWNoZWNrIHRob3NlIGNvbmZpZ3MgYWdhaW4uLi5hbHdheXMgYSBnb29kIGlkZWEgdG8gY29uZmlybS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAwNTYsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MjkuNTcyMTM1ODM5WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTIxMjQ1OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTgzMT1jb25maWcgTU1fSURcXG4tLVxcbm1tL0tjb25maWctODMzLVxcbm1tL0tjb25maWc6ODM0Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTgzNS1cXHRib29sIFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XFxcIlxcbi0tXFxubW0vS2NvbmZpZz04NTI9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg1Ny1cXG5tbS9LY29uZmlnOjg1ODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NTktXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NjQtXFxubW0vS2NvbmZpZzo4NjU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg2Ni1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzMtXFxubW0vS2NvbmZpZzo4NzQ6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04NzUtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg4MT1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODkwLVxcbm1tL0tjb25maWc6ODkxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy04OTItXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwMC1cXG5tbS9LY29uZmlnOjkwMTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTkwMi1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwOC1cXG5tbS9LY29uZmlnOjkwOTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTEwLVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MTYtXFxubW0vS2NvbmZpZzo5MTc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05MTgtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZz05MjY9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTkzNS1cXG5tbS9LY29uZmlnOjkzNjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxcbm1tL0tjb25maWctOTM3LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NDQtXFxubW0vS2NvbmZpZzo5NDU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05NDYtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NTItXFxubW0vS2NvbmZpZzo5NTM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTk1NC1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTYwLVxcbm1tL0tjb25maWc6OTYxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTYyLVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MjkuNjMzMzU0Mzg4WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ2MjQ2NTY4MjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKlF1aWNrIENvbmZpZ3VyYXRpb24gQ2hlY2sqKlxuXG5BbHJpZ2h0LCBsZXQncyBzZWUsIGdvaW5nIG92ZXIgdGhlIHN5c3RlbSBzZXR1cC4gSSBzZWUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBkZWZpbml0ZWx5IGZsYWdnZWQgaW4gdGhlIGNvbmZpZy4gT2theSwgdGhhdCdzIGV4cGVjdGVkLCBidXQgYWx3YXlzIGdvb2QgdG8gY29uZmlybS4gVGhlbiwgdGhlcmUncyBgU1dBUGAsIHdoaWNoIGlzIGFub3RoZXIga2V5IHBhcmFtZXRlci4gTmVlZCB0byBjb25zaWRlciBob3cgdGhhdCBwbGF5cyBpbnRvIGV2ZXJ5dGhpbmcuIEknbGwgbmVlZCB0byBrZWVwIHRoYXQgaW4gbWluZCB3aGVuIGV4YW1pbmluZyB0aGUgb3RoZXIgc2V0dGluZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNDE5LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6MzQuMjU4MDE0NzU4WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NTI5OTcyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgU1dBUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9OT1jb25maWcgQVJDSF9OT19TV0FQXFxuLS1cXG5tbS9LY29uZmlnLTExLVxcbm1tL0tjb25maWc6MTI6bWVudWNvbmZpZyBTV0FQXFxubW0vS2NvbmZpZy0xMy1cXHRib29sIFxcXCJTdXBwb3J0IGZvciBwYWdpbmcgb2YgYW5vbnltb3VzIG1lbW9yeSAoc3dhcClcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE1OjM0LjMyMzMyMDIyNloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2NjAxMDgxMjY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgVGhpcyBQYXRjaCoqXG5cbk9rYXksIHNvIEkgc2VlIHRoYXQgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgYFNXQVBgIGFyZSBkZWZpbml0ZWx5IHJlbGV2YW50IGhlcmU7IHRob3NlIGFyZSB0aGUga2V5IGNvbmZpZ3VyYXRpb24gZmxhZ3Mgd2UgbmVlZCB0byBrZWVwIGluIG1pbmQuIExldCdzIGJyZWFrIGRvd24gdGhlIGNyaXRpY2FsIHN5bWJvbHMgdGhhdCBqdW1wIG91dCB0byBtZTogYF9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJgLCBgZm9saW9fc3BsaXRfdW5tYXBwZWRgLCBgZm9saW9fY2hlY2tfc3BsaXR0YWJsZWAsIGFuZCBgX19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW9gLiBUaG9zZSBhcmUgdGVsbGluZy5cblxuVGhlIGNoYW5nZXMgYXJlLCB3aXRob3V0IGEgZG91YnQsIGZ1bmN0aW9uYWwgYW5kIGRyaWxsaW5nIGRvd24gaW50byB0aGUgaGVhcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQuIFRoYXQncyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIFRoZSBmYWN0IHRoYXQgdXNlcnNwYWNlIGNhbiB0cmlnZ2VyIHRoZXNlIGNoYW5nZXMgdGhyb3VnaCBgbWFkdmlzZWAsIGBtYmluZGAsIG9yIGV2ZW4ganVzdCBwbGFpbiBvbGQgbWVtb3J5IGFsbG9jYXRpb24gYW5kIHN3YXBwaW5nIHNlYWxzIHRoZSBkZWFsLiBXZSdyZSB0YWxraW5nIGFib3V0IGEgc3Vic3RhbnRpYWwgYXR0YWNrIHN1cmZhY2UuXG5cblRoaXMgcGF0Y2ggcmVmYWN0b3JzIHRoZSBzcGxpdHRpbmcgb2YgZm9saW9zLCBlc3BlY2lhbGx5IGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSSdtIHNlZWluZyB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBuZXcgZnVuY3Rpb25zIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVgIGFuZCBgX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGVgLCB3aGljaCB0ZWxscyBtZSBpdCdzIGhhbmRsaW5nIHRoZSBzcGxpdHRpbmcgcHJvY2VzcyBkaXJlY3RseSwgYW5kIGNoYW5nZXMgdG8gdGhlIGNvbmRpdGlvbnMgaW4gYGZvbGlvX2NoZWNrX3NwbGl0dGFibGVgLiBUaGUgZmFjdCB0aGF0IHRoZXNlIGFyZSB0b3VjaGluZyB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCB3aXRoIFRIUCBhbmQgc3dhcCBtYWtlcyB0aGlzIGNyaXRpY2FsLiBHaXZlbiB0aGUgdXNlcnNwYWNlIHJlYWNoLCBmdXp6aW5nIHRoaXMgaXMgYWJzb2x1dGVseSBqdXN0aWZpZWQuIEl0J3MgYSBjbGVhciBjYW5kaWRhdGUgZm9yIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cblRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTY1NSwiT3V0cHV0VG9rZW5zIjoxNjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNDEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6NDAuOTI0NDAzMzkyWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE3NzM1ODg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fc3BsaXRfaHVnZV9wYWdlX3RvX2xpc3RfdG9fb3JkZXJcIixcbiAgICBcImZvbGlvX3NwbGl0X3VubWFwcGVkXCIsXG4gICAgXCJmb2xpb19jaGVja19zcGxpdHRhYmxlXCIsXG4gICAgXCJfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBhbmQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciBzcGxpdHRpbmcgZm9saW9zLCBwYXJ0aWN1bGFybHkgZm9yIGFub255bW91cyBhbmQgc3dhcGNhY2hlIGZvbGlvcy4gSXQgaW50cm9kdWNlcyBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBzcGxpdHRpbmcgYW5kIG1vZGlmaWVzIGNvbmRpdGlvbnMgaW4gZm9saW9fY2hlY2tfc3BsaXR0YWJsZS4gVGhlc2UgYXJlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY2hhbmdlcyBhZmZlY3RpbmcgVHJhbnNwYXJlbnQgSHVnZSBQYWdlcyAoVEhQKSBhbmQgc3dhcCwgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSBhbmQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6NDEuMDQyMTQ2Mzc5WiIsIlNlcSI6MjksIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTIyMzA0MzA3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE1OjQxLjA0MjczNzEyOVoiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxMTIyMjQ0NjUzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxcblxcblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNWFlNzBmN2EyNjc5MzdiNWVhYmNkMTk2ZmZmNTJlMjQ3OWQwY2QyZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDEyIDIwOjE0OjIyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcbmluZGV4IGNlZDQwMGY3MmQ0M2EuLjFjNjFiN2QzOWNkMDMgMTAwNjQ0XG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXG4rKysgYi9tbS9odWdlX21lbW9yeS5jXG5AQCAtMzU4OSw5ICszNTg5LDYgQEAgc3RhdGljIHZvaWQgcmVtYXBfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yLCBpbnQgZmxhZ3MpXG4ge1xuIFx0aW50IGkgPSAwO1xuIFxuLVx0LyogSWYgdW5tYXBfZm9saW8oKSB1c2VzIHRyeV90b19taWdyYXRlKCkgb24gZmlsZSwgcmVtb3ZlIHRoaXMgY2hlY2sgKi9cbi1cdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbi1cdFx0cmV0dXJuO1xuIFx0Zm9yICg7Oykge1xuIFx0XHRyZW1vdmVfbWlncmF0aW9uX3B0ZXMoZm9saW8sIGZvbGlvLCBUVFVfUk1BUF9MT0NLRUQgfCBmbGFncyk7XG4gXHRcdGkgKz0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuQEAgLTM2MzQsNiArMzYzMSwxOCBAQCBzdGF0aWMgYm9vbCBwYWdlX3JhbmdlX2hhc19od3BvaXNvbmVkKHN0cnVjdCBwYWdlICpwYWdlLCBsb25nIG5yX3BhZ2VzKVxuIFx0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbisvKipcbisgKiBmb3JfZWFjaF9mb2xpb19zYWZlIC0gaXRlcmF0ZSBvdmVyIGNvbnRpZ3VvdXMgZm9saW9zIHNhZmUgYWdhaW5zdCBmb2xpbyBmcmVlXG4rICogQHN0YXJ0OiB0aGUgZmlyc3QgZm9saW8gdG8gaXRlcmF0ZVxuKyAqIEBlbmQ6IHNlbnRpbmVsLCBmb2xpb19uZXh0KCkgb2YgdGhlIGxhc3QgZm9saW8gdG8gaXRlcmF0ZVxuKyAqIEBzdWJfZm9saW86IHN0cnVjdCBmb2xpbyAqIHRvIHVzZSBhcyB0aGUgbG9vcCBjdXJzb3JcbisgKiBAbmV4dDogc3RydWN0IGZvbGlvICogdXNlZCBhcyB0ZW1wb3Jhcnkgc3RvcmFnZVxuKyAqL1xuKyNkZWZpbmUgZm9yX2VhY2hfZm9saW9fc2FmZShzdGFydCwgZW5kLCBzdWJfZm9saW8sIG5leHQpIFxcXG4rXHRmb3IgKHN1Yl9mb2xpbyA9IChzdGFydCksIG5leHQgPSBmb2xpb19uZXh0KHN1Yl9mb2xpbyk7IFxcXG4rXHQgICAgIHN1Yl9mb2xpbyAhPSAoZW5kKTsgXFxcbitcdCAgICAgc3ViX2ZvbGlvID0gbmV4dCwgbmV4dCA9IGZvbGlvX25leHQobmV4dCkpXG4rXG4gLypcbiAgKiBJdCBzcGxpdHMgQGZvbGlvIGludG8gQG5ld19vcmRlciBmb2xpb3MgYW5kIGNvcGllcyB0aGUgQGZvbGlvIG1ldGFkYXRhIHRvXG4gICogYWxsIHRoZSByZXN1bHRpbmcgZm9saW9zLlxuQEAgLTM3NTUsOCArMzc2NCw4IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfZm9saW9fdG9fb3JkZXIoc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG9sZF9vcmRlcixcbiB9XG4gXG4gLyoqXG4tICogX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIC0gc3BsaXRzIGFuIHVubWFwcGVkIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3MgaW5cbi0gKiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cbisgKiBfX3NwbGl0X2Zyb3plbl9mb2xpbygpIC0gc3BsaXRzIGEgZnJvemVuIEBmb2xpbyB0byBsb3dlciBvcmRlciBmb2xpb3NcbisgKiBpbiB0d28gd2F5czogdW5pZm9ybSBzcGxpdCBvciBub24tdW5pZm9ybSBzcGxpdC5cbiAgKiBAZm9saW86IHRoZSB0by1iZS1zcGxpdCBmb2xpb1xuICAqIEBuZXdfb3JkZXI6IHRoZSBzbWFsbGVzdCBvcmRlciBvZiB0aGUgYWZ0ZXIgc3BsaXQgZm9saW9zIChzaW5jZSBidWRkeVxuICAqICAgICAgICAgICAgIGFsbG9jYXRvciBsaWtlIHNwbGl0IGdlbmVyYXRlcyBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbSBAZm9saW8nc1xuQEAgLTM3OTUsMTEgKzM4MDQsMTIgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9mb2xpb190b19vcmRlcihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgb2xkX29yZGVyLFxuICAqIFJldHVybjogMCAtIHN1Y2Nlc3NmdWwsIFx1MDAzYzAgLSBmYWlsZWQgKGlmIC1FTk9NRU0gaXMgcmV0dXJuZWQsIEBmb2xpbyBtaWdodCBiZVxuICAqIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlciwgdGhlIGNhbGxlciBuZWVkcyB0byBjaGVjaylcbiAgKi9cbi1zdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbitzdGF0aWMgaW50IF9fc3BsaXRfZnJvemVuX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHhhX3N0YXRlICp4YXMsXG4gXHRcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4gXHRjb25zdCBib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuK1x0Y29uc3QgYm9vbCBpc19zd2FwY2FjaGUgPSBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbyk7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0aW50IHN0YXJ0X29yZGVyID0gc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0gPyBuZXdfb3JkZXIgOiBvbGRfb3JkZXIgLSAxO1xuIFx0c3RydWN0IGZvbGlvICpvbGRfZm9saW8gPSBmb2xpbztcbkBAIC0zODE0LDggKzM4MjQsOCBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBcdCAgICAgc3BsaXRfb3JkZXItLSkge1xuIFx0XHRpbnQgbnJfbmV3X2ZvbGlvcyA9IDFVTCBcdTAwM2NcdTAwM2MgKG9sZF9vcmRlciAtIHNwbGl0X29yZGVyKTtcbiBcbi1cdFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgZm9saW8gaXMgbm90IHN1cHBvcnRlZCAqL1xuLVx0XHRpZiAoaXNfYW5vbiBcdTAwMjZcdTAwMjYgc3BsaXRfb3JkZXIgPT0gMSlcbitcdFx0Lyogb3JkZXItMSBhbm9ueW1vdXMgb3Igc3dhcGNhY2hlIGZvbGlvIGlzIG5vdCBzdXBwb3J0ZWQgKi9cbitcdFx0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IHNwbGl0X29yZGVyID09IDEpXG4gXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdGlmIChtYXBwaW5nKSB7XG5AQCAtMzg3OCwzMiArMzg4OCwyNiBAQCBzdGF0aWMgaW50IF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5ld19vcmRlcixcbiBpbnQgZm9saW9fY2hlY2tfc3BsaXR0YWJsZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFx0XHRcdCAgIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbitcdGJvb2wgaXNfYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4rXHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbitcbiBcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuIFx0LypcbiBcdCAqIEZvbGlvcyB0aGF0IGp1c3QgZ290IHRydW5jYXRlZCBjYW5ub3QgZ2V0IHNwbGl0LiBTaWduYWwgdG8gdGhlXG4tXHQgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLlxuLVx0ICpcbi1cdCAqIFRPRE86IHRoaXMgd2lsbCBhbHNvIGN1cnJlbnRseSByZWZ1c2UgZm9saW9zIHdpdGhvdXQgYSBtYXBwaW5nIGluIHRoZVxuLVx0ICogc3dhcGNhY2hlIChzaG1lbSBvciB0by1iZS1hbm9uIGZvbGlvcykuXG4rXHQgKiBjYWxsZXIgdGhhdCB0aGVyZSB3YXMgYSByYWNlLiBBIG1hcHBpbmdsZXNzIHN3YXAgY2FjaGUgZm9saW9cbitcdCAqIGhhcyBubyBwYWdlIGNhY2hlIGVudHJpZXMgdG8gdXBkYXRlLCBzbyBpdCBpcyBmaW5lIHRvIHNwbGl0LlxuIFx0ICovXG4tXHRpZiAoIWZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuK1x0aWYgKCFmb2xpby1cdTAwM2VtYXBwaW5nIFx1MDAyNlx1MDAyNiAhaXNfc3dhcGNhY2hlKVxuIFx0XHRyZXR1cm4gLUVCVVNZO1xuIFxuLVx0Lyogb3JkZXItMSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQLiAqL1xuLVx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbiBcdC8qXG4tXHQgKiBzd2FwY2FjaGUgZm9saW8gY291bGQgb25seSBiZSBzcGxpdCB0byBvcmRlciAwXG4tXHQgKlxuLVx0ICogbm9uLXVuaWZvcm0gc3BsaXQgY3JlYXRlcyBhZnRlci1zcGxpdCBmb2xpb3Mgd2l0aCBvcmRlcnMgZnJvbVxuLVx0ICogZm9saW9fb3JkZXIoZm9saW8pIC0gMSB0byBuZXdfb3JkZXIsIG1ha2luZyBpdCBub3Qgc3VpdGFibGUgZm9yIGFueVxuLVx0ICogc3dhcGNhY2hlIGZvbGlvIHNwbGl0LiBPbmx5IHVuaWZvcm0gc3BsaXQgdG8gb3JkZXItMCBjYW4gYmUgdXNlZFxuLVx0ICogaGVyZS5cbitcdCAqIE9yZGVyLTEgaXMgdW5zdXBwb3J0ZWQ6IGFub24gZm9saW9zIG5lZWQgc3VicGFnZSAyIGZvciB0aGVcbitcdCAqIGRlZmVycmVkIHNwbGl0IGxpc3QsIGh5YnJpZCBzaG1lbSBcdTAwMjYgc3dhcCBjYWNoZSBmb2xpb3MgYXJlIG5vdFxuK1x0ICogc3BsaXR0YWJsZSwgYW5kIGEgc3BsaXR0YWJsZSBtYXBwaW5nbGVzcyBzd2FwIGNhY2hlIGZvbGlvIGNvdWxkXG4rXHQgKiBiZSBlaXRoZXIgYW5vbiBvciBzaG1lbSwgd2hpY2ggd2UgY2Fubm90IHRlbGwgYXBhcnQuXG4gXHQgKi9cbi1cdGlmICgoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX05PTl9VTklGT1JNIHx8IG5ld19vcmRlcikgXHUwMDI2XHUwMDI2IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkge1xuK1x0aWYgKChpc19hbm9uIHx8IGlzX3N3YXBjYWNoZSkgXHUwMDI2XHUwMDI2IG5ld19vcmRlciA9PSAxKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdH1cbiBcbiBcdGlmIChpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0zOTExLDM5ICszOTE1LDk3IEBAIGludCBmb2xpb19jaGVja19zcGxpdHRhYmxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRpZiAoZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pKVxuIFx0XHRyZXR1cm4gLUVCVVNZO1xuIFxuK1x0LypcbitcdCAqIEEgbm9uLWFub24gc3dhcGNhY2hlIGZvbGlvIHRoYXQgc3RpbGwgaGFzIGEgbWFwcGluZyBjYW4gb25seSBiZSBhXG4rXHQgKiBzaG1lbSBmb2xpbyB1bmRlciBTV0FQIElPLCBpdCdzIHJlbW92ZWQgZnJvbSBlaXRoZXIgc3dhcCBjYWNoZSBvclxuK1x0ICogc2htZW0gbWFwcGluZyBhZnRlcndhcmQuIFRoZXJlIGlzIGxpdHRsZSBiZW5lZml0IGluIHNwbGl0dGluZyB0aGVtXG4rXHQgKiBoZW5jZSByZWplY3QgaXQgaGVyZSB1cCBmcm9udCBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcuXG4rXHQgKi9cbitcdGlmICghaXNfYW5vbiBcdTAwMjZcdTAwMjYgaXNfc3dhcGNhY2hlIFx1MDAyNlx1MDAyNiBmb2xpby1cdTAwM2VtYXBwaW5nKVxuK1x0XHRyZXR1cm4gLUVCVVNZO1xuK1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLS8qIE51bWJlciBvZiBmb2xpbyByZWZlcmVuY2VzIGZyb20gdGhlIHBhZ2VjYWNoZSBvciB0aGUgc3dhcGNhY2hlLiAqL1xuLXN0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fY2FjaGVfcmVmX2NvdW50KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8pXG4rLyogTnVtYmVyIG9mIGZvbGlvIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3dhcGNhY2hlLiAqL1xuK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChjb25zdCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbi1cdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuK1x0aWYgKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpXG4gXHRcdHJldHVybiAwO1xuIFx0cmV0dXJuIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcbiB9XG4gXG4tc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCB4YV9zdGF0ZSAqeGFzLFxuLVx0XHRcdFx0XHQgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBib29sIGRvX2xydSxcbi1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSxcbi1cdFx0XHRcdFx0ICAgICBwZ29mZl90IGVuZCwgaW50ICpucl9zaG1lbV9kcm9wcGVkKVxuKy8qKlxuKyAqIF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZSgpIC0gc3BsaXQgYW4gYW5vbiBvciBzd2FwIGNhY2hlIGZvbGlvXG4rICogQGZvbGlvOiBmb2xpbyB0byBzcGxpdCwgbXVzdCBiZSBsb2NrZWRcbisgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuKyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KVxuKyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxuKyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuKyAqIEBkb19scnU6IGlmIHRydWUsIGFkZCBhZnRlci1zcGxpdCBmb2xpb3MgdG8gQGxpc3QgaWYgbm9uIE5VTEwsIG90aGVyd2lzZSB0b1xuKyAqICAgICAgICAgIHRoZSBMUlUgbGlzdFxuKyAqIEBhbm9uX3VubWFwOiBpZiB0cnVlLCB1bm1hcCBAZm9saW8gYmVmb3JlIHRoZSBzcGxpdCBhbmQgcmVtYXAgaXQgYWZ0ZXJcbisgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXG4rICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxuKyAqXG4rICogSGVscGVyIGZvciBzcGxpdHRpbmcgYW4gYW5vbiBvciBzd2FwIGNhY2hlIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvICh1bmxlc3NcbisgKiBAYW5vbl91bm1hcCBpcyBmYWxzZSksIGZyZWV6ZXMgaXRzIHJlZmNvdW50LCBhbmQgcGVyZm9ybXMgdGhlIHNwbGl0LCB1cGRhdGVzXG4rICogdGhlIHN3YXAgY2FjaGUgZW50cmllcy4gU3BsaXQgZm9saW9zIGFyZSB1bmZyb3plbiBhbmQgcmVtYXBwZWQuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC5cbisgKi9cbitzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgYm9vbCBkb19scnUsIGJvb2wgYW5vbl91bm1hcCxcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbiB7XG4gXHRzdHJ1Y3QgZm9saW8gKmVuZF9mb2xpbyA9IGZvbGlvX25leHQoZm9saW8pO1xuK1x0Ym9vbCBpc19hbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuIFx0aW50IG9sZF9vcmRlciA9IGZvbGlvX29yZGVyKGZvbGlvKTtcbitcdHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMO1xuK1x0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbiBcdHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydTtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcdGJvb2wgZGVxdWV1ZV9kZWZlcnJlZDtcbiBcdGludCByZXQgPSAwO1xuIFxuLVx0Vk1fV0FSTl9PTl9PTkNFKCFtYXBwaW5nIFx1MDAyNlx1MDAyNiBlbmQpO1xuK1x0LypcbitcdCAqIFVubWFwL3JlbWFwIG5lZWRzIHRoZSBhbm9uX3ZtYS4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWNlc3NhcmlseVxuK1x0ICogaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBmcm9tXG4rXHQgKiBkaXNhcHBlYXJpbmcsIHNvIHdlIGZpcnN0IHRha2UgYSByZWZlcmVuY2UgYW5kIGxvY2sgaXQuIFRoaXMgaXNcbitcdCAqIHNpbWlsYXIgdG8gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKCkgZXhjZXB0IHRoZSB3cml0ZSBsb2NrIGlzXG4rXHQgKiB0YWtlbiB0byBzZXJpYWxpemUgYWdhaW5zdCBwYXJhbGxlbCBzcGxpdCBvciBjb2xsYXBzZS5cbitcdCAqL1xuK1x0aWYgKGFub25fdW5tYXApIHtcbitcdFx0YW5vbl92bWEgPSBmb2xpb19nZXRfYW5vbl92bWEoZm9saW8pO1xuK1x0XHRpZiAoIWFub25fdm1hKVxuK1x0XHRcdHJldHVybiAtRUJVU1k7XG4rXHRcdGFub25fdm1hX2xvY2tfd3JpdGUoYW5vbl92bWEpO1xuK1x0fVxuK1xuK1x0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB0aGUgb3B0aW9uYWwgdW5tYXAuICovXG4rXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIG91dF91bmxvY2s7XG4rXHR9XG4rXG4rXHRpZiAoYW5vbl91bm1hcClcbitcdFx0dW5tYXBfZm9saW8oZm9saW8pO1xuK1xuK1x0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbitcbiBcdC8qXG4gXHQgKiBJZiB0aGlzIGZvbGlvIGNhbiBiZSBvbiB0aGUgZGVmZXJyZWQgc3BsaXQgcXVldWUsIGxvY2sgb3V0XG4gXHQgKiB0aGUgc2hyaW5rZXIgYmVmb3JlIGZyZWV6aW5nIHRoZSByZWYuIElmIHRoZSBzaHJpbmtlciBzZWVzXG4gXHQgKiBhIDAtcmVmIGZvbGlvLCBpdCBhc3N1bWVzIGl0IGJlYXQgZm9saW9fcHV0KCkgdG8gdGhlIGxpc3RcbiBcdCAqIGxvY2sgYW5kIG11c3QgY2xlYW4gdXAgdGhlIExSVSBzdGF0ZSAtIHRoZSBzYW1lIGRlcXVldWUgd2VcbiBcdCAqIHdpbGwgZG8gYmVsb3cgYXMgcGFydCBvZiB0aGUgc3BsaXQuXG4rXHQgKlxuK1x0ICogT25seSBhbm9uIGZvbGlvcyBhcmUgZXZlciBxdWV1ZWQgb24gdGhlIGRlZmVycmVkIHNwbGl0IGxpc3QsXG4rXHQgKiBzbyBub24tYW5vbiBmb2xpb3MgKG1hcHBpbmdsZXNzIHN3YXBjYWNoZSkgbmV2ZXIgbmVlZCBkZXF1ZXVpbmcuXG4gXHQgKi9cbi1cdGRlcXVldWVfZGVmZXJyZWQgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiBvbGRfb3JkZXIgXHUwMDNlIDE7XG4rXHRkZXF1ZXVlX2RlZmVycmVkID0gb2xkX29yZGVyIFx1MDAzZSAxIFx1MDAyNlx1MDAyNiBpc19hbm9uO1xuIFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbiBcdFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuIFxuQEAgLTM5NTIsMTI4ICs0MDE0LDI1MiBAQCBzdGF0aWMgaW50IF9fZm9saW9fZnJlZXplX2FuZF9zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgblxuIFx0XHRscnUgPSBsaXN0X2xydV9sb2NrKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSxcbiBcdFx0XHRcdCAgICBmb2xpb19uaWQoZm9saW8pLCBcdTAwMjZtZW1jZyk7XG4gXHR9XG4tXHRpZiAoZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgZm9saW9fY2FjaGVfcmVmX2NvdW50KGZvbGlvKSArIDEpKSB7XG4tXHRcdHN0cnVjdCBzd2FwX2NsdXN0ZXJfaW5mbyAqY2kgPSBOVUxMO1xuLVx0XHRzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7XG4gXG4rXHRpZiAoIWZvbGlvX3JlZl9mcmVlemUoZm9saW8sIGZvbGlvX3N3YXBjYWNoZV9yZWZfY291bnQoZm9saW8pICsgMSkpIHtcbiBcdFx0aWYgKGRlcXVldWVfZGVmZXJyZWQpIHtcbi1cdFx0XHRfX2xpc3RfbHJ1X2RlbChcdTAwMjZkZWZlcnJlZF9zcGxpdF9scnUsIGxydSxcbi1cdFx0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfcGFydGlhbGx5X21hcHBlZChmb2xpbykpIHtcbi1cdFx0XHRcdGZvbGlvX2NsZWFyX3BhcnRpYWxseV9tYXBwZWQoZm9saW8pO1xuLVx0XHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4tXHRcdFx0XHRcdE1USFBfU1RBVF9OUl9BTk9OX1BBUlRJQUxMWV9NQVBQRUQsIC0xKTtcbi1cdFx0XHR9XG4gXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4gXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXHRcdH1cbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBvdXRfbm9fc3BsaXQ7XG4rXHR9XG4gXG4tXHRcdGlmIChtYXBwaW5nKSB7XG4tXHRcdFx0aW50IG5yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuLVxuLVx0XHRcdGlmIChmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2XG4tXHRcdFx0ICAgIG5ld19vcmRlciBcdTAwM2MgSFBBR0VfUE1EX09SREVSKSB7XG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkge1xuLVx0XHRcdFx0XHRscnV2ZWNfc3RhdF9tb2RfZm9saW8oZm9saW8sXG4tXHRcdFx0XHRcdFx0XHROUl9TSE1FTV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuLVx0XHRcdFx0XHRcdFx0TlJfRklMRV9USFBTLCAtbnIpO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH1cbitcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4rXHRcdF9fbGlzdF9scnVfZGVsKFx1MDAyNmRlZmVycmVkX3NwbGl0X2xydSwgbHJ1LFxuK1x0XHRcdCAgICAgICBcdTAwMjZmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgZm9saW9fbmlkKGZvbGlvKSk7XG4rXHRcdGlmIChmb2xpb190ZXN0X3BhcnRpYWxseV9tYXBwZWQoZm9saW8pKSB7XG4rXHRcdFx0Zm9saW9fY2xlYXJfcGFydGlhbGx5X21hcHBlZChmb2xpbyk7XG4rXHRcdFx0bW9kX210aHBfc3RhdChvbGRfb3JkZXIsXG4rXHRcdFx0XHQgICAgICBNVEhQX1NUQVRfTlJfQU5PTl9QQVJUSUFMTFlfTUFQUEVELCAtMSk7XG4gXHRcdH1cbitcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0fVxuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSB7XG4tXHRcdFx0aWYgKG1hcHBpbmcpIHtcbi1cdFx0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdFx0XHR9XG4rXHRpZiAoZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKVxuK1x0XHRjaSA9IHN3YXBfY2x1c3Rlcl9nZXRfYW5kX2xvY2soZm9saW8pO1xuIFxuLVx0XHRcdGNpID0gc3dhcF9jbHVzdGVyX2dldF9hbmRfbG9jayhmb2xpbyk7XG4tXHRcdH1cbitcdGlmIChkb19scnUpXG4rXHRcdGxydXZlYyA9IGZvbGlvX2xydXZlY19sb2NrKGZvbGlvKTtcbitcbitcdHJldCA9IF9fc3BsaXRfZnJvemVuX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCBOVUxMLFxuK1x0XHRcdFx0ICAgTlVMTCwgc3BsaXRfdHlwZSk7XG4gXG4tXHRcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuK1x0LypcbitcdCAqIFVuZnJlZXplIHRoZSBwb3N0LXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbitcdCAqIHBsYWNlLiBLZWVwIHRoZSBoZWFkIEBmb2xpbyBmcm96ZW4gdW50aWwgdGhlIGVuZDogc3ViIGVudHJpZXNcbitcdCAqIGluIHN3YXAgY2FjaGUgbXVzdCBiZSB1cGRhdGVkIGZpcnN0LCBzbyBhIGNvbmN1cnJlbnRcbitcdCAqIHN3YXBfY2FjaGVfZ2V0X2ZvbGlvKCkgY2Fubm90IHJldHVybiB0aGUgaGVhZCBmb2xpbyBmb3IgYSBzdWJcbitcdCAqIGVudHJ5IChmb2xpb190cnlfZ2V0KCkgd2lsbCBmYWlsIG9uIHRoZSBoZWFkIEBmb2xpbyB1bnRpbCB1bmZyZWV6ZSkuXG4rXHQgKi9cbitcdGZvcl9lYWNoX2ZvbGlvX3NhZmUoZm9saW9fbmV4dChmb2xpbyksIGVuZF9mb2xpbywgbmV3X2ZvbGlvLCBuZXh0KSB7XG4rXHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4rXHRcdFx0XHQgICBmb2xpb19zd2FwY2FjaGVfcmVmX2NvdW50KG5ld19mb2xpbykgKyAxKTtcbiBcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRscnV2ZWMgPSBmb2xpb19scnV2ZWNfbG9jayhmb2xpbyk7XG4rXHRcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1x0XHRpZiAoY2kpXG4rXHRcdFx0X19zd2FwX2NhY2hlX3JlcGxhY2VfZm9saW8oY2ksIGZvbGlvLCBuZXdfZm9saW8pO1xuK1x0fVxuIFxuLVx0XHRyZXQgPSBfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LCB4YXMsXG4tXHRcdFx0XHRcdCAgICAgbWFwcGluZywgc3BsaXRfdHlwZSk7XG4rXHR6b25lX2RldmljZV9wcml2YXRlX3NwbGl0X2NiKGZvbGlvLCBOVUxMKTtcbitcdGZvbGlvX3JlZl91bmZyZWV6ZShmb2xpbywgZm9saW9fc3dhcGNhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogVW5mcmVlemUgYWZ0ZXItc3BsaXQgZm9saW9zIGFuZCBwdXQgdGhlbSBiYWNrIHRvIHRoZSByaWdodFxuLVx0XHQgKiBsaXN0LiBAZm9saW8gc2hvdWxkIGJlIGtlcHQgZnJvem9uIHVudGlsIHBhZ2UgY2FjaGVcbi1cdFx0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4tXHRcdCAqIHRvIHByZXZlbnQgb3RoZXJzIHNlZWluZyBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqIEFzIGEgcmVzdWx0LCBuZXdfZm9saW8gc3RhcnRzIGZyb20gdGhlIG5leHQgZm9saW8gb2Zcbi1cdFx0ICogQGZvbGlvLlxuLVx0XHQgKi9cbi1cdFx0Zm9yIChuZXdfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTsgbmV3X2ZvbGlvICE9IGVuZF9mb2xpbztcbi1cdFx0ICAgICBuZXdfZm9saW8gPSBuZXh0KSB7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbyk7XG4rXHRpZiAoZG9fbHJ1KVxuK1x0XHRscnV2ZWNfdW5sb2NrKGxydXZlYyk7XG4rXHRpZiAoY2kpXG4rXHRcdHN3YXBfY2x1c3Rlcl91bmxvY2soY2kpO1xuK291dF9ub19zcGxpdDpcbitcdGxvY2FsX2lycV9lbmFibGUoKTtcbitcdGlmIChhbm9uX3VubWFwKSB7XG4rXHRcdGlmICghcmV0IFx1MDAyNlx1MDAyNiAhZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKVxuK1x0XHRcdHR0dV9mbGFncyA9IFRUVV9VU0VfU0hBUkVEX1pFUk9QQUdFO1xuK1x0XHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4rXHR9XG4rb3V0X3VubG9jazpcbitcdGlmIChhbm9uX3VubWFwKSB7XG4rXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4rXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4rXHR9XG4gXG4tXHRcdFx0bmV4dCA9IGZvbGlvX25leHQobmV3X2ZvbGlvKTtcbitcdHJldHVybiByZXQ7XG4rfVxuIFxuLVx0XHRcdHpvbmVfZGV2aWNlX3ByaXZhdGVfc3BsaXRfY2IoZm9saW8sIG5ld19mb2xpbyk7XG4rLyoqXG4rICogX19mb2xpb19zcGxpdF91bm1hcF9hbmRfZnJlZXplX2ZpbGUoKSAtIHNwbGl0IGEgZmlsZS1iYWNrZWQgZm9saW9cbisgKiBAZm9saW86IGZvbGlvIHRvIHNwbGl0LCBtdXN0IGJlIGxvY2tlZCBhbmQgZmlsZS1iYWNrZWRcbisgKiBAbmV3X29yZGVyOiB0aGUgb3JkZXIgb2YgdGhlIGFmdGVyLXNwbGl0IGZvbGlvcyAodW5pZm9ybSBzcGxpdCksIG9yIHRoZVxuKyAqICAgICAgICAgICAgIHNtYWxsZXN0IG9yZGVyIG9mIHRoZSBhZnRlci1zcGxpdCBmb2xpb3MgKG5vbi11bmlmb3JtIHNwbGl0KVxuKyAqIEBzcGxpdF9hdDogaW4gbm9uLXVuaWZvcm0gc3BsaXQsIHRoZSBmb2xpbyBjb250YWluaW5nIEBzcGxpdF9hdCBpcyBzcGxpdFxuKyAqICAgICAgICAgICAgdW50aWwgaXRzIG9yZGVyIGJlY29tZXMgQG5ld19vcmRlclxuKyAqIEBsaXN0OiBhZnRlci1zcGxpdCBmb2xpb3Mgd2lsbCBiZSBwdXQgb24gaXQgaWYgbm9uIE5VTExcbisgKiBAc3BsaXRfdHlwZTogcGVyZm9ybSB1bmlmb3JtIHNwbGl0IG9yIG5vdCAobm9uLXVuaWZvcm0gc3BsaXQpXG4rICpcbisgKiBIZWxwZXIgZm9yIHNwbGl0dGluZyBhIGZpbGUtYmFja2VkIGZvbGlvLiBJdCB1bm1hcHMgQGZvbGlvLCBmcmVlemVzIGl0c1xuKyAqIHJlZmNvdW50LCBhbmQgcGVyZm9ybSB0aGUgc3BsaXQsIHVwZGF0ZXMgdGhlIHBhZ2UgY2FjaGUgZW50cmllcy4gU3BsaXRcbisgKiBmb2xpb3MgYXJlIHVuZnJvemVuIGJ1dCBub3QgcmVtYXBwZWQsIHRoZXkgYXJlIGZhdWx0ZWQgYmFjayBpbiBvbiBkZW1hbmQuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC4gKGlmIC1FTk9NRU1cbisgKiBpcyByZXR1cm5lZCwgQGZvbGlvIG1pZ2h0IGJlIHNwbGl0IGJ1dCBub3QgdG8gQG5ld19vcmRlcilcbisgKi9cbitzdGF0aWMgaW50IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4rXHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsXG4rXHRcdFx0XHRcdCAgICAgICBlbnVtIHNwbGl0X3R5cGUgc3BsaXRfdHlwZSlcbit7XG4rXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZvbGlvLVx1MDAzZW1hcHBpbmc7XG4rXHRYQV9TVEFURSh4YXMsIFx1MDAyNm1hcHBpbmctXHUwMDNlaV9wYWdlcywgZm9saW8tXHUwMDNlaW5kZXgpO1xuK1x0c3RydWN0IGZvbGlvICplbmRfZm9saW8gPSBmb2xpb19uZXh0KGZvbGlvKTtcbitcdGxvbmcgb2xkX25yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuK1x0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuK1x0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuK1x0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbitcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbitcdHBnb2ZmX3QgZW5kID0gMDtcbitcdGdmcF90IGdmcDtcbitcdGludCByZXQgPSAwO1xuIFxuLVx0XHRcdGZvbGlvX3JlZl91bmZyZWV6ZShuZXdfZm9saW8sXG4tXHRcdFx0XHRcdCAgIGZvbGlvX2NhY2hlX3JlZl9jb3VudChuZXdfZm9saW8pICsgMSk7XG4rXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihtYXBwaW5nKTtcbitcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRcdFx0aWYgKGRvX2xydSlcbi1cdFx0XHRcdGxydV9hZGRfc3BsaXRfZm9saW8oZm9saW8sIG5ld19mb2xpbywgbHJ1dmVjLCBsaXN0KTtcbitcdC8qXG4rXHQgKiBTd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4rXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4rXHQgKi9cbitcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4rXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFub255bW91cyBmb2xpbyB3aXRoIHN3YXAgY2FjaGUuXG4tXHRcdFx0ICogTk9URTogc2htZW0gaW4gc3dhcCBjYWNoZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoY2kpIHtcbi1cdFx0XHRcdF9fc3dhcF9jYWNoZV9yZXBsYWNlX2ZvbGlvKGNpLCBmb2xpbywgbmV3X2ZvbGlvKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGdmcCA9IGN1cnJlbnRfZ2ZwX2NvbnRleHQobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSBcdTAwMjYgR0ZQX1JFQ0xBSU1fTUFTSyk7XG4rXHRpZiAoIWZpbGVtYXBfcmVsZWFzZV9mb2xpbyhmb2xpbywgZ2ZwKSkge1xuK1x0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gZmFpbF9mcmVlO1xuK1x0fVxuIFxuLVx0XHRcdC8qIEFub255bW91cyBmb2xpbyB3aXRob3V0IHN3YXAgY2FjaGUgKi9cbi1cdFx0XHRpZiAoIW1hcHBpbmcpXG4tXHRcdFx0XHRjb250aW51ZTtcbitcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuIFxuLVx0XHRcdC8qIEFkZCB0aGUgbmV3IGZvbGlvIHRvIHRoZSBwYWdlIGNhY2hlLiAqL1xuLVx0XHRcdGlmIChuZXdfZm9saW8tXHUwMDNlaW5kZXggXHUwMDNjIGVuZCkge1xuLVx0XHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbi1cdFx0XHRcdFx0ICAgbmV3X2ZvbGlvLCAwKTtcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVx0XHRcdH1cbitcdGlmIChzcGxpdF90eXBlID09IFNQTElUX1RZUEVfVU5JRk9STSkge1xuK1x0XHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFxuLVx0XHRcdFZNX1dBUk5fT05fT05DRSghbnJfc2htZW1fZHJvcHBlZCk7XG4tXHRcdFx0LyogRHJvcCBmb2xpbyBiZXlvbmQgRU9GOiAtXHUwMDNlaW5kZXggXHUwMDNlPSBlbmQgKi9cbi1cdFx0XHRpZiAoc2htZW1fbWFwcGluZyhtYXBwaW5nKSBcdTAwMjZcdTAwMjYgbnJfc2htZW1fZHJvcHBlZClcbi1cdFx0XHRcdCpucl9zaG1lbV9kcm9wcGVkICs9IG5yX3BhZ2VzO1xuLVx0XHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbi1cdFx0XHRcdGZvbGlvX2FjY291bnRfY2xlYW5lZChcbi1cdFx0XHRcdFx0bmV3X2ZvbGlvLCBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbi1cdFx0XHRfX2ZpbGVtYXBfcmVtb3ZlX2ZvbGlvKG5ld19mb2xpbywgTlVMTCk7XG4tXHRcdFx0Zm9saW9fcHV0X3JlZnMobmV3X2ZvbGlvLCBucl9wYWdlcyk7XG4rXHRcdHhhc19zZXRfb3JkZXIoXHUwMDI2eGFzLCBmb2xpby1cdTAwM2VpbmRleCwgbmV3X29yZGVyKTtcbitcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbitcdFx0aWYgKHhhc19lcnJvcihcdTAwMjZ4YXMpKSB7XG4rXHRcdFx0cmV0ID0geGFzX2Vycm9yKFx1MDAyNnhhcyk7XG4rXHRcdFx0Z290byBmYWlsX2ZyZWU7XG4gXHRcdH1cbitcdH1cbiBcbi1cdFx0em9uZV9kZXZpY2VfcHJpdmF0ZV9zcGxpdF9jYihmb2xpbywgTlVMTCk7XG4tXHRcdC8qXG4tXHRcdCAqIFVuZnJlZXplIEBmb2xpbyBvbmx5IGFmdGVyIGFsbCBwYWdlIGNhY2hlIGVudHJpZXMsIHdoaWNoXG4tXHRcdCAqIHVzZWQgdG8gcG9pbnQgdG8gaXQsIGhhdmUgYmVlbiB1cGRhdGVkIHdpdGggbmV3IGZvbGlvcy5cbi1cdFx0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbi1cdFx0ICogYW5kIGl0cyBjYWxsZXIgY2FuIHNlZSBzdGFsZSBwYWdlIGNhY2hlIGVudHJpZXMuXG4tXHRcdCAqL1xuLVx0XHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX2NhY2hlX3JlZl9jb3VudChmb2xpbykgKyAxKTtcbitcdGlfbW1hcF9sb2NrX3JlYWQobWFwcGluZyk7XG4gXG4tXHRcdGlmIChkb19scnUpXG4tXHRcdFx0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK1x0LyogUmFjeSBjaGVjayBpZiB3ZSBjYW4gc3BsaXQgdGhlIHBhZ2UsIGJlZm9yZSB1bm1hcF9mb2xpbygpICovXG4rXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuK1x0XHRyZXQgPSAtRUFHQUlOO1xuK1x0XHRnb3RvIGZhaWxfbW1hcF91bmxvY2s7XG4rXHR9XG4gXG4tXHRcdGlmIChjaSlcbi1cdFx0XHRzd2FwX2NsdXN0ZXJfdW5sb2NrKGNpKTtcbi1cdH0gZWxzZSB7XG4tXHRcdGlmIChkZXF1ZXVlX2RlZmVycmVkKSB7XG4tXHRcdFx0bGlzdF9scnVfdW5sb2NrKGxydSk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHQvKlxuK1x0ICogX19zcGxpdF9mcm96ZW5fZm9saW8oKSBtYXkgbmVlZCB0byB0cmltIG9mZiBwYWdlcyBiZXlvbmRcbitcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4rXHQgKiBzZXFsb2NrLCB3aGljaCBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgcGFnZSB0cmVlIGxvY2suXG4rXHQgKiBTbyBub3RlIGVuZCBub3c6IGlfc2l6ZSBpdHNlbGYgbWF5IGJlIGNoYW5nZWQgYXQgYW55IG1vbWVudCxcbitcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4rXHQgKi9cbitcdGVuZCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChtYXBwaW5nLVx1MDAzZWhvc3QpLCBQQUdFX1NJWkUpO1xuK1x0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4rXHRcdGVuZCA9IHNobWVtX2ZhbGxvY2VuZChtYXBwaW5nLVx1MDAzZWhvc3QsIGVuZCk7XG4rXG4rXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4rXG4rXHR4YXNfbG9ja19pcnEoXHUwMDI2eGFzKTtcbitcbitcdC8qXG4rXHQgKiBDaGVjayBpZiB0aGUgZm9saW8gaXMgcHJlc2VudCBpbiBwYWdlIGNhY2hlLlxuK1x0ICogV2UgYXNzdW1lIGFsbCB0YWlsIGFyZSBwcmVzZW50IHRvbywgaWYgZm9saW8gaXMgdGhlcmUuXG4rXHQgKi9cbitcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4rXHRcdHJldCA9IC1FQUdBSU47XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmICghZm9saW9fcmVmX2ZyZWV6ZShmb2xpbywgb2xkX25yX3BhZ2VzICsgMSkpIHtcbitcdFx0cmV0ID0gLUVBR0FJTjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKGZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSBcdTAwMjZcdTAwMjYgbmV3X29yZGVyIFx1MDAzYyBIUEFHRV9QTURfT1JERVIpIHtcbitcdFx0aWYgKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXG4rXHRcdFx0bHJ1dmVjX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLCBOUl9TSE1FTV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGxydXZlY19zdGF0X21vZF9mb2xpbyhmb2xpbywgTlJfRklMRV9USFBTLCAtb2xkX25yX3BhZ2VzKTtcbitcdH1cbitcbitcdC8qIGxvY2sgbHJ1IGxpc3QvUGFnZUNvbXBvdW5kLCByZWYgZnJvemVuIGJ5IHBhZ2VfcmVmX2ZyZWV6ZSAqL1xuK1x0bHJ1dmVjID0gZm9saW9fbHJ1dmVjX2xvY2soZm9saW8pO1xuK1x0cmV0ID0gX19zcGxpdF9mcm96ZW5fZm9saW8oZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcyxcbitcdFx0XHRcdCAgIG1hcHBpbmcsIHNwbGl0X3R5cGUpO1xuK1xuK1x0LypcbitcdCAqIFVuZnJlZXplIGFmdGVyLXNwbGl0IGZvbGlvcyBhbmQgcHV0IHRoZW0gYmFjayB0byB0aGUgcmlnaHRcbitcdCAqIGxpc3QuIEBmb2xpbyBzaG91bGQgYmUga2VwdCBmcm96ZW4gdW50aWwgcGFnZSBjYWNoZVxuK1x0ICogZW50cmllcyBhcmUgdXBkYXRlZCB3aXRoIGFsbCB0aGUgb3RoZXIgYWZ0ZXItc3BsaXQgZm9saW9zXG4rXHQgKiB0byBwcmV2ZW50IG90aGVycyBzZWVpbmcgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuK1x0ICogQXMgYSByZXN1bHQsIG5ld19mb2xpbyBzdGFydHMgZnJvbSB0aGUgbmV4dCBmb2xpbyBvZlxuK1x0ICogQGZvbGlvLlxuK1x0ICovXG4rXHRmb3JfZWFjaF9mb2xpb19zYWZlKGZvbGlvX25leHQoZm9saW8pLCBlbmRfZm9saW8sIG5ld19mb2xpbywgbmV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMobmV3X2ZvbGlvKTtcbitcbitcdFx0Zm9saW9fcmVmX3VuZnJlZXplKG5ld19mb2xpbyxcbitcdFx0XHRcdCAgIGZvbGlvX25yX3BhZ2VzKG5ld19mb2xpbykgKyAxKTtcbitcbitcdFx0bHJ1X2FkZF9zcGxpdF9mb2xpbyhmb2xpbywgbmV3X2ZvbGlvLCBscnV2ZWMsIGxpc3QpO1xuK1xuK1x0XHQvKiBBZGQgdGhlIG5ldyBmb2xpbyB0byB0aGUgcGFnZSBjYWNoZS4gKi9cbitcdFx0aWYgKG5ld19mb2xpby1cdTAwM2VpbmRleCBcdTAwM2MgZW5kKSB7XG4rXHRcdFx0X194YV9zdG9yZShcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIG5ld19mb2xpby1cdTAwM2VpbmRleCxcbitcdFx0XHRcdCAgIG5ld19mb2xpbywgMCk7XG4rXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbi1cdFx0cmV0dXJuIC1FQUdBSU47XG4rXG4rXHRcdC8qIERyb3AgZm9saW8gYmV5b25kIEVPRjogLVx1MDAzZWluZGV4IFx1MDAzZT0gZW5kICovXG4rXHRcdGlmIChzaG1lbV9tYXBwaW5nKG1hcHBpbmcpKVxuK1x0XHRcdG5yX3NobWVtX2Ryb3BwZWQgKz0gbnJfcGFnZXM7XG4rXHRcdGVsc2UgaWYgKGZvbGlvX3Rlc3RfY2xlYXJfZGlydHkobmV3X2ZvbGlvKSlcbitcdFx0XHRmb2xpb19hY2NvdW50X2NsZWFuZWQobmV3X2ZvbGlvLFxuK1x0XHRcdFx0XHQgICAgICBpbm9kZV90b193YihtYXBwaW5nLVx1MDAzZWhvc3QpKTtcbitcdFx0X19maWxlbWFwX3JlbW92ZV9mb2xpbyhuZXdfZm9saW8sIE5VTEwpO1xuK1x0XHRmb2xpb19wdXRfcmVmcyhuZXdfZm9saW8sIG5yX3BhZ2VzKTtcbiBcdH1cbiBcbitcdC8qXG4rXHQgKiBVbmZyZWV6ZSBAZm9saW8gb25seSBhZnRlciBhbGwgcGFnZSBjYWNoZSBlbnRyaWVzLCB3aGljaFxuK1x0ICogdXNlZCB0byBwb2ludCB0byBpdCwgaGF2ZSBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgZm9saW9zLlxuK1x0ICogT3RoZXJ3aXNlLCBhIHBhcmFsbGVsIGZvbGlvX3RyeV9nZXQoKSBjYW4gZ3JhYiBAZm9saW9cbitcdCAqIGFuZCBpdHMgY2FsbGVyIGNhbiBzZWUgc3RhbGUgcGFnZSBjYWNoZSBlbnRyaWVzLlxuK1x0ICovXG4rXHRmb2xpb19yZWZfdW5mcmVlemUoZm9saW8sIGZvbGlvX25yX3BhZ2VzKGZvbGlvKSArIDEpO1xuK1x0bHJ1dmVjX3VubG9jayhscnV2ZWMpO1xuK2ZhaWw6XG4rXHQvKlxuK1x0ICogSWYgd2Ugd2FudCB0byB1c2UgdHJ5X3RvX21pZ3JhdGUoKSBvbiBmaWxlIGluIHVubWFwX2ZvbGlvLFxuK1x0ICogcmVtZW1iZXIgdG8gYWRkIHJlbWFwX3BhZ2UoKSBhbmQgYWRhcHQgaXQuXG4rXHQgKi9cbitcdHhhc191bmxvY2tfaXJxKFx1MDAyNnhhcyk7XG4rZmFpbF9tbWFwX3VubG9jazpcbitcdGlmIChucl9zaG1lbV9kcm9wcGVkKVxuK1x0XHRzaG1lbV91bmNoYXJnZShtYXBwaW5nLVx1MDAzZWhvc3QsIG5yX3NobWVtX2Ryb3BwZWQpO1xuK1x0LypcbitcdCAqIERyb3AgdGhlIG1hcHBpbmcgd2hpbGUgdGhlIGlub2RlIGlzIHN0aWxsIHBpbm5lZC4gQGZvbGlvIHN0YXlzXG4rXHQgKiBsb2NrZWQgYW5kIHByZXNlbnQgaW4gdGhlIHBhZ2UgY2FjaGUsIHNvIGV2aWN0aW9uIGNhbm5vdCBmcmVlXG4rXHQgKiB0aGUgaW5vZGUgeWV0LCBub3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yXG4rXHQgKiB0aGUgbWFwcGluZy5cbitcdCAqL1xuK1x0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuK2ZhaWxfZnJlZTpcbitcdC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzbHkgYWN0aXZlIG1lbWNnICovXG4rXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4rXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4rXHR4YXNfZGVzdHJveShcdTAwMjZ4YXMpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG5AQCAtNDA4Niw5ICs0MjcyLDkgQEAgc3RhdGljIGludCBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5cbiAgKiBAbGlzdDogYWZ0ZXItc3BsaXQgZm9saW9zIHdpbGwgYmUgcHV0IG9uIGl0IGlmIG5vbiBOVUxMXG4gICogQHNwbGl0X3R5cGU6IHBlcmZvcm0gdW5pZm9ybSBzcGxpdCBvciBub3QgKG5vbi11bmlmb3JtIHNwbGl0KVxuICAqXG4tICogSXQgY2FsbHMgX19zcGxpdF91bm1hcHBlZF9mb2xpbygpIHRvIHBlcmZvcm0gdW5pZm9ybSBhbmQgbm9uLXVuaWZvcm0gc3BsaXQuXG4rICogSXQgY2FsbHMgX19zcGxpdF9mcm96ZW5fZm9saW8oKSB0byBwZXJmb3JtIHVuaWZvcm0gYW5kIG5vbi11bmlmb3JtIHNwbGl0LlxuICAqIEl0IGlzIGluIGNoYXJnZSBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBzcGxpdCBpcyBzdXBwb3J0ZWQgb3Igbm90IGFuZFxuLSAqIHByZXBhcmluZyBAZm9saW8gZm9yIF9fc3BsaXRfdW5tYXBwZWRfZm9saW8oKS5cbisgKiBwcmVwYXJpbmcgQGZvbGlvIGZvciBfX3NwbGl0X2Zyb3plbl9mb2xpbygpLlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgYWZ0ZXItc3BsaXQgZm9saW8gY29udGFpbmluZyBAbG9ja19hdCByZW1haW5zIGxvY2tlZFxuICAqIGFuZCBvdGhlcnMgYXJlIHVubG9ja2VkOlxuQEAgLTQxMDIsMTcgKzQyODgsMTEgQEAgc3RhdGljIGludCBfX2ZvbGlvX3NwbGl0KHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIsXG4gXHRcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgc3RydWN0IHBhZ2UgKmxvY2tfYXQsXG4gXHRcdHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGVudW0gc3BsaXRfdHlwZSBzcGxpdF90eXBlKVxuIHtcbi1cdFhBX1NUQVRFKHhhcywgXHUwMDI2Zm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2VpX3BhZ2VzLCBmb2xpby1cdTAwM2VpbmRleCk7XG4rXHRib29sIGlzX3N3YXBjYWNoZSA9IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKTtcbiBcdHN0cnVjdCBmb2xpbyAqZW5kX2ZvbGlvID0gZm9saW9fbmV4dChmb2xpbyk7XG4gXHRib29sIGlzX2Fub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqb2xkX21lbWNnO1xuLVx0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBOVUxMO1xuLVx0c3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IE5VTEw7XG4gXHRpbnQgb2xkX29yZGVyID0gZm9saW9fb3JkZXIoZm9saW8pO1xuIFx0c3RydWN0IGZvbGlvICpuZXdfZm9saW8sICpuZXh0O1xuLVx0aW50IG5yX3NobWVtX2Ryb3BwZWQgPSAwO1xuLVx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gMDtcbi1cdHBnb2ZmX3QgZW5kID0gMDtcbiBcdGludCByZXQ7XG4gXG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSwgZm9saW8pO1xuQEAgLTQxMjAsMTQxICs0MzAwLDI5IEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuIFxuIFx0aWYgKGZvbGlvICE9IHBhZ2VfZm9saW8oc3BsaXRfYXQpIHx8IGZvbGlvICE9IHBhZ2VfZm9saW8obG9ja19hdCkpIHtcbiBcdFx0cmV0ID0gLUVJTlZBTDtcbi1cdFx0Z290byBvdXRfbm9fbWVtY2c7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuIFx0aWYgKG5ld19vcmRlciBcdTAwM2U9IG9sZF9vcmRlcikge1xuIFx0XHRyZXQgPSAtRUlOVkFMO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4gXHRyZXQgPSBmb2xpb19jaGVja19zcGxpdHRhYmxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X3R5cGUpO1xuIFx0aWYgKHJldCkge1xuIFx0XHRWTV9XQVJOX09OQ0UocmV0ID09IC1FSU5WQUwsIFwiVHJpZWQgdG8gc3BsaXQgYW4gdW5zcGxpdHRhYmxlIGZvbGlvXCIpO1xuLVx0XHRnb3RvIG91dF9ub19tZW1jZztcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBzd2l0Y2ggdG8gZm9saW8ncyBtZW1jZyBhcyB4YXJyYXkgbm9kZSBhbGxvY2F0aW9uIGNhbiBoYXBwZW4gYW5kXG4tXHQgKiBuZWVkcyB0byBjaGFyZ2UgdG8gaXQuXG4tXHQgKi9cbi1cdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4tXHRvbGRfbWVtY2cgPSBzZXRfYWN0aXZlX21lbWNnKG1lbWNnKTtcbi1cbi1cdGlmIChpc19hbm9uKSB7XG4tXHRcdC8qXG4tXHRcdCAqIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgaG9sZCBhbiBtbWFwX2xvY2sgdGhhdCB3b3VsZFxuLVx0XHQgKiBwcmV2ZW50IHRoZSBhbm9uX3ZtYSBkaXNhcHBlYXJpbmcgc28gd2UgZmlyc3Qgd2UgdGFrZSBhXG4tXHRcdCAqIHJlZmVyZW5jZSB0byBpdCBhbmQgdGhlbiBsb2NrIHRoZSBhbm9uX3ZtYSBmb3Igd3JpdGUuIFRoaXNcbi1cdFx0ICogaXMgc2ltaWxhciB0byBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQgZXhjZXB0IHRoZSB3cml0ZSBsb2NrXG4tXHRcdCAqIGlzIHRha2VuIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IHBhcmFsbGVsIHNwbGl0IG9yIGNvbGxhcHNlXG4tXHRcdCAqIG9wZXJhdGlvbnMuXG4tXHRcdCAqL1xuLVx0XHRhbm9uX3ZtYSA9IGZvbGlvX2dldF9hbm9uX3ZtYShmb2xpbyk7XG4tXHRcdGlmICghYW5vbl92bWEpIHtcbi1cdFx0XHRyZXQgPSAtRUJVU1k7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0YW5vbl92bWFfbG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fSBlbHNlIHtcbi1cdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbi1cdFx0Z2ZwX3QgZ2ZwO1xuLVxuLVx0XHRtYXBwaW5nID0gZm9saW8tXHUwMDNlbWFwcGluZztcbi1cdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XG4tXHRcdGlmIChuZXdfb3JkZXIgXHUwMDNjIG1pbl9vcmRlcikge1xuLVx0XHRcdHJldCA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Z2ZwID0gY3VycmVudF9nZnBfY29udGV4dChtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIFx1MDAyNlxuLVx0XHRcdFx0XHRcdFx0R0ZQX1JFQ0xBSU1fTUFTSyk7XG4tXG4tXHRcdGlmICghZmlsZW1hcF9yZWxlYXNlX2ZvbGlvKGZvbGlvLCBnZnApKSB7XG4tXHRcdFx0cmV0ID0gLUVCVVNZO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdG1hcHBpbmdfc2V0X3VwZGF0ZShcdTAwMjZ4YXMsIG1hcHBpbmcpO1xuLVxuLVx0XHRpZiAoc3BsaXRfdHlwZSA9PSBTUExJVF9UWVBFX1VOSUZPUk0pIHtcbi1cdFx0XHR4YXNfc2V0X29yZGVyKFx1MDAyNnhhcywgZm9saW8tXHUwMDNlaW5kZXgsIG5ld19vcmRlcik7XG4tXHRcdFx0eGFzX3NwbGl0X2FsbG9jKFx1MDAyNnhhcywgZm9saW8sIG9sZF9vcmRlciwgZ2ZwKTtcbi1cdFx0XHRpZiAoeGFzX2Vycm9yKFx1MDAyNnhhcykpIHtcbi1cdFx0XHRcdHJldCA9IHhhc19lcnJvcihcdTAwMjZ4YXMpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXG4tXHRcdGFub25fdm1hID0gTlVMTDtcbi1cdFx0aV9tbWFwX2xvY2tfcmVhZChtYXBwaW5nKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICpfX3NwbGl0X3VubWFwcGVkX2ZvbGlvKCkgbWF5IG5lZWQgdG8gdHJpbSBvZmYgcGFnZXMgYmV5b25kXG4tXHRcdCAqIEVPRjogYnV0IG9uIDMyLWJpdCwgaV9zaXplX3JlYWQoKSB0YWtlcyBhbiBpcnEtdW5zYWZlXG4tXHRcdCAqIHNlcWxvY2ssIHdoaWNoIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBwYWdlIHRyZWUgbG9jay5cbi1cdFx0ICogU28gbm90ZSBlbmQgbm93OiBpX3NpemUgaXRzZWxmIG1heSBiZSBjaGFuZ2VkIGF0IGFueSBtb21lbnQsXG4tXHRcdCAqIGJ1dCBmb2xpbyBsb2NrIGlzIGdvb2QgZW5vdWdoIHRvIHNlcmlhbGl6ZSB0aGUgdHJpbW1pbmcuXG4tXHRcdCAqL1xuLVx0XHRlbmQgPSBESVZfUk9VTkRfVVAoaV9zaXplX3JlYWQobWFwcGluZy1cdTAwM2Vob3N0KSwgUEFHRV9TSVpFKTtcbi1cdFx0aWYgKHNobWVtX21hcHBpbmcobWFwcGluZykpXG4tXHRcdFx0ZW5kID0gc2htZW1fZmFsbG9jZW5kKG1hcHBpbmctXHUwMDNlaG9zdCwgZW5kKTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBSYWN5IGNoZWNrIGlmIHdlIGNhbiBzcGxpdCB0aGUgcGFnZSwgYmVmb3JlIHVubWFwX2ZvbGlvKCkgd2lsbFxuLVx0ICogc3BsaXQgUE1Ec1xuLVx0ICovXG4tXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pIC0gMSkge1xuLVx0XHRyZXQgPSAtRUFHQUlOO1xuLVx0XHRnb3RvIG91dF91bmxvY2s7XG4tXHR9XG4tXG4tXHR1bm1hcF9mb2xpbyhmb2xpbyk7XG4tXG4tXHQvKiBibG9jayBpbnRlcnJ1cHQgcmVlbnRyeSBpbiB4YV9sb2NrIGFuZCBzcGlubG9jayAqL1xuLVx0bG9jYWxfaXJxX2Rpc2FibGUoKTtcbi1cdGlmIChtYXBwaW5nKSB7XG4tXHRcdC8qXG4tXHRcdCAqIENoZWNrIGlmIHRoZSBmb2xpbyBpcyBwcmVzZW50IGluIHBhZ2UgY2FjaGUuXG4tXHRcdCAqIFdlIGFzc3VtZSBhbGwgdGFpbCBhcmUgcHJlc2VudCB0b28sIGlmIGZvbGlvIGlzIHRoZXJlLlxuLVx0XHQgKi9cbi1cdFx0eGFzX2xvY2soXHUwMDI2eGFzKTtcbi1cdFx0eGFzX3Jlc2V0KFx1MDAyNnhhcyk7XG4tXHRcdGlmICh4YXNfbG9hZChcdTAwMjZ4YXMpICE9IGZvbGlvKSB7XG4tXHRcdFx0cmV0ID0gLUVBR0FJTjtcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdH1cbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIFx1MDAyNnhhcywgbWFwcGluZyxcbi1cdFx0XHRcdFx0XHR0cnVlLCBsaXN0LCBzcGxpdF90eXBlLCBlbmQsIFx1MDAyNm5yX3NobWVtX2Ryb3BwZWQpO1xuLWZhaWw6XG4tXHRpZiAobWFwcGluZylcbi1cdFx0eGFzX3VubG9jayhcdTAwMjZ4YXMpO1xuLVxuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVxuLVx0aWYgKG5yX3NobWVtX2Ryb3BwZWQpXG4tXHRcdHNobWVtX3VuY2hhcmdlKG1hcHBpbmctXHUwMDNlaG9zdCwgbnJfc2htZW1fZHJvcHBlZCk7XG4tXG4tXHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgaXNfYW5vbiBcdTAwMjZcdTAwMjYgIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSlcbi1cdFx0dHR1X2ZsYWdzID0gVFRVX1VTRV9TSEFSRURfWkVST1BBR0U7XG4tXG4tXHRyZW1hcF9wYWdlKGZvbGlvLCAxIFx1MDAzY1x1MDAzYyBvbGRfb3JkZXIsIHR0dV9mbGFncyk7XG4tXG4tXHQvKlxuLVx0ICogRHJvcCB0aGUgbWFwcGluZyB3aGlsZSB0aGUgaW5vZGUgaXMgc3RpbGwgcGlubmVkLiBAZm9saW8gc3RheXNcbi1cdCAqIGxvY2tlZCBhbmQgcHJlc2VudCBpbiB0aGUgcGFnZSBjYWNoZSB1bnRpbCB0aGUgbG9vcCBiZWxvdywgc29cbi1cdCAqIGV2aWN0aW9uIGNhbm5vdCBmcmVlIHRoZSBpbm9kZSB5ZXQ7IEBsb2NrX2F0IGlzIG5vdCBlbm91Z2gsIGl0IG1heVxuLVx0ICogYmUgYSB0YWlsIGJleW9uZCBFT0YgdGhhdCB0aGUgc3BsaXQgYWxyZWFkeSBkcm9wcGVkIGZyb20gdGhlIHBhZ2Vcbi1cdCAqIGNhY2hlLiBOb3RoaW5nIHBhc3QgdGhpcyBwb2ludCBtYXkgdG91Y2ggdGhlIGlub2RlIG9yIHRoZSBtYXBwaW5nLlxuLVx0ICovXG4tXHRpZiAobWFwcGluZykge1xuLVx0XHRpX21tYXBfdW5sb2NrX3JlYWQobWFwcGluZyk7XG4tXHRcdG1hcHBpbmcgPSBOVUxMO1xuLVx0fVxuK1x0aWYgKGlzX2Fub24pXG4rXHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZShmb2xpbywgbmV3X29yZGVyLCBzcGxpdF9hdCwgdHJ1ZSxcbitcdFx0XHRcdFx0XHQgICAgIHRydWUsIGxpc3QsIHNwbGl0X3R5cGUpO1xuK1x0ZWxzZSBpZiAoaXNfc3dhcGNhY2hlKVxuK1x0XHRyZXQgPSBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgc3BsaXRfYXQsIHRydWUsXG4rXHRcdFx0XHRcdFx0ICAgICBmYWxzZSwgbGlzdCwgc3BsaXRfdHlwZSk7XG4rXHRlbHNlXG4rXHRcdHJldCA9IF9fZm9saW9fc3BsaXRfdW5tYXBfYW5kX2ZyZWV6ZV9maWxlKGZvbGlvLCBuZXdfb3JkZXIsIHNwbGl0X2F0LFxuK1x0XHRcdFx0XHRcdFx0ICBsaXN0LCBzcGxpdF90eXBlKTtcbiBcbiBcdC8qXG4gXHQgKiBVbmxvY2sgYWxsIGFmdGVyLXNwbGl0IGZvbGlvcyBleGNlcHQgdGhlIG9uZSBjb250YWluaW5nXG5AQCAtNDI2NSwyOSArNDMzMywxOSBAQCBzdGF0aWMgaW50IF9fZm9saW9fc3BsaXQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcixcbiBcdFx0aWYgKG5ld19mb2xpbyA9PSBwYWdlX2ZvbGlvKGxvY2tfYXQpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb191bmxvY2sobmV3X2ZvbGlvKTtcbiBcdFx0LypcbiBcdFx0ICogU3VicGFnZXMgd2hvc2UgbWFwcGluZyBoYXMgYmVlbiB6YXBwZWQgbWF5IGJlIGZyZWVkXG4gXHRcdCAqIGVhcmxpZXIsIGJ1dCBmcmVlaW5nIHRoZW0gcmVxdWlyZXMgdGFraW5nIHRoZVxuLVx0XHQgKiBscnVfbG9jaywgc28gd2UgZGVmZXIgcHV0X3BhZ2UoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4rXHRcdCAqIGxydV9sb2NrLCBzbyB3ZSBkZWZlciBmb2xpb19wdXQoKSBvbiB0YWlsIHBhZ2VzIHVudGlsXG4gXHRcdCAqIGFmdGVyIHRoZSBzcGxpdCBjb21wbGV0ZXMuXG4gXHRcdCAqL1xuLVx0XHRmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKG5ld19mb2xpbyk7XG4rXHRcdGlmIChpc19zd2FwY2FjaGUpXG4rXHRcdFx0Zm9saW9fZnJlZV9zd2FwKG5ld19mb2xpbyk7XG4rXHRcdGZvbGlvX3VubG9jayhuZXdfZm9saW8pO1xuK1x0XHRmb2xpb19wdXQobmV3X2ZvbGlvKTtcbiBcdH1cbiBcbi1vdXRfdW5sb2NrOlxuLVx0aWYgKGFub25fdm1hKSB7XG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZShhbm9uX3ZtYSk7XG4tXHRcdHB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7XG4tXHR9XG4tXHRpZiAobWFwcGluZylcbi1cdFx0aV9tbWFwX3VubG9ja19yZWFkKG1hcHBpbmcpO1xuIG91dDpcbi1cdC8qIHJlc3RvcmUgdG8gY2FsbGVyJ3Mgb2xkX21lbWNnICovXG4tXHRzZXRfYWN0aXZlX21lbWNnKG9sZF9tZW1jZyk7XG4tXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4tb3V0X25vX21lbWNnOlxuLVx0eGFzX2Rlc3Ryb3koXHUwMDI2eGFzKTtcbiBcdGlmIChpc19wbWRfb3JkZXIob2xkX29yZGVyKSlcbiBcdFx0Y291bnRfdm1fZXZlbnQoIXJldCA/IFRIUF9TUExJVF9QQUdFIDogVEhQX1NQTElUX1BBR0VfRkFJTEVEKTtcbiBcdGNvdW50X210aHBfc3RhdChvbGRfb3JkZXIsICFyZXQgPyBNVEhQX1NUQVRfU1BMSVQgOiBNVEhQX1NUQVRfU1BMSVRfRkFJTEVEKTtcbkBAIC00MzExLDI5ICs0MzY5LDIwIEBAIHN0YXRpYyBpbnQgX19mb2xpb19zcGxpdChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyLFxuICAqIGlzb2xhdGVkIGZyb20gTFJVIChpZiBhcHBsaWNhYmxlKVxuICAqXG4gICogVXBvbiByZXR1cm4sIHRoZSBmb2xpbyBpcyBub3QgcmVtYXBwZWQsIHNwbGl0IGZvbGlvcyBhcmUgbm90IGFkZGVkIHRvIExSVSxcbi0gKiBmcmVlX2ZvbGlvX2FuZF9zd2FwX2NhY2hlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5ldyBmb2xpb3MgcmVtYWluIGxvY2tlZC5cbisgKiBmb2xpb19mcmVlX3N3YXAoKSBpcyBub3QgY2FsbGVkLCBhbmQgbmV3IGZvbGlvcyByZW1haW4gbG9ja2VkLlxuICAqXG4gICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgdGhlIGZvbGlvIGNhbm5vdCBiZSBzcGxpdCAoZS5nLiwgZHVlIHRvXG4gICogICAgICAgICBpbnN1ZmZpY2llbnQgcmVmZXJlbmNlIGNvdW50IG9yIGV4dHJhIHBpbnMpLlxuICAqL1xuIGludCBmb2xpb19zcGxpdF91bm1hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuIHtcbi1cdGludCByZXQgPSAwO1xuLVxuIFx0Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKGZvbGlvX21hcHBlZChmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pLCBmb2xpbyk7XG4gXHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcbi1cdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykgLSAxKVxuLVx0XHRyZXR1cm4gLUVBR0FJTjtcbi1cbi1cdGxvY2FsX2lycV9kaXNhYmxlKCk7XG4tXHRyZXQgPSBfX2ZvbGlvX2ZyZWV6ZV9hbmRfc3BsaXRfdW5tYXBwZWQoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgTlVMTCxcbi1cdFx0XHRcdFx0XHROVUxMLCBmYWxzZSwgTlVMTCwgU1BMSVRfVFlQRV9VTklGT1JNLFxuLVx0XHRcdFx0XHRcdDAsIE5VTEwpO1xuLVx0bG9jYWxfaXJxX2VuYWJsZSgpO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemUoZm9saW8sIG5ld19vcmRlciwgXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgZmFsc2UsXG4rXHRcdFx0XHRcdCAgICAgIGZhbHNlLCBOVUxMLCBTUExJVF9UWVBFX1VOSUZPUk0pO1xuIH1cbiBcbiAvKlxuQEAgLTQzNTIsMTAgKzQ0MDEsOSBAQCBpbnQgZm9saW9fc3BsaXRfdW5tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgaW50IG5ld19vcmRlcilcbiAgKiAgICBHVVAgcGlucywgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGlvIG5vdCBnZXR0aW5nIHNwbGl0OyBpbnN0ZWFkLCB0aGUgY2FsbGVyXG4gICogICAgd2lsbCByZWNlaXZlIGFuIC1FQUdBSU4uXG4gICpcbi0gKiA0KSBAbmV3X29yZGVyIFx1MDAzZSAxLCB1c3VhbGx5LiBTcGxpdHRpbmcgdG8gb3JkZXItMSBhbm9ueW1vdXMgZm9saW9zIGlzIG5vdFxuLSAqICAgIHN1cHBvcnRlZCBmb3Igbm9uLWZpbGUtYmFja2VkIGZvbGlvcywgYmVjYXVzZSBmb2xpby1cdTAwM2VfZGVmZXJyZWRfbGlzdCwgd2hpY2hcbi0gKiAgICBpcyB1c2VkIGJ5IHBhcnRpYWxseSBtYXBwZWQgZm9saW9zLCBpcyBzdG9yZWQgaW4gc3VicGFnZSAyLCBidXQgYW4gb3JkZXItMVxuLSAqICAgIGZvbGlvIG9ubHkgaGFzIHN1YnBhZ2VzIDAgYW5kIDEuIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4rICogNCkgQG5ld19vcmRlciAhPSAxIGZvciBhbm9uIG9yIHN3YXBjYWNoZS4gQW5vbiBmb2xpb3MgbmVlZCBzdWJwYWdlIDIgZm9yXG4rICogICAgX2RlZmVycmVkX2xpc3QsIHdoaWNoIG9yZGVyLTEgZm9saW9zIGxhY2ssIGFuZCBhIHN3YXBjYWNoZSBmb2xpbyBtYXlcbisgKiAgICBiZWNvbWUgYW5vbiBvbmNlIGZhdWx0ZWQgaW4uIEZpbGUtYmFja2VkIG9yZGVyLTEgZm9saW9zIGFyZSBzdXBwb3J0ZWQsXG4gICogICAgc2luY2UgdGhleSBkbyBub3QgdXNlIF9kZWZlcnJlZF9saXN0LlxuICAqXG4gICogQWZ0ZXIgc3BsaXR0aW5nLCB0aGUgY2FsbGVyJ3MgZm9saW8gcmVmZXJlbmNlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gQHBhZ2UsXG5AQCAtNDM4NCw3ICs0NDMyLDcgQEAgaW50IGZvbGlvX3NwbGl0X3VubWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8sIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4gICogd2l0aCB0aGUgZm9saW8uIFNwbGl0dGluZyB0byBvcmRlciAwIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgZm9saW9zLlxuICAqL1xuIGludCBfX3NwbGl0X2h1Z2VfcGFnZV90b19saXN0X3RvX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LFxuLVx0XHRcdFx0ICAgICB1bnNpZ25lZCBpbnQgbmV3X29yZGVyKVxuK1x0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBuZXdfb3JkZXIpXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jXG5pbmRleCA1YmU4MjU5MTFlNjQ1Li5mMTQwNWU1YjgxM2VlIDEwMDY0NFxuLS0tIGEvbW0vc3dhcF9zdGF0ZS5jXG4rKysgYi9tbS9zd2FwX3N0YXRlLmNcbkBAIC0zODgsOCArMzg4LDkgQEAgdm9pZCBfX3N3YXBfY2FjaGVfcmVwbGFjZV9mb2xpbyhzdHJ1Y3Qgc3dhcF9jbHVzdGVyX2luZm8gKmNpLFxuIFx0ICAgIGZvbGlvX29yZGVyKG9sZCkgIT0gZm9saW9fb3JkZXIobmV3KSkge1xuIFx0XHRjaV9vZmYgPSBzd3BfY2x1c3Rlcl9vZmZzZXQob2xkLVx1MDAzZXN3YXApO1xuIFx0XHRjaV9lbmQgPSBjaV9vZmYgKyBmb2xpb19ucl9wYWdlcyhvbGQpO1xuLVx0XHR3aGlsZSAoY2lfb2ZmKysgXHUwMDNjIGNpX2VuZClcbitcdFx0ZG8ge1xuIFx0XHRcdFdBUk5fT05fT05DRShzd3BfdGJfdG9fZm9saW8oX19zd2FwX3RhYmxlX2dldChjaSwgY2lfb2ZmKSkgIT0gb2xkKTtcbitcdFx0fSB3aGlsZSAoKytjaV9vZmYgXHUwMDNjIGNpX2VuZCk7XG4gXHR9XG4gfVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMjA6MTU6NDEuMDQyNzM4MDQ5WiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExMjIyNDE1MTU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQ6IEtNU0FOIE5vdCBOZWVkZWQqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgdG91Y2hpbmcgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IGZvbGlvIHNwbGl0dGluZywgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgIGFuZCBgbW0vc3dhcF9zdGF0ZS5jYC4gSXQncyByZWZhY3RvcmluZyB0aGUgZXhpc3RpbmcgY29kZSwgc3BsaXR0aW5nIHRoaW5ncyBpbnRvIGZ1bmN0aW9ucyBsaWtlIGBfX2ZvbGlvX3NwbGl0X3VubWFwX2FuZF9mcmVlemVgIGFuZCB2YXJpYW50cywgZGVhbGluZyB3aXRoIGFub24sIHN3YXBjYWNoZSwgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gSXQncyBlc3NlbnRpYWxseSBhYm91dCBob3cgd2UgaGFuZGxlIHNwbGl0dGluZyBmb2xpb3MgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLlxuXG5UaGUga2V5IHRoaW5nIEkgbmVlZCB0byBjaGVjayBpcyBpZiB0aGlzIGludHJvZHVjZXMgKmFueSogcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBleHBvc2VkLiBUaGF0J3Mgd2hhdCBLTVNBTiBpcyBmb3IsIGFmdGVyIGFsbC4gRnJvbSB3aGF0IEkgc2VlLCBpdCBkb2Vzbid0LiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBzZW50IHVwIHRvIHVzZXIgc3BhY2UsIHdoaWNoIGlzIGEgY29tbW9uIGFyZWEgZm9yIGxlYWtzLiBObyBuZXcgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBoYXBwZW5pbmcgdGhhdCAqYXJlbid0KiBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBUaGUgY29kZSB1c2VzIGBmb2xpb19yZWZfZnJlZXplYCwgYHVubWFwX2ZvbGlvYCwgYF9fc3BsaXRfZnJvemVuX2ZvbGlvYCwgYW5kIHNvIG9uLiBUaGVzZSBhcmUgYWxsIHdlbGwtZXN0YWJsaXNoZWQgZnVuY3Rpb25zLlxuXG5JJ20gZm9jdXNpbmcgc3BlY2lmaWNhbGx5IG9uIHVuaW5pdGlhbGl6ZWQgcmVhZHMuIElzIHRoZXJlIGEgc2NlbmFyaW8gd2hlcmUgdGhpcyBwYXRjaCAqY291bGQqIGxlYWQgdG8gYSBrZXJuZWwgdmFyaWFibGUgYmVpbmcgcmVhZCBiZWZvcmUgaXQncyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUsIHBvdGVudGlhbGx5IGxlYWtpbmcgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLCBvciBjcmVhdGluZyBhIGNvbnRyb2wgZmxvdyB2dWxuZXJhYmlsaXR5PyBOby4gVGhlIHBhdGNoIGxvb2tzIHNhZmUgaW4gdGhpcyByZXNwZWN0LiBJdCBvbmx5IG1vZGlmaWVzIGV4aXN0aW5nIG1lbW9yeSBtYW5hZ2VtZW50IHN0cnVjdHVyZXMgYW5kIGxvZ2ljLCBpdCBkb2VzIG5vdCBjcmVhdGUgYW55IG5ldyBjb2RlIHBhdGhzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBpcyBwb3NzaWJsZS5cblxuVGhlcmVmb3JlLCB0aGUgcG90ZW50aWFsIGJ1Z3Mgd291bGQgYmUgY2xhc3NpYyBtZW1vcnkgY29ycnVwdGlvbiBidWdzOiB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWVzLCBtZW1vcnkgbGVha3MsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgKGJlY2F1c2Ugb2YgaW5jb3JyZWN0IHBhZ2UgY291bnRzKSwgb3IgZXZlbiBkZWFkbG9ja3MuIEJ1dCBhbGwgb2YgdGhlc2UgYXJlIGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHRoZSB1c3VhbCBrZXJuZWwgbWVtb3J5IGJ1ZyBkZXRlY3RvcnMuIEtNU0FOIGlzIGZvciBhIGRpZmZlcmVudCBjbGFzcyBvZiBwcm9ibGVtLCB3aGljaCBpc24ndCBwcmVzZW50IGhlcmUuXG5cblNvLCBJJ20gY29uZmlkZW50IGluIHNheWluZyB0aGF0IGBOZWVkc0tNU0FOYCBzaG91bGQgYmUgZmFsc2UgZm9yIHRoaXMgcGF0Y2guIEkgc2VlIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyODc4LCJPdXRwdXRUb2tlbnMiOjIxMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU2OSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDIwOjE1OjUyLjI2NTE1NjYyNloiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzNDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxcblxcblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBmb2xpbyBzcGxpdHRpbmcgbG9naWMgaW4gdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbSAoc3BlY2lmaWNhbGx5IGBtbS9odWdlX21lbW9yeS5jYCBhbmQgYG1tL3N3YXBfc3RhdGUuY2ApLCBpbnRyb2R1Y2luZyBzZXBhcmF0ZSBwYXRocyBmb3IgYW5vbnltb3VzL3N3YXBjYWNoZSBmb2xpb3MgYW5kIGZpbGUtYmFja2VkIGZvbGlvcy4gVGhlIGNoYW5nZXMgaW52b2x2ZSBwYWdlIHJlZmVyZW5jZSBjb3VudGluZywgbG9ja2luZywgTFJVIGxpc3QgbWFuYWdlbWVudCwgYW5kIHBhZ2UgY2FjaGUvc3dhcCBjYWNoZSB1cGRhdGVzLlxcblxcblRoZXNlIG1vZGlmaWNhdGlvbnMgZG8gbm90IGludHJvZHVjZSBuZXcgZGF0YSBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgYWxsb2NhdGUgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhhdCBpcyBzdWJzZXF1ZW50bHkgcmVhZCBvciB1c2VkIGluIGNvbnRyb2wgZmxvdy4gQW55IGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHdvdWxkIGxpa2VseSBtYW5pZmVzdCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIGxvY2tpbmcgaXNzdWVzIChkZWFkbG9ja3MvcmFjZSBjb25kaXRpb25zKS4gU3VjaCBidWdzIGFyZSBlZmZlY3RpdmVseSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowjz725[1] Phase: Succeeded StartedAt: 2026-08-12 20:16:04 +0000 UTC FinishedAt: 2026-08-12 20:16:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-12 20:16:04 +0000 UTC FinishedAt: 2026-08-12 20:16:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2] Phase: Succeeded StartedAt: 2026-08-12 20:16:04 +0000 UTC FinishedAt: 2026-08-13 00:01:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-12 20:16:04 +0000 UTC FinishedAt: 2026-08-13 00:01:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-12 20:16:04 +0000 UTC FinishedAt: 2026-08-12 20:16:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-12 20:16:04 +0000 UTC FinishedAt: 2026-08-12 20:16:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowjz725/series-workflowjz725-convert-artifact-230914083/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-12 20:16:14 +0000 UTC FinishedAt: 2026-08-12 20:36:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-12 20:16:14 +0000 UTC FinishedAt: 2026-08-12 20:36:08 +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:*0b85a665-dfd0-4a0c-b022-f0813f07c409,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-workflowjz725/series-workflowjz725-convert-artifact-230914083/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": "60456297-dd2d-4cd3-b237-9481b76014b0", "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-workflowjz725/series-workflowjz725-build-action-2910710929/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-12 20:16:14 +0000 UTC FinishedAt: 2026-08-12 20:35:58 +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:*0b85a665-dfd0-4a0c-b022-f0813f07c409,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-workflowjz725/series-workflowjz725-convert-artifact-230914083/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": "60456297-dd2d-4cd3-b237-9481b76014b0", "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-workflowjz725/series-workflowjz725-build-action-2910710929/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-12 20:36:08 +0000 UTC FinishedAt: 2026-08-12 20:36:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-12 20:36:08 +0000 UTC FinishedAt: 2026-08-12 20:36:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-12 20:36:08 +0000 UTC FinishedAt: 2026-08-12 20:36:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-12 20:36:08 +0000 UTC FinishedAt: 2026-08-12 20:36:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowjz725/series-workflowjz725-convert-artifact-760874586/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-12 20:36:18 +0000 UTC FinishedAt: 2026-08-12 20:38:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-12 20:36:18 +0000 UTC FinishedAt: 2026-08-12 20:38:11 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*60456297-dd2d-4cd3-b237-9481b76014b0,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-workflowjz725/series-workflowjz725-build-action-2910710929/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-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-12 20:38:21 +0000 UTC FinishedAt: 2026-08-12 20:38:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-12 20:38:21 +0000 UTC FinishedAt: 2026-08-12 20:38:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-12 20:38:21 +0000 UTC FinishedAt: 2026-08-12 20:56:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-12 20:38:21 +0000 UTC FinishedAt: 2026-08-12 20:56:12 +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:*0b85a665-dfd0-4a0c-b022-f0813f07c409,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-workflowjz725/series-workflowjz725-convert-artifact-760874586/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": "2732eceb-aafc-4481-8878-8f1f4aba8520", "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-workflowjz725/series-workflowjz725-build-action-2729268030/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-12 20:38:21 +0000 UTC FinishedAt: 2026-08-12 20:56:02 +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:*0b85a665-dfd0-4a0c-b022-f0813f07c409,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-workflowjz725/series-workflowjz725-convert-artifact-760874586/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": "2732eceb-aafc-4481-8878-8f1f4aba8520", "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-workflowjz725/series-workflowjz725-build-action-2729268030/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-12 20:56:12 +0000 UTC FinishedAt: 2026-08-12 20:56:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-12 20:56:12 +0000 UTC FinishedAt: 2026-08-12 20:56:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-12 20:56:12 +0000 UTC FinishedAt: 2026-08-12 20:58:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-12 20:56:12 +0000 UTC FinishedAt: 2026-08-12 20:58:09 +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:*2732eceb-aafc-4481-8878-8f1f4aba8520,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-workflowjz725/series-workflowjz725-build-action-2729268030/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-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-12 20:58:18 +0000 UTC FinishedAt: 2026-08-13 00:01:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-12 20:58:18 +0000 UTC FinishedAt: 2026-08-13 00:01:50 +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-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"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:*60456297-dd2d-4cd3-b237-9481b76014b0,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*2732eceb-aafc-4481-8878-8f1f4aba8520,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-workflowjz725/series-workflowjz725-build-action-2910710929/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-workflowjz725/series-workflowjz725-build-action-2729268030/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-12 20:58:18 +0000 UTC FinishedAt: 2026-08-12 20:58:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-12 20:58:18 +0000 UTC FinishedAt: 2026-08-12 20:58:24 +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-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"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-workflowjz725/series-workflowjz725-convert-artifact-211327247/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-12 20:58:18 +0000 UTC FinishedAt: 2026-08-12 20:58:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-12 20:58:18 +0000 UTC FinishedAt: 2026-08-12 20:58:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-12 20:58:18 +0000 UTC FinishedAt: 2026-08-12 20:58:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-12 20:58:28 +0000 UTC FinishedAt: 2026-08-13 00:01:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjz725[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__split_huge_page_to_list_to_order","folio_split_unmapped","folio_check_splittable","__swap_cache_replace_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"1029098ee3275ea5b78e329ce132262affa2f8cc","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","SWAP"],"series_id":"deb6dd68-24b9-4bd9-8ca0-10d57d546eed","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-12 20:58:28 +0000 UTC FinishedAt: 2026-08-13 00:01:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*60456297-dd2d-4cd3-b237-9481b76014b0,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*2732eceb-aafc-4481-8878-8f1f4aba8520,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-workflowjz725/series-workflowjz725-build-action-2910710929/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-workflowjz725/series-workflowjz725-build-action-2729268030/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-workflowjz725/series-workflowjz725-convert-artifact-211327247/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,}